blob: a710af460a56f9c14e1583f76ef61c0c67787a37 [file] [log] [blame]
#ifndef _GL4CCONDITIONALRENDERINVERTEDTESTS_HPP
#define _GL4CCONDITIONALRENDERINVERTEDTESTS_HPP
/*-------------------------------------------------------------------------
* OpenGL Conformance Test Suite
* -----------------------------
*
* Copyright (c) 2015-2016 The Khronos Group Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/ /*!
* \file
* \brief
*/ /*-------------------------------------------------------------------*/
/**
*/ /*!
* \file gl4cConditionalRenderInvertedTests.hpp
* \brief Conformance tests for Conditional Render Inverted feature functionality.
*/ /*------------------------------------------------------------------------------*/
/* Includes. */
#include "glcTestCase.hpp"
#include "glwDefs.hpp"
#include "tcuDefs.hpp"
#include "glwEnums.hpp"
#include "glwFunctions.hpp"
/* Interface. */
namespace gl4cts
{
namespace ConditionalRenderInverted
{
/** @class Tests
*
* @brief Conditional Render Inverted Test Group.
*/
class Tests : public deqp::TestCaseGroup
{
public:
/* Public member functions. */
Tests(deqp::Context& context);
void init();
private:
/* Private member functions. */
Tests(const Tests& other);
Tests& operator=(const Tests& other);
};
/** @class CoverageTest
*
* @brief Conditional Render Inverted API Coverage Test.
*
* The test checks that following modes:
* QUERY_WAIT_INVERTED 0x8E17,
* QUERY_NO_WAIT_INVERTED 0x8E18,
* QUERY_BY_REGION_WAIT_INVERTED 0x8E19,
* QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A,
* are accepted by BeginConditionalRender.
*
* See reference: ARB_conditional_render_inverted extension specification or
* Chapter 10 of the OpenGL 4.4 (Core Profile) Specification.
*/
class CoverageTest : public deqp::TestCase
{
public:
/* Public member functions. */
CoverageTest(deqp::Context& context);
virtual tcu::TestNode::IterateResult iterate();
private:
/* Private member functions */
CoverageTest(const CoverageTest& other);
CoverageTest& operator=(const CoverageTest& other);
void createQueryObject();
void clean();
bool test(glw::GLenum mode);
/* Private member variables. */
glw::GLuint m_qo_id;
};
/* class CoverageTest */
/** @class FunctionalTest
*
* @brief Conditional Render Inverted Functional Test.
*
* The test runs as follows:
*
* Prepare program consisting of vertex and fragment shader which draws
* full screen quad depending on vertex ID. Fragment shader shall be able
* discard fragments depending on uniform value. Return color shall also be
* controlled by uniform. Prepare 1x1 pixels' size framebuffer object with
* R8 format.
*
* For each render case,
* for each query case,
* for each conditional render inverted mode,
* do the following:
* - create query object;
* - setup program to pass or discard fragments depending on
* render case;
* - setup color uniform to red component equal to 1;
* - clear framebuffer with red color component equal to 0.5;
* - draw quad using query object;
* - check that fragments passed or not using query object
* query;
* if program behaved not as expected return failure;
* note: query shall finish;
* - setup program to pass all fragments;
* - setup color uniform to red component equal to 0;
* - draw using the conditional rendering;
* - read framebuffer pixel;
* - expect that red component of the pixel is 1.0 if render
* case passes all pixels or 0.0 otherwise; if read color is
* different than expected, return failure;
* - cleanup query object.
* After loop, cleanup program and framebuffer. Return pass if all tests
* passed.
*
* Test for following render cases:
* - all fragments passes,
* - all fragments are discarded.
*
* Test for following query cases:
* - SAMPLES_PASSED,
* - GL_ANY_SAMPLES_PASSED.
*
* Test for following conditional render inverted modes:
* - QUERY_WAIT_INVERTED,
* - QUERY_NO_WAIT_INVERTED,
* - QUERY_BY_REGION_WAIT_INVERTED,
* - QUERY_BY_REGION_NO_WAIT_INVERTED.
*
* See reference: ARB_conditional_render_inverted extension specification or
* Chapter 10 of the OpenGL 4.4 (Core Profile) Specification.
*/
class FunctionalTest : public deqp::TestCase
{
public:
/* Public member functions. */
FunctionalTest(deqp::Context& context);
virtual tcu::TestNode::IterateResult iterate();
private:
/* Private member functions. */
FunctionalTest(const FunctionalTest& other);
FunctionalTest& operator=(const FunctionalTest& other);
void createProgram();
void createVertexArrayObject();
void createView();
void createQueryObject();
void setupColor(const glw::GLfloat red);
void setupPassSwitch(const bool shall_pass);
void clearView();
void draw(const bool conditional_or_query_draw, const glw::GLenum condition_mode_or_query_target);
bool fragmentsPassed();
glw::GLfloat readPixel();
void cleanQueryObject();
void cleanProgramViewAndVAO();
/* Private member variables. */
glw::GLuint m_fbo_id; //!< Test's framebuffer object id.
glw::GLuint m_rbo_id; //!< Test's renderbuffer object id.
glw::GLuint m_vao_id; //!< Test's vertex array object id.
glw::GLuint m_po_id; //!< Test's program object id.
glw::GLuint m_qo_id; //!< Test's query object id.
/* Private static constants. */
static const glw::GLchar s_vertex_shader[]; //!< Vertex shader source code.
static const glw::GLchar s_fragment_shader[]; //!< Fragment shader source code.
static const glw::GLchar s_color_uniform_name[]; //!< Name of the color uniform.
static const glw::GLchar
s_pass_switch_uniform_name[]; //!< Name of the fragment pass or discarded uniform switch.
static const glw::GLuint s_view_size; //!< Size of view (1 by design).
};
/* class FunctionalTest*/
namespace Utilities
{
const glw::GLchar* modeToChars(glw::GLenum mode);
const glw::GLchar* queryTargetToChars(glw::GLenum mode);
}
} /* ConditionalRenderInverted namespace */
} /* gl4cts namespace */
#endif // _GL4CCONDITIONALRENDERINVERTEDTESTS_HPP