1 #ifndef _ESEXTCGPUSHADER5SSBOARRAYINDEXING_HPP 2 #define _ESEXTCGPUSHADER5SSBOARRAYINDEXING_HPP 3 /*------------------------------------------------------------------------- 4 * OpenGL Conformance Test Suite 5 * ----------------------------- 6 * 7 * Copyright (c) 2014-2016 The Khronos Group Inc. 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 */ /*! 22 * \file 23 * \brief 24 */ /*-------------------------------------------------------------------*/ 25 26 /*! 27 * \file esextcGPUShader5SSBOArrayIndexing.hpp 28 * \brief GPUShader5 SSBO Array Indexing (Test 5) 29 */ /*-------------------------------------------------------------------*/ 30 31 #include "../esextcTestCaseBase.hpp" 32 33 namespace glcts 34 { 35 /** Implementation of Test 5 from CTS_EXT_gpu_shader5. Description follows 36 * 37 * Test whether indexing into an array of SSBOs using dynamically uniform 38 * integer expressions works as expected. 39 * 40 * Category: API, 41 * Functional Test, 42 * 43 * Write a compute shader with an array of four SSBOs. 44 * The work group size should be 3x3 45 * 46 * shared Buffer ComputeSSBO { 47 * uint value; 48 * } computeSSBO[4]; 49 * 50 * Initialize a set of buffer objects to be assigned as SSBO data sources. 51 * Set the buffer objects' data to zeros. 52 * 53 * Add a uniform variable: 54 * 55 * uniform uint index; 56 * 57 * In the compute shader perform operations: 58 * 59 * uint id = gl_LocalInvocationID.x * local_size_y + gl_LocalInvocationID.y; 60 * 61 * for(uint i = 0; i < local_size_x * local_size_y; ++i) 62 * { 63 * if(id == i) 64 * { 65 * computeSSBO[index].value += id; 66 * } 67 * memoryBarrier(); 68 * } 69 * 70 * Create a program from the above compute shader and use it. 71 * 72 * Execute: 73 * 74 * glUniform1ui( indexLocation, 1); 75 * glDispatchCompute(1, 1, 1); 76 * glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); 77 * 78 * glUniform1ui( indexLocation, 3); 79 * glDispatchCompute(1, 1, 1); 80 * glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); 81 * 82 * Map the buffer object's data storage to program memory using glMapBuffer 83 * for all four buffer objects. 84 * 85 * The test is successful if the values read from mapped buffers 86 * corresponding to computeSSBO[1].value and computeSSBO[3].value and equal 87 * to 36 and the values corresponding to computeSSBO[0].value and 88 * computeSSBO[2].value are equal to 0. 89 */ 90 class GPUShader5SSBOArrayIndexing : public TestCaseBase 91 { 92 public: 93 /* Public functions */ 94 GPUShader5SSBOArrayIndexing(Context &context, const ExtParameters &extParams, const char *name, 95 const char *description); 96 ~GPUShader5SSBOArrayIndexing()97 virtual ~GPUShader5SSBOArrayIndexing() 98 { 99 } 100 101 virtual IterateResult iterate(void); 102 virtual void deinit(void); 103 104 private: 105 /* Private variables */ 106 static const char *m_compute_shader_code; 107 static const glw::GLuint m_n_arrays; 108 109 glw::GLuint m_compute_shader_id; 110 glw::GLuint m_program_id; 111 glw::GLuint *m_ssbo_buffer_ids; 112 113 /* Private functions */ 114 void initTest(void); 115 }; 116 117 } // namespace glcts 118 119 #endif // _ESEXTCGPUSHADER5SSBOARRAYINDEXING_HPP 120