#ifndef _ESEXTCTEXTUREBUFFERACTIVEUNIFORMVALIDATION_HPP #define _ESEXTCTEXTUREBUFFERACTIVEUNIFORMVALIDATION_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 */ /*-------------------------------------------------------------------*/ /*! * \file esextcTextureBufferActiveUniformValidation.hpp * \brief Texture Buffer - Active Uniform Value Validation (Test 8) */ /*-------------------------------------------------------------------*/ #include "../esextcTestCaseBase.hpp" #include namespace glcts { /** Implementation of (Test 8) from CTS_EXT_texture_buffer. Description follows * * Check whether glGetActiveUniform, glGetActiveUniformsiv and * glGetProgramResourceiv functions return correct information about active * uniform variables of the type: * * SAMPLER_BUFFER_EXT * INT_SAMPLER_BUFFER_EXT * UNSIGNED_INT_SAMPLER_BUFFER_EXT * IMAGE_BUFFER_EXT * INT_IMAGE_BUFFER_EXT * UNSIGNED_INT_IMAGE_BUFFER_EXT * * Category: API. * * Write a fragment shader that defines the following uniform variables: * * uniform highp samplerBuffer sampler_buffer; * uniform highp isamplerBuffer isampler_buffer; * uniform highp usamplerBuffer usampler_buffer; * * Make sure each of the uniform variables will be considered active. * A uniform variable is considered active if it is determined during the link * operation that it may be accessed during program execution. The easiest way * to make sure the above variables are active is to call texelFetch on each * texture sampler and imageLoad on each image sampler and use the returned * values to determine the output color. * * Pair the fragment shader with a boilerplate vertex shader. * * Compile vertex and fragment shader, attach them to a program object and link * the program object. * * Get the number of active uniforms in the program object by calling * glGetProgramiv with the value GL_ACTIVE_UNIFORMS and store the result in * n_active_uniforms variable. * * For index values ranging from zero to n_active_uniforms - 1 get the information * about the uniform variable by calling glGetActiveUniform. * * This phase of the test passes if among the returned information * about active uniforms for the specified program object we can identify: * * Name: Type: * * "sampler_buffer" SAMPLER_BUFFER_EXT * "isampler_buffer" INT_SAMPLER_BUFFER_EXT * "usampler_buffer" UNSIGNED_INT_SAMPLER_BUFFER_EXT * * Store which index corresponds to which variable type. * * Create an array holding uniform variables' indices ranging from * zero to n_active_uniforms - 1. * * Call * * glGetActiveUniformsiv( po_id, n_active_uniforms, indices_array, * GL_UNIFORM_TYPE, types_array ); * * This phase of the test passes if the resulting types array holds for each * index value in indices_array the same uniform type as returned previously by * glGetActiveUniform called for this index. * * For index values ranging from zero to n_active_uniforms - 1 * get the type information about the uniform variable by calling * glGetProgramResourceiv with GL_UNIFORM program interface and GL_TYPE property. * * This phase of the test passes if for each index value the returned type is * equal to the one previously returned by glGetActiveUniform. * * Repeat the test for a compute shader that defines the following uniform * variables: * * uniform highp imageBuffer image_buffer; * uniform highp iimageBuffer iimage_buffer; * uniform highp uimageBuffer uimage_buffer; * * The corresponding types for the above uniform variables are: * * IMAGE_BUFFER_EXT * INT_IMAGE_BUFFER_EXT * UNSIGNED_INT_IMAGE_BUFFER_EXT * */ /* Helper Sctructure storing texture confituration parameters */ class TextureParameters { public: TextureParameters(); TextureParameters(glw::GLuint textureBufferSize, glw::GLenum textureFormat, glw::GLenum textureUniformType, const char* uniformName); glw::GLuint get_texture_buffer_size() const { return m_texture_buffer_size; } glw::GLenum get_texture_format() const { return m_texture_format; } glw::GLenum get_texture_uniform_type() const { return m_texture_uniform_type; } std::string get_uniform_name() const { return m_uniform_name; } private: glw::GLenum m_texture_buffer_size; glw::GLenum m_texture_format; glw::GLenum m_texture_uniform_type; std::string m_uniform_name; }; /* Base Class */ class TextureBufferActiveUniformValidation : public TestCaseBase { public: /* Public methods */ TextureBufferActiveUniformValidation(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~TextureBufferActiveUniformValidation() { } virtual void deinit(void); virtual IterateResult iterate(void); protected: /* Protected methods */ void addTextureParam(glw::GLenum uniformType, glw::GLenum format, glw::GLuint size, const char* name, std::vector* params); /* Protected variables */ glw::GLuint m_po_id; static const glw::GLuint m_param_value_size; private: /* Private methods */ virtual void configureParams(std::vector* params) = 0; virtual void configureProgram(std::vector* params, glw::GLuint* texIds) = 0; virtual void createProgram(void) = 0; virtual void initTest(void); const char* getUniformTypeName(glw::GLenum uniformType); const TextureParameters* getParamsForType(glw::GLenum uniformType) const; /* Variables for general usage */ glw::GLuint* m_tbo_ids; glw::GLuint* m_tbo_tex_ids; std::vector m_texture_params; }; /* Vertex/Fragment Shader (Case 1)*/ class TextureBufferActiveUniformValidationVSFS : public TextureBufferActiveUniformValidation { public: /* Public methods */ TextureBufferActiveUniformValidationVSFS(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~TextureBufferActiveUniformValidationVSFS() { } virtual void deinit(void); private: /* Private methods */ virtual void configureParams(std::vector* params); virtual void configureProgram(std::vector* params, glw::GLuint* texIds); virtual void createProgram(void); const char* getFragmentShaderCode(void) const; const char* getVertexShaderCode(void) const; /* Variables for general usage */ glw::GLuint m_fs_id; glw::GLuint m_vs_id; }; /* Compute Shader (Case 2)*/ class TextureBufferActiveUniformValidationCS : public TextureBufferActiveUniformValidation { public: /* Public methods */ TextureBufferActiveUniformValidationCS(Context& context, const ExtParameters& extParams, const char* name, const char* description); virtual ~TextureBufferActiveUniformValidationCS() { } virtual void deinit(void); private: /* Private methods */ virtual void configureParams(std::vector* params); virtual void configureProgram(std::vector* params, glw::GLuint* texIds); virtual void createProgram(void); const char* getComputeShaderCode(void) const; /* Variables for general usage */ glw::GLuint m_cs_id; }; } // namespace glcts #endif // _ESEXTCTEXTUREBUFFERACTIVEUNIFORMVALIDATION_HPP