1 /*-------------------------------------------------------------------------
2 * OpenGL Conformance Test Suite
3 * -----------------------------
5 * Copyright (c) 2020 The Khronos Group Inc.
6 * Copyright (c) 2020 Intel Corporation
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
21 * \file glcPixelStorageModesTests.cpp
22 * \brief Conformance tests for usage of pixel storage modes.
23 */ /*-------------------------------------------------------------------*/
26 #include "tcuRenderTarget.hpp"
27 #include "tcuSurface.hpp"
28 #include "tcuTextureUtil.hpp"
29 #include "tcuTestCase.hpp"
30 #include "tcuTestLog.hpp"
31 #include "tcuDefs.hpp"
32 #include "tcuFloat.hpp"
33 #include "tcuStringTemplate.hpp"
34 #include "gluRenderContext.hpp"
35 #include "gluShaderProgram.hpp"
36 #include "gluShaderUtil.hpp"
37 #include "gluContextInfo.hpp"
38 #include "gluObjectWrapper.hpp"
39 #include "gluCallLogWrapper.hpp"
40 #include "gluPixelTransfer.hpp"
41 #include "gluTexture.hpp"
42 #include "gluTextureUtil.hpp"
43 #include "gluDrawUtil.hpp"
44 #include "gluDefs.hpp"
45 #include "sglrGLContext.hpp"
46 #include "sglrContextWrapper.hpp"
47 #include "sglrContextUtil.hpp"
48 #include "glwFunctions.hpp"
49 #include "glwEnums.hpp"
50 #include "deStringUtil.hpp"
51 #include "deUniquePtr.hpp"
52 #include "glsTextureTestUtil.hpp"
53 #include "glcPixelStorageModesTests.hpp"
60 static const char* const vs_template_src =
62 "in highp vec4 pos;\n"
63 "out highp ${TEXCOORDS_TYPE} texcoords;\n"
67 " texcoords = ${TEXCOORDS};\n"
68 " gl_Position = pos;\n"
71 static const char* const fs_template_src =
73 "precision highp float;\n"
74 "precision highp int;\n"
75 "out vec4 fragColour;\n"
76 "in ${TEXCOORDS_TYPE} texcoords;\n"
77 "uniform highp ${SAMPLER_TYPE} sampler;\n"
78 "uniform ${COL_TYPE} refcolour;\n"
81 " ${COL_TYPE} colour = texelFetch(sampler, i${TEXCOORDS_TYPE}(texcoords), 0);\n"
82 " if (${CONDITION})\n"
83 " fragColour = vec4(0.0, 1.0, 0.0, 1.0);\n"
85 " fragColour = vec4(colour);\n"
88 double getEps(deUint32 internalFormat)
91 switch (internalFormat)
94 eps = 1.0 / (double)(1 << 4);
98 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
99 eps = 1.0 / (double)(1 << 5);
109 case GL_SRGB8_ALPHA8:
111 eps = 1.0 / (double)(1 << 8);
114 eps = 1.0 / (double)(1 << 9);
116 case GL_R11F_G11F_B10F:
118 eps = 1.0 / (double)(1 << 10);
124 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
125 eps = 1.0 / (double)(1 << 16);
131 eps = 1.0 / (double)(1 << 31);
134 TCU_FAIL("Invalid internal format");
138 return std::max(0.01, eps);
141 bool inrange(int x, int left, int right)
143 return (x >= left && x < right);
149 TexImageUtils(deUint32 internalFormat,
150 int cuboid_w, int cuboid_h, int cuboid_d,
151 int subcuboid_x0, int subcuboid_y0, int subcuboid_z0,
152 int subcuboid_w, int subcuboid_h, int subcuboid_d,
153 glu::GLSLVersion glsl_version);
154 ~TexImageUtils (void);
156 void writePixel(glw::GLubyte *p, glw::GLdouble col);
157 void writeChannel(glw::GLubyte *p, int channel, glw::GLdouble col);
158 template <typename T>
159 void writeToUnsignedChannel(glw::GLubyte *p, int channel, glw::GLdouble col);
160 template <typename T>
161 void writeToSignedChannel(glw::GLubyte *p, int channel, glw::GLdouble col);
162 void writeToFloatChannel(glw::GLubyte *p, int channel, glw::GLdouble col);
163 void writeToHalfFloatChannel(glw::GLubyte *p, int channel, glw::GLdouble col);
164 template <typename T,
165 unsigned int size_1, unsigned int size_2, unsigned int size_3,
166 unsigned int off_1, unsigned int off_2, unsigned int off_3>
167 void write3Channel(glw::GLubyte *p, int channel, glw::GLdouble col);
168 template <typename T,
169 unsigned int size_1, unsigned int size_2,
170 unsigned int size_3, unsigned int size_4,
171 unsigned int off_1, unsigned int off_2,
172 unsigned int off_3, unsigned int off_4>
173 void write4Channel(glw::GLubyte *p, int channel, glw::GLdouble col);
174 void write11F_11F_10F_Channel(glw::GLubyte *p, int channel, glw::GLdouble col);
175 void setRefcolour (glu::CallLogWrapper gl, glw::GLdouble col);
176 template <typename T>
177 void setUnsignedRefcolour(glu::CallLogWrapper gl, glw::GLdouble col);
178 template <typename T>
179 void setSignedRefcolour(glu::CallLogWrapper gl, glw::GLdouble col);
180 void setRGB10A2Refcolour (glu::CallLogWrapper gl, glw::GLdouble col);
181 bool verify(tcu::Surface dst, tcu::Surface *errMask);
183 glw::GLubyte *m_src_data;
185 glu::ShaderProgram* prog;
187 deUint32 m_internalFormat;
202 glu::GLSLVersion m_glsl_version;
205 TexImageUtils::TexImageUtils (deUint32 internalFormat,
215 glu::GLSLVersion glsl_version)
219 , m_internalFormat(internalFormat)
220 , m_format(glu::getTransferFormat(glu::mapGLInternalFormat(internalFormat)).format)
221 , m_type(glu::getTransferFormat(glu::mapGLInternalFormat(internalFormat)).dataType)
222 , m_pixelsize(tcu::getPixelSize(glu::mapGLInternalFormat(internalFormat)))
223 , m_num_channels(tcu::getNumUsedChannels(glu::mapGLInternalFormat(internalFormat).order))
224 , m_cuboid_w(cuboid_w)
225 , m_cuboid_h(cuboid_h)
226 , m_cuboid_d(cuboid_d)
227 , m_subcuboid_x0(subcuboid_x0)
228 , m_subcuboid_y0(subcuboid_y0)
229 , m_subcuboid_z0(subcuboid_z0)
230 , m_subcuboid_w(subcuboid_w)
231 , m_subcuboid_h(subcuboid_h)
232 , m_subcuboid_d(subcuboid_d)
233 , m_glsl_version(glsl_version)
237 TexImageUtils::~TexImageUtils (void)
241 void TexImageUtils::writePixel(glw::GLubyte *p, glw::GLdouble col)
243 for (int ch = 0; ch < m_num_channels; ch++)
244 writeChannel(p, ch, (ch == 3) ? 1.0 : col);
247 void TexImageUtils::writeChannel(glw::GLubyte *p, int channel, glw::GLdouble col)
251 case GL_UNSIGNED_BYTE:
252 writeToUnsignedChannel<glw::GLubyte>(p, channel, col);
255 writeToSignedChannel<glw::GLbyte>(p, channel, col);
257 case GL_UNSIGNED_SHORT:
258 writeToUnsignedChannel<glw::GLushort>(p, channel, col);
260 case GL_UNSIGNED_SHORT_5_6_5:
261 write3Channel<glw::GLushort, 5, 6, 5, 11, 5, 0>(p, channel, col);
264 writeToSignedChannel<glw::GLshort>(p, channel, col);
266 case GL_UNSIGNED_INT:
267 writeToUnsignedChannel<glw::GLuint>(p, channel, col);
269 case GL_UNSIGNED_INT_2_10_10_10_REV:
270 write4Channel<glw::GLuint, 2, 10, 10, 10, 30, 20, 10, 0>(p, 3 - channel, col);
272 case GL_UNSIGNED_INT_10F_11F_11F_REV:
273 write11F_11F_10F_Channel(p, channel, col);
275 case GL_UNSIGNED_SHORT_4_4_4_4:
276 write4Channel<glw::GLushort, 4, 4, 4, 4, 12, 8, 4, 0>(p, channel, col);
278 case GL_UNSIGNED_SHORT_5_5_5_1:
279 write4Channel<glw::GLushort, 5, 5, 5, 1, 11, 6, 1, 0>(p, channel, col);
282 writeToSignedChannel<glw::GLint>(p, channel, col);
285 writeToHalfFloatChannel(p, channel, col);
288 writeToFloatChannel(p, channel, col);
291 TCU_FAIL("Invalid type");
296 template <typename T>
297 void TexImageUtils::writeToUnsignedChannel(glw::GLubyte *p, int channel, glw::GLdouble col)
299 static const T max = -1;
301 const glw::GLdouble d_max = (glw::GLdouble)max;
302 const glw::GLdouble d_value = col * d_max;
303 const T t_value = (T)d_value;
307 ptr[channel] = t_value;
310 template <typename T>
311 void TexImageUtils::writeToSignedChannel(glw::GLubyte *p, int channel, glw::GLdouble col)
313 static const T max = (T)((1u << (sizeof(T) * 8u - 1u)) - 1u);
315 const glw::GLdouble d_max = (glw::GLdouble)max;
316 const glw::GLdouble d_value = col * d_max;
317 const T t_value = (T)d_value;
321 ptr[channel] = t_value;
324 void TexImageUtils::writeToFloatChannel(glw::GLubyte *p, int channel, glw::GLdouble col)
326 const glw::GLfloat t_value = (glw::GLfloat)col;
328 glw::GLfloat *ptr = (glw::GLfloat*)p;
330 ptr[channel] = t_value;
333 void TexImageUtils::writeToHalfFloatChannel(glw::GLubyte *p, int channel, glw::GLdouble col)
335 deUint16* ptr = (deUint16*)p;
337 tcu::Float16 val(col);
339 ptr[channel] = val.bits();
342 template <typename T,
343 unsigned int size_1, unsigned int size_2, unsigned int size_3,
344 unsigned int off_1, unsigned int off_2, unsigned int off_3>
345 void TexImageUtils::write3Channel(glw::GLubyte *p, int channel, glw::GLdouble col)
353 const T max_1 = (1 << size_1) - 1;
354 const T max_2 = (1 << size_2) - 1;
355 const T max_3 = (1 << size_3) - 1;
375 TCU_FAIL("Invalid channel");
379 const glw::GLdouble d_max = (glw::GLdouble)max;
380 const glw::GLdouble d_value = col * d_max;
381 const T t_value = (T)d_value;
383 result = (T)((t_value & mask) << off);
388 template <typename T,
389 unsigned int size_1, unsigned int size_2,
390 unsigned int size_3, unsigned int size_4,
391 unsigned int off_1, unsigned int off_2,
392 unsigned int off_3, unsigned int off_4>
393 void TexImageUtils::write4Channel(glw::GLubyte *p, int channel, glw::GLdouble col)
401 T max_1 = (1 << size_1) - 1;
402 T max_2 = (1 << size_2) - 1;
403 T max_3 = (1 << size_3) - 1;
404 T max_4 = (1 << size_4) - 1;
429 TCU_FAIL("Invalid channel");
433 const glw::GLdouble d_max = (glw::GLdouble)max;
434 const glw::GLdouble d_value = col * d_max;
435 const T t_value = (T)d_value;
437 result = (T)((t_value & mask) << off);
442 void TexImageUtils::write11F_11F_10F_Channel(glw::GLubyte *p, int channel, glw::GLdouble col)
444 deUint32* ptr = (deUint32*)p;
450 tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> val(col);
451 deUint32 bits = val.bits();
458 tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> val(col);
459 deUint32 bits = val.bits();
461 *ptr |= (bits << 11);
466 tcu::Float<deUint32, 5, 5, 15, tcu::FLOAT_SUPPORT_DENORM> val(col);
467 deUint32 bits = val.bits();
469 *ptr |= (bits << 22);
473 TCU_FAIL("Invalid channel");
478 void TexImageUtils::setRefcolour (glu::CallLogWrapper gl, glw::GLdouble col)
486 gl.glUniform4f(gl.glGetUniformLocation(prog->getProgram(), "refcolour"),
487 m_num_channels > 0 ? col : 0.0f,
488 m_num_channels > 1 ? col : 0.0f,
489 m_num_channels > 2 ? col : 0.0f,
495 case GL_UNSIGNED_BYTE:
496 setUnsignedRefcolour<glw::GLubyte>(gl, col);
499 setSignedRefcolour<glw::GLubyte>(gl, col);
501 case GL_UNSIGNED_SHORT:
502 case GL_UNSIGNED_SHORT_5_6_5:
503 case GL_UNSIGNED_SHORT_4_4_4_4:
504 case GL_UNSIGNED_SHORT_5_5_5_1:
505 setUnsignedRefcolour<glw::GLushort>(gl, col);
508 setSignedRefcolour<glw::GLushort>(gl, col);
510 case GL_UNSIGNED_INT:
511 setUnsignedRefcolour<glw::GLuint>(gl, col);
513 case GL_UNSIGNED_INT_2_10_10_10_REV:
514 setRGB10A2Refcolour(gl, col);
517 setSignedRefcolour<glw::GLuint>(gl, col);
520 TCU_FAIL("Invalid type");
526 template <typename T>
527 void TexImageUtils::setUnsignedRefcolour (glu::CallLogWrapper gl, glw::GLdouble col)
529 static const T max = -1;
530 const glw::GLdouble d_max = (glw::GLdouble)max;
531 const glw::GLdouble d_value = d_max * col;
532 const T t_value = (T)d_value;
534 unsigned int refcol[4] =
536 m_num_channels > 0 ? t_value : 0u,
537 m_num_channels > 1 ? t_value : 0u,
538 m_num_channels > 2 ? t_value : 0u,
542 gl.glUniform4uiv(gl.glGetUniformLocation(prog->getProgram(), "refcolour"), 1,
546 template <typename T>
547 void TexImageUtils::setSignedRefcolour (glu::CallLogWrapper gl, glw::GLdouble col)
549 static const T umax = -1;
550 static const T max = umax >> 1;
552 const glw::GLdouble d_max = (glw::GLdouble)max;
553 const glw::GLdouble d_value = d_max * col;
554 const T t_value = (T)d_value;
558 (m_num_channels > 0 ? (int)t_value : 0),
559 (m_num_channels > 1 ? (int)t_value : 0),
560 (m_num_channels > 2 ? (int)t_value : 0),
564 gl.glUniform4iv(gl.glGetUniformLocation(prog->getProgram(), "refcolour"), 1,
568 void TexImageUtils::setRGB10A2Refcolour (glu::CallLogWrapper gl, glw::GLdouble col)
570 unsigned int max_channel_value = 1023u;
572 const glw::GLdouble d_max_channel_value = (glw::GLdouble)max_channel_value;
573 const glw::GLdouble d_value = (glw::GLdouble)d_max_channel_value * col;
574 unsigned int t_value = (unsigned int)d_value;
576 unsigned int refcol[4] =
578 (m_num_channels > 0 ? t_value : 0u),
579 (m_num_channels > 1 ? t_value : 0u),
580 (m_num_channels > 2 ? t_value : 0u),
584 gl.glUniform4uiv(gl.glGetUniformLocation(prog->getProgram(), "refcolour"), 1,
588 bool TexImageUtils::verify(tcu::Surface dst, tcu::Surface *errMask)
590 *errMask = tcu::Surface (dst.getWidth(), dst.getHeight());
591 tcu::clear(errMask->getAccess(), tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
594 for (int y = 0; y < dst.getHeight(); y++)
596 for (int x = 0; x < dst.getWidth(); x++)
598 if (dst.getPixel(x, y) != tcu::RGBA::green())
601 errMask->setPixel(x, y, tcu::RGBA::red());
609 class TexImage2DCase : public deqp::TestCase
610 , public sglr::ContextWrapper
611 , public TexImageUtils
614 TexImage2DCase (deqp::Context& context, const char* name, const char* desc,
615 deUint32 internalFormat,
616 int rect_w, int rect_h,
617 int subrect_x0, int subrect_y0,
618 int subrect_w, int subrect_h,
619 glu::GLSLVersion glsl_version);
620 ~TexImage2DCase (void);
621 IterateResult iterate (void);
623 void generateSrcData();
624 void createTexture (void);
625 void createShader (void);
626 tcu::Surface renderToSurf (void);
630 TexImage2DCase::TexImage2DCase (deqp::Context& context,
633 deUint32 internalFormat,
640 glu::GLSLVersion glsl_version)
641 : TestCase(context, name, desc)
642 , TexImageUtils(internalFormat,
644 subrect_x0, subrect_y0, 0,
645 subrect_w, subrect_h, 1,
650 TexImage2DCase::~TexImage2DCase(void)
654 TexImage2DCase::IterateResult TexImage2DCase::iterate(void)
656 glu::RenderContext& renderCtx = TestCase::m_context.getRenderContext();
657 tcu::TestLog& log = m_testCtx.getLog();
658 tcu::Surface dst, errMask;
662 sglr::GLContext gl_ctx (renderCtx,
664 sglr::GLCONTEXT_LOG_CALLS,
665 tcu::IVec4(0, 0, m_subcuboid_w, m_subcuboid_h));
667 setContext((sglr::Context*)&gl_ctx);
672 dst = renderToSurf();
674 pass = verify(dst, &errMask);
681 << tcu::TestLog::Message << "Image is valid" << tcu::TestLog::EndMessage
682 << tcu::TestLog::ImageSet("ImageVerification", "Image verification")
683 << tcu::TestLog::Image("Result", "Rendered result", dst.getAccess())
684 << tcu::TestLog::EndImageSet;
689 << tcu::TestLog::Message << "Image is invalid" << tcu::TestLog::EndMessage
690 << tcu::TestLog::ImageSet("ErrorVerification", "Image verification")
691 << tcu::TestLog::Image("Result", "Rendered result", dst.getAccess())
692 << tcu::TestLog::Image("ErrorMask", "Error mask", errMask.getAccess())
693 << tcu::TestLog::EndImageSet;
696 m_testCtx.setTestResult(pass ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
697 pass ? "Pass" : "Fail");
702 void TexImage2DCase::generateSrcData()
704 m_src_data = new glw::GLubyte[m_cuboid_w * m_cuboid_h * m_pixelsize]();
706 glw::GLdouble col = 0.0;
708 for (int y = 0; y < m_cuboid_h; y++)
710 for (int x = 0; x < m_cuboid_w; x++)
712 if (inrange(y, m_subcuboid_y0, m_subcuboid_y0 + m_subcuboid_h) &&
713 inrange(x, m_subcuboid_x0, m_subcuboid_x0 + m_subcuboid_w))
717 int offset = y * m_cuboid_w * m_pixelsize +
719 writePixel(m_src_data + offset, col);
724 void TexImage2DCase::createTexture (void)
726 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
729 gl.glGenTextures(1, &tex);
730 gl.glBindTexture(GL_TEXTURE_2D, tex);
731 gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
732 gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
734 gl.glPixelStorei(GL_UNPACK_ROW_LENGTH, m_cuboid_w);
735 gl.glPixelStorei(GL_UNPACK_SKIP_ROWS, m_subcuboid_y0);
736 gl.glPixelStorei(GL_UNPACK_SKIP_PIXELS, m_subcuboid_x0);
738 gl.glTexImage2D(GL_TEXTURE_2D,
748 gl.glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
749 gl.glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
750 gl.glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
753 void TexImage2DCase::createShader (void)
755 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
758 const tcu::StringTemplate vs_src (vs_template_src);
759 const tcu::StringTemplate fs_src (fs_template_src);
761 std::map<std::string,std::string> params;
762 params["GLSL_VERSION"] = getGLSLVersionDeclaration(m_glsl_version);
763 params["TEXCOORDS_TYPE"] = "vec2";
764 params["LAYER"] = "";
765 params["TEXCOORDS"] = "pos.xy";
766 params["CONDITION"] = "colour.rgb == refcolour.rgb";
773 case GL_RGBA_INTEGER:
779 params["SAMPLER_TYPE"] = "isampler2D";
780 params["COL_TYPE"] = "ivec4";
783 params["SAMPLER_TYPE"] = "usampler2D";
784 params["COL_TYPE"] = "uvec4";
789 params["SAMPLER_TYPE"] = "sampler2D";
790 params["COL_TYPE"] = "vec4";
794 prog = new glu::ShaderProgram(m_context.getRenderContext(),
795 glu::ProgramSources() <<
796 glu::VertexSource(vs_src.specialize(params)) <<
797 glu::FragmentSource(fs_src.specialize(params)));
802 << tcu::TestLog::Message << ""
803 << tcu::TestLog::EndMessage
804 << tcu::TestLog::ShaderProgram(false, "")
805 << tcu::TestLog::Shader(QP_SHADER_TYPE_VERTEX,
806 prog->getShaderInfo(glu::SHADERTYPE_VERTEX,
809 prog->getShaderInfo(glu::SHADERTYPE_VERTEX,
812 << tcu::TestLog::Shader(QP_SHADER_TYPE_FRAGMENT,
813 prog->getShaderInfo(glu::SHADERTYPE_FRAGMENT,
816 prog->getShaderInfo(glu::SHADERTYPE_FRAGMENT,
818 << tcu::TestLog::EndShaderProgram;
819 TCU_FAIL("Shader creation failed");
822 gl.glUseProgram(prog->getProgram());
823 gl.glUniform1i(gl.glGetUniformLocation(prog->getProgram(), "sampler"), 0);
826 tcu::Surface TexImage2DCase::renderToSurf (void)
828 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
830 gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
831 gl.glClear(GL_COLOR_BUFFER_BIT);
833 static const float vertexPositions[4*3] =
841 static const deUint16 indices[6] = { 0, 1, 2, 2, 1, 3 };
843 const glu::VertexArrayBinding attrBindings[] =
845 glu::va::Float("pos", 3, 4, 0, &vertexPositions[0])
848 gl.glViewport(0, 0, m_subcuboid_w, m_subcuboid_h);
849 setRefcolour(gl, 1.0);
850 glu::draw(m_context.getRenderContext(),
852 DE_LENGTH_OF_ARRAY(attrBindings),
854 glu::pr::Triangles(DE_LENGTH_OF_ARRAY(indices), &indices[0]));
857 dst.setSize(m_subcuboid_w, m_subcuboid_h);
859 glu::readPixels(m_context.getRenderContext(), 0, 0, dst.getAccess());
864 void TexImage2DCase::cleanup (void)
866 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
869 gl.glDeleteTextures(1, &tex);
874 class TexImage3DCase : public deqp::TestCase
875 , public sglr::ContextWrapper
876 , public TexImageUtils
879 TexImage3DCase (deqp::Context& context, const char* name, const char* desc,
880 deUint32 internalFormat,
881 int cuboid_w, int cuboid_h, int cuboid_d,
882 int subcuboid_x0, int subrect_y0, int subcuboid_z0,
883 int subcuboid_w, int subcuboid_h, int subcuboid_d,
884 glu::GLSLVersion glsl_version);
885 ~TexImage3DCase (void);
886 IterateResult iterate (void);
888 void generateSrcData();
889 void createTexture (void);
890 void createShader (void);
891 tcu::Surface renderToSurf (int layer);
895 TexImage3DCase::TexImage3DCase (deqp::Context& context,
898 deUint32 internalFormat,
908 glu::GLSLVersion glsl_version)
909 : TestCase(context, name, desc)
910 , TexImageUtils(internalFormat,
911 cuboid_w, cuboid_h, cuboid_d,
912 subcuboid_x0, subcuboid_y0, subcuboid_z0,
913 subcuboid_w, subcuboid_h, subcuboid_d,
918 TexImage3DCase::~TexImage3DCase(void)
922 TexImage3DCase::IterateResult TexImage3DCase::iterate(void)
924 glu::RenderContext& renderCtx = TestCase::m_context.getRenderContext();
925 tcu::TestLog& log = m_testCtx.getLog();
926 tcu::Surface dst, errMask;
930 sglr::GLContext gl_ctx (renderCtx,
932 sglr::GLCONTEXT_LOG_CALLS,
933 tcu::IVec4(0, 0, m_subcuboid_w, m_subcuboid_h));
935 setContext((sglr::Context*)&gl_ctx);
941 for (int z = 0; z < m_subcuboid_d; z++)
943 dst = renderToSurf(z);
945 bool layer_pass = verify(dst, &errMask);
950 << tcu::TestLog::Message << "Layer " << z << " is valid"
951 << tcu::TestLog::EndMessage
952 << tcu::TestLog::ImageSet("LayerVerification", "Layer verification")
953 << tcu::TestLog::Image("Result", "Rendered result", dst.getAccess())
954 << tcu::TestLog::EndImageSet;
959 << tcu::TestLog::Message << "Layer " << z << " is invalid"
960 << tcu::TestLog::EndMessage
961 << tcu::TestLog::ImageSet("ErrorVerification", "Layer verification")
962 << tcu::TestLog::Image("Result", "Rendered result", dst.getAccess())
963 << tcu::TestLog::Image("ErrorMask", "Error mask", errMask.getAccess())
964 << tcu::TestLog::EndImageSet;
975 << tcu::TestLog::Message << "Image is valid" << tcu::TestLog::EndMessage;
980 << tcu::TestLog::Message << "Image is invalid" << tcu::TestLog::EndMessage;
983 m_testCtx.setTestResult(pass ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
984 pass ? "Pass" : "Fail");
989 void TexImage3DCase::generateSrcData()
991 m_src_data = new glw::GLubyte[m_cuboid_w *
996 glw::GLdouble col = 0.0;
998 for (int z = 0; z < m_cuboid_d; z++)
1000 for (int y = 0; y < m_cuboid_h; y++)
1002 for (int x = 0; x < m_cuboid_w; x++)
1004 if (inrange(z, m_subcuboid_z0, m_subcuboid_z0 + m_subcuboid_d) &&
1005 inrange(y, m_subcuboid_y0, m_subcuboid_y0 + m_subcuboid_h) &&
1006 inrange(x, m_subcuboid_x0, m_subcuboid_x0 + m_subcuboid_w))
1007 col = 0.125 + (z - m_subcuboid_z0) * 0.125; /* [0.125, 0.250..1.0] */
1010 int offset = z * m_cuboid_h * m_cuboid_w * m_pixelsize +
1011 y * m_cuboid_w * m_pixelsize +
1013 writePixel(m_src_data + offset, col);
1019 void TexImage3DCase::createTexture (void)
1021 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1022 m_testCtx.getLog());
1024 gl.glGenTextures(1, &tex);
1025 gl.glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
1026 gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1027 gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1029 gl.glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, m_cuboid_h);
1030 gl.glPixelStorei(GL_UNPACK_ROW_LENGTH, m_cuboid_w);
1031 gl.glPixelStorei(GL_UNPACK_SKIP_IMAGES, m_subcuboid_z0);
1032 gl.glPixelStorei(GL_UNPACK_SKIP_ROWS, m_subcuboid_y0);
1033 gl.glPixelStorei(GL_UNPACK_SKIP_PIXELS, m_subcuboid_x0);
1035 gl.glTexImage3D(GL_TEXTURE_2D_ARRAY,
1046 gl.glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0);
1047 gl.glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
1048 gl.glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0);
1049 gl.glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
1050 gl.glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
1053 void TexImage3DCase::createShader (void)
1055 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1056 m_testCtx.getLog());
1058 const tcu::StringTemplate vs_src (vs_template_src);
1059 const tcu::StringTemplate fs_src (fs_template_src);
1061 std::map<std::string,std::string> params;
1062 params["GLSL_VERSION"] = getGLSLVersionDeclaration(m_glsl_version);
1063 params["TEXCOORDS_TYPE"] = "vec3";
1064 params["LAYER"] = "uniform int layer;";
1065 params["TEXCOORDS"] = "vec3(pos.xy, layer)";
1069 case GL_RED_INTEGER:
1071 case GL_RGB_INTEGER:
1072 case GL_RGBA_INTEGER:
1078 params["SAMPLER_TYPE"] = "isampler2DArray";
1079 params["COL_TYPE"] = "ivec4";
1080 params["CONDITION"] = "all(lessThan(uvec4(abs(colour - refcolour)).rgb, uvec3(2u)))";
1083 params["SAMPLER_TYPE"] = "usampler2DArray";
1084 params["COL_TYPE"] = "uvec4";
1085 params["CONDITION"] = "all(lessThan(uvec4(abs(ivec4(colour) - ivec4(refcolour))).rgb, uvec3(2u)))";
1090 const tcu::StringTemplate fs_condition ("all(lessThan((abs(colour - refcolour)).rgb, vec3(${EPS})))");
1091 std::map<std::string, std::string> fs_condition_params;
1092 fs_condition_params["EPS"] = std::to_string(getEps(m_internalFormat));
1093 params["SAMPLER_TYPE"] = "sampler2DArray";
1094 params["COL_TYPE"] = "vec4";
1095 params["CONDITION"] = fs_condition.specialize(fs_condition_params);
1099 prog = new glu::ShaderProgram(m_context.getRenderContext(),
1100 glu::ProgramSources() <<
1101 glu::VertexSource(vs_src.specialize(params)) <<
1102 glu::FragmentSource(fs_src.specialize(params)));
1107 << tcu::TestLog::Message << ""
1108 << tcu::TestLog::EndMessage
1109 << tcu::TestLog::ShaderProgram(false, "")
1110 << tcu::TestLog::Shader(QP_SHADER_TYPE_VERTEX,
1111 prog->getShaderInfo(glu::SHADERTYPE_VERTEX,
1114 prog->getShaderInfo(glu::SHADERTYPE_VERTEX,
1117 << tcu::TestLog::Shader(QP_SHADER_TYPE_FRAGMENT,
1118 prog->getShaderInfo(glu::SHADERTYPE_FRAGMENT,
1121 prog->getShaderInfo(glu::SHADERTYPE_FRAGMENT,
1123 << tcu::TestLog::EndShaderProgram;
1124 TCU_FAIL("Shader creation failed");
1127 gl.glUseProgram(prog->getProgram());
1128 gl.glUniform1i(gl.glGetUniformLocation(prog->getProgram(), "sampler"), 0);
1131 tcu::Surface TexImage3DCase::renderToSurf (int layer)
1133 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1134 m_testCtx.getLog());
1135 gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
1136 gl.glClear(GL_COLOR_BUFFER_BIT);
1138 static const float vertexPositions[4*3] =
1146 static const deUint16 indices[6] = { 0, 1, 2, 2, 1, 3 };
1148 const glu::VertexArrayBinding attrBindings[] =
1150 glu::va::Float("pos", 3, 4, 0, &vertexPositions[0])
1153 gl.glViewport(0, 0, m_subcuboid_w, m_subcuboid_h);
1155 gl.glUniform1i(gl.glGetUniformLocation(prog->getProgram(), "layer"), layer);
1156 glw::GLfloat refcol = 0.125 + layer * 0.125;
1157 setRefcolour(gl, refcol);
1158 glu::draw(m_context.getRenderContext(),
1160 DE_LENGTH_OF_ARRAY(attrBindings),
1162 glu::pr::Triangles(DE_LENGTH_OF_ARRAY(indices), &indices[0]));
1165 dst.setSize(m_subcuboid_w, m_subcuboid_h);
1167 glu::readPixels(m_context.getRenderContext(), 0, 0, dst.getAccess());
1172 void TexImage3DCase::cleanup (void)
1174 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1175 m_testCtx.getLog());
1177 gl.glDeleteTextures(1, &tex);
1178 delete[] m_src_data;
1182 class CompressedTexImageUtils
1185 CompressedTexImageUtils (deUint32 internalFormat,
1186 int cuboid_w, int cuboid_h, int cuboid_d,
1187 int subcuboid_x0, int subcuboid_y0, int subcuboid_z0,
1188 int subcuboid_w, int subcuboid_h, int subcuboid_d,
1189 glu::GLSLVersion glsl_version);
1190 ~CompressedTexImageUtils (void);
1192 int getImageSize (int width, int height, int depth);
1193 bool verify(tcu::Surface dst, tcu::Surface *errMask);
1195 glw::GLubyte *m_src_data;
1197 glu::ShaderProgram *prog;
1199 int m_bw; /* block width */
1200 int m_bh; /* block height */
1201 int m_bd; /* block depth */
1202 int m_bs; /* block size */
1204 deUint32 m_internalFormat;
1215 glu::GLSLVersion m_glsl_version;
1218 CompressedTexImageUtils::CompressedTexImageUtils (deUint32 internalFormat,
1228 glu::GLSLVersion glsl_version)
1229 : m_internalFormat(internalFormat)
1230 , m_cuboid_w(cuboid_w)
1231 , m_cuboid_h(cuboid_h)
1232 , m_cuboid_d(cuboid_d)
1233 , m_subcuboid_x0(subcuboid_x0)
1234 , m_subcuboid_y0(subcuboid_y0)
1235 , m_subcuboid_z0(subcuboid_z0)
1236 , m_subcuboid_w(subcuboid_w)
1237 , m_subcuboid_h(subcuboid_h)
1238 , m_subcuboid_d(subcuboid_d)
1239 , m_glsl_version(glsl_version)
1243 CompressedTexImageUtils::~CompressedTexImageUtils(void)
1247 int CompressedTexImageUtils::getImageSize (int width, int height, int depth)
1249 return (width / m_bw + (width % m_bw > 0)) *
1250 (height / m_bh + (height % m_bh > 0)) *
1251 (depth / m_bd + (depth % m_bd > 0)) *
1255 bool CompressedTexImageUtils::verify(tcu::Surface dst, tcu::Surface *errMask)
1257 *errMask = tcu::Surface (dst.getWidth(), dst.getHeight());
1258 tcu::clear(errMask->getAccess(), tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
1261 for (int y = 0; y < dst.getHeight(); y++)
1263 for (int x = 0; x < dst.getWidth(); x++)
1265 if (dst.getPixel(x, y) != tcu::RGBA::green())
1268 errMask->setPixel(x, y, tcu::RGBA::red());
1276 class CompressedTexImage2DCase : public deqp::TestCase
1277 , public sglr::ContextWrapper
1278 , public CompressedTexImageUtils
1281 CompressedTexImage2DCase (deqp::Context& context, const char *name, const char *desc,
1282 deUint32 internalFormat,
1283 int cuboid_w, int cuboid_h,
1284 int subcuboid_x0, int subcuboid_y0,
1285 int subcuboid_w, int subcuboid_h,
1286 glu::GLSLVersion glsl_version);
1287 ~CompressedTexImage2DCase (void);
1288 IterateResult iterate (void);
1290 void generateSrcData_s3tc (void);
1291 void generateSrcData_astc (void);
1292 void createTexture (void);
1293 void createShader (void);
1294 tcu::Surface renderToSurf (void);
1295 void cleanup (void);
1298 CompressedTexImage2DCase::CompressedTexImage2DCase (deqp::Context& context,
1301 deUint32 internalFormat,
1308 glu::GLSLVersion glsl_version)
1309 : TestCase(context, name, desc)
1310 , CompressedTexImageUtils(internalFormat,
1324 CompressedTexImage2DCase::~CompressedTexImage2DCase (void)
1328 CompressedTexImage2DCase::IterateResult CompressedTexImage2DCase::iterate (void)
1330 glu::RenderContext& renderCtx = TestCase::m_context.getRenderContext();
1331 const glu::ContextInfo& ctxInfo = m_context.getContextInfo();
1332 tcu::TestLog& log = m_testCtx.getLog();
1333 tcu::Surface dst, errMask;
1337 sglr::GLContext gl_ctx (renderCtx,
1339 sglr::GLCONTEXT_LOG_CALLS,
1340 tcu::IVec4(0, 0, m_subcuboid_w, m_subcuboid_h));
1342 setContext((sglr::Context*)&gl_ctx);
1344 switch (m_internalFormat)
1346 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1347 if (!ctxInfo.isExtensionSupported("GL_EXT_texture_compression_s3tc"))
1349 m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED,
1350 "GL_EXT_texture_compression_s3tc extension is not supported");
1359 generateSrcData_s3tc();
1361 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
1362 if (!ctxInfo.isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
1364 m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED,
1365 "GL_KHR_texture_compression_astc_ldr extension is not supported");
1373 generateSrcData_astc();
1376 TCU_FAIL("Invalid internal format");
1383 dst = renderToSurf();
1384 pass = verify(dst, &errMask);
1391 << tcu::TestLog::Message << "Image is valid" << tcu::TestLog::EndMessage
1392 << tcu::TestLog::ImageSet("ImageVerification", "Image verification")
1393 << tcu::TestLog::Image("Result", "Rendered result", dst.getAccess())
1394 << tcu::TestLog::EndImageSet;
1399 << tcu::TestLog::Message << "Image is invalid" << tcu::TestLog::EndMessage
1400 << tcu::TestLog::ImageSet("ErrorVerification", "Image verification")
1401 << tcu::TestLog::Image("Result", "Rendered result", dst.getAccess())
1402 << tcu::TestLog::Image("ErrorMask", "Error mask", errMask.getAccess())
1403 << tcu::TestLog::EndImageSet;
1406 m_testCtx.setTestResult(pass ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
1407 pass ? "Pass" : "Fail");
1412 void CompressedTexImage2DCase::generateSrcData_s3tc (void)
1414 deUint64 *src = new deUint64[m_cuboid_w / m_bw * m_cuboid_h / m_bh];
1418 for (int y = 0; y < m_cuboid_h; y += m_bh)
1420 for (int x = 0; x < m_cuboid_w; x += m_bw)
1422 if (inrange(x, m_subcuboid_x0, m_subcuboid_x0 + m_subcuboid_w) &&
1423 inrange(y, m_subcuboid_y0, m_subcuboid_y0 + m_subcuboid_h))
1431 int index = (y / m_bh) * (m_cuboid_w / m_bw) +
1437 m_src_data = (glw::GLubyte*)src;
1440 void CompressedTexImage2DCase::generateSrcData_astc (void)
1443 deUint64 mask = 0xfffffffffffffdfc;
1445 int img_size = 2 * (m_cuboid_w / m_bw + (m_cuboid_w % m_bw > 0)) *
1446 (m_cuboid_h / m_bh + (m_cuboid_h % m_bh > 0));
1448 deUint64 *src = new deUint64[img_size];
1450 for (int y = 0; y < m_cuboid_h; y += m_bh)
1452 for (int x = 0; x < m_cuboid_w; x += m_bw)
1454 if (inrange(x, m_subcuboid_x0, m_subcuboid_x0 + m_subcuboid_w) &&
1455 inrange(y, m_subcuboid_y0, m_subcuboid_y0 + m_subcuboid_h))
1457 col = 0xffffffffffffffff; /* (1.0, 1.0, 1.0) */
1461 col = 0x0; /* (0.0, 0.0, 0.0) */
1463 int index = (y / m_bh) * (m_cuboid_w / m_bw + (m_cuboid_w % m_bw > 0)) +
1465 src[2 * index] = mask;
1466 src[2 * index + 1] = col;
1470 m_src_data = (glw::GLubyte*)src;
1473 void CompressedTexImage2DCase::createTexture (void)
1475 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1476 m_testCtx.getLog());
1478 gl.glGenTextures(1, &tex);
1479 gl.glBindTexture(GL_TEXTURE_2D, tex);
1480 gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1481 gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1483 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_SIZE, m_bs);
1484 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_WIDTH, m_bw);
1485 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_HEIGHT, m_bh);
1487 gl.glPixelStorei(GL_UNPACK_ROW_LENGTH, m_cuboid_w);
1488 gl.glPixelStorei(GL_UNPACK_SKIP_ROWS, m_subcuboid_y0);
1489 gl.glPixelStorei(GL_UNPACK_SKIP_PIXELS, m_subcuboid_x0);
1491 gl.glCompressedTexImage2D(GL_TEXTURE_2D,
1497 getImageSize(m_subcuboid_w,
1502 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_SIZE, 0);
1503 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_WIDTH, 0);
1504 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_HEIGHT, 0);
1506 gl.glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
1507 gl.glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
1508 gl.glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
1511 void CompressedTexImage2DCase::createShader (void)
1513 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1514 m_testCtx.getLog());
1516 const tcu::StringTemplate vs_src (vs_template_src);
1517 const tcu::StringTemplate fs_src (fs_template_src);
1519 std::map<std::string,std::string> params;
1520 params["GLSL_VERSION"] = getGLSLVersionDeclaration(m_glsl_version);
1521 params["TEXCOORDS_TYPE"] = "vec2";
1522 params["LAYER"] = "";
1523 params["TEXCOORDS"] = "pos.xy";
1524 params["SAMPLER_TYPE"] = "sampler2D";
1525 params["COL_TYPE"] = "vec4";
1526 params["CONDITION"] = "colour.rgb == refcolour.rgb";
1528 prog = new glu::ShaderProgram(m_context.getRenderContext(),
1529 glu::ProgramSources() <<
1530 glu::VertexSource(vs_src.specialize(params)) <<
1531 glu::FragmentSource(fs_src.specialize(params)));
1536 << tcu::TestLog::Message << ""
1537 << tcu::TestLog::EndMessage
1538 << tcu::TestLog::ShaderProgram(false, "")
1539 << tcu::TestLog::Shader(QP_SHADER_TYPE_VERTEX,
1540 prog->getShaderInfo(glu::SHADERTYPE_VERTEX,
1543 prog->getShaderInfo(glu::SHADERTYPE_VERTEX,
1546 << tcu::TestLog::Shader(QP_SHADER_TYPE_FRAGMENT,
1547 prog->getShaderInfo(glu::SHADERTYPE_FRAGMENT,
1550 prog->getShaderInfo(glu::SHADERTYPE_FRAGMENT,
1552 << tcu::TestLog::EndShaderProgram;
1553 TCU_FAIL("Shader creation failed");
1556 gl.glUseProgram(prog->getProgram());
1557 gl.glUniform1i(gl.glGetUniformLocation(prog->getProgram(), "sampler"), 0);
1560 tcu::Surface CompressedTexImage2DCase::renderToSurf (void)
1562 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1563 m_testCtx.getLog());
1565 gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
1566 gl.glClear(GL_COLOR_BUFFER_BIT);
1568 static const float vertexPositions[4*3] =
1576 static const deUint16 indices[6] = { 0, 1, 2, 2, 1, 3 };
1578 const glu::VertexArrayBinding attrBindings[] =
1580 glu::va::Float("pos", 3, 4, 0, &vertexPositions[0])
1583 gl.glViewport(0, 0, m_subcuboid_w, m_subcuboid_h);
1585 glw::GLfloat refcol = 1.0f;
1587 gl.glUniform4f(gl.glGetUniformLocation(prog->getProgram(), "refcolour"),
1588 refcol, refcol, refcol, 1.0f);
1590 glu::draw(m_context.getRenderContext(),
1592 DE_LENGTH_OF_ARRAY(attrBindings),
1594 glu::pr::Triangles(DE_LENGTH_OF_ARRAY(indices), &indices[0]));
1597 dst.setSize(m_subcuboid_w, m_subcuboid_h);
1599 glu::readPixels(m_context.getRenderContext(), 0, 0, dst.getAccess());
1604 void CompressedTexImage2DCase::cleanup (void)
1606 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1607 m_testCtx.getLog());
1609 gl.glDeleteTextures(1, &tex);
1610 delete[] m_src_data;
1614 class CompressedTexImage3DCase : public deqp::TestCase
1615 , public sglr::ContextWrapper
1616 , public CompressedTexImageUtils
1619 CompressedTexImage3DCase (deqp::Context& context, const char *name, const char *desc,
1620 deUint32 internalFormat,
1621 int cuboid_w, int cuboid_h, int cuboid_d,
1622 int subcuboid_x0, int subcuboid_y0, int subcuboid_z0,
1623 int subcuboid_w, int subcuboid_h, int subcuboid_d,
1624 glu::GLSLVersion glsl_version);
1625 ~CompressedTexImage3DCase (void);
1626 IterateResult iterate (void);
1628 void generateSrcData_s3tc (void);
1629 void generateSrcData_astc (void);
1630 void createTexture (void);
1631 void createShader (void);
1632 tcu::Surface renderToSurf (int layer);
1633 void cleanup (void);
1636 CompressedTexImage3DCase::CompressedTexImage3DCase (deqp::Context& context,
1639 deUint32 internalFormat,
1649 glu::GLSLVersion glsl_version)
1650 : TestCase(context, name, desc)
1651 , CompressedTexImageUtils(internalFormat,
1665 CompressedTexImage3DCase::~CompressedTexImage3DCase (void)
1669 CompressedTexImage3DCase::IterateResult CompressedTexImage3DCase::iterate (void)
1671 glu::RenderContext& renderCtx = TestCase::m_context.getRenderContext();
1672 const glu::ContextInfo& ctxInfo = m_context.getContextInfo();
1673 tcu::TestLog& log = m_testCtx.getLog();
1674 tcu::Surface dst, errMask;
1678 sglr::GLContext gl_ctx (renderCtx,
1680 sglr::GLCONTEXT_LOG_CALLS,
1681 tcu::IVec4(0, 0, m_subcuboid_w, m_subcuboid_h));
1683 setContext((sglr::Context*)&gl_ctx);
1685 switch (m_internalFormat)
1687 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1688 if (!ctxInfo.isExtensionSupported("GL_EXT_texture_compression_s3tc"))
1690 m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED,
1691 "GL_EXT_texture_compression_s3tc extension is not supported");
1700 generateSrcData_s3tc();
1702 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
1703 if (!ctxInfo.isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
1705 m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED,
1706 "GL_KHR_texture_compression_astc_ldr extension is not supported");
1714 generateSrcData_astc();
1717 TCU_FAIL("Invalid internal format");
1724 for (int z = 0; z < m_subcuboid_d; z++)
1726 dst = renderToSurf(z);
1728 bool layer_pass = verify(dst, &errMask);
1733 << tcu::TestLog::Message << "Layer " << z << " is valid"
1734 << tcu::TestLog::EndMessage
1735 << tcu::TestLog::ImageSet("LayerVerification", "Layer verification")
1736 << tcu::TestLog::Image("Result", "Rendered result", dst.getAccess())
1737 << tcu::TestLog::EndImageSet;
1742 << tcu::TestLog::Message << "Layer " << z << " is invalid"
1743 << tcu::TestLog::EndMessage
1744 << tcu::TestLog::ImageSet("ErrorVerification", "Layer verification")
1745 << tcu::TestLog::Image("Result", "Rendered result", dst.getAccess())
1746 << tcu::TestLog::Image("ErrorMask", "Error mask", errMask.getAccess())
1747 << tcu::TestLog::EndImageSet;
1758 << tcu::TestLog::Message << "Image is valid" << tcu::TestLog::EndMessage;
1763 << tcu::TestLog::Message << "Image is invalid" << tcu::TestLog::EndMessage;
1766 m_testCtx.setTestResult(pass ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
1767 pass ? "Pass" : "Fail");
1772 void CompressedTexImage3DCase::generateSrcData_s3tc()
1774 deUint64 *src = new deUint64[m_cuboid_w / m_bw *
1778 deUint64 col_list[] =
1780 0x18E3, /* (0.125, 0.125, 0.125) */
1781 0x39E7, /* (0.250, 0.250, 0.250) */
1782 0x5AEB, /* (0.375, 0.375, 0.375) */
1783 0x7BEF, /* (0.500, 0.500, 0.500) */
1784 0x9CF3, /* (0.625, 0.625, 0.625) */
1785 0xBDF7, /* (0.750, 0.750, 0.750) */
1786 0xDEFB, /* (0.875, 0.875, 0.875) */
1787 0xffff, /* (1.000, 1.000, 1.000) */
1792 for (int z = 0; z < m_cuboid_d; z += m_bd)
1794 for (int y = 0; y < m_cuboid_h; y += m_bh)
1796 for (int x = 0; x < m_cuboid_w; x += m_bw)
1798 if (inrange(x, m_subcuboid_x0, m_subcuboid_x0 + m_subcuboid_w) &&
1799 inrange(y, m_subcuboid_y0, m_subcuboid_y0 + m_subcuboid_h) &&
1800 inrange(z, m_subcuboid_z0, m_subcuboid_z0 + m_subcuboid_d))
1801 col = col_list[z % 8];
1805 int index = (z / m_bd) * (m_cuboid_h / m_bh) * (m_cuboid_w / m_bw) +
1806 (y / m_bh) * (m_cuboid_w / m_bw) +
1813 m_src_data = (glw::GLubyte*)src;
1816 void CompressedTexImage3DCase::generateSrcData_astc (void)
1818 deUint64 col_list[] =
1820 0xffff1fff1fff1fff, /* (0.125, 0.125, 0.125) */
1821 0xffff3fff3fff3fff, /* (0.250, 0.250, 0.250) */
1822 0xffff5fff5fff5fff, /* (0.375, 0.375, 0.375) */
1823 0xffff7fff7fff7fff, /* (0.500, 0.500, 0.500) */
1824 0xffff9fff9fff9fff, /* (0.625, 0.625, 0.625) */
1825 0xffffbfffbfffbfff, /* (0.750, 0.750, 0.750) */
1826 0xffffdfffdfffdfff, /* (0.875, 0.875, 0.875) */
1827 0xffffffffffffffff, /* (1.000, 1.000, 1.000) */
1830 deUint64 mask = 0xFFFFFFFFFFFFFDFC;
1832 int img_size = 2 * (m_cuboid_w / m_bw + (m_cuboid_w % m_bw > 0)) *
1833 (m_cuboid_h / m_bh + (m_cuboid_h % m_bh > 0)) *
1834 (m_cuboid_d / m_bd + (m_cuboid_d % m_bd > 0));
1836 deUint64 *src = new deUint64[img_size];
1838 for (int z = 0; z < m_cuboid_d; z += m_bd)
1840 for (int y = 0; y < m_cuboid_h; y += m_bh)
1842 for (int x = 0; x < m_cuboid_w; x += m_bw)
1844 if (inrange(x, m_subcuboid_x0, m_subcuboid_x0 + m_subcuboid_w) &&
1845 inrange(y, m_subcuboid_y0, m_subcuboid_y0 + m_subcuboid_h) &&
1846 inrange(z, m_subcuboid_z0, m_subcuboid_z0 + m_subcuboid_d))
1847 col = col_list[z % 8];
1851 int index = (z / m_bd) * (m_cuboid_h / m_bh + (m_cuboid_h % m_bh > 0)) *
1852 (m_cuboid_w / m_bw + (m_cuboid_w % m_bw > 0)) +
1853 (y / m_bh) * (m_cuboid_w / m_bw + (m_cuboid_w % m_bw > 0)) +
1855 src[2 * index] = mask;
1856 src[2 * index + 1] = col;
1861 m_src_data = (glw::GLubyte*)src;
1864 void CompressedTexImage3DCase::createTexture (void)
1866 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1867 m_testCtx.getLog());
1869 gl.glGenTextures(1, &tex);
1870 gl.glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
1871 gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1872 gl.glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1874 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_SIZE, m_bs);
1875 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_WIDTH, m_bw);
1876 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_HEIGHT, m_bh);
1877 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_DEPTH, m_bd);
1879 gl.glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, m_cuboid_h);
1880 gl.glPixelStorei(GL_UNPACK_ROW_LENGTH, m_cuboid_w);
1881 gl.glPixelStorei(GL_UNPACK_SKIP_IMAGES, m_subcuboid_z0);
1882 gl.glPixelStorei(GL_UNPACK_SKIP_ROWS, m_subcuboid_y0);
1883 gl.glPixelStorei(GL_UNPACK_SKIP_PIXELS, m_subcuboid_x0);
1885 gl.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY,
1892 getImageSize(m_subcuboid_w,
1897 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_SIZE, 0);
1898 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_WIDTH, 0);
1899 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_HEIGHT, 0);
1900 gl.glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_DEPTH, 0);
1902 gl.glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0);
1903 gl.glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
1904 gl.glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0);
1905 gl.glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
1906 gl.glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
1909 void CompressedTexImage3DCase::createShader (void)
1911 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1912 m_testCtx.getLog());
1914 const tcu::StringTemplate vs_src (vs_template_src);
1915 const tcu::StringTemplate fs_src (fs_template_src);
1917 std::map<std::string,std::string> params;
1918 params["GLSL_VERSION"] = getGLSLVersionDeclaration(m_glsl_version);
1919 params["TEXCOORDS_TYPE"] = "vec3";
1920 params["LAYER"] = "uniform int layer;";
1921 params["TEXCOORDS"] = "vec3(pos.xy, layer)";
1922 params["SAMPLER_TYPE"] = "sampler2DArray";
1923 params["COL_TYPE"] = "vec4";
1925 const tcu::StringTemplate fs_condition ("all(lessThan((abs(colour - refcolour)).rgb, vec3(${EPS})))");
1926 std::map<std::string,std::string> fs_condition_params;
1927 fs_condition_params["EPS"] = std::to_string(getEps(m_internalFormat));
1928 params["CONDITION"] = fs_condition.specialize(fs_condition_params);
1930 prog = new glu::ShaderProgram(m_context.getRenderContext(),
1931 glu::ProgramSources() <<
1932 glu::VertexSource(vs_src.specialize(params)) <<
1933 glu::FragmentSource(fs_src.specialize(params)));
1938 << tcu::TestLog::Message << ""
1939 << tcu::TestLog::EndMessage
1940 << tcu::TestLog::ShaderProgram(false, "")
1941 << tcu::TestLog::Shader(QP_SHADER_TYPE_VERTEX,
1942 prog->getShaderInfo(glu::SHADERTYPE_VERTEX,
1945 prog->getShaderInfo(glu::SHADERTYPE_VERTEX,
1948 << tcu::TestLog::Shader(QP_SHADER_TYPE_FRAGMENT,
1949 prog->getShaderInfo(glu::SHADERTYPE_FRAGMENT,
1952 prog->getShaderInfo(glu::SHADERTYPE_FRAGMENT,
1954 << tcu::TestLog::EndShaderProgram;
1955 TCU_FAIL("Shader creation failed");
1958 gl.glUseProgram(prog->getProgram());
1959 gl.glUniform1i(gl.glGetUniformLocation(prog->getProgram(), "sampler"), 0);
1962 tcu::Surface CompressedTexImage3DCase::renderToSurf (int layer)
1964 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
1965 m_testCtx.getLog());
1967 gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
1968 gl.glClear(GL_COLOR_BUFFER_BIT);
1970 static const float vertexPositions[4*3] =
1978 static const deUint16 indices[6] = { 0, 1, 2, 2, 1, 3 };
1980 const glu::VertexArrayBinding attrBindings[] =
1982 glu::va::Float("pos", 3, 4, 0, &vertexPositions[0])
1985 gl.glViewport(0, 0, m_subcuboid_w, m_subcuboid_h);
1987 gl.glUniform1i(gl.glGetUniformLocation(prog->getProgram(), "layer"), layer);
1989 glw::GLfloat refcols[8] = { 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0 };
1990 glw::GLfloat refcol = refcols[(layer + m_subcuboid_z0 % 8) % 8];
1992 gl.glUniform4f(gl.glGetUniformLocation(prog->getProgram(), "refcolour"),
1993 refcol, refcol, refcol, 1.0f);
1995 glu::draw(m_context.getRenderContext(),
1997 DE_LENGTH_OF_ARRAY(attrBindings),
1999 glu::pr::Triangles(DE_LENGTH_OF_ARRAY(indices), &indices[0]));
2002 dst.setSize(m_subcuboid_w, m_subcuboid_h);
2004 glu::readPixels(m_context.getRenderContext(), 0, 0, dst.getAccess());
2009 void CompressedTexImage3DCase::cleanup (void)
2011 glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(),
2012 m_testCtx.getLog());
2014 gl.glDeleteTextures(1, &tex);
2015 delete[] m_src_data;
2019 PixelStorageModesTests::PixelStorageModesTests (deqp::Context& context,
2020 glu::GLSLVersion glsl_version)
2021 : TestCaseGroup(context, "pixelstoragemodes", "Pixel Storage Modes Tests")
2022 , m_glsl_version(glsl_version)
2026 PixelStorageModesTests::~PixelStorageModesTests (void)
2030 void PixelStorageModesTests::init(void)
2032 const int cuboid_w = 64;
2033 const int cuboid_h = 64;
2034 const int cuboid_d = 64;
2035 const int subcuboid_w = 32;
2036 const int subcuboid_h = 32;
2037 const int subcuboid_d = 8;
2042 deUint32 internalFmt;
2046 { "r8snorm", GL_R8_SNORM, },
2047 { "r16f", GL_R16F, },
2048 { "r32f", GL_R32F, },
2049 { "r8ui", GL_R8UI, },
2051 { "r16ui", GL_R16UI, },
2052 { "r16i", GL_R16I, },
2053 { "r32ui", GL_R32UI, },
2054 { "r32i", GL_R32I, },
2056 { "rg8snorm", GL_RG8_SNORM, },
2057 { "rg16f", GL_RG16F, },
2058 { "rg32f", GL_RG32F, },
2059 { "rg8ui", GL_RG8UI, },
2060 { "rg8i", GL_RG8I, },
2061 { "rg16ui", GL_RG16UI, },
2062 { "rg16i", GL_RG16I, },
2063 { "rg32ui", GL_RG32UI, },
2064 { "rg32i", GL_RG32I, },
2065 { "rgb8", GL_RGB8, },
2066 { "rgb565", GL_RGB565, },
2067 { "rgb8snorm", GL_RGB8_SNORM, },
2068 { "r11g11b10f", GL_R11F_G11F_B10F, },
2069 { "rgb16f", GL_RGB16F, },
2070 { "rgb32f", GL_RGB32F, },
2071 { "rgb8ui", GL_RGB8UI, },
2072 { "rgb8i", GL_RGB8I, },
2073 { "rgb16ui", GL_RGB16UI, },
2074 { "rgb16i", GL_RGB16I, },
2075 { "rgb32ui", GL_RGB32UI, },
2076 { "rgb32i", GL_RGB32I, },
2077 { "rgba8", GL_RGBA8, },
2078 { "rgba8snorm", GL_RGBA8_SNORM, },
2079 { "rgb5a1", GL_RGB5_A1, },
2080 { "rgba4", GL_RGBA4, },
2081 { "rgb10a2", GL_RGB10_A2, },
2082 { "rgba16f", GL_RGBA16F, },
2083 { "rgba32f", GL_RGBA32F, },
2084 { "rgba8ui", GL_RGBA8UI, },
2085 { "rgba8i", GL_RGBA8I, },
2086 { "rgb10a2ui", GL_RGB10_A2UI, },
2087 { "rgba16ui", GL_RGBA16UI, },
2088 { "rgba16i", GL_RGBA16I, },
2089 { "rgba32i", GL_RGBA32I, },
2090 { "rgba32ui", GL_RGBA32UI, },
2096 deUint32 internalFmt;
2100 } internalFmts_compressed[] =
2102 { "rgb_s3tc_dxt1", GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 1 },
2103 { "rgba_astc_8x5", GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 8, 5, 1 },
2106 tcu::TestCaseGroup* texImage2DGroup = new tcu::TestCaseGroup(m_testCtx,
2108 "glTexImage2D cases");
2109 addChild(texImage2DGroup);
2111 for (int fmts = 0; fmts < DE_LENGTH_OF_ARRAY(internalFmts); fmts++)
2113 tcu::TestCaseGroup* formatsGroup = new tcu::TestCaseGroup(m_testCtx,
2114 internalFmts[fmts].name,
2116 texImage2DGroup->addChild(formatsGroup);
2119 int skip_pixels[3] =
2120 { 0, bw, bw * (subcuboid_w / (2 * bw)) };
2122 { 0, bh, bh * (subcuboid_h / (2 * bh)) };
2124 for (int r = 0; r < 3; r++)
2126 for (int p = r; p < 3; p++)
2128 std::string skip_name =
2129 std::to_string(skip_pixels[p]) +
2131 std::to_string(skip_rows[r]);
2132 std::string skip_desc =
2134 std::to_string(skip_pixels[p]) +
2136 std::to_string(skip_rows[r]) +
2138 formatsGroup->addChild(new TexImage2DCase(m_context,
2141 internalFmts[fmts].internalFmt,
2153 tcu::TestCaseGroup* texImage3DGroup = new tcu::TestCaseGroup(m_testCtx,
2155 "glTexImage3D cases");
2156 addChild(texImage3DGroup);
2158 for (int fmts = 0; fmts < DE_LENGTH_OF_ARRAY(internalFmts); fmts++)
2160 tcu::TestCaseGroup* formatsGroup = new tcu::TestCaseGroup(m_testCtx,
2161 internalFmts[fmts].name,
2163 texImage3DGroup->addChild(formatsGroup);
2167 int skip_pixels[3] =
2168 { 0, bw, bw * (subcuboid_w / (2 * bw)) };
2170 { 0, bh, bh * (subcuboid_h / (2 * bh)) };
2171 int skip_images[3] =
2172 { 0, bd, bd * (subcuboid_d / (2 * bd)) };
2174 for (int i = 0; i < 3; i++)
2176 for (int r = i; r < 3; r++)
2178 for (int p = r; p < 3; p++)
2180 std::string skip_name =
2181 std::to_string(skip_pixels[p]) +
2183 std::to_string(skip_rows[r]) +
2185 std::to_string(skip_images[i]);
2186 std::string skip_desc =
2188 std::to_string(skip_pixels[p]) +
2190 std::to_string(skip_rows[r]) +
2192 std::to_string(skip_images[i]) +
2194 formatsGroup->addChild(new TexImage3DCase(m_context,
2197 internalFmts[fmts].internalFmt,
2213 if (!glu::isContextTypeES(m_context.getRenderContext().getType()))
2215 tcu::TestCaseGroup* compressedTexImage2DGroup =
2216 new tcu::TestCaseGroup(m_testCtx,
2217 "compressedteximage2d",
2218 "glCompressedTexImage2D cases");
2219 addChild(compressedTexImage2DGroup);
2221 for (int fmts = 0; fmts < DE_LENGTH_OF_ARRAY(internalFmts_compressed); fmts++)
2223 tcu::TestCaseGroup* formatsGroup
2224 = new tcu::TestCaseGroup(m_testCtx,
2225 internalFmts_compressed[fmts].name,
2227 compressedTexImage2DGroup->addChild(formatsGroup);
2228 int bw = internalFmts_compressed[fmts].bw;
2229 int bh = internalFmts_compressed[fmts].bh;
2230 int skip_pixels[4] =
2231 { 0, bw, bw * (subcuboid_w / (2 * bw)), bw * (subcuboid_w / bw) };
2233 { 0, bh, bh * (subcuboid_h / (2 * bh)), bh * (subcuboid_h / bh) };
2234 for (int r = 0; r < 4; r++)
2236 for (int p = 0; p < 4; p++)
2238 std::string skip_name =
2239 std::to_string(skip_pixels[p]) +
2241 std::to_string(skip_rows[r]);
2242 std::string skip_desc =
2244 std::to_string(skip_pixels[p]) +
2246 std::to_string(skip_rows[r]) +
2248 formatsGroup->addChild(new CompressedTexImage2DCase(
2252 internalFmts_compressed[fmts].internalFmt,
2264 tcu::TestCaseGroup* compressedTexImage3DGroup =
2265 new tcu::TestCaseGroup(m_testCtx,
2266 "compressedteximage3d",
2267 "glCompressedTexImage3D cases");
2268 addChild(compressedTexImage3DGroup);
2270 for (int fmts = 0; fmts < DE_LENGTH_OF_ARRAY(internalFmts_compressed); fmts++)
2272 tcu::TestCaseGroup* formatsGroup
2273 = new tcu::TestCaseGroup(m_testCtx,
2274 internalFmts_compressed[fmts].name,
2276 compressedTexImage3DGroup->addChild(formatsGroup);
2277 int bw = internalFmts_compressed[fmts].bw;
2278 int bh = internalFmts_compressed[fmts].bh;
2279 int bd = internalFmts_compressed[fmts].bd;
2280 int skip_pixels[4] =
2281 { 0, bw, bw * (subcuboid_w / (2 * bw)), bw * (subcuboid_w / bw) };
2283 { 0, bh, bh * (subcuboid_h / (2 * bh)), bh * (subcuboid_h / bh) };
2284 int skip_images[4] =
2285 { 0, bd, bd * (subcuboid_d / (2 * bd)), bd * (subcuboid_d / bd) };
2286 for (int i = 0; i < 4; i++)
2288 for (int r = 0; r < 4; r++)
2290 for (int p = 0; p < 4; p++)
2292 std::string skip_name =
2293 std::to_string(skip_pixels[p]) +
2295 std::to_string(skip_rows[r]) +
2297 std::to_string(skip_images[i]);
2298 std::string skip_desc =
2300 std::to_string(skip_pixels[p]) +
2302 std::to_string(skip_rows[r]) +
2304 std::to_string(skip_images[i]) +
2306 formatsGroup->addChild(new CompressedTexImage3DCase(
2310 internalFmts_compressed[fmts].internalFmt,
2328 } /* namespace glcts */