blob: e4b9061152d4c3f7dc7a59dcf8693326c91fd86b [file] [log] [blame]
#ifndef _ESEXTCTEXTUREBUFFERPARAMVALUEINTTOFLOATCONVERSION_HPP
#define _ESEXTCTEXTUREBUFFERPARAMVALUEINTTOFLOATCONVERSION_HPP
/*-------------------------------------------------------------------------
* OpenGL Conformance Test Suite
* -----------------------------
*
* Copyright (c) 2014-2016 The Khronos Group Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/ /*!
* \file
* \brief
*/ /*-------------------------------------------------------------------*/
/*!
* \file esextcTextureBufferParamValueIntToFloatConversion.hpp
* \brief Texture Buffer - Integer To Float Conversion (Test 4)
*/ /*-------------------------------------------------------------------*/
#include "../esextcTestCaseBase.hpp"
namespace glcts
{
/** Implementation of (Test 4) from CTS_EXT_texture_buffer. Description follows
*
* Test whether for texture buffer formats with unsigned normalized
* fixed-point components, the extracted values in the shader are correctly
* converted to floating-point values using equation 2.1 from OpenGL ES
* specification.
*
* Category: API, Functional Test.
*
* The test should create a texture object and bind it to TEXTURE_BUFFER_EXT
* texture target at texture unit 0. It should also create buffer object and
* bind it to TEXTURE_BUFFER_EXT target.
*
* It should then allocate memory block of size 256 bytes. The memory should be
* initialized with subsequent unsigned byte values from the range [0 .. 255].
*
* Use glBufferData to initialize a buffer object's data store.
* glBufferData should be given a pointer to allocated memory that will be
* copied into the data store for initialization.
*
* The buffer object should be used as texture buffer's data store by calling
*
* TexBufferEXT(TEXTURE_BUFFER_EXT, GL_R8, buffer_id );
*
* Write a compute shader that defines
*
* uniform highp samplerBuffer sampler_buffer;
*
* Bind the sampler_buffer location to texture unit 0.
*
* Work group size should be equal to 16 x 16 x 1.
*
* The shader should also define a shader storage buffer object
*
* buffer ComputeSSBO
* {
* float value[];
*
* } computeSSBO;
*
* Initialize a buffer object to be assigned as ssbo's data store. The size of
* this buffer object's data store should be equal to 256 * sizeof(GLfloat).
*
* In the compute shader execute:
*
* int index = int(gl_LocalInvocationID.x * gl_WorkGroupSize.y + gl_LocalInvocationID.y);
*
* computeSSBO.value[index] = texelFetch( sampler_buffer, index ).x;
*
* Call:
*
* glDispatchCompute(1, 1, 1);
* glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
*
* Map the ssbo's buffer object's data store to client's address space.
*
* The test passes if for each of 256 float values read from the mapped
* ssbo's buffer object's data store the value of
*
* fabs( computeSSBO.value[index] - (index / 255.0f) )
*
* is smaller than 1.0f/256.0f epsilon tolerance.
*
*/
class TextureBufferParamValueIntToFloatConversion : public TestCaseBase
{
public:
/* Public methods */
TextureBufferParamValueIntToFloatConversion(Context& context, const ExtParameters& extParams, const char* name,
const char* description);
virtual ~TextureBufferParamValueIntToFloatConversion()
{
}
virtual void deinit(void);
virtual IterateResult iterate(void);
private:
/* Private methods */
void initTest(void);
std::string getComputeShaderCode(void);
/* Variables for general usage */
glw::GLuint m_cs_id;
glw::GLuint m_po_id;
glw::GLuint m_ssbo_id;
glw::GLuint m_tbo_id;
glw::GLuint m_tbo_tex_id;
/* Static constant variables */
static glw::GLuint m_texture_buffer_size;
static glw::GLuint m_work_group_x_size;
static glw::GLuint m_work_group_y_size;
static const glw::GLfloat m_epsilon;
};
} // namespace glcts
#endif // _ESEXTCTEXTUREBUFFERPARAMVALUEINTTOFLOATCONVERSION_HPP