#ifndef _ESEXTCGEOMETRYSHADERLAYEREDRENDERINGFBONOATTACHMENT_HPP #define _ESEXTCGEOMETRYSHADERLAYEREDRENDERINGFBONOATTACHMENT_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" #include "glwEnums.hpp" #include "glwFunctions.hpp" namespace glcts { /** Implementation of "Group 14" from CTS_EXT_geometry_shader. Description follows: * * 1. Make sure that layered rendering works correctly when using a framebuffer * with no attachments, but for which default height & width & non - zero * number of layers have been defined. * * Category: API; * Functional Test. * * Create a program object, as well as a fragment, geometry and vertex * shader objects. * * Vertex shader can be boilerplate. * * Geometry shader should : * * - accept points on input; * - output triangle strips (a maximum of(4 vertices * 4 layers) vertices * will be stored); * - generate "full-screen" quads (as per definition in test case 7.1) for * layers 0, 1, 2, and 3. * - define output uv variable and set it to valid UV coordinates for each * of quad's vertices. * - define output layer_id variable and set it to gl_Layer for each * of quad's vertices. * * Fragment shader should : * * - declare an image2DArray called array_image. * - using array_image store color (0, 255, 0, 0) at texel coordinates * ivec3( int(128.0 * uv.x), int(128.0 * uv.y), layer_id ) * * Shader objects should be compiled and attached to the program object. * The program object should then be linked. * * 2d array texture object having GL_RGBA32I internal format and * resolution 128x128x4 should be created and initialized. All texels of base * mip - maps of the texture should be filled with (255, 0, 0, 0). * * The texture object should be bound to image unit 0 and array_image uniform * should have binding set to 0 as well. * * Generate a framebuffer object. Bind the FBO to GL_FRAMEBUFFER target and * set its : * * - default width & height to 128x128; * - default number of layers to 4; * * Generate and bind a vertex array object. Test should now draw * a single point. * * After rendering finishes, the test should check if all texels of base * mip - maps of all layers of 2d array texture object have been set to * (0, 255, 0, 0). If so, the test has passed. * * * 2. Make sure that, for a newly generated framebuffer object, default layer * count of a framebuffer object without attachments should be equal to 0. * Once modified, an updated value should be reported for the property by * GLES implementation. * * Category: API; * Coverage; * * Test should generate a FBO, bind it to GL_DRAW_FRAMEBUFFER target, and do * a glGetFramebufferParameteriv() call to determine value of * GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT property. No error should be generated, * the value reported should be equal to 0. * * Test should now modify the property's value by doing * a glFramebufferParameteri() call. It should then use the * glGetFramebufferParameteriv() call again to make sure the value has been * updated. **/ class GeometryShaderLayeredRenderingFBONoAttachment : public TestCaseBase { public: /* Public methods */ GeometryShaderLayeredRenderingFBONoAttachment(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~GeometryShaderLayeredRenderingFBONoAttachment(void) { } virtual void deinit(void); virtual IterateResult iterate(void); private: /* Private variables */ static const char* m_fs_code; static const char* m_vs_code; static const char* m_gs_code; static const glw::GLint m_height; static const glw::GLint m_width; static const int m_n_layers; static const glw::GLint m_n_texture_components; glw::GLuint m_fbo_id; glw::GLuint m_fs_id; glw::GLuint m_gs_id; glw::GLuint m_po_id; glw::GLuint m_to_id; glw::GLuint m_vao_id; glw::GLuint m_vs_id; glw::GLint* m_all_layers_data; glw::GLint* m_layer_data; }; } // namespace glcts #endif // _ESEXTCGEOMETRYSHADERLAYEREDRENDERINGFBONOATTACHMENT_HPP