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