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
33namespace 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 */
90class GPUShader5SSBOArrayIndexing : public TestCaseBase
91{
92public:
93	/* Public functions */
94	GPUShader5SSBOArrayIndexing(Context& context, const ExtParameters& extParams, const char* name,
95								const char* description);
96
97	virtual ~GPUShader5SSBOArrayIndexing()
98	{
99	}
100
101	virtual IterateResult iterate(void);
102	virtual void		  deinit(void);
103
104private:
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