1e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 2e5c31af7Sopenharmony_ci * OpenGL Conformance Test Suite 3e5c31af7Sopenharmony_ci * ----------------------------- 4e5c31af7Sopenharmony_ci * 5e5c31af7Sopenharmony_ci * Copyright (c) 2014-2016 The Khronos Group Inc. 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 22e5c31af7Sopenharmony_ci */ /*-------------------------------------------------------------------*/ 23e5c31af7Sopenharmony_ci 24e5c31af7Sopenharmony_ci#include "esextcGeometryShaderLayeredRenderingBoundaryCondition.hpp" 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "gluDefs.hpp" 27e5c31af7Sopenharmony_ci#include "glwEnums.hpp" 28e5c31af7Sopenharmony_ci#include "glwFunctions.hpp" 29e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp" 30e5c31af7Sopenharmony_ci#include <cstring> 31e5c31af7Sopenharmony_ci#include <sstream> 32e5c31af7Sopenharmony_ci#include <string> 33e5c31af7Sopenharmony_ci 34e5c31af7Sopenharmony_cinamespace glcts 35e5c31af7Sopenharmony_ci{ 36e5c31af7Sopenharmony_ci/* Configure constant values */ 37e5c31af7Sopenharmony_ciconst glw::GLint GeometryShaderLayeredRenderingBoundaryCondition::m_width = 4; 38e5c31af7Sopenharmony_ciconst glw::GLint GeometryShaderLayeredRenderingBoundaryCondition::m_height = 4; 39e5c31af7Sopenharmony_ciconst glw::GLint GeometryShaderLayeredRenderingBoundaryCondition::m_max_depth = 4; 40e5c31af7Sopenharmony_ciconst glw::GLint GeometryShaderLayeredRenderingBoundaryCondition::m_texture_components = 4; 41e5c31af7Sopenharmony_ci 42e5c31af7Sopenharmony_ci/** Constructor 43e5c31af7Sopenharmony_ci * 44e5c31af7Sopenharmony_ci * @param context Test context 45e5c31af7Sopenharmony_ci * @param name Test case's name 46e5c31af7Sopenharmony_ci * @param description Test case's desricption 47e5c31af7Sopenharmony_ci **/ 48e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryCondition::GeometryShaderLayeredRenderingBoundaryCondition( 49e5c31af7Sopenharmony_ci Context& context, const ExtParameters& extParams, const char* name, const char* description) 50e5c31af7Sopenharmony_ci : TestCaseBase(context, extParams, name, description) 51e5c31af7Sopenharmony_ci , m_draw_mode(GL_TEXTURE_3D) 52e5c31af7Sopenharmony_ci , m_n_points(0) 53e5c31af7Sopenharmony_ci , m_is_fbo_layered(false) 54e5c31af7Sopenharmony_ci , m_fbo_draw_id(0) 55e5c31af7Sopenharmony_ci , m_fbo_read_id(0) 56e5c31af7Sopenharmony_ci , m_fs_id(0) 57e5c31af7Sopenharmony_ci , m_gs_id(0) 58e5c31af7Sopenharmony_ci , m_po_id(0) 59e5c31af7Sopenharmony_ci , m_vao_id(0) 60e5c31af7Sopenharmony_ci , m_vs_id(0) 61e5c31af7Sopenharmony_ci{ 62e5c31af7Sopenharmony_ci unsigned char blue[] = { 0, 0, 255, 255 }; 63e5c31af7Sopenharmony_ci unsigned char green[] = { 0, 255, 0, 255 }; 64e5c31af7Sopenharmony_ci unsigned char red[] = { 255, 0, 0, 255 }; 65e5c31af7Sopenharmony_ci unsigned char white[] = { 255, 255, 255, 255 }; 66e5c31af7Sopenharmony_ci 67e5c31af7Sopenharmony_ci m_blue_color = new unsigned char[m_texture_components]; 68e5c31af7Sopenharmony_ci m_green_color = new unsigned char[m_texture_components]; 69e5c31af7Sopenharmony_ci m_red_color = new unsigned char[m_texture_components]; 70e5c31af7Sopenharmony_ci m_white_color = new unsigned char[m_texture_components]; 71e5c31af7Sopenharmony_ci 72e5c31af7Sopenharmony_ci memcpy(m_blue_color, blue, sizeof(blue)); 73e5c31af7Sopenharmony_ci memcpy(m_green_color, green, sizeof(green)); 74e5c31af7Sopenharmony_ci memcpy(m_red_color, red, sizeof(red)); 75e5c31af7Sopenharmony_ci memcpy(m_white_color, white, sizeof(white)); 76e5c31af7Sopenharmony_ci} 77e5c31af7Sopenharmony_ci 78e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryCondition::~GeometryShaderLayeredRenderingBoundaryCondition(void) 79e5c31af7Sopenharmony_ci{ 80e5c31af7Sopenharmony_ci if (m_blue_color) 81e5c31af7Sopenharmony_ci { 82e5c31af7Sopenharmony_ci delete[] m_blue_color; 83e5c31af7Sopenharmony_ci m_blue_color = 0; 84e5c31af7Sopenharmony_ci } 85e5c31af7Sopenharmony_ci 86e5c31af7Sopenharmony_ci if (m_green_color) 87e5c31af7Sopenharmony_ci { 88e5c31af7Sopenharmony_ci delete[] m_green_color; 89e5c31af7Sopenharmony_ci m_green_color = 0; 90e5c31af7Sopenharmony_ci } 91e5c31af7Sopenharmony_ci 92e5c31af7Sopenharmony_ci if (m_red_color) 93e5c31af7Sopenharmony_ci { 94e5c31af7Sopenharmony_ci delete[] m_red_color; 95e5c31af7Sopenharmony_ci m_red_color = 0; 96e5c31af7Sopenharmony_ci } 97e5c31af7Sopenharmony_ci if (m_white_color) 98e5c31af7Sopenharmony_ci { 99e5c31af7Sopenharmony_ci delete[] m_white_color; 100e5c31af7Sopenharmony_ci m_white_color = 0; 101e5c31af7Sopenharmony_ci } 102e5c31af7Sopenharmony_ci} 103e5c31af7Sopenharmony_ci 104e5c31af7Sopenharmony_ci/** Check if given data contains the same values as reference pixel 105e5c31af7Sopenharmony_ci * 106e5c31af7Sopenharmony_ci * @param width Texture width 107e5c31af7Sopenharmony_ci * @param height Texture height 108e5c31af7Sopenharmony_ci * @param pixelSize Size of pixel 109e5c31af7Sopenharmony_ci * @param textureData buffer with data read from texture 110e5c31af7Sopenharmony_ci * @param referencePixel contains expected color value 111e5c31af7Sopenharmony_ci * @param attachment Attachment number (written to log on failure) 112e5c31af7Sopenharmony_ci * @param layer Layer number (written to log on failure) 113e5c31af7Sopenharmony_ci * 114e5c31af7Sopenharmony_ci * @return true If all data in scope from textureData contains the same color as in referencePixel 115e5c31af7Sopenharmony_ci * false in other case 116e5c31af7Sopenharmony_ci **/ 117e5c31af7Sopenharmony_cibool GeometryShaderLayeredRenderingBoundaryCondition::comparePixels(glw::GLint width, glw::GLint height, 118e5c31af7Sopenharmony_ci glw::GLint pixelSize, 119e5c31af7Sopenharmony_ci const unsigned char* textureData, 120e5c31af7Sopenharmony_ci const unsigned char* referencePixel, int attachment, 121e5c31af7Sopenharmony_ci int layer) 122e5c31af7Sopenharmony_ci{ 123e5c31af7Sopenharmony_ci unsigned int rowWidth = pixelSize * width; 124e5c31af7Sopenharmony_ci 125e5c31af7Sopenharmony_ci for (int y = 0; y < height; ++y) 126e5c31af7Sopenharmony_ci { 127e5c31af7Sopenharmony_ci for (int x = 0; x < width; ++x) 128e5c31af7Sopenharmony_ci { 129e5c31af7Sopenharmony_ci const unsigned char* renderedData = textureData + y * rowWidth + x * m_texture_components; 130e5c31af7Sopenharmony_ci 131e5c31af7Sopenharmony_ci if (memcmp(referencePixel, renderedData, m_texture_components) != 0) 132e5c31af7Sopenharmony_ci { 133e5c31af7Sopenharmony_ci m_testCtx.getLog() << tcu::TestLog::Message << "Rendered data for [x=" << x << " y=" << y 134e5c31af7Sopenharmony_ci << " attachment=" << attachment << " layer=" << layer << "] " 135e5c31af7Sopenharmony_ci << "[" << (int)renderedData[0] << ", " << (int)renderedData[1] << ", " 136e5c31af7Sopenharmony_ci << (int)renderedData[2] << ", " << (int)renderedData[3] << "]" 137e5c31af7Sopenharmony_ci << " are different from reference data [" << (int)referencePixel[0] << ", " 138e5c31af7Sopenharmony_ci << (int)referencePixel[1] << ", " << (int)referencePixel[2] << ", " 139e5c31af7Sopenharmony_ci << (int)referencePixel[3] << "] !" << tcu::TestLog::EndMessage; 140e5c31af7Sopenharmony_ci return false; 141e5c31af7Sopenharmony_ci } /* if (data comparison failed) */ 142e5c31af7Sopenharmony_ci } /* for (all columns) */ 143e5c31af7Sopenharmony_ci } /* for (all rows) */ 144e5c31af7Sopenharmony_ci return true; 145e5c31af7Sopenharmony_ci} 146e5c31af7Sopenharmony_ci 147e5c31af7Sopenharmony_ci/** Deinitializes GLES objects created during the test. 148e5c31af7Sopenharmony_ci * 149e5c31af7Sopenharmony_ci */ 150e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryCondition::deinit(void) 151e5c31af7Sopenharmony_ci{ 152e5c31af7Sopenharmony_ci const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 153e5c31af7Sopenharmony_ci 154e5c31af7Sopenharmony_ci /* Reset OpenGL ES state */ 155e5c31af7Sopenharmony_ci gl.useProgram(0); 156e5c31af7Sopenharmony_ci gl.bindVertexArray(0); 157e5c31af7Sopenharmony_ci gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 158e5c31af7Sopenharmony_ci gl.bindFramebuffer(GL_READ_FRAMEBUFFER, 0); 159e5c31af7Sopenharmony_ci 160e5c31af7Sopenharmony_ci for (unsigned int i = 0; i < m_textures_info.size(); i++) 161e5c31af7Sopenharmony_ci { 162e5c31af7Sopenharmony_ci gl.bindTexture(m_textures_info[i].m_texture_target, 0); 163e5c31af7Sopenharmony_ci } 164e5c31af7Sopenharmony_ci 165e5c31af7Sopenharmony_ci if (m_po_id != 0) 166e5c31af7Sopenharmony_ci { 167e5c31af7Sopenharmony_ci gl.deleteProgram(m_po_id); 168e5c31af7Sopenharmony_ci } 169e5c31af7Sopenharmony_ci 170e5c31af7Sopenharmony_ci if (m_fs_id != 0) 171e5c31af7Sopenharmony_ci { 172e5c31af7Sopenharmony_ci gl.deleteShader(m_fs_id); 173e5c31af7Sopenharmony_ci } 174e5c31af7Sopenharmony_ci 175e5c31af7Sopenharmony_ci if (m_gs_id != 0) 176e5c31af7Sopenharmony_ci { 177e5c31af7Sopenharmony_ci gl.deleteShader(m_gs_id); 178e5c31af7Sopenharmony_ci } 179e5c31af7Sopenharmony_ci 180e5c31af7Sopenharmony_ci if (m_vs_id != 0) 181e5c31af7Sopenharmony_ci { 182e5c31af7Sopenharmony_ci gl.deleteShader(m_vs_id); 183e5c31af7Sopenharmony_ci } 184e5c31af7Sopenharmony_ci 185e5c31af7Sopenharmony_ci for (unsigned int i = 0; i < m_textures_info.size(); i++) 186e5c31af7Sopenharmony_ci { 187e5c31af7Sopenharmony_ci gl.deleteTextures(1, &m_textures_info[i].m_id); 188e5c31af7Sopenharmony_ci } 189e5c31af7Sopenharmony_ci 190e5c31af7Sopenharmony_ci if (m_fbo_read_id != 0) 191e5c31af7Sopenharmony_ci { 192e5c31af7Sopenharmony_ci gl.deleteFramebuffers(1, &m_fbo_read_id); 193e5c31af7Sopenharmony_ci } 194e5c31af7Sopenharmony_ci 195e5c31af7Sopenharmony_ci if (m_fbo_draw_id != 0) 196e5c31af7Sopenharmony_ci { 197e5c31af7Sopenharmony_ci gl.deleteFramebuffers(1, &m_fbo_draw_id); 198e5c31af7Sopenharmony_ci } 199e5c31af7Sopenharmony_ci 200e5c31af7Sopenharmony_ci if (m_vao_id != 0) 201e5c31af7Sopenharmony_ci { 202e5c31af7Sopenharmony_ci gl.deleteVertexArrays(1, &m_vao_id); 203e5c31af7Sopenharmony_ci } 204e5c31af7Sopenharmony_ci 205e5c31af7Sopenharmony_ci /* Release base class */ 206e5c31af7Sopenharmony_ci TestCaseBase::deinit(); 207e5c31af7Sopenharmony_ci} 208e5c31af7Sopenharmony_ci 209e5c31af7Sopenharmony_ci/** Returns code for Geometry Shader. 210e5c31af7Sopenharmony_ci * 211e5c31af7Sopenharmony_ci * @return NULL 212e5c31af7Sopenharmony_ci **/ 213e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryCondition::getGeometryShaderCode() 214e5c31af7Sopenharmony_ci{ 215e5c31af7Sopenharmony_ci return 0; 216e5c31af7Sopenharmony_ci} 217e5c31af7Sopenharmony_ci 218e5c31af7Sopenharmony_ci/** Returns code for Fragment Shader 219e5c31af7Sopenharmony_ci * @return pointer to literal with Fragment Shader code 220e5c31af7Sopenharmony_ci **/ 221e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryCondition::getFragmentShaderCode() 222e5c31af7Sopenharmony_ci{ 223e5c31af7Sopenharmony_ci static const char* result = "${VERSION}\n" 224e5c31af7Sopenharmony_ci "\n" 225e5c31af7Sopenharmony_ci "precision highp float;\n" 226e5c31af7Sopenharmony_ci "\n" 227e5c31af7Sopenharmony_ci "flat in int layer_id;\n" 228e5c31af7Sopenharmony_ci " out vec4 color;\n" 229e5c31af7Sopenharmony_ci "\n" 230e5c31af7Sopenharmony_ci "void main()\n" 231e5c31af7Sopenharmony_ci "{\n" 232e5c31af7Sopenharmony_ci " color = vec4(1, 1, 1, 1);\n" 233e5c31af7Sopenharmony_ci "}\n"; 234e5c31af7Sopenharmony_ci return result; 235e5c31af7Sopenharmony_ci} 236e5c31af7Sopenharmony_ci 237e5c31af7Sopenharmony_ci/** Returns code for Vertex Shader 238e5c31af7Sopenharmony_ci * 239e5c31af7Sopenharmony_ci * @return pointer to literal with Vertex Shader code 240e5c31af7Sopenharmony_ci **/ 241e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryCondition::getVertexShaderCode() 242e5c31af7Sopenharmony_ci{ 243e5c31af7Sopenharmony_ci static const char* result = "${VERSION}\n" 244e5c31af7Sopenharmony_ci "\n" 245e5c31af7Sopenharmony_ci "precision highp float;\n" 246e5c31af7Sopenharmony_ci "\n" 247e5c31af7Sopenharmony_ci "flat out int layer_id;\n" 248e5c31af7Sopenharmony_ci "\n" 249e5c31af7Sopenharmony_ci "void main()\n" 250e5c31af7Sopenharmony_ci "{\n" 251e5c31af7Sopenharmony_ci " layer_id = 0;\n" 252e5c31af7Sopenharmony_ci "}\n"; 253e5c31af7Sopenharmony_ci 254e5c31af7Sopenharmony_ci return result; 255e5c31af7Sopenharmony_ci} 256e5c31af7Sopenharmony_ci 257e5c31af7Sopenharmony_ci/** Initializes GLES objects used during the test. 258e5c31af7Sopenharmony_ci * 259e5c31af7Sopenharmony_ci **/ 260e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryCondition::initTest(void) 261e5c31af7Sopenharmony_ci{ 262e5c31af7Sopenharmony_ci const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 263e5c31af7Sopenharmony_ci 264e5c31af7Sopenharmony_ci /* Create shader and program objects */ 265e5c31af7Sopenharmony_ci const char* fsCode = getFragmentShaderCode(); 266e5c31af7Sopenharmony_ci const char* gsCode = getGeometryShaderCode(); 267e5c31af7Sopenharmony_ci const char* vsCode = getVertexShaderCode(); 268e5c31af7Sopenharmony_ci 269e5c31af7Sopenharmony_ci m_fs_id = gl.createShader(GL_FRAGMENT_SHADER); 270e5c31af7Sopenharmony_ci m_vs_id = gl.createShader(GL_VERTEX_SHADER); 271e5c31af7Sopenharmony_ci m_gs_id = gl.createShader(m_glExtTokens.GEOMETRY_SHADER); 272e5c31af7Sopenharmony_ci m_po_id = gl.createProgram(); 273e5c31af7Sopenharmony_ci 274e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error creating program/shader objects."); 275e5c31af7Sopenharmony_ci 276e5c31af7Sopenharmony_ci if (!buildProgram(m_po_id, (fsCode) ? m_fs_id : 0, (fsCode) ? 1 : 0 /* part */, (fsCode) ? &fsCode : 0, 277e5c31af7Sopenharmony_ci (gsCode) ? m_gs_id : 0, (gsCode) ? 1 : 0 /* part */, (gsCode) ? &gsCode : 0, 278e5c31af7Sopenharmony_ci (vsCode) ? m_vs_id : 0, (vsCode) ? 1 : 0 /* part */, (vsCode) ? &vsCode : 0)) 279e5c31af7Sopenharmony_ci { 280e5c31af7Sopenharmony_ci TCU_FAIL("Could not create a program object from a valid vertex/geometry/fragment shader!"); 281e5c31af7Sopenharmony_ci } 282e5c31af7Sopenharmony_ci 283e5c31af7Sopenharmony_ci /* Set up framebuffer objects */ 284e5c31af7Sopenharmony_ci gl.genFramebuffers(1, &m_fbo_read_id); 285e5c31af7Sopenharmony_ci gl.genFramebuffers(1, &m_fbo_draw_id); 286e5c31af7Sopenharmony_ci 287e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error creating framebuffer objects!"); 288e5c31af7Sopenharmony_ci 289e5c31af7Sopenharmony_ci /* Set up vertex array object */ 290e5c31af7Sopenharmony_ci gl.genVertexArrays(1, &m_vao_id); 291e5c31af7Sopenharmony_ci 292e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error creating vertex array object!"); 293e5c31af7Sopenharmony_ci 294e5c31af7Sopenharmony_ci for (unsigned int i = 0; i < m_textures_info.size(); i++) 295e5c31af7Sopenharmony_ci { 296e5c31af7Sopenharmony_ci gl.genTextures(1, &m_textures_info[i].m_id); 297e5c31af7Sopenharmony_ci } 298e5c31af7Sopenharmony_ci 299e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error creating texture objects!"); 300e5c31af7Sopenharmony_ci} 301e5c31af7Sopenharmony_ci 302e5c31af7Sopenharmony_ci/** Executes the test. 303e5c31af7Sopenharmony_ci * Sets the test result to QP_TEST_RESULT_FAIL if the test failed, QP_TEST_RESULT_PASS otherwise. 304e5c31af7Sopenharmony_ci * @return STOP if the test has finished, CONTINUE to indicate iterate should be called once again. 305e5c31af7Sopenharmony_ci * Note the function throws exception should an error occur! 306e5c31af7Sopenharmony_ci **/ 307e5c31af7Sopenharmony_citcu::TestNode::IterateResult GeometryShaderLayeredRenderingBoundaryCondition::iterate(void) 308e5c31af7Sopenharmony_ci{ 309e5c31af7Sopenharmony_ci /* check if EXT_geometry_shader extension is supported */ 310e5c31af7Sopenharmony_ci if (!m_is_geometry_shader_extension_supported) 311e5c31af7Sopenharmony_ci { 312e5c31af7Sopenharmony_ci throw tcu::NotSupportedError(GEOMETRY_SHADER_EXTENSION_NOT_SUPPORTED, "", __FILE__, __LINE__); 313e5c31af7Sopenharmony_ci } 314e5c31af7Sopenharmony_ci 315e5c31af7Sopenharmony_ci initTest(); 316e5c31af7Sopenharmony_ci 317e5c31af7Sopenharmony_ci const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 318e5c31af7Sopenharmony_ci 319e5c31af7Sopenharmony_ci /* Bind draw framebuffer */ 320e5c31af7Sopenharmony_ci gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo_draw_id); 321e5c31af7Sopenharmony_ci 322e5c31af7Sopenharmony_ci /* Set up all textures */ 323e5c31af7Sopenharmony_ci unsigned char buffer[m_width * m_height * m_max_depth * m_texture_components]; 324e5c31af7Sopenharmony_ci 325e5c31af7Sopenharmony_ci memset(buffer, 0, sizeof(buffer)); 326e5c31af7Sopenharmony_ci 327e5c31af7Sopenharmony_ci for (unsigned int i = 0; i < m_textures_info.size(); i++) 328e5c31af7Sopenharmony_ci { 329e5c31af7Sopenharmony_ci gl.bindTexture(m_textures_info[i].m_texture_target, m_textures_info[i].m_id); 330e5c31af7Sopenharmony_ci gl.texStorage3D(m_textures_info[i].m_texture_target, 1, GL_RGBA8, m_width, m_height, 331e5c31af7Sopenharmony_ci m_textures_info[i].m_depth); 332e5c31af7Sopenharmony_ci gl.texSubImage3D(m_textures_info[i].m_texture_target, 0, 0, 0, 0, m_width, m_height, m_textures_info[i].m_depth, 333e5c31af7Sopenharmony_ci GL_RGBA, GL_UNSIGNED_BYTE, buffer); 334e5c31af7Sopenharmony_ci 335e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error configuring a texture object!"); 336e5c31af7Sopenharmony_ci } 337e5c31af7Sopenharmony_ci 338e5c31af7Sopenharmony_ci /* Set up draw buffers */ 339e5c31af7Sopenharmony_ci { 340e5c31af7Sopenharmony_ci glw::GLenum* drawBuffers = new glw::GLenum[m_textures_info.size()]; 341e5c31af7Sopenharmony_ci 342e5c31af7Sopenharmony_ci for (unsigned int i = 0; i < m_textures_info.size(); i++) 343e5c31af7Sopenharmony_ci { 344e5c31af7Sopenharmony_ci drawBuffers[i] = m_textures_info[i].m_draw_buffer; 345e5c31af7Sopenharmony_ci } 346e5c31af7Sopenharmony_ci 347e5c31af7Sopenharmony_ci gl.drawBuffers((glw::GLsizei)m_textures_info.size(), drawBuffers); 348e5c31af7Sopenharmony_ci 349e5c31af7Sopenharmony_ci delete[] drawBuffers; 350e5c31af7Sopenharmony_ci drawBuffers = 0; 351e5c31af7Sopenharmony_ci } 352e5c31af7Sopenharmony_ci 353e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting draw buffers!"); 354e5c31af7Sopenharmony_ci 355e5c31af7Sopenharmony_ci /* Configure draw FBO so that it uses texture attachments */ 356e5c31af7Sopenharmony_ci for (unsigned int i = 0; i < m_textures_info.size(); i++) 357e5c31af7Sopenharmony_ci { 358e5c31af7Sopenharmony_ci if (m_is_fbo_layered) 359e5c31af7Sopenharmony_ci { 360e5c31af7Sopenharmony_ci gl.framebufferTexture(GL_DRAW_FRAMEBUFFER, m_textures_info[i].m_draw_buffer, m_textures_info[i].m_id, 361e5c31af7Sopenharmony_ci 0 /* level */); 362e5c31af7Sopenharmony_ci } 363e5c31af7Sopenharmony_ci else 364e5c31af7Sopenharmony_ci { 365e5c31af7Sopenharmony_ci gl.framebufferTextureLayer(GL_DRAW_FRAMEBUFFER, m_textures_info[i].m_draw_buffer, m_textures_info[i].m_id, 366e5c31af7Sopenharmony_ci 0 /* level */, i /* layer */); 367e5c31af7Sopenharmony_ci } 368e5c31af7Sopenharmony_ci 369e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error configuring framebuffer objects!"); 370e5c31af7Sopenharmony_ci } /* for (all textures considered) */ 371e5c31af7Sopenharmony_ci 372e5c31af7Sopenharmony_ci /* Verify draw framebuffer is considered complete */ 373e5c31af7Sopenharmony_ci glw::GLenum fboCompleteness = gl.checkFramebufferStatus(GL_DRAW_FRAMEBUFFER); 374e5c31af7Sopenharmony_ci 375e5c31af7Sopenharmony_ci if (fboCompleteness != GL_FRAMEBUFFER_COMPLETE) 376e5c31af7Sopenharmony_ci { 377e5c31af7Sopenharmony_ci m_testCtx.getLog() << tcu::TestLog::Message << "Draw FBO is incomplete: " 378e5c31af7Sopenharmony_ci << "[" << fboCompleteness << "]" << tcu::TestLog::EndMessage; 379e5c31af7Sopenharmony_ci 380e5c31af7Sopenharmony_ci TCU_FAIL("Draw FBO is incomplete."); 381e5c31af7Sopenharmony_ci } 382e5c31af7Sopenharmony_ci 383e5c31af7Sopenharmony_ci /* Set up viewport */ 384e5c31af7Sopenharmony_ci gl.viewport(0, 0, m_width, m_height); 385e5c31af7Sopenharmony_ci 386e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting up viewport!"); 387e5c31af7Sopenharmony_ci 388e5c31af7Sopenharmony_ci /** Bind a vertex array object */ 389e5c31af7Sopenharmony_ci gl.bindVertexArray(m_vao_id); 390e5c31af7Sopenharmony_ci 391e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error configuring vertex array object!"); 392e5c31af7Sopenharmony_ci 393e5c31af7Sopenharmony_ci /* Render */ 394e5c31af7Sopenharmony_ci gl.useProgram(m_po_id); 395e5c31af7Sopenharmony_ci 396e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Error using program object!"); 397e5c31af7Sopenharmony_ci 398e5c31af7Sopenharmony_ci gl.drawArrays(m_draw_mode, 0, m_n_points); 399e5c31af7Sopenharmony_ci 400e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Rendering failed!"); 401e5c31af7Sopenharmony_ci 402e5c31af7Sopenharmony_ci /* Bind read framebuffer object. */ 403e5c31af7Sopenharmony_ci gl.bindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo_read_id); 404e5c31af7Sopenharmony_ci 405e5c31af7Sopenharmony_ci /* Compare the rendered data against reference representation */ 406e5c31af7Sopenharmony_ci unsigned int min_depth = 0; 407e5c31af7Sopenharmony_ci 408e5c31af7Sopenharmony_ci if (m_textures_info.size() > 0) 409e5c31af7Sopenharmony_ci { 410e5c31af7Sopenharmony_ci min_depth = m_textures_info[0].m_depth; 411e5c31af7Sopenharmony_ci 412e5c31af7Sopenharmony_ci for (unsigned int nTexture = 1; nTexture < m_textures_info.size(); nTexture++) 413e5c31af7Sopenharmony_ci { 414e5c31af7Sopenharmony_ci if (min_depth > (unsigned)m_textures_info[nTexture].m_depth) 415e5c31af7Sopenharmony_ci { 416e5c31af7Sopenharmony_ci min_depth = m_textures_info[nTexture].m_depth; 417e5c31af7Sopenharmony_ci } 418e5c31af7Sopenharmony_ci } 419e5c31af7Sopenharmony_ci } 420e5c31af7Sopenharmony_ci 421e5c31af7Sopenharmony_ci for (unsigned int nTexture = 0; nTexture < m_textures_info.size(); nTexture++) 422e5c31af7Sopenharmony_ci { 423e5c31af7Sopenharmony_ci for (unsigned int nLayer = 0; nLayer < min_depth; nLayer++) 424e5c31af7Sopenharmony_ci { 425e5c31af7Sopenharmony_ci /* Configure read FBO's color attachment */ 426e5c31af7Sopenharmony_ci gl.framebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_textures_info[nTexture].m_id, 0, 427e5c31af7Sopenharmony_ci nLayer); 428e5c31af7Sopenharmony_ci 429e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Could not set up read framebuffer!"); 430e5c31af7Sopenharmony_ci 431e5c31af7Sopenharmony_ci /* Verify read framebuffer is considered complete */ 432e5c31af7Sopenharmony_ci glw::GLenum _fboCompleteness = gl.checkFramebufferStatus(GL_DRAW_FRAMEBUFFER); 433e5c31af7Sopenharmony_ci 434e5c31af7Sopenharmony_ci if (_fboCompleteness != GL_FRAMEBUFFER_COMPLETE) 435e5c31af7Sopenharmony_ci { 436e5c31af7Sopenharmony_ci m_testCtx.getLog() << tcu::TestLog::Message << "Read FBO is incomplete: " 437e5c31af7Sopenharmony_ci << "[" << _fboCompleteness << "]" << tcu::TestLog::EndMessage; 438e5c31af7Sopenharmony_ci 439e5c31af7Sopenharmony_ci TCU_FAIL("Read FBO is incomplete."); 440e5c31af7Sopenharmony_ci } 441e5c31af7Sopenharmony_ci gl.viewport(0, 0, m_width, m_height); 442e5c31af7Sopenharmony_ci 443e5c31af7Sopenharmony_ci /* Read the rendered data */ 444e5c31af7Sopenharmony_ci gl.readPixels(0 /* x */, 0 /* y */, m_width /* width */, m_height /* height */, GL_RGBA, GL_UNSIGNED_BYTE, 445e5c31af7Sopenharmony_ci buffer); 446e5c31af7Sopenharmony_ci 447e5c31af7Sopenharmony_ci GLU_EXPECT_NO_ERROR(gl.getError(), "Could not read pixels using glReadPixels()"); 448e5c31af7Sopenharmony_ci 449e5c31af7Sopenharmony_ci /* Retrieve reference color for layer */ 450e5c31af7Sopenharmony_ci unsigned char expectedData[m_texture_components]; 451e5c31af7Sopenharmony_ci 452e5c31af7Sopenharmony_ci getReferenceColor(nLayer, expectedData, m_texture_components); 453e5c31af7Sopenharmony_ci 454e5c31af7Sopenharmony_ci /* Compare the retrieved data with reference data */ 455e5c31af7Sopenharmony_ci if (!comparePixels(m_width, m_height, m_texture_components, buffer, expectedData, nTexture, nLayer)) 456e5c31af7Sopenharmony_ci { 457e5c31af7Sopenharmony_ci m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 458e5c31af7Sopenharmony_ci return STOP; 459e5c31af7Sopenharmony_ci } /* if (data comparison failed) */ 460e5c31af7Sopenharmony_ci } /* for (all layers) */ 461e5c31af7Sopenharmony_ci } /* for (all texture objects) */ 462e5c31af7Sopenharmony_ci 463e5c31af7Sopenharmony_ci m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 464e5c31af7Sopenharmony_ci return STOP; 465e5c31af7Sopenharmony_ci} 466e5c31af7Sopenharmony_ci 467e5c31af7Sopenharmony_ci/** Constructor 468e5c31af7Sopenharmony_ci * 469e5c31af7Sopenharmony_ci * @param context Test context 470e5c31af7Sopenharmony_ci * @param name Test case's name 471e5c31af7Sopenharmony_ci * @param description Test case's desricption 472e5c31af7Sopenharmony_ci **/ 473e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryConditionVariousTextures:: 474e5c31af7Sopenharmony_ci GeometryShaderLayeredRenderingBoundaryConditionVariousTextures(Context& context, const ExtParameters& extParams, 475e5c31af7Sopenharmony_ci const char* name, const char* description) 476e5c31af7Sopenharmony_ci : GeometryShaderLayeredRenderingBoundaryCondition(context, extParams, name, description) 477e5c31af7Sopenharmony_ci{ 478e5c31af7Sopenharmony_ci TextureInfo texInfo; 479e5c31af7Sopenharmony_ci 480e5c31af7Sopenharmony_ci texInfo.m_depth = 2; 481e5c31af7Sopenharmony_ci texInfo.m_draw_buffer = GL_COLOR_ATTACHMENT0; 482e5c31af7Sopenharmony_ci texInfo.m_id = 0; 483e5c31af7Sopenharmony_ci texInfo.m_texture_target = GL_TEXTURE_3D; 484e5c31af7Sopenharmony_ci 485e5c31af7Sopenharmony_ci m_textures_info.push_back(texInfo); 486e5c31af7Sopenharmony_ci 487e5c31af7Sopenharmony_ci texInfo.m_depth = 4; 488e5c31af7Sopenharmony_ci texInfo.m_draw_buffer = GL_COLOR_ATTACHMENT1; 489e5c31af7Sopenharmony_ci texInfo.m_id = 0; 490e5c31af7Sopenharmony_ci texInfo.m_texture_target = GL_TEXTURE_3D; 491e5c31af7Sopenharmony_ci 492e5c31af7Sopenharmony_ci m_textures_info.push_back(texInfo); 493e5c31af7Sopenharmony_ci 494e5c31af7Sopenharmony_ci m_draw_mode = GL_POINTS; 495e5c31af7Sopenharmony_ci m_n_points = 1; 496e5c31af7Sopenharmony_ci m_is_fbo_layered = true; 497e5c31af7Sopenharmony_ci} 498e5c31af7Sopenharmony_ci 499e5c31af7Sopenharmony_ci/** Returns code for Fragment Shader 500e5c31af7Sopenharmony_ci * 501e5c31af7Sopenharmony_ci * @return pointer to literal with Fragment Shader code 502e5c31af7Sopenharmony_ci **/ 503e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionVariousTextures::getFragmentShaderCode() 504e5c31af7Sopenharmony_ci{ 505e5c31af7Sopenharmony_ci static const char* result = "${VERSION}\n" 506e5c31af7Sopenharmony_ci "\n" 507e5c31af7Sopenharmony_ci "precision highp float;\n" 508e5c31af7Sopenharmony_ci "\n" 509e5c31af7Sopenharmony_ci "flat in int layer_id;\n" 510e5c31af7Sopenharmony_ci "layout(location=0) out vec4 color0;\n" 511e5c31af7Sopenharmony_ci "layout(location=1) out vec4 color1;\n" 512e5c31af7Sopenharmony_ci "\n" 513e5c31af7Sopenharmony_ci "void main()\n" 514e5c31af7Sopenharmony_ci "{\n" 515e5c31af7Sopenharmony_ci " vec4 color;\n" 516e5c31af7Sopenharmony_ci " switch (layer_id)\n" 517e5c31af7Sopenharmony_ci " {\n" 518e5c31af7Sopenharmony_ci " case 0: color = vec4(1, 0, 0, 1); break;\n" 519e5c31af7Sopenharmony_ci " case 1: color = vec4(0, 1, 0, 1); break;\n" 520e5c31af7Sopenharmony_ci " case 2: color = vec4(0, 0, 1, 1); break;\n" 521e5c31af7Sopenharmony_ci " case 3: color = vec4(1, 1, 1, 1); break;\n" 522e5c31af7Sopenharmony_ci " default: color = vec4(0, 0, 0, 0); break;\n" 523e5c31af7Sopenharmony_ci " }\n" 524e5c31af7Sopenharmony_ci " color0 = color;\n" 525e5c31af7Sopenharmony_ci " color1 = color;\n" 526e5c31af7Sopenharmony_ci "}\n"; 527e5c31af7Sopenharmony_ci return result; 528e5c31af7Sopenharmony_ci} 529e5c31af7Sopenharmony_ci 530e5c31af7Sopenharmony_ci/** Returns code for Geometry Shader 531e5c31af7Sopenharmony_ci * 532e5c31af7Sopenharmony_ci * @return pointer to literal with Geometry Shader code 533e5c31af7Sopenharmony_ci **/ 534e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionVariousTextures::getGeometryShaderCode() 535e5c31af7Sopenharmony_ci{ 536e5c31af7Sopenharmony_ci static const char* result = "${VERSION}\n" 537e5c31af7Sopenharmony_ci "\n" 538e5c31af7Sopenharmony_ci "${GEOMETRY_SHADER_REQUIRE}\n" 539e5c31af7Sopenharmony_ci "\n" 540e5c31af7Sopenharmony_ci "precision highp float;\n" 541e5c31af7Sopenharmony_ci "\n" 542e5c31af7Sopenharmony_ci "#define MAX_VERTICES 16\n" 543e5c31af7Sopenharmony_ci "#define N_LAYERS 2\n" 544e5c31af7Sopenharmony_ci "\n" 545e5c31af7Sopenharmony_ci "layout(points) in;\n" 546e5c31af7Sopenharmony_ci "layout(triangle_strip, max_vertices=MAX_VERTICES) out;\n" 547e5c31af7Sopenharmony_ci "\n" 548e5c31af7Sopenharmony_ci "precision highp float;\n" 549e5c31af7Sopenharmony_ci "\n" 550e5c31af7Sopenharmony_ci "flat out int layer_id;\n" 551e5c31af7Sopenharmony_ci "\n" 552e5c31af7Sopenharmony_ci "void main()\n" 553e5c31af7Sopenharmony_ci "{\n" 554e5c31af7Sopenharmony_ci " for (int n = 0;n < N_LAYERS;++n)\n" 555e5c31af7Sopenharmony_ci " {\n" 556e5c31af7Sopenharmony_ci " gl_Layer = n;\n" 557e5c31af7Sopenharmony_ci " layer_id = gl_Layer;\n" 558e5c31af7Sopenharmony_ci " gl_Position = vec4(1, 1, 0, 1);\n" 559e5c31af7Sopenharmony_ci " EmitVertex();\n" 560e5c31af7Sopenharmony_ci "\n" 561e5c31af7Sopenharmony_ci " gl_Layer = n;\n" 562e5c31af7Sopenharmony_ci " layer_id = gl_Layer;\n" 563e5c31af7Sopenharmony_ci " gl_Position = vec4(1, -1, 0, 1);\n" 564e5c31af7Sopenharmony_ci " EmitVertex();\n" 565e5c31af7Sopenharmony_ci "\n" 566e5c31af7Sopenharmony_ci " gl_Layer = n;\n" 567e5c31af7Sopenharmony_ci " layer_id = gl_Layer;\n" 568e5c31af7Sopenharmony_ci " gl_Position = vec4(-1, 1, 0, 1);\n" 569e5c31af7Sopenharmony_ci " EmitVertex();\n" 570e5c31af7Sopenharmony_ci "\n" 571e5c31af7Sopenharmony_ci " gl_Layer = n;\n" 572e5c31af7Sopenharmony_ci " layer_id = gl_Layer;\n" 573e5c31af7Sopenharmony_ci " gl_Position = vec4(-1, -1, 0, 1);\n" 574e5c31af7Sopenharmony_ci " EmitVertex();\n" 575e5c31af7Sopenharmony_ci "\n" 576e5c31af7Sopenharmony_ci " EndPrimitive();\n" 577e5c31af7Sopenharmony_ci " }\n" 578e5c31af7Sopenharmony_ci "}\n"; 579e5c31af7Sopenharmony_ci return result; 580e5c31af7Sopenharmony_ci} 581e5c31af7Sopenharmony_ci 582e5c31af7Sopenharmony_ci/** Get reference color for test result verification 583e5c31af7Sopenharmony_ci * @param layerIndex index of layer 584e5c31af7Sopenharmony_ci * @param colorBuffer will be used to store the requested data(buffor size should be greater than or equal colorBufferSize) 585e5c31af7Sopenharmony_ci * @param colorBufferSize components number 586e5c31af7Sopenharmony_ci **/ 587e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryConditionVariousTextures::getReferenceColor(glw::GLint layerIndex, 588e5c31af7Sopenharmony_ci unsigned char* colorBuffer, 589e5c31af7Sopenharmony_ci int colorBufferSize) 590e5c31af7Sopenharmony_ci{ 591e5c31af7Sopenharmony_ci if (layerIndex == 0) 592e5c31af7Sopenharmony_ci { 593e5c31af7Sopenharmony_ci memcpy(colorBuffer, m_red_color, colorBufferSize); 594e5c31af7Sopenharmony_ci } 595e5c31af7Sopenharmony_ci else if (layerIndex == 1) 596e5c31af7Sopenharmony_ci { 597e5c31af7Sopenharmony_ci memcpy(colorBuffer, m_green_color, colorBufferSize); 598e5c31af7Sopenharmony_ci } 599e5c31af7Sopenharmony_ci else 600e5c31af7Sopenharmony_ci { 601e5c31af7Sopenharmony_ci memset(colorBuffer, 0, colorBufferSize); 602e5c31af7Sopenharmony_ci } 603e5c31af7Sopenharmony_ci} 604e5c31af7Sopenharmony_ci 605e5c31af7Sopenharmony_ci/** Constructor 606e5c31af7Sopenharmony_ci * 607e5c31af7Sopenharmony_ci * @param context Test context 608e5c31af7Sopenharmony_ci * @param name Test case's name 609e5c31af7Sopenharmony_ci * @param description Test case's description 610e5c31af7Sopenharmony_ci **/ 611e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryConditionNoGS::GeometryShaderLayeredRenderingBoundaryConditionNoGS( 612e5c31af7Sopenharmony_ci Context& context, const ExtParameters& extParams, const char* name, const char* description) 613e5c31af7Sopenharmony_ci : GeometryShaderLayeredRenderingBoundaryCondition(context, extParams, name, description) 614e5c31af7Sopenharmony_ci{ 615e5c31af7Sopenharmony_ci TextureInfo texInfo; 616e5c31af7Sopenharmony_ci 617e5c31af7Sopenharmony_ci texInfo.m_depth = 4; 618e5c31af7Sopenharmony_ci texInfo.m_draw_buffer = GL_COLOR_ATTACHMENT0; 619e5c31af7Sopenharmony_ci texInfo.m_id = 0; 620e5c31af7Sopenharmony_ci texInfo.m_texture_target = GL_TEXTURE_3D; 621e5c31af7Sopenharmony_ci 622e5c31af7Sopenharmony_ci m_textures_info.push_back(texInfo); 623e5c31af7Sopenharmony_ci 624e5c31af7Sopenharmony_ci m_draw_mode = GL_TRIANGLE_FAN; 625e5c31af7Sopenharmony_ci m_n_points = 4; 626e5c31af7Sopenharmony_ci m_is_fbo_layered = true; 627e5c31af7Sopenharmony_ci} 628e5c31af7Sopenharmony_ci 629e5c31af7Sopenharmony_ci/** Get reference color for test result verification 630e5c31af7Sopenharmony_ci * @param layerIndex index of layer 631e5c31af7Sopenharmony_ci * @param colorBuffer will be used to store the requested data(buffer size should be greater than or equal colorBufferSize) 632e5c31af7Sopenharmony_ci * @param colorBufferSize components number 633e5c31af7Sopenharmony_ci **/ 634e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryConditionNoGS::getReferenceColor(glw::GLint layerIndex, 635e5c31af7Sopenharmony_ci unsigned char* colorBuffer, 636e5c31af7Sopenharmony_ci int colorBufferSize) 637e5c31af7Sopenharmony_ci{ 638e5c31af7Sopenharmony_ci if (layerIndex == 0) 639e5c31af7Sopenharmony_ci { 640e5c31af7Sopenharmony_ci memcpy(colorBuffer, m_white_color, colorBufferSize); 641e5c31af7Sopenharmony_ci } 642e5c31af7Sopenharmony_ci else 643e5c31af7Sopenharmony_ci { 644e5c31af7Sopenharmony_ci memset(colorBuffer, 0, colorBufferSize); 645e5c31af7Sopenharmony_ci } 646e5c31af7Sopenharmony_ci} 647e5c31af7Sopenharmony_ci 648e5c31af7Sopenharmony_ci/** Returns code for Vertex Shader 649e5c31af7Sopenharmony_ci * @return pointer to literal with Vertex Shader code 650e5c31af7Sopenharmony_ci **/ 651e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionNoGS::getVertexShaderCode() 652e5c31af7Sopenharmony_ci{ 653e5c31af7Sopenharmony_ci static const char* result = "${VERSION}\n" 654e5c31af7Sopenharmony_ci "\n" 655e5c31af7Sopenharmony_ci "precision highp float;\n" 656e5c31af7Sopenharmony_ci "\n" 657e5c31af7Sopenharmony_ci "flat out int layer_id;\n" 658e5c31af7Sopenharmony_ci "\n" 659e5c31af7Sopenharmony_ci "void main()\n" 660e5c31af7Sopenharmony_ci "{\n" 661e5c31af7Sopenharmony_ci " layer_id = 0;\n" 662e5c31af7Sopenharmony_ci "\n" 663e5c31af7Sopenharmony_ci " switch (gl_VertexID)\n" 664e5c31af7Sopenharmony_ci " {\n" 665e5c31af7Sopenharmony_ci " case 0: gl_Position = vec4(-1, -1, 0, 1); break;\n" 666e5c31af7Sopenharmony_ci " case 1: gl_Position = vec4(-1, 1, 0, 1); break;\n" 667e5c31af7Sopenharmony_ci " case 2: gl_Position = vec4( 1, 1, 0, 1); break;\n" 668e5c31af7Sopenharmony_ci " default: gl_Position = vec4( 1, -1, 0, 1); break;\n" 669e5c31af7Sopenharmony_ci " }\n" 670e5c31af7Sopenharmony_ci "}\n"; 671e5c31af7Sopenharmony_ci return result; 672e5c31af7Sopenharmony_ci} 673e5c31af7Sopenharmony_ci 674e5c31af7Sopenharmony_ci/** Constructor 675e5c31af7Sopenharmony_ci * 676e5c31af7Sopenharmony_ci * @param context Test context 677e5c31af7Sopenharmony_ci * @param name Test case's name 678e5c31af7Sopenharmony_ci * @param description Test case's desricption 679e5c31af7Sopenharmony_ci **/ 680e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryConditionNoLayerSet::GeometryShaderLayeredRenderingBoundaryConditionNoLayerSet( 681e5c31af7Sopenharmony_ci Context& context, const ExtParameters& extParams, const char* name, const char* description) 682e5c31af7Sopenharmony_ci : GeometryShaderLayeredRenderingBoundaryCondition(context, extParams, name, description) 683e5c31af7Sopenharmony_ci{ 684e5c31af7Sopenharmony_ci TextureInfo texInfo; 685e5c31af7Sopenharmony_ci 686e5c31af7Sopenharmony_ci texInfo.m_depth = 4; 687e5c31af7Sopenharmony_ci texInfo.m_draw_buffer = GL_COLOR_ATTACHMENT0; 688e5c31af7Sopenharmony_ci texInfo.m_id = 0; 689e5c31af7Sopenharmony_ci texInfo.m_texture_target = GL_TEXTURE_3D; 690e5c31af7Sopenharmony_ci 691e5c31af7Sopenharmony_ci m_textures_info.push_back(texInfo); 692e5c31af7Sopenharmony_ci 693e5c31af7Sopenharmony_ci m_draw_mode = GL_POINTS; 694e5c31af7Sopenharmony_ci m_n_points = 1; 695e5c31af7Sopenharmony_ci m_is_fbo_layered = true; 696e5c31af7Sopenharmony_ci} 697e5c31af7Sopenharmony_ci 698e5c31af7Sopenharmony_ci/** Returns code for Geometry Shader 699e5c31af7Sopenharmony_ci * @return pointer to literal with Geometry Shader code 700e5c31af7Sopenharmony_ci **/ 701e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionNoLayerSet::getGeometryShaderCode() 702e5c31af7Sopenharmony_ci{ 703e5c31af7Sopenharmony_ci static const char* result = "${VERSION}\n" 704e5c31af7Sopenharmony_ci "\n" 705e5c31af7Sopenharmony_ci "${GEOMETRY_SHADER_REQUIRE}\n" 706e5c31af7Sopenharmony_ci "\n" 707e5c31af7Sopenharmony_ci "precision highp float;\n" 708e5c31af7Sopenharmony_ci "\n" 709e5c31af7Sopenharmony_ci "#define MAX_VERTICES 4\n" 710e5c31af7Sopenharmony_ci "\n" 711e5c31af7Sopenharmony_ci "layout(points) in;\n" 712e5c31af7Sopenharmony_ci "layout(triangle_strip, max_vertices=MAX_VERTICES) out;\n" 713e5c31af7Sopenharmony_ci "\n" 714e5c31af7Sopenharmony_ci "precision highp float;\n" 715e5c31af7Sopenharmony_ci "\n" 716e5c31af7Sopenharmony_ci "flat out int layer_id;\n" 717e5c31af7Sopenharmony_ci "\n" 718e5c31af7Sopenharmony_ci "void main()\n" 719e5c31af7Sopenharmony_ci "{\n" 720e5c31af7Sopenharmony_ci " layer_id = 0;\n" 721e5c31af7Sopenharmony_ci " gl_Position = vec4(1, 1, 0, 1);\n" 722e5c31af7Sopenharmony_ci " EmitVertex();\n" 723e5c31af7Sopenharmony_ci "\n" 724e5c31af7Sopenharmony_ci " layer_id = 0;\n" 725e5c31af7Sopenharmony_ci " gl_Position = vec4(1, -1, 0, 1);\n" 726e5c31af7Sopenharmony_ci " EmitVertex();\n" 727e5c31af7Sopenharmony_ci "\n" 728e5c31af7Sopenharmony_ci " layer_id = 0;\n" 729e5c31af7Sopenharmony_ci " gl_Position = vec4(-1, 1, 0, 1);\n" 730e5c31af7Sopenharmony_ci " EmitVertex();\n" 731e5c31af7Sopenharmony_ci "\n" 732e5c31af7Sopenharmony_ci " layer_id = 0;\n" 733e5c31af7Sopenharmony_ci " gl_Position = vec4(-1, -1, 0, 1);\n" 734e5c31af7Sopenharmony_ci " EmitVertex();\n" 735e5c31af7Sopenharmony_ci "\n" 736e5c31af7Sopenharmony_ci " EndPrimitive();\n" 737e5c31af7Sopenharmony_ci "}\n"; 738e5c31af7Sopenharmony_ci return result; 739e5c31af7Sopenharmony_ci} 740e5c31af7Sopenharmony_ci 741e5c31af7Sopenharmony_ci/** Get reference color for test result verification 742e5c31af7Sopenharmony_ci * @param layerIndex index of layer 743e5c31af7Sopenharmony_ci * @param colorBuffer will be used to store the requested data(buffer size should be greater than or equal colorBufferSize) 744e5c31af7Sopenharmony_ci * @param colorBufferSize components number 745e5c31af7Sopenharmony_ci **/ 746e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryConditionNoLayerSet::getReferenceColor(glw::GLint layerIndex, 747e5c31af7Sopenharmony_ci unsigned char* colorBuffer, 748e5c31af7Sopenharmony_ci int colorBufferSize) 749e5c31af7Sopenharmony_ci{ 750e5c31af7Sopenharmony_ci if (layerIndex == 0) 751e5c31af7Sopenharmony_ci { 752e5c31af7Sopenharmony_ci memcpy(colorBuffer, m_white_color, colorBufferSize); 753e5c31af7Sopenharmony_ci } 754e5c31af7Sopenharmony_ci else 755e5c31af7Sopenharmony_ci { 756e5c31af7Sopenharmony_ci memset(colorBuffer, 0, colorBufferSize); 757e5c31af7Sopenharmony_ci } 758e5c31af7Sopenharmony_ci} 759e5c31af7Sopenharmony_ci 760e5c31af7Sopenharmony_ci/** Constructor 761e5c31af7Sopenharmony_ci * 762e5c31af7Sopenharmony_ci * @param context Test context 763e5c31af7Sopenharmony_ci * @param name Test case's name 764e5c31af7Sopenharmony_ci * @param description Test case's desricption 765e5c31af7Sopenharmony_ci **/ 766e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryConditionNoLayeredFBO:: 767e5c31af7Sopenharmony_ci GeometryShaderLayeredRenderingBoundaryConditionNoLayeredFBO(Context& context, const ExtParameters& extParams, 768e5c31af7Sopenharmony_ci const char* name, const char* description) 769e5c31af7Sopenharmony_ci : GeometryShaderLayeredRenderingBoundaryCondition(context, extParams, name, description) 770e5c31af7Sopenharmony_ci{ 771e5c31af7Sopenharmony_ci TextureInfo texInfo; 772e5c31af7Sopenharmony_ci 773e5c31af7Sopenharmony_ci texInfo.m_depth = 4; 774e5c31af7Sopenharmony_ci texInfo.m_draw_buffer = GL_COLOR_ATTACHMENT0; 775e5c31af7Sopenharmony_ci texInfo.m_id = 0; 776e5c31af7Sopenharmony_ci texInfo.m_texture_target = GL_TEXTURE_3D; 777e5c31af7Sopenharmony_ci 778e5c31af7Sopenharmony_ci m_textures_info.push_back(texInfo); 779e5c31af7Sopenharmony_ci 780e5c31af7Sopenharmony_ci m_draw_mode = GL_POINTS; 781e5c31af7Sopenharmony_ci m_n_points = 1; 782e5c31af7Sopenharmony_ci m_is_fbo_layered = false; 783e5c31af7Sopenharmony_ci} 784e5c31af7Sopenharmony_ci 785e5c31af7Sopenharmony_ci/** Returns code for Geometry Shader 786e5c31af7Sopenharmony_ci * @return pointer to literal with Geometry Shader code 787e5c31af7Sopenharmony_ci **/ 788e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionNoLayeredFBO::getGeometryShaderCode() 789e5c31af7Sopenharmony_ci{ 790e5c31af7Sopenharmony_ci static const char* result = "${VERSION}\n" 791e5c31af7Sopenharmony_ci "\n" 792e5c31af7Sopenharmony_ci "${GEOMETRY_SHADER_REQUIRE}\n" 793e5c31af7Sopenharmony_ci "\n" 794e5c31af7Sopenharmony_ci "precision highp float;\n" 795e5c31af7Sopenharmony_ci "\n" 796e5c31af7Sopenharmony_ci "#define MAX_VERTICES 4\n" 797e5c31af7Sopenharmony_ci "\n" 798e5c31af7Sopenharmony_ci "layout(points) in;\n" 799e5c31af7Sopenharmony_ci "layout(triangle_strip, max_vertices=MAX_VERTICES) out;\n" 800e5c31af7Sopenharmony_ci "\n" 801e5c31af7Sopenharmony_ci "precision highp float;\n" 802e5c31af7Sopenharmony_ci "\n" 803e5c31af7Sopenharmony_ci "flat out int layer_id;\n" 804e5c31af7Sopenharmony_ci "\n" 805e5c31af7Sopenharmony_ci "void main()\n" 806e5c31af7Sopenharmony_ci "{\n" 807e5c31af7Sopenharmony_ci " gl_Layer = 1;\n" 808e5c31af7Sopenharmony_ci "\n" 809e5c31af7Sopenharmony_ci " layer_id = gl_Layer;\n" 810e5c31af7Sopenharmony_ci " gl_Position = vec4(1, 1, 0, 1);\n" 811e5c31af7Sopenharmony_ci " EmitVertex();\n" 812e5c31af7Sopenharmony_ci "\n" 813e5c31af7Sopenharmony_ci " layer_id = gl_Layer;\n" 814e5c31af7Sopenharmony_ci " gl_Position = vec4(1, -1, 0, 1);\n" 815e5c31af7Sopenharmony_ci " EmitVertex();\n" 816e5c31af7Sopenharmony_ci "\n" 817e5c31af7Sopenharmony_ci " layer_id = gl_Layer;\n" 818e5c31af7Sopenharmony_ci " gl_Position = vec4(-1, 1, 0, 1);\n" 819e5c31af7Sopenharmony_ci " EmitVertex();\n" 820e5c31af7Sopenharmony_ci "\n" 821e5c31af7Sopenharmony_ci " layer_id = gl_Layer;\n" 822e5c31af7Sopenharmony_ci " gl_Position = vec4(-1, -1, 0, 1);\n" 823e5c31af7Sopenharmony_ci " EmitVertex();\n" 824e5c31af7Sopenharmony_ci "\n" 825e5c31af7Sopenharmony_ci " EndPrimitive();\n" 826e5c31af7Sopenharmony_ci "}\n"; 827e5c31af7Sopenharmony_ci return result; 828e5c31af7Sopenharmony_ci} 829e5c31af7Sopenharmony_ci 830e5c31af7Sopenharmony_ci/** Get reference color for test result verification 831e5c31af7Sopenharmony_ci * @param layerIndex index of layer 832e5c31af7Sopenharmony_ci * @param colorBuffer will be used to store the requested data(buffer size should be greater than or equal colorBufferSize) 833e5c31af7Sopenharmony_ci * @param colorBufferSize components number 834e5c31af7Sopenharmony_ci **/ 835e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryConditionNoLayeredFBO::getReferenceColor(glw::GLint layerIndex, 836e5c31af7Sopenharmony_ci unsigned char* colorBuffer, 837e5c31af7Sopenharmony_ci int colorBufferSize) 838e5c31af7Sopenharmony_ci{ 839e5c31af7Sopenharmony_ci if (layerIndex == 0) 840e5c31af7Sopenharmony_ci { 841e5c31af7Sopenharmony_ci memcpy(colorBuffer, m_white_color, colorBufferSize); 842e5c31af7Sopenharmony_ci } 843e5c31af7Sopenharmony_ci else 844e5c31af7Sopenharmony_ci { 845e5c31af7Sopenharmony_ci memset(colorBuffer, 0, colorBufferSize); 846e5c31af7Sopenharmony_ci } 847e5c31af7Sopenharmony_ci} 848e5c31af7Sopenharmony_ci 849e5c31af7Sopenharmony_ci} // namespace glcts 850