148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*------------------------------------------------------------------------- 248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite 348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ----------------------------- 448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2015-2016 The Khronos Group Inc. 648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License. 948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at 1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software 1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and 1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License. 1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*! 2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file 2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief 2284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/ 2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gl4cCopyImageTests.hpp" 2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluDefs.hpp" 2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluStrUtil.hpp" 2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwEnums.hpp" 2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwFunctions.hpp" 3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuFloat.hpp" 3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestLog.hpp" 3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <algorithm> 3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <iomanip> 3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <sstream> 3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deMath.h" 3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* There are far too much combinations specified for FunctionalTest. 4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Following flags controls what is enabled. Set as 1 to enable 4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * all test case from given category, 0 otherwise. 4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * By default everything is disabled - which still gives 14560 test cases. 4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_FORMAT - selects all internal formats, 61 x 61 4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_TARGETS - selects all valid targets, 10 x 10 4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_IMG_DIM - selects all image dimmensions, 9 x 9 4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_REG_DIM - selects all region dimmensions, 7 x 7 5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_REG_POS - selects all region positions, like left-top corner, 8 x 8 5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS 0 5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS 0 5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_IMG_DIM 0 5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_DIM 0 5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS 0 5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* The following flags controls if workarounds are enabled */ 5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_WRKARD_FORMATS 0 6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing namespace glw; 6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace gl4cts 6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace CopyImage 6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Various utilities used by all tests 6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass Utils 7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Routines */ 7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static bool areFormatsCompatible(glw::GLenum src, glw::GLenum dst); 7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static bool comparePixels(glw::GLenum left_internal_format, const glw::GLdouble& left_red, 7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::GLdouble& left_green, const glw::GLdouble& left_blue, 7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::GLdouble& left_alpha, glw::GLenum right_internal_format, 7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::GLdouble& right_red, const glw::GLdouble& right_green, 8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::GLdouble& right_blue, const glw::GLdouble& right_alpha); 8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static bool comparePixels(glw::GLuint left_pixel_size, const glw::GLubyte* left_pixel_data, 83412798dfb7d915b8eb765e7bc148c5e28677d0edJeannot Breton glw::GLuint right_pixel_size, const glw::GLubyte* right_pixel_data); 8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static void deleteTexture(deqp::Context& context, glw::GLenum target, glw::GLuint name); 8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static bool isTargetMultilayer(glw::GLenum target); 8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static bool isTargetMultilevel(glw::GLenum target); 8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static bool isTargetMultisampled(glw::GLenum target); 9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLuint generateTexture(deqp::Context& context, glw::GLenum target); 9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static void maskPixelForFormat(glw::GLenum internal_format, glw::GLubyte* pixel); 9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLdouble getEpsilon(glw::GLenum internal_format); 9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLuint getPixelSizeForFormat(glw::GLenum internal_format); 9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLenum getFormat(glw::GLenum internal_format); 9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLuint getNumberOfChannels(glw::GLenum internal_format); 9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static std::string getPixelString(glw::GLenum internal_format, const glw::GLubyte* pixel); 10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLenum getType(glw::GLenum internal_format); 10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static void makeTextureComplete(deqp::Context& context, glw::GLenum target, glw::GLuint id, glw::GLint base_level, 10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLint max_level); 10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLuint prepareCompressedTex(deqp::Context& context, glw::GLenum target, glw::GLenum internal_format); 10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLuint prepareMultisampleTex(deqp::Context& context, glw::GLenum target, glw::GLsizei n_samples); 10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLuint prepareRenderBuffer(deqp::Context& context, glw::GLenum internal_format); 11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLuint prepareTex16x16x6(deqp::Context& context, glw::GLenum target, glw::GLenum internal_format, 11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLenum format, glw::GLenum type, glw::GLuint& out_buf_id); 11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static void prepareTexture(deqp::Context& context, glw::GLuint name, glw::GLenum target, 11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLenum internal_format, glw::GLenum format, glw::GLenum type, glw::GLuint level, 11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLuint width, glw::GLuint height, glw::GLuint depth, const glw::GLvoid* pixels, 11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLuint& out_buf_id); 11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLenum transProxyToRealTarget(glw::GLenum target); 12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static glw::GLenum transRealToBindTarget(glw::GLenum target); 12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static void readChannel(glw::GLenum type, glw::GLuint channel, const glw::GLubyte* pixel, glw::GLdouble& out_value); 12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static void writeChannel(glw::GLenum type, glw::GLuint channel, glw::GLdouble value, glw::GLubyte* pixel); 12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static void packPixel(glw::GLenum internal_format, glw::GLenum type, glw::GLdouble red, glw::GLdouble green, 12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLdouble blue, glw::GLdouble alpha, glw::GLubyte* out_pixel); 12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static void unpackPixel(glw::GLenum format, glw::GLenum type, const glw::GLubyte* pixel, glw::GLdouble& out_red, 13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLdouble& out_green, glw::GLdouble& out_blue, glw::GLdouble& out_alpha); 13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static bool unpackAndComaprePixels(glw::GLenum left_format, glw::GLenum left_type, glw::GLenum left_internal_format, 13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::GLubyte* left_pixel, glw::GLenum right_format, glw::GLenum right_type, 13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLenum right_internal_format, const glw::GLubyte* right_pixel); 13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static inline bool roundComponent(glw::GLenum internal_format, glw::GLenum component, glw::GLdouble& value); 13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Global constants */ 14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLenum s_internal_formats[] = { 14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* R8 */ 14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_R8, GL_R8I, GL_R8UI, GL_R8_SNORM, 14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* R16 */ 14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_R16, GL_R16F, GL_R16I, GL_R16UI, GL_R16_SNORM, 14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* R32 */ 14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_R32F, GL_R32I, GL_R32UI, 15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RG8 */ 15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RG8, GL_RG8I, GL_RG8UI, GL_RG8_SNORM, 15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RG16 */ 15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RG16, GL_RG16F, GL_RG16I, GL_RG16UI, GL_RG16_SNORM, 15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RG32 */ 15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RG32F, GL_RG32I, GL_RG32UI, 15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGB8 */ 16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGB8, GL_RGB8I, GL_RGB8UI, GL_RGB8_SNORM, 16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGB16 */ 16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGB16, GL_RGB16F, GL_RGB16I, GL_RGB16UI, GL_RGB16_SNORM, 16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGB32 */ 16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGB32F, GL_RGB32I, GL_RGB32UI, 16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA8 */ 17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGBA8, GL_RGBA8I, GL_RGBA8UI, GL_RGBA8_SNORM, 17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA16 */ 17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGBA16, GL_RGBA16F, GL_RGBA16I, GL_RGBA16UI, GL_RGBA16_SNORM, 17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA32 */ 17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGBA32F, GL_RGBA32I, GL_RGBA32UI, 17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 8 */ 17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_R3_G3_B2, GL_RGBA2, 18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 12 */ 18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGB4, 18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 15 */ 18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGB5, 18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 16 */ 18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGBA4, GL_RGB5_A1, 18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 30 */ 19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGB10, 19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 32 */ 19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGB10_A2, GL_RGB10_A2UI, GL_R11F_G11F_B10F, GL_RGB9_E5, 19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 36 */ 19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGB12, 19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 48 */ 20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGBA12, 20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLenum s_invalid_targets[] = { 20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_BUFFER, 20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_CUBE_MAP_POSITIVE_X, 20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_1D, 21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_1D_ARRAY, 21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_2D, 21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_2D_ARRAY, 21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_2D_MULTISAMPLE, 21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY, 21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_3D, 21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_CUBE_MAP, 21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_CUBE_MAP_ARRAY, 22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_PROXY_TEXTURE_RECTANGLE, 22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLenum s_valid_targets[] = { 22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RENDERBUFFER, 22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_1D, 22648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_1D_ARRAY, 22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_2D, 22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_2D_ARRAY, 22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_2D_MULTISAMPLE, 23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_3D, 23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_CUBE_MAP, 23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_CUBE_MAP_ARRAY, 23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_TEXTURE_RECTANGLE, 23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLuint s_n_internal_formats = sizeof(s_internal_formats) / sizeof(s_internal_formats[0]); 23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLuint s_n_invalid_targets = sizeof(s_invalid_targets) / sizeof(s_invalid_targets[0]); 23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLuint s_n_valid_targets = sizeof(s_valid_targets) / sizeof(s_valid_targets[0]); 24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** 24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Pixel compatibility depends on pixel size. However value returned by getPixelSizeForFormat 24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * needs some refinements 24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of image 24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Size of pixel for compatibility checks 24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 24948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint getPixelSizeForCompatibilityVerification(GLenum internal_format) 25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint size = Utils::getPixelSizeForFormat(internal_format); 25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (internal_format) 25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA2: 25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 1; 25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return size; 26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS == 0 26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Filters out formats that should not be tested by FunctionalTest 26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param format Internal format 27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if format should be tested, false otherwise 27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool filterFormats(GLenum format) 27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = true; 27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (format) 27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* R8 */ 28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8I: 28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8UI: 28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8_SNORM: 28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* R16 */ 28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16: 28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16F: 28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16I: 28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16UI: 28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16_SNORM: 29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* R32 */ 29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32F: 29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32I: 29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32UI: 29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RG8 */ 29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8: 29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8I: 29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8UI: 30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8_SNORM: 30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RG16 */ 30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16: 30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16F: 30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16I: 30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16UI: 30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16_SNORM: 30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RG32 */ 31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32F: 31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32I: 31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32UI: 31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGB8 */ 31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8: 31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8I: 31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8UI: 31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8_SNORM: 31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGB16 */ 32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16: 32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16F: 32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16I: 32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16UI: 32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16_SNORM: 32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGB32 */ 32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32I: 32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32UI: 33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA8 */ 33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8: 33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8I: 33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8UI: 33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8_SNORM: 33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA16 */ 33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16: 33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16F: 34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16I: 34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16UI: 34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16_SNORM: 34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA32 */ 34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32F: 34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32I: 34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32UI: 34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = false; 34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = true; 35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return result; 35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS */ 36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Checks if two internal_formats are compatible 36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src Internal format of source image 36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst Internal format of destination image 36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true for compatible formats, false otherwise 36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::areFormatsCompatible(glw::GLenum src, glw::GLenum dst) 36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint dst_size = getPixelSizeForCompatibilityVerification(dst); 37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint src_size = getPixelSizeForCompatibilityVerification(src); 37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (dst_size != src_size) 37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS == 0 37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((false == filterFormats(src)) || (false == filterFormats(dst))) 38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS */ 38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (src != dst) 38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_R3_G3_B2 == dst) || (GL_R3_G3_B2 == src) || (GL_RGBA2 == dst) || (GL_RGBA2 == src) || 39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (GL_RGBA4 == dst) || (GL_RGBA4 == src) || (GL_RGB5_A1 == dst) || (GL_RGB5_A1 == src) || (GL_RGB10 == dst) || 39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (GL_RGB10 == src)) 39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_WRKARD_FORMATS 39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_RGB10_A2 == src) && (GL_R11F_G11F_B10F == dst) || (GL_RGB10_A2 == src) && (GL_RGB9_E5 == dst) || 40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (GL_RGB10_A2UI == src) && (GL_R11F_G11F_B10F == dst) || (GL_RGB10_A2UI == src) && (GL_RGB9_E5 == dst) || 40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (GL_RGB9_E5 == src) && (GL_RGB10_A2 == dst) || (GL_RGB9_E5 == src) && (GL_RGB10_A2UI == dst) || 40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (GL_R11F_G11F_B10F == src) && (GL_RGB10_A2 == dst) || (GL_R11F_G11F_B10F == src) && (GL_RGB10_A2UI == dst)) 40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_WRKARD_FORMATS */ 40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (2 == dst_size) 41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (src == dst) 41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (((GL_RGB4 == src) && (GL_RGB4 != dst)) || ((GL_RGB4 != src) && (GL_RGB4 == dst)) || 41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ((GL_RGB5 == src) && (GL_RGB5 != dst)) || ((GL_RGB5 != src) && (GL_RGB5 == dst))) 41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (4 == dst_size) 42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (src == dst) 42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Compare two pixels 43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_internal_format Internal format of left image 44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_red Red channel of left image 44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_green Green channel of left image 44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_blue Blue channel of left image 44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_alpha Alpha channel of left image 44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_internal_format Internal format of right image 44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_red Red channel of right image 44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_green Green channel of right image 44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_blue Blue channel of right image 44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_alpha Alpha channel of right image 45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if pixels match, false otherwise 45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::comparePixels(GLenum left_internal_format, const GLdouble& left_red, const GLdouble& left_green, 45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble& left_blue, const GLdouble& left_alpha, GLenum right_internal_format, 45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble& right_red, const GLdouble& right_green, const GLdouble& right_blue, 45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble& right_alpha) 45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_n_channels = getNumberOfChannels(left_internal_format); 45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_n_channels = getNumberOfChannels(right_internal_format); 46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_channels = (left_n_channels >= right_n_channels) ? right_n_channels : left_n_channels; 46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble left_channels[4] = { left_red, left_green, left_blue, left_alpha }; 46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble right_channels[4] = { right_red, right_green, right_blue, right_alpha }; 46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < n_channels; ++i) 46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble left = left_channels[i]; 46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble right = right_channels[i]; 47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble left_eps = getEpsilon(left_internal_format); 47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble right_eps = getEpsilon(right_internal_format); 47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble eps = fabs(std::max(left_eps, right_eps)); 47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (eps < fabs(left - right)) 47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Compare two pixels with memcmp 48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_pixel_size Size of left pixel 48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_pixel_data Data of left pixel 48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_pixel_size Size of right pixel 48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_pixel_data Data of right pixel 48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if memory match, false otherwise 49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::comparePixels(GLuint left_pixel_size, const GLubyte* left_pixel_data, GLuint right_pixel_size, 493412798dfb7d915b8eb765e7bc148c5e28677d0edJeannot Breton const GLubyte* right_pixel_data) 49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 49548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_size = (left_pixel_size >= right_pixel_size) ? left_pixel_size : right_pixel_size; 49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return 0 == memcmp(left_pixel_data, right_pixel_data, pixel_size); 49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Delete texture or renderbuffer 50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context 50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Image target 50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name Name of image 50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::deleteTexture(deqp::Context& context, GLenum target, GLuint name) 50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = context.getRenderContext().getFunctions(); 50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER == target) 51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 51248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteRenderbuffers(1, &name); 51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &name); 51748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 51848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 51948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 52048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get epsilon for given internal_format 52148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of image 52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Epsilon value 52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 52648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLdouble Utils::getEpsilon(GLenum internal_format) 52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble epsilon; 52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (internal_format) 53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8: 53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8_SNORM: 53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16: 53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16F: 53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16_SNORM: 53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32F: 53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8I: 53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8UI: 54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16I: 54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16UI: 54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32I: 54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32UI: 54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8: 54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8_SNORM: 54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16: 54748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16F: 54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16_SNORM: 54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32F: 55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8I: 55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8UI: 55248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16I: 55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16UI: 55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32I: 55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32UI: 55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R3_G3_B2: 55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB4: 55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5: 55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8: 56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8_SNORM: 56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R11F_G11F_B10F: 56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16: 56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16F: 56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16_SNORM: 56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32F: 56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8I: 56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8UI: 56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10: 56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16I: 57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16UI: 57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32I: 57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32UI: 57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB9_E5: 57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA2: 57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA4: 57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5_A1: 57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8: 57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8_SNORM: 57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2: 58048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16: 58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16F: 58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16_SNORM: 58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32F: 58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8I: 58548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8UI: 58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2UI: 58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16I: 58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16UI: 58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32I: 59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32UI: 59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos epsilon = 0.0; 59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB12: 59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA12: 59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos epsilon = 0.00390625; 59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 59848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 59948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 60048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 60148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 60248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return epsilon; 60348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 60448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 60548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get format for given internal format 60648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 60748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format 60848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 60948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Format 61048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 61148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLenum Utils::getFormat(GLenum internal_format) 61248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 61348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum format = 0; 61448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 61548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (internal_format) 61648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 61748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* R */ 61848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8: 61948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8_SNORM: 62048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16: 62148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16F: 62248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16_SNORM: 62348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32F: 62448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos format = GL_RED; 62548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 62648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 62748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8I: 62848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8UI: 62948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16I: 63048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16UI: 63148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32I: 63248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32UI: 63348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos format = GL_RED_INTEGER; 63448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 63548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 63648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RG */ 63748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8: 63848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8_SNORM: 63948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16: 64048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16F: 64148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16_SNORM: 64248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32F: 64348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos format = GL_RG; 64448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 64548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 64648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8I: 64748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8UI: 64848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16I: 64948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16UI: 65048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32I: 65148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32UI: 65248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos format = GL_RG_INTEGER; 65348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 65448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 65548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGB */ 65648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R3_G3_B2: 65748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB4: 65848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5: 65948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8: 66048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8_SNORM: 66148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R11F_G11F_B10F: 66248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB12: 66348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16: 66448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16F: 66548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16_SNORM: 66648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32F: 66748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB9_E5: 66848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos format = GL_RGB; 66948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 67048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 67148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8I: 67248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8UI: 67348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16I: 67448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16UI: 67548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32I: 67648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32UI: 67748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos format = GL_RGB_INTEGER; 67848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 67948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 68048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA */ 68148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10: 68248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA2: 68348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA4: 68448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5_A1: 68548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8: 68648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8_SNORM: 68748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2: 68848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA12: 68948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16: 69048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16F: 69148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16_SNORM: 69248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32F: 69348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos format = GL_RGBA; 69448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 69548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 69648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8I: 69748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8UI: 69848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2UI: 69948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16I: 70048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16UI: 70148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32I: 70248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32UI: 70348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos format = GL_RGBA_INTEGER; 70448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 70548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 70648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 70748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 70848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 70948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 71048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 71148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return format; 71248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 71348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 71448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get number of channels for given internal_format 71548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 71648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format 71748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 71848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Number of channels 71948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 72048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::getNumberOfChannels(GLenum internal_format) 72148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 72248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint result = 0; 72348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 72448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (internal_format) 72548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 72648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8: 72748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8_SNORM: 72848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16: 72948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16F: 73048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16_SNORM: 73148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32F: 73248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8I: 73348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8UI: 73448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16I: 73548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16UI: 73648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32I: 73748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32UI: 73848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = 1; 73948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 74048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 74148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8: 74248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8_SNORM: 74348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16: 74448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16F: 74548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16_SNORM: 74648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32F: 74748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8I: 74848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8UI: 74948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16I: 75048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16UI: 75148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32I: 75248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32UI: 75348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = 2; 75448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 75548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 75648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R3_G3_B2: 75748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB4: 75848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5: 75948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8: 76048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8_SNORM: 76148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10: 76248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R11F_G11F_B10F: 76348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB12: 76448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16: 76548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16F: 76648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16_SNORM: 76748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32F: 76848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB9_E5: 76948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8I: 77048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8UI: 77148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16I: 77248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16UI: 77348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32I: 77448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32UI: 77548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = 3; 77648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 77748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 77848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA2: 77948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA4: 78048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5_A1: 78148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8: 78248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8_SNORM: 78348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2: 78448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA12: 78548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16: 78648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16F: 78748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16_SNORM: 78848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32F: 78948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8I: 79048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8UI: 79148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2UI: 79248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16I: 79348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16UI: 79448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32I: 79548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32UI: 79648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = 4; 79748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 79848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 79948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 80048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 80148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 80248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 80348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 80448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return result; 80548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 80648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 80748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get type for given internal format 80848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 80948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format 81048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 81148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Type 81248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 81348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLenum Utils::getType(GLenum internal_format) 81448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 81548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum type = 0; 81648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 81748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (internal_format) 81848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 81948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8: 82048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8UI: 82148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8: 82248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8UI: 82348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8: 82448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8UI: 82548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8: 82648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8UI: 82748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_BYTE; 82848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 82948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 83048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8_SNORM: 83148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8I: 83248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8_SNORM: 83348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8I: 83448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8_SNORM: 83548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8I: 83648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8_SNORM: 83748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8I: 83848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_BYTE; 83948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 84048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 84148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R3_G3_B2: 84248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_BYTE_3_3_2; 84348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 84448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 84548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB4: 84648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5: 84748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_SHORT_5_6_5; 84848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 84948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 85048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA2: 85148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA4: 85248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_SHORT_4_4_4_4; 85348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 85448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 85548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5_A1: 85648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_SHORT_5_5_5_1; 85748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 85848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 85948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10: 86048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2: 86148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2UI: 86248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_INT_2_10_10_10_REV; 86348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 86448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 86548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16F: 86648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16F: 86748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16F: 86848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16F: 86948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_HALF_FLOAT; 87048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 87148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 87248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16: 87348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16UI: 87448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16: 87548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16UI: 87648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB12: 87748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16: 87848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16UI: 87948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA12: 88048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16: 88148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16UI: 88248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_SHORT; 88348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 88448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 88548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16_SNORM: 88648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16I: 88748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16_SNORM: 88848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16I: 88948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16_SNORM: 89048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16I: 89148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16_SNORM: 89248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16I: 89348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_SHORT; 89448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 89548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 89648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32UI: 89748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32UI: 89848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32UI: 89948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32UI: 90048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_INT; 90148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 90248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 90348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB9_E5: 90448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_INT_5_9_9_9_REV; 90548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 90648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 90748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32I: 90848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32I: 90948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32I: 91048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32I: 91148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_INT; 91248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 91348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 91448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32F: 91548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32F: 91648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32F: 91748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32F: 91848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_FLOAT; 91948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 92048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 92148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R11F_G11F_B10F: 92248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos type = GL_UNSIGNED_INT_10F_11F_11F_REV; 92348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 92448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 92548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 92648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 92748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 92848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 92948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 93048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return type; 93148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 93248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 93348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Returns mask that should be applied to pixel value 93448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 93548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of texture 93648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 93748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 93848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Mask 93948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 94048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::maskPixelForFormat(GLenum internal_format, GLubyte* pixel) 94148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 94248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (internal_format) 94348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 94448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10: 94548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* UINT_10_10_10_2 - ALPHA will be set to 3*/ 94648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixel[0] |= 0x03; 94748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 94848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 94948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 95048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 95148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 95248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 95348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 95448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get size of pixel for given internal format 95548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 95648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format 95748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 95848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Number of bytes used by given format 95948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 96048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::getPixelSizeForFormat(GLenum internal_format) 96148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 96248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint size = 0; 96348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 96448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (internal_format) 96548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 96648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 8 */ 96748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8: 96848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8I: 96948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8UI: 97048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8_SNORM: 97148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R3_G3_B2: 97248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 1; 97348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 97448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 97548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 8 */ 97648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA2: 97748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 2; 97848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 97948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 98048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 12 */ 98148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB4: 98248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 2; 98348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 98448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 98548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 15 */ 98648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5: 98748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 2; 98848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 98948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 99048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 16 */ 99148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8: 99248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8I: 99348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8UI: 99448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8_SNORM: 99548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16: 99648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16F: 99748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16I: 99848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16UI: 99948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16_SNORM: 100048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA4: 100148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5_A1: 100248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 2; 100348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 100448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 100548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 24 */ 100648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8: 100748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8I: 100848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8UI: 100948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8_SNORM: 101048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 3; 101148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 101248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 101348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 30 */ 101448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10: 101548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 4; 101648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 101748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 101848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 32 */ 101948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8: 102048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8I: 102148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8UI: 102248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8_SNORM: 102348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16: 102448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16F: 102548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16I: 102648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16UI: 102748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16_SNORM: 102848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32F: 102948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32I: 103048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32UI: 103148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2: 103248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2UI: 103348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R11F_G11F_B10F: 103448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB9_E5: 103548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 4; 103648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 103748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 103848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 36 */ 103948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB12: 104048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 6; 104148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 104248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 104348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 48 */ 104448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16: 104548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16F: 104648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16I: 104748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16UI: 104848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16_SNORM: 104948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 6; 105048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 105148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 105248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 64 */ 105348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA12: 105448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16: 105548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16F: 105648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16I: 105748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16UI: 105848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16_SNORM: 105948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32F: 106048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32I: 106148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32UI: 106248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 8; 106348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 106448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 106548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 96 */ 106648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32F: 106748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32I: 106848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32UI: 106948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 12; 107048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 107148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 107248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 128 */ 107348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32F: 107448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32I: 107548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32UI: 107648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = 16; 107748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 107848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 107948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 108048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 108148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 108248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 108348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 108448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return size; 108548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 108648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 108748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare string that represents bytes of pixel 108848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 108948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Format 109048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 109148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 109248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return String 109348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 109448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string Utils::getPixelString(GLenum internal_format, const GLubyte* pixel) 109548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 109648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_size = Utils::getPixelSizeForFormat(internal_format); 109748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::stringstream stream; 109848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 109948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos stream << "0x"; 110048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 110148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLint i = pixel_size - 1; i >= 0; --i) 110248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 110348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos stream << std::setbase(16) << std::setw(2) << std::setfill('0') << (GLuint)pixel[i]; 110448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 110548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 110648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return stream.str(); 110748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 110848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 110948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Check if target supports multiple layers 111048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 111148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Texture target 111248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 111348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if target is multilayered 111448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 111548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::isTargetMultilayer(GLenum target) 111648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 111748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 111848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 111948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (target) 112048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 112148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_1D_ARRAY: 112248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_ARRAY: 112348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 112448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_3D: 112548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_ARRAY: 112648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = true; 112748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 112848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 112948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 113048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 113148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 113248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 113348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return result; 113448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 113548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 113648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Check if target supports multiple level 113748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 113848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Texture target 113948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 114048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if target supports mipmaps 114148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 114248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::isTargetMultilevel(GLenum target) 114348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 114448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = true; 114548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 114648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (target) 114748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 114848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_MULTISAMPLE: 114948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 115048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_RECTANGLE: 115148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RENDERBUFFER: 115248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = false; 115348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 115448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 115548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 115648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 115748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 115848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return result; 115948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 116048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 116148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Check if target is multisampled 116248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 116348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Texture target 116448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 116548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true when for multisampled formats, false otherwise 116648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 116748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::isTargetMultisampled(GLenum target) 116848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 116948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 117048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 117148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (target) 117248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 117348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_MULTISAMPLE: 117448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 117548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = true; 117648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 117748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 117848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 117948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 118048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 118148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return result; 118248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 118348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 118448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Generate texture object 118548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 118648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context 118748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Target of texture 118848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 118948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Generated name 119048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 119148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosglw::GLuint Utils::generateTexture(deqp::Context& context, GLenum target) 119248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 119348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = context.getRenderContext().getFunctions(); 119448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint name = 0; 119548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 119648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (target) 119748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 119848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RENDERBUFFER: 119948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genRenderbuffers(1, &name); 120048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "GenRenderbuffers"); 120148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 120248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 120348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 120448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genTextures(1, &name); 120548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures"); 120648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 120748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 120848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 120948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return name; 121048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 121148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 121248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Sets base and max level parameters of texture to make it complete 121348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 121448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context 121548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target GLenum representing target of texture that should be created 121648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param id Id of texture 121748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param base_level Base level value, eg 0 121848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param max_level Max level value, eg 0 121948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 122048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::makeTextureComplete(deqp::Context& context, GLenum target, GLuint id, GLint base_level, GLint max_level) 122148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 122248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = context.getRenderContext().getFunctions(); 122348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 122448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER == target) 122548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 122648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return; 122748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 122848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 122948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Translate proxies into real targets */ 123048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = transRealToBindTarget(transProxyToRealTarget(target)); 123148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 123248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, id); 123348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 123448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 123548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set levels */ 123648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_TEXTURE_BUFFER != target) 123748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 123848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texParameteri(target, GL_TEXTURE_BASE_LEVEL, base_level); 123948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "TexParameteri"); 124048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 124148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texParameteri(target, GL_TEXTURE_MAX_LEVEL, max_level); 124248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "TexParameteri"); 1243fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke 1244fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke /* Integer textures won't be complete with the default min filter 1245fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke * of GL_NEAREST_MIPMAP_LINEAR (or GL_LINEAR for rectangle textures) 1246fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke * and default mag filter of GL_LINEAR, so switch to nearest. 1247fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke */ 1248fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke if (GL_TEXTURE_2D_MULTISAMPLE != target && GL_TEXTURE_2D_MULTISAMPLE_ARRAY != target) 1249fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke { 1250fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke gl.texParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1251fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke if (GL_TEXTURE_RECTANGLE != target) 1252fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke { 1253fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 1254fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke GLU_EXPECT_NO_ERROR(gl.getError(), "TexParameteri"); 1255fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke } 1256fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke else 1257fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke { 1258fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1259fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke GLU_EXPECT_NO_ERROR(gl.getError(), "TexParameteri"); 1260fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke } 1261fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke } 126248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 126348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 126448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean binding point */ 126548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, 0); 126648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 126748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 126848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 126948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Generate and initialize texture for given target 127048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 127148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context 127248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target GLenum representing target of texture that should be created 127348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param n_samples Number of samples 127448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 127548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return "name" of texture 127648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 127748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::prepareMultisampleTex(deqp::Context& context, GLenum target, GLsizei n_samples) 127848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 127948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint depth = 6; 128048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = context.getRenderContext().getFunctions(); 128148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint height = 16; 128248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLenum internal_format = GL_RGBA8; 128348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint name = 0; 128448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint width = 16; 128548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 128648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genTextures(1, &name); 128748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures"); 128848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 128948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Initialize */ 129048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (target) 129148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 129248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_MULTISAMPLE: 129348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, name); 129448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 129548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 129648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage2DMultisample(target, n_samples, internal_format, width, height, GL_FALSE /* fixedsamplelocation */); 129748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "TexImage2DMultisample"); 129848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 129948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 130048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 130148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 130248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, name); 130348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 130448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 130548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage3DMultisample(target, n_samples, internal_format, width, height, depth, 130648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_FALSE /* fixedsamplelocation */); 130748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "TexImage3DMultisample"); 130848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 130948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 131048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 131148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 131248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 131348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 131448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 131548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 131648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean binding point */ 131748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, 0); 131848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 131948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 132048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return name; 132148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 132248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 132348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Generate and initialize texture for given target 132448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 132548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context 132648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of render buffer 132748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 132848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return "name" of texture 132948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 133048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::prepareRenderBuffer(deqp::Context& context, GLenum internal_format) 133148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 133248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = context.getRenderContext().getFunctions(); 133348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint height = 16; 133448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint name = 0; 133548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint width = 16; 133648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 133748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genRenderbuffers(1, &name); 133848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "GenRenderbuffers"); 133948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 134048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Initialize */ 134148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindRenderbuffer(GL_RENDERBUFFER, name); 134248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderbuffer"); 134348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 134448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.renderbufferStorage(GL_RENDERBUFFER, internal_format, width, height); 134548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "RenderbufferStorage"); 134648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 134748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean binding point */ 134848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindRenderbuffer(GL_RENDERBUFFER, 0); 134948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderbuffer"); 135048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 135148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return name; 135248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 135348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 135448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Generate and initialize texture for given target 135548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 135648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context 135748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target GLenum representing target of texture that should be created 135848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format <internalformat> 135948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param format <format> 136048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type <type> 136148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_buf_id ID of buffer that will be used for TEXTURE_BUFFER 136248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 136348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return "name" of texture 136448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 136548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::prepareTex16x16x6(deqp::Context& context, GLenum target, GLenum internal_format, GLenum format, 136648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum type, GLuint& out_buf_id) 136748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 136848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint depth = 6; 136948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint height = 16; 137048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint level = 0; 137148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint name = 0; 137248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLchar* pixels = 0; 137348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint width = 16; 137448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 137548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos name = generateTexture(context, target); 137648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 137748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos prepareTexture(context, name, target, internal_format, format, type, level, width, height, depth, pixels, 137848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_buf_id); 137948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 138048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return name; 138148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 138248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 138348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initialize texture 138448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 138548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context 138648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name Name of texture object 138748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target GLenum representing target of texture that should be created 138848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format <internalformat> 138948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param format <format> 139048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type <type> 139148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param level <level> 139248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param width <width> 139348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param height <height> 139448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param depth <depth> 139548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels <pixels> 139648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_buf_id ID of buffer that will be used for TEXTURE_BUFFER 139748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 139848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return "name" of texture 139948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 140048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::prepareTexture(deqp::Context& context, GLuint name, GLenum target, GLenum internal_format, GLenum format, 140148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum type, GLuint level, GLuint width, GLuint height, GLuint depth, const GLvoid* pixels, 140248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint& out_buf_id) 140348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 140448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLint border = 0; 140548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = 0; 140648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLchar* function_name = "unknown"; 140748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = context.getRenderContext().getFunctions(); 140848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLsizei samples = 1; 140948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 141048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Translate proxies into real targets */ 141148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = transProxyToRealTarget(target); 141248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 141348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Initialize */ 141448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (target) 141548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 141648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RENDERBUFFER: 141748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindRenderbuffer(target, name); 141848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderbuffer"); 141948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 142048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.renderbufferStorage(target, internal_format, width, height); 142148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "RenderbufferStorage"); 142248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 142348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindRenderbuffer(target, 0); 142448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderbuffer"); 142548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 142648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 142748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 142848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_1D: 142948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, name); 143048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 143148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 143248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage1D(target, level, internal_format, width, border, format, type, pixels); 143348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 143448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos function_name = "TexImage1D"; 143548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 143648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 143748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 143848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_1D_ARRAY: 143948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D: 144048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_RECTANGLE: 144148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, name); 144248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 144348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 144448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 144548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage2D(target, level, internal_format, width, height, border, format, type, pixels); 144648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 144748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos function_name = "TexImage2D"; 144848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 144948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 145048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 145148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_MULTISAMPLE: 145248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, name); 145348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 145448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 145548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage2DMultisample(target, samples, internal_format, width, height, GL_FALSE /* fixedsamplelocation */); 145648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 145748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos function_name = "TexImage2DMultisample"; 145848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 145948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 146048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 146148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 146248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, name); 146348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 146448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 146548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage3DMultisample(target, samples, internal_format, width, height, depth, 146648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_FALSE /* fixedsamplelocation */); 146748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 146848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos function_name = "TexImage3DMultisample"; 146948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 147048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 147148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 147248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_2D_ARRAY: 147348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_3D: 147448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_ARRAY: 147548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, name); 147648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 147748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 147848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 147948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage3D(target, level, internal_format, width, height, depth, border, format, type, pixels); 148048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 148148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos function_name = "TexImage3D"; 148248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 148348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 148448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 148548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_BUFFER: 148648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genBuffers(1, &out_buf_id); 148748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "GenBuffers"); 148848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 148948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindBuffer(GL_TEXTURE_BUFFER, out_buf_id); 149048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindBuffer"); 149148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 149248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 149348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLsizei size = 16; 149448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLvoid* data = 0; 149548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 149648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != pixels) 149748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 149848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos size = width; 149948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos data = pixels; 150048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 150148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 150248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bufferData(GL_TEXTURE_BUFFER, size, data, GL_DYNAMIC_COPY); 150348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BufferData"); 150448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 150548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 150648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(GL_TEXTURE_BUFFER, name); 150748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 150848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 150948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texBuffer(GL_TEXTURE_BUFFER, internal_format, out_buf_id); 151048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "TexBuffer"); 151148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 151248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 151348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 151448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP: 151548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 151648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 151748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 151848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 151948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 152048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 152148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Change target to CUBE_MAP, it will be used later to change base and max level */ 152248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_CUBE_MAP; 152348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, name); 152448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 152548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 152648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, level, internal_format, width, height, border, format, type, 152748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixels); 152848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, level, internal_format, width, height, border, format, type, 152948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixels); 153048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, level, internal_format, width, height, border, format, type, 153148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixels); 153248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, level, internal_format, width, height, border, format, type, 153348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixels); 153448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, level, internal_format, width, height, border, format, type, 153548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixels); 153648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, level, internal_format, width, height, border, format, type, 153748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixels); 153848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 153948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos function_name = "TexImage2D"; 154048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 154148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 154248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 154348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 154448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 154548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 154648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 154748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 154848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_NO_ERROR != error) 154948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 155048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos context.getTestContext().getLog() 155148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Error: " << glu::getErrorStr(error) << ". Function: " << function_name 155248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Target: " << glu::getTextureTargetStr(target) 155348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Format: " << glu::getInternalFormatParameterStr(internal_format) << ", " 155448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << glu::getTextureFormatName(format) << ", " << glu::getTypeStr(type) << tcu::TestLog::EndMessage; 155548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Failed to create texture"); 155648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 155748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 155848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER != target) 155948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 156048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean binding point */ 156148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(target, 0); 156248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 156348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 156448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 156548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 156648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Translate proxies into real targets 156748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 156848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Target to be converted 156948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 157048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Converted target for proxies, <target> otherwise 157148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 157248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLenum Utils::transProxyToRealTarget(GLenum target) 157348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 157448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (target) 157548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 157648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_1D: 157748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_1D; 157848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 157948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_1D_ARRAY: 158048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_1D_ARRAY; 158148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 158248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_2D: 158348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_2D; 158448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 158548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_2D_ARRAY: 158648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_2D_ARRAY; 158748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 158848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_2D_MULTISAMPLE: 158948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_2D_MULTISAMPLE; 159048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 159148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY: 159248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_2D_MULTISAMPLE_ARRAY; 159348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 159448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_3D: 159548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_3D; 159648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 159748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_CUBE_MAP: 159848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_CUBE_MAP; 159948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 160048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_CUBE_MAP_ARRAY: 160148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_CUBE_MAP_ARRAY; 160248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 160348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_PROXY_TEXTURE_RECTANGLE: 160448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_RECTANGLE; 160548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 160648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 160748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 160848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 160948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 161048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return target; 161148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 161248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 161348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Translate real targets into binding targets 161448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 161548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Target to be converted 161648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 161748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Converted target for cube map faces, <target> otherwise 161848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 161948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLenum Utils::transRealToBindTarget(GLenum target) 162048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 162148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (target) 162248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 162348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 162448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_CUBE_MAP; 162548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 162648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 162748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_CUBE_MAP; 162848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 162948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 163048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_CUBE_MAP; 163148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 163248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 163348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_CUBE_MAP; 163448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 163548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 163648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_CUBE_MAP; 163748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 163848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 163948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos target = GL_TEXTURE_CUBE_MAP; 164048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 164148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 164248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 164348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 164448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 164548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return target; 164648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 164748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 164848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel 164948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 165048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store channel value 165148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 165248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 165348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 165448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value 165548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 165648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T> 165748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid readBaseTypeFromUnsignedChannel(GLuint channel, const GLubyte* pixel, GLdouble& out_value) 165848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 165948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max = -1; 166048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 166148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_max = (GLdouble)max; 166248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T* ptr = (T*)pixel; 166348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T t_value = ptr[channel]; 166448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = (GLdouble)t_value; 166548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 166648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_value = d_value / d_max; 166748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 166848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 166948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel 167048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 167148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store channel value 167248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 167348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 167448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 167548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value 167648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 167748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T> 167848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid readBaseTypeFromSignedChannel(GLuint channel, const GLubyte* pixel, GLdouble& out_value) 167948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 168048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_bytes = sizeof(T); 168148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_bits = 8u * n_bytes; 168248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max = (T)((1u << (n_bits - 1u)) - 1u); 168348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 168448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_max = (GLdouble)max; 168548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T* ptr = (T*)pixel; 168648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T t_value = ptr[channel]; 168748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = (GLdouble)t_value; 168848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 168948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_value = d_value / d_max; 169048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 169148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 169248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel 169348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 169448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store channel value 169548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 169648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 169748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 169848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value 169948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 170048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid readBaseTypeFromFloatChannel(GLuint channel, const GLubyte* pixel, GLdouble& out_value) 170148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 170248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLfloat* ptr = (const GLfloat*)pixel; 170348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLfloat t_value = ptr[channel]; 170448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = (GLdouble)t_value; 170548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 170648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_value = d_value; 170748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 170848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 170948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel 171048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 171148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store channel value 171248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 171348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 171448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 171548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value 171648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 171748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid readBaseTypeFromHalfFloatChannel(GLuint channel, const GLubyte* pixel, GLdouble& out_value) 171848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 171948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const deUint16* ptr = (const deUint16*)pixel; 172048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const deUint16 bits = ptr[channel]; 172148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Float16 val(bits); 172248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = val.asDouble(); 172348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 172448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_value = d_value; 172548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 172648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 172748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel 172848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 172948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store pixel 173048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_1 Size of channel in bits 173148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_2 Size of channel in bits 173248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_3 Size of channel in bits 173348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_1 Offset of channel in bits 173448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_2 Offset of channel in bits 173548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_3 Offset of channel in bits 173648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 173748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 173848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 173948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value 174048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 174148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T, unsigned int size_1, unsigned int size_2, unsigned int size_3, unsigned int off_1, 174248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unsigned int off_2, unsigned int off_3> 174348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid read3Channel(GLuint channel, const GLubyte* pixel, GLdouble& out_value) 174448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 174548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T mask = 0; 174648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T max = 0; 174748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T off = 0; 174848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T* ptr = (T*)pixel; 174948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T result = 0; 175048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T t_value = ptr[0]; 175148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 175248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_1 = (1 << size_1) - 1; 175348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_2 = (1 << size_2) - 1; 175448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_3 = (1 << size_3) - 1; 175548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 175648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (channel) 175748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 175848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 0: 175948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_1; 176048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_1; 176148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_1; 176248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 176348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 1: 176448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_2; 176548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_2; 176648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_2; 176748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 176848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 2: 176948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_3; 177048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_3; 177148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_3; 177248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 177348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 177448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid channel"); 177548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 177648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 177748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 177848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (T)((t_value >> off) & mask); 177948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 178048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_max = (GLdouble)max; 178148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = (GLdouble)result; 178248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 178348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_value = d_value / d_max; 178448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 178548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 178648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel 178748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 178848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store pixel 178948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_1 Size of channel in bits 179048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_2 Size of channel in bits 179148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_3 Size of channel in bits 179248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_4 Size of channel in bits 179348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_1 Offset of channel in bits 179448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_2 Offset of channel in bits 179548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_3 Offset of channel in bits 179648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_4 Offset of channel in bits 179748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 179848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 179948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 180048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value 180148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 180248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T, unsigned int size_1, unsigned int size_2, unsigned int size_3, unsigned int size_4, 180348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unsigned int off_1, unsigned int off_2, unsigned int off_3, unsigned int off_4> 180448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid read4Channel(GLuint channel, const GLubyte* pixel, GLdouble& out_value) 180548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 180648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T mask = 0; 180748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T max = 0; 180848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T off = 0; 180948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T* ptr = (T*)pixel; 181048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T result = 0; 181148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T t_value = ptr[0]; 181248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 181348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_1 = (1 << size_1) - 1; 181448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_2 = (1 << size_2) - 1; 181548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_3 = (1 << size_3) - 1; 181648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_4 = (1 << size_4) - 1; 181748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 181848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (channel) 181948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 182048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 0: 182148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_1; 182248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_1; 182348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_1; 182448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 182548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 1: 182648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_2; 182748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_2; 182848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_2; 182948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 183048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 2: 183148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_3; 183248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_3; 183348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_3; 183448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 183548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 3: 183648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_4; 183748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_4; 183848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_4; 183948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 184048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 184148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid channel"); 184248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 184348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 184448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 184548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (T)((t_value >> off) & mask); 184648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 184748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_max = (GLdouble)max; 184848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = (GLdouble)result; 184948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 185048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_value = d_value / d_max; 185148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 185248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 185348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel 185448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 185548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 185648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 185748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value 185848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 185948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid read11F_11F_10F_Channel(GLuint channel, const GLubyte* pixel, GLdouble& out_value) 186048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 186148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const deUint32* ptr = (deUint32*)pixel; 186248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 val = *ptr; 186348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 186448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (channel) 186548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 186648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 0: 186748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 186848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 bits = (val & 0x000007ff); 186948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> temp_val(bits); 187048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 187148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_value = temp_val.asDouble(); 187248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 187348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 187448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 1: 187548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 187648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 bits = ((val >> 11) & 0x000007ff); 187748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> temp_val(bits); 187848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 187948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_value = temp_val.asDouble(); 188048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 188148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 188248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 2: 188348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 188448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 bits = ((val >> 22) & 0x000003ff); 188548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Float<deUint32, 5, 5, 15, tcu::FLOAT_SUPPORT_DENORM> temp_val(bits); 188648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 188748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_value = temp_val.asDouble(); 188848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 188948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 189048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 189148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid channel"); 189248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 189348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 189448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 189548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 189648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel 189748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 189848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store pixel 189948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 190048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 190148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value Value to write 190248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 190348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 190448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T> 190548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid writeBaseTypeToUnsignedChannel(GLuint channel, GLdouble value, GLubyte* pixel) 190648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 190748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max = -1; 190848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 190948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_max = (GLdouble)max; 191048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = value * d_max; 191148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T t_value = (T)d_value; 191248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 191348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T* ptr = (T*)pixel; 191448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 191548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ptr[channel] = t_value; 191648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 191748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 191848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel 191948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 192048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store pixel 192148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 192248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 192348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value Value to write 192448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 192548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 192648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T> 192748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid writeBaseTypeToSignedChannel(GLuint channel, GLdouble value, GLubyte* pixel) 192848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 192948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_bytes = sizeof(T); 193048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_bits = 8u * n_bytes; 193148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max = (T)((1u << (n_bits - 1u)) - 1u); 193248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 193348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_max = (GLdouble)max; 193448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = value * d_max; 193548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T t_value = (T)d_value; 193648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 193748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T* ptr = (T*)pixel; 193848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 193948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ptr[channel] = t_value; 194048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 194148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 194248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel 194348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 194448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 194548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value Value to write 194648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 194748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 194848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid writeBaseTypeToFloatChannel(GLuint channel, GLdouble value, GLubyte* pixel) 194948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 195048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLfloat t_value = (GLfloat)value; 195148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 195248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat* ptr = (GLfloat*)pixel; 195348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 195448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ptr[channel] = t_value; 195548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 195648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 195748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel 195848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 195948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 196048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value Value to write 196148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 196248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 196348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid writeBaseTypeToHalfFloatChannel(GLuint channel, GLdouble value, GLubyte* pixel) 196448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 196548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint16* ptr = (deUint16*)pixel; 196648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 196748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Float16 val(value); 196848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 196948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ptr[channel] = val.bits(); 197048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 197148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 197248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel 197348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 197448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store pixel 197548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_1 Size of channel in bits 197648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_2 Size of channel in bits 197748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_3 Size of channel in bits 197848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_1 Offset of channel in bits 197948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_2 Offset of channel in bits 198048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_3 Offset of channel in bits 198148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 198248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 198348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value Value to write 198448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 198548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 198648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T, unsigned int size_1, unsigned int size_2, unsigned int size_3, unsigned int off_1, 198748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unsigned int off_2, unsigned int off_3> 198848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid write3Channel(GLuint channel, GLdouble value, GLubyte* pixel) 198948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 199048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T mask = 0; 199148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T max = 0; 199248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T off = 0; 199348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T* ptr = (T*)pixel; 199448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T result = 0; 199548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 199648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_1 = (1 << size_1) - 1; 199748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_2 = (1 << size_2) - 1; 199848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_3 = (1 << size_3) - 1; 199948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 200048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (channel) 200148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 200248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 0: 200348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_1; 200448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_1; 200548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_1; 200648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 200748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 1: 200848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_2; 200948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_2; 201048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_2; 201148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 201248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 2: 201348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_3; 201448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_3; 201548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_3; 201648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 201748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 201848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid channel"); 201948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 202048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 202148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 202248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_max = (GLdouble)max; 202348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = value * d_max; 202448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T t_value = (T)d_value; 202548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 202648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (T)((t_value & mask) << off); 202748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 202848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *ptr |= result; 202948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 203048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 203148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel 203248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 203348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store pixel 203448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_1 Size of channel in bits 203548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_2 Size of channel in bits 203648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_3 Size of channel in bits 203748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_4 Size of channel in bits 203848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_1 Offset of channel in bits 203948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_2 Offset of channel in bits 204048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_3 Offset of channel in bits 204148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_4 Offset of channel in bits 204248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 204348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 204448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value Value to write 204548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 204648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 204748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T, unsigned int size_1, unsigned int size_2, unsigned int size_3, unsigned int size_4, 204848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unsigned int off_1, unsigned int off_2, unsigned int off_3, unsigned int off_4> 204948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid write4Channel(GLuint channel, GLdouble value, GLubyte* pixel) 205048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 205148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T mask = 0; 205248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T max = 0; 205348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T off = 0; 205448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T* ptr = (T*)pixel; 205548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos T result = 0; 205648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 205748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_1 = (1 << size_1) - 1; 205848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_2 = (1 << size_2) - 1; 205948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_3 = (1 << size_3) - 1; 206048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const T max_4 = (1 << size_4) - 1; 206148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 206248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (channel) 206348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 206448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 0: 206548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_1; 206648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_1; 206748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_1; 206848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 206948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 1: 207048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_2; 207148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_2; 207248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_2; 207348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 207448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 2: 207548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_3; 207648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_3; 207748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_3; 207848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 207948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 3: 208048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mask = max_4; 208148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos max = max_4; 208248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos off = off_4; 208348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 208448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 208548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid channel"); 208648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 208748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 208848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 208948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_max = (GLdouble)max; 209048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble d_value = value * d_max; 209148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const T t_value = (T)d_value; 209248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 209348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (T)((t_value & mask) << off); 209448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 209548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *ptr |= result; 209648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 209748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 209848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel 209948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 210048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 210148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value Value to write 210248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 210348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 210448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid write11F_11F_10F_Channel(GLuint channel, GLdouble value, GLubyte* pixel) 210548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 210648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32* ptr = (deUint32*)pixel; 210748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 210848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (channel) 210948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 211048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 0: 211148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 211248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> val(value); 211348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 bits = val.bits(); 211448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 211548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *ptr |= bits; 211648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 211748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 211848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 1: 211948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 212048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> val(value); 212148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 bits = val.bits(); 212248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 212348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *ptr |= (bits << 11); 212448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 212548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 212648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case 2: 212748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 212848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Float<deUint32, 5, 5, 15, tcu::FLOAT_SUPPORT_DENORM> val(value); 212948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 bits = val.bits(); 213048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 213148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *ptr |= (bits << 22); 213248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 213348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 213448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 213548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid channel"); 213648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 213748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 213848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 213948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 214048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel 214148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 214248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type Type used by pixel 214348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 214448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 214548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value Read value 214648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 214748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::readChannel(GLenum type, GLuint channel, const GLubyte* pixel, GLdouble& value) 214848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 214948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (type) 215048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 215148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Base types */ 215248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_BYTE: 215348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readBaseTypeFromUnsignedChannel<GLubyte>(channel, pixel, value); 215448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 215548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_SHORT: 215648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readBaseTypeFromUnsignedChannel<GLushort>(channel, pixel, value); 215748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 215848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_INT: 215948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readBaseTypeFromUnsignedChannel<GLuint>(channel, pixel, value); 216048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 216148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_BYTE: 216248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readBaseTypeFromSignedChannel<GLbyte>(channel, pixel, value); 216348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 216448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_SHORT: 216548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readBaseTypeFromSignedChannel<GLshort>(channel, pixel, value); 216648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 216748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_INT: 216848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readBaseTypeFromSignedChannel<GLint>(channel, pixel, value); 216948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 217048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_HALF_FLOAT: 217148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readBaseTypeFromHalfFloatChannel(channel, pixel, value); 217248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 217348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_FLOAT: 217448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readBaseTypeFromFloatChannel(channel, pixel, value); 217548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 217648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 217748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Complicated */ 217848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 3 channles */ 217948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_BYTE_3_3_2: 218048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos read3Channel<GLubyte, 3, 3, 2, 5, 2, 0>(channel, pixel, value); 218148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 218248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_SHORT_5_6_5: 218348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos read3Channel<GLushort, 5, 6, 5, 11, 5, 0>(channel, pixel, value); 218448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 218548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 218648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 4 channels */ 218748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_SHORT_4_4_4_4: 218848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos read4Channel<GLushort, 4, 4, 4, 4, 12, 8, 4, 0>(channel, pixel, value); 218948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 219048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_SHORT_5_5_5_1: 219148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos read4Channel<GLushort, 5, 5, 5, 1, 11, 6, 1, 0>(channel, pixel, value); 219248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 219348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_INT_2_10_10_10_REV: 219448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos read4Channel<GLuint, 2, 10, 10, 10, 30, 20, 10, 0>(3 - channel, pixel, value); 219548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 219648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_INT_5_9_9_9_REV: 219748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos read4Channel<GLuint, 5, 9, 9, 9, 27, 18, 9, 0>(3 - channel, pixel, value); 219848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 219948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 220048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* R11F_G11F_B10F - uber complicated */ 220148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_INT_10F_11F_11F_REV: 220248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos read11F_11F_10F_Channel(channel, pixel, value); 220348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 220448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 220548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 220648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 220748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 220848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 220948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 221048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 221148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel 221248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 221348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type Type used by pixel 221448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index 221548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value Value to write 221648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 221748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 221848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::writeChannel(GLenum type, GLuint channel, GLdouble value, GLubyte* pixel) 221948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 222048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (type) 222148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 222248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Base types */ 222348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_BYTE: 222448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeBaseTypeToUnsignedChannel<GLubyte>(channel, value, pixel); 222548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 222648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_SHORT: 222748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeBaseTypeToUnsignedChannel<GLushort>(channel, value, pixel); 222848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 222948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_INT: 223048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeBaseTypeToUnsignedChannel<GLuint>(channel, value, pixel); 223148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 223248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_BYTE: 223348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeBaseTypeToSignedChannel<GLbyte>(channel, value, pixel); 223448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 223548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_SHORT: 223648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeBaseTypeToSignedChannel<GLshort>(channel, value, pixel); 223748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 223848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_INT: 223948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeBaseTypeToSignedChannel<GLint>(channel, value, pixel); 224048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 224148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_HALF_FLOAT: 224248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeBaseTypeToHalfFloatChannel(channel, value, pixel); 224348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 224448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_FLOAT: 224548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeBaseTypeToFloatChannel(channel, value, pixel); 224648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 224748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 224848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Complicated */ 224948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 225048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 3 channles */ 225148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_BYTE_3_3_2: 225248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos write3Channel<GLubyte, 3, 3, 2, 5, 2, 0>(channel, value, pixel); 225348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 225448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_SHORT_5_6_5: 225548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos write3Channel<GLushort, 5, 6, 5, 11, 5, 0>(channel, value, pixel); 225648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 225748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 225848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 4 channels */ 225948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_SHORT_4_4_4_4: 226048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos write4Channel<GLushort, 4, 4, 4, 4, 12, 8, 4, 0>(channel, value, pixel); 226148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 226248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_SHORT_5_5_5_1: 226348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos write4Channel<GLushort, 5, 5, 5, 1, 11, 6, 1, 0>(channel, value, pixel); 226448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 226548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_INT_2_10_10_10_REV: 226648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos write4Channel<GLuint, 2, 10, 10, 10, 30, 20, 10, 0>(3 - channel, value, pixel); 226748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 226848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_INT_5_9_9_9_REV: 226948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos write4Channel<GLuint, 5, 9, 9, 9, 27, 18, 9, 0>(3 - channel, value, pixel); 227048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 227148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 227248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* R11F_G11F_B10F - uber complicated */ 227348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_INT_10F_11F_11F_REV: 227448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos write11F_11F_10F_Channel(channel, value, pixel); 227548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 227648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 227748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 227848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 227948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 228048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 228148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 228248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 228348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Packs given channels to pixel 228448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 228548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of image 228648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type Type used by image 228748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param red Red channel 228848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param green Green channel 228948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param blue Blue channel 229048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param alpha Alpha channel 229148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixel Pixel data 229248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 229348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::packPixel(GLenum internal_format, GLenum type, GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha, 229448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* out_pixel) 229548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 229648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (internal_format) 229748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 229848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8: 229948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8_SNORM: 230048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16: 230148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16F: 230248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16_SNORM: 230348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32F: 230448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8I: 230548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R8UI: 230648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16I: 230748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R16UI: 230848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32I: 230948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R32UI: 231048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 0, red, out_pixel); 231148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 231248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 231348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8: 231448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8_SNORM: 231548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16: 231648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16F: 231748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16_SNORM: 231848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32F: 231948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8I: 232048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG8UI: 232148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16I: 232248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG16UI: 232348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32I: 232448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG32UI: 232548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 0, red, out_pixel); 232648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 1, green, out_pixel); 232748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 232848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 232948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R3_G3_B2: 233048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB4: 233148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5: 233248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8: 233348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8_SNORM: 233448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10: 233548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_R11F_G11F_B10F: 233648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB12: 233748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16: 233848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16F: 233948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16_SNORM: 234048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32F: 234148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8I: 234248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB8UI: 234348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16I: 234448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB16UI: 234548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32I: 234648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB32UI: 234748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 0, red, out_pixel); 234848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 1, green, out_pixel); 234948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 2, blue, out_pixel); 235048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 235148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 235248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB9_E5: 235348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA2: 235448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA4: 235548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB5_A1: 235648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8: 235748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8_SNORM: 235848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2: 235948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA12: 236048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16: 236148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16F: 236248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16_SNORM: 236348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32F: 236448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8I: 236548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA8UI: 236648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB10_A2UI: 236748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16I: 236848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA16UI: 236948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32I: 237048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA32UI: 237148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 0, red, out_pixel); 237248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 1, green, out_pixel); 237348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 2, blue, out_pixel); 237448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos writeChannel(type, 3, alpha, out_pixel); 237548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 237648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 237748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 237848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 237948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 238048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 238148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 238248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 238348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Unpacks channels from pixel 238448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 238548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of image 238648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type Type used by image 238748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel Pixel data 238848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param red Red channel 238948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param green Green channel 239048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param blue Blue channel 239148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param alpha Alpha channel 239248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 239348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::unpackPixel(GLenum format, GLenum type, const GLubyte* pixel, GLdouble& out_red, GLdouble& out_green, 239448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble& out_blue, GLdouble& out_alpha) 239548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 239648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (format) 239748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 239848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RED: 239948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RED_INTEGER: 240048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 0, pixel, out_red); 240148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_green = 1.0; 240248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_blue = 1.0; 240348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_alpha = 1.0; 240448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 240548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG: 240648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RG_INTEGER: 240748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 0, pixel, out_red); 240848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 1, pixel, out_green); 240948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_blue = 1.0; 241048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_alpha = 1.0; 241148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 241248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB: 241348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGB_INTEGER: 241448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (type) 241548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 241648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_UNSIGNED_INT_5_9_9_9_REV: 241748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 0, pixel, out_red); 241848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 1, pixel, out_green); 241948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 2, pixel, out_blue); 242048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 3, pixel, out_alpha); 242148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 242248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 242348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 0, pixel, out_red); 242448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 1, pixel, out_green); 242548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 2, pixel, out_blue); 242648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_alpha = 1.0; 242748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 242848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 242948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 243048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA: 243148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_RGBA_INTEGER: 243248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 0, pixel, out_red); 243348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 1, pixel, out_green); 243448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 2, pixel, out_blue); 243548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos readChannel(type, 3, pixel, out_alpha); 243648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 243748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 243848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Invalid enum"); 243948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 244048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 244148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 244248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 244348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosinline bool Utils::roundComponent(GLenum internal_format, GLenum component, GLdouble& value) 244448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 244548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int exponent = (internal_format == GL_RGB4 ? 4 : (internal_format == GL_RGB5 ? 5 : 0)); 244648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!exponent) 244748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; //Currently this only happens with GL_RGB4 and GL_RGB5 when stored as 565 type. 244848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 244948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int rounded_value = static_cast<int>(floor((pow(2, exponent) - 1) * value + 0.5)); 245048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int multiplier = (component == GL_GREEN ? 2 : 1); 245148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (internal_format == GL_RGB4) 245248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 245348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos multiplier *= 2; 245448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 245548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos value = rounded_value * multiplier; 245648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 245748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 245848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 245948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Unpacks pixels and compars them 246048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 246148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_format Format of left image 246248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_type Type of left image 246348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_internal_format Internal format of left image 246448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_pixel Data of left pixel 246548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_format Format of right image 246648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_type Type of right image 246748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_internal_format Internal format of right image 246848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_pixel Data of right pixel 246948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 247048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if pixels match, false otherwise 247148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 247248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::unpackAndComaprePixels(GLenum left_format, GLenum left_type, GLenum left_internal_format, 247348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* left_pixel, GLenum right_format, GLenum right_type, 247448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum right_internal_format, const GLubyte* right_pixel) 247548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 247648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble left_red; 247748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble left_green; 247848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble left_blue; 247948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble left_alpha; 248048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble right_red; 248148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble right_green; 248248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble right_blue; 248348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLdouble right_alpha; 248448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 248548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unpackPixel(left_format, left_type, left_pixel, left_red, left_green, left_blue, left_alpha); 248648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 248748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unpackPixel(right_format, right_type, right_pixel, right_red, right_green, right_blue, right_alpha); 248848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 248948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos roundComponent(left_internal_format, GL_RED, left_red); 249048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos roundComponent(left_internal_format, GL_GREEN, left_green); 249148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos roundComponent(left_internal_format, GL_BLUE, left_blue); 249248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 249348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos roundComponent(right_internal_format, GL_RED, right_red); 249448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos roundComponent(right_internal_format, GL_GREEN, right_green); 249548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos roundComponent(right_internal_format, GL_BLUE, right_blue); 249648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 249748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return comparePixels(left_internal_format, left_red, left_green, left_blue, left_alpha, right_internal_format, 249848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos right_red, right_green, right_blue, right_alpha); 249948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 250048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 250148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* FunctionalTest */ 250248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define FUNCTIONAL_TEST_N_LAYERS 12 250348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define FUNCTIONAL_TEST_N_LEVELS 3 250448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 250548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 250648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 250748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 250848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 250948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosFunctionalTest::FunctionalTest(deqp::Context& context) 251048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, "functional", "Test verifies CopySubImageData copy data as requested") 251148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_buf_name(0) 251248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 251348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_rb_name(0) 251448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_buf_name(0) 251548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 251648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 251748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 251848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src_tgt_id = 0; src_tgt_id < s_n_valid_targets; ++src_tgt_id) 251948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 252048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_target = s_valid_targets[src_tgt_id]; 252148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 252248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS == 0 252348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_TEXTURE_1D == src_target) || (GL_TEXTURE_1D_ARRAY == src_target) || (GL_TEXTURE_2D == src_target) || 252448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (GL_TEXTURE_CUBE_MAP == src_target) || (GL_TEXTURE_CUBE_MAP_ARRAY == src_target)) 252548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 252648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 252748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 252848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS == 0 */ 252948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 253048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst_tgt_id = 0; dst_tgt_id < s_n_valid_targets; ++dst_tgt_id) 253148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 253248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_target = s_valid_targets[dst_tgt_id]; 253348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 253448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS == 0 253548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_TEXTURE_1D == dst_target) || (GL_TEXTURE_1D_ARRAY == dst_target) || (GL_TEXTURE_2D == dst_target) || 253648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (GL_TEXTURE_CUBE_MAP == dst_target) || (GL_TEXTURE_CUBE_MAP_ARRAY == dst_target)) 253748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 253848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 253948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 254048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS == 0 */ 254148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 254248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip render buffer as destination */ 254348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER == dst_target) 254448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 254548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 254648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 254748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 254848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip multisampled */ 254948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((true == Utils::isTargetMultisampled(src_target)) || (true == Utils::isTargetMultisampled(dst_target))) 255048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 255148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 255248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 255348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 255448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src_frmt_id = 0; src_frmt_id < s_n_internal_formats; ++src_frmt_id) 255548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 255648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_format = s_internal_formats[src_frmt_id]; 255748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 255848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (src_format == GL_RGB9_E5 && src_target == GL_RENDERBUFFER) 255948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 256048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 256148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 256248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 256348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst_frmt_id = 0; dst_frmt_id < s_n_internal_formats; ++dst_frmt_id) 256448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 256548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_format = s_internal_formats[dst_frmt_id]; 256648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 256748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip not compatible formats */ 256848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == Utils::areFormatsCompatible(src_format, dst_format)) 256948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 257048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 257148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 257248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 257348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos prepareTestCases(dst_format, dst_target, src_format, src_target); 257448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 257548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 257648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 257748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 257848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 257948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 258048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 258148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 258248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 258348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 258448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult FunctionalTest::iterate() 258548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 258648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* dst_pixels[FUNCTIONAL_TEST_N_LEVELS] = { 0 }; 258748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 258848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 258948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 259048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* src_pixels[FUNCTIONAL_TEST_N_LEVELS] = { 0 }; 259148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 259248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 259348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.pixelStorei(GL_PACK_ALIGNMENT, 1); 259448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.pixelStorei(GL_UNPACK_ALIGNMENT, 1); 259548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "PixelStorei"); 259648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 259748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 259848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 259948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare pixels */ 260048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos prepareDstPxls(test_case.m_dst, dst_pixels); 260148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos prepareSrcPxls(test_case.m_src, test_case.m_dst.m_internal_format, src_pixels); 260248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 260348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 260448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = prepareTexture(test_case.m_dst, (const GLubyte**)dst_pixels, m_dst_buf_name); 260548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 260648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER == test_case.m_src.m_target) 260748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 260848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos targetDesc desc = test_case.m_src; 260948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos desc.m_target = GL_TEXTURE_2D; 261048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 261148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_rb_name = prepareTexture(test_case.m_src, (const GLubyte**)src_pixels, m_src_buf_name); 261248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = prepareTexture(desc, (const GLubyte**)src_pixels, m_src_buf_name); 261348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 261448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 261548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 261648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = prepareTexture(test_case.m_src, (const GLubyte**)src_pixels, m_src_buf_name); 261748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 261848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 261948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Copy images and verify results */ 262048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = copyAndVerify(test_case, (const GLubyte**)dst_pixels, (const GLubyte**)src_pixels); 262148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 262248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 262348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 262448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 262548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanPixels((GLubyte**)dst_pixels); 262648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanPixels((GLubyte**)src_pixels); 262748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 262848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 262948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 263048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Free resources */ 263148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 263248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanPixels((GLubyte**)dst_pixels); 263348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanPixels((GLubyte**)src_pixels); 263448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 263548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set result */ 263648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 263748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 263848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 263948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 264048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 264148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 264248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 264348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 264448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 264548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 264648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 264748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 264848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 264948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 265048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 265148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() << tcu::TestLog::Message << "Failure. " << tcu::TestLog::EndMessage; 265248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 265348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 265448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 265548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 265648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 265748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 265848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 265948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 266048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Calculate dimmensions of all levels based on size of specific level 266148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 266248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Target of image 266348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param level Level index 266448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param width Width of image at <level> 266548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param height Height of image at <level> 266648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_widths Calcualted widths, array of FUNCTIONAL_TEST_N_LEVELS'th elements 266748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_heights Calculated heights, array of FUNCTIONAL_TEST_N_LEVELS'th elements 266848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_depths Calculated dephts, array of FUNCTIONAL_TEST_N_LEVELS'th elements 266948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 267048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::calculateDimmensions(GLenum target, GLuint level, GLuint width, GLuint height, GLuint* out_widths, 267148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint* out_heights, GLuint* out_depths) const 267248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 267348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint divide = 100; 267448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint factors[FUNCTIONAL_TEST_N_LEVELS]; 267548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint factor = divide; 267648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const bool is_multi_layer = Utils::isTargetMultilayer(target); 267748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_layers = (true == is_multi_layer) ? FUNCTIONAL_TEST_N_LAYERS : 1; 267848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 267948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLint i = (GLint)level; i >= 0; --i) 268048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 268148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos factors[i] = factor; 268248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos factor *= 2; 268348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 268448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 268548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos factor = divide / 2; 268648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = level + 1; i < FUNCTIONAL_TEST_N_LEVELS; ++i) 268748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 268848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos factors[i] = factor; 268948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos factor /= 2; 269048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 269148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 269248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < FUNCTIONAL_TEST_N_LEVELS; ++i) 269348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 269448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_widths[i] = width * factors[i] / divide; 269548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_heights[i] = height * factors[i] / divide; 269648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 269748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_TEXTURE_3D == target) 269848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 269948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_depths[i] = FUNCTIONAL_TEST_N_LAYERS * factors[i] / divide; 270048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 270148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 270248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 270348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_depths[i] = n_layers; 270448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 270548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 270648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 270748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 270848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute copyImageSubData for given test case and verify results 270948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 271048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case Test case 271148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_pixels Data of destination image 271248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_pixels Data of source image 271348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 271448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if there is no error and results match expectations, false otherwise 271548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 271648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::copyAndVerify(const testCase& test_case, const GLubyte** dst_pixels, const GLubyte** src_pixels) 271748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 271848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 271948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 272048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint region_depth = 1; 272148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_layer_step = 0; 272248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const bool is_dst_multi_layer = Utils::isTargetMultilayer(test_case.m_dst.m_target); 272348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const bool is_src_multi_layer = Utils::isTargetMultilayer(test_case.m_src.m_target); 272448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 272548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint src_layer_step = 0; 272648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint n_layers = 1; 272748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 272848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Configure layers */ 272948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((true == is_dst_multi_layer) || (true == is_src_multi_layer)) 273048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 273148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (is_src_multi_layer == is_dst_multi_layer) 273248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 273348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Both objects are multilayered, copy all layers at once, verify at once */ 273448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos region_depth = FUNCTIONAL_TEST_N_LAYERS; 273548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 273648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (true == is_dst_multi_layer) 273748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 273848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Destination is multilayered, copy each layer separetly, verify at once */ 273948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos n_layers = FUNCTIONAL_TEST_N_LAYERS; 274048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_layer_step = 1; 274148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 274248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 274348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 274448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Destination is multilayered, copy and verify each layer separetly */ 274548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos n_layers = FUNCTIONAL_TEST_N_LAYERS; 274648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_layer_step = 1; 274748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 274848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 274948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 275048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Copy and verification */ 275148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 275248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_layer = 0; 275348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint src_layer = 0; 275448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 275548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* For each layer */ 275648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint layer = 0; layer < n_layers; ++layer) 275748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 275848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 == m_rb_name) 275948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 276048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_src.m_target, test_case.m_src.m_level, 276148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_x, test_case.m_src_y, src_layer, m_dst_tex_name, 276248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst.m_target, test_case.m_dst.m_level, test_case.m_dst_x, 276348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_y, dst_layer, test_case.m_width, test_case.m_height, region_depth); 276448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 276548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else /* Copy from src to rb and from rb to dst */ 276648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 276748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Src and rb shares differs only on target */ 276848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, GL_TEXTURE_2D, test_case.m_src.m_level, test_case.m_src_x, 276948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_y, src_layer, m_rb_name, test_case.m_src.m_target, 277048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src.m_level, test_case.m_src_x, test_case.m_src_y, src_layer, 277148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_width, test_case.m_height, region_depth); 277248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 277348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_rb_name, test_case.m_src.m_target, test_case.m_src.m_level, test_case.m_src_x, 277448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_y, src_layer, m_dst_tex_name, test_case.m_dst.m_target, 277548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst.m_level, test_case.m_dst_x, test_case.m_dst_y, dst_layer, 277648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_width, test_case.m_height, region_depth); 277748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 277848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 277948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 278048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 278148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 278248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_NO_ERROR == error) 278348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 278448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify copy results */ 278548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = verify(test_case, dst_layer, dst_pixels, src_layer, src_pixels, region_depth); 278648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 278748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 278848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_NO_ERROR != error) || (false == result)) 278948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 279048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 279148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message 279248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "Failure. Targets src: " << glu::getTextureTargetStr(test_case.m_src.m_target) 279348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", dst: " << glu::getTextureTargetStr(test_case.m_dst.m_target) 279448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Levels src: " << test_case.m_src.m_level << ", dst: " << test_case.m_dst.m_level 279548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Dimmensions src [" << test_case.m_src.m_width << ", " << test_case.m_src.m_height 279648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "], dst [" << test_case.m_dst.m_width << ", " << test_case.m_dst.m_height << "]. Region [" 279748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << test_case.m_width << " x " << test_case.m_height << " x " << region_depth << "] from [" 279848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << test_case.m_src_x << ", " << test_case.m_src_y << ", " << src_layer << "] to [" 279948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << test_case.m_dst_x << ", " << test_case.m_dst_y << ", " << dst_layer 280048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "]. Format src: " << glu::getInternalFormatParameterStr(test_case.m_src.m_internal_format) 280148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", dst: " << glu::getInternalFormatParameterStr(test_case.m_dst.m_internal_format) 280248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 280348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 280448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_NO_ERROR != error) 280548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 280648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() << tcu::TestLog::Message 280748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "Failed due to error: " << glu::getErrorStr(error) 280848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 280948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 281048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Copy operation failed"); 281148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 281248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 281348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 281448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 281548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 281648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Step one layer */ 281748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_layer += dst_layer_step; 281848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_layer += src_layer_step; 281948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 282048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 282148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 282248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 282348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 282448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 282548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 282648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 282748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 282848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::clean() 282948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 283048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 283148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 283248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 283348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_dst_tex_name); 283448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_src_tex_name); 283548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 283648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 283748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 283848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 283948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_dst_buf_name) 284048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 284148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_dst_buf_name); 284248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_buf_name = 0; 284348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 284448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 284548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_rb_name) 284648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 284748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteRenderbuffers(1, &m_rb_name); 284848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_rb_name = 0; 284948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 285048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 285148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_src_buf_name) 285248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 285348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_src_buf_name); 285448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_buf_name = 0; 285548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 285648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 285748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 285848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Free memory allocated for images 285948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 286048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels Array of pointers to image data 286148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 286248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::cleanPixels(GLubyte** pixels) const 286348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 286448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < FUNCTIONAL_TEST_N_LEVELS; ++i) 286548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 286648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != pixels[i]) 286748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 286848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos delete[] pixels[i]; 286948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixels[i] = 0; 287048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 287148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 287248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 287348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 287448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Compare two images 287548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_desc Descriptor of left image 287648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_data Data of left image 287748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_x X of left image 287848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_y Y of left image 287948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_layer Layer of left image 288048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_level Level of left image 288148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_desc Descriptor of right image 288248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_data Data of right image 288348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_x X of right image 288448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_y Y of right image 288548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_layer Layer of right image 288648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_level Level of right image 288748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param region_width Width of region to compare 288848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param region_height Height of region to compare 288948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 289048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if images are considered idenctial, false otherwise 289148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 289248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::compareImages(const targetDesc& left_desc, const GLubyte* left_data, GLuint left_x, GLuint left_y, 289348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint left_layer, GLuint left_level, const targetDesc& right_desc, 289448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::GLubyte* right_data, GLuint right_x, GLuint right_y, GLuint right_layer, 289548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint right_level, GLuint region_width, GLuint region_height) const 289648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 289748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Get level dimmensions */ 289848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint left_heights[FUNCTIONAL_TEST_N_LEVELS]; 289948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint left_widths[FUNCTIONAL_TEST_N_LEVELS]; 290048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint left_depths[FUNCTIONAL_TEST_N_LEVELS]; 290148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint right_heights[FUNCTIONAL_TEST_N_LEVELS]; 290248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint right_widths[FUNCTIONAL_TEST_N_LEVELS]; 290348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint right_depths[FUNCTIONAL_TEST_N_LEVELS]; 290448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 290548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos calculateDimmensions(left_desc.m_target, left_desc.m_level, left_desc.m_width, left_desc.m_height, left_widths, 290648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos left_heights, left_depths); 290748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 290848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos calculateDimmensions(right_desc.m_target, right_desc.m_level, right_desc.m_width, right_desc.m_height, right_widths, 290948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos right_heights, right_depths); 291048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 291148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Constants */ 291248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Dimmensions */ 291348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_height = left_heights[left_level]; 291448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_width = left_widths[left_level]; 291548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_height = right_heights[right_level]; 291648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_width = right_widths[right_level]; 291748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Sizes */ 291848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_pixel_size = Utils::getPixelSizeForFormat(left_desc.m_internal_format); 291948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_line_size = left_pixel_size * left_width; 292048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_layer_size = left_line_size * left_height; 292148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_pixel_size = Utils::getPixelSizeForFormat(right_desc.m_internal_format); 292248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_line_size = right_pixel_size * right_width; 292348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_layer_size = right_line_size * right_height; 292448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 292548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Offsets */ 292648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_layer_offset = left_layer_size * left_layer; 292748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_reg_line_offset = left_line_size * left_y; 292848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_reg_pix_offset = left_pixel_size * left_x; 292948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_layer_offset = right_layer_size * right_layer; 293048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_reg_line_offset = right_line_size * right_y; 293148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_reg_pix_offset = right_pixel_size * right_x; 293248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 293348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Pointers */ 293448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* left_layer_data = left_data + left_layer_offset; 293548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* right_layer_data = right_data + right_layer_offset; 293648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 293748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* For each line of region */ 293848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint y = 0; y < region_height; ++y) 293948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 294048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Offsets */ 294148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_line_offset = left_reg_line_offset + y * left_line_size; 294248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_line_offset = right_reg_line_offset + y * right_line_size; 294348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 294448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Pointers */ 294548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* left_line_data = left_layer_data + left_line_offset; 294648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* right_line_data = right_layer_data + right_line_offset; 294748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 294848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* For each pixel of region */ 294948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint x = 0; x < region_width; ++x) 295048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 295148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Offsets */ 295248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint left_pixel_offset = left_reg_pix_offset + x * left_pixel_size; 295348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint right_pixel_offset = right_reg_pix_offset + x * right_pixel_size; 295448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 295548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Pointers */ 295648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* left_pixel_data = left_line_data + left_pixel_offset; 295748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* right_pixel_data = right_line_data + right_pixel_offset; 295848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 295948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Compare */ 2960412798dfb7d915b8eb765e7bc148c5e28677d0edJeannot Breton if (false == Utils::comparePixels(left_pixel_size, left_pixel_data, right_pixel_size, right_pixel_data)) 296148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 296248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == Utils::unpackAndComaprePixels(left_desc.m_format, left_desc.m_type, 296348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos left_desc.m_internal_format, left_pixel_data, 296448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos right_desc.m_format, right_desc.m_type, 296548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos right_desc.m_internal_format, right_pixel_data)) 296648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 296748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 296848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Not matching pixels found. Left: [" << x + left_x << ", " 296948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << y + left_y << ", " << left_layer << "] lvl:" << left_level 297048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", off: " << left_pixel_data - left_data 297148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", data: " << Utils::getPixelString(left_desc.m_internal_format, left_pixel_data) 297248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Right: [" << x + right_x << ", " << y + right_y << ", " << right_layer 297348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "] lvl: " << right_level << ", off: " << right_pixel_data - right_data 297448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", data: " << Utils::getPixelString(right_desc.m_internal_format, right_pixel_data) 297548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 297648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 297748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 297848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 297948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 298048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 298148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 298248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 298348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 298448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 298548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 298648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare regions that should not be modified during test case 298748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 298848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case Test case descriptor 298948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_level Level of destination image 299048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_regions Number of regions 299148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_n_regions Regions 299248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 299348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::getCleanRegions(const testCase& test_case, GLuint dst_level, GLuint out_regions[4][4], 299448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint& out_n_regions) const 299548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 299648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_heights[FUNCTIONAL_TEST_N_LEVELS]; 299748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_widths[FUNCTIONAL_TEST_N_LEVELS]; 299848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_depths[FUNCTIONAL_TEST_N_LEVELS]; 299948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 300048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_n_regions = 0; 300148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 300248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos calculateDimmensions(test_case.m_dst.m_target, dst_level, test_case.m_dst.m_width, test_case.m_dst.m_height, 300348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_widths, dst_heights, dst_depths); 300448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 300548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Constants */ 300648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Copied region */ 300748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint reg_x = test_case.m_dst_x; 300848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint reg_y = test_case.m_dst_y; 300948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint reg_w = test_case.m_width; 301048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint reg_h = test_case.m_height; 301148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint reg_r = reg_x + reg_w; 301248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint reg_t = reg_y + reg_h; 301348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 301448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Image */ 301548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint img_w = dst_widths[dst_level]; 301648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint img_h = dst_heights[dst_level]; 301748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 301848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Bottom row */ 301948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != reg_y) 302048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 302148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][0] = 0; 302248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][1] = 0; 302348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][2] = img_w; 302448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][3] = reg_y; 302548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_n_regions += 1; 302648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 302748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 302848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Left edge */ 302948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != reg_x) 303048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 303148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][0] = 0; 303248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][1] = reg_y; 303348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][2] = reg_x; 303448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][3] = reg_h; 303548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_n_regions += 1; 303648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 303748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 303848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Right edge */ 303948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (img_w != reg_r) 304048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 304148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][0] = reg_r; 304248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][1] = reg_y; 304348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][2] = img_w - reg_r; 304448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][3] = reg_h; 304548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_n_regions += 1; 304648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 304748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 304848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Top row */ 304948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (img_h != reg_t) 305048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 305148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][0] = 0; 305248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][1] = reg_t; 305348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][2] = img_w; 305448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_regions[out_n_regions][3] = img_h - reg_t; 305548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_n_regions += 1; 305648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 305748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 305848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 305948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get pixel data for image 306048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 306148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name Name of image 306248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc Descriptor of image 306348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param level Level to capture 306448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Pixels 306548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 306648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::getPixels(GLuint name, const targetDesc& desc, GLuint level, GLubyte* out_pixels) const 306748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 306848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 306948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 307048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(desc.m_target, name); 307148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 307248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 307348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.getTexImage(desc.m_target, level, desc.m_format, desc.m_type, out_pixels); 307448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexImage"); 307548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 307648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(desc.m_target, 0); 307748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 307848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 307948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 308048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare data for destination image 308148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 308248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc Descriptor 308348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Array of pointer to image data 308448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 308548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareDstPxls(const FunctionalTest::targetDesc& desc, GLubyte** out_pixels) const 308648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 308748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum internal_format = desc.m_internal_format; 308848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const bool is_multi_level = Utils::isTargetMultilevel(desc.m_target); 308948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint n_levels = 1; 309048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_size = Utils::getPixelSizeForFormat(desc.m_internal_format); 309148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum type = desc.m_type; 309248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 309348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Configure levels */ 309448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == is_multi_level) 309548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 309648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos n_levels = FUNCTIONAL_TEST_N_LEVELS; 309748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 309848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 309948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Calculate dimmensions */ 310048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint heights[FUNCTIONAL_TEST_N_LEVELS]; 310148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint widths[FUNCTIONAL_TEST_N_LEVELS]; 310248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint depths[FUNCTIONAL_TEST_N_LEVELS]; 310348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 310448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos calculateDimmensions(desc.m_target, desc.m_level, desc.m_width, desc.m_height, widths, heights, depths); 310548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 310648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare storage */ 310748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < n_levels; ++i) 310848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 310948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint req_memory_per_layer = pixel_size * widths[i] * heights[i]; 311048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint req_memory_for_level = req_memory_per_layer * depths[i]; 311148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 311248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_pixels[i] = new GLubyte[req_memory_for_level]; 311348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 311448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 == out_pixels[i]) 311548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 311648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Memory allocation failed"); 311748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 311848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 311948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos memset(out_pixels[i], 0, req_memory_for_level); 312048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 312148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 312248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Fill pixels */ 312348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < n_levels; ++i) 312448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 312548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_layers = depths[i]; 312648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_pixels = widths[i] * heights[i]; 312748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* ptr = (GLubyte*)out_pixels[i]; 312848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 312948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint j = 0; j < n_pixels * n_layers; ++j) 313048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 313148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* pixel_data = ptr + j * pixel_size; 313248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 313348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::packPixel(internal_format, type, 1.0, 1.0, 1.0, 1.0, pixel_data); 313448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 313548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 313648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 313748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 313848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare data for source image 313948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 314048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc Descriptor 314148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_internal_format Internal format of destination image 314248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Array of pointer to image data 314348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 314448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareSrcPxls(const FunctionalTest::targetDesc& desc, GLenum /* dst_internal_format */, 314548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte** out_pixels) const 314648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 314748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum internal_format = desc.m_internal_format; 314848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const bool is_multi_level = Utils::isTargetMultilevel(desc.m_target); 314948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint n_levels = 1; 315048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_size = Utils::getPixelSizeForFormat(desc.m_internal_format); 315148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum type = desc.m_type; 315248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 315348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Configure levels */ 315448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == is_multi_level) 315548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 315648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos n_levels = FUNCTIONAL_TEST_N_LEVELS; 315748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 315848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 315948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Calculate dimmensions */ 316048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint heights[FUNCTIONAL_TEST_N_LEVELS]; 316148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint widths[FUNCTIONAL_TEST_N_LEVELS]; 316248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint depths[FUNCTIONAL_TEST_N_LEVELS]; 316348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 316448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos calculateDimmensions(desc.m_target, desc.m_level, desc.m_width, desc.m_height, widths, heights, depths); 316548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 316648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare storage */ 316748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < n_levels; ++i) 316848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 316948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint req_memory_per_layer = pixel_size * widths[i] * heights[i]; 317048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint req_memory_for_level = req_memory_per_layer * depths[i]; 317148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 317248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_pixels[i] = new GLubyte[req_memory_for_level]; 317348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 317448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 == out_pixels[i]) 317548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 317648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Memory allocation failed"); 317748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 317848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 317948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos memset(out_pixels[i], 0, req_memory_for_level); 318048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 318148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 318248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint lvl = 0; lvl < n_levels; ++lvl) 318348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 318448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_layers = depths[lvl]; 318548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint line_size = pixel_size * widths[lvl]; 318648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint req_memory_per_layer = line_size * heights[lvl]; 318748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* level = (GLubyte*)out_pixels[lvl]; 318848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 318948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint lay = 0; lay < n_layers; ++lay) 319048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 319148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint layer_offset = lay * req_memory_per_layer; 319248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 319348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* layer = ((GLubyte*)level) + layer_offset; 319448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 319548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint y = 0; y < heights[lvl]; ++y) 319648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 319748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint line_offset = line_size * y; 319848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 319948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* line = layer + line_offset; 320048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 320148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint x = 0; x < widths[lvl]; ++x) 320248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 320348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_offset = x * pixel_size; 320448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 320548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* pixel = line + pixel_offset; 320648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 320748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 255 is max ubyte. 1/15.9375 = 16/255 */ 320848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble red = ((GLdouble)x) / 255.0 + (((GLdouble)y) / 15.9375); 320948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble green = ((GLdouble)lay) / 255.0 + (((GLdouble)lvl) / 15.9375); 321048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble blue = 0.125; 321148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble alpha = 1.0; /* This value has special meaning for some internal_formats */ 321248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 321348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::packPixel(internal_format, type, red, green, blue, alpha, pixel); 321448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 321548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 321648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 321748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 321848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 321948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 322048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare test cases for given targets and internal formats 322148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 322248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_internal_format Internal format of destination image 322348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_target Target of destination image 322448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_internal_format Internal format of source image 322548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_target Target of source image 322648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 322748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareTestCases(GLenum dst_internal_format, GLenum dst_target, GLenum src_internal_format, 322848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum src_target) 322948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 323048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint image_dimmensions[] = { 323148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 7, 323248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_IMG_DIM 323348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 8, 323448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9, 323548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10, 323648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 11, 323748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12, 323848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13, 323948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 14, 324048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_IMG_DIM */ 324148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 15 324248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 324348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 324448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint region_dimmensions[] = { 324548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 1, 324648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_DIM 324748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 2, 324848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3, 324948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 4, 325048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 5, 325148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 6, 325248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_DIM */ 325348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 7 325448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 325548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 325648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_image_dimmensions = sizeof(image_dimmensions) / sizeof(image_dimmensions[0]); 325748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_region_dimmensions = sizeof(region_dimmensions) / sizeof(region_dimmensions[0]); 325848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 325948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const bool is_dst_multi_level = Utils::isTargetMultilevel(dst_target); 326048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const bool is_src_multi_level = Utils::isTargetMultilevel(src_target); 326148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_format = Utils::getFormat(dst_internal_format); 326248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint dst_n_levels = (true == is_dst_multi_level) ? FUNCTIONAL_TEST_N_LEVELS : 1; 326348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_type = Utils::getType(dst_internal_format); 326448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_format = Utils::getFormat(src_internal_format); 326548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint src_n_levels = (true == is_src_multi_level) ? FUNCTIONAL_TEST_N_LEVELS : 1; 326648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_type = Utils::getType(src_internal_format); 326748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 326848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src_level = 0; src_level < src_n_levels; ++src_level) 326948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 327048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst_level = 0; dst_level < dst_n_levels; ++dst_level) 327148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 327248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src_img_dim_id = 0; src_img_dim_id < n_image_dimmensions; ++src_img_dim_id) 327348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 327448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint src_image_dimmension = image_dimmensions[src_img_dim_id]; 327548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 327648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst_img_dim_id = 0; dst_img_dim_id < n_image_dimmensions; ++dst_img_dim_id) 327748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 327848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint dst_image_dimmension = image_dimmensions[dst_img_dim_id]; 327948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 328048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint reg_dim_id = 0; reg_dim_id < n_region_dimmensions; ++reg_dim_id) 328148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 328248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint region_dimmension = region_dimmensions[reg_dim_id]; 328348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_coord[3] = { 0, 0, 0 }; 328448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint dst_dim_diff = dst_image_dimmension - region_dimmension; 328548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint n_dst_coords = 1; 328648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS 328748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint n_src_coords = 1; 328848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */ 328948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint src_coord[3] = { 0, 0, 0 }; 329048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint src_dim_diff = src_image_dimmension - region_dimmension; 329148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 329248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Calculate coords */ 329348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (1 == dst_dim_diff) 329448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 329548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_coord[1] = 1; 329648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos n_dst_coords = 2; 329748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 329848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (1 < dst_dim_diff) 329948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 330048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_coord[1] = dst_dim_diff / 2; 330148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_coord[2] = dst_dim_diff; 330248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos n_dst_coords = 3; 330348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 330448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 330548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (1 == src_dim_diff) 330648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 330748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_coord[1] = 1; 330848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS 330948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos n_src_coords = 2; 331048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */ 331148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 331248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (1 < src_dim_diff) 331348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 331448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_coord[1] = src_dim_diff / 2; 331548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_coord[2] = src_dim_diff; 331648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS 331748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos n_src_coords = 3; 331848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */ 331948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 332048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 332148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { 332248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { /* m_dst */ 332348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_target, dst_image_dimmension, /* width */ 332448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_image_dimmension, /* height */ 332548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_level, dst_internal_format, dst_format, dst_type }, 332648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0, /* dst_x */ 332748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0, /* dst_y */ 332848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { /* m_src */ 332948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_target, src_image_dimmension, /* width */ 333048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_image_dimmension, /* height */ 333148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_level, src_internal_format, src_format, src_type }, 333248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0, /* src_x */ 333348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0, /* src_y */ 333448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos region_dimmension, /* width */ 333548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos region_dimmension, /* height */ 333648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 333748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 333848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS 333948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src_x = 0; src_x < n_src_coords; ++src_x) 334048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 334148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src_y = 0; src_y < n_src_coords; ++src_y) 334248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 334348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst_x = 0; dst_x < n_dst_coords; ++dst_x) 334448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 334548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst_y = 0; dst_y < n_dst_coords; ++dst_y) 334648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 334748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_x = dst_coord[dst_x]; 334848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_y = dst_coord[dst_y]; 334948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_x = src_coord[src_x]; 335048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_y = src_coord[src_y]; 335148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 335248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 335348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 335448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 335548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 335648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 335748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#else /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */ 335848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_x = dst_coord[n_dst_coords - 1]; 335948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_y = dst_coord[n_dst_coords - 1]; 336048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_x = src_coord[0]; 336148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_y = src_coord[0]; 336248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 336348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 336448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */ 336548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 336648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Whole image, for non 7x7 */ 336748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((dst_image_dimmension == src_image_dimmension) && 336848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (image_dimmensions[0] != dst_image_dimmension)) 336948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 337048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_x = 0; 337148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_y = 0; 337248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_x = 0; 337348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_y = 0; 337448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_width = dst_image_dimmension; 337548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_height = dst_image_dimmension; 337648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 337748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 337848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 337948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 338048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 338148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 338248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 338348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 338448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 338548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 338648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare texture 338748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 338848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc Descriptor 338948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels Image data 339048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_buf_id Id of buffer used by texture buffer 339148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 339248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Name of iamge 339348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 339448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint FunctionalTest::prepareTexture(const targetDesc& desc, const GLubyte** pixels, GLuint& out_buf_id) 339548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 339648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint name = Utils::generateTexture(m_context, desc.m_target); 339748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 339848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == Utils::isTargetMultilevel(desc.m_target)) 339948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 340048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTexture(m_context, name, desc.m_target, desc.m_internal_format, desc.m_format, desc.m_type, 340148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* level */, desc.m_width, desc.m_height, 340248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos FUNCTIONAL_TEST_N_LAYERS /* depth - 12 for multilayered, 1D and 2D will ignore that */, 340348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixels[0], out_buf_id); 340448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 340548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, desc.m_target, name, 0 /* base */, 0 /* max */); 340648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 340748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 340848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 340948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Calculate dimmensions */ 341048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint heights[FUNCTIONAL_TEST_N_LEVELS]; 341148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint widths[FUNCTIONAL_TEST_N_LEVELS]; 341248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint depths[FUNCTIONAL_TEST_N_LEVELS]; 341348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 341448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos calculateDimmensions(desc.m_target, desc.m_level, desc.m_width, desc.m_height, widths, heights, depths); 341548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 341648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint level = 0; level < FUNCTIONAL_TEST_N_LEVELS; ++level) 341748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 341848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTexture(m_context, name, desc.m_target, desc.m_internal_format, desc.m_format, desc.m_type, 341948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos level, widths[level], heights[level], depths[level], pixels[level], out_buf_id); 342048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 342148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, desc.m_target, name, 0 /* base */, 2 /* max */); 342248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 342348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 342448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 342548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return name; 342648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 342748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 342848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Verify copy operation 342948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 343048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case Test case 343148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_layer First layer modified by copy 343248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_pixels Origiranl data of destination image 343348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_layer First layer read by copy 343448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_pixels Original data of source image 343548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param depth Number of copied layers 343648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 343748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if everything is as expected, false otherwise 343848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 343948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::verify(const testCase& test_case, GLuint dst_layer, const GLubyte** dst_pixels, GLuint src_layer, 344048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte** src_pixels, GLuint depth) 344148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 344248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const bool is_dst_multi_level = Utils::isTargetMultilevel(test_case.m_dst.m_target); 344348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const bool is_src_multi_level = Utils::isTargetMultilevel(test_case.m_src.m_target); 344448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint dst_level = test_case.m_dst.m_level; 344548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLubyte> dst_level_data; 344648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint dst_pixel_size = Utils::getPixelSizeForFormat(test_case.m_dst.m_internal_format); 344748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos targetDesc src_desc = test_case.m_src; 344848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint src_level = src_desc.m_level; 344948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLubyte> src_level_data; 345048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint src_pixel_size = Utils::getPixelSizeForFormat(src_desc.m_internal_format); 345148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 345248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_rb_name) 345348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 345448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_desc.m_target = GL_TEXTURE_2D; 345548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 345648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 345748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Calculate storage requirements */ 345848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_req_mem_per_layer[FUNCTIONAL_TEST_N_LEVELS]; 345948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_heights[FUNCTIONAL_TEST_N_LEVELS]; 346048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_widths[FUNCTIONAL_TEST_N_LEVELS]; 346148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint dst_depths[FUNCTIONAL_TEST_N_LEVELS]; 346248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint src_req_mem_per_layer[FUNCTIONAL_TEST_N_LEVELS]; 346348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint src_heights[FUNCTIONAL_TEST_N_LEVELS]; 346448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint src_widths[FUNCTIONAL_TEST_N_LEVELS]; 346548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint src_depths[FUNCTIONAL_TEST_N_LEVELS]; 346648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 346748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos calculateDimmensions(test_case.m_dst.m_target, dst_level, test_case.m_dst.m_width, test_case.m_dst.m_height, 346848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_widths, dst_heights, dst_depths); 346948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 347048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos calculateDimmensions(src_desc.m_target, src_level, src_desc.m_width, src_desc.m_height, src_widths, src_heights, 347148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_depths); 347248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 347348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < FUNCTIONAL_TEST_N_LEVELS; ++i) 347448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 347548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_req_mem_per_layer[i] = dst_widths[i] * dst_heights[i] * dst_pixel_size; 347648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_req_mem_per_layer[i] = src_widths[i] * src_heights[i] * src_pixel_size; 347748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 347848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 347948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare storage, use 0 level as it is the biggest one */ 348048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_level_data.resize(dst_req_mem_per_layer[0] * dst_depths[0]); 348148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_level_data.resize(src_req_mem_per_layer[0] * src_depths[0]); 348248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 348348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verification of contents 348448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * - source image - expect no modification 348548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * - destination image, mipmap before and after dst_level - expect no modification 348648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * - destination image, mipmap at dst_level: 348748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * * layers after dst_layer + depth - expect no modification 348848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * * layers <0, dst_layer + depth> - expect that contents at selected region were copied 348948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 349048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 349148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check if source image was not modified */ 349248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 349348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_levels = (true == is_src_multi_level) ? FUNCTIONAL_TEST_N_LEVELS : 1; 349448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 349548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint level = 0; level < n_levels; ++level) 349648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 349748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos getPixels(m_src_tex_name, src_desc, level, &src_level_data[0]); 349848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 349948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint layer = 0; layer < src_depths[level]; ++layer) 350048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 350148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == compareImages(src_desc, src_pixels[level], 0, 0, layer, level, src_desc, 350248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos &src_level_data[0], 0, 0, layer, level, src_widths[level], 350348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_heights[level])) 350448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 350548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 350648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message 350748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "CopyImageSubData modified contents of source image. Original data: left." 350848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 350948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 351048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 351148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 351248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 351348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 351448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 351548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check if contents of destination at levels != dst_level were not modified */ 351648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 351748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_levels = (true == is_dst_multi_level) ? FUNCTIONAL_TEST_N_LEVELS : 1; 351848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 351948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint level = 0; level < n_levels; ++level) 352048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 352148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (dst_level == level) 352248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 352348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 352448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 352548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 352648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos getPixels(m_dst_tex_name, test_case.m_dst, level, &dst_level_data[0]); 352748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 352848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint layer = 0; layer < dst_depths[level]; ++layer) 352948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 353048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == compareImages(test_case.m_dst, dst_pixels[level], 0, 0, layer, level, test_case.m_dst, 353148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos &dst_level_data[0], 0, 0, layer, level, dst_widths[level], 353248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_heights[level])) 353348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 353448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 353548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message 353648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "CopyImageSubData modified contents of wrong mipmap level. Original data: left." 353748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 353848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 353948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 354048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 354148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 354248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 354348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 354448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 354548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check contents of modified level */ 354648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 354748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos getPixels(m_dst_tex_name, test_case.m_dst, dst_level, &dst_level_data[0]); 354848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 354948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check anything after dst_layer + depth */ 355048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 355148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint layer = dst_layer + depth; layer < dst_depths[dst_level]; ++layer) 355248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 355348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == compareImages(test_case.m_dst, dst_pixels[dst_level], 0, 0, layer, dst_level, 355448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst, &dst_level_data[0], 0, 0, layer, dst_level, 355548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_widths[dst_level], dst_heights[dst_level])) 355648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 355748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 355848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message 355948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "CopyImageSubData modified contents of wrong layer. Original data: left." 356048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 356148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 356248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 356348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 356448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 356548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 356648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 356748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check modified layers */ 356848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint layer = 0; layer < depth; ++layer) 356948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 357048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check contents outside of copied region */ 357148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 357248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint n_regions = 0; 357348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint regions[4][4] = { { 0 } }; 357448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 357548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos getCleanRegions(test_case, dst_level, regions, n_regions); 357648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 357748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint region = 0; region < n_regions; ++region) 357848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 357948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint x = regions[region][0]; 358048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint y = regions[region][1]; 358148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint w = regions[region][2]; 358248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint h = regions[region][3]; 358348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 358448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == compareImages(test_case.m_dst, dst_pixels[dst_level], x, y, layer + dst_layer, 358548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_level, test_case.m_dst, &dst_level_data[0], x, y, layer + dst_layer, 358648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_level, w, h)) 358748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 358848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 358948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message 359048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "CopyImageSubData modified contents outside of copied region. Original data: left." 359148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 359248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 359348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 359448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 359548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 359648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 359748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check contents of copied region */ 359848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == compareImages(test_case.m_dst, &dst_level_data[0], test_case.m_dst_x, test_case.m_dst_y, 359948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos layer + dst_layer, dst_level, src_desc, src_pixels[src_level], test_case.m_src_x, 360048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_y, layer + src_layer, src_level, test_case.m_width, 360148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_height)) 360248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 360348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 360448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message 360548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "CopyImageSubData stored invalid data in copied region. Destination data: left." 360648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 360748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 360848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 360948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 361048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 361148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 361248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 361348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 361448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 361548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* SmokeTest */ 361648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Constants */ 361748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst GLuint SmokeTest::m_width = 16; 361848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst GLuint SmokeTest::m_height = 16; 361948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst GLuint SmokeTest::m_depth = 1; 362048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 362148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 362248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 362348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 362448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 362548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSmokeTest::SmokeTest(deqp::Context& context) 362648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, "smoke_test", "Test tries all formats and targets") 362748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_buf_name(0) 362848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 362948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_rb_name(0) 363048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_buf_name(0) 363148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 363248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 363348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 363448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Iterate over valid targets */ 363548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint tgt_id = 0; tgt_id < s_n_valid_targets; ++tgt_id) 363648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 363748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum target = s_valid_targets[tgt_id]; 363848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 363948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == Utils::isTargetMultisampled(target)) 364048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 364148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 364248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 364348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 364448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase test_case = { target, GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT }; 364548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 364648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 364748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 364848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 364948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Iterate over internal formats */ 365048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint fmt_id = 0; fmt_id < s_n_internal_formats; ++fmt_id) 365148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 365248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum internal_format = s_internal_formats[fmt_id]; 365348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum format = Utils::getFormat(internal_format); 365448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum type = Utils::getType(internal_format); 365548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 365648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase test_case = { GL_TEXTURE_2D, internal_format, format, type }; 365748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 365848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 365948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 366048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 366148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 366248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 366348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 366448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 366548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::clean() 366648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 366748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 366848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 366948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 367048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_dst_tex_name); 367148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_src_tex_name); 367248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 367348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 367448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 367548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 367648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_dst_buf_name) 367748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 367848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_dst_buf_name); 367948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_buf_name = 0; 368048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 368148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 368248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_rb_name) 368348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 368448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteRenderbuffers(1, &m_rb_name); 368548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_rb_name = 0; 368648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 368748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 368848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_src_buf_name) 368948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 369048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_src_buf_name); 369148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_buf_name = 0; 369248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 369348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 369448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 369548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Free memory allocated for images 369648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 369748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels Pointers to image data 369848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 369948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::cleanPixels(GLubyte*& pixels) const 370048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 370148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 == pixels) 370248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 370348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return; 370448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 370548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 370648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos delete[] pixels; 370748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos pixels = 0; 370848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 370948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 371048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Compare two images 371148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case Test case descriptor 371248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_data Data of left image 371348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_data Data of right image 371448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 371548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if images are considered idenctial, false otherwise 371648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 371748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool SmokeTest::compareImages(const testCase& test_case, const GLubyte* left_data, const GLubyte* right_data) const 371848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 371948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Constants */ 372048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Sizes */ 372148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_size = Utils::getPixelSizeForFormat(test_case.m_internal_format); 372248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint line_size = pixel_size * m_width; 372348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 372448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint height = m_height; 372548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 372648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_TEXTURE_1D == test_case.m_target) || (GL_TEXTURE_1D_ARRAY == test_case.m_target)) 372748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 372848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos height = 1; 372948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 373048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 373148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* For each line */ 373248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint y = 0; y < height; ++y) 373348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 373448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Offsets */ 373548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint line_offset = y * line_size; 373648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 373748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Pointers */ 373848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* left_line_data = left_data + line_offset; 373948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* right_line_data = right_data + line_offset; 374048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 374148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* For each pixel of region */ 374248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint x = 0; x < m_width; ++x) 374348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 374448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Offsets */ 374548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_offset = x * pixel_size; 374648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 374748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Pointers */ 374848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* left_pixel_data = left_line_data + pixel_offset; 374948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLubyte* right_pixel_data = right_line_data + pixel_offset; 375048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 375148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Compare */ 3752412798dfb7d915b8eb765e7bc148c5e28677d0edJeannot Breton if (false == Utils::comparePixels(pixel_size, left_pixel_data, pixel_size, right_pixel_data)) 375348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 375448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == Utils::unpackAndComaprePixels( 375548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_format, test_case.m_type, test_case.m_internal_format, left_pixel_data, 375648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_format, test_case.m_type, test_case.m_internal_format, right_pixel_data)) 375748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 375848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 375948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Not matching pixels found. " 376048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "[" << x << ", " << y << "], off: " << left_pixel_data - left_data 376148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Data left: " << Utils::getPixelString(test_case.m_internal_format, left_pixel_data) 376248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", right: " << Utils::getPixelString(test_case.m_internal_format, right_pixel_data) 376348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 376448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 376548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 376648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 376748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 376848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 376948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 377048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 377148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 377248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 377348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 377448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute copyImageSubData for given test case and verify results 377548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 377648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case Test case 377748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_pixels Data of source image 377848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 377948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if there is no error and results match expectations, false otherwise 378048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 378148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool SmokeTest::copyAndVerify(const testCase& test_case, const GLubyte* src_pixels) 378248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 378348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 378448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 378548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 378648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 378748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Copy and verification */ 378848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 378948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 == m_rb_name) 379048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 379148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint height = m_height; 379248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 379348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_TEXTURE_1D == test_case.m_target) || (GL_TEXTURE_1D_ARRAY == test_case.m_target)) 379448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 379548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos height = 1; 379648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 379748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 379848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 379948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* srcZ */, m_dst_tex_name, test_case.m_target, 0 /* dstLevel */, 0 /* dstX */, 380048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, m_width, height, m_depth); 380148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 380248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else /* Copy from src to rb and from rb to dst */ 380348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 380448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Src and rb shares differs only on target */ 380548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, GL_TEXTURE_2D, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 380648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* srcZ */, m_rb_name, test_case.m_target, 0 /* dstLevel */, 0 /* dstX */, 380748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, m_width, m_height, m_depth); 380848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 380948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_rb_name, test_case.m_target, 0 /* dstLevel */, 0 /* dstX */, 0 /* dstY */, 381048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstZ */, m_dst_tex_name, GL_TEXTURE_2D, 0 /* dstLevel */, 0 /* dstX */, 381148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, m_width, m_height, m_depth); 381248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 381348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 381448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 381548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 381648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 381748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_NO_ERROR == error) 381848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 381948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify copy results */ 382048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = verify(test_case, src_pixels); 382148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 382248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 382348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_NO_ERROR != error) || (false == result)) 382448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 382548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 382648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Target: " << glu::getTextureTargetStr(test_case.m_target) 382748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Format: " << glu::getInternalFormatParameterStr(test_case.m_internal_format) 382848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 382948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 383048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_NO_ERROR != error) 383148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 383248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() << tcu::TestLog::Message 383348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "Failed due to error: " << glu::getErrorStr(error) 383448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 383548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 383648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Copy operation failed"); 383748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 383848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 383948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 384048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 384148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 384248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 384348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 384448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 384548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 384648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get pixel data for image 384748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 384848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name Name of image 384948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case Test case descriptor 385048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Pixels 385148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 385248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::getPixels(GLuint name, const SmokeTest::testCase& test_case, GLubyte* out_pixels) const 385348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 385448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 385548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum tgt_bind = test_case.m_target; 385648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum tgt_get = test_case.m_target; 385748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 385848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER == test_case.m_target) 385948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 386048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tgt_bind = GL_TEXTURE_2D; 386148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tgt_get = GL_TEXTURE_2D; 386248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 386348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (GL_TEXTURE_CUBE_MAP == test_case.m_target) 386448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 386548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tgt_get = GL_TEXTURE_CUBE_MAP_POSITIVE_X; 386648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 386748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 386848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(tgt_bind, name); 386948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 387048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 387148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.getTexImage(tgt_get, 0 /* level */, test_case.m_format, test_case.m_type, out_pixels); 387248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexImage"); 387348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 387448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(tgt_bind, 0); 387548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 387648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 387748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 387848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 387948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 388048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 388148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 388248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult SmokeTest::iterate() 388348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 388448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* dst_pixels = 0; 388548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 388648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 388748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 388848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* src_pixels = 0; 388948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 389048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 389148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.pixelStorei(GL_PACK_ALIGNMENT, 1); 389248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.pixelStorei(GL_UNPACK_ALIGNMENT, 1); 389348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "PixelStorei"); 389448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 389548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 389648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 389748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare pixels */ 389848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos prepareDstPxls(test_case, dst_pixels); 389948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos prepareSrcPxls(test_case, src_pixels); 390048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 390148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 390248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER == test_case.m_target) 390348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 390448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase desc = test_case; 390548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint ignored = 0; 390648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 390748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos desc.m_target = GL_TEXTURE_2D; 390848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 390948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_rb_name = prepareTexture(test_case, 0 /* pixels */, ignored /* buffer name */); 391048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = prepareTexture(desc, dst_pixels, m_dst_buf_name); 391148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = prepareTexture(desc, src_pixels, m_src_buf_name); 391248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 391348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 391448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 391548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = prepareTexture(test_case, dst_pixels, m_dst_buf_name); 391648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = prepareTexture(test_case, src_pixels, m_src_buf_name); 391748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 391848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 391948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Copy images and verify results */ 392048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = copyAndVerify(test_case, src_pixels); 392148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 392248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 392348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 392448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 392548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanPixels(dst_pixels); 392648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanPixels(src_pixels); 392748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 392848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 392948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 393048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Free resources */ 393148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 393248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanPixels(dst_pixels); 393348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanPixels(src_pixels); 393448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 393548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set result */ 393648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 393748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 393848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 393948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 394048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 394148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 394248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 394348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 394448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 394548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 394648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 394748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 394848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 394948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 395048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 395148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() << tcu::TestLog::Message << "Failure. " << tcu::TestLog::EndMessage; 395248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 395348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 395448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 395548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 395648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 395748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 395848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 395948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 396048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare data for destination image 396148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 396248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case Test case descriptor 396348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Pointer to image data 396448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 396548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::prepareDstPxls(const SmokeTest::testCase& test_case, GLubyte*& out_pixels) const 396648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 396748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_pixels_per_layer = m_width * m_height; 396848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 396948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum internal_format = test_case.m_internal_format; 397048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_layers = (GL_TEXTURE_CUBE_MAP_ARRAY != test_case.m_target) ? m_depth : 6; 397148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_pixels = n_pixels_per_layer * n_layers; 397248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_size = Utils::getPixelSizeForFormat(internal_format); 397348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint req_memory = pixel_size * n_pixels; 397448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum type = test_case.m_type; 397548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 397648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare storage */ 397748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_pixels = new GLubyte[req_memory]; 397848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 397948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 == out_pixels) 398048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 398148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Memory allocation failed"); 398248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 398348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 398448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos memset(out_pixels, 0, req_memory); 398548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 398648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Fill pixels */ 398748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint j = 0; j < n_pixels; ++j) 398848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 398948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* pixel_data = out_pixels + j * pixel_size; 399048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 399148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::packPixel(internal_format, type, 1.0, 1.0, 1.0, 1.0, pixel_data); 399248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 399348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 399448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 399548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare data for source image 399648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 399748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case Test case descriptor 399848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Pointer to image data 399948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 400048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::prepareSrcPxls(const SmokeTest::testCase& test_case, GLubyte*& out_pixels) const 400148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 400248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_pixels_per_layer = m_width * m_height; 400348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 400448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum internal_format = test_case.m_internal_format; 400548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_layers = (GL_TEXTURE_CUBE_MAP_ARRAY != test_case.m_target) ? m_depth : 6; 400648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_pixels = n_pixels_per_layer * n_layers; 400748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_size = Utils::getPixelSizeForFormat(internal_format); 400848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint layer_size = pixel_size * n_pixels_per_layer; 400948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint line_size = pixel_size * m_width; 401048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint req_memory = pixel_size * n_pixels; 401148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum type = test_case.m_type; 401248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 401348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare storage */ 401448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos out_pixels = new GLubyte[req_memory]; 401548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 401648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 == out_pixels) 401748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 401848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Memory allocation failed"); 401948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 402048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 402148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos memset(out_pixels, 0, req_memory); 402248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 402348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Fill pixels */ 402448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint layer = 0; layer < n_layers; ++layer) 402548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 402648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint layer_offset = layer * layer_size; 402748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 402848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* layer_data = out_pixels + layer_offset; 402948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 403048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint y = 0; y < m_height; ++y) 403148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 403248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint line_offset = line_size * y; 403348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 403448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* line_data = layer_data + line_offset; 403548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 403648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint x = 0; x < m_width; ++x) 403748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 403848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_offset = x * pixel_size; 403948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 404048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* pixel_data = line_data + pixel_offset; 404148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 404248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 255 is max ubyte. 1/15.9375 = 16/255 */ 404348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble red = ((GLdouble)x) / 255.0 + (((GLdouble)y) / 15.9375); 404448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble green = ((GLdouble)layer) / 255.0 + (1.0 / 15.9375); 404548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble blue = 0.125; 404648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLdouble alpha = 1.0; /* This value has special meaning for some internal_formats */ 404748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 404848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::packPixel(internal_format, type, red, green, blue, alpha, pixel_data); 404948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 405048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 405148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 405248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 405348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 405448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare texture 405548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 405648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc Descriptor 405748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels Image data 405848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_buf_id Id of buffer used by texture buffer 405948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 406048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Name of iamge 406148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 406248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint SmokeTest::prepareTexture(const testCase& test_case, const GLubyte* pixels, GLuint& out_buf_id) 406348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 406448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_layers = (GL_TEXTURE_CUBE_MAP_ARRAY != test_case.m_target) ? m_depth : 6; 406548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint name = Utils::generateTexture(m_context, test_case.m_target); 406648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 406748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTexture(m_context, name, test_case.m_target, test_case.m_internal_format, test_case.m_format, 406848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_type, 0 /* level */, m_width, m_height, n_layers, pixels, out_buf_id); 406948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 407048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_target, name, 0 /* base */, 0 /* max */); 407148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 407248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return name; 407348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 407448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 407548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Verify copy operation 407648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 407748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case Test case 407848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_pixels Original data of source image 407948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 408048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if everything is as expected, false otherwise 408148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 408248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool SmokeTest::verify(const testCase& test_case, const GLubyte* src_pixels) 408348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 408448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLubyte> dst_data; 408548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint n_layers = (GL_TEXTURE_CUBE_MAP_ARRAY != test_case.m_target) ? m_depth : 6; 408648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint pixel_size = Utils::getPixelSizeForFormat(test_case.m_internal_format); 408748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint line_size = pixel_size * m_width; 408848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint req_memory = line_size * m_height * n_layers; 408948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLubyte> src_data; 409048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 409148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare storage */ 409248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos dst_data.resize(req_memory); 409348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos src_data.resize(req_memory); 409448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 409548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check if source image was not modified */ 409648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 409748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos getPixels(m_src_tex_name, test_case, &src_data[0]); 409848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 409948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == compareImages(test_case, src_pixels, &src_data[0])) 410048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 410148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 410248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "CopyImageSubData modified contents of source image. Original data: left." 410348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 410448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 410548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 410648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 410748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 410848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check contents of destination image */ 410948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 411048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos getPixels(m_dst_tex_name, test_case, &dst_data[0]); 411148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 411248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == compareImages(test_case, src_pixels, &dst_data[0])) 411348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 411448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 411548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message 411648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "CopyImageSubData stored invalid contents in destination image. Source data: left." 411748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 411848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 411948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 412048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 412148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 412248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 412348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 412448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 412548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 412648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* InvalidTargetTest */ 412748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 412848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 412948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 413048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 413148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosInvalidTargetTest::InvalidTargetTest(deqp::Context& context) 413248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, "invalid_target", 413348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "Test verifies if INVALID_ENUM is generated when invalid target is provided to CopySubImageData") 413448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_buf_name(0) 413548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 413648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_buf_name(0) 413748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 413848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 413948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 414048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 414148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Valid source, valid dst */ 414248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src = 0; src < s_n_valid_targets; ++src) 414348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 414448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst = 0; dst < s_n_valid_targets; ++dst) 414548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 414648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_target = s_valid_targets[src]; 414748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_target = s_valid_targets[dst]; 414848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { src_target, dst_target, GL_NO_ERROR }; 414948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 415048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (Utils::isTargetMultisampled(dst_target) != Utils::isTargetMultisampled(src_target)) 415148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 415248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_expected_result = GL_INVALID_OPERATION; 415348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 415448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 415548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 415648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 415748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 415848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 415948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Invalid source, invalid dst */ 416048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src = 0; src < s_n_invalid_targets; ++src) 416148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 416248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst = 0; dst < s_n_invalid_targets; ++dst) 416348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 416448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_target = s_invalid_targets[src]; 416548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_target = s_invalid_targets[dst]; 416648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase test_case = { src_target, dst_target, GL_INVALID_ENUM }; 416748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 416848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 416948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 417048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 417148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 417248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Invalid source, valid dst */ 417348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src = 0; src < s_n_invalid_targets; ++src) 417448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 417548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst = 0; dst < s_n_valid_targets; ++dst) 417648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 417748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_target = s_invalid_targets[src]; 417848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_target = s_valid_targets[dst]; 417948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase test_case = { src_target, dst_target, GL_INVALID_ENUM }; 418048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 418148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 418248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 418348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 418448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 418548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Valid source, invalid dst */ 418648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src = 0; src < s_n_valid_targets; ++src) 418748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 418848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst = 0; dst < s_n_invalid_targets; ++dst) 418948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 419048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_target = s_valid_targets[src]; 419148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_target = s_invalid_targets[dst]; 419248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase test_case = { src_target, dst_target, GL_INVALID_ENUM }; 419348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 419448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 419548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 419648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 419748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 419848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 419948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 420048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 420148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 420248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 420348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult InvalidTargetTest::iterate() 420448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 420548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 420648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 420748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 420848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 420948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 421048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 421148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 421248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 421348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 421448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_dst_target, GL_RGBA8, GL_RGBA, 421548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_UNSIGNED_BYTE, m_dst_buf_name); 421648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_src_target, GL_RGBA8, GL_RGBA, 421748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_UNSIGNED_BYTE, m_src_buf_name); 421848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 421948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make textures complete */ 422048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_dst_target, m_dst_tex_name, 0 /* base */, 0 /* max */); 422148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_src_target, m_src_tex_name, 0 /* base */, 0 /* max */); 422248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 422348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 422448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 422548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 422648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 422748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 422848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 422948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 423048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_src_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 423148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* srcZ */, m_dst_tex_name, test_case.m_dst_target, 0 /* dstLevel */, 0 /* dstX */, 423248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */); 423348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 423448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 423548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 423648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 423748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 423848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Free resources */ 423948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 424048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 424148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set result */ 424248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 424348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 424448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 424548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 424648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 424748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 424848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 424948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 425048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 425148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 425248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 425348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 425448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 425548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 425648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 425748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 425848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 425948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) 426048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Source target: " << glu::getTextureTargetStr(test_case.m_src_target) 426148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", destination target: " << glu::getTextureTargetStr(test_case.m_dst_target) << tcu::TestLog::EndMessage; 426248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 426348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 426448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 426548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 426648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 426748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 426848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 426948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 427048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 427148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 427248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 427348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid InvalidTargetTest::clean() 427448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 427548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 427648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 427748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 427848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 427948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::deleteTexture(m_context, test_case.m_dst_target, m_dst_tex_name); 428048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::deleteTexture(m_context, test_case.m_src_target, m_src_tex_name); 428148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 428248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 428348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 428448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 428548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_dst_buf_name) 428648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 428748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_dst_buf_name); 428848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_buf_name = 0; 428948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 429048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 429148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_src_buf_name) 429248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 429348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_src_buf_name); 429448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_buf_name = 0; 429548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 429648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 429748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 429848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* TargetMissMatchTest */ 429948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 430048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 430148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 430248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 430348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTargetMissMatchTest::TargetMissMatchTest(deqp::Context& context) 430448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase( 430548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos context, "target_miss_match", 430648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "Test verifies if INVALID_ENUM is generated when target provided to CopySubImageData does not match texture") 430748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_buf_name(0) 430848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 430948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_buf_name(0) 431048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 431148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 431248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 431348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Wrong dst target */ 431448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 431548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 431648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst = 0; dst < s_n_valid_targets; ++dst) 431748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 431848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_target = s_valid_targets[dst]; 431948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_target = s_valid_targets[target]; 432048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 432148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { tex_target, src_target, dst_target, GL_INVALID_ENUM }; 432248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 432348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip renderbuffers */ 432448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_RENDERBUFFER == tex_target) || (GL_RENDERBUFFER == dst_target) || (GL_RENDERBUFFER == src_target)) 432548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 432648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 432748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 432848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 432948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Valid case */ 433048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (dst_target == tex_target) 433148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 433248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_expected_result = GL_NO_ERROR; 433348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 433448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 433548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip cases with multisampling conflict */ 433648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (Utils::isTargetMultisampled(dst_target) != Utils::isTargetMultisampled(src_target)) 433748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 433848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 433948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 434048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 434148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 434248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 434348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 434448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 434548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Wrong src target */ 434648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 434748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 434848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src = 0; src < s_n_valid_targets; ++src) 434948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 435048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum dst_target = s_valid_targets[target]; 435148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum src_target = s_valid_targets[src]; 435248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 435348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { tex_target, src_target, dst_target, GL_INVALID_ENUM }; 435448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 435548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip renderbuffers */ 435648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_RENDERBUFFER == tex_target) || (GL_RENDERBUFFER == dst_target) || (GL_RENDERBUFFER == src_target)) 435748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 435848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 435948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 436048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 436148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Valid case */ 436248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (src_target == tex_target) 436348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 436448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_expected_result = GL_NO_ERROR; 436548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 436648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 436748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip cases with multisampling conflict */ 436848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (Utils::isTargetMultisampled(dst_target) != Utils::isTargetMultisampled(src_target)) 436948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 437048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 437148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 437248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 437348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 437448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 437548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 437648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 437748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 437848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 437948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 438048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 438148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 438248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult TargetMissMatchTest::iterate() 438348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 438448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 438548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 438648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 438748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 438848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 438948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 439048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 439148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 439248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 439348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, 439448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_UNSIGNED_BYTE, m_dst_buf_name); 439548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, 439648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_UNSIGNED_BYTE, m_src_buf_name); 439748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 439848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make textures complete */ 439948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */); 440048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */); 440148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 440248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 440348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 440448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 440548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 440648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 440748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 440848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 440948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_src_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 441048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* srcZ */, m_dst_tex_name, test_case.m_dst_target, 0 /* dstLevel */, 0 /* dstX */, 441148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */); 441248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 441348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 441448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 441548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 441648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 441748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Remove resources */ 441848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 441948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 442048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 442148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 442248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 442348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 442448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 442548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 442648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 442748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 442848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 442948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 443048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 443148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 443248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 443348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 443448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 443548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 443648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 443748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) 443848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target) 443948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Source target: " << glu::getTextureTargetStr(test_case.m_src_target) 444048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", destination target: " << glu::getTextureTargetStr(test_case.m_dst_target) << tcu::TestLog::EndMessage; 444148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 444248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 444348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 444448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 444548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 444648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 444748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 444848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 444948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 445048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 445148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 445248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid TargetMissMatchTest::clean() 445348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 445448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 445548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 445648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 445748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_dst_tex_name); 445848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_src_tex_name); 445948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 446048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 446148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 446248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 446348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_dst_buf_name) 446448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 446548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_dst_buf_name); 446648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_buf_name = 0; 446748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 446848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 446948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_src_buf_name) 447048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 447148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_src_buf_name); 447248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_buf_name = 0; 447348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 447448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 447548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 447648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* TargetMissMatchTest */ 447748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 447848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 447948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 448048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 448148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosIncompleteTexTest::IncompleteTexTest(deqp::Context& context) 448248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase( 448348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos context, "incomplete_tex", 448448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "Test verifies if INVALID_OPERATION is generated when texture provided to CopySubImageData is incomplete") 448548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_buf_name(0) 448648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 448748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_buf_name(0) 448848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 448948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 449048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 449148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 449248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 449348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 449448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { tex_target, false, false, GL_INVALID_OPERATION }; 449548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 449648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip targets that are not multi level */ 449748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (false == Utils::isTargetMultilevel(tex_target)) 449848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 449948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 450048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 450148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 450248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 450348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 450448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_is_dst_complete = true; 450548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_is_src_complete = false; 450648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 450748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 450848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_is_dst_complete = false; 450948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_is_src_complete = true; 451048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 451148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 451248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_is_dst_complete = true; 451348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_is_src_complete = true; 451448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_expected_result = GL_NO_ERROR; 451548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 451648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 451748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 451848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 451948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 452048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 452148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 452248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 452348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult IncompleteTexTest::iterate() 452448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 452548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 452648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 452748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 452848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 452948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 453048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 453148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 453248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 453348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 453448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, 453548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_UNSIGNED_BYTE, m_dst_buf_name); 453648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, 453748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_UNSIGNED_BYTE, m_src_buf_name); 453848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 453948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make textures complete */ 454048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == test_case.m_is_dst_complete) 454148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 454248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */); 454348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 454448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 454548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == test_case.m_is_src_complete) 454648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 454748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */); 454848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 454948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 455048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 455148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 455248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 455348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 455448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 455548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 455648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 455748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 455848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* srcZ */, m_dst_tex_name, test_case.m_tex_target, 0 /* dstLevel */, 0 /* dstX */, 455948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */); 456048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 456148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 456248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 456348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 456448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 456548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Remove resources */ 456648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 456748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 456848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 456948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 457048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 457148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 457248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 457348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 457448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 457548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 457648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 457748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 457848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 457948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 458048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 458148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 458248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 458348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 458448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 458548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) 458648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target) 458748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Is source complete: " << test_case.m_is_src_complete 458848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", is destination complete: " << test_case.m_is_dst_complete << tcu::TestLog::EndMessage; 458948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 459048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 459148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 459248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 459348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 459448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 459548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 459648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 459748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 459848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 459948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 460048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid IncompleteTexTest::clean() 460148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 460248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 460348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 460448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 460548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_dst_tex_name); 460648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_src_tex_name); 460748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 460848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 460948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 461048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 461148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_dst_buf_name) 461248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 461348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_dst_buf_name); 461448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_buf_name = 0; 461548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 461648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 461748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_src_buf_name) 461848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 461948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_src_buf_name); 462048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_buf_name = 0; 462148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 462248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 462348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 462448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* IncompatibleFormatsTest */ 462548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 462648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 462748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 462848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 462948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosIncompatibleFormatsTest::IncompatibleFormatsTest(deqp::Context& context) 463048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase( 463148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos context, "incompatible_formats", 463248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "Test verifies if INVALID_OPERATION is generated when textures provided to CopySubImageData are incompatible") 463348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_buf_name(0) 463448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 463548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_buf_name(0) 463648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 463748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 463848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 463948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA8UI vs RGBA16UI */ 464048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 464148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 464248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 464348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 464448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { tex_target, GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, 464548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_INVALID_OPERATION }; 464648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 464748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip multisampled and rectangle targets */ 464848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == Utils::isTargetMultisampled(tex_target)) 464948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 465048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 465148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 465248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 465348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 465448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 465548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 465648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA8UI vs RGBA32UI */ 465748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 465848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 465948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 466048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 466148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { tex_target, GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, 466248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_INVALID_OPERATION }; 466348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 466448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip multisampled and rectangle targets */ 466548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == Utils::isTargetMultisampled(tex_target)) 466648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 466748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 466848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 466948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 467048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 467148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 467248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 467348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA16UI vs RG16UI */ 467448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 467548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 467648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 467748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 467848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { tex_target, GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, 467948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_INVALID_OPERATION }; 468048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 468148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip multisampled and rectangle targets */ 468248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == Utils::isTargetMultisampled(tex_target)) 468348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 468448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 468548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 468648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 468748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 468848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 468948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 469048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA32UI vs RGBA32F */ 469148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 469248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 469348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 469448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 469548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { tex_target, GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 469648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGBA32F, GL_RGBA, GL_FLOAT, GL_NO_ERROR }; 469748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 469848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip multisampled and rectangle targets */ 469948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == Utils::isTargetMultisampled(tex_target)) 470048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 470148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 470248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 470348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 470448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 470548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 470648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 470748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* RGBA8 vs RGBA32F */ 470848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 470948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 471048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 471148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 471248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { tex_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, 471348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RGBA32F, GL_RGBA, GL_FLOAT, GL_INVALID_OPERATION }; 471448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 471548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip multisampled and rectangle targets */ 471648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == Utils::isTargetMultisampled(tex_target)) 471748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 471848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 471948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 472048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 472148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 472248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 472348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 472448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 472548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 472648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 472748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 472848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 472948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult IncompatibleFormatsTest::iterate() 473048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 473148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 473248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 473348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 473448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 473548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 473648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 473748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 473848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 473948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 474048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, test_case.m_dst_internal_format, 474148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_format, test_case.m_dst_type, m_dst_buf_name); 474248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, test_case.m_src_internal_format, 474348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_format, test_case.m_src_type, m_src_buf_name); 474448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 474548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make textures complete */ 474648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */); 474748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */); 474848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 474948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 475048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 475148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 475248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 475348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 475448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 475548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 475648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 475748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* srcZ */, m_dst_tex_name, test_case.m_tex_target, 0 /* dstLevel */, 0 /* dstX */, 475848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */); 475948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 476048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 476148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 476248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 476348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 476448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Remove resources */ 476548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 476648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 476748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 476848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 476948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 477048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 477148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 477248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 477348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 477448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 477548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 477648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 477748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 477848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 477948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 478048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 478148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 478248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 478348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 478448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) 478548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target) 478648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Source format: " << glu::getInternalFormatParameterStr(test_case.m_src_internal_format) 478748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Destination format: " << glu::getInternalFormatParameterStr(test_case.m_dst_internal_format) 478848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 478948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 479048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 479148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 479248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 479348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 479448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 479548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 479648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 479748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 479848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 479948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 480048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid IncompatibleFormatsTest::clean() 480148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 480248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 480348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 480448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 480548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 480648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::deleteTexture(m_context, test_case.m_tex_target, m_dst_tex_name); 480748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::deleteTexture(m_context, test_case.m_tex_target, m_src_tex_name); 480848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 480948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 481048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 481148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 481248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_dst_buf_name) 481348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 481448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_dst_buf_name); 481548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_buf_name = 0; 481648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 481748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 481848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != m_src_buf_name) 481948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 482048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteBuffers(1, &m_src_buf_name); 482148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_buf_name = 0; 482248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 482348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 482448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 482548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* InvalidTargetTest */ 482648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 482748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 482848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 482948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 483048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSamplesMissMatchTest::SamplesMissMatchTest(deqp::Context& context) 483148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, "samples_missmatch", "Test verifies if INVALID_OPERATION is generated when textures provided " 483248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "to CopySubImageData have different number of samples") 483348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 483448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 483548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 483648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 483748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case; 483848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 483948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLsizei n_samples[2] = { 1, 4 }; 484048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 484148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLenum targets[2] = { GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_2D_MULTISAMPLE_ARRAY }; 484248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 484348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src_sample = 0; src_sample < 2; ++src_sample) 484448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 484548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst_sample = 0; dst_sample < 2; ++dst_sample) 484648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 484748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint src_target = 0; src_target < 2; ++src_target) 484848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 484948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint dst_target = 0; dst_target < 2; ++dst_target) 485048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 485148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_target = targets[src_target]; 485248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_n_samples = n_samples[src_sample]; 485348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_target = targets[dst_target]; 485448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_n_samples = n_samples[dst_sample]; 485548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 485648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (test_case.m_src_n_samples == test_case.m_dst_n_samples) 485748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 485848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_expected_result = GL_NO_ERROR; 485948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 486048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 486148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 486248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_expected_result = GL_INVALID_OPERATION; 486348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 486448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 486548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 486648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 486748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 486848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 486948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 487048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 487148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 487248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 487348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 487448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 487548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 487648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult SamplesMissMatchTest::iterate() 487748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 487848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 487948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 488048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 488148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 488248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 488348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 488448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 488548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 488648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 488748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = Utils::prepareMultisampleTex(m_context, test_case.m_dst_target, test_case.m_dst_n_samples); 488848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = Utils::prepareMultisampleTex(m_context, test_case.m_src_target, test_case.m_src_n_samples); 488948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 489048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 489148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 489248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 489348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 489448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 489548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 489648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 489748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_src_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 489848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* srcZ */, m_dst_tex_name, test_case.m_dst_target, 0 /* dstLevel */, 0 /* dstX */, 489948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */); 490048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 490148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 490248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 490348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 490448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 490548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Free resources */ 490648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 490748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 490848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set result */ 490948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 491048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 491148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 491248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 491348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 491448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 491548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 491648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 491748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 491848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 491948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 492048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 492148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 492248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 492348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 492448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 492548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 492648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) 492748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Source target: " << glu::getTextureTargetStr(test_case.m_src_target) 492848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " samples: " << test_case.m_src_n_samples 492948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", destination target: " << glu::getTextureTargetStr(test_case.m_dst_target) 493048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " samples: " << test_case.m_dst_n_samples << tcu::TestLog::EndMessage; 493148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 493248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 493348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 493448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 493548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 493648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 493748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 493848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 493948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 494048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 494148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 494248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SamplesMissMatchTest::clean() 494348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 494448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 494548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 494648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures . Errors ignored */ 494748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_dst_tex_name); 494848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_src_tex_name); 494948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 495048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 495148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 495248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 495348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 495448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* IncompatibleFormatsCompressionTest */ 495548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 495648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 495748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 495848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 495948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosIncompatibleFormatsCompressionTest::IncompatibleFormatsCompressionTest(deqp::Context& context) 496048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, "incompatible_formats_compression", "Test verifies if INVALID_OPERATION is generated when " 496148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "textures provided to CopySubImageData are incompatible, " 496248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "one of formats is compressed") 496348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 496448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 496548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 496648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 496748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 496848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 496948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 497048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 497148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip 1D targets, not supported */ 497248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_TEXTURE_1D == tex_target) || (GL_TEXTURE_1D_ARRAY == tex_target) || (GL_TEXTURE_3D == tex_target) || 4973e3025e58894ca6c58880d8726d7fbce535e78ef5Slawomir Cygan (GL_TEXTURE_RECTANGLE == tex_target) || (GL_RENDERBUFFER == tex_target) || (GL_TEXTURE_CUBE_MAP_ARRAY == tex_target)) 497448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 497548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 497648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 497748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 497848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip multisampled and rectangle targets */ 497948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == Utils::isTargetMultisampled(tex_target)) 498048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 498148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 498248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 498348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 498448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Compressed 128bit vs RGBA32UI */ 498548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 498648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { 498748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tex_target, GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_COMPRESSED_RG_RGTC2, 498848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RG, GL_UNSIGNED_BYTE, GL_NO_ERROR 498948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 499048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 499148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 499248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 499348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 499448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Compressed 128bit vs RGBA16UI */ 499548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 499648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { 499748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tex_target, GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_COMPRESSED_RG_RGTC2, 499848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_RG, GL_UNSIGNED_BYTE, GL_INVALID_OPERATION 499948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 500048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 500148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 500248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 500348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 500448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 500548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 500648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 500748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 500848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 500948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 501048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult IncompatibleFormatsCompressionTest::iterate() 501148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 501248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 501348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 501448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 501548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 501648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint temp = 0; 501748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 501848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 501948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 502048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 502148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 502248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, test_case.m_dst_internal_format, 502348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_format, test_case.m_dst_type, temp); 502448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, test_case.m_src_internal_format, 502548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_format, test_case.m_src_type, temp); 502648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 502748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make textures complete */ 502848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */); 502948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */); 503048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 503148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 503248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 503348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 503448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 503548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 503648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 503748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 503848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 503948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* srcZ */, m_dst_tex_name, test_case.m_tex_target, 0 /* dstLevel */, 0 /* dstX */, 504048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, 4 /* srcWidth */, 4 /* srcHeight */, 1 /* srcDepth */); 504148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 504248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 504348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 504448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 504548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 504648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Remove resources */ 504748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 504848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 504948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 505048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 505148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 505248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 505348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 505448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 505548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 505648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 505748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 505848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 505948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 506048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 506148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 506248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 506348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 506448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 506548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 506648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) 506748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target) 506848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Source format: " << glu::getInternalFormatParameterStr(test_case.m_src_internal_format) 506948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Destination format: " << glu::getInternalFormatParameterStr(test_case.m_dst_internal_format) 507048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 507148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 507248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 507348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 507448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 507548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 507648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 507748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 507848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 507948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 508048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 508148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 508248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid IncompatibleFormatsCompressionTest::clean() 508348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 508448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 508548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 508648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 508748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_dst_tex_name); 508848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_src_tex_name); 508948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 509048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 509148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 509248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 509348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 509448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* MissMatchObjectTest */ 509548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 509648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 509748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 509848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 509948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosMissMatchObjectTest::MissMatchObjectTest(deqp::Context& context) 510048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase( 510148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos context, "missmatch_object", 510248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "Test verifies if INVALID_VALUE is generated when object & target provided to CopySubImageData do not match") 510348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_name(0) 510448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_name(0) 510548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 510648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 510748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const testCase test_cases[] = { { GL_TEXTURE_2D, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_NO_ERROR }, 510848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { GL_TEXTURE_2D, GL_RENDERBUFFER, GL_TEXTURE_2D, GL_INVALID_VALUE }, 510948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { GL_TEXTURE_2D, GL_TEXTURE_2D, GL_RENDERBUFFER, GL_INVALID_VALUE }, 511048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { GL_TEXTURE_2D, GL_RENDERBUFFER, GL_RENDERBUFFER, GL_INVALID_VALUE }, 511148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { GL_RENDERBUFFER, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_INVALID_VALUE }, 511248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { GL_RENDERBUFFER, GL_RENDERBUFFER, GL_TEXTURE_2D, GL_INVALID_VALUE }, 511348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { GL_RENDERBUFFER, GL_TEXTURE_2D, GL_RENDERBUFFER, GL_INVALID_VALUE }, 511448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { GL_RENDERBUFFER, GL_RENDERBUFFER, GL_RENDERBUFFER, GL_NO_ERROR } }; 511548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 511648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_test_cases = sizeof(test_cases) / sizeof(testCase); 511748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 511848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < n_test_cases; ++i) 511948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 512048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = test_cases[i]; 512148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 512248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 512348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 512448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 512548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 512648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 512748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 512848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 512948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 513048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult MissMatchObjectTest::iterate() 513148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 513248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 513348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 513448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 513548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 513648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint temp = 0; 513748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 513848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 513948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 514048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 514148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare objects */ 514248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER == test_case.m_obj_target) 514348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 514448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_name = Utils::prepareRenderBuffer(m_context, GL_RGBA8); 514548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_name = Utils::prepareRenderBuffer(m_context, GL_RGBA8); 514648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 514748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 514848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 514948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_name = 515048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTex16x16x6(m_context, test_case.m_obj_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp); 515148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_name = 515248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTex16x16x6(m_context, test_case.m_obj_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp); 515348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 515448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make textures complete */ 515548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_obj_target, m_dst_name, 0 /* base */, 0 /* max */); 515648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_obj_target, m_src_name, 0 /* base */, 0 /* max */); 515748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 515848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 515948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 516048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 516148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 516248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 516348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 516448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 516548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 516648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_name, test_case.m_src_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 0 /* srcZ */, 516748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_name, test_case.m_dst_target, 0 /* dstLevel */, 0 /* dstX */, 0 /* dstY */, 0 /* dstZ */, 516848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */); 516948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 517048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 517148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 517248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 517348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 517448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Remove resources */ 517548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 517648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 517748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 517848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 517948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 518048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 518148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 518248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 518348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 518448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 518548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 518648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 518748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 518848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 518948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 519048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 519148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 519248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 519348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 519448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) 519548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Object target: " << glu::getTextureTargetStr(test_case.m_obj_target) 519648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Source target: " << glu::getTextureTargetStr(test_case.m_src_target) 519748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Destination target: " << glu::getTextureTargetStr(test_case.m_dst_target) << tcu::TestLog::EndMessage; 519848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 519948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 520048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 520148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 520248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 520348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 520448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 520548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 520648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 520748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 520848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 520948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid MissMatchObjectTest::clean() 521048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 521148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 521248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 521348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 521448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures or renderbuffers. Errors ignored */ 521548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER == test_case.m_obj_target) 521648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 521748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteRenderbuffers(1, &m_dst_name); 521848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteRenderbuffers(1, &m_src_name); 521948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 522048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 522148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 522248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_dst_name); 522348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_src_name); 522448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 522548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 522648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_name = 0; 522748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_name = 0; 522848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 522948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 523048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* NonExistentMipMapTest */ 523148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 523248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 523348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 523448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 523548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosNonExistentMipMapTest::NonExistentMipMapTest(deqp::Context& context) 523648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, "non_existent_mipmap", "Test verifies if INVALID_VALUE is generated when CopySubImageData is " 523748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "executed for mipmap that does not exist") 523848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 523948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 524048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 524148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 524248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 524348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 524448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 524548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase test_case = { tex_target, 0, 0, GL_NO_ERROR }; 524648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 524748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_RENDERBUFFER == tex_target) 524848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 524948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 525048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 525148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 525248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 525348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 525448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Rest of cases is invalid */ 525548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_expected_result = GL_INVALID_VALUE; 525648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 525748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_level = 1; 525848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_level = 0; 525948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 526048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 526148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_level = 0; 526248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_level = 1; 526348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 526448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 526548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_level = 1; 526648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_level = 1; 526748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(test_case); 526848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 526948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 527048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 527148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 527248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 527348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 527448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 527548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult NonExistentMipMapTest::iterate() 527648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 527748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 527848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 527948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 528048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 528148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint temp = 0; 528248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 528348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 528448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 528548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 528648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 528748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 528848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp); 528948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 529048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp); 529148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 529248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make textures complete */ 529348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */); 529448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */); 529548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 529648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 529748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 529848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 529948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 530048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 530148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 530248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 530348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, test_case.m_src_level, 0 /* srcX */, 0 /* srcY */, 530448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* srcZ */, m_dst_tex_name, test_case.m_tex_target, test_case.m_dst_level, 0 /* dstX */, 530548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */); 530648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 530748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 530848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 530948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 531048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 531148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Free resources */ 531248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 531348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 531448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set result */ 531548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 531648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 531748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 531848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 531948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 532048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 532148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 532248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 532348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 532448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 532548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 532648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 532748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 532848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 532948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 533048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 533148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 533248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) 533348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target) 533448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", source level: " << test_case.m_src_level << ", destination level: " << test_case.m_dst_level 533548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 533648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 533748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 533848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 533948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 534048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 534148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 534248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 534348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 534448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 534548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 534648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 534748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid NonExistentMipMapTest::clean() 534848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 534948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 535048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 535148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 535248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_dst_tex_name); 535348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_src_tex_name); 535448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 535548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 535648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 535748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 535848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 535948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* ExceedingBoundariesTest */ 536048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint ExceedingBoundariesTest::m_region_depth = 4; 536148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint ExceedingBoundariesTest::m_region_height = 4; 536248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint ExceedingBoundariesTest::m_region_width = 4; 536348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 536448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 536548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 536648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 536748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 536848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosExceedingBoundariesTest::ExceedingBoundariesTest(deqp::Context& context) 536948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, "exceeding_boundaries", "Test verifies if INVALID_VALUE is generated when CopySubImageData is " 537048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "executed for regions exceeding image boundaries") 537148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 537248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 537348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 537448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 537548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 16x16x6 are values used by prepareTex16x16x6 */ 537648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint invalid_x = 16 - (m_region_width / 2); 537748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint invalid_y = 16 - (m_region_height / 2); 537848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint invalid_z = 6 - (m_region_depth / 2); 537948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 538048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint x_vals[] = { 0, invalid_x }; 538148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint y_vals[] = { 0, invalid_y }; 538248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint z_vals[] = { 0, invalid_z }; 538348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 538448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_x_vals = sizeof(x_vals) / sizeof(x_vals[0]); 538548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_y_vals = sizeof(y_vals) / sizeof(y_vals[0]); 538648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_z_vals = sizeof(z_vals) / sizeof(z_vals[0]); 538748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 538848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint target = 0; target < s_n_valid_targets; ++target) 538948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 539048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum tex_target = s_valid_targets[target]; 539148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint height = m_region_height; 539248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 539348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_TEXTURE_BUFFER == tex_target) 539448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 539548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 539648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 539748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 539848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_TEXTURE_1D == tex_target) || (GL_TEXTURE_1D_ARRAY == tex_target)) 539948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 540048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos height = 1; 540148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 540248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 540348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint x = 0; x < n_x_vals; ++x) 540448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 540548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint y = 0; y < n_y_vals; ++y) 540648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 540748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint z = 0; z < n_z_vals; ++z) 540848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 540948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint x_val = x_vals[x]; 541048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint y_val = y_vals[y]; 541148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint z_val = z_vals[z]; 541248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum res = ((0 == x_val) && (0 == y_val) && (0 == z_val)) ? GL_NO_ERROR : GL_INVALID_VALUE; 541348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint depth = 1; 541448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 541548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != z_val) 541648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 541748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if ((GL_TEXTURE_2D_ARRAY != tex_target) || (GL_TEXTURE_2D_MULTISAMPLE_ARRAY != tex_target) || 541848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (GL_TEXTURE_3D != tex_target) || (GL_TEXTURE_CUBE_MAP_ARRAY != tex_target)) 541948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 542048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Skip z != 0 for 2d textures */ 542148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos continue; 542248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 542348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 542448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 542548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set depth so as to exceed boundary */ 542648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos depth = m_region_depth; 542748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 542848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 542948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 543048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase src_test_case = { tex_target, depth, height, x_val, y_val, z_val, 0, 0, 0, res }; 543148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 543248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase dst_test_case = { tex_target, depth, height, 0, 0, 0, x_val, y_val, z_val, res }; 543348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 543448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(src_test_case); 543548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(dst_test_case); 543648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 543748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 543848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 543948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 544048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 544148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 544248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 544348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 544448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 544548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 544648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult ExceedingBoundariesTest::iterate() 544748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 544848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 544948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 545048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 545148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 545248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint temp = 0; 545348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 545448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 545548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 545648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 545748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 545848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 545948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp); 546048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 546148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp); 546248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 546348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make textures complete */ 546448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */); 546548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */); 546648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 546748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 546848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 546948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 547048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 547148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 547248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 547348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 547448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, 0 /* level */, test_case.m_src_x /* srcX */, 547548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_y /* srcY */, test_case.m_src_z /* srcZ */, m_dst_tex_name, 547648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_tex_target, 0 /* level */, test_case.m_dst_x /* dstX */, 547748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_y /* dstY */, test_case.m_dst_z /* dstZ */, m_region_width /* srcWidth */, 547848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_height /* srcHeight */, test_case.m_depth /* srcDepth */); 547948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 548048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 548148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 548248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 548348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 548448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Free resources */ 548548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 548648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 548748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set result */ 548848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 548948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 549048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 549148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 549248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 549348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 549448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 549548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 549648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 549748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 549848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 549948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 550048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 550148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 550248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 550348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 550448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 550548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) 550648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target) << ", source: [" 550748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << test_case.m_src_x << ", " << test_case.m_src_y << ", " << test_case.m_src_z << "], destination: [" 550848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << test_case.m_src_x << ", " << test_case.m_src_y << ", " << test_case.m_src_z 550948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "], depth: " << test_case.m_depth << tcu::TestLog::EndMessage; 551048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 551148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 551248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 551348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 551448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 551548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 551648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 551748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 551848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 551948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 552048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 552148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid ExceedingBoundariesTest::clean() 552248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 552348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 552448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 552548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 552648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::deleteTexture(m_context, test_case.m_tex_target, m_dst_tex_name); 552748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::deleteTexture(m_context, test_case.m_tex_target, m_src_tex_name); 552848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 552948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 553048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 553148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 553248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 553348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* InvalidAlignmentTest */ 553448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor 553548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 553648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context 553748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 553848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosInvalidAlignmentTest::InvalidAlignmentTest(deqp::Context& context) 553948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, "invalid_alignment", "Test verifies if INVALID_VALUE is generated when CopySubImageData is " 554048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "executed for regions with invalid alignment") 554148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_dst_tex_name(0) 554248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_src_tex_name(0) 554348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_test_case_index(0) 554448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 554548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 16x16x6 are values used by prepareTex16x16x6 */ 554648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint invalid_h = 2; 554748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint invalid_w = 2; 554848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint invalid_x = 2; 554948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint invalid_y = 2; 555048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint valid_h = 4; 555148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint valid_w = 4; 555248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 555348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint h_vals[] = { valid_h, invalid_h }; 555448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint w_vals[] = { valid_w, invalid_w }; 555548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint x_vals[] = { 0, invalid_x }; 555648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint y_vals[] = { 0, invalid_y }; 555748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 555848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_h_vals = sizeof(h_vals) / sizeof(h_vals[0]); 555948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_w_vals = sizeof(w_vals) / sizeof(w_vals[0]); 556048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_x_vals = sizeof(x_vals) / sizeof(x_vals[0]); 556148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const GLuint n_y_vals = sizeof(y_vals) / sizeof(y_vals[0]); 556248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 556348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint x = 0; x < n_x_vals; ++x) 556448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 556548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint y = 0; y < n_y_vals; ++y) 556648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 556748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint h = 0; h < n_h_vals; ++h) 556848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 556948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint w = 0; w < n_w_vals; ++w) 557048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 557148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint h_val = h_vals[h]; 557248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint w_val = w_vals[w]; 557348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint x_val = x_vals[x]; 557448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint y_val = y_vals[y]; 557548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLenum res = ((valid_h == h_val) && (valid_w == w_val) && (0 == x_val) && (0 == y_val)) ? 557648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_NO_ERROR : 557748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_INVALID_VALUE; 557848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 557948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase dst_test_case = { h_val, w_val, 0, 0, x_val, y_val, res }; 558048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 558148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos testCase src_test_case = { h_val, w_val, x_val, y_val, 0, 0, res }; 558248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 558348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(dst_test_case); 558448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_cases.push_back(src_test_case); 558548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 558648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 558748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 558848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 558948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 559048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 559148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test 559248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 559348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise 559448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 559548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult InvalidAlignmentTest::iterate() 559648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 559748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum error = GL_NO_ERROR; 559848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 559948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP; 560048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool result = false; 560148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint temp = 0; 560248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const testCase& test_case = m_test_cases[m_test_case_index]; 560348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 560448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 560548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 560648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare textures */ 560748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 560848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTex16x16x6(m_context, GL_TEXTURE_2D, GL_COMPRESSED_RG_RGTC2, GL_RG, GL_UNSIGNED_BYTE, temp); 560948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 561048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::prepareTex16x16x6(m_context, GL_TEXTURE_2D, GL_COMPRESSED_RG_RGTC2, GL_RG, GL_UNSIGNED_BYTE, temp); 561148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 561248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make textures complete */ 561348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, GL_TEXTURE_2D, m_dst_tex_name, 0 /* base */, 0 /* max */); 561448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Utils::makeTextureComplete(m_context, GL_TEXTURE_2D, m_src_tex_name, 0 /* base */, 0 /* max */); 561548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 561648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (tcu::Exception& exc) 561748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 561848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 561948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw exc; 562048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 562148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 562248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Execute CopyImageSubData */ 562348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.copyImageSubData(m_src_tex_name, GL_TEXTURE_2D, 0 /* level */, test_case.m_src_x /* srcX */, 562448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_src_y /* srcY */, 0 /* srcZ */, m_dst_tex_name, GL_TEXTURE_2D, 0 /* level */, 562548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_dst_x /* dstX */, test_case.m_dst_y /* dstY */, 0 /* dstZ */, 562648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos test_case.m_width /* srcWidth */, test_case.m_height /* srcHeight */, 1 /* srcDepth */); 562748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 562848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Verify generated error */ 562948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos error = gl.getError(); 563048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result = (test_case.m_expected_result == error); 563148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 563248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Free resources */ 563348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 563448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 563548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set result */ 563648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (true == result) 563748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 563848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 563948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 564048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Increase index */ 564148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_test_case_index += 1; 564248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 564348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Are there any test cases left */ 564448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_test_cases.size() > m_test_case_index) 564548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 564648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos it_result = tcu::TestNode::CONTINUE; 564748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 564848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 564948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 565048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 565148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 565248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result) 565348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " got: " << glu::getErrorStr(error) << ". source: [" << test_case.m_src_x << ", " << test_case.m_src_y 565448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "], destination: [" << test_case.m_src_x << ", " << test_case.m_src_y << "], size: " << test_case.m_width 565548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " x " << test_case.m_height << tcu::TestLog::EndMessage; 565648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 565748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 565848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 565948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 566048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Done */ 566148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return it_result; 566248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 566348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 566448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources 566548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 566648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/ 566748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid InvalidAlignmentTest::clean() 566848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 566948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const Functions& gl = m_context.getRenderContext().getFunctions(); 567048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 567148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean textures and buffers. Errors ignored */ 567248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_dst_tex_name); 567348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &m_src_tex_name); 567448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 567548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_dst_tex_name = 0; 567648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_src_tex_name = 0; 567748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 567848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} /* namespace CopyImage */ 567948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 568048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosCopyImageTests::CopyImageTests(deqp::Context& context) : TestCaseGroup(context, "copy_image", "") 568148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 568248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 568348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 568448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosCopyImageTests::~CopyImageTests(void) 568548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 568648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 568748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 568848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid CopyImageTests::init() 568948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 569048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::FunctionalTest(m_context)); 569148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::IncompleteTexTest(m_context)); 569248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::MissMatchObjectTest(m_context)); 569348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::SmokeTest(m_context)); 569448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::InvalidTargetTest(m_context)); 569548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::TargetMissMatchTest(m_context)); 569648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::IncompatibleFormatsTest(m_context)); 569748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::SamplesMissMatchTest(m_context)); 569848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::IncompatibleFormatsCompressionTest(m_context)); 569948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::NonExistentMipMapTest(m_context)); 570048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::ExceedingBoundariesTest(m_context)); 570148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new CopyImage::InvalidAlignmentTest(m_context)); 570248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 570348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} /* namespace gl4cts */ 5704