• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _ESEXTCGPUSHADER5IMAGESARRAYINDEXING_HPP
2 #define _ESEXTCGPUSHADER5IMAGESARRAYINDEXING_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 esextcGPUShader5ImagesArrayIndexing.hpp
28  * \brief GPUShader5 Images Array Indexing (Test 2)
29  */ /*-------------------------------------------------------------------*/
30 
31 #include "../esextcTestCaseBase.hpp"
32 
33 namespace glcts
34 {
35 /** "Test 2" from CTS_EXT_gpu_shader5. Description follows
36  *
37  *   Test whether indexing into an array of images using constant
38  *   expressions works as expected.
39  *
40  *   Category:  API,
41  *              Functional Test,
42  *
43  *   Get the maximum size of work group in x and y direction by computing:
44  *
45  *   unsigned int max_wgs_x = 0;
46  *   glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, &max_wgs_x);
47  *
48  *   unsigned int max_wgs_y = 0;
49  *   glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, &max_wgs_y);
50  *
51  *   Write a compute shader with an array of 4 uimage2D image handlers.
52  *   The work group size should be (max_wgs_x, max_wgs_y, 1).
53  *
54  *   For each of the uimage2D image handlers bind a (max_wgs_x, max_wgs_y)
55  *   image texture with GL_RGBA32UI internal format. Data of the textures
56  *   should be set to (1,1,1,1).
57  *
58  *   In the compute shader perform operations:
59  *
60  *   uvec4 texel0  = imageLoad(image[0], ivec2(gl_LocalInvocationID.x,
61  *   gl_LocalInvocationID.y) );
62  *
63  *   uvec4 texel1  = imageLoad(image[1], ivec2(gl_LocalInvocationID.x,
64  *   gl_LocalInvocationID.y) );
65  *
66  *   uvec4 texel2  = imageLoad(image[2], ivec2(gl_LocalInvocationID.x,
67  *   gl_LocalInvocationID.y) );
68  *
69  *   uvec4 texel3  = imageLoad(image[3], ivec2(gl_LocalInvocationID.x,
70  *   gl_LocalInvocationID.y) );
71  *
72  *   uvec4 addon = uvec4(gl_LocalInvocationID.x+gl_LocalInvocationID.y);
73  *
74  *   imageStore(image[0], ivec2( gl_LocalInvocationID.x,
75  *   gl_LocalInvocationID.y), texel0  + addon);
76  *
77  *   imageStore(image[1], ivec2( gl_LocalInvocationID.x,
78  *   gl_LocalInvocationID.y), texel1  + addon);
79  *
80  *   imageStore(image[2], ivec2( gl_LocalInvocationID.x,
81  *   gl_LocalInvocationID.y), texel2  + addon);
82  *
83  *   imageStore(image[3], ivec2( gl_LocalInvocationID.x,
84  *   gl_LocalInvocationID.y), texel3  + addon);
85  *
86  *   Create a program from the above compute shader, use it
87  *   and call glDispatchCompute(1, 1, 1);
88  *
89  *   Read back the data from the textures corresponding to image units.
90  *
91  *   The test is successful if for each texture and for each texel
92  *   in the texture we get (x,y) -> (x+y+1, x+y+1, x+y+1, x+y+1).
93  */
94 class GPUShader5ImagesArrayIndexing : public TestCaseBase
95 {
96 public:
97 	/* Public methods */
98 	GPUShader5ImagesArrayIndexing(Context& context, const ExtParameters& extParams, const char* name,
99 								  const char* description);
100 
~GPUShader5ImagesArrayIndexing()101 	virtual ~GPUShader5ImagesArrayIndexing()
102 	{
103 	}
104 
105 	virtual IterateResult iterate(void);
106 	virtual void		  deinit(void);
107 
108 private:
109 	/* Private methods */
110 	void initTest(void);
111 
112 	/* Private static variables */
113 	static const glw::GLuint m_array_size;
114 	static const glw::GLint  m_texture_n_components;
115 
116 	/* Private variables */
117 	glw::GLuint  m_compute_shader_id;
118 	glw::GLuint* m_data_buffer;
119 	glw::GLuint  m_program_id;
120 	glw::GLint   m_texture_height;
121 	glw::GLint   m_texture_width;
122 	glw::GLuint* m_to_ids;
123 	glw::GLuint  m_fbo_id;
124 
125 	/* Private functions */
126 	std::string getComputeShaderCode(const std::string& layout_size_x, const std::string& layout_size_y);
127 };
128 
129 } // namespace glcts
130 
131 #endif // _ESEXTCGPUSHADER5IMAGESARRAYINDEXING_HPP
132