1 #ifndef _ESEXTCTEXTUREBUFFERPARAMVALUEINTTOFLOATCONVERSION_HPP
2 #define _ESEXTCTEXTUREBUFFERPARAMVALUEINTTOFLOATCONVERSION_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  esextcTextureBufferParamValueIntToFloatConversion.hpp
28  * \brief Texture Buffer - Integer To Float Conversion (Test 4)
29  */ /*-------------------------------------------------------------------*/
30 
31 #include "../esextcTestCaseBase.hpp"
32 
33 namespace glcts
34 {
35 /** Implementation of (Test 4) from CTS_EXT_texture_buffer. Description follows
36  *
37  *   Test whether for texture buffer formats with unsigned normalized
38  *   fixed-point components, the extracted values in the shader are correctly
39  *   converted to floating-point values using equation 2.1 from OpenGL ES
40  *   specification.
41  *
42  *   Category: API, Functional Test.
43  *
44  *   The test should create a texture object and bind it to TEXTURE_BUFFER_EXT
45  *   texture target at texture unit 0. It should also create buffer object and
46  *   bind it to TEXTURE_BUFFER_EXT target.
47  *
48  *   It should then allocate memory block of size 256 bytes. The memory should be
49  *   initialized with subsequent unsigned byte values from the range [0 .. 255].
50  *
51  *   Use glBufferData to initialize a buffer object's data store.
52  *   glBufferData should be given a pointer to allocated memory that will be
53  *   copied into the data store for initialization.
54  *
55  *   The buffer object should be used as texture buffer's data store by calling
56  *
57  *   TexBufferEXT(TEXTURE_BUFFER_EXT, GL_R8, buffer_id );
58  *
59  *   Write a compute shader that defines
60  *
61  *   uniform highp samplerBuffer sampler_buffer;
62  *
63  *   Bind the sampler_buffer location to texture unit 0.
64  *
65  *   Work group size should be equal to 16 x 16 x 1.
66  *
67  *   The shader should also define a shader storage buffer object
68  *
69  *   buffer ComputeSSBO
70  *   {
71  *     float value[];
72  *
73  *   } computeSSBO;
74  *
75  *   Initialize a buffer object to be assigned as ssbo's data store. The size of
76  *   this buffer object's data store should be equal to 256 * sizeof(GLfloat).
77  *
78  *   In the compute shader execute:
79  *
80  *   int index = int(gl_LocalInvocationID.x * gl_WorkGroupSize.y + gl_LocalInvocationID.y);
81  *
82  *   computeSSBO.value[index] = texelFetch( sampler_buffer, index ).x;
83  *
84  *   Call:
85  *
86  *   glDispatchCompute(1, 1, 1);
87  *   glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
88  *
89  *   Map the ssbo's buffer object's data store to client's address space.
90  *
91  *   The test passes if for each of 256 float values read from the mapped
92  *   ssbo's buffer object's data store the value of
93  *
94  *   fabs( computeSSBO.value[index] - (index / 255.0f) )
95  *
96  *   is smaller than 1.0f/256.0f epsilon tolerance.
97  *
98  */
99 class TextureBufferParamValueIntToFloatConversion : public TestCaseBase
100 {
101 public:
102 	/* Public methods */
103 	TextureBufferParamValueIntToFloatConversion(Context& context, const ExtParameters& extParams, const char* name,
104 												const char* description);
105 
~TextureBufferParamValueIntToFloatConversion()106 	virtual ~TextureBufferParamValueIntToFloatConversion()
107 	{
108 	}
109 
110 	virtual void		  deinit(void);
111 	virtual IterateResult iterate(void);
112 
113 private:
114 	/* Private methods */
115 	void		initTest(void);
116 	std::string getComputeShaderCode(void);
117 
118 	/* Variables for general usage */
119 	glw::GLuint m_cs_id;
120 	glw::GLuint m_po_id;
121 	glw::GLuint m_ssbo_id;
122 	glw::GLuint m_tbo_id;
123 	glw::GLuint m_tbo_tex_id;
124 
125 	/* Static constant variables */
126 	static glw::GLuint		  m_texture_buffer_size;
127 	static glw::GLuint		  m_work_group_x_size;
128 	static glw::GLuint		  m_work_group_y_size;
129 	static const glw::GLfloat m_epsilon;
130 };
131 
132 } // namespace glcts
133 
134 #endif // _ESEXTCTEXTUREBUFFERPARAMVALUEINTTOFLOATCONVERSION_HPP
135