blob: 58ea1e1915ac9268b612d2cb011df1a37854cc74 [file] [log] [blame]
#ifndef _ESEXTCGEOMETRYSHADERLAYEREDRENDERING_HPP
#define _ESEXTCGEOMETRYSHADERLAYEREDRENDERING_HPP
/*-------------------------------------------------------------------------
* OpenGL Conformance Test Suite
* -----------------------------
*
* Copyright (c) 2014-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
*/ /*-------------------------------------------------------------------*/
#include "../esextcTestCaseBase.hpp"
namespace glcts
{
/** Implementation of "Group 7" from CTS_EXT_geometry_shader. Description follows:
*
* 1. Make sure that layered rendering works correctly for cube-map texture
* color attachments.
*
* Category: API;
* Functional Test.
*
* Initialize cube-map texture object, assuming that cube-map face textures
* should have a resolution of 64x64 and use GL_RGBA8 internal format.
*
* Use glFramebufferTextureEXT() to attach base level of cube-map texture to
* color attachment 0.
*
* Vertex shader can be boilerplate.
*
* Geometry shader should take point primitives on input and output triangle
* strips. The shader will not emit more than 6 faces*16 vertices.
*
* Consider a triangle strip consisting of the following vertices:
*
* 1) ( 1, 1, 0, 1)
* 2) ( 1, -1, 0, 1)
* 3) (-1, 1, 0, 1)
* 4) (-1, -1, 0, 1)
*
* which is a "full-screen" quad in screen coordinates space. Remembering
* that each quad should be separated with EndPrimitive() call, quad
* primitives should be emitted to all six layers. Remember to set gl_Layer
* to corresponding layer ID for each of the vertices.
*
* Fragment shader should set result variable to:
*
* 1) (1, 0, 0, 0) if gl_Layer == 0 (+X face)
* 2) (0, 1, 0, 0) if gl_Layer == 1 (-X face)
* 3) (0, 0, 1, 0) if gl_Layer == 2 (+Y face)
* 4) (0, 0, 0, 1) if gl_Layer == 3 (-Y face)
* 5) (1, 1, 0, 0) if gl_Layer == 4(+Z face)
* 6) (1, 0, 1, 0) if gl_Layer == 5(-Z face)
*
* The test should then read cube-map texture data and verify that all
* texels of each cube map face texture are set to correct values.
*
*
* 2. Make sure that layered rendering works correctly for a set of 3D texture
* color attachments.
*
* Category: API;
* Functional test.
*
* Modify test case 7.1, so that:
*
* - the test uses a 64x64x64 3D texture instead of a cube-map texture;
* - the test attaches 4 first levels of the texture instead of cube-map
* texture faces to consequent color attachments;
* - the test only writes to 4 layers instead of 6.
*
* The change of number of layers we write to is related to a minimum
* maximum of color attachments implementations must expose to be
* GLES3.0-compliant.
*
*
* 3. Make sure that layered rendering works correctly for a set of 2D array
* texture color attachments.
*
* Category: API;
* Functional Test.
*
* Modify test case 7.2, so that the test uses a 64x64x64 2D array texture
* instead of a 3D texture;
*
*
* 4. Make sure that layered rendering works correctly for a set of multisample
* 2D array texture color attachments.
*
* Category: API;
* Dependency on OES_texture_storage_multisample_2d_array;
* Functional Test.
*
* Modify test case 7.2, so that the test uses a 64x64x64 multisample 2D
* array texture instead of a 3D texture;
**/
class GeometryShaderLayeredRendering : public TestCaseBase
{
public:
/* Public methods */
GeometryShaderLayeredRendering(Context& context, const ExtParameters& extParams, const char* name,
const char* description);
virtual ~GeometryShaderLayeredRendering(void)
{
}
void deinit(void);
IterateResult iterate(void);
private:
/* Private type definitions */
/** Describes type of the test iteration being considered */
typedef enum {
LAYERED_RENDERING_TEST_ITERATION_2D_ARRAY,
LAYERED_RENDERING_TEST_ITERATION_2D_MULTISAMPLE_ARRAY,
LAYERED_RENDERING_TEST_ITERATION_3D,
LAYERED_RENDERING_TEST_ITERATION_CUBEMAP,
/* Always last */
LAYERED_RENDERING_TEST_ITERATION_LAST
} _layered_rendering_test_iteration;
/** Holds data necessary to perform a single iteration of a single layered rendering test iteration */
typedef struct
{
glw::GLuint fbo_id;
glw::GLuint fs_id;
glw::GLuint gs_id;
glw::GLuint po_id;
glw::GLuint to_id;
glw::GLuint vs_id;
const char** fs_parts;
const char** gs_parts;
const char** vs_parts;
unsigned int n_fs_parts;
unsigned int n_gs_parts;
unsigned int n_vs_parts;
_layered_rendering_test_iteration iteration;
unsigned int n_layers;
} _layered_rendering_test;
/* Private functions */
bool buildProgramForLRTest(_layered_rendering_test* test);
/* Private variables */
static const unsigned char m_layered_rendering_expected_layer_data[6 * 4];
static const char* m_layered_rendering_fs_code;
static const char* m_layered_rendering_gs_code_preamble;
static const char* m_layered_rendering_gs_code_2d_array;
static const char* m_layered_rendering_gs_code_2d_marray;
static const char* m_layered_rendering_gs_code_3d;
static const char* m_layered_rendering_gs_code_cm;
static const char* m_layered_rendering_gs_code_main;
static const char* m_layered_rendering_vs_code;
glw::GLuint m_vao_id;
/* Holds pointers to test instances that are to be executed */
_layered_rendering_test m_tests[LAYERED_RENDERING_TEST_ITERATION_LAST];
};
} // namespace glcts
#endif // _ESEXTCGEOMETRYSHADERLAYEREDRENDERING_HPP