1e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 2e5c31af7Sopenharmony_ci * drawElements Quality Program OpenGL ES 3.0 Module 3e5c31af7Sopenharmony_ci * ------------------------------------------------- 4e5c31af7Sopenharmony_ci * 5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 10e5c31af7Sopenharmony_ci * 11e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 17e5c31af7Sopenharmony_ci * limitations under the License. 18e5c31af7Sopenharmony_ci * 19e5c31af7Sopenharmony_ci *//*! 20e5c31af7Sopenharmony_ci * \file 21e5c31af7Sopenharmony_ci * \brief Pixel Buffer Object tests 22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 23e5c31af7Sopenharmony_ci 24e5c31af7Sopenharmony_ci#include "es3fPixelBufferObjectTests.hpp" 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "tcuTexture.hpp" 27e5c31af7Sopenharmony_ci#include "tcuTextureUtil.hpp" 28e5c31af7Sopenharmony_ci#include "tcuImageCompare.hpp" 29e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp" 30e5c31af7Sopenharmony_ci#include "tcuRenderTarget.hpp" 31e5c31af7Sopenharmony_ci 32e5c31af7Sopenharmony_ci#include "gluTextureUtil.hpp" 33e5c31af7Sopenharmony_ci#include "gluPixelTransfer.hpp" 34e5c31af7Sopenharmony_ci#include "gluShaderProgram.hpp" 35e5c31af7Sopenharmony_ci 36e5c31af7Sopenharmony_ci#include "deRandom.hpp" 37e5c31af7Sopenharmony_ci#include "deString.h" 38e5c31af7Sopenharmony_ci 39e5c31af7Sopenharmony_ci#include <string> 40e5c31af7Sopenharmony_ci#include <sstream> 41e5c31af7Sopenharmony_ci 42e5c31af7Sopenharmony_ci#include "glw.h" 43e5c31af7Sopenharmony_ci 44e5c31af7Sopenharmony_ciusing std::string; 45e5c31af7Sopenharmony_ciusing std::stringstream; 46e5c31af7Sopenharmony_ci 47e5c31af7Sopenharmony_cinamespace deqp 48e5c31af7Sopenharmony_ci{ 49e5c31af7Sopenharmony_cinamespace gles3 50e5c31af7Sopenharmony_ci{ 51e5c31af7Sopenharmony_cinamespace Functional 52e5c31af7Sopenharmony_ci{ 53e5c31af7Sopenharmony_ci 54e5c31af7Sopenharmony_cinamespace 55e5c31af7Sopenharmony_ci{ 56e5c31af7Sopenharmony_ci 57e5c31af7Sopenharmony_ciclass ReadPixelsTest : public TestCase 58e5c31af7Sopenharmony_ci{ 59e5c31af7Sopenharmony_cipublic: 60e5c31af7Sopenharmony_ci struct TestSpec 61e5c31af7Sopenharmony_ci { 62e5c31af7Sopenharmony_ci enum FramebufferType 63e5c31af7Sopenharmony_ci { 64e5c31af7Sopenharmony_ci FRAMEBUFFERTYPE_NATIVE = 0, 65e5c31af7Sopenharmony_ci FRAMEBUFFERTYPE_RENDERBUFFER 66e5c31af7Sopenharmony_ci }; 67e5c31af7Sopenharmony_ci 68e5c31af7Sopenharmony_ci string name; 69e5c31af7Sopenharmony_ci string description; 70e5c31af7Sopenharmony_ci 71e5c31af7Sopenharmony_ci bool useColorClear; 72e5c31af7Sopenharmony_ci bool renderTriangles; 73e5c31af7Sopenharmony_ci 74e5c31af7Sopenharmony_ci FramebufferType framebufferType; 75e5c31af7Sopenharmony_ci GLenum renderbufferFormat; 76e5c31af7Sopenharmony_ci }; 77e5c31af7Sopenharmony_ci 78e5c31af7Sopenharmony_ci ReadPixelsTest (Context& context, const TestSpec& spec); 79e5c31af7Sopenharmony_ci ~ReadPixelsTest (void); 80e5c31af7Sopenharmony_ci 81e5c31af7Sopenharmony_ci void init (void); 82e5c31af7Sopenharmony_ci void deinit (void); 83e5c31af7Sopenharmony_ci 84e5c31af7Sopenharmony_ci IterateResult iterate (void); 85e5c31af7Sopenharmony_ci 86e5c31af7Sopenharmony_ciprivate: 87e5c31af7Sopenharmony_ci void renderTriangle (const tcu::Vec3& a, const tcu::Vec3& b, const tcu::Vec3& c); 88e5c31af7Sopenharmony_ci void clearColor (float r, float g, float b, float a); 89e5c31af7Sopenharmony_ci 90e5c31af7Sopenharmony_ci de::Random m_random; 91e5c31af7Sopenharmony_ci tcu::TestLog& m_log; 92e5c31af7Sopenharmony_ci glu::ShaderProgram* m_program; 93e5c31af7Sopenharmony_ci 94e5c31af7Sopenharmony_ci TestSpec::FramebufferType m_framebuffeType; 95e5c31af7Sopenharmony_ci 96e5c31af7Sopenharmony_ci GLenum m_renderbufferFormat; 97e5c31af7Sopenharmony_ci tcu::TextureChannelClass m_texChannelClass; 98e5c31af7Sopenharmony_ci 99e5c31af7Sopenharmony_ci bool m_useColorClears; 100e5c31af7Sopenharmony_ci bool m_renderTriangles; 101e5c31af7Sopenharmony_ci 102e5c31af7Sopenharmony_ci GLfloat m_colorScale; 103e5c31af7Sopenharmony_ci}; 104e5c31af7Sopenharmony_ci 105e5c31af7Sopenharmony_ci 106e5c31af7Sopenharmony_ciReadPixelsTest::ReadPixelsTest (Context& context, const TestSpec& spec) 107e5c31af7Sopenharmony_ci : TestCase (context, spec.name.c_str(), spec.description.c_str()) 108e5c31af7Sopenharmony_ci , m_random (deStringHash(spec.name.c_str())) 109e5c31af7Sopenharmony_ci , m_log (m_testCtx.getLog()) 110e5c31af7Sopenharmony_ci , m_program (NULL) 111e5c31af7Sopenharmony_ci , m_framebuffeType (spec.framebufferType) 112e5c31af7Sopenharmony_ci , m_renderbufferFormat (spec.renderbufferFormat) 113e5c31af7Sopenharmony_ci , m_texChannelClass (tcu::TEXTURECHANNELCLASS_LAST) 114e5c31af7Sopenharmony_ci , m_useColorClears (spec.useColorClear) 115e5c31af7Sopenharmony_ci , m_renderTriangles (spec.renderTriangles) 116e5c31af7Sopenharmony_ci , m_colorScale (1.0f) 117e5c31af7Sopenharmony_ci{ 118e5c31af7Sopenharmony_ci 119e5c31af7Sopenharmony_ci if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_NATIVE) 120e5c31af7Sopenharmony_ci { 121e5c31af7Sopenharmony_ci m_colorScale = 1.0f; 122e5c31af7Sopenharmony_ci } 123e5c31af7Sopenharmony_ci else if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER) 124e5c31af7Sopenharmony_ci { 125e5c31af7Sopenharmony_ci m_texChannelClass = tcu::getTextureChannelClass(glu::mapGLInternalFormat(spec.renderbufferFormat).type); 126e5c31af7Sopenharmony_ci switch (m_texChannelClass) 127e5c31af7Sopenharmony_ci { 128e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 129e5c31af7Sopenharmony_ci m_colorScale = 1.0f; 130e5c31af7Sopenharmony_ci break; 131e5c31af7Sopenharmony_ci 132e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 133e5c31af7Sopenharmony_ci m_colorScale = 100.0f; 134e5c31af7Sopenharmony_ci break; 135e5c31af7Sopenharmony_ci 136e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 137e5c31af7Sopenharmony_ci m_colorScale = 100.0f; 138e5c31af7Sopenharmony_ci break; 139e5c31af7Sopenharmony_ci 140e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 141e5c31af7Sopenharmony_ci m_colorScale = 100.0f; 142e5c31af7Sopenharmony_ci break; 143e5c31af7Sopenharmony_ci 144e5c31af7Sopenharmony_ci default: 145e5c31af7Sopenharmony_ci DE_ASSERT(false); 146e5c31af7Sopenharmony_ci } 147e5c31af7Sopenharmony_ci } 148e5c31af7Sopenharmony_ci else 149e5c31af7Sopenharmony_ci DE_ASSERT(false); 150e5c31af7Sopenharmony_ci} 151e5c31af7Sopenharmony_ci 152e5c31af7Sopenharmony_ciReadPixelsTest::~ReadPixelsTest (void) 153e5c31af7Sopenharmony_ci{ 154e5c31af7Sopenharmony_ci} 155e5c31af7Sopenharmony_ci 156e5c31af7Sopenharmony_civoid ReadPixelsTest::init (void) 157e5c31af7Sopenharmony_ci{ 158e5c31af7Sopenharmony_ci // Check extensions 159e5c31af7Sopenharmony_ci if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER) 160e5c31af7Sopenharmony_ci { 161e5c31af7Sopenharmony_ci bool supported = false; 162e5c31af7Sopenharmony_ci 163e5c31af7Sopenharmony_ci if (m_renderbufferFormat == GL_RGBA16F 164e5c31af7Sopenharmony_ci || m_renderbufferFormat == GL_RG16F) 165e5c31af7Sopenharmony_ci { 166e5c31af7Sopenharmony_ci std::istringstream extensions(std::string((const char*)glGetString(GL_EXTENSIONS))); 167e5c31af7Sopenharmony_ci std::string extension; 168e5c31af7Sopenharmony_ci 169e5c31af7Sopenharmony_ci while (std::getline(extensions, extension, ' ')) 170e5c31af7Sopenharmony_ci { 171e5c31af7Sopenharmony_ci if (extension=="GL_EXT_color_buffer_half_float") 172e5c31af7Sopenharmony_ci { 173e5c31af7Sopenharmony_ci supported = true; 174e5c31af7Sopenharmony_ci break; 175e5c31af7Sopenharmony_ci } 176e5c31af7Sopenharmony_ci if (extension=="GL_EXT_color_buffer_float") 177e5c31af7Sopenharmony_ci { 178e5c31af7Sopenharmony_ci supported = true; 179e5c31af7Sopenharmony_ci break; 180e5c31af7Sopenharmony_ci } 181e5c31af7Sopenharmony_ci } 182e5c31af7Sopenharmony_ci } 183e5c31af7Sopenharmony_ci else if (m_renderbufferFormat == GL_RGBA32F 184e5c31af7Sopenharmony_ci || m_renderbufferFormat == GL_RG32F 185e5c31af7Sopenharmony_ci || m_renderbufferFormat == GL_R11F_G11F_B10F) 186e5c31af7Sopenharmony_ci { 187e5c31af7Sopenharmony_ci std::istringstream extensions(std::string((const char*)glGetString(GL_EXTENSIONS))); 188e5c31af7Sopenharmony_ci std::string extension; 189e5c31af7Sopenharmony_ci 190e5c31af7Sopenharmony_ci while (std::getline(extensions, extension, ' ')) 191e5c31af7Sopenharmony_ci { 192e5c31af7Sopenharmony_ci if (extension=="GL_EXT_color_buffer_float") 193e5c31af7Sopenharmony_ci { 194e5c31af7Sopenharmony_ci supported = true; 195e5c31af7Sopenharmony_ci break; 196e5c31af7Sopenharmony_ci } 197e5c31af7Sopenharmony_ci } 198e5c31af7Sopenharmony_ci } 199e5c31af7Sopenharmony_ci else 200e5c31af7Sopenharmony_ci supported = true; 201e5c31af7Sopenharmony_ci 202e5c31af7Sopenharmony_ci if (!supported) 203e5c31af7Sopenharmony_ci throw tcu::NotSupportedError("Renderbuffer format not supported", "", __FILE__, __LINE__); 204e5c31af7Sopenharmony_ci } 205e5c31af7Sopenharmony_ci 206e5c31af7Sopenharmony_ci std::string outtype = ""; 207e5c31af7Sopenharmony_ci 208e5c31af7Sopenharmony_ci if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_NATIVE) 209e5c31af7Sopenharmony_ci outtype = "vec4"; 210e5c31af7Sopenharmony_ci else if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER) 211e5c31af7Sopenharmony_ci { 212e5c31af7Sopenharmony_ci switch (m_texChannelClass) 213e5c31af7Sopenharmony_ci { 214e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 215e5c31af7Sopenharmony_ci outtype = "vec4"; 216e5c31af7Sopenharmony_ci break; 217e5c31af7Sopenharmony_ci 218e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 219e5c31af7Sopenharmony_ci outtype = "ivec4"; 220e5c31af7Sopenharmony_ci break; 221e5c31af7Sopenharmony_ci 222e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 223e5c31af7Sopenharmony_ci outtype = "uvec4"; 224e5c31af7Sopenharmony_ci break; 225e5c31af7Sopenharmony_ci 226e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 227e5c31af7Sopenharmony_ci outtype = "vec4"; 228e5c31af7Sopenharmony_ci break; 229e5c31af7Sopenharmony_ci 230e5c31af7Sopenharmony_ci default: 231e5c31af7Sopenharmony_ci DE_ASSERT(false); 232e5c31af7Sopenharmony_ci } 233e5c31af7Sopenharmony_ci } 234e5c31af7Sopenharmony_ci else 235e5c31af7Sopenharmony_ci DE_ASSERT(false); 236e5c31af7Sopenharmony_ci 237e5c31af7Sopenharmony_ci 238e5c31af7Sopenharmony_ci const char* vertexShaderSource = 239e5c31af7Sopenharmony_ci "#version 300 es\n" 240e5c31af7Sopenharmony_ci "in mediump vec3 a_position;\n" 241e5c31af7Sopenharmony_ci "in mediump vec4 a_color;\n" 242e5c31af7Sopenharmony_ci "uniform mediump float u_colorScale;\n" 243e5c31af7Sopenharmony_ci "out mediump vec4 v_color;\n" 244e5c31af7Sopenharmony_ci "void main(void)\n" 245e5c31af7Sopenharmony_ci "{\n" 246e5c31af7Sopenharmony_ci "\tgl_Position = vec4(a_position, 1.0);\n" 247e5c31af7Sopenharmony_ci "\tv_color = u_colorScale * a_color;\n" 248e5c31af7Sopenharmony_ci "}"; 249e5c31af7Sopenharmony_ci 250e5c31af7Sopenharmony_ci stringstream fragmentShaderSource; 251e5c31af7Sopenharmony_ci 252e5c31af7Sopenharmony_ci fragmentShaderSource << 253e5c31af7Sopenharmony_ci "#version 300 es\n" 254e5c31af7Sopenharmony_ci "in mediump vec4 v_color;\n"; 255e5c31af7Sopenharmony_ci 256e5c31af7Sopenharmony_ci 257e5c31af7Sopenharmony_ci fragmentShaderSource << "layout (location = 0) out mediump " << outtype << " o_color;\n" 258e5c31af7Sopenharmony_ci "void main(void)\n" 259e5c31af7Sopenharmony_ci "{\n" 260e5c31af7Sopenharmony_ci "\to_color = " << outtype << "(v_color);\n" 261e5c31af7Sopenharmony_ci "}"; 262e5c31af7Sopenharmony_ci 263e5c31af7Sopenharmony_ci m_program = new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource.str())); 264e5c31af7Sopenharmony_ci 265e5c31af7Sopenharmony_ci if (!m_program->isOk()) 266e5c31af7Sopenharmony_ci { 267e5c31af7Sopenharmony_ci m_log << *m_program; 268e5c31af7Sopenharmony_ci TCU_FAIL("Failed to compile shader"); 269e5c31af7Sopenharmony_ci } 270e5c31af7Sopenharmony_ci} 271e5c31af7Sopenharmony_ci 272e5c31af7Sopenharmony_civoid ReadPixelsTest::deinit (void) 273e5c31af7Sopenharmony_ci{ 274e5c31af7Sopenharmony_ci if (m_program) 275e5c31af7Sopenharmony_ci delete m_program; 276e5c31af7Sopenharmony_ci m_program = NULL; 277e5c31af7Sopenharmony_ci} 278e5c31af7Sopenharmony_ci 279e5c31af7Sopenharmony_civoid ReadPixelsTest::renderTriangle (const tcu::Vec3& a, const tcu::Vec3& b, const tcu::Vec3& c) 280e5c31af7Sopenharmony_ci{ 281e5c31af7Sopenharmony_ci float positions[3*3]; 282e5c31af7Sopenharmony_ci 283e5c31af7Sopenharmony_ci positions[0] = a.x(); 284e5c31af7Sopenharmony_ci positions[1] = a.y(); 285e5c31af7Sopenharmony_ci positions[2] = a.z(); 286e5c31af7Sopenharmony_ci 287e5c31af7Sopenharmony_ci positions[3] = b.x(); 288e5c31af7Sopenharmony_ci positions[4] = b.y(); 289e5c31af7Sopenharmony_ci positions[5] = b.z(); 290e5c31af7Sopenharmony_ci 291e5c31af7Sopenharmony_ci positions[6] = c.x(); 292e5c31af7Sopenharmony_ci positions[7] = c.y(); 293e5c31af7Sopenharmony_ci positions[8] = c.z(); 294e5c31af7Sopenharmony_ci 295e5c31af7Sopenharmony_ci float colors[] = { 296e5c31af7Sopenharmony_ci 1.0f, 0.0f, 0.0f, 1.0f, 297e5c31af7Sopenharmony_ci 0.0f, 1.0f, 0.0f, 1.0f, 298e5c31af7Sopenharmony_ci 0.0f, 0.0f, 1.0f, 1.0f 299e5c31af7Sopenharmony_ci }; 300e5c31af7Sopenharmony_ci 301e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glUseProgram(m_program->getProgram())); 302e5c31af7Sopenharmony_ci 303e5c31af7Sopenharmony_ci GLuint coordLoc = (GLuint)-1; 304e5c31af7Sopenharmony_ci GLuint colorLoc = (GLuint)-1; 305e5c31af7Sopenharmony_ci GLuint colorScaleLoc = (GLuint)-1; 306e5c31af7Sopenharmony_ci 307e5c31af7Sopenharmony_ci colorScaleLoc = glGetUniformLocation(m_program->getProgram(), "u_colorScale"); 308e5c31af7Sopenharmony_ci TCU_CHECK(colorScaleLoc != (GLuint)-1); 309e5c31af7Sopenharmony_ci 310e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glUniform1f(colorScaleLoc, m_colorScale)); 311e5c31af7Sopenharmony_ci 312e5c31af7Sopenharmony_ci coordLoc = glGetAttribLocation(m_program->getProgram(), "a_position"); 313e5c31af7Sopenharmony_ci TCU_CHECK(coordLoc != (GLuint)-1); 314e5c31af7Sopenharmony_ci 315e5c31af7Sopenharmony_ci colorLoc = glGetAttribLocation(m_program->getProgram(), "a_color"); 316e5c31af7Sopenharmony_ci TCU_CHECK(colorLoc != (GLuint)-1); 317e5c31af7Sopenharmony_ci 318e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glEnableVertexAttribArray(colorLoc)); 319e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glEnableVertexAttribArray(coordLoc)); 320e5c31af7Sopenharmony_ci 321e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glVertexAttribPointer(coordLoc, 3, GL_FLOAT, GL_FALSE, 0, positions)); 322e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glVertexAttribPointer(colorLoc, 4, GL_FLOAT, GL_FALSE, 0, colors)); 323e5c31af7Sopenharmony_ci 324e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glDrawArrays(GL_TRIANGLES, 0, 3)); 325e5c31af7Sopenharmony_ci 326e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glDisableVertexAttribArray(colorLoc)); 327e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glDisableVertexAttribArray(coordLoc)); 328e5c31af7Sopenharmony_ci 329e5c31af7Sopenharmony_ci} 330e5c31af7Sopenharmony_ci 331e5c31af7Sopenharmony_ci 332e5c31af7Sopenharmony_civoid ReadPixelsTest::clearColor (float r, float g, float b, float a) 333e5c31af7Sopenharmony_ci{ 334e5c31af7Sopenharmony_ci if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_NATIVE) 335e5c31af7Sopenharmony_ci { 336e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glClearColor(r, g, b, a)); 337e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT)); 338e5c31af7Sopenharmony_ci } 339e5c31af7Sopenharmony_ci else if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER) 340e5c31af7Sopenharmony_ci { 341e5c31af7Sopenharmony_ci switch (m_texChannelClass) 342e5c31af7Sopenharmony_ci { 343e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 344e5c31af7Sopenharmony_ci { 345e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glClearColor(r, g, b, a)); 346e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT)); 347e5c31af7Sopenharmony_ci break; 348e5c31af7Sopenharmony_ci } 349e5c31af7Sopenharmony_ci 350e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 351e5c31af7Sopenharmony_ci { 352e5c31af7Sopenharmony_ci GLint color[4] = { (GLint)r, (GLint)g, (GLint)b, (GLint)a }; 353e5c31af7Sopenharmony_ci 354e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glClearBufferiv(GL_COLOR, 0, color)); 355e5c31af7Sopenharmony_ci break; 356e5c31af7Sopenharmony_ci } 357e5c31af7Sopenharmony_ci 358e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 359e5c31af7Sopenharmony_ci { 360e5c31af7Sopenharmony_ci GLuint color[4] = { (GLuint)r, (GLuint)g, (GLuint)b, (GLuint)a }; 361e5c31af7Sopenharmony_ci 362e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glClearBufferuiv(GL_COLOR, 0, color)); 363e5c31af7Sopenharmony_ci break; 364e5c31af7Sopenharmony_ci } 365e5c31af7Sopenharmony_ci 366e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 367e5c31af7Sopenharmony_ci { 368e5c31af7Sopenharmony_ci GLfloat color[4] = { (GLfloat)r, (GLfloat)g, (GLfloat)b, (GLfloat)a }; 369e5c31af7Sopenharmony_ci 370e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glClearBufferfv(GL_COLOR, 0, color)); 371e5c31af7Sopenharmony_ci break; 372e5c31af7Sopenharmony_ci } 373e5c31af7Sopenharmony_ci 374e5c31af7Sopenharmony_ci default: 375e5c31af7Sopenharmony_ci DE_ASSERT(false); 376e5c31af7Sopenharmony_ci } 377e5c31af7Sopenharmony_ci } 378e5c31af7Sopenharmony_ci else 379e5c31af7Sopenharmony_ci DE_ASSERT(false); 380e5c31af7Sopenharmony_ci 381e5c31af7Sopenharmony_ci} 382e5c31af7Sopenharmony_ci 383e5c31af7Sopenharmony_ciTestCase::IterateResult ReadPixelsTest::iterate(void) 384e5c31af7Sopenharmony_ci{ 385e5c31af7Sopenharmony_ci int width = m_context.getRenderTarget().getWidth(); 386e5c31af7Sopenharmony_ci int height = m_context.getRenderTarget().getHeight(); 387e5c31af7Sopenharmony_ci 388e5c31af7Sopenharmony_ci GLuint framebuffer = 0; 389e5c31af7Sopenharmony_ci GLuint renderbuffer = 0; 390e5c31af7Sopenharmony_ci 391e5c31af7Sopenharmony_ci switch (m_framebuffeType) 392e5c31af7Sopenharmony_ci { 393e5c31af7Sopenharmony_ci case TestSpec::FRAMEBUFFERTYPE_NATIVE: 394e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glBindFramebuffer(GL_FRAMEBUFFER, framebuffer)); 395e5c31af7Sopenharmony_ci break; 396e5c31af7Sopenharmony_ci 397e5c31af7Sopenharmony_ci case TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER: 398e5c31af7Sopenharmony_ci { 399e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glGenFramebuffers(1, &framebuffer)); 400e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glGenRenderbuffers(1, &renderbuffer)); 401e5c31af7Sopenharmony_ci 402e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer)); 403e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glRenderbufferStorage(GL_RENDERBUFFER, m_renderbufferFormat, width, height)); 404e5c31af7Sopenharmony_ci 405e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glBindFramebuffer(GL_FRAMEBUFFER, framebuffer)); 406e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer)); 407e5c31af7Sopenharmony_ci 408e5c31af7Sopenharmony_ci break; 409e5c31af7Sopenharmony_ci } 410e5c31af7Sopenharmony_ci 411e5c31af7Sopenharmony_ci default: 412e5c31af7Sopenharmony_ci DE_ASSERT(false); 413e5c31af7Sopenharmony_ci } 414e5c31af7Sopenharmony_ci 415e5c31af7Sopenharmony_ci clearColor(m_colorScale * 0.4f, m_colorScale * 1.0f, m_colorScale * 0.5f, m_colorScale * 1.0f); 416e5c31af7Sopenharmony_ci 417e5c31af7Sopenharmony_ci if (m_useColorClears) 418e5c31af7Sopenharmony_ci { 419e5c31af7Sopenharmony_ci const int maxClearCount = 10; 420e5c31af7Sopenharmony_ci const int minClearCount = 6; 421e5c31af7Sopenharmony_ci const int minClearSize = 15; 422e5c31af7Sopenharmony_ci 423e5c31af7Sopenharmony_ci int clearCount = m_random.getInt(minClearCount, maxClearCount); 424e5c31af7Sopenharmony_ci 425e5c31af7Sopenharmony_ci for (int clearNdx = 0; clearNdx < clearCount; clearNdx++) 426e5c31af7Sopenharmony_ci { 427e5c31af7Sopenharmony_ci int clearX = m_random.getInt(0, width - minClearSize); 428e5c31af7Sopenharmony_ci int clearY = m_random.getInt(0, height - minClearSize); 429e5c31af7Sopenharmony_ci 430e5c31af7Sopenharmony_ci int clearWidth = m_random.getInt(minClearSize, width - clearX); 431e5c31af7Sopenharmony_ci int clearHeight = m_random.getInt(minClearSize, height - clearY); 432e5c31af7Sopenharmony_ci 433e5c31af7Sopenharmony_ci float clearRed = m_colorScale * m_random.getFloat(); 434e5c31af7Sopenharmony_ci float clearGreen = m_colorScale * m_random.getFloat(); 435e5c31af7Sopenharmony_ci float clearBlue = m_colorScale * m_random.getFloat(); 436e5c31af7Sopenharmony_ci float clearAlpha = m_colorScale * (0.5f + 0.5f * m_random.getFloat()); 437e5c31af7Sopenharmony_ci 438e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glEnable(GL_SCISSOR_TEST)); 439e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glScissor(clearX, clearY, clearWidth, clearHeight)); 440e5c31af7Sopenharmony_ci 441e5c31af7Sopenharmony_ci clearColor(clearRed, clearGreen, clearBlue, clearAlpha); 442e5c31af7Sopenharmony_ci } 443e5c31af7Sopenharmony_ci 444e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glDisable(GL_SCISSOR_TEST)); 445e5c31af7Sopenharmony_ci } 446e5c31af7Sopenharmony_ci 447e5c31af7Sopenharmony_ci if (m_renderTriangles) 448e5c31af7Sopenharmony_ci { 449e5c31af7Sopenharmony_ci const int minTriangleCount = 4; 450e5c31af7Sopenharmony_ci const int maxTriangleCount = 10; 451e5c31af7Sopenharmony_ci 452e5c31af7Sopenharmony_ci int triangleCount = m_random.getInt(minTriangleCount, maxTriangleCount); 453e5c31af7Sopenharmony_ci 454e5c31af7Sopenharmony_ci for (int triangleNdx = 0; triangleNdx < triangleCount; triangleNdx++) 455e5c31af7Sopenharmony_ci { 456e5c31af7Sopenharmony_ci float x1 = 2.0f * m_random.getFloat() - 1.0f; 457e5c31af7Sopenharmony_ci float y1 = 2.0f * m_random.getFloat() - 1.0f; 458e5c31af7Sopenharmony_ci float z1 = 2.0f * m_random.getFloat() - 1.0f; 459e5c31af7Sopenharmony_ci 460e5c31af7Sopenharmony_ci float x2 = 2.0f * m_random.getFloat() - 1.0f; 461e5c31af7Sopenharmony_ci float y2 = 2.0f * m_random.getFloat() - 1.0f; 462e5c31af7Sopenharmony_ci float z2 = 2.0f * m_random.getFloat() - 1.0f; 463e5c31af7Sopenharmony_ci 464e5c31af7Sopenharmony_ci float x3 = 2.0f * m_random.getFloat() - 1.0f; 465e5c31af7Sopenharmony_ci float y3 = 2.0f * m_random.getFloat() - 1.0f; 466e5c31af7Sopenharmony_ci float z3 = 2.0f * m_random.getFloat() - 1.0f; 467e5c31af7Sopenharmony_ci 468e5c31af7Sopenharmony_ci renderTriangle(tcu::Vec3(x1, y1, z1), tcu::Vec3(x2, y2, z2), tcu::Vec3(x3, y3, z3)); 469e5c31af7Sopenharmony_ci } 470e5c31af7Sopenharmony_ci } 471e5c31af7Sopenharmony_ci 472e5c31af7Sopenharmony_ci tcu::TextureFormat readFormat; 473e5c31af7Sopenharmony_ci GLenum readPixelsFormat; 474e5c31af7Sopenharmony_ci GLenum readPixelsType; 475e5c31af7Sopenharmony_ci bool floatCompare; 476e5c31af7Sopenharmony_ci 477e5c31af7Sopenharmony_ci 478e5c31af7Sopenharmony_ci if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_NATIVE) 479e5c31af7Sopenharmony_ci { 480e5c31af7Sopenharmony_ci readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_UNSIGNED_BYTE); 481e5c31af7Sopenharmony_ci readPixelsFormat = GL_RGBA; 482e5c31af7Sopenharmony_ci readPixelsType = GL_UNSIGNED_BYTE; 483e5c31af7Sopenharmony_ci floatCompare = false; 484e5c31af7Sopenharmony_ci } 485e5c31af7Sopenharmony_ci else if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER) 486e5c31af7Sopenharmony_ci { 487e5c31af7Sopenharmony_ci switch (m_texChannelClass) 488e5c31af7Sopenharmony_ci { 489e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 490e5c31af7Sopenharmony_ci readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_UNSIGNED_BYTE); 491e5c31af7Sopenharmony_ci readPixelsFormat = GL_RGBA; 492e5c31af7Sopenharmony_ci readPixelsType = GL_UNSIGNED_BYTE; 493e5c31af7Sopenharmony_ci floatCompare = true; 494e5c31af7Sopenharmony_ci break; 495e5c31af7Sopenharmony_ci 496e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 497e5c31af7Sopenharmony_ci readFormat = glu::mapGLTransferFormat(GL_RGBA_INTEGER, GL_INT); 498e5c31af7Sopenharmony_ci readPixelsFormat = GL_RGBA_INTEGER; 499e5c31af7Sopenharmony_ci readPixelsType = GL_INT; 500e5c31af7Sopenharmony_ci floatCompare = false; 501e5c31af7Sopenharmony_ci break; 502e5c31af7Sopenharmony_ci 503e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 504e5c31af7Sopenharmony_ci readFormat = glu::mapGLTransferFormat(GL_RGBA_INTEGER, GL_UNSIGNED_INT); 505e5c31af7Sopenharmony_ci readPixelsFormat = GL_RGBA_INTEGER; 506e5c31af7Sopenharmony_ci readPixelsType = GL_UNSIGNED_INT; 507e5c31af7Sopenharmony_ci floatCompare = false; 508e5c31af7Sopenharmony_ci break; 509e5c31af7Sopenharmony_ci 510e5c31af7Sopenharmony_ci case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 511e5c31af7Sopenharmony_ci readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_FLOAT); 512e5c31af7Sopenharmony_ci readPixelsFormat = GL_RGBA; 513e5c31af7Sopenharmony_ci readPixelsType = GL_FLOAT; 514e5c31af7Sopenharmony_ci floatCompare = true; 515e5c31af7Sopenharmony_ci break; 516e5c31af7Sopenharmony_ci 517e5c31af7Sopenharmony_ci default: 518e5c31af7Sopenharmony_ci DE_ASSERT(false); 519e5c31af7Sopenharmony_ci // Silence warnings 520e5c31af7Sopenharmony_ci readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_FLOAT); 521e5c31af7Sopenharmony_ci readPixelsFormat = GL_RGBA; 522e5c31af7Sopenharmony_ci readPixelsType = GL_FLOAT; 523e5c31af7Sopenharmony_ci floatCompare = true; 524e5c31af7Sopenharmony_ci } 525e5c31af7Sopenharmony_ci } 526e5c31af7Sopenharmony_ci else 527e5c31af7Sopenharmony_ci { 528e5c31af7Sopenharmony_ci // Silence warnings 529e5c31af7Sopenharmony_ci readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_FLOAT); 530e5c31af7Sopenharmony_ci readPixelsFormat = GL_RGBA; 531e5c31af7Sopenharmony_ci readPixelsType = GL_FLOAT; 532e5c31af7Sopenharmony_ci floatCompare = true; 533e5c31af7Sopenharmony_ci DE_ASSERT(false); 534e5c31af7Sopenharmony_ci } 535e5c31af7Sopenharmony_ci 536e5c31af7Sopenharmony_ci tcu::Texture2D readRefrence (readFormat, width, height); 537e5c31af7Sopenharmony_ci const int readDataSize = readRefrence.getWidth() * readRefrence.getHeight() * readFormat.getPixelSize(); 538e5c31af7Sopenharmony_ci 539e5c31af7Sopenharmony_ci readRefrence.allocLevel(0); 540e5c31af7Sopenharmony_ci 541e5c31af7Sopenharmony_ci GLuint pixelBuffer = (GLuint)-1; 542e5c31af7Sopenharmony_ci 543e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glGenBuffers(1, &pixelBuffer)); 544e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelBuffer)); 545e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glBufferData(GL_PIXEL_PACK_BUFFER, readDataSize, NULL, GL_STREAM_READ)); 546e5c31af7Sopenharmony_ci 547e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glReadPixels(0, 0, width, height, readPixelsFormat, readPixelsType, 0)); 548e5c31af7Sopenharmony_ci 549e5c31af7Sopenharmony_ci const deUint8* bufferData = (const deUint8*)glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, readDataSize, GL_MAP_READ_BIT); 550e5c31af7Sopenharmony_ci GLU_CHECK_MSG("glMapBufferRange() failed"); 551e5c31af7Sopenharmony_ci 552e5c31af7Sopenharmony_ci tcu::ConstPixelBufferAccess readResult(readFormat, width, height, 1, bufferData); 553e5c31af7Sopenharmony_ci 554e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0)); 555e5c31af7Sopenharmony_ci 556e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glReadPixels(0, 0, width, height, readPixelsFormat, readPixelsType, readRefrence.getLevel(0).getDataPtr())); 557e5c31af7Sopenharmony_ci 558e5c31af7Sopenharmony_ci if (framebuffer) 559e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glDeleteFramebuffers(1, &framebuffer)); 560e5c31af7Sopenharmony_ci 561e5c31af7Sopenharmony_ci if (renderbuffer) 562e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glDeleteRenderbuffers(1, &renderbuffer)); 563e5c31af7Sopenharmony_ci 564e5c31af7Sopenharmony_ci 565e5c31af7Sopenharmony_ci bool isOk = false; 566e5c31af7Sopenharmony_ci 567e5c31af7Sopenharmony_ci if (floatCompare) 568e5c31af7Sopenharmony_ci { 569e5c31af7Sopenharmony_ci const tcu::IVec4 formatBitDepths = tcu::getTextureFormatBitDepth(readFormat); 570e5c31af7Sopenharmony_ci const float redThreshold = 2.0f / (float)(1 << deMin32(m_context.getRenderTarget().getPixelFormat().redBits, formatBitDepths.x())); 571e5c31af7Sopenharmony_ci const float greenThreshold = 2.0f / (float)(1 << deMin32(m_context.getRenderTarget().getPixelFormat().greenBits, formatBitDepths.y())); 572e5c31af7Sopenharmony_ci const float blueThreshold = 2.0f / (float)(1 << deMin32(m_context.getRenderTarget().getPixelFormat().blueBits, formatBitDepths.z())); 573e5c31af7Sopenharmony_ci const float alphaThreshold = 2.0f / (float)(1 << deMin32(m_context.getRenderTarget().getPixelFormat().alphaBits, formatBitDepths.w())); 574e5c31af7Sopenharmony_ci 575e5c31af7Sopenharmony_ci isOk = tcu::floatThresholdCompare(m_log, "Result comparision", "Result of read pixels to memory compared with result of read pixels to buffer", readRefrence.getLevel(0), readResult, tcu::Vec4(redThreshold, greenThreshold, blueThreshold, alphaThreshold), tcu::COMPARE_LOG_RESULT); 576e5c31af7Sopenharmony_ci } 577e5c31af7Sopenharmony_ci else 578e5c31af7Sopenharmony_ci { 579e5c31af7Sopenharmony_ci isOk = tcu::intThresholdCompare(m_log, "Result comparision", "Result of read pixels to memory compared with result of read pixels to buffer", readRefrence.getLevel(0), readResult, tcu::UVec4(0, 0, 0, 0), tcu::COMPARE_LOG_RESULT); 580e5c31af7Sopenharmony_ci } 581e5c31af7Sopenharmony_ci 582e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelBuffer)); 583e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glUnmapBuffer(GL_PIXEL_PACK_BUFFER)); 584e5c31af7Sopenharmony_ci GLU_CHECK_CALL(glDeleteBuffers(1, &pixelBuffer)); 585e5c31af7Sopenharmony_ci 586e5c31af7Sopenharmony_ci if (isOk) 587e5c31af7Sopenharmony_ci { 588e5c31af7Sopenharmony_ci m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 589e5c31af7Sopenharmony_ci return STOP; 590e5c31af7Sopenharmony_ci } 591e5c31af7Sopenharmony_ci else 592e5c31af7Sopenharmony_ci { 593e5c31af7Sopenharmony_ci m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 594e5c31af7Sopenharmony_ci return STOP; 595e5c31af7Sopenharmony_ci } 596e5c31af7Sopenharmony_ci} 597e5c31af7Sopenharmony_ci 598e5c31af7Sopenharmony_ci} // anonymous 599e5c31af7Sopenharmony_ci 600e5c31af7Sopenharmony_ciPixelBufferObjectTests::PixelBufferObjectTests (Context& context) 601e5c31af7Sopenharmony_ci : TestCaseGroup (context, "pbo", "Pixel buffer objects tests") 602e5c31af7Sopenharmony_ci{ 603e5c31af7Sopenharmony_ci} 604e5c31af7Sopenharmony_ci 605e5c31af7Sopenharmony_ciPixelBufferObjectTests::~PixelBufferObjectTests (void) 606e5c31af7Sopenharmony_ci{ 607e5c31af7Sopenharmony_ci} 608e5c31af7Sopenharmony_ci 609e5c31af7Sopenharmony_civoid PixelBufferObjectTests::init (void) 610e5c31af7Sopenharmony_ci{ 611e5c31af7Sopenharmony_ci TestCaseGroup* nativeFramebufferGroup = new TestCaseGroup(m_context, "native", "Tests with reading from native framebuffer"); 612e5c31af7Sopenharmony_ci 613e5c31af7Sopenharmony_ci ReadPixelsTest::TestSpec nativeFramebufferTests[] = { 614e5c31af7Sopenharmony_ci { 615e5c31af7Sopenharmony_ci "clears", 616e5c31af7Sopenharmony_ci "Simple read pixels test with color clears", 617e5c31af7Sopenharmony_ci true, 618e5c31af7Sopenharmony_ci false, 619e5c31af7Sopenharmony_ci ReadPixelsTest::TestSpec::FRAMEBUFFERTYPE_NATIVE, 620e5c31af7Sopenharmony_ci GL_NONE 621e5c31af7Sopenharmony_ci }, 622e5c31af7Sopenharmony_ci { 623e5c31af7Sopenharmony_ci "triangles", 624e5c31af7Sopenharmony_ci "Simple read pixels test rendering triangles", 625e5c31af7Sopenharmony_ci false, 626e5c31af7Sopenharmony_ci true, 627e5c31af7Sopenharmony_ci ReadPixelsTest::TestSpec::FRAMEBUFFERTYPE_NATIVE, 628e5c31af7Sopenharmony_ci GL_NONE 629e5c31af7Sopenharmony_ci } 630e5c31af7Sopenharmony_ci }; 631e5c31af7Sopenharmony_ci 632e5c31af7Sopenharmony_ci for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(nativeFramebufferTests); testNdx++) 633e5c31af7Sopenharmony_ci { 634e5c31af7Sopenharmony_ci nativeFramebufferGroup->addChild(new ReadPixelsTest(m_context, nativeFramebufferTests[testNdx])); 635e5c31af7Sopenharmony_ci } 636e5c31af7Sopenharmony_ci 637e5c31af7Sopenharmony_ci addChild(nativeFramebufferGroup); 638e5c31af7Sopenharmony_ci 639e5c31af7Sopenharmony_ci TestCaseGroup* renderbufferGroup = new TestCaseGroup(m_context, "renderbuffer", "Tests with reading from renderbuffer"); 640e5c31af7Sopenharmony_ci 641e5c31af7Sopenharmony_ci GLenum renderbufferFormats[] = { 642e5c31af7Sopenharmony_ci GL_RGBA8, 643e5c31af7Sopenharmony_ci GL_RGBA8I, 644e5c31af7Sopenharmony_ci GL_RGBA8UI, 645e5c31af7Sopenharmony_ci GL_RGBA16F, 646e5c31af7Sopenharmony_ci GL_RGBA16I, 647e5c31af7Sopenharmony_ci GL_RGBA16UI, 648e5c31af7Sopenharmony_ci GL_RGBA32F, 649e5c31af7Sopenharmony_ci GL_RGBA32I, 650e5c31af7Sopenharmony_ci GL_RGBA32UI, 651e5c31af7Sopenharmony_ci 652e5c31af7Sopenharmony_ci GL_SRGB8_ALPHA8, 653e5c31af7Sopenharmony_ci GL_RGB10_A2, 654e5c31af7Sopenharmony_ci GL_RGB10_A2UI, 655e5c31af7Sopenharmony_ci GL_RGBA4, 656e5c31af7Sopenharmony_ci GL_RGB5_A1, 657e5c31af7Sopenharmony_ci 658e5c31af7Sopenharmony_ci GL_RGB8, 659e5c31af7Sopenharmony_ci GL_RGB565, 660e5c31af7Sopenharmony_ci 661e5c31af7Sopenharmony_ci GL_R11F_G11F_B10F, 662e5c31af7Sopenharmony_ci 663e5c31af7Sopenharmony_ci GL_RG8, 664e5c31af7Sopenharmony_ci GL_RG8I, 665e5c31af7Sopenharmony_ci GL_RG8UI, 666e5c31af7Sopenharmony_ci GL_RG16F, 667e5c31af7Sopenharmony_ci GL_RG16I, 668e5c31af7Sopenharmony_ci GL_RG16UI, 669e5c31af7Sopenharmony_ci GL_RG32F, 670e5c31af7Sopenharmony_ci GL_RG32I, 671e5c31af7Sopenharmony_ci GL_RG32UI 672e5c31af7Sopenharmony_ci }; 673e5c31af7Sopenharmony_ci 674e5c31af7Sopenharmony_ci const char* renderbufferFormatsStr[] = { 675e5c31af7Sopenharmony_ci "rgba8", 676e5c31af7Sopenharmony_ci "rgba8i", 677e5c31af7Sopenharmony_ci "rgba8ui", 678e5c31af7Sopenharmony_ci "rgba16f", 679e5c31af7Sopenharmony_ci "rgba16i", 680e5c31af7Sopenharmony_ci "rgba16ui", 681e5c31af7Sopenharmony_ci "rgba32f", 682e5c31af7Sopenharmony_ci "rgba32i", 683e5c31af7Sopenharmony_ci "rgba32ui", 684e5c31af7Sopenharmony_ci 685e5c31af7Sopenharmony_ci "srgb8_alpha8", 686e5c31af7Sopenharmony_ci "rgb10_a2", 687e5c31af7Sopenharmony_ci "rgb10_a2ui", 688e5c31af7Sopenharmony_ci "rgba4", 689e5c31af7Sopenharmony_ci "rgb5_a1", 690e5c31af7Sopenharmony_ci 691e5c31af7Sopenharmony_ci "rgb8", 692e5c31af7Sopenharmony_ci "rgb565", 693e5c31af7Sopenharmony_ci 694e5c31af7Sopenharmony_ci "r11f_g11f_b10f", 695e5c31af7Sopenharmony_ci 696e5c31af7Sopenharmony_ci "rg8", 697e5c31af7Sopenharmony_ci "rg8i", 698e5c31af7Sopenharmony_ci "rg8ui", 699e5c31af7Sopenharmony_ci "rg16f", 700e5c31af7Sopenharmony_ci "rg16i", 701e5c31af7Sopenharmony_ci "rg16ui", 702e5c31af7Sopenharmony_ci "rg32f", 703e5c31af7Sopenharmony_ci "rg32i", 704e5c31af7Sopenharmony_ci "rg32ui" 705e5c31af7Sopenharmony_ci }; 706e5c31af7Sopenharmony_ci 707e5c31af7Sopenharmony_ci DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(renderbufferFormatsStr) == DE_LENGTH_OF_ARRAY(renderbufferFormats)); 708e5c31af7Sopenharmony_ci 709e5c31af7Sopenharmony_ci for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(renderbufferFormats); formatNdx++) 710e5c31af7Sopenharmony_ci { 711e5c31af7Sopenharmony_ci for (int trianglesClears = 0; trianglesClears < 2; trianglesClears++) 712e5c31af7Sopenharmony_ci { 713e5c31af7Sopenharmony_ci ReadPixelsTest::TestSpec testSpec; 714e5c31af7Sopenharmony_ci 715e5c31af7Sopenharmony_ci testSpec.name = string(renderbufferFormatsStr [formatNdx]) + "_" + (trianglesClears == 0 ? "triangles" : "clears"); 716e5c31af7Sopenharmony_ci testSpec.description = testSpec.name; 717e5c31af7Sopenharmony_ci testSpec.useColorClear = trianglesClears == 1; 718e5c31af7Sopenharmony_ci testSpec.renderTriangles = trianglesClears == 0; 719e5c31af7Sopenharmony_ci testSpec.framebufferType = ReadPixelsTest::TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER; 720e5c31af7Sopenharmony_ci testSpec.renderbufferFormat = renderbufferFormats[formatNdx]; 721e5c31af7Sopenharmony_ci 722e5c31af7Sopenharmony_ci renderbufferGroup->addChild(new ReadPixelsTest(m_context, testSpec)); 723e5c31af7Sopenharmony_ci } 724e5c31af7Sopenharmony_ci } 725e5c31af7Sopenharmony_ci 726e5c31af7Sopenharmony_ci addChild(renderbufferGroup); 727e5c31af7Sopenharmony_ci} 728e5c31af7Sopenharmony_ci 729e5c31af7Sopenharmony_ci} // Functional 730e5c31af7Sopenharmony_ci} // gles3 731e5c31af7Sopenharmony_ci} // deqp 732