#ifndef _ESEXTCGEOMETRYSHADERLAYEREDFBO_HPP #define _ESEXTCGEOMETRYSHADERLAYEREDFBO_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 */ /*-------------------------------------------------------------------*/ #include "../esextcTestCaseBase.hpp" namespace glcts { /** Class which implements methods shared by more than one conformance test related to * layered framebuffers. */ class GeometryShaderLayeredFBOShared { public: static bool checkFBOCompleteness(tcu::TestContext& test_context, const glw::Functions& gl, glw::GLenum fbo_id, glw::GLenum expected_completeness_status); static void deinitFBOs(const glw::Functions& gl, const glw::GLuint* fbo_ids); static void deinitTOs(const glw::Functions& gl, const glw::GLuint* to_ids); static void initFBOs(const glw::Functions& gl, glw::glFramebufferTextureFunc pGLFramebufferTexture, const glw::GLuint* to_ids, glw::GLuint* out_fbo_ids); static void initTOs(const glw::Functions& gl, glw::glTexStorage3DMultisampleFunc pGLTexStorage3DMultisample, glw::GLuint* out_to_ids); static const unsigned int n_shared_fbo_ids; static const unsigned int n_shared_to_ids; static const glw::GLuint shared_to_depth; static const glw::GLuint shared_to_height; static const glw::GLuint shared_to_width; }; /** Implementation of Test 21.1 from CTS_EXT_geometry_shader. Description follows: * * Reassure GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT framebuffer * incompleteness status is reported for framebuffer objects, for which some * of the attachments are layered and some aren't. * * Category: API; * Dependency with OES_texture_storage_multisample_2d_array. * * 1. Create four framebuffer objects (A, B, C, D) and set up: * * - an immutable 2D texture object A (using any color-renderable * internalformat); * - an immutable 2D texture object A' (using any depth-renderable * internalformat); * - an immutable 2D array texture object B (using any color-renderable * internalformat); * - an immutable 3D texture object C (using any color-renderable * internalformat); * - an immutable cube-map texture object D (using any color-renderable * internalformat); * - an immutable multisample 2D texture object E (using any * color-renderable internalformat and any number of samples > 1) * - an immutable multisample 2D array texture object F (using any * color-renderable internalformat and any number of samples > 1) * * Resolution of all textures should be set to 4x4 (for each face, layer, * slice, etc.). Use depth of 4 if appropriate. * * 2.Set up a layered FBO A using glFramebufferTextureEXT() calls, so that: * * - base mip-map of texture object A is bound to its color attachment 0; * - level 0 of texture object B is bound to color attachment 2; * - level 0 of texture object A' is bound to its depth attachment; * - draw buffers are set to use color attachments 0 and 2. * * 3. Set up a layered FBO B using glFramebufferTextureEXT() calls, so that: * * - level 0 of texture object C is bound to color attachment 0; * - mip-map at level 0 of texture object A is bound to color attachment 1; * - layer 3 of the cube-map texture object is bound to color attachment 2; * - draw buffers are set to use color attachments 0, 1 and 2. * * 4. Set up a layered FBO C using glFramebufferTextureEXT() calls so that: * * - layer 5 of the cube-map texture object is bound to color attachment 0; * - level 0 of texture object A' is bound to the depth attachment; * - the only draw buffer used is color attachment 0. * * 5. Set up a layered FBO D using glFramebufferTextureEXT() calls so that: * * - base mip-map of multisample texture object E is bound to color * attachment 0; * - level 0 of texture object F is bound to color attachment 1; * - draw buffers are set to use color attachments 0 and 1. * * 6. Make sure that, once each of these FBOs is bound, * GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT FBO status is reported. * **/ class GeometryShaderIncompleteLayeredFBOTest : public TestCaseBase { public: /* Public methods */ GeometryShaderIncompleteLayeredFBOTest(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~GeometryShaderIncompleteLayeredFBOTest() { } void deinit(void); IterateResult iterate(void); private: /* Private functions */ /* Private variables */ glw::GLuint* m_fbo_ids; glw::GLuint* m_to_ids; }; /** Implementation of Test 21.2 from CTS_EXT_geometry_shader. Description follows: * * 2. Make sure that values reported layered FBO attachment properties are * valid. * * Category: API. * * 1. Use FBO and textures as described in test case 21.1. * 2. Make sure that for each of the FBO attachments, value reported for * GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT is as expected. * **/ class GeometryShaderIncompleteLayeredAttachmentsTest : public TestCaseBase { public: /* Public methods */ GeometryShaderIncompleteLayeredAttachmentsTest(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~GeometryShaderIncompleteLayeredAttachmentsTest() { } void deinit(void); IterateResult iterate(void); private: /* Private functions */ /* Private variables */ glw::GLuint* m_fbo_ids; glw::GLuint* m_to_ids; }; /* Implementation of "Group 26", test 1 from CTS_EXT_geometry_shader. Description follows: * * 1. glFramebufferTextureEXT() should not accept invalid targets. * * Category: API; * Coverage; * Negative Test. * * Calling glFramebufferTextureEXT() for target = GL_TEXTURE_3D should * result in GL_INVALID_ENUM error. * */ class GeometryShaderFramebufferTextureInvalidTarget : public TestCaseBase { public: /* Public methods */ GeometryShaderFramebufferTextureInvalidTarget(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~GeometryShaderFramebufferTextureInvalidTarget() { } virtual void deinit(); virtual IterateResult iterate(); private: /* Private type definition */ /* Private methods */ /* Private variables */ glw::GLuint m_fbo_id; glw::GLuint m_to_id; }; /* Implementation of "Group 26", test 2 from CTS_EXT_geometry_shader. Description follows: * * 2. glFramebufferTextureEXT() should generate GL_INVALID_OPERATION error if * there is no framebuffer object bound to requested framebuffer target. * * Category: API; * Coverage; * Negative Test. * * Try to issue glFramebufferTextureEXT() calls for GL_DRAW_FRAMEBUFFER, * GL_READ_FRAMEBUFFER and GL_FRAMEBUFFER framebuffer targets, assuming the * texture object these calls refer to exists. * * Default binding for both GL_DRAW_FRAMEBUFFER and GL_READ_FRAMEBUFFER * framebuffer target is zero, so after each of these calls * GL_INVALID_OPERATION error should be generated. * */ class GeometryShaderFramebufferTextureNoFBOBoundToTarget : public TestCaseBase { public: /* Public methods */ GeometryShaderFramebufferTextureNoFBOBoundToTarget(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~GeometryShaderFramebufferTextureNoFBOBoundToTarget() { } virtual void deinit(); virtual IterateResult iterate(); private: /* Private type definition */ /* Private methods */ /* Private variables */ glw::GLuint m_to_id; }; /* Implementation of "Group 26", test 3 from CTS_EXT_geometry_shader. Description follows: * * 3. glFramebufferTextureEXT() should generate GL_INVALID_ENUM if attachment * argument is set to invalid value. * * Category: API; * Coverage; * Negative Test. * * Try to issue glFramebufferTextureEXT() call for GL_COLOR_ATTACHMENTi * where i is equal to value reported for GL_MAX_COLOR_ATTACHMENTS. * */ class GeometryShaderFramebufferTextureInvalidAttachment : public TestCaseBase { public: /* Public methods */ GeometryShaderFramebufferTextureInvalidAttachment(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~GeometryShaderFramebufferTextureInvalidAttachment() { } virtual void deinit(); virtual IterateResult iterate(); private: /* Private type definition */ /* Private methods */ /* Private variables */ glw::GLuint m_fbo_id; glw::GLuint m_to_id; }; /* Implementation of "Group 26", test 4 from CTS_EXT_geometry_shader. Description follows: * * 4. glFramebufferTextureEXT() should generate GL_INVALID_VALUE if texture is * not the name of a texture object. * * Category: API; * Coverage; * Negative Test. * * Try to issue glFramebufferTextureEXT() call for non-existing texture ids * 1, 10 and 100, with a FBO bound to specified FBO target. GL_INVALID_VALUE * error should be reported for each attempt. * */ class GeometryShaderFramebufferTextureInvalidValue : public TestCaseBase { public: /* Public methods */ GeometryShaderFramebufferTextureInvalidValue(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~GeometryShaderFramebufferTextureInvalidValue() { } virtual void deinit(); virtual IterateResult iterate(); private: /* Private type definition */ /* Private methods */ /* Private variables */ glw::GLuint m_fbo_id; }; /* Implementation of "Group 26", test 5 from CTS_EXT_geometry_shader. Description follows: * * 5. glFramebufferTextureEXT() should generate GL_INVALID_OPERATION if level * argument is an invalid texture level number. * * Category: API; * Coverage; * Negative Test. * * Consider a 2D texture array object A and a 3D texture array object B * (each of 4x4x4 resolution), and a framebuffer object C. Base mip-map * should be filled with any data, and descendant mip-maps should be * generated with glGenerateMipmap() call. * * glFramebufferTextureEXT() should fail with GL_INVALID_OPERATION error * when used for the FBO C and either of the textures and for level = 3. * */ class GeometryShaderFramebufferTextureInvalidLevelNumber : public TestCaseBase { public: /* Public methods */ GeometryShaderFramebufferTextureInvalidLevelNumber(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~GeometryShaderFramebufferTextureInvalidLevelNumber() { } virtual void deinit(); virtual IterateResult iterate(); private: /* Private type definition */ /* Private methods */ /* Private variables */ glw::GLuint m_fbo_id; glw::GLubyte* m_texels; glw::GLushort m_tex_depth; glw::GLushort m_tex_height; glw::GLushort m_tex_width; glw::GLuint m_to_2d_array_id; glw::GLuint m_to_3d_id; }; /* Implementation of "Group 26", test 6 from CTS_EXT_geometry_shader. Description follows: * * 6. glFramebufferTextureEXT() should generate GL_INVALID_OPERATION if texture * argument refers to a buffer texture. * * Category: API; * Coverage; * Dependency on EXT_texture_buffer; * Negative Test. * * Consider a framebuffer object A, buffer object B and a buffer texture C * using buffer object B as a data source. * * glFramebufferTextureEXT() should fail with GL_INVALID_OPERATION error * when used for the FBO A and texture argument relates to ID of buffer * texture C. * */ class GeometryShaderFramebufferTextureArgumentRefersToBufferTexture : public TestCaseBase { public: /* Public methods */ GeometryShaderFramebufferTextureArgumentRefersToBufferTexture(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~GeometryShaderFramebufferTextureArgumentRefersToBufferTexture() { } virtual void deinit(); virtual IterateResult iterate(); private: /* Private type definition */ /* Private methods */ /* Private variables */ glw::GLuint m_bo_id; glw::GLuint m_fbo_id; glw::GLuint m_tbo_id; glw::GLuint m_tex_height; glw::GLuint m_tex_width; glw::GLint* m_texels; }; } // namespace glcts #endif // _ESEXTCGEOMETRYSHADERLAYEREDFBO_HPP