es31fCopyImageTests.cpp revision 433e5704171098c7cd062c7339b259ad76a55678
1433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi/*------------------------------------------------------------------------- 2433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * drawElements Quality Program OpenGL ES 3.1 Module 3433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * ------------------------------------------------- 4433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * 5433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * Copyright 2014 The Android Open Source Project 6433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * 7433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * Licensed under the Apache License, Version 2.0 (the "License"); 8433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * you may not use this file except in compliance with the License. 9433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * You may obtain a copy of the License at 10433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * 11433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * http://www.apache.org/licenses/LICENSE-2.0 12433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * 13433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * Unless required by applicable law or agreed to in writing, software 14433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * distributed under the License is distributed on an "AS IS" BASIS, 15433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * See the License for the specific language governing permissions and 17433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * limitations under the License. 18433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * 19433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *//*! 20433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * \file 21433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * \brief Copy image tests for GL_EXT_copy_image. 22433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *//*--------------------------------------------------------------------*/ 23433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 24433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "es31fCopyImageTests.hpp" 25433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 26433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tes31TestCase.hpp" 27433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 28433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "glsTextureTestUtil.hpp" 29433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 30433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluContextInfo.hpp" 31433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluObjectWrapper.hpp" 32433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluRenderContext.hpp" 33433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluStrUtil.hpp" 34433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluTextureUtil.hpp" 35433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluPixelTransfer.hpp" 36433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 37433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "glwEnums.hpp" 38433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "glwFunctions.hpp" 39433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 40433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuCompressedTexture.hpp" 41433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuFloat.hpp" 42433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuImageCompare.hpp" 43433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuTestLog.hpp" 44433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuTexture.hpp" 45433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuTextureUtil.hpp" 46433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuVector.hpp" 47433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuVectorUtil.hpp" 48433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuSeedBuilder.hpp" 49433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 50433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deArrayBuffer.hpp" 51433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deFloat16.h" 52433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deRandom.hpp" 53433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deStringUtil.hpp" 54433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deUniquePtr.hpp" 55433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 56433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include <map> 57433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include <string> 58433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include <vector> 59433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 60433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing namespace deqp::gls::TextureTestUtil; 61433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 62433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::Float; 63433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::IVec3; 64433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::Sampler; 65433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::ScopedLogSection; 66433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::TestLog; 67433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::Vec4; 68433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::SeedBuilder; 69433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 70433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing de::ArrayBuffer; 71433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 72433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing std::map; 73433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing std::string; 74433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing std::vector; 75433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing std::pair; 76433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 77433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvinamespace deqp 78433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 79433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvinamespace gles31 80433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 81433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvinamespace Functional 82433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 83433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvinamespace 84433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 85433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 86433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvienum ViewClass 87433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 88433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_128_BITS = 0, 89433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_96_BITS, 90433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_64_BITS, 91433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_48_BITS, 92433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_32_BITS, 93433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_24_BITS, 94433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_16_BITS, 95433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_8_BITS, 96433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 97433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_EAC_R11, 98433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_EAC_RG11, 99433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ETC2_RGB, 100433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ETC2_RGBA, 101433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ETC2_EAC_RGBA, 102433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_4x4_RGBA, 103433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_5x4_RGBA, 104433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_5x5_RGBA, 105433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_6x5_RGBA, 106433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_6x6_RGBA, 107433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_8x5_RGBA, 108433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_8x6_RGBA, 109433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_8x8_RGBA, 110433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_10x5_RGBA, 111433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_10x6_RGBA, 112433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_10x8_RGBA, 113433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_10x10_RGBA, 114433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_12x10_RGBA, 115433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi VIEWCLASS_ASTC_12x12_RGBA 116433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}; 117433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 118433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviconst char* viewClassToName (ViewClass viewClass) 119433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 120433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi switch (viewClass) 121433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 122433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_128_BITS: return "viewclass_128_bits"; 123433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_96_BITS: return "viewclass_96_bits"; 124433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_64_BITS: return "viewclass_64_bits"; 125433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_48_BITS: return "viewclass_48_bits"; 126433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_32_BITS: return "viewclass_32_bits"; 127433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_24_BITS: return "viewclass_24_bits"; 128433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_16_BITS: return "viewclass_16_bits"; 129433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_8_BITS: return "viewclass_8_bits"; 130433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_EAC_R11: return "viewclass_eac_r11"; 131433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_EAC_RG11: return "viewclass_eac_rg11"; 132433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ETC2_RGB: return "viewclass_etc2_rgb"; 133433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ETC2_RGBA: return "viewclass_etc2_rgba"; 134433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ETC2_EAC_RGBA: return "viewclass_etc2_eac_rgba"; 135433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_4x4_RGBA: return "viewclass_astc_4x4_rgba"; 136433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_5x4_RGBA: return "viewclass_astc_5x4_rgba"; 137433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_5x5_RGBA: return "viewclass_astc_5x5_rgba"; 138433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_6x5_RGBA: return "viewclass_astc_6x5_rgba"; 139433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_6x6_RGBA: return "viewclass_astc_6x6_rgba"; 140433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_8x5_RGBA: return "viewclass_astc_8x5_rgba"; 141433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_8x6_RGBA: return "viewclass_astc_8x6_rgba"; 142433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_8x8_RGBA: return "viewclass_astc_8x8_rgba"; 143433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_10x5_RGBA: return "viewclass_astc_10x5_rgba"; 144433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_10x6_RGBA: return "viewclass_astc_10x6_rgba"; 145433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_10x8_RGBA: return "viewclass_astc_10x8_rgba"; 146433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_10x10_RGBA: return "viewclass_astc_10x10_rgba"; 147433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_12x10_RGBA: return "viewclass_astc_12x10_rgba"; 148433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case VIEWCLASS_ASTC_12x12_RGBA: return "viewclass_astc_12x12_rgba"; 149433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 150433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi default: 151433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(false); 152433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return NULL; 153433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 154433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 155433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 156433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviconst char* targetToName (deUint32 target) 157433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 158433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi switch (target) 159433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 160433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RENDERBUFFER: return "renderbuffer"; 161433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_2D: return "texture2d"; 162433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_3D: return "texture3d"; 163433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_2D_ARRAY: return "texture2d_array"; 164433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_CUBE_MAP: return "cubemap"; 165433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 166433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi default: 167433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(false); 168433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return NULL; 169433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 170433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 171433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 172433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isCompressedFormat (deUint32 format) 173433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 174433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi switch (format) 175433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 176433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_R11_EAC: 177433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SIGNED_R11_EAC: 178433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RG11_EAC: 179433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SIGNED_RG11_EAC: 180433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGB8_ETC2: 181433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ETC2: 182433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 183433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 184433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA8_ETC2_EAC: 185433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 186433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: 187433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: 188433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: 189433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: 190433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: 191433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: 192433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: 193433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: 194433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: 195433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: 196433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: 197433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: 198433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: 199433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: 200433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 201433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 202433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 203433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 204433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 205433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 206433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 207433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 208433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 209433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 210433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 211433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 212433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 213433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 214433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return true; 215433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 216433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi default: 217433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return false; 218433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 219433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 220433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 221433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvistring formatToName (deUint32 format) 222433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 223433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi string enumName; 224433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 225433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(format)) 226433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi enumName = glu::getCompressedTexFormatStr(format).toString().substr(14); // Strip GL_COMPRESSED_ 227433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 228433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi enumName = glu::getPixelFormatStr(format).toString().substr(3); // Strip GL_ 229433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 230433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return de::toLower(enumName); 231433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 232433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 233433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isFloatFormat (deUint32 format) 234433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 235433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(format)) 236433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return false; 237433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 238433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT; 239433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 240433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 241433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isUintFormat (deUint32 format) 242433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 243433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(format)) 244433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return false; 245433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 246433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 247433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 248433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 249433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isIntFormat (deUint32 format) 250433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 251433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(format)) 252433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return false; 253433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 254433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER; 255433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 256433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 257433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isTextureTarget (deUint32 target) 258433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 259433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return target != GL_RENDERBUFFER; 260433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 261433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 262433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint getTargetTexDims (deUint32 target) 263433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 264433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(isTextureTarget(target)); 265433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 266433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi switch (target) 267433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 268433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_1D: 269433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return 1; 270433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 271433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_1D_ARRAY: 272433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_2D: 273433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_CUBE_MAP: 274433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return 2; 275433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 276433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_2D_ARRAY: 277433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_3D: 278433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return 3; 279433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 280433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi default: 281433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(false); 282433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return -1; 283433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 284433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 285433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 286433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviclass ImageInfo 287433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 288433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvipublic: 289433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ImageInfo (deUint32 format, deUint32 target, const IVec3& size); 290433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 291433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 getFormat (void) const { return m_format; } 292433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 getTarget (void) const { return m_target; } 293433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& getSize (void) const { return m_size; } 294433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 295433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviprivate: 296433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 m_format; 297433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 m_target; 298433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi IVec3 m_size; 299433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}; 300433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 301433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviImageInfo::ImageInfo (deUint32 format, deUint32 target, const IVec3& size) 302433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi : m_format (format) 303433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , m_target (target) 304433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , m_size (size) 305433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 306433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(m_target == GL_TEXTURE_2D_ARRAY || m_target == GL_TEXTURE_3D || m_size.z() == 1); 307433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(isTextureTarget(m_target) || !isCompressedFormat(m_target)); 308433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 309433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 310433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 311433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviSeedBuilder& operator<< (SeedBuilder& builder, const ImageInfo& info) 312433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 313433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi builder << info.getFormat() << info.getTarget() << info.getSize(); 314433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return builder; 315433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 316433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 317433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviconst glu::ObjectTraits& getObjectTraits (const ImageInfo& info) 318433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 319433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isTextureTarget(info.getTarget())) 320433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return glu::objectTraits(glu::OBJECTTYPE_TEXTURE); 321433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 322433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return glu::objectTraits(glu::OBJECTTYPE_RENDERBUFFER); 323433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 324433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 325433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint getLevelCount (const ImageInfo& info) 326433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 327433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 target = info.getTarget(); 328433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 size = info.getSize(); 329433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 330433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (target == GL_RENDERBUFFER) 331433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return 1; 332433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (target == GL_TEXTURE_2D_ARRAY) 333433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 334433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int maxSize = de::max(size.x(), size.y()); 335433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 336433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return deLog2Ceil32(maxSize); 337433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 338433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 339433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 340433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int maxSize = de::max(size.x(), de::max(size.y(), size.z())); 341433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 342433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return deLog2Ceil32(maxSize); 343433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 344433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 345433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 346433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi// Return format that has more restrictions on texel data. 347433e5704171098c7cd062c7339b259ad76a55678Mika IsojärvideUint32 getMoreRestrictiveFormat (deUint32 formatA, deUint32 formatB) 348433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 349433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (formatA == formatB) 350433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return formatA; 351433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isCompressedFormat(formatA) && isAstcFormat(glu::mapGLCompressedTexFormat(formatA))) 352433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return formatA; 353433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isCompressedFormat(formatB) && isAstcFormat(glu::mapGLCompressedTexFormat(formatB))) 354433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return formatB; 355433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isFloatFormat(formatA)) 356433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 357433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(!isFloatFormat(formatB)); 358433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 359433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return formatA; 360433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 361433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isFloatFormat(formatB)) 362433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 363433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(!isFloatFormat(formatA)); 364433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 365433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return formatB; 366433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 367433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isCompressedFormat(formatA)) 368433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 369433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return formatA; 370433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 371433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isCompressedFormat(formatB)) 372433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 373433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return formatB; 374433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 375433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 376433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return formatA; 377433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 378433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 379433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint getTexelBlockSize (deUint32 format) 380433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 381433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(format)) 382433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return tcu::getBlockSize(glu::mapGLCompressedTexFormat(format)); 383433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 384433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return glu::mapGLInternalFormat(format).getPixelSize(); 385433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 386433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 387433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 getTexelBlockPixelSize (deUint32 format) 388433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 389433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(format)) 390433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return tcu::getBlockPixelSize(glu::mapGLCompressedTexFormat(format)); 391433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 392433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return IVec3(1, 1, 1); 393433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 394433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 395433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 getLevelSize (deUint32 target, const IVec3& baseSize, int level) 396433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 397433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi IVec3 size; 398433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 399433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (target != GL_TEXTURE_2D_ARRAY) 400433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 401433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int i = 0; i < 3; i++) 402433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi size[i] = de::max(baseSize[i] >> level, 1); 403433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 404433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 405433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 406433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int i = 0; i < 2; i++) 407433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi size[i] = de::max(baseSize[i] >> level, 1); 408433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 409433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi size[2] = baseSize[2]; 410433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 411433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 412433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return size; 413433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 414433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 415433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isColorRenderable (deUint32 format) 416433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 417433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi switch (format) 418433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 419433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_R8: 420433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RG8: 421433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGB8: 422433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGB565: 423433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGB4: 424433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGB5_A1: 425433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGBA8: 426433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGB10_A2: 427433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGB10_A2UI: 428433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_SRGB8_ALPHA8: 429433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_R8I: 430433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_R8UI: 431433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_R16I: 432433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_R16UI: 433433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_R32I: 434433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_R32UI: 435433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RG8I: 436433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RG8UI: 437433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RG16I: 438433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RG16UI: 439433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RG32I: 440433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RG32UI: 441433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGBA8I: 442433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGBA8UI: 443433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGBA16I: 444433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGBA16UI: 445433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGBA32I: 446433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RGBA32UI: 447433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return true; 448433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 449433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi default: 450433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return false; 451433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 452433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 453433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 454433e5704171098c7cd062c7339b259ad76a55678Mika IsojärvideUint32 getTypeForInternalFormat (deUint32 format) 455433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 456433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return glu::getTransferFormat(glu::mapGLInternalFormat(format)).dataType; 457433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 458433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 459433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genTexel (de::Random& rng, deUint32 glFormat, int texelBlockSize, const int texelCount, deUint8* buffer) 460433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 461433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isFloatFormat(glFormat)) 462433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 463433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat format = glu::mapGLInternalFormat(glFormat); 464433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::PixelBufferAccess access (format, texelCount, 1, 1, buffer); 465433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormatInfo info = tcu::getTextureFormatInfo(format); 466433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 467433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int texelNdx = 0; texelNdx < texelCount; texelNdx++) 468433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 469433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const float red = rng.getFloat(info.valueMin.x(), info.valueMax.x()); 470433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const float green = rng.getFloat(info.valueMin.y(), info.valueMax.y()); 471433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const float blue = rng.getFloat(info.valueMin.z(), info.valueMax.z()); 472433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const float alpha = rng.getFloat(info.valueMin.w(), info.valueMax.w()); 473433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 474433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const Vec4 color (red, green, blue, alpha); 475433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 476433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi access.setPixel(color, texelNdx, 0, 0); 477433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 478433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 479433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isCompressedFormat(glFormat)) 480433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 481433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::CompressedTexFormat compressedFormat = glu::mapGLCompressedTexFormat(glFormat); 482433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 483433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (tcu::isAstcFormat(compressedFormat)) 484433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 485433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int BLOCK_SIZE = 16; 486433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint8 blocks[][BLOCK_SIZE] = 487433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 488433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // \note All of the following blocks are valid in LDR mode. 489433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 252, 253, 255, 255, 255, 255, 255, 255, 8, 71, 90, 78, 22, 17, 26, 66, }, 490433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 252, 253, 255, 255, 255, 255, 255, 255, 220, 74, 139, 235, 249, 6, 145, 125 }, 491433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 252, 253, 255, 255, 255, 255, 255, 255, 223, 251, 28, 206, 54, 251, 160, 174 }, 492433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 252, 253, 255, 255, 255, 255, 255, 255, 39, 4, 153, 219, 180, 61, 51, 37 }, 493433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 67, 2, 0, 254, 1, 0, 64, 215, 83, 211, 159, 105, 41, 140, 50, 2 }, 494433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 67, 130, 0, 170, 84, 255, 65, 215, 83, 211, 159, 105, 41, 140, 50, 2 }, 495433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 67, 2, 129, 38, 51, 229, 95, 215, 83, 211, 159, 105, 41, 140, 50, 2 }, 496433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 67, 130, 193, 56, 213, 144, 95, 215, 83, 211, 159, 105, 41, 140, 50, 2 } 497433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi }; 498433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 499433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(texelBlockSize == BLOCK_SIZE); 500433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 501433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int i = 0; i < texelCount; i++) 502433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 503433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int blockNdx = rng.getInt(0, DE_LENGTH_OF_ARRAY(blocks)-1); 504433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 505433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deMemcpy(buffer + i * BLOCK_SIZE, blocks[blockNdx], BLOCK_SIZE); 506433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 507433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 508433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 509433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 510433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int i = 0; i < texelBlockSize * texelCount; i++) 511433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 512433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint8 val = rng.getUint8(); 513433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 514433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi buffer[i] = val; 515433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 516433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 517433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 518433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 519433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 520433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int i = 0; i < texelBlockSize * texelCount; i++) 521433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 522433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint8 val = rng.getUint8(); 523433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 524433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi buffer[i] = val; 525433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 526433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 527433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 528433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 529433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 divRoundUp (const IVec3& a, const IVec3& b) 530433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 531433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi IVec3 res; 532433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 533433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int i =0; i < 3; i++) 534433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi res[i] = a[i] / b[i] + ((a[i] % b[i]) ? 1 : 0); 535433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 536433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return res; 537433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 538433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 539433e5704171098c7cd062c7339b259ad76a55678Mika IsojärvideUint32 mapFaceNdxToFace (int ndx) 540433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 541433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 cubeFaces[] = 542433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 543433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_CUBE_MAP_POSITIVE_X, 544433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 545433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 546433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 547433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 548433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 549433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 550433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 551433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi }; 552433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 553433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return de::getSizedArrayElement(cubeFaces, ndx); 554433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 555433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 556433e5704171098c7cd062c7339b259ad76a55678Mika IsojärvideUint32 getFormatForInternalFormat (deUint32 format) 557433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 558433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return glu::getTransferFormat(glu::mapGLInternalFormat(format)).format; 559433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 560433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 561433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genericTexImage (const glw::Functions& gl, 562433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 target, 563433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int faceNdx, 564433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int level, 565433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& size, 566433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 format, 567433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi size_t dataSize, 568433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const void* data) 569433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 570433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 glTarget = (target == GL_TEXTURE_CUBE_MAP ? mapFaceNdxToFace(faceNdx) : target); 571433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 572433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(target == GL_TEXTURE_CUBE_MAP || faceNdx == 0); 573433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 574433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(format)) 575433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 576433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi switch (getTargetTexDims(target)) 577433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 578433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case 2: 579433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(size.z() == 1); 580433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.compressedTexImage2D(glTarget, level, format, size.x(), size.y(), 0, dataSize, data); 581433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D failed."); 582433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi break; 583433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 584433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case 3: 585433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.compressedTexImage3D(glTarget, level, format, size.x(), size.y(), size.z(), 0, dataSize, data); 586433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage3D failed."); 587433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi break; 588433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 589433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi default: 590433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(false); 591433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 592433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 593433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 594433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 595433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 glFormat = getFormatForInternalFormat(format); 596433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 glType = getTypeForInternalFormat(format); 597433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 598433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi switch (getTargetTexDims(target)) 599433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 600433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case 2: 601433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(size.z() == 1); 602433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texImage2D(glTarget, level, format, size.x(), size.y(), 0, glFormat, glType, data); 603433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D failed."); 604433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi break; 605433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 606433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case 3: 607433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texImage3D(glTarget, level, format, size.x(), size.y(), size.z(), 0, glFormat, glType, data); 608433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D failed."); 609433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi break; 610433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 611433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi default: 612433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(false); 613433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 614433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 615433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 616433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 617433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genTextureImage (const glw::Functions& gl, 618433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 619433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 620433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& levels, 621433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info, 622433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 moreRestrictiveFormat) 623433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 624433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int texelBlockSize = getTexelBlockSize(info.getFormat()); 625433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(info.getFormat()); 626433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 size = info.getSize(); 627433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 628433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levels.resize(getLevelCount(info)); 629433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 630433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.pixelStorei(GL_UNPACK_ALIGNMENT, 1); 631433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Setting pixel store aligment failed."); 632433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 633433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(info.getTarget(), name); 634433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Binding texture failed."); 635433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 636433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int levelNdx = 0; levelNdx < getLevelCount(info); levelNdx++) 637433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 638433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ArrayBuffer<deUint8>& level = levels[levelNdx]; 639433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 640433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int faceCount = (info.getTarget() == GL_TEXTURE_CUBE_MAP ? 6 : 1); 641433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 642433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelPixelSize = getLevelSize(info.getTarget(), info.getSize(), levelNdx); 643433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelTexelBlockSize = divRoundUp(levelPixelSize, texelBlockPixelSize); 644433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int levelTexelBlockCount = levelTexelBlockSize.x() * levelTexelBlockSize.y() * levelTexelBlockSize.z(); 645433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int levelSize = levelTexelBlockCount * texelBlockSize; 646433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 647433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi level.setStorage(levelSize * faceCount); 648433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 649433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int faceNdx = 0; faceNdx < faceCount; faceNdx++) 650433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 651433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi genTexel(rng, moreRestrictiveFormat, texelBlockSize, levelTexelBlockCount, level.getElementPtr(faceNdx * levelSize)); 652433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 653433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi genericTexImage(gl, info.getTarget(), faceNdx, levelNdx, levelPixelSize, info.getFormat(), levelSize, level.getElementPtr(faceNdx * levelSize)); 654433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 655433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 656433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 657433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(info.getTarget(), 0); 658433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Unbinding texture failed."); 659433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 660433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 661433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genRenderbufferImage (const glw::Functions& gl, 662433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 663433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 664433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& levels, 665433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info, 666433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 moreRestrictiveFormat) 667433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 668433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 size = info.getSize(); 669433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat format = glu::mapGLInternalFormat(info.getFormat()); 670433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 671433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(info.getTarget() == GL_RENDERBUFFER); 672433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(info.getSize().z() == 1); 673433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(getLevelCount(info) == 1); 674433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(!isCompressedFormat(info.getFormat())); 675433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 676433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::Framebuffer framebuffer(gl); 677433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 678433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levels.resize(1); 679433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levels[0].setStorage(format.getPixelSize() * size.x() * size.y()); 680433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::PixelBufferAccess refAccess(format, size.x(), size.y(), 1, levels[0].getPtr()); 681433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 682433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindRenderbuffer(GL_RENDERBUFFER, name); 683433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.renderbufferStorage(GL_RENDERBUFFER, info.getFormat(), info.getSize().x(), info.getSize().y()); 684433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Binding and setting storage for renderbuffer failed."); 685433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 686433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindFramebuffer(GL_FRAMEBUFFER, *framebuffer); 687433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, name); 688433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Binding framebuffer and attaching renderbuffer failed."); 689433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 690433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 691433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<deUint8> texelBlock(format.getPixelSize()); 692433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 693433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi genTexel(rng, moreRestrictiveFormat, format.getPixelSize(), 1, &(texelBlock[0])); 694433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 695433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 696433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::ConstPixelBufferAccess texelAccess (format, 1, 1, 1, &(texelBlock[0])); 697433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 698433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isFloatFormat(info.getFormat())) 699433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 700433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Vec4 color = texelAccess.getPixel(0, 0, 0); 701433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 702433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.clearBufferfv(GL_COLOR, 0, (const float*)&color); 703433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer."); 704433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 705433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::clear(refAccess, color); 706433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 707433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isIntFormat(info.getFormat())) 708433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 709433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::IVec4 color = texelAccess.getPixelInt(0, 0, 0); 710433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 711433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.clearBufferiv(GL_COLOR, 0, (const deInt32*)&color); 712433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer."); 713433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 714433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::clear(refAccess, color); 715433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 716433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isUintFormat(info.getFormat())) 717433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 718433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::IVec4 color = texelAccess.getPixelInt(0, 0, 0); 719433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 720433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.clearBufferuiv(GL_COLOR, 0, (const deUint32*)&color); 721433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer."); 722433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 723433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::clear(refAccess, color); 724433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 725433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 726433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 727433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Vec4 color = texelAccess.getPixel(0, 0, 0); 728433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 729433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.clearColor(color.x(), color.y(), color.z(), color.w()); 730433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.clear(GL_COLOR_BUFFER_BIT); 731433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer."); 732433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 733433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::clear(refAccess, color); 734433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 735433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 736433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 737433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 738433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindRenderbuffer(GL_RENDERBUFFER, 0); 739433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindFramebuffer(GL_FRAMEBUFFER, 0); 740433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind renderbufer and framebuffer."); 741433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 742433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 743433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 744433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 745433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genImage (const glw::Functions& gl, 746433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 747433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 748433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& levels, 749433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info, 750433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 moreRestrictiveFormat) 751433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 752433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isTextureTarget(info.getTarget())) 753433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi genTextureImage(gl, rng, name, levels, info, moreRestrictiveFormat); 754433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 755433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi genRenderbufferImage(gl, rng, name, levels, info, moreRestrictiveFormat); 756433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 757433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 758433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 getTexelBlockStride (const ImageInfo& info, int level) 759433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 760433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 size = getLevelSize(info.getTarget(), info.getSize(), level); 761433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int texelBlockSize = getTexelBlockSize(info.getFormat()); 762433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(info.getFormat()); 763433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 textureTexelBlockSize = divRoundUp(size, texelBlockPixelSize); 764433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 765433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return IVec3(texelBlockSize, textureTexelBlockSize.x() * texelBlockSize, textureTexelBlockSize.x() * textureTexelBlockSize.y() * texelBlockSize); 766433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 767433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 768433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint sumComponents (const IVec3& v) 769433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 770433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int s = 0; 771433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 772433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int i = 0; i < 3; i++) 773433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi s += v[i]; 774433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 775433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return s; 776433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 777433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 778433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid copyImageData (vector<ArrayBuffer<deUint8> >& dstImageData, 779433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& dstImageInfo, 780433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int dstLevel, 781433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& dstPos, 782433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 783433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<ArrayBuffer<deUint8> >& srcImageData, 784433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& srcImageInfo, 785433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int srcLevel, 786433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& srcPos, 787433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 788433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& copySize) 789433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 790433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ArrayBuffer<deUint8>& srcLevelData = srcImageData[srcLevel]; 791433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ArrayBuffer<deUint8>& dstLevelData = dstImageData[dstLevel]; 792433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 793433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcTexelBlockPixelSize = getTexelBlockPixelSize(srcImageInfo.getFormat()); 794433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int srcTexelBlockSize = getTexelBlockSize(srcImageInfo.getFormat()); 795433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcTexelPos = srcPos / srcTexelBlockPixelSize; 796433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcTexelBlockStride = getTexelBlockStride(srcImageInfo, srcLevel); 797433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 798433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstTexelBlockPixelSize = getTexelBlockPixelSize(dstImageInfo.getFormat()); 799433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int dstTexelBlockSize = getTexelBlockSize(dstImageInfo.getFormat()); 800433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstTexelPos = dstPos / dstTexelBlockPixelSize; 801433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstTexelBlockStride = getTexelBlockStride(dstImageInfo, dstLevel); 802433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 803433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 copyTexelBlockCount = copySize / srcTexelBlockPixelSize; 804433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int texelBlockSize = srcTexelBlockSize; 805433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 806433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(srcTexelBlockSize == dstTexelBlockSize); 807433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_UNREF(dstTexelBlockSize); 808433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 809433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT((copySize.x() % srcTexelBlockPixelSize.x()) == 0); 810433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT((copySize.y() % srcTexelBlockPixelSize.y()) == 0); 811433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT((copySize.z() % srcTexelBlockPixelSize.z()) == 0); 812433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 813433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT((srcPos.x() % srcTexelBlockPixelSize.x()) == 0); 814433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT((srcPos.y() % srcTexelBlockPixelSize.y()) == 0); 815433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT((srcPos.z() % srcTexelBlockPixelSize.z()) == 0); 816433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 817433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int z = 0; z < copyTexelBlockCount.z(); z++) 818433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int y = 0; y < copyTexelBlockCount.y(); y++) 819433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 820433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 blockPos (0, y, z); 821433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint8* const srcPtr = srcLevelData.getElementPtr(sumComponents((srcTexelPos + blockPos) * srcTexelBlockStride)); 822433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint8* const dstPtr = dstLevelData.getElementPtr(sumComponents((dstTexelPos + blockPos) * dstTexelBlockStride)); 823433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int copyLineSize = copyTexelBlockCount.x() * texelBlockSize; 824433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 825433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deMemcpy(dstPtr, srcPtr, copyLineSize); 826433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 827433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 828433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 829433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivector<tcu::ConstPixelBufferAccess> getLevelAccesses (const vector<ArrayBuffer<deUint8> >& data, const ImageInfo& info) 830433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 831433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat format = glu::mapGLInternalFormat(info.getFormat()); 832433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 size = info.getSize(); 833433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 834433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<tcu::ConstPixelBufferAccess> result; 835433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 836433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT((int)data.size() == getLevelCount(info)); 837433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 838433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int level = 0; level < (int)data.size(); level++) 839433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 840433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelSize = getLevelSize(info.getTarget(), size, level); 841433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 842433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi result.push_back(tcu::ConstPixelBufferAccess(format, levelSize.x(), levelSize.y(), levelSize.z(), data[level].getPtr())); 843433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 844433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 845433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return result; 846433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 847433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 848433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivector<tcu::ConstPixelBufferAccess> getCubeLevelAccesses (const vector<ArrayBuffer<deUint8> >& data, 849433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info, 850433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int faceNdx) 851433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 852433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat format = glu::mapGLInternalFormat(info.getFormat()); 853433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 size = info.getSize(); 854433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int texelBlockSize = getTexelBlockSize(info.getFormat()); 855433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(info.getFormat()); 856433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<tcu::ConstPixelBufferAccess> result; 857433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 858433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(info.getTarget() == GL_TEXTURE_CUBE_MAP); 859433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT((int)data.size() == getLevelCount(info)); 860433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 861433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int level = 0; level < (int)data.size(); level++) 862433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 863433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelPixelSize = getLevelSize(info.getTarget(), size, level); 864433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelTexelBlockSize = divRoundUp(levelPixelSize, texelBlockPixelSize); 865433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int levelTexelBlockCount = levelTexelBlockSize.x() * levelTexelBlockSize.y() * levelTexelBlockSize.z(); 866433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int levelSize = levelTexelBlockCount * texelBlockSize; 867433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 868433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi result.push_back(tcu::ConstPixelBufferAccess(format, levelPixelSize.x(), levelPixelSize.y(), levelPixelSize.z(), data[level].getElementPtr(levelSize * faceNdx))); 869433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 870433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 871433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return result; 872433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 873433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 874433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid copyImage (const glw::Functions& gl, 875433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 876433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 dstName, 877433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& dstImageData, 878433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& dstImageInfo, 879433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int dstLevel, 880433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& dstPos, 881433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 882433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 srcName, 883433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<ArrayBuffer<deUint8> >& srcImageData, 884433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& srcImageInfo, 885433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int srcLevel, 886433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& srcPos, 887433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 888433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& copySize) 889433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 890433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.copyImageSubData(srcName, srcImageInfo.getTarget(), srcLevel, srcPos.x(), srcPos.y(), srcPos.z(), 891433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi dstName, dstImageInfo.getTarget(), dstLevel, dstPos.x(), dstPos.y(), dstPos.z(), 892433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi copySize.x(), copySize.y(), copySize.z()); 893433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 894433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "glCopyImageSubData failed."); 895433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 896433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi copyImageData(dstImageData, dstImageInfo, dstLevel, dstPos, 897433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi srcImageData, srcImageInfo, srcLevel, srcPos, copySize); 898433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 899433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 900433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture2DView (tcu::TestContext& testContext, 901433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 902433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer& renderer, 903433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 904433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 905433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 906433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info, 907433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Texture2DView& refTexture) 908433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 909433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::TestLog& log = testContext.getLog(); 910433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const glw::Functions& gl = renderContext.getFunctions(); 911433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::RGBA threshold = renderContext.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 912433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat format = refTexture.getLevel(0).getFormat(); 913433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(format); 914433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 915433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ReferenceParams renderParams (TEXTURETYPE_2D); 916433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 917433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.samplerType = getSamplerType(format); 918433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST); 919433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.colorScale = spec.lookupScale; 920433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.colorBias = spec.lookupBias; 921433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 922433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.activeTexture(GL_TEXTURE0); 923433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(GL_TEXTURE_2D, name); 924433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture."); 925433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 926433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 927433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 928433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 929433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 930433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state."); 931433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 932433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int level = 0; level < getLevelCount(info); level++) 933433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 934433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level); 935433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const RandomViewport viewport (renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32()); 936433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 937433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<float> texCoord; 938433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::Surface renderedFrame (viewport.width, viewport.height); 939433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::Surface referenceFrame (viewport.width, viewport.height); 940433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 941433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi computeQuadTexCoord2D(texCoord, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f)); 942433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 943433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Setup base viewport. 944433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 945433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 946433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Draw. 947433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderer.renderQuad(0, &texCoord[0], renderParams); 948433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess()); 949433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels."); 950433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 951433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compute reference. 952433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams); 953433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 954433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compare and log. 955433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!pixelThresholdCompare(log, ("Level" + de::toString(level)).c_str(), ("Render level " + de::toString(level)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR)) 956433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi results.fail("Image comparison of level " + de::toString(level) + " failed."); 957433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 958433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Image comparison of level " << level << " passed." << TestLog::EndMessage; 959433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 960433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 961433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(GL_TEXTURE_2D, 0); 962433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture."); 963433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 964433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 965433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid decompressTextureLevel (const tcu::TexDecompressionParams& params, 966433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ArrayBuffer<deUint8>& levelData, 967433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::PixelBufferAccess& levelAccess, 968433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::CompressedTexFormat& compressedFormat, 969433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat& decompressedFormat, 970433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& levelPixelSize, 971433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const void* data) 972433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 973433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levelData.setStorage(levelPixelSize.x() * levelPixelSize.y() * levelPixelSize.z() * decompressedFormat.getPixelSize()); 974433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levelAccess = tcu::PixelBufferAccess(decompressedFormat, levelPixelSize.x(), levelPixelSize.y(), levelPixelSize.z(), levelData.getPtr()); 975433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 976433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::decompress(levelAccess, compressedFormat, (const deUint8*)data, params); 977433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 978433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 979433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid decompressTexture (vector<ArrayBuffer<deUint8> >& levelDatas, 980433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<tcu::PixelBufferAccess>& levelAccesses, 981433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 982433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info, 983433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<ArrayBuffer<deUint8> >& data) 984433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 985433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::CompressedTexFormat compressedFormat = glu::mapGLCompressedTexFormat(info.getFormat()); 986433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat decompressedFormat = tcu::getUncompressedFormat(compressedFormat); 987433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 size = info.getSize(); 988433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(renderContext)); 989433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::TexDecompressionParams decompressParams; 990433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 991433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (tcu::isAstcFormat(compressedFormat)) 992433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 993433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_hdr")) 994433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_HDR); 995433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_ldr")) 996433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR); 997433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 998433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(false); 999433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1000433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1001433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levelDatas.resize(getLevelCount(info)); 1002433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levelAccesses.resize(getLevelCount(info)); 1003433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1004433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int level = 0; level < getLevelCount(info); level++) 1005433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1006433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelPixelSize = getLevelSize(info.getTarget(), size, level); 1007433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::ArrayBuffer<deUint8>& levelData = levelDatas[level]; 1008433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::PixelBufferAccess& levelAccess = levelAccesses[level]; 1009433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1010433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi decompressTextureLevel(decompressParams, levelData, levelAccess, compressedFormat, decompressedFormat, levelPixelSize, data[level].getPtr()); 1011433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1012433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1013433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1014433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture2D (tcu::TestContext& testContext, 1015433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 1016433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer& textureRenderer, 1017433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 1018433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 1019433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 1020433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<ArrayBuffer<deUint8> >& data, 1021433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info) 1022433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1023433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(info.getFormat())) 1024433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1025433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<de::ArrayBuffer<deUint8> > levelDatas; 1026433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<tcu::PixelBufferAccess> levelAccesses; 1027433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1028433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi decompressTexture(levelDatas, levelAccesses, renderContext, info, data); 1029433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1030433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1031433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Texture2DView refTexture(levelAccesses.size(), &(levelAccesses[0])); 1032433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1033433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture); 1034433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1035433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1036433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1037433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1038433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<tcu::ConstPixelBufferAccess> levelAccesses = getLevelAccesses(data, info); 1039433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Texture2DView refTexture (levelAccesses.size(), &(levelAccesses[0])); 1040433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1041433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture); 1042433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1043433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1044433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1045433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture3DView (tcu::TestContext& testContext, 1046433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 1047433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer& renderer, 1048433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 1049433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 1050433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 1051433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info, 1052433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Texture3DView& refTexture) 1053433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1054433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::TestLog& log = testContext.getLog(); 1055433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const glw::Functions& gl = renderContext.getFunctions(); 1056433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::RGBA threshold = renderContext.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 1057433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat format = refTexture.getLevel(0).getFormat(); 1058433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(format); 1059433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1060433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ReferenceParams renderParams (TEXTURETYPE_3D); 1061433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1062433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.samplerType = getSamplerType(format); 1063433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST); 1064433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.colorScale = spec.lookupScale; 1065433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.colorBias = spec.lookupBias; 1066433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1067433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.activeTexture(GL_TEXTURE0); 1068433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(GL_TEXTURE_3D, name); 1069433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture."); 1070433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1071433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1072433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1073433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 1074433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 1075433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1076433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state."); 1077433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1078433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int level = 0; level < getLevelCount(info); level++) 1079433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1080433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level); 1081433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1082433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int slice = 0; slice < levelSize.z(); slice++) 1083433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1084433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const RandomViewport viewport (renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32()); 1085433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const float r = (float(slice) + 0.5f) / levelSize.z(); 1086433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::Surface renderedFrame (viewport.width, viewport.height); 1087433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::Surface referenceFrame (viewport.width, viewport.height); 1088433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<float> texCoord; 1089433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1090433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi computeQuadTexCoord3D(texCoord, tcu::Vec3(0.0f, 0.0f, r), tcu::Vec3(1.0f, 1.0f, r), tcu::IVec3(0, 1, 2)); 1091433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1092433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Setup base viewport. 1093433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 1094433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1095433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Draw. 1096433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderer.renderQuad(0, &texCoord[0], renderParams); 1097433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess()); 1098433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels."); 1099433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1100433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compute reference. 1101433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams); 1102433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1103433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compare and log. 1104433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Slice" + de::toString(slice)).c_str(), ("Render level " + de::toString(level) + ", Slice" + de::toString(slice)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR)) 1105433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi results.fail("Image comparison of level " + de::toString(level) + " and slice " + de::toString(slice) + " failed."); 1106433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1107433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Image comparison of level " << level << " and slice " << slice << " passed." << TestLog::EndMessage;; 1108433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1109433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1110433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1111433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(GL_TEXTURE_3D, 0); 1112433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture."); 1113433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1114433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1115433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture3D (tcu::TestContext& testContext, 1116433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 1117433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer& textureRenderer, 1118433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 1119433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 1120433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 1121433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<ArrayBuffer<deUint8> >& data, 1122433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info) 1123433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1124433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(info.getFormat())) 1125433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1126433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<de::ArrayBuffer<deUint8> > levelDatas; 1127433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<tcu::PixelBufferAccess> levelAccesses; 1128433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1129433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi decompressTexture(levelDatas, levelAccesses, renderContext, info, data); 1130433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1131433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1132433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Texture3DView refTexture(levelAccesses.size(), &(levelAccesses[0])); 1133433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1134433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture); 1135433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1136433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1137433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1138433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1139433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<tcu::ConstPixelBufferAccess> levelAccesses = getLevelAccesses(data, info); 1140433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Texture3DView refTexture (levelAccesses.size(), &(levelAccesses[0])); 1141433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1142433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture); 1143433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1144433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1145433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1146433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTextureCubemapView (tcu::TestContext& testContext, 1147433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 1148433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer& renderer, 1149433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 1150433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 1151433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 1152433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info, 1153433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureCubeView& refTexture) 1154433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1155433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::TestLog& log = testContext.getLog(); 1156433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const glw::Functions& gl = renderContext.getFunctions(); 1157433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::RGBA threshold = renderContext.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 1158433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat format = refTexture.getLevelFace(0, tcu::CUBEFACE_POSITIVE_X).getFormat(); 1159433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(format); 1160433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1161433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ReferenceParams renderParams (TEXTURETYPE_CUBE); 1162433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1163433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.samplerType = getSamplerType(format); 1164433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST); 1165433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.colorScale = spec.lookupScale; 1166433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.colorBias = spec.lookupBias; 1167433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1168433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.activeTexture(GL_TEXTURE0); 1169433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(GL_TEXTURE_CUBE_MAP, name); 1170433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture."); 1171433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1172433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1173433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1174433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 1175433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1176433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state."); 1177433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1178433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int level = 0; level < getLevelCount(info); level++) 1179433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1180433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level); 1181433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1182433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // \note It seems we can't reliably sample two smallest texture levels with cubemaps 1183433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (levelSize.x() < 4 && levelSize.y() < 4) 1184433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 1185433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1186433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int face = 0; face < 6; face++) 1187433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1188433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const RandomViewport viewport (renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32()); 1189433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const string cubemapFaceName = glu::getCubeMapFaceStr(mapFaceNdxToFace(face)).toString(); 1190433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::Surface renderedFrame (viewport.width, viewport.height); 1191433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::Surface referenceFrame (viewport.width, viewport.height); 1192433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<float> texCoord; 1193433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1194433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi computeQuadTexCoordCube(texCoord, glu::getCubeFaceFromGL(mapFaceNdxToFace(face))); 1195433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1196433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Setup base viewport. 1197433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 1198433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1199433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Draw. 1200433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderer.renderQuad(0, &texCoord[0], renderParams); 1201433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess()); 1202433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels."); 1203433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1204433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compute reference. 1205433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams); 1206433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1207433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compare and log. 1208433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Face" + cubemapFaceName).c_str(), ("Render level " + de::toString(level) + ", Face " + cubemapFaceName).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR)) 1209433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi results.fail("Image comparison of level " + de::toString(level) + " and face " + cubemapFaceName + " failed."); 1210433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1211433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Image comparison of level " << level << " and face " << cubemapFaceName << " passed." << TestLog::EndMessage; 1212433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1213433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1214433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1215433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(GL_TEXTURE_CUBE_MAP, 0); 1216433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture."); 1217433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1218433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1219433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTextureCubemap (tcu::TestContext& testContext, 1220433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 1221433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer& textureRenderer, 1222433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 1223433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 1224433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 1225433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<ArrayBuffer<deUint8> >& data, 1226433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info) 1227433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1228433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(info.getFormat())) 1229433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1230433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::CompressedTexFormat& compressedFormat = glu::mapGLCompressedTexFormat(info.getFormat()); 1231433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat& decompressedFormat = tcu::getUncompressedFormat(compressedFormat); 1232433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1233433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int texelBlockSize = getTexelBlockSize(info.getFormat()); 1234433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(info.getFormat()); 1235433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1236433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<tcu::PixelBufferAccess> levelAccesses[6]; 1237433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> > levelDatas[6]; 1238433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::UniquePtr<glu::ContextInfo> ctxInfo (glu::ContextInfo::create(renderContext)); 1239433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::TexDecompressionParams decompressParams; 1240433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1241433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (tcu::isAstcFormat(compressedFormat)) 1242433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1243433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_hdr")) 1244433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_HDR); 1245433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_ldr")) 1246433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR); 1247433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1248433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(false); 1249433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1250433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1251433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int faceNdx = 0; faceNdx < 6; faceNdx++) 1252433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1253433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levelAccesses[faceNdx].resize(getLevelCount(info)); 1254433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levelDatas[faceNdx].resize(getLevelCount(info)); 1255433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1256433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1257433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int level = 0; level < getLevelCount(info); level++) 1258433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1259433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int faceNdx = 0; faceNdx < 6; faceNdx++) 1260433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1261433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelPixelSize = getLevelSize(info.getTarget(), info.getSize(), level); 1262433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelTexelBlockSize = divRoundUp(levelPixelSize, texelBlockPixelSize); 1263433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int levelTexelBlockCount = levelTexelBlockSize.x() * levelTexelBlockSize.y() * levelTexelBlockSize.z(); 1264433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int levelSize = levelTexelBlockCount * texelBlockSize; 1265433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1266433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint8* dataPtr = data[level].getElementPtr(faceNdx * levelSize); 1267433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::PixelBufferAccess& levelAccess = levelAccesses[faceNdx][level]; 1268433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ArrayBuffer<deUint8>& levelData = levelDatas[faceNdx][level]; 1269433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1270433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi decompressTextureLevel(decompressParams, levelData, levelAccess, compressedFormat, decompressedFormat, levelPixelSize, dataPtr); 1271433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1272433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1273433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1274433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::ConstPixelBufferAccess* levels[6]; 1275433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1276433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int faceNdx = 0; faceNdx < 6; faceNdx++) 1277433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levels[glu::getCubeFaceFromGL(mapFaceNdxToFace(faceNdx))] = &(levelAccesses[faceNdx][0]); 1278433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1279433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1280433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureCubeView refTexture(getLevelCount(info), levels); 1281433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1282433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture); 1283433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1284433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1285433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1286433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1287433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<tcu::ConstPixelBufferAccess> levelAccesses[6] = 1288433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1289433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi getCubeLevelAccesses(data, info, 0), 1290433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi getCubeLevelAccesses(data, info, 1), 1291433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi getCubeLevelAccesses(data, info, 2), 1292433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi getCubeLevelAccesses(data, info, 3), 1293433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi getCubeLevelAccesses(data, info, 4), 1294433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi getCubeLevelAccesses(data, info, 5), 1295433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi }; 1296433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1297433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::ConstPixelBufferAccess* levels[6]; 1298433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1299433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int faceNdx = 0; faceNdx < 6; faceNdx++) 1300433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi levels[glu::getCubeFaceFromGL(mapFaceNdxToFace(faceNdx))] = &(levelAccesses[faceNdx][0]); 1301433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1302433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1303433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureCubeView refTexture(getLevelCount(info), levels); 1304433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1305433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture); 1306433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1307433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1308433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1309433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1310433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture2DArrayView (tcu::TestContext& testContext, 1311433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 1312433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer& renderer, 1313433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 1314433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 1315433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 1316433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info, 1317433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Texture2DArrayView& refTexture) 1318433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1319433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::TestLog& log = testContext.getLog(); 1320433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const glw::Functions& gl = renderContext.getFunctions(); 1321433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::RGBA threshold = renderContext.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); 1322433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat format = refTexture.getLevel(0).getFormat(); 1323433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(format); 1324433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1325433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ReferenceParams renderParams (TEXTURETYPE_2D_ARRAY); 1326433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1327433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.samplerType = getSamplerType(format); 1328433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST); 1329433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.colorScale = spec.lookupScale; 1330433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderParams.colorBias = spec.lookupBias; 1331433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1332433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.activeTexture(GL_TEXTURE0); 1333433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(GL_TEXTURE_2D_ARRAY, name); 1334433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture."); 1335433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1336433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1337433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1338433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 1339433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1340433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state."); 1341433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1342433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int level = 0; level < getLevelCount(info); level++) 1343433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1344433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level); 1345433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1346433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int layer = 0; layer < levelSize.z(); layer++) 1347433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1348433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const RandomViewport viewport (renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32()); 1349433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::Surface renderedFrame (viewport.width, viewport.height); 1350433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::Surface referenceFrame (viewport.width, viewport.height); 1351433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<float> texCoord; 1352433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1353433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi computeQuadTexCoord2DArray(texCoord, layer, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f)); 1354433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1355433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Setup base viewport. 1356433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 1357433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1358433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Draw. 1359433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi renderer.renderQuad(0, &texCoord[0], renderParams); 1360433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess()); 1361433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels."); 1362433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1363433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compute reference. 1364433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams); 1365433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1366433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compare and log. 1367433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Layer" + de::toString(layer)).c_str(), ("Render level " + de::toString(level) + ", Layer" + de::toString(layer)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR)) 1368433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi results.fail("Image comparison of level " + de::toString(level) + " and layer " + de::toString(layer) + " failed."); 1369433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1370433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Image comparison of level " << level << " and layer " << layer << " passed." << TestLog::EndMessage; 1371433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1372433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1373433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1374433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindTexture(GL_TEXTURE_2D_ARRAY, 0); 1375433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture."); 1376433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1377433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1378433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture2DArray (tcu::TestContext& testContext, 1379433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 1380433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer& textureRenderer, 1381433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 1382433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 1383433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 1384433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<ArrayBuffer<deUint8> >& data, 1385433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info) 1386433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1387433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(info.getFormat())) 1388433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1389433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<de::ArrayBuffer<deUint8> > levelDatas; 1390433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<tcu::PixelBufferAccess> levelAccesses; 1391433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1392433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi decompressTexture(levelDatas, levelAccesses, renderContext, info, data); 1393433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1394433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1395433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Texture2DArrayView refTexture(levelAccesses.size(), &(levelAccesses[0])); 1396433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1397433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture); 1398433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1399433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1400433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1401433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1402433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<tcu::ConstPixelBufferAccess> levelAccesses = getLevelAccesses(data, info); 1403433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::Texture2DArrayView refTexture (levelAccesses.size(), &(levelAccesses[0])); 1404433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1405433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture); 1406433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1407433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1408433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1409433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvitcu::TextureFormat getReadPixelFormat (const tcu::TextureFormat& format) 1410433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1411433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi switch (tcu::getTextureChannelClass(format.type)) 1412433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1413433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 1414433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 1415433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 1416433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8); 1417433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1418433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 1419433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32); 1420433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1421433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 1422433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32); 1423433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1424433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi default: 1425433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(false); 1426433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return tcu::TextureFormat(); 1427433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1428433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1429433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1430433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviVec4 calculateThreshold (const tcu::TextureFormat& sourceFormat, const tcu::TextureFormat& readPixelsFormat) 1431433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1432433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(tcu::getTextureChannelClass(sourceFormat.type) != tcu::TEXTURECHANNELCLASS_FLOATING_POINT); 1433433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(tcu::getTextureChannelClass(readPixelsFormat.type) != tcu::TEXTURECHANNELCLASS_FLOATING_POINT); 1434433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1435433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(tcu::getTextureChannelClass(sourceFormat.type) != tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER); 1436433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(tcu::getTextureChannelClass(readPixelsFormat.type) != tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER); 1437433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1438433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(tcu::getTextureChannelClass(sourceFormat.type) != tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER); 1439433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(tcu::getTextureChannelClass(readPixelsFormat.type) != tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER); 1440433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1441433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1442433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::IVec4 srcBits = tcu::getTextureFormatBitDepth(sourceFormat); 1443433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::IVec4 readBits = tcu::getTextureFormatBitDepth(readPixelsFormat); 1444433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1445433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return Vec4(1.0f) / ((tcu::IVec4(1) << (tcu::min(srcBits, readBits))) - tcu::IVec4(1)).cast<float>(); 1446433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1447433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1448433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1449433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyRenderbuffer (tcu::TestContext& testContext, 1450433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 1451433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 1452433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 1453433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<ArrayBuffer<deUint8> >& data, 1454433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info) 1455433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1456433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const glw::Functions& gl = renderContext.getFunctions(); 1457433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestLog& log = testContext.getLog(); 1458433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1459433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat format = glu::mapGLInternalFormat(info.getFormat()); 1460433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 size = info.getSize(); 1461433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::ConstPixelBufferAccess refRenderbuffer (format, size.x(), size.y(), 1, data[0].getPtr()); 1462433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::TextureFormat readPixelsFormat = getReadPixelFormat(format); 1463433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::TextureLevel renderbuffer (readPixelsFormat, size.x(), size.y()); 1464433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1465433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(size.z() == 1); 1466433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(data.size() == 1); 1467433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1468433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1469433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::Framebuffer framebuffer(gl); 1470433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1471433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindFramebuffer(GL_FRAMEBUFFER, *framebuffer); 1472433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create and bind framebuffer."); 1473433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1474433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindRenderbuffer(GL_RENDERBUFFER, name); 1475433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, name); 1476433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind and attach renderbuffer to framebuffer."); 1477433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1478433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::readPixels(renderContext, 0, 0, renderbuffer.getAccess()); 1479433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1480433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindRenderbuffer(GL_RENDERBUFFER, 0); 1481433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi gl.bindFramebuffer(GL_FRAMEBUFFER, 0); 1482433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind renderbuffer and framebuffer."); 1483433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1484433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1485433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isFloatFormat(info.getFormat())) 1486433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1487433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::UVec4 threshold (2, 2, 2, 2); 1488433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1489433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!(tcu::floatUlpThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR))) 1490433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi results.fail("Image comparison failed."); 1491433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1492433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage; 1493433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1494433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (isIntFormat(info.getFormat()) || isUintFormat(info.getFormat())) 1495433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1496433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::UVec4 threshold (1, 1, 1, 1); 1497433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1498433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!(tcu::intThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR))) 1499433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi results.fail("Image comparison failed."); 1500433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1501433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage; 1502433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1503433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1504433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1505433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const Vec4 threshold = calculateThreshold(format, readPixelsFormat); 1506433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1507433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!(tcu::floatThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR))) 1508433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi results.fail("Image comparison failed."); 1509433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1510433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage; 1511433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1512433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1513433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1514433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verify (tcu::TestContext& testContext, 1515433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext, 1516433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer& textureRenderer, 1517433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results, 1518433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng, 1519433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deUint32 name, 1520433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<ArrayBuffer<deUint8> >& data, 1521433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& info) 1522433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1523433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi switch (info.getTarget()) 1524433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1525433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_2D: 1526433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTexture2D(testContext, renderContext, textureRenderer, results, rng, name, data, info); 1527433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi break; 1528433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1529433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_3D: 1530433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTexture3D(testContext, renderContext, textureRenderer, results, rng, name, data, info); 1531433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi break; 1532433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1533433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_CUBE_MAP: 1534433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTextureCubemap(testContext, renderContext, textureRenderer, results, rng, name, data, info); 1535433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi break; 1536433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1537433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_TEXTURE_2D_ARRAY: 1538433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyTexture2DArray(testContext, renderContext, textureRenderer, results, rng, name, data, info); 1539433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi break; 1540433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1541433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi case GL_RENDERBUFFER: 1542433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verifyRenderbuffer(testContext, renderContext, results, name, data, info); 1543433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi break; 1544433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1545433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi default: 1546433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(false); 1547433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1548433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1549433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1550433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid logTestImageInfo (TestLog& log, 1551433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& imageInfo) 1552433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1553433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Target: " << targetToName(imageInfo.getTarget()) << TestLog::EndMessage; 1554433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Size: " << imageInfo.getSize() << TestLog::EndMessage; 1555433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Levels: " << getLevelCount(imageInfo) << TestLog::EndMessage; 1556433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Format: " << formatToName(imageInfo.getFormat()) << TestLog::EndMessage; 1557433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1558433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1559433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid logTestInfo (TestLog& log, 1560433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& srcImageInfo, 1561433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& dstImageInfo) 1562433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1563433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ScopedLogSection section(log, "TestCaseInfo", "Test case info"); 1564433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1565433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Testing copying from " << targetToName(srcImageInfo.getTarget()) << " to " << targetToName(dstImageInfo.getTarget()) << "." << TestLog::EndMessage; 1566433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1567433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1568433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ScopedLogSection srcSection(log, "Source image info.", "Source image info."); 1569433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi logTestImageInfo(log, srcImageInfo); 1570433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1571433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1572433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1573433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ScopedLogSection dstSection(log, "Destination image info.", "Destination image info."); 1574433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi logTestImageInfo(log, dstImageInfo); 1575433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1576433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1577433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1578433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviclass CopyImageTest : public TestCase 1579433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1580433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvipublic: 1581433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi CopyImageTest (Context& context, 1582433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& srcImage, 1583433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& dstImage, 1584433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const char* name, 1585433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const char* description); 1586433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1587433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ~CopyImageTest (void); 1588433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1589433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void init (void); 1590433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void deinit (void); 1591433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1592433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestCase::IterateResult iterate (void); 1593433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1594433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviprivate: 1595433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void logTestInfoIter (void); 1596433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void createImagesIter (void); 1597433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void destroyImagesIter (void); 1598433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void verifySourceIter (void); 1599433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void verifyDestinationIter (void); 1600433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void copyImageIter (void); 1601433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1602433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi struct State 1603433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1604433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi State (int seed, 1605433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::TestContext& testContext, 1606433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext) 1607433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi : rng (seed) 1608433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , results (testContext.getLog()) 1609433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , srcImage (NULL) 1610433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , dstImage (NULL) 1611433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , textureRenderer (renderContext, testContext, glu::GLSL_VERSION_310_ES, glu::PRECISION_HIGHP) 1612433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1613433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1614433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1615433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ~State (void) 1616433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1617433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi delete srcImage; 1618433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi delete dstImage; 1619433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1620433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1621433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random rng; 1622433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector results; 1623433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::ObjectWrapper* srcImage; 1624433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::ObjectWrapper* dstImage; 1625433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TextureRenderer textureRenderer; 1626433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1627433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> > srcImageLevels; 1628433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> > dstImageLevels; 1629433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi }; 1630433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1631433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo m_srcImageInfo; 1632433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo m_dstImageInfo; 1633433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1634433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int m_iteration; 1635433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi State* m_state; 1636433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}; 1637433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1638433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviCopyImageTest::CopyImageTest (Context& context, 1639433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& srcImage, 1640433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ImageInfo& dstImage, 1641433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const char* name, 1642433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const char* description) 1643433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi : TestCase (context, name, description) 1644433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , m_srcImageInfo (srcImage) 1645433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , m_dstImageInfo (dstImage) 1646433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1647433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , m_iteration (0) 1648433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , m_state (NULL) 1649433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1650433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1651433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1652433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviCopyImageTest::~CopyImageTest (void) 1653433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1654433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi deinit(); 1655433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1656433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1657433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid checkFormatSupport (glu::ContextInfo& info, deUint32 format) 1658433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1659433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(format)) 1660433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1661433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isAstcFormat(glu::mapGLCompressedTexFormat(format))) 1662433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1663433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!info.isExtensionSupported("GL_KHR_texture_compression_astc_ldr") 1664433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi && !info.isExtensionSupported("GL_KHR_texture_compression_astc_hdr") 1665433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi && !info.isExtensionSupported("GL_OES_texture_compression_astc")) 1666433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi throw tcu::NotSupportedError("Compressed astc texture not supported.", "", __FILE__, __LINE__); 1667433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1668433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1669433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1670433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!info.isCompressedTextureFormatSupported(format)) 1671433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi throw tcu::NotSupportedError("Compressed texture not supported.", "", __FILE__, __LINE__); 1672433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1673433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1674433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1675433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1676433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::init (void) 1677433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1678433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::UniquePtr<glu::ContextInfo> ctxInfo(glu::ContextInfo::create(m_context.getRenderContext())); 1679433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1680433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (!ctxInfo->isExtensionSupported("GL_EXT_copy_image")) 1681433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi throw tcu::NotSupportedError("Extension GL_EXT_copy_image not supported.", "", __FILE__, __LINE__); 1682433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1683433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi checkFormatSupport(*ctxInfo, m_srcImageInfo.getFormat()); 1684433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi checkFormatSupport(*ctxInfo, m_dstImageInfo.getFormat()); 1685433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1686433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1687433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi SeedBuilder builder; 1688433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1689433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi builder << 903980 1690433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi << m_srcImageInfo 1691433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi << m_dstImageInfo; 1692433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1693433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_state = new State(builder.get(), m_testCtx, m_context.getRenderContext()); 1694433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1695433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1696433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1697433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::deinit (void) 1698433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1699433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi delete m_state; 1700433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_state = NULL; 1701433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1702433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1703433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::logTestInfoIter (void) 1704433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1705433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestLog& log = m_testCtx.getLog(); 1706433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1707433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi logTestInfo(log, m_srcImageInfo, m_dstImageInfo); 1708433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1709433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1710433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::createImagesIter (void) 1711433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1712433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestLog& log = m_testCtx.getLog(); 1713433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::RenderContext& renderContext = m_context.getRenderContext(); 1714433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const glw::Functions& gl = renderContext.getFunctions(); 1715433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 moreRestrictiveFormat = getMoreRestrictiveFormat(m_srcImageInfo.getFormat(), m_dstImageInfo.getFormat()); 1716433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng = m_state->rng; 1717433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1718433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(!m_state->srcImage); 1719433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi DE_ASSERT(!m_state->dstImage); 1720433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1721433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_state->srcImage = new glu::ObjectWrapper(gl, getObjectTraits(m_srcImageInfo)); 1722433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_state->dstImage = new glu::ObjectWrapper(gl, getObjectTraits(m_dstImageInfo)); 1723433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1724433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1725433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::ObjectWrapper& srcImage = *m_state->srcImage; 1726433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::ObjectWrapper& dstImage = *m_state->dstImage; 1727433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1728433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& srcImageLevels = m_state->srcImageLevels; 1729433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& dstImageLevels = m_state->dstImageLevels; 1730433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1731433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Creating source image." << TestLog::EndMessage; 1732433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi genImage(gl, rng, *srcImage, srcImageLevels, m_srcImageInfo, moreRestrictiveFormat); 1733433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1734433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Creating destination image." << TestLog::EndMessage; 1735433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi genImage(gl, rng, *dstImage, dstImageLevels, m_dstImageInfo, moreRestrictiveFormat); 1736433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1737433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1738433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1739433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::destroyImagesIter (void) 1740433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1741433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestLog& log = m_testCtx.getLog(); 1742433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1743433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Deleting source image. " << TestLog::EndMessage; 1744433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1745433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi delete m_state->srcImage; 1746433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_state->srcImage = NULL; 1747433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_state->srcImageLevels.clear(); 1748433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1749433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Deleting destination image. " << TestLog::EndMessage; 1750433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1751433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi delete m_state->dstImage; 1752433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_state->dstImage = NULL; 1753433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_state->dstImageLevels.clear(); 1754433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1755433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1756433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::verifySourceIter (void) 1757433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1758433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestLog& log = m_testCtx.getLog(); 1759433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::ScopedLogSection sourceSection (log, "Source image verify.", "Source image verify."); 1760433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1761433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng = m_state->rng; 1762433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results = m_state->results; 1763433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::ObjectWrapper& srcImage = *m_state->srcImage; 1764433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& srcImageLevels = m_state->srcImageLevels; 1765433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1766433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Verifying source image." << TestLog::EndMessage; 1767433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1768433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verify(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *srcImage, srcImageLevels, m_srcImageInfo); 1769433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1770433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1771433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::verifyDestinationIter (void) 1772433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1773433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestLog& log = m_testCtx.getLog(); 1774433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const tcu::ScopedLogSection destinationSection (log, "Destination image verify.", "Destination image verify."); 1775433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1776433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi de::Random& rng = m_state->rng; 1777433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi tcu::ResultCollector& results = m_state->results; 1778433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::ObjectWrapper& dstImage = *m_state->dstImage; 1779433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& dstImageLevels = m_state->dstImageLevels; 1780433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1781433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Verifying destination image." << TestLog::EndMessage; 1782433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1783433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi verify(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *dstImage, dstImageLevels, m_dstImageInfo); 1784433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1785433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1786433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvistruct Copy 1787433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1788433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi Copy (const IVec3& srcPos_, 1789433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int srcLevel_, 1790433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1791433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& dstPos_, 1792433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int dstLevel_, 1793433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1794433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3& size_) 1795433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi : srcPos (srcPos_) 1796433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , srcLevel (srcLevel_) 1797433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1798433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , dstPos (dstPos_) 1799433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , dstLevel (dstLevel_) 1800433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi , size (size_) 1801433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1802433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1803433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1804433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi IVec3 srcPos; 1805433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int srcLevel; 1806433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi IVec3 dstPos; 1807433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int dstLevel; 1808433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi IVec3 size; 1809433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}; 1810433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1811433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint getLastFullLevel (const ImageInfo& info) 1812433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1813433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int levelCount = getLevelCount(info); 1814433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 blockPixelSize = getTexelBlockPixelSize(info.getFormat()); 1815433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1816433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int level = 0; level < levelCount; level++) 1817433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1818433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level); 1819433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1820433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (levelSize.x() < blockPixelSize.x() || levelSize.y() < blockPixelSize.y() || levelSize.z() < blockPixelSize.z()) 1821433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return level - 1; 1822433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1823433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1824433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return levelCount -1; 1825433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1826433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1827433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid generateCopies (vector<Copy>& copies, const ImageInfo& srcInfo, const ImageInfo& dstInfo) 1828433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1829433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 srcTarget = srcInfo.getTarget(); 1830433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 dstTarget = dstInfo.getTarget(); 1831433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1832433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const bool srcIsTexture = isTextureTarget(srcInfo.getTarget()); 1833433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const bool dstIsTexture = isTextureTarget(dstInfo.getTarget()); 1834433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1835433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const bool srcIsCube = srcTarget == GL_TEXTURE_CUBE_MAP; 1836433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const bool dstIsCube = dstTarget == GL_TEXTURE_CUBE_MAP; 1837433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1838433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcBlockPixelSize = getTexelBlockPixelSize(srcInfo.getFormat()); 1839433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstBlockPixelSize = getTexelBlockPixelSize(dstInfo.getFormat()); 1840433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1841433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int levels[] = 1842433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1843433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 0, 1, -1 1844433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi }; 1845433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1846433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int levelNdx = 0; levelNdx < (srcIsTexture || dstIsTexture ? DE_LENGTH_OF_ARRAY(levels) : 1); levelNdx++) 1847433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1848433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int srcLevel = (srcIsTexture ? (levels[levelNdx] >= 0 ? levels[levelNdx] : getLastFullLevel(srcInfo)) : 0); 1849433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int dstLevel = (dstIsTexture ? (levels[levelNdx] >= 0 ? levels[levelNdx] : getLastFullLevel(dstInfo)) : 0); 1850433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1851433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcSize = getLevelSize(srcInfo.getTarget(), srcInfo.getSize(), srcLevel); 1852433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstSize = getLevelSize(dstInfo.getTarget(), dstInfo.getSize(), dstLevel); 1853433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1854433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // \note These are rounded down 1855433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcCompleteBlockSize = IVec3(srcSize.x() / srcBlockPixelSize.x(), srcSize.y() / srcBlockPixelSize.y(), (srcIsCube ? 6 : srcSize.z() / srcBlockPixelSize.z())); 1856433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstCompleteBlockSize = IVec3(dstSize.x() / dstBlockPixelSize.x(), dstSize.y() / dstBlockPixelSize.y(), (dstIsCube ? 6 : dstSize.z() / dstBlockPixelSize.z())); 1857433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1858433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 maxCopyBlockSize = tcu::min(srcCompleteBlockSize, dstCompleteBlockSize); 1859433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1860433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // \note These are rounded down 1861433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int copyBlockWidth = de::max((2 * (maxCopyBlockSize.x() / 4)) - 1, 1); 1862433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int copyBlockHeight = de::max((2 * (maxCopyBlockSize.y() / 4)) - 1, 1); 1863433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int copyBlockDepth = de::max((2 * (maxCopyBlockSize.z() / 4)) - 1, 1); 1864433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1865433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Copy NPOT block from (0,0,0) to other corner on dst 1866433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1867433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 copyBlockSize (copyBlockWidth, copyBlockHeight, copyBlockDepth); 1868433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcBlockPos (srcCompleteBlockSize - copyBlockSize); 1869433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstBlockPos (0, 0, 0); 1870433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1871433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcPos (srcBlockPos * srcBlockPixelSize); 1872433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstPos (dstBlockPos * dstBlockPixelSize); 1873433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 copySize (copyBlockSize * srcBlockPixelSize); 1874433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1875433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi copies.push_back(Copy(srcPos, srcLevel, dstPos, dstLevel, copySize)); 1876433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1877433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1878433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Copy NPOT block to (0,0,0) from other corner on src 1879433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1880433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 copyBlockSize (copyBlockWidth, copyBlockHeight, copyBlockDepth); 1881433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcBlockPos (0, 0, 0); 1882433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstBlockPos (dstCompleteBlockSize - copyBlockSize); 1883433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1884433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcPos (srcBlockPos * srcBlockPixelSize); 1885433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstPos (dstBlockPos * dstBlockPixelSize); 1886433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 copySize (copyBlockSize * srcBlockPixelSize); 1887433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1888433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi copies.push_back(Copy(srcPos, srcLevel, dstPos, dstLevel, copySize)); 1889433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1890433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1891433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Copy NPOT block to (0,0,0) from other corner on src 1892433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1893433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 copyBlockSize (copyBlockWidth, copyBlockHeight, copyBlockDepth); 1894433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcBlockPos (tcu::max((srcCompleteBlockSize / 4) * 4 - copyBlockSize, IVec3(0))); 1895433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstBlockPos (tcu::max((dstCompleteBlockSize / 4) * 4 - copyBlockSize, IVec3(0))); 1896433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1897433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcPos (srcBlockPos * srcBlockPixelSize); 1898433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstPos (dstBlockPos * dstBlockPixelSize); 1899433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 copySize (copyBlockSize * srcBlockPixelSize); 1900433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1901433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi copies.push_back(Copy(srcPos, srcLevel, dstPos, dstLevel, copySize)); 1902433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1903433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1904433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1905433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1906433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::copyImageIter (void) 1907433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1908433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestLog& log = m_testCtx.getLog(); 1909433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 1910433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::ObjectWrapper& srcImage = *m_state->srcImage; 1911433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi glu::ObjectWrapper& dstImage = *m_state->dstImage; 1912433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1913433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& srcImageLevels = m_state->srcImageLevels; 1914433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<ArrayBuffer<deUint8> >& dstImageLevels = m_state->dstImageLevels; 1915433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi vector<Copy> copies; 1916433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1917433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi generateCopies(copies, m_srcImageInfo, m_dstImageInfo); 1918433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1919433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int copyNdx = 0; copyNdx < (int)copies.size(); copyNdx++) 1920433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1921433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const Copy& copy = copies[copyNdx]; 1922433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1923433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi log << TestLog::Message << "Copying block " << copy.size << " from source image position " << copy.srcPos << " and mipmap level " << copy.srcLevel 1924433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi << " to destination image position " << copy.dstPos << " and mipmap level " << copy.dstLevel << TestLog::EndMessage; 1925433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1926433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi copyImage(gl, *dstImage, dstImageLevels, m_dstImageInfo, copy.dstLevel, copy.dstPos, 1927433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *srcImage, srcImageLevels, m_srcImageInfo, copy.srcLevel, copy.srcPos, copy.size); 1928433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1929433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1930433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1931433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviTestCase::IterateResult CopyImageTest::iterate (void) 1932433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1933433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void(CopyImageTest::*methods[])(void) = 1934433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1935433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::logTestInfoIter, 1936433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1937433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Render both images and then copy and verify again. 1938433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::createImagesIter, 1939433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::verifySourceIter, 1940433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::verifyDestinationIter, 1941433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::copyImageIter, 1942433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::verifySourceIter, 1943433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::verifyDestinationIter, 1944433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::destroyImagesIter, 1945433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1946433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Create images and immediately copies between thew and verify. 1947433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::createImagesIter, 1948433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::copyImageIter, 1949433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::verifySourceIter, 1950433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::verifyDestinationIter, 1951433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi &CopyImageTest::destroyImagesIter 1952433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi }; 1953433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1954433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (m_iteration < DE_LENGTH_OF_ARRAY(methods)) 1955433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1956433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi (this->*methods[m_iteration])(); 1957433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_iteration++; 1958433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return CONTINUE; 1959433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1960433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 1961433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1962433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi m_state->results.setTestContextResult(m_testCtx); 1963433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return STOP; 1964433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 1965433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1966433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1967433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviclass CopyImageTests : public TestCaseGroup 1968433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1969433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvipublic: 1970433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi CopyImageTests (Context& context); 1971433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ~CopyImageTests (void); 1972433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1973433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi void init (void); 1974433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1975433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviprivate: 1976433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi CopyImageTests (const CopyImageTests& other); 1977433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi CopyImageTests& operator= (const CopyImageTests& other); 1978433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}; 1979433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1980433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviCopyImageTests::CopyImageTests (Context& context) 1981433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi : TestCaseGroup (context, "copy_image", "Copy image tests for GL_EXT_copy_image.") 1982433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1983433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1984433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1985433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviCopyImageTests::~CopyImageTests (void) 1986433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1987433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 1988433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1989433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint smallestCommonMultiple (int a_, int b_) 1990433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 1991433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int a = (a_ > b_ ? a_ : b_); 1992433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int b = (a_ > b_ ? b_ : a_); 1993433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi int result = 1; 1994433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 1995433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int i = b/2; i > 1; i--) 1996433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1997433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi while ((a % i) == 0 && (b % i) == 0) 1998433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 1999433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi result *= i; 2000433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi a /= i; 2001433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi b /= i; 2002433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2003433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2004433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2005433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return result * a * b; 2006433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 2007433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2008433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 getTestedSize (deUint32 target, deUint32 format, const IVec3& targetSize) 2009433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 2010433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(format); 2011433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const bool isCube = target == GL_TEXTURE_CUBE_MAP; 2012433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const bool is3D = target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY; 2013433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2014433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCube) 2015433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2016433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int multiplier = smallestCommonMultiple(texelBlockPixelSize.x(), texelBlockPixelSize.y()); 2017433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int size = (1 + (targetSize.x() / multiplier)) * multiplier; 2018433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2019433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return IVec3(size, size, 1); 2020433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2021433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else if (is3D) 2022433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2023433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return (1 + (targetSize / texelBlockPixelSize)) * texelBlockPixelSize; 2024433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2025433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi else 2026433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2027433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int width = (1 + targetSize.x() / texelBlockPixelSize.x()) * texelBlockPixelSize.x(); 2028433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const int height = ((targetSize.y() / texelBlockPixelSize.y()) - 1) * texelBlockPixelSize.y(); 2029433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2030433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return IVec3(width, height, 1); 2031433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2032433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 2033433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2034433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid addCopyTests (TestCaseGroup* root, deUint32 srcFormat, deUint32 dstFormat) 2035433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 2036433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const string groupName = string(formatToName(srcFormat)) + "_" + formatToName(dstFormat); 2037433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestCaseGroup* const group = new TestCaseGroup(root->getContext(), groupName.c_str(), groupName.c_str()); 2038433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2039433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 targets[] = 2040433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2041433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_2D, 2042433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_3D, 2043433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_CUBE_MAP, 2044433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_TEXTURE_2D_ARRAY, 2045433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi GL_RENDERBUFFER 2046433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi }; 2047433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2048433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi root->addChild(group); 2049433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2050433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int srcTargetNdx = 0; srcTargetNdx < DE_LENGTH_OF_ARRAY(targets); srcTargetNdx++) 2051433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2052433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 srcTarget = targets[srcTargetNdx]; 2053433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcTexelBlockPixelSize = getTexelBlockPixelSize(srcFormat); 2054433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const bool srcIs3D = srcTarget == GL_TEXTURE_2D_ARRAY || srcTarget == GL_TEXTURE_3D; 2055433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2056433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(srcFormat) && srcTarget == GL_RENDERBUFFER) 2057433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 2058433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2059433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (srcTarget == GL_RENDERBUFFER && !isColorRenderable(srcFormat)) 2060433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 2061433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2062433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(srcFormat) && !tcu::isAstcFormat(glu::mapGLCompressedTexFormat(srcFormat)) && srcIs3D) 2063433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 2064433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2065433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int dstTargetNdx = 0; dstTargetNdx < DE_LENGTH_OF_ARRAY(targets); dstTargetNdx++) 2066433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2067433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 dstTarget = targets[dstTargetNdx]; 2068433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstTexelBlockPixelSize = getTexelBlockPixelSize(dstFormat); 2069433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const bool dstIs3D = dstTarget == GL_TEXTURE_2D_ARRAY || dstTarget == GL_TEXTURE_3D; 2070433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2071433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(dstFormat) && dstTarget == GL_RENDERBUFFER) 2072433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 2073433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2074433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (dstTarget == GL_RENDERBUFFER && !isColorRenderable(dstFormat)) 2075433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 2076433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2077433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (isCompressedFormat(dstFormat) && !tcu::isAstcFormat(glu::mapGLCompressedTexFormat(dstFormat)) && dstIs3D) 2078433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 2079433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2080433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const string targetTestName = string(targetToName(srcTarget)) + "_to_" + targetToName(dstTarget); 2081433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2082433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 targetSize2D (128, 128, 1); 2083433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 targetSize3D (128, 128, 16); 2084433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2085433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 targetPos2D (32, 32, 0); 2086433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 targetPos3D (16, 16, 2); 2087433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 targetCopySize (16, 16, 4); 2088433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2089433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 srcSize = getTestedSize(srcTarget, srcFormat, (srcIs3D ? targetSize3D : targetSize2D)); 2090433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const IVec3 dstSize = getTestedSize(dstTarget, dstFormat, (dstIs3D ? targetSize3D : targetSize2D)); 2091433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2092433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi group->addChild(new CopyImageTest(root->getContext(), 2093433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ImageInfo(srcFormat, srcTarget, srcSize), 2094433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi ImageInfo(dstFormat, dstTarget, dstSize), 2095433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi targetTestName.c_str(), targetTestName.c_str())); 2096433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2097433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2098433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 2099433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2100433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTests::init (void) 2101433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 2102433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestCaseGroup* const nonCompressedGroup = new TestCaseGroup(m_context, "non_compressed", "Test copying between textures."); 2103433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestCaseGroup* const compressedGroup = new TestCaseGroup(m_context, "compressed", "Test copying between compressed textures."); 2104433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestCaseGroup* const mixedGroup = new TestCaseGroup(m_context, "mixed", "Test copying between compressed and non-compressed textures."); 2105433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2106433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi addChild(nonCompressedGroup); 2107433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi addChild(compressedGroup); 2108433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi addChild(mixedGroup); 2109433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2110433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi map<ViewClass, vector<deUint32> > textureFormatViewClasses; 2111433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi map<ViewClass, vector<deUint32> > compressedTextureFormatViewClasses; 2112433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi map<ViewClass, pair<vector<deUint32>, vector<deUint32> > > mixedViewClasses; 2113433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2114433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Texture view classes 2115433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_128_BITS] = vector<deUint32>(); 2116433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_96_BITS] = vector<deUint32>(); 2117433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_64_BITS] = vector<deUint32>(); 2118433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_48_BITS] = vector<deUint32>(); 2119433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS] = vector<deUint32>(); 2120433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_24_BITS] = vector<deUint32>(); 2121433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_16_BITS] = vector<deUint32>(); 2122433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_8_BITS] = vector<deUint32>(); 2123433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2124433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 128bit / VIEWCLASS_128_BITS 2125433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_128_BITS].push_back(GL_RGBA32F); 2126433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_128_BITS].push_back(GL_RGBA32I); 2127433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_128_BITS].push_back(GL_RGBA32UI); 2128433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2129433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 96bit / VIEWCLASS_96_BITS 2130433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_96_BITS].push_back(GL_RGB32F); 2131433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_96_BITS].push_back(GL_RGB32I); 2132433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_96_BITS].push_back(GL_RGB32UI); 2133433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2134433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 64bit / VIEWCLASS_64_BITS 2135433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RG32F); 2136433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RG32I); 2137433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RG32UI); 2138433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2139433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RGBA16F); 2140433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RGBA16I); 2141433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RGBA16UI); 2142433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2143433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 48bit / VIEWCLASS_48_BITS 2144433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_48_BITS].push_back(GL_RGB16F); 2145433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_48_BITS].push_back(GL_RGB16I); 2146433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_48_BITS].push_back(GL_RGB16UI); 2147433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2148433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 32bit / VIEWCLASS_32_BITS 2149433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R32F); 2150433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R32I); 2151433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R32UI); 2152433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2153433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RG16F); 2154433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RG16I); 2155433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RG16UI); 2156433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2157433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8); 2158433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8I); 2159433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8UI); 2160433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2161433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R11F_G11F_B10F); 2162433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGB10_A2UI); 2163433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGB10_A2); 2164433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8_SNORM); 2165433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_SRGB8_ALPHA8); 2166433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGB9_E5); 2167433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2168433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 24bit / VIEWCLASS_24_BITS 2169433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8); 2170433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8I); 2171433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8UI); 2172433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8_SNORM); 2173433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_SRGB8); 2174433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2175433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 16bit / VIEWCLASS_16_BITS 2176433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_R16F); 2177433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_R16I); 2178433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_R16UI); 2179433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2180433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8); 2181433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8I); 2182433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8UI); 2183433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8_SNORM); 2184433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2185433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 8bit / VIEWCLASS_8_BITS 2186433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8); 2187433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8I); 2188433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8UI); 2189433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8_SNORM); 2190433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2191433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compressed texture view classes 2192433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_EAC_R11] = vector<deUint32>(); 2193433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_EAC_RG11] = vector<deUint32>(); 2194433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGB] = vector<deUint32>(); 2195433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGBA] = vector<deUint32>(); 2196433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ETC2_EAC_RGBA] = vector<deUint32>(); 2197433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_4x4_RGBA] = vector<deUint32>(); 2198433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x4_RGBA] = vector<deUint32>(); 2199433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x5_RGBA] = vector<deUint32>(); 2200433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x5_RGBA] = vector<deUint32>(); 2201433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x6_RGBA] = vector<deUint32>(); 2202433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x5_RGBA] = vector<deUint32>(); 2203433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x6_RGBA] = vector<deUint32>(); 2204433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x8_RGBA] = vector<deUint32>(); 2205433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x5_RGBA] = vector<deUint32>(); 2206433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x6_RGBA] = vector<deUint32>(); 2207433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x8_RGBA] = vector<deUint32>(); 2208433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x10_RGBA] = vector<deUint32>(); 2209433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x10_RGBA] = vector<deUint32>(); 2210433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x12_RGBA] = vector<deUint32>(); 2211433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2212433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_EAC_R11 2213433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_EAC_R11].push_back(GL_COMPRESSED_R11_EAC); 2214433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_EAC_R11].push_back(GL_COMPRESSED_SIGNED_R11_EAC); 2215433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2216433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_EAC_RG11 2217433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_EAC_RG11].push_back(GL_COMPRESSED_RG11_EAC); 2218433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_EAC_RG11].push_back(GL_COMPRESSED_SIGNED_RG11_EAC); 2219433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2220433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ETC2_RGB 2221433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGB].push_back(GL_COMPRESSED_RGB8_ETC2); 2222433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGB].push_back(GL_COMPRESSED_SRGB8_ETC2); 2223433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2224433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ETC2_RGBA 2225433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGBA].push_back(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2); 2226433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGBA].push_back(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2); 2227433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2228433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ETC2_EAC_RGBA 2229433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ETC2_EAC_RGBA].push_back(GL_COMPRESSED_RGBA8_ETC2_EAC); 2230433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ETC2_EAC_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC); 2231433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2232433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_4x4_RGBA 2233433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_4x4_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_4x4_KHR); 2234433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_4x4_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR); 2235433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2236433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_5x4_RGBA 2237433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x4_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_5x4_KHR); 2238433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x4_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR); 2239433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2240433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_5x5_RGBA 2241433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_5x5_KHR); 2242433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR); 2243433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2244433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_6x5_RGBA 2245433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_6x5_KHR); 2246433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR); 2247433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2248433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_6x6_RGBA 2249433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x6_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_6x6_KHR); 2250433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x6_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR); 2251433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2252433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_8x5_RGBA 2253433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_8x5_KHR); 2254433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR); 2255433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2256433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_8x6_RGBA 2257433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x6_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_8x6_KHR); 2258433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x6_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR); 2259433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2260433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_8x8_RGBA 2261433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x8_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_8x8_KHR); 2262433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x8_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR); 2263433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2264433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_10x5_RGBA 2265433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x5_KHR); 2266433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR); 2267433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2268433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_10x6_RGBA 2269433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x6_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x6_KHR); 2270433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x6_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR); 2271433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2272433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_10x8_RGBA 2273433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x8_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x8_KHR); 2274433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x8_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR); 2275433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2276433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_10x10_RGBA 2277433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x10_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x10_KHR); 2278433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x10_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR); 2279433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2280433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_12x10_RGBA 2281433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x10_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_12x10_KHR); 2282433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x10_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR); 2283433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2284433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // VIEWCLASS_ASTC_12x12_RGBA 2285433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x12_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_12x12_KHR); 2286433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x12_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR); 2287433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2288433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Mixed view classes 2289433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS] = pair<vector<deUint32>, vector<deUint32> >(); 2290433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_64_BITS] = pair<vector<deUint32>, vector<deUint32> >(); 2291433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2292433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 128 bits 2293433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2294433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Non compressed 2295433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].first.push_back(GL_RGBA32F); 2296433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].first.push_back(GL_RGBA32UI); 2297433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].first.push_back(GL_RGBA32I); 2298433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2299433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compressed 2300433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA8_ETC2_EAC); 2301433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC); 2302433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RG11_EAC); 2303433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SIGNED_RG11_EAC); 2304433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_4x4_KHR); 2305433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_5x4_KHR); 2306433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_5x5_KHR); 2307433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_6x5_KHR); 2308433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_6x6_KHR); 2309433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_8x5_KHR); 2310433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_8x6_KHR); 2311433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_8x8_KHR); 2312433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x5_KHR); 2313433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x6_KHR); 2314433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x8_KHR); 2315433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x10_KHR); 2316433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_12x10_KHR); 2317433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_12x12_KHR); 2318433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR); 2319433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR); 2320433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR); 2321433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR); 2322433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR); 2323433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR); 2324433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR); 2325433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR); 2326433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR); 2327433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR); 2328433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR); 2329433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR); 2330433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR); 2331433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR); 2332433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2333433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // 64 bits 2334433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2335433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Non compressed 2336433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RGBA16F); 2337433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RGBA16UI); 2338433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RGBA16I); 2339433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2340433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RG32F); 2341433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RG32UI); 2342433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RG32I); 2343433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2344433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi // Compressed 2345433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_64_BITS].second.push_back(GL_COMPRESSED_R11_EAC); 2346433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedViewClasses[VIEWCLASS_64_BITS].second.push_back(GL_COMPRESSED_SIGNED_R11_EAC); 2347433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2348433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (map<ViewClass, vector<deUint32> >::const_iterator viewClassIter = textureFormatViewClasses.begin(); viewClassIter != textureFormatViewClasses.end(); ++viewClassIter) 2349433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2350433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<deUint32>& formats = viewClassIter->second; 2351433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ViewClass viewClass = viewClassIter->first; 2352433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestCaseGroup* const viewGroup = new TestCaseGroup(m_context, viewClassToName(viewClass), viewClassToName(viewClass)); 2353433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2354433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi nonCompressedGroup->addChild(viewGroup); 2355433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2356433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int srcFormatNdx = 0; srcFormatNdx < (int)formats.size(); srcFormatNdx++) 2357433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int dstFormatNdx = 0; dstFormatNdx < (int)formats.size(); dstFormatNdx++) 2358433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2359433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 srcFormat = formats[srcFormatNdx]; 2360433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 dstFormat = formats[dstFormatNdx]; 2361433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2362433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (srcFormat != dstFormat && isFloatFormat(srcFormat) && isFloatFormat(dstFormat)) 2363433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 2364433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2365433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi addCopyTests(viewGroup, srcFormat, dstFormat); 2366433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2367433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2368433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2369433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (map<ViewClass, vector<deUint32> >::const_iterator viewClassIter = compressedTextureFormatViewClasses.begin(); viewClassIter != compressedTextureFormatViewClasses.end(); ++viewClassIter) 2370433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2371433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<deUint32>& formats = viewClassIter->second; 2372433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ViewClass viewClass = viewClassIter->first; 2373433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestCaseGroup* const viewGroup = new TestCaseGroup(m_context, viewClassToName(viewClass), viewClassToName(viewClass)); 2374433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2375433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi compressedGroup->addChild(viewGroup); 2376433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2377433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int srcFormatNdx = 0; srcFormatNdx < (int)formats.size(); srcFormatNdx++) 2378433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int dstFormatNdx = 0; dstFormatNdx < (int)formats.size(); dstFormatNdx++) 2379433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2380433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 srcFormat = formats[srcFormatNdx]; 2381433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 dstFormat = formats[dstFormatNdx]; 2382433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2383433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (srcFormat != dstFormat && isFloatFormat(srcFormat) && isFloatFormat(dstFormat)) 2384433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 2385433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2386433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi addCopyTests(viewGroup, srcFormat, dstFormat); 2387433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2388433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2389433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2390433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (map<ViewClass, pair<vector<deUint32>, vector<deUint32> > >::const_iterator iter = mixedViewClasses.begin(); iter != mixedViewClasses.end(); ++iter) 2391433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2392433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const ViewClass viewClass = iter->first; 2393433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const string viewClassName = string(viewClassToName(viewClass)) + "_mixed"; 2394433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi TestCaseGroup* const viewGroup = new TestCaseGroup(m_context, viewClassName.c_str(), viewClassName.c_str()); 2395433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2396433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<deUint32> nonCompressedFormats = iter->second.first; 2397433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const vector<deUint32> compressedFormats = iter->second.second; 2398433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2399433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi mixedGroup->addChild(viewGroup); 2400433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2401433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int srcFormatNdx = 0; srcFormatNdx < (int)nonCompressedFormats.size(); srcFormatNdx++) 2402433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi for (int dstFormatNdx = 0; dstFormatNdx < (int)compressedFormats.size(); dstFormatNdx++) 2403433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi { 2404433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 srcFormat = nonCompressedFormats[srcFormatNdx]; 2405433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi const deUint32 dstFormat = compressedFormats[dstFormatNdx]; 2406433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2407433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi if (srcFormat != dstFormat && isFloatFormat(srcFormat) && isFloatFormat(dstFormat)) 2408433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi continue; 2409433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2410433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi addCopyTests(viewGroup, srcFormat, dstFormat); 2411433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi addCopyTests(viewGroup, dstFormat, srcFormat); 2412433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2413433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi } 2414433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 2415433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2416433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} // anonymous 2417433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2418433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviTestCaseGroup* createCopyImageTests (Context& context) 2419433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{ 2420433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi return new CopyImageTests(context); 2421433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} 2422433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi 2423433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} // Functional 2424433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} // gles31 2425433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} // deqp 2426