1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL ES Utilities 3 * ------------------------------------------------ 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Texture format utilities. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "gluTextureUtil.hpp" 25 #include "gluRenderContext.hpp" 26 #include "gluContextInfo.hpp" 27 #include "gluTexture.hpp" 28 #include "tcuTextureUtil.hpp" 29 #include "tcuFormatUtil.hpp" 30 #include "glwEnums.hpp" 31 32 namespace glu 33 { 34 35 using std::string; 36 37 /*--------------------------------------------------------------------*//*! 38 * \brief Map tcu::TextureFormat to GL pixel transfer format. 39 * 40 * Maps generic texture format description to GL pixel transfer format. 41 * If no mapping is found, throws tcu::InternalError. 42 * 43 * \param texFormat Generic texture format. 44 * \return GL pixel transfer format. 45 *//*--------------------------------------------------------------------*/ 46 TransferFormat getTransferFormat (tcu::TextureFormat texFormat) 47 { 48 using tcu::TextureFormat; 49 50 deUint32 format = GL_NONE; 51 deUint32 type = GL_NONE; 52 bool isInt = false; 53 54 switch (texFormat.type) 55 { 56 case TextureFormat::SIGNED_INT8: 57 case TextureFormat::SIGNED_INT16: 58 case TextureFormat::SIGNED_INT32: 59 case TextureFormat::UNSIGNED_INT8: 60 case TextureFormat::UNSIGNED_INT16: 61 case TextureFormat::UNSIGNED_INT32: 62 case TextureFormat::UNSIGNED_INT_1010102_REV: 63 isInt = true; 64 break; 65 66 default: 67 isInt = false; 68 break; 69 } 70 71 switch (texFormat.order) 72 { 73 case TextureFormat::A: format = GL_ALPHA; break; 74 case TextureFormat::L: format = GL_LUMINANCE; break; 75 case TextureFormat::LA: format = GL_LUMINANCE_ALPHA; break; 76 case TextureFormat::R: format = isInt ? GL_RED_INTEGER : GL_RED; break; 77 case TextureFormat::RG: format = isInt ? GL_RG_INTEGER : GL_RG; break; 78 case TextureFormat::RGB: format = isInt ? GL_RGB_INTEGER : GL_RGB; break; 79 case TextureFormat::RGBA: format = isInt ? GL_RGBA_INTEGER : GL_RGBA; break; 80 case TextureFormat::sR: format = GL_RED; break; 81 case TextureFormat::sRG: format = GL_RG; break; 82 case TextureFormat::sRGB: format = GL_RGB; break; 83 case TextureFormat::sRGBA: format = GL_RGBA; break; 84 case TextureFormat::D: format = GL_DEPTH_COMPONENT; break; 85 case TextureFormat::DS: format = GL_DEPTH_STENCIL; break; 86 case TextureFormat::S: format = GL_STENCIL_INDEX; break; 87 88 case TextureFormat::BGRA: 89 DE_ASSERT(!isInt); 90 format = GL_BGRA; 91 break; 92 93 default: 94 DE_ASSERT(false); 95 } 96 97 switch (texFormat.type) 98 { 99 case TextureFormat::SNORM_INT8: type = GL_BYTE; break; 100 case TextureFormat::SNORM_INT16: type = GL_SHORT; break; 101 case TextureFormat::UNORM_INT8: type = GL_UNSIGNED_BYTE; break; 102 case TextureFormat::UNORM_INT16: type = GL_UNSIGNED_SHORT; break; 103 case TextureFormat::UNORM_SHORT_565: type = GL_UNSIGNED_SHORT_5_6_5; break; 104 case TextureFormat::UNORM_SHORT_4444: type = GL_UNSIGNED_SHORT_4_4_4_4; break; 105 case TextureFormat::UNORM_SHORT_5551: type = GL_UNSIGNED_SHORT_5_5_5_1; break; 106 case TextureFormat::SIGNED_INT8: type = GL_BYTE; break; 107 case TextureFormat::SIGNED_INT16: type = GL_SHORT; break; 108 case TextureFormat::SIGNED_INT32: type = GL_INT; break; 109 case TextureFormat::UNSIGNED_INT8: type = GL_UNSIGNED_BYTE; break; 110 case TextureFormat::UNSIGNED_INT16: type = GL_UNSIGNED_SHORT; break; 111 case TextureFormat::UNSIGNED_INT32: type = GL_UNSIGNED_INT; break; 112 case TextureFormat::FLOAT: type = GL_FLOAT; break; 113 case TextureFormat::UNORM_INT_101010: type = GL_UNSIGNED_INT_2_10_10_10_REV; break; 114 case TextureFormat::UNORM_INT_1010102_REV: type = GL_UNSIGNED_INT_2_10_10_10_REV; break; 115 case TextureFormat::UNSIGNED_INT_1010102_REV: type = GL_UNSIGNED_INT_2_10_10_10_REV; break; 116 case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV: type = GL_UNSIGNED_INT_10F_11F_11F_REV; break; 117 case TextureFormat::UNSIGNED_INT_999_E5_REV: type = GL_UNSIGNED_INT_5_9_9_9_REV; break; 118 case TextureFormat::HALF_FLOAT: type = GL_HALF_FLOAT; break; 119 case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV: type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV; break; 120 case TextureFormat::UNSIGNED_INT_24_8: type = texFormat.order == TextureFormat::D 121 ? GL_UNSIGNED_INT 122 : GL_UNSIGNED_INT_24_8; break; 123 124 default: 125 throw tcu::InternalError("Can't map texture format to GL transfer format"); 126 } 127 128 return TransferFormat(format, type); 129 } 130 131 /*--------------------------------------------------------------------*//*! 132 * \brief Map tcu::TextureFormat to GL internal sized format. 133 * 134 * Maps generic texture format description to GL internal format. 135 * If no mapping is found, throws tcu::InternalError. 136 * 137 * \param texFormat Generic texture format. 138 * \return GL sized internal format. 139 *//*--------------------------------------------------------------------*/ 140 deUint32 getInternalFormat (tcu::TextureFormat texFormat) 141 { 142 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST < (1<<16)); 143 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST < (1<<16)); 144 145 #define PACK_FMT(ORDER, TYPE) ((int(ORDER) << 16) | int(TYPE)) 146 #define FMT_CASE(ORDER, TYPE) PACK_FMT(tcu::TextureFormat::ORDER, tcu::TextureFormat::TYPE) 147 148 switch (PACK_FMT(texFormat.order, texFormat.type)) 149 { 150 case FMT_CASE(RGBA, UNORM_SHORT_5551): return GL_RGB5_A1; 151 case FMT_CASE(RGBA, UNORM_SHORT_4444): return GL_RGBA4; 152 case FMT_CASE(RGB, UNORM_SHORT_565): return GL_RGB565; 153 case FMT_CASE(D, UNORM_INT16): return GL_DEPTH_COMPONENT16; 154 case FMT_CASE(S, UNSIGNED_INT8): return GL_STENCIL_INDEX8; 155 156 case FMT_CASE(RGBA, FLOAT): return GL_RGBA32F; 157 case FMT_CASE(RGBA, SIGNED_INT32): return GL_RGBA32I; 158 case FMT_CASE(RGBA, UNSIGNED_INT32): return GL_RGBA32UI; 159 case FMT_CASE(RGBA, UNORM_INT16): return GL_RGBA16; 160 case FMT_CASE(RGBA, SNORM_INT16): return GL_RGBA16_SNORM; 161 case FMT_CASE(RGBA, HALF_FLOAT): return GL_RGBA16F; 162 case FMT_CASE(RGBA, SIGNED_INT16): return GL_RGBA16I; 163 case FMT_CASE(RGBA, UNSIGNED_INT16): return GL_RGBA16UI; 164 case FMT_CASE(RGBA, UNORM_INT8): return GL_RGBA8; 165 case FMT_CASE(RGBA, SIGNED_INT8): return GL_RGBA8I; 166 case FMT_CASE(RGBA, UNSIGNED_INT8): return GL_RGBA8UI; 167 case FMT_CASE(sRGBA, UNORM_INT8): return GL_SRGB8_ALPHA8; 168 case FMT_CASE(RGBA, UNORM_INT_1010102_REV): return GL_RGB10_A2; 169 case FMT_CASE(RGBA, UNSIGNED_INT_1010102_REV): return GL_RGB10_A2UI; 170 case FMT_CASE(RGBA, SNORM_INT8): return GL_RGBA8_SNORM; 171 172 case FMT_CASE(RGB, UNORM_INT8): return GL_RGB8; 173 case FMT_CASE(RGB, UNSIGNED_INT_11F_11F_10F_REV): return GL_R11F_G11F_B10F; 174 case FMT_CASE(RGB, FLOAT): return GL_RGB32F; 175 case FMT_CASE(RGB, SIGNED_INT32): return GL_RGB32I; 176 case FMT_CASE(RGB, UNSIGNED_INT32): return GL_RGB32UI; 177 case FMT_CASE(RGB, UNORM_INT16): return GL_RGB16; 178 case FMT_CASE(RGB, SNORM_INT16): return GL_RGB16_SNORM; 179 case FMT_CASE(RGB, HALF_FLOAT): return GL_RGB16F; 180 case FMT_CASE(RGB, SIGNED_INT16): return GL_RGB16I; 181 case FMT_CASE(RGB, UNSIGNED_INT16): return GL_RGB16UI; 182 case FMT_CASE(RGB, SNORM_INT8): return GL_RGB8_SNORM; 183 case FMT_CASE(RGB, SIGNED_INT8): return GL_RGB8I; 184 case FMT_CASE(RGB, UNSIGNED_INT8): return GL_RGB8UI; 185 case FMT_CASE(sRGB, UNORM_INT8): return GL_SRGB8; 186 case FMT_CASE(RGB, UNSIGNED_INT_999_E5_REV): return GL_RGB9_E5; 187 case FMT_CASE(RGB, UNORM_INT_1010102_REV): return GL_RGB10; 188 189 case FMT_CASE(RG, FLOAT): return GL_RG32F; 190 case FMT_CASE(RG, SIGNED_INT32): return GL_RG32I; 191 case FMT_CASE(RG, UNSIGNED_INT32): return GL_RG32UI; 192 case FMT_CASE(RG, UNORM_INT16): return GL_RG16; 193 case FMT_CASE(RG, SNORM_INT16): return GL_RG16_SNORM; 194 case FMT_CASE(RG, HALF_FLOAT): return GL_RG16F; 195 case FMT_CASE(RG, SIGNED_INT16): return GL_RG16I; 196 case FMT_CASE(RG, UNSIGNED_INT16): return GL_RG16UI; 197 case FMT_CASE(RG, UNORM_INT8): return GL_RG8; 198 case FMT_CASE(RG, SIGNED_INT8): return GL_RG8I; 199 case FMT_CASE(RG, UNSIGNED_INT8): return GL_RG8UI; 200 case FMT_CASE(RG, SNORM_INT8): return GL_RG8_SNORM; 201 case FMT_CASE(sRG, UNORM_INT8): return GL_SRG8_EXT; 202 203 case FMT_CASE(R, FLOAT): return GL_R32F; 204 case FMT_CASE(R, SIGNED_INT32): return GL_R32I; 205 case FMT_CASE(R, UNSIGNED_INT32): return GL_R32UI; 206 case FMT_CASE(R, UNORM_INT16): return GL_R16; 207 case FMT_CASE(R, SNORM_INT16): return GL_R16_SNORM; 208 case FMT_CASE(R, HALF_FLOAT): return GL_R16F; 209 case FMT_CASE(R, SIGNED_INT16): return GL_R16I; 210 case FMT_CASE(R, UNSIGNED_INT16): return GL_R16UI; 211 case FMT_CASE(R, UNORM_INT8): return GL_R8; 212 case FMT_CASE(R, SIGNED_INT8): return GL_R8I; 213 case FMT_CASE(R, UNSIGNED_INT8): return GL_R8UI; 214 case FMT_CASE(R, SNORM_INT8): return GL_R8_SNORM; 215 case FMT_CASE(sR, UNORM_INT8): return GL_SR8_EXT; 216 217 case FMT_CASE(D, FLOAT): return GL_DEPTH_COMPONENT32F; 218 case FMT_CASE(D, UNSIGNED_INT_24_8): return GL_DEPTH_COMPONENT24; 219 case FMT_CASE(D, UNSIGNED_INT32): return GL_DEPTH_COMPONENT32; 220 case FMT_CASE(DS, FLOAT_UNSIGNED_INT_24_8_REV): return GL_DEPTH32F_STENCIL8; 221 case FMT_CASE(DS, UNSIGNED_INT_24_8): return GL_DEPTH24_STENCIL8; 222 223 default: 224 throw tcu::InternalError("Can't map texture format to GL internal format"); 225 } 226 } 227 228 /*--------------------------------------------------------------------*//*! 229 * \brief Map generic compressed format to GL compressed format enum. 230 * 231 * Maps generic compressed format to GL compressed format enum value. 232 * If no mapping is found, throws tcu::InternalError. 233 * 234 * \param format Generic compressed format. 235 * \return GL compressed texture format. 236 *//*--------------------------------------------------------------------*/ 237 deUint32 getGLFormat (tcu::CompressedTexFormat format) 238 { 239 switch (format) 240 { 241 case tcu::COMPRESSEDTEXFORMAT_ETC1_RGB8: return GL_ETC1_RGB8_OES; 242 case tcu::COMPRESSEDTEXFORMAT_EAC_R11: return GL_COMPRESSED_R11_EAC; 243 case tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11: return GL_COMPRESSED_SIGNED_R11_EAC; 244 case tcu::COMPRESSEDTEXFORMAT_EAC_RG11: return GL_COMPRESSED_RG11_EAC; 245 case tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11: return GL_COMPRESSED_SIGNED_RG11_EAC; 246 case tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8: return GL_COMPRESSED_RGB8_ETC2; 247 case tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8: return GL_COMPRESSED_SRGB8_ETC2; 248 case tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1: return GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2; 249 case tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1: return GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2; 250 case tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8: return GL_COMPRESSED_RGBA8_ETC2_EAC; 251 case tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC; 252 253 case tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_RGBA: return GL_COMPRESSED_RGBA_ASTC_4x4_KHR; 254 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_RGBA: return GL_COMPRESSED_RGBA_ASTC_5x4_KHR; 255 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_RGBA: return GL_COMPRESSED_RGBA_ASTC_5x5_KHR; 256 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_RGBA: return GL_COMPRESSED_RGBA_ASTC_6x5_KHR; 257 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_RGBA: return GL_COMPRESSED_RGBA_ASTC_6x6_KHR; 258 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_RGBA: return GL_COMPRESSED_RGBA_ASTC_8x5_KHR; 259 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_RGBA: return GL_COMPRESSED_RGBA_ASTC_8x6_KHR; 260 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_RGBA: return GL_COMPRESSED_RGBA_ASTC_8x8_KHR; 261 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_RGBA: return GL_COMPRESSED_RGBA_ASTC_10x5_KHR; 262 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_RGBA: return GL_COMPRESSED_RGBA_ASTC_10x6_KHR; 263 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_RGBA: return GL_COMPRESSED_RGBA_ASTC_10x8_KHR; 264 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_RGBA: return GL_COMPRESSED_RGBA_ASTC_10x10_KHR; 265 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_RGBA: return GL_COMPRESSED_RGBA_ASTC_12x10_KHR; 266 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_RGBA: return GL_COMPRESSED_RGBA_ASTC_12x12_KHR; 267 case tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR; 268 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR; 269 case tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR; 270 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR; 271 case tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR; 272 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR; 273 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR; 274 case tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR; 275 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR; 276 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR; 277 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR; 278 case tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR; 279 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR; 280 case tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_SRGB8_ALPHA8: return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR; 281 282 default: 283 throw tcu::InternalError("Can't map compressed format to GL format"); 284 } 285 } 286 287 /*--------------------------------------------------------------------*//*! 288 * \brief Map compressed GL format to generic compressed format. 289 * 290 * Maps compressed GL format to generic compressed format. 291 * If no mapping is found, throws tcu::InternalError. 292 * 293 * \param GL compressed texture format. 294 * \return format Generic compressed format. 295 *//*--------------------------------------------------------------------*/ 296 tcu::CompressedTexFormat mapGLCompressedTexFormat (deUint32 format) 297 { 298 switch (format) 299 { 300 case GL_ETC1_RGB8_OES: return tcu::COMPRESSEDTEXFORMAT_ETC1_RGB8; 301 case GL_COMPRESSED_R11_EAC: return tcu::COMPRESSEDTEXFORMAT_EAC_R11; 302 case GL_COMPRESSED_SIGNED_R11_EAC: return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11; 303 case GL_COMPRESSED_RG11_EAC: return tcu::COMPRESSEDTEXFORMAT_EAC_RG11; 304 case GL_COMPRESSED_SIGNED_RG11_EAC: return tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11; 305 case GL_COMPRESSED_RGB8_ETC2: return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8; 306 case GL_COMPRESSED_SRGB8_ETC2: return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8; 307 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: return tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1; 308 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: return tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1; 309 case GL_COMPRESSED_RGBA8_ETC2_EAC: return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8; 310 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: return tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8; 311 312 case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_RGBA; 313 case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_RGBA; 314 case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_RGBA; 315 case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_RGBA; 316 case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_RGBA; 317 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_RGBA; 318 case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_RGBA; 319 case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_RGBA; 320 case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_RGBA; 321 case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_RGBA; 322 case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_RGBA; 323 case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_RGBA; 324 case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_RGBA; 325 case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_RGBA; 326 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_4x4_SRGB8_ALPHA8; 327 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_5x4_SRGB8_ALPHA8; 328 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8; 329 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_6x5_SRGB8_ALPHA8; 330 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_6x6_SRGB8_ALPHA8; 331 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x5_SRGB8_ALPHA8; 332 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8; 333 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_8x8_SRGB8_ALPHA8; 334 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x5_SRGB8_ALPHA8; 335 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x6_SRGB8_ALPHA8; 336 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x8_SRGB8_ALPHA8; 337 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_10x10_SRGB8_ALPHA8; 338 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_12x10_SRGB8_ALPHA8; 339 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: return tcu::COMPRESSEDTEXFORMAT_ASTC_12x12_SRGB8_ALPHA8; 340 341 default: 342 throw tcu::InternalError("Can't map compressed GL format to compressed format"); 343 } 344 } 345 346 bool isCompressedFormat (deUint32 internalFormat) 347 { 348 switch (internalFormat) 349 { 350 case GL_ETC1_RGB8_OES: 351 case GL_COMPRESSED_R11_EAC: 352 case GL_COMPRESSED_SIGNED_R11_EAC: 353 case GL_COMPRESSED_RG11_EAC: 354 case GL_COMPRESSED_SIGNED_RG11_EAC: 355 case GL_COMPRESSED_RGB8_ETC2: 356 case GL_COMPRESSED_SRGB8_ETC2: 357 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 358 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 359 case GL_COMPRESSED_RGBA8_ETC2_EAC: 360 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 361 case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: 362 case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: 363 case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: 364 case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: 365 case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: 366 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: 367 case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: 368 case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: 369 case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: 370 case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: 371 case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: 372 case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: 373 case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: 374 case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: 375 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 376 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 377 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 378 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 379 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 380 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 381 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 382 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 383 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 384 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 385 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 386 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 387 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 388 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 389 return true; 390 391 default: 392 return false; 393 } 394 } 395 396 static tcu::TextureFormat::ChannelType mapGLChannelType (deUint32 dataType, bool normalized) 397 { 398 // \note Normalized bit is ignored where it doesn't apply. 399 using tcu::TextureFormat; 400 401 switch (dataType) 402 { 403 case GL_UNSIGNED_BYTE: return normalized ? TextureFormat::UNORM_INT8 : TextureFormat::UNSIGNED_INT8; 404 case GL_BYTE: return normalized ? TextureFormat::SNORM_INT8 : TextureFormat::SIGNED_INT8; 405 case GL_UNSIGNED_SHORT: return normalized ? TextureFormat::UNORM_INT16 : TextureFormat::UNSIGNED_INT16; 406 case GL_SHORT: return normalized ? TextureFormat::SNORM_INT16 : TextureFormat::SIGNED_INT16; 407 case GL_UNSIGNED_INT: return normalized ? TextureFormat::UNORM_INT32 : TextureFormat::UNSIGNED_INT32; 408 case GL_INT: return normalized ? TextureFormat::SNORM_INT32 : TextureFormat::SIGNED_INT32; 409 case GL_FLOAT: return TextureFormat::FLOAT; 410 case GL_UNSIGNED_SHORT_4_4_4_4: return TextureFormat::UNORM_SHORT_4444; 411 case GL_UNSIGNED_SHORT_5_5_5_1: return TextureFormat::UNORM_SHORT_5551; 412 case GL_UNSIGNED_SHORT_5_6_5: return TextureFormat::UNORM_SHORT_565; 413 case GL_HALF_FLOAT: return TextureFormat::HALF_FLOAT; 414 case GL_UNSIGNED_INT_2_10_10_10_REV: return normalized ? TextureFormat::UNORM_INT_1010102_REV : TextureFormat::UNSIGNED_INT_1010102_REV; 415 case GL_UNSIGNED_INT_10F_11F_11F_REV: return TextureFormat::UNSIGNED_INT_11F_11F_10F_REV; 416 case GL_UNSIGNED_INT_24_8: return TextureFormat::UNSIGNED_INT_24_8; 417 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV; 418 case GL_UNSIGNED_INT_5_9_9_9_REV: return TextureFormat::UNSIGNED_INT_999_E5_REV; 419 420 default: 421 DE_ASSERT(false); 422 return TextureFormat::CHANNELTYPE_LAST; 423 } 424 } 425 426 /*--------------------------------------------------------------------*//*! 427 * \brief Map GL pixel transfer format to tcu::TextureFormat. 428 * 429 * If no mapping is found, throws tcu::InternalError. 430 * 431 * \param format GL pixel format. 432 * \param dataType GL data type. 433 * \return Generic texture format. 434 *//*--------------------------------------------------------------------*/ 435 tcu::TextureFormat mapGLTransferFormat (deUint32 format, deUint32 dataType) 436 { 437 using tcu::TextureFormat; 438 switch (format) 439 { 440 case GL_ALPHA: return TextureFormat(TextureFormat::A, mapGLChannelType(dataType, true)); 441 case GL_LUMINANCE: return TextureFormat(TextureFormat::L, mapGLChannelType(dataType, true)); 442 case GL_LUMINANCE_ALPHA: return TextureFormat(TextureFormat::LA, mapGLChannelType(dataType, true)); 443 case GL_RGB: return TextureFormat(TextureFormat::RGB, mapGLChannelType(dataType, true)); 444 case GL_RGBA: return TextureFormat(TextureFormat::RGBA, mapGLChannelType(dataType, true)); 445 case GL_BGRA: return TextureFormat(TextureFormat::BGRA, mapGLChannelType(dataType, true)); 446 case GL_RG: return TextureFormat(TextureFormat::RG, mapGLChannelType(dataType, true)); 447 case GL_RED: return TextureFormat(TextureFormat::R, mapGLChannelType(dataType, true)); 448 case GL_RGBA_INTEGER: return TextureFormat(TextureFormat::RGBA, mapGLChannelType(dataType, false)); 449 case GL_RGB_INTEGER: return TextureFormat(TextureFormat::RGB, mapGLChannelType(dataType, false)); 450 case GL_RG_INTEGER: return TextureFormat(TextureFormat::RG, mapGLChannelType(dataType, false)); 451 case GL_RED_INTEGER: return TextureFormat(TextureFormat::R, mapGLChannelType(dataType, false)); 452 453 case GL_DEPTH_COMPONENT: return TextureFormat(TextureFormat::D, mapGLChannelType(dataType, true)); 454 case GL_DEPTH_STENCIL: return TextureFormat(TextureFormat::DS, mapGLChannelType(dataType, true)); 455 456 default: 457 throw tcu::InternalError(string("Can't map GL pixel format (") + tcu::toHex(format).toString() + ", " + tcu::toHex(dataType).toString() + ") to texture format"); 458 } 459 } 460 461 /*--------------------------------------------------------------------*//*! 462 * \brief Map GL internal texture format to tcu::TextureFormat. 463 * 464 * If no mapping is found, throws tcu::InternalError. 465 * 466 * \param internalFormat Sized internal format. 467 * \return Generic texture format. 468 *//*--------------------------------------------------------------------*/ 469 tcu::TextureFormat mapGLInternalFormat (deUint32 internalFormat) 470 { 471 using tcu::TextureFormat; 472 switch (internalFormat) 473 { 474 case GL_RGB5_A1: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_5551); 475 case GL_RGBA4: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_4444); 476 case GL_RGB565: return TextureFormat(TextureFormat::RGB, TextureFormat::UNORM_SHORT_565); 477 case GL_DEPTH_COMPONENT16: return TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT16); 478 case GL_STENCIL_INDEX8: return TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8); 479 480 case GL_RGBA32F: return TextureFormat(TextureFormat::RGBA, TextureFormat::FLOAT); 481 case GL_RGBA32I: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT32); 482 case GL_RGBA32UI: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT32); 483 case GL_RGBA16: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT16); 484 case GL_RGBA16_SNORM: return TextureFormat(TextureFormat::RGBA, TextureFormat::SNORM_INT16); 485 case GL_RGBA16F: return TextureFormat(TextureFormat::RGBA, TextureFormat::HALF_FLOAT); 486 case GL_RGBA16I: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT16); 487 case GL_RGBA16UI: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT16); 488 case GL_RGBA8: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT8); 489 case GL_RGBA8I: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT8); 490 case GL_RGBA8UI: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT8); 491 case GL_SRGB8_ALPHA8: return TextureFormat(TextureFormat::sRGBA, TextureFormat::UNORM_INT8); 492 case GL_RGB10_A2: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT_1010102_REV); 493 case GL_RGB10_A2UI: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT_1010102_REV); 494 case GL_RGBA8_SNORM: return TextureFormat(TextureFormat::RGBA, TextureFormat::SNORM_INT8); 495 496 case GL_RGB8: return TextureFormat(TextureFormat::RGB, TextureFormat::UNORM_INT8); 497 case GL_R11F_G11F_B10F: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT_11F_11F_10F_REV); 498 case GL_RGB32F: return TextureFormat(TextureFormat::RGB, TextureFormat::FLOAT); 499 case GL_RGB32I: return TextureFormat(TextureFormat::RGB, TextureFormat::SIGNED_INT32); 500 case GL_RGB32UI: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT32); 501 case GL_RGB16: return TextureFormat(TextureFormat::RGB, TextureFormat::UNORM_INT16); 502 case GL_RGB16_SNORM: return TextureFormat(TextureFormat::RGB, TextureFormat::SNORM_INT16); 503 case GL_RGB16F: return TextureFormat(TextureFormat::RGB, TextureFormat::HALF_FLOAT); 504 case GL_RGB16I: return TextureFormat(TextureFormat::RGB, TextureFormat::SIGNED_INT16); 505 case GL_RGB16UI: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT16); 506 case GL_RGB8_SNORM: return TextureFormat(TextureFormat::RGB, TextureFormat::SNORM_INT8); 507 case GL_RGB8I: return TextureFormat(TextureFormat::RGB, TextureFormat::SIGNED_INT8); 508 case GL_RGB8UI: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT8); 509 case GL_SRGB8: return TextureFormat(TextureFormat::sRGB, TextureFormat::UNORM_INT8); 510 case GL_RGB9_E5: return TextureFormat(TextureFormat::RGB, TextureFormat::UNSIGNED_INT_999_E5_REV); 511 case GL_RGB10: return TextureFormat(TextureFormat::RGB, TextureFormat::UNORM_INT_1010102_REV); 512 513 case GL_RG32F: return TextureFormat(TextureFormat::RG, TextureFormat::FLOAT); 514 case GL_RG32I: return TextureFormat(TextureFormat::RG, TextureFormat::SIGNED_INT32); 515 case GL_RG32UI: return TextureFormat(TextureFormat::RG, TextureFormat::UNSIGNED_INT32); 516 case GL_RG16: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_INT16); 517 case GL_RG16_SNORM: return TextureFormat(TextureFormat::RG, TextureFormat::SNORM_INT16); 518 case GL_RG16F: return TextureFormat(TextureFormat::RG, TextureFormat::HALF_FLOAT); 519 case GL_RG16I: return TextureFormat(TextureFormat::RG, TextureFormat::SIGNED_INT16); 520 case GL_RG16UI: return TextureFormat(TextureFormat::RG, TextureFormat::UNSIGNED_INT16); 521 case GL_RG8: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_INT8); 522 case GL_RG8I: return TextureFormat(TextureFormat::RG, TextureFormat::SIGNED_INT8); 523 case GL_RG8UI: return TextureFormat(TextureFormat::RG, TextureFormat::UNSIGNED_INT8); 524 case GL_RG8_SNORM: return TextureFormat(TextureFormat::RG, TextureFormat::SNORM_INT8); 525 case GL_SRG8_EXT: return TextureFormat(TextureFormat::sRG, TextureFormat::UNORM_INT8); 526 527 case GL_R32F: return TextureFormat(TextureFormat::R, TextureFormat::FLOAT); 528 case GL_R32I: return TextureFormat(TextureFormat::R, TextureFormat::SIGNED_INT32); 529 case GL_R32UI: return TextureFormat(TextureFormat::R, TextureFormat::UNSIGNED_INT32); 530 case GL_R16: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_INT16); 531 case GL_R16_SNORM: return TextureFormat(TextureFormat::R, TextureFormat::SNORM_INT16); 532 case GL_R16F: return TextureFormat(TextureFormat::R, TextureFormat::HALF_FLOAT); 533 case GL_R16I: return TextureFormat(TextureFormat::R, TextureFormat::SIGNED_INT16); 534 case GL_R16UI: return TextureFormat(TextureFormat::R, TextureFormat::UNSIGNED_INT16); 535 case GL_R8: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_INT8); 536 case GL_R8I: return TextureFormat(TextureFormat::R, TextureFormat::SIGNED_INT8); 537 case GL_R8UI: return TextureFormat(TextureFormat::R, TextureFormat::UNSIGNED_INT8); 538 case GL_R8_SNORM: return TextureFormat(TextureFormat::R, TextureFormat::SNORM_INT8); 539 case GL_SR8_EXT: return TextureFormat(TextureFormat::sR, TextureFormat::UNORM_INT8); 540 541 case GL_DEPTH_COMPONENT32F: return TextureFormat(TextureFormat::D, TextureFormat::FLOAT); 542 case GL_DEPTH_COMPONENT24: return TextureFormat(TextureFormat::D, TextureFormat::UNSIGNED_INT_24_8); 543 case GL_DEPTH_COMPONENT32: return TextureFormat(TextureFormat::D, TextureFormat::UNSIGNED_INT32); 544 case GL_DEPTH32F_STENCIL8: return TextureFormat(TextureFormat::DS, TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV); 545 case GL_DEPTH24_STENCIL8: return TextureFormat(TextureFormat::DS, TextureFormat::UNSIGNED_INT_24_8); 546 547 default: 548 throw tcu::InternalError(string("Can't map GL sized internal format (") + tcu::toHex(internalFormat).toString() + ") to texture format"); 549 } 550 } 551 552 bool isGLInternalColorFormatFilterable (deUint32 format) 553 { 554 switch (format) 555 { 556 case GL_R8: 557 case GL_R8_SNORM: 558 case GL_RG8: 559 case GL_RG8_SNORM: 560 case GL_RGB8: 561 case GL_RGB8_SNORM: 562 case GL_RGB565: 563 case GL_RGBA4: 564 case GL_RGB5_A1: 565 case GL_RGBA8: 566 case GL_RGBA8_SNORM: 567 case GL_RGB10_A2: 568 case GL_SR8_EXT: 569 case GL_SRG8_EXT: 570 case GL_SRGB8: 571 case GL_SRGB8_ALPHA8: 572 case GL_R16F: 573 case GL_RG16F: 574 case GL_RGB16F: 575 case GL_RGBA16F: 576 case GL_R11F_G11F_B10F: 577 case GL_RGB9_E5: 578 return true; 579 580 case GL_RGB10_A2UI: 581 case GL_R32F: 582 case GL_RG32F: 583 case GL_RGB32F: 584 case GL_RGBA32F: 585 case GL_R8I: 586 case GL_R8UI: 587 case GL_R16I: 588 case GL_R16UI: 589 case GL_R32I: 590 case GL_R32UI: 591 case GL_RG8I: 592 case GL_RG8UI: 593 case GL_RG16I: 594 case GL_RG16UI: 595 case GL_RG32I: 596 case GL_RG32UI: 597 case GL_RGB8I: 598 case GL_RGB8UI: 599 case GL_RGB16I: 600 case GL_RGB16UI: 601 case GL_RGB32I: 602 case GL_RGB32UI: 603 case GL_RGBA8I: 604 case GL_RGBA8UI: 605 case GL_RGBA16I: 606 case GL_RGBA16UI: 607 case GL_RGBA32I: 608 case GL_RGBA32UI: 609 return false; 610 611 default: 612 DE_ASSERT(false); 613 return false; 614 } 615 } 616 617 static inline tcu::Sampler::WrapMode mapGLWrapMode (deUint32 wrapMode) 618 { 619 switch (wrapMode) 620 { 621 case GL_CLAMP_TO_EDGE: return tcu::Sampler::CLAMP_TO_EDGE; 622 case GL_CLAMP_TO_BORDER: return tcu::Sampler::CLAMP_TO_BORDER; 623 case GL_REPEAT: return tcu::Sampler::REPEAT_GL; 624 case GL_MIRRORED_REPEAT: return tcu::Sampler::MIRRORED_REPEAT_GL; 625 default: 626 throw tcu::InternalError("Can't map GL wrap mode " + tcu::toHex(wrapMode).toString()); 627 } 628 } 629 630 static inline tcu::Sampler::FilterMode mapGLMinFilterMode (deUint32 filterMode) 631 { 632 switch (filterMode) 633 { 634 case GL_NEAREST: return tcu::Sampler::NEAREST; 635 case GL_LINEAR: return tcu::Sampler::LINEAR; 636 case GL_NEAREST_MIPMAP_NEAREST: return tcu::Sampler::NEAREST_MIPMAP_NEAREST; 637 case GL_NEAREST_MIPMAP_LINEAR: return tcu::Sampler::NEAREST_MIPMAP_LINEAR; 638 case GL_LINEAR_MIPMAP_NEAREST: return tcu::Sampler::LINEAR_MIPMAP_NEAREST; 639 case GL_LINEAR_MIPMAP_LINEAR: return tcu::Sampler::LINEAR_MIPMAP_LINEAR; 640 default: 641 throw tcu::InternalError("Can't map GL min filter mode" + tcu::toHex(filterMode).toString()); 642 } 643 } 644 645 static inline tcu::Sampler::FilterMode mapGLMagFilterMode (deUint32 filterMode) 646 { 647 switch (filterMode) 648 { 649 case GL_NEAREST: return tcu::Sampler::NEAREST; 650 case GL_LINEAR: return tcu::Sampler::LINEAR; 651 default: 652 throw tcu::InternalError("Can't map GL mag filter mode" + tcu::toHex(filterMode).toString()); 653 } 654 } 655 656 /*--------------------------------------------------------------------*//*! 657 * \brief Map GL sampler parameters to tcu::Sampler. 658 * 659 * If no mapping is found, throws tcu::InternalError. 660 * 661 * \param wrapS S-component wrap mode 662 * \param minFilter Minification filter mode 663 * \param magFilter Magnification filter mode 664 * \return Sampler description. 665 *//*--------------------------------------------------------------------*/ 666 tcu::Sampler mapGLSampler (deUint32 wrapS, deUint32 minFilter, deUint32 magFilter) 667 { 668 return mapGLSampler(wrapS, wrapS, wrapS, minFilter, magFilter); 669 } 670 671 672 /*--------------------------------------------------------------------*//*! 673 * \brief Map GL sampler parameters to tcu::Sampler. 674 * 675 * If no mapping is found, throws tcu::InternalError. 676 * 677 * \param wrapS S-component wrap mode 678 * \param wrapT T-component wrap mode 679 * \param minFilter Minification filter mode 680 * \param magFilter Magnification filter mode 681 * \return Sampler description. 682 *//*--------------------------------------------------------------------*/ 683 tcu::Sampler mapGLSampler (deUint32 wrapS, deUint32 wrapT, deUint32 minFilter, deUint32 magFilter) 684 { 685 return mapGLSampler(wrapS, wrapT, wrapS, minFilter, magFilter); 686 } 687 688 /*--------------------------------------------------------------------*//*! 689 * \brief Map GL sampler parameters to tcu::Sampler. 690 * 691 * If no mapping is found, throws tcu::InternalError. 692 * 693 * \param wrapS S-component wrap mode 694 * \param wrapT T-component wrap mode 695 * \param wrapR R-component wrap mode 696 * \param minFilter Minification filter mode 697 * \param magFilter Magnification filter mode 698 * \return Sampler description. 699 *//*--------------------------------------------------------------------*/ 700 tcu::Sampler mapGLSampler (deUint32 wrapS, deUint32 wrapT, deUint32 wrapR, deUint32 minFilter, deUint32 magFilter) 701 { 702 return tcu::Sampler(mapGLWrapMode(wrapS), mapGLWrapMode(wrapT), mapGLWrapMode(wrapR), 703 mapGLMinFilterMode(minFilter), mapGLMagFilterMode(magFilter), 704 0.0f /* lod threshold */, 705 true /* normalized coords */, 706 tcu::Sampler::COMPAREMODE_NONE /* no compare */, 707 0 /* compare channel */, 708 tcu::Vec4(0.0f) /* border color, not used */); 709 } 710 711 /*--------------------------------------------------------------------*//*! 712 * \brief Map GL compare function to tcu::Sampler::CompareMode. 713 * 714 * If no mapping is found, throws tcu::InternalError. 715 * 716 * \param mode GL compare mode 717 * \return Compare mode 718 *//*--------------------------------------------------------------------*/ 719 tcu::Sampler::CompareMode mapGLCompareFunc (deUint32 mode) 720 { 721 switch (mode) 722 { 723 case GL_LESS: return tcu::Sampler::COMPAREMODE_LESS; 724 case GL_LEQUAL: return tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL; 725 case GL_GREATER: return tcu::Sampler::COMPAREMODE_GREATER; 726 case GL_GEQUAL: return tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL; 727 case GL_EQUAL: return tcu::Sampler::COMPAREMODE_EQUAL; 728 case GL_NOTEQUAL: return tcu::Sampler::COMPAREMODE_NOT_EQUAL; 729 case GL_ALWAYS: return tcu::Sampler::COMPAREMODE_ALWAYS; 730 case GL_NEVER: return tcu::Sampler::COMPAREMODE_NEVER; 731 default: 732 throw tcu::InternalError("Can't map GL compare mode " + tcu::toHex(mode).toString()); 733 } 734 } 735 736 /*--------------------------------------------------------------------*//*! 737 * \brief Get GL wrap mode. 738 * 739 * If no mapping is found, throws tcu::InternalError. 740 * 741 * \param wrapMode Wrap mode 742 * \return GL wrap mode 743 *//*--------------------------------------------------------------------*/ 744 deUint32 getGLWrapMode (tcu::Sampler::WrapMode wrapMode) 745 { 746 DE_ASSERT(wrapMode != tcu::Sampler::WRAPMODE_LAST); 747 switch (wrapMode) 748 { 749 case tcu::Sampler::CLAMP_TO_EDGE: return GL_CLAMP_TO_EDGE; 750 case tcu::Sampler::CLAMP_TO_BORDER: return GL_CLAMP_TO_BORDER; 751 case tcu::Sampler::REPEAT_GL: return GL_REPEAT; 752 case tcu::Sampler::MIRRORED_REPEAT_GL: return GL_MIRRORED_REPEAT; 753 default: 754 throw tcu::InternalError("Can't map wrap mode"); 755 } 756 } 757 758 /*--------------------------------------------------------------------*//*! 759 * \brief Get GL filter mode. 760 * 761 * If no mapping is found, throws tcu::InternalError. 762 * 763 * \param filterMode Filter mode 764 * \return GL filter mode 765 *//*--------------------------------------------------------------------*/ 766 deUint32 getGLFilterMode (tcu::Sampler::FilterMode filterMode) 767 { 768 DE_ASSERT(filterMode != tcu::Sampler::FILTERMODE_LAST); 769 switch (filterMode) 770 { 771 case tcu::Sampler::NEAREST: return GL_NEAREST; 772 case tcu::Sampler::LINEAR: return GL_LINEAR; 773 case tcu::Sampler::NEAREST_MIPMAP_NEAREST: return GL_NEAREST_MIPMAP_NEAREST; 774 case tcu::Sampler::NEAREST_MIPMAP_LINEAR: return GL_NEAREST_MIPMAP_LINEAR; 775 case tcu::Sampler::LINEAR_MIPMAP_NEAREST: return GL_LINEAR_MIPMAP_NEAREST; 776 case tcu::Sampler::LINEAR_MIPMAP_LINEAR: return GL_LINEAR_MIPMAP_LINEAR; 777 default: 778 throw tcu::InternalError("Can't map filter mode"); 779 } 780 } 781 782 /*--------------------------------------------------------------------*//*! 783 * \brief Get GL compare mode. 784 * 785 * If no mapping is found, throws tcu::InternalError. 786 * 787 * \param compareMode Compare mode 788 * \return GL compare mode 789 *//*--------------------------------------------------------------------*/ 790 deUint32 getGLCompareFunc (tcu::Sampler::CompareMode compareMode) 791 { 792 DE_ASSERT(compareMode != tcu::Sampler::COMPAREMODE_NONE); 793 switch (compareMode) 794 { 795 case tcu::Sampler::COMPAREMODE_NONE: return GL_NONE; 796 case tcu::Sampler::COMPAREMODE_LESS: return GL_LESS; 797 case tcu::Sampler::COMPAREMODE_LESS_OR_EQUAL: return GL_LEQUAL; 798 case tcu::Sampler::COMPAREMODE_GREATER: return GL_GREATER; 799 case tcu::Sampler::COMPAREMODE_GREATER_OR_EQUAL: return GL_GEQUAL; 800 case tcu::Sampler::COMPAREMODE_EQUAL: return GL_EQUAL; 801 case tcu::Sampler::COMPAREMODE_NOT_EQUAL: return GL_NOTEQUAL; 802 case tcu::Sampler::COMPAREMODE_ALWAYS: return GL_ALWAYS; 803 case tcu::Sampler::COMPAREMODE_NEVER: return GL_NEVER; 804 default: 805 throw tcu::InternalError("Can't map compare mode"); 806 } 807 } 808 809 /*--------------------------------------------------------------------*//*! 810 * \brief Get GL cube face. 811 * 812 * If no mapping is found, throws tcu::InternalError. 813 * 814 * \param face Cube face 815 * \return GL cube face 816 *//*--------------------------------------------------------------------*/ 817 deUint32 getGLCubeFace (tcu::CubeFace face) 818 { 819 DE_ASSERT(face != tcu::CUBEFACE_LAST); 820 switch (face) 821 { 822 case tcu::CUBEFACE_NEGATIVE_X: return GL_TEXTURE_CUBE_MAP_NEGATIVE_X; 823 case tcu::CUBEFACE_POSITIVE_X: return GL_TEXTURE_CUBE_MAP_POSITIVE_X; 824 case tcu::CUBEFACE_NEGATIVE_Y: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; 825 case tcu::CUBEFACE_POSITIVE_Y: return GL_TEXTURE_CUBE_MAP_POSITIVE_Y; 826 case tcu::CUBEFACE_NEGATIVE_Z: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; 827 case tcu::CUBEFACE_POSITIVE_Z: return GL_TEXTURE_CUBE_MAP_POSITIVE_Z; 828 default: 829 throw tcu::InternalError("Can't map cube face"); 830 } 831 } 832 833 tcu::CubeFace getCubeFaceFromGL (deUint32 face) 834 { 835 switch (face) 836 { 837 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: return tcu::CUBEFACE_NEGATIVE_X; 838 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: return tcu::CUBEFACE_POSITIVE_X; 839 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: return tcu::CUBEFACE_NEGATIVE_Y; 840 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: return tcu::CUBEFACE_POSITIVE_Y; 841 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return tcu::CUBEFACE_NEGATIVE_Z; 842 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: return tcu::CUBEFACE_POSITIVE_Z; 843 default: 844 throw tcu::InternalError("Can't map cube face"); 845 } 846 } 847 848 /*--------------------------------------------------------------------*//*! 849 * \brief Get GLSL sampler type for texture format. 850 * 851 * If no mapping is found, glu::TYPE_LAST is returned. 852 * 853 * \param format Texture format 854 * \return GLSL 1D sampler type for format 855 *//*--------------------------------------------------------------------*/ 856 DataType getSampler1DType (tcu::TextureFormat format) 857 { 858 using tcu::TextureFormat; 859 860 if (format.order == TextureFormat::D || format.order == TextureFormat::DS) 861 return TYPE_SAMPLER_1D; 862 863 if (format.order == TextureFormat::S) 864 return TYPE_LAST; 865 866 switch (tcu::getTextureChannelClass(format.type)) 867 { 868 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 869 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 870 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 871 return glu::TYPE_SAMPLER_1D; 872 873 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 874 return glu::TYPE_INT_SAMPLER_1D; 875 876 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 877 return glu::TYPE_UINT_SAMPLER_1D; 878 879 default: 880 return glu::TYPE_LAST; 881 } 882 } 883 884 /*--------------------------------------------------------------------*//*! 885 * \brief Get GLSL sampler type for texture format. 886 * 887 * If no mapping is found, glu::TYPE_LAST is returned. 888 * 889 * \param format Texture format 890 * \return GLSL 2D sampler type for format 891 *//*--------------------------------------------------------------------*/ 892 DataType getSampler2DType (tcu::TextureFormat format) 893 { 894 using tcu::TextureFormat; 895 896 if (format.order == TextureFormat::D || format.order == TextureFormat::DS) 897 return TYPE_SAMPLER_2D; 898 899 if (format.order == TextureFormat::S) 900 return TYPE_LAST; 901 902 switch (tcu::getTextureChannelClass(format.type)) 903 { 904 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 905 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 906 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 907 return glu::TYPE_SAMPLER_2D; 908 909 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 910 return glu::TYPE_INT_SAMPLER_2D; 911 912 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 913 return glu::TYPE_UINT_SAMPLER_2D; 914 915 default: 916 return glu::TYPE_LAST; 917 } 918 } 919 920 /*--------------------------------------------------------------------*//*! 921 * \brief Get GLSL sampler type for texture format. 922 * 923 * If no mapping is found, glu::TYPE_LAST is returned. 924 * 925 * \param format Texture format 926 * \return GLSL cube map sampler type for format 927 *//*--------------------------------------------------------------------*/ 928 DataType getSamplerCubeType (tcu::TextureFormat format) 929 { 930 using tcu::TextureFormat; 931 932 if (format.order == TextureFormat::D || format.order == TextureFormat::DS) 933 return TYPE_SAMPLER_CUBE; 934 935 if (format.order == TextureFormat::S) 936 return TYPE_LAST; 937 938 switch (tcu::getTextureChannelClass(format.type)) 939 { 940 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 941 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 942 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 943 return glu::TYPE_SAMPLER_CUBE; 944 945 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 946 return glu::TYPE_INT_SAMPLER_CUBE; 947 948 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 949 return glu::TYPE_UINT_SAMPLER_CUBE; 950 951 default: 952 return glu::TYPE_LAST; 953 } 954 } 955 956 /*--------------------------------------------------------------------*//*! 957 * \brief Get GLSL sampler type for texture format. 958 * 959 * If no mapping is found, glu::TYPE_LAST is returned. 960 * 961 * \param format Texture format 962 * \return GLSL 2D array sampler type for format 963 *//*--------------------------------------------------------------------*/ 964 DataType getSampler2DArrayType (tcu::TextureFormat format) 965 { 966 using tcu::TextureFormat; 967 968 if (format.order == TextureFormat::D || format.order == TextureFormat::DS) 969 return TYPE_SAMPLER_2D_ARRAY; 970 971 if (format.order == TextureFormat::S) 972 return TYPE_LAST; 973 974 switch (tcu::getTextureChannelClass(format.type)) 975 { 976 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 977 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 978 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 979 return glu::TYPE_SAMPLER_2D_ARRAY; 980 981 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 982 return glu::TYPE_INT_SAMPLER_2D_ARRAY; 983 984 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 985 return glu::TYPE_UINT_SAMPLER_2D_ARRAY; 986 987 default: 988 return glu::TYPE_LAST; 989 } 990 } 991 992 /*--------------------------------------------------------------------*//*! 993 * \brief Get GLSL sampler type for texture format. 994 * 995 * If no mapping is found, glu::TYPE_LAST is returned. 996 * 997 * \param format Texture format 998 * \return GLSL 3D sampler type for format 999 *//*--------------------------------------------------------------------*/ 1000 DataType getSampler3DType (tcu::TextureFormat format) 1001 { 1002 using tcu::TextureFormat; 1003 1004 if (format.order == TextureFormat::D || format.order == TextureFormat::DS) 1005 return TYPE_SAMPLER_3D; 1006 1007 if (format.order == TextureFormat::S) 1008 return TYPE_LAST; 1009 1010 switch (tcu::getTextureChannelClass(format.type)) 1011 { 1012 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 1013 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 1014 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 1015 return glu::TYPE_SAMPLER_3D; 1016 1017 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 1018 return glu::TYPE_INT_SAMPLER_3D; 1019 1020 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 1021 return glu::TYPE_UINT_SAMPLER_3D; 1022 1023 default: 1024 return glu::TYPE_LAST; 1025 } 1026 } 1027 1028 /*--------------------------------------------------------------------*//*! 1029 * \brief Get GLSL sampler type for texture format. 1030 * 1031 * If no mapping is found, glu::TYPE_LAST is returned. 1032 * 1033 * \param format Texture format 1034 * \return GLSL cube map array sampler type for format 1035 *//*--------------------------------------------------------------------*/ 1036 DataType getSamplerCubeArrayType (tcu::TextureFormat format) 1037 { 1038 using tcu::TextureFormat; 1039 1040 if (format.order == TextureFormat::D || format.order == TextureFormat::DS) 1041 return TYPE_SAMPLER_CUBE_ARRAY; 1042 1043 if (format.order == TextureFormat::S) 1044 return TYPE_LAST; 1045 1046 switch (tcu::getTextureChannelClass(format.type)) 1047 { 1048 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 1049 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 1050 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 1051 return glu::TYPE_SAMPLER_CUBE_ARRAY; 1052 1053 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 1054 return glu::TYPE_INT_SAMPLER_CUBE_ARRAY; 1055 1056 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 1057 return glu::TYPE_UINT_SAMPLER_CUBE_ARRAY; 1058 1059 default: 1060 return glu::TYPE_LAST; 1061 } 1062 } 1063 1064 enum RenderableType 1065 { 1066 RENDERABLE_COLOR = (1<<0), 1067 RENDERABLE_DEPTH = (1<<1), 1068 RENDERABLE_STENCIL = (1<<2) 1069 }; 1070 1071 static deUint32 getRenderableBitsES3 (const ContextInfo& contextInfo, deUint32 internalFormat) 1072 { 1073 switch (internalFormat) 1074 { 1075 // Color-renderable formats 1076 case GL_RGBA32I: 1077 case GL_RGBA32UI: 1078 case GL_RGBA16I: 1079 case GL_RGBA16UI: 1080 case GL_RGBA8: 1081 case GL_RGBA8I: 1082 case GL_RGBA8UI: 1083 case GL_SRGB8_ALPHA8: 1084 case GL_RGB10_A2: 1085 case GL_RGB10_A2UI: 1086 case GL_RGBA4: 1087 case GL_RGB5_A1: 1088 case GL_RGB8: 1089 case GL_RGB565: 1090 case GL_RG32I: 1091 case GL_RG32UI: 1092 case GL_RG16I: 1093 case GL_RG16UI: 1094 case GL_RG8: 1095 case GL_RG8I: 1096 case GL_RG8UI: 1097 case GL_R32I: 1098 case GL_R32UI: 1099 case GL_R16I: 1100 case GL_R16UI: 1101 case GL_R8: 1102 case GL_R8I: 1103 case GL_R8UI: 1104 return RENDERABLE_COLOR; 1105 1106 // GL_EXT_color_buffer_float 1107 case GL_RGBA32F: 1108 case GL_R11F_G11F_B10F: 1109 case GL_RG32F: 1110 case GL_R32F: 1111 if (contextInfo.isExtensionSupported("GL_EXT_color_buffer_float")) 1112 return RENDERABLE_COLOR; 1113 else 1114 return 0; 1115 1116 // GL_EXT_color_buffer_float / GL_EXT_color_buffer_half_float 1117 case GL_RGBA16F: 1118 case GL_RG16F: 1119 case GL_R16F: 1120 if (contextInfo.isExtensionSupported("GL_EXT_color_buffer_float") || 1121 contextInfo.isExtensionSupported("GL_EXT_color_buffer_half_float")) 1122 return RENDERABLE_COLOR; 1123 else 1124 return 0; 1125 1126 // Depth formats 1127 case GL_DEPTH_COMPONENT32F: 1128 case GL_DEPTH_COMPONENT24: 1129 case GL_DEPTH_COMPONENT16: 1130 return RENDERABLE_DEPTH; 1131 1132 // Depth+stencil formats 1133 case GL_DEPTH32F_STENCIL8: 1134 case GL_DEPTH24_STENCIL8: 1135 return RENDERABLE_DEPTH|RENDERABLE_STENCIL; 1136 1137 // Stencil formats 1138 case GL_STENCIL_INDEX8: 1139 return RENDERABLE_STENCIL; 1140 1141 default: 1142 return 0; 1143 } 1144 } 1145 1146 /*--------------------------------------------------------------------*//*! 1147 * \brief Check if sized internal format is color-renderable. 1148 * \note Works currently only on ES3 context. 1149 *//*--------------------------------------------------------------------*/ 1150 bool isSizedFormatColorRenderable (const RenderContext& renderCtx, const ContextInfo& contextInfo, deUint32 sizedFormat) 1151 { 1152 deUint32 renderable = 0; 1153 1154 if (renderCtx.getType().getAPI() == ApiType::es(3,0)) 1155 renderable = getRenderableBitsES3(contextInfo, sizedFormat); 1156 else 1157 throw tcu::InternalError("Context type not supported in query"); 1158 1159 return (renderable & RENDERABLE_COLOR) != 0; 1160 } 1161 1162 const tcu::IVec2 (&getDefaultGatherOffsets (void))[4] 1163 { 1164 static const tcu::IVec2 s_defaultOffsets[4] = 1165 { 1166 tcu::IVec2(0, 1), 1167 tcu::IVec2(1, 1), 1168 tcu::IVec2(1, 0), 1169 tcu::IVec2(0, 0), 1170 }; 1171 return s_defaultOffsets; 1172 } 1173 1174 tcu::PixelBufferAccess getTextureBufferEffectiveRefTexture (TextureBuffer& buffer, int maxTextureBufferSize) 1175 { 1176 DE_ASSERT(maxTextureBufferSize > 0); 1177 1178 const tcu::PixelBufferAccess& fullAccess = buffer.getFullRefTexture(); 1179 1180 return tcu::PixelBufferAccess(fullAccess.getFormat(), 1181 tcu::IVec3(de::min(fullAccess.getWidth(), maxTextureBufferSize), 1, 1), 1182 fullAccess.getPitch(), 1183 fullAccess.getDataPtr()); 1184 } 1185 1186 tcu::ConstPixelBufferAccess getTextureBufferEffectiveRefTexture (const TextureBuffer& buffer, int maxTextureBufferSize) 1187 { 1188 return getTextureBufferEffectiveRefTexture(const_cast<TextureBuffer&>(buffer), maxTextureBufferSize); 1189 } 1190 1191 } // glu 1192