1 #ifndef _ESEXTCTEXTUREBUFFERATOMICFUNCTIONS_HPP
2 #define _ESEXTCTEXTUREBUFFERATOMICFUNCTIONS_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  esextcTextureBufferAtomicFunctions.hpp
28  * \brief Texture Buffer Atomic Functions (Test 5)
29  */ /*-------------------------------------------------------------------*/
30 
31 #include "../esextcTestCaseBase.hpp"
32 
33 namespace glcts
34 {
35 
36 /** Implementation of (Test 5) from CTS_EXT_texture_buffer. Description follows
37  *
38  *   Test whether image atomic functions work correctly with image uniforms
39  *   having texture buffers bound to their image units.
40  *
41  *   Category: API, Functional Test.
42  *             Dependency with OES_shader_image_atomic.
43  *
44  *   The test should create texture object and bind it to TEXTURE_BUFFER_EXT
45  *   texture target at texture unit 0.
46  *
47  *   It should create a buffer object and bind it to TEXTURE_BUFFER_EXT target.
48  *
49  *   Let n_elements = value(GL_MAX_COMPUTE_WORK_GROUP_SIZE, X axis);
50  *
51  *   The test should allocate a memory block of the size
52  *   (n_elements + 1) * sizeof(GLunit);
53  *
54  *   The memory block should then be filled with subsequent unsigned integer
55  *   values from the range [0..n_elements]
56  *
57  *   Use glBufferData to initialize a buffer object's data store.
58  *   glBufferData should be given a pointer to allocated memory that will be
59  *   copied into the data store for initialization.
60  *
61  *   The buffer object should be used as texture buffer's data store by calling
62  *
63  *   TexBufferEXT(TEXTURE_BUFFER_EXT, GL_R32UI, buffer_id );
64  *
65  *   Write a compute shader that defines
66  *
67  *   layout(r32ui, binding = 0) uniform highp uimageBuffer uimage_buffer;
68  *
69  *   Work group size should be equal to n_elements x 1 x 1.
70  *
71  *   In the compute shader execute:
72  *
73  *   uint value = imageLoad( uimage_buffer, int(gl_LocalInvocationID.x) + 1 ).x;
74  *   imageAtomicAdd( uimage_buffer, 0 , value );
75  *
76  *   memoryBarrier();
77  *
78  *   value = imageLoad( uimage_buffer, 0 ).x;
79  *   imageAtomicCompSwap( uimage_buffer, int(gl_LocalInvocationID.x) + 1,
80  *                                       gl_LocalInvocationID.x + 1u, value );
81  *
82  *   Call:
83  *
84  *   glDispatchCompute(1, 1, 1);
85  *   glMemoryBarrier(BUFFER_UPDATE_BARRIER_BIT);
86  *
87  *   Map the buffer object's data store to client's address space by using
88  *   glMapBufferRange function (map the whole data store). The test passes if
89  *   each of the (n_elements + 1) unsigned integer values in the data store is
90  *   equal to
91  *
92  *   ((1 + n_elements) * n_elements) / 2
93  */
94 class TextureBufferAtomicFunctions : public TestCaseBase
95 {
96 public:
97 	/* Public methods */
98 	TextureBufferAtomicFunctions(Context& context, const ExtParameters& extParams, const char* name,
99 								 const char* description);
100 
~TextureBufferAtomicFunctions()101 	virtual ~TextureBufferAtomicFunctions()
102 	{
103 	}
104 
105 	virtual void		  deinit(void);
106 	virtual IterateResult iterate(void);
107 
108 private:
109 	/* Private methods */
110 	void		initTest(void);
111 	std::string getComputeShaderCode(glw::GLint work_group_size) const;
112 
113 	/* Variables for general usage */
114 	glw::GLuint m_cs_id;
115 	glw::GLuint m_po_id;
116 	glw::GLuint m_tbo_id;
117 	glw::GLuint m_tbo_tex_id;
118 	glw::GLuint m_n_texels_in_texture_buffer;
119 };
120 
121 } // namespace glcts
122 
123 #endif // _ESEXTCTEXTUREBUFFERATOMICFUNCTIONS_HPP
124