13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Texture utilities. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTextureUtil.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVectorUtil.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMemory.h" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <limits> 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline float sRGBChannelToLinear (float cs) 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (cs <= 0.04045) 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return cs / 12.92f; 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return deFloatPow((cs + 0.055f) / 1.055f, 2.4f); 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 43a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvistatic const deUint32 s_srgb8Lut[256] = 44a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi{ 45a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi#include "tcuSRGB8Lut.inl" 46a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi}; 47a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi 48a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvistatic inline float sRGB8ChannelToLinear (deUint32 cs) 49a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi{ 50a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi DE_ASSERT(cs < 256); 51a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi 52a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi // \note This triggers UB, but in practice it doesn't cause any problems 53a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi return ((const float*)s_srgb8Lut)[cs]; 54a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi} 55a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline float linearChannelToSRGB (float cl) 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (cl <= 0.0f) 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return 0.0f; 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (cl < 0.0031308f) 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return 12.92f*cl; 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (cl < 1.0f) 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return 1.055f*deFloatPow(cl, 0.41666f) - 0.055f; 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return 1.0f; 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//! Convert sRGB to linear colorspace 693c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4 sRGBToLinear (const Vec4& cs) 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return Vec4(sRGBChannelToLinear(cs[0]), 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry sRGBChannelToLinear(cs[1]), 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry sRGBChannelToLinear(cs[2]), 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry cs[3]); 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 77a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika IsojärviVec4 sRGB8ToLinear (const UVec4& cs) 78a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi{ 79a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi return Vec4(sRGB8ChannelToLinear(cs[0]), 80a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi sRGB8ChannelToLinear(cs[1]), 81a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi sRGB8ChannelToLinear(cs[2]), 82a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi 1.0f); 83a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi} 84a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi 85a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika IsojärviVec4 sRGBA8ToLinear (const UVec4& cs) 86a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi{ 87a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi return Vec4(sRGB8ChannelToLinear(cs[0]), 88a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi sRGB8ChannelToLinear(cs[1]), 89a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi sRGB8ChannelToLinear(cs[2]), 90a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi (float)cs[3] / 255.0f); 91a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi} 92a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//! Convert from linear to sRGB colorspace 943c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4 linearToSRGB (const Vec4& cl) 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return Vec4(linearChannelToSRGB(cl[0]), 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry linearChannelToSRGB(cl[1]), 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry linearChannelToSRGB(cl[2]), 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry cl[3]); 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10289a729134d6a1880d2b59426dfe14d615381e314Jarkko Pöyrybool isSRGB (TextureFormat format) 10389a729134d6a1880d2b59426dfe14d615381e314Jarkko Pöyry{ 104725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos // make sure to update this if type table is updated 105725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 21); 106725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos 107725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos return format.order == TextureFormat::sR || 108725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos format.order == TextureFormat::sRG || 109725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos format.order == TextureFormat::sRGB || 110725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos format.order == TextureFormat::sRGBA || 111725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos format.order == TextureFormat::sBGR || 112725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos format.order == TextureFormat::sBGRA; 11389a729134d6a1880d2b59426dfe14d615381e314Jarkko Pöyry} 11489a729134d6a1880d2b59426dfe14d615381e314Jarkko Pöyry 115183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledantcu::Vec4 linearToSRGBIfNeeded (const TextureFormat& format, const tcu::Vec4& color) 116183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan{ 117183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan return isSRGB(format) ? linearToSRGB(color) : color; 118183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan} 119183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan 12041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrybool isCombinedDepthStencilType (TextureFormat::ChannelType type) 12141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{ 12241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // make sure to update this if type table is updated 1235b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38); 12441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 125725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos return type == TextureFormat::UNSIGNED_INT_16_8_8 || 126725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos type == TextureFormat::UNSIGNED_INT_24_8 || 127725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos type == TextureFormat::UNSIGNED_INT_24_8_REV || 12841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry type == TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV; 12941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry} 13041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 13143b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvibool hasStencilComponent (TextureFormat::ChannelOrder order) 13243b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi{ 133725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 21); 13443b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi 13543b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi switch (order) 13643b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi { 13743b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi case TextureFormat::S: 13843b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi case TextureFormat::DS: 13943b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi return true; 14043b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi 14143b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi default: 14243b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi return false; 14343b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi } 14443b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi} 14543b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi 14643b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvibool hasDepthComponent (TextureFormat::ChannelOrder order) 14743b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi{ 148725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 21); 14943b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi 15043b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi switch (order) 15143b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi { 15243b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi case TextureFormat::D: 15343b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi case TextureFormat::DS: 15443b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi return true; 15543b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi 15643b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi default: 15743b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi return false; 15843b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi } 15943b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi} 16043b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//! Get texture channel class for format 1623c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureChannelClass getTextureChannelClass (TextureFormat::ChannelType channelType) 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 16407104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry // make sure this table is updated if format table is updated 1655b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38); 16607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (channelType) 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SNORM_INT8: return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT; 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SNORM_INT16: return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT; 17107104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::SNORM_INT32: return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT; 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT8: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT16: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 17407104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::UNORM_INT24: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 17507104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::UNORM_INT32: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 176725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNORM_BYTE_44: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_565: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_555: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_4444: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_5551: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 1815b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos case TextureFormat::UNORM_SHORT_1555: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 182725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_BYTE_44: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 183725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_SHORT_565: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 184725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_SHORT_4444: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 185725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_SHORT_5551: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT_101010: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 187725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::SNORM_INT_1010102_REV: return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT; 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT_1010102_REV: return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 189725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::SIGNED_INT_1010102_REV: return TEXTURECHANNELCLASS_SIGNED_INTEGER; 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT_1010102_REV: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV: return TEXTURECHANNELCLASS_FLOATING_POINT; 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT_999_E5_REV: return TEXTURECHANNELCLASS_FLOATING_POINT; 193725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_INT_16_8_8: return TEXTURECHANNELCLASS_LAST; //!< packed unorm16-x8-uint8 19407104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::UNSIGNED_INT_24_8: return TEXTURECHANNELCLASS_LAST; //!< packed unorm24-uint8 195725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_INT_24_8_REV: return TEXTURECHANNELCLASS_LAST; //!< packed unorm24-uint8 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SIGNED_INT8: return TEXTURECHANNELCLASS_SIGNED_INTEGER; 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SIGNED_INT16: return TEXTURECHANNELCLASS_SIGNED_INTEGER; 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SIGNED_INT32: return TEXTURECHANNELCLASS_SIGNED_INTEGER; 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT8: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT16: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 201db6ba452c1213fd1c2b03369fdf4c1d23f07cfadJarkko Pöyry case TextureFormat::UNSIGNED_INT24: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT32: return TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::HALF_FLOAT: return TEXTURECHANNELCLASS_FLOATING_POINT; 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::FLOAT: return TEXTURECHANNELCLASS_FLOATING_POINT; 2055b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos case TextureFormat::FLOAT64: return TEXTURECHANNELCLASS_FLOATING_POINT; 20607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV: return TEXTURECHANNELCLASS_LAST; //!< packed float32-pad24-uint8 2075b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos default: 2085b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos DE_FATAL("Unknown channel type"); 2095b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos return TEXTURECHANNELCLASS_LAST; 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 21325977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulosbool isAccessValid (TextureFormat format, TextureAccessType type) 21425977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos{ 21525977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos DE_ASSERT(isValid(format)); 21625977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos 21725977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos if (format.order == TextureFormat::DS) 21825977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos { 21925977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos // It is never allowed to access combined depth-stencil format with getPixel(). 22025977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos // Instead either getPixDepth() or getPixStencil(), or effective depth- or stencil- 22125977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos // access must be used. 22225977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos return false; 22325977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos } 22425977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos else if (format.order == TextureFormat::D) 22525977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos return type == TEXTUREACCESSTYPE_FLOAT; 22625977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos else if (format.order == TextureFormat::S) 22725977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos return type == TEXTUREACCESSTYPE_UNSIGNED_INT; 22825977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos else 22925977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos { 23025977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos // A few packed color formats have access type restrictions 23125977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos if (format.type == TextureFormat::UNSIGNED_INT_11F_11F_10F_REV || 23225977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos format.type == TextureFormat::UNSIGNED_INT_999_E5_REV) 23325977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos return type == TEXTUREACCESSTYPE_FLOAT; 23425977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos else 23525977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos return true; 23625977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos } 23725977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos} 23825977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*! 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get access to subregion of pixel buffer 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access Parent access object 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param x X offset 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param y Y offset 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param z Z offset 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param width Width 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param height Height 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param depth Depth 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Access object that targets given subregion of parent access object 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 2503c827367444ee418f129b2c238299f49d3264554Jarkko PoyryConstPixelBufferAccess getSubregion (const ConstPixelBufferAccess& access, int x, int y, int z, int width, int height, int depth) 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 252becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inBounds(x, 0, access.getWidth())); 253becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inRange(x+width, x+1, access.getWidth())); 254becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi 255becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inBounds(y, 0, access.getHeight())); 256becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inRange(y+height, y+1, access.getHeight())); 257becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi 258becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inBounds(z, 0, access.getDepth())); 259becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inRange(z+depth, z+1, access.getDepth())); 260becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi 2616c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry return ConstPixelBufferAccess(access.getFormat(), tcu::IVec3(width, height, depth), access.getPitch(), 2626c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry (const deUint8*)access.getDataPtr() + access.getPixelPitch()*x + access.getRowPitch()*y + access.getSlicePitch()*z); 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*! 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get access to subregion of pixel buffer 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access Parent access object 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param x X offset 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param y Y offset 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param z Z offset 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param width Width 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param height Height 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param depth Depth 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Access object that targets given subregion of parent access object 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 2763c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPixelBufferAccess getSubregion (const PixelBufferAccess& access, int x, int y, int z, int width, int height, int depth) 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 278becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inBounds(x, 0, access.getWidth())); 279becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inRange(x+width, x+1, access.getWidth())); 280becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi 281becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inBounds(y, 0, access.getHeight())); 282becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inRange(y+height, y+1, access.getHeight())); 283becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi 284becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inBounds(z, 0, access.getDepth())); 285becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi DE_ASSERT(de::inRange(z+depth, z+1, access.getDepth())); 286becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi 2876c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry return PixelBufferAccess(access.getFormat(), tcu::IVec3(width, height, depth), access.getPitch(), 2886c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry (deUint8*)access.getDataPtr() + access.getPixelPitch()*x + access.getRowPitch()*y + access.getSlicePitch()*z); 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*! 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get access to subregion of pixel buffer 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access Parent access object 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param x X offset 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param y Y offset 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param width Width 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param height Height 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Access object that targets given subregion of parent access object 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 3003c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPixelBufferAccess getSubregion (const PixelBufferAccess& access, int x, int y, int width, int height) 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return getSubregion(access, x, y, 0, width, height, 1); 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*! 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get access to subregion of pixel buffer 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access Parent access object 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param x X offset 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param y Y offset 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param width Width 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param height Height 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Access object that targets given subregion of parent access object 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 3143c827367444ee418f129b2c238299f49d3264554Jarkko PoyryConstPixelBufferAccess getSubregion (const ConstPixelBufferAccess& access, int x, int y, int width, int height) 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return getSubregion(access, x, y, 0, width, height, 1); 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*! 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Flip rows in Y direction 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access Access object 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Modified access object where Y coordinates are reversed 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 3243c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPixelBufferAccess flipYAccess (const PixelBufferAccess& access) 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3266c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int rowPitch = access.getRowPitch(); 3276c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int offsetToLast = rowPitch*(access.getHeight()-1); 3286c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const tcu::IVec3 pitch (access.getPixelPitch(), -rowPitch, access.getSlicePitch()); 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3306c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry return PixelBufferAccess(access.getFormat(), access.getSize(), pitch, (deUint8*)access.getDataPtr() + offsetToLast); 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*! 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Flip rows in Y direction 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access Access object 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Modified access object where Y coordinates are reversed 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 3383c827367444ee418f129b2c238299f49d3264554Jarkko PoyryConstPixelBufferAccess flipYAccess (const ConstPixelBufferAccess& access) 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3406c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int rowPitch = access.getRowPitch(); 3416c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int offsetToLast = rowPitch*(access.getHeight()-1); 3426c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const tcu::IVec3 pitch (access.getPixelPitch(), -rowPitch, access.getSlicePitch()); 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3446c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry return ConstPixelBufferAccess(access.getFormat(), access.getSize(), pitch, (deUint8*)access.getDataPtr() + offsetToLast); 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3474356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvistatic Vec2 getFloatChannelValueRange (TextureFormat::ChannelType channelType) 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 34907104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry // make sure this table is updated if format table is updated 3505b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38); 35107104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float cMin = 0.0f; 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float cMax = 0.0f; 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (channelType) 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Signed normalized formats. 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SNORM_INT8: 35907104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::SNORM_INT16: 360725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::SNORM_INT32: 361725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::SNORM_INT_1010102_REV: cMin = -1.0f; cMax = 1.0f; break; 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Unsigned normalized formats. 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT8: 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT16: 36607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::UNORM_INT24: 36707104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::UNORM_INT32: 368725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNORM_BYTE_44: 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_565: 370725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNORM_SHORT_555: 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_4444: 372725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNORM_SHORT_5551: 3735b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos case TextureFormat::UNORM_SHORT_1555: 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT_101010: 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT_1010102_REV: cMin = 0.0f; cMax = 1.0f; break; 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Misc formats. 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SIGNED_INT8: cMin = -128.0f; cMax = 127.0f; break; 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SIGNED_INT16: cMin = -32768.0f; cMax = 32767.0f; break; 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SIGNED_INT32: cMin = -2147483648.0f; cMax = 2147483647.0f; break; 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT8: cMin = 0.0f; cMax = 255.0f; break; 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT16: cMin = 0.0f; cMax = 65535.0f; break; 383db6ba452c1213fd1c2b03369fdf4c1d23f07cfadJarkko Pöyry case TextureFormat::UNSIGNED_INT24: cMin = 0.0f; cMax = 16777215.0f; break; 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT32: cMin = 0.0f; cMax = 4294967295.f; break; 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::HALF_FLOAT: cMin = -1e3f; cMax = 1e3f; break; 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::FLOAT: cMin = -1e5f; cMax = 1e5f; break; 387725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::FLOAT64: cMin = -1e5f; cMax = 1e5f; break; 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV: cMin = 0.0f; cMax = 1e4f; break; 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT_999_E5_REV: cMin = 0.0f; cMax = 1e5f; break; 3905b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos case TextureFormat::UNSIGNED_BYTE_44: cMin = 0.0f; cMax = 15.f; break; 3915b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos case TextureFormat::UNSIGNED_SHORT_4444: cMin = 0.0f; cMax = 15.f; break; 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(false); 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return Vec2(cMin, cMax); 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*! 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get standard parameters for testing texture format 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Returns TextureFormatInfo that describes good parameters for exercising 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * given TextureFormat. Parameters include value ranges per channel and 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * suitable lookup scaling and bias in order to reduce result back to 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 0..1 range. 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 4083c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureFormatInfo getTextureFormatInfo (const TextureFormat& format) 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Special cases. 4115b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos if (format.type == TextureFormat::UNSIGNED_INT_1010102_REV) 4125b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos return TextureFormatInfo(Vec4( 0.0f, 0.0f, 0.0f, 0.0f), 4135b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4( 1023.0f, 1023.0f, 1023.0f, 3.0f), 4145b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4(1.0f/1023.f, 1.0f/1023.0f, 1.0f/1023.0f, 1.0f/3.0f), 4155b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4( 0.0f, 0.0f, 0.0f, 0.0f)); 4165b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos if (format.type == TextureFormat::SIGNED_INT_1010102_REV) 4175b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos return TextureFormatInfo(Vec4( -512.0f, -512.0f, -512.0f, -2.0f), 4185b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4( 511.0f, 511.0f, 511.0f, 1.0f), 4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4(1.0f/1023.f, 1.0f/1023.0f, 1.0f/1023.0f, 1.0f/3.0f), 4205b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4( 0.5f, 0.5f, 0.5f, 0.5f)); 4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (format.order == TextureFormat::D || format.order == TextureFormat::DS) 4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return TextureFormatInfo(Vec4(0.0f, 0.0f, 0.0f, 0.0f), 4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4(1.0f, 1.0f, 1.0f, 0.0f), 4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4(1.0f, 1.0f, 1.0f, 1.0f), 4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4(0.0f, 0.0f, 0.0f, 0.0f)); // Depth / stencil formats. 4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (format == TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_5551)) 4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return TextureFormatInfo(Vec4(0.0f, 0.0f, 0.0f, 0.5f), 4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4(1.0f, 1.0f, 1.0f, 1.5f), 4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4(1.0f, 1.0f, 1.0f, 1.0f), 4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4(0.0f, 0.0f, 0.0f, 0.0f)); 4315b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos else if (format.type == TextureFormat::UNSIGNED_SHORT_5551) 4325b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos return TextureFormatInfo(Vec4( 0.0f, 0.0f, 0.0f, 0.0f), 4335b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4( 31.0f, 31.0f, 31.0f, 1.0f), 4345b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4(1.0f/31.f, 1.0f/31.0f, 1.0f/31.0f, 1.0f), 4355b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4( 0.0f, 0.0f, 0.0f, 0.0f)); 4365b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos else if (format.type == TextureFormat::UNSIGNED_SHORT_565) 4375b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos return TextureFormatInfo(Vec4( 0.0f, 0.0f, 0.0f, 0.0f), 4385b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4( 31.0f, 63.0f, 31.0f, 0.0f), 4395b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4(1.0f/31.f, 1.0f/63.0f, 1.0f/31.0f, 1.0f), 4405b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos Vec4( 0.0f, 0.0f, 0.0f, 0.0f)); 4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4424356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi const Vec2 cRange = getFloatChannelValueRange(format.type); 4436d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const TextureSwizzle::Channel* map = getChannelReadSwizzle(format.order).components; 4446d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const BVec4 chnMask = BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 4456d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 4466d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 4476d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE); 4486d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const float scale = 1.0f / (cRange[1] - cRange[0]); 4496d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const float bias = -cRange[0] * scale; 4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return TextureFormatInfo(select(cRange[0], 0.0f, chnMask), 4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry select(cRange[1], 0.0f, chnMask), 4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry select(scale, 1.0f, chnMask), 4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry select(bias, 0.0f, chnMask)); 4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4574356bb5b4e9a1559ecea41265ee242d37aacaa38Mika IsojärviIVec4 getFormatMinIntValue (const TextureFormat& format) 4584356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi{ 4594356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi DE_ASSERT(getTextureChannelClass(format.type) == TEXTURECHANNELCLASS_SIGNED_INTEGER); 4604356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 4614356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi switch (format.type) 4624356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi { 4636a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::SIGNED_INT8: return IVec4(std::numeric_limits<deInt8>::min()); 4646a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::SIGNED_INT16: return IVec4(std::numeric_limits<deInt16>::min()); 4656a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::SIGNED_INT32: return IVec4(std::numeric_limits<deInt32>::min()); 4664356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 4674356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi default: 4684356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi DE_FATAL("Invalid channel type"); 4694356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi return IVec4(0); 4704356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi } 4714356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi} 4724356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 4734356bb5b4e9a1559ecea41265ee242d37aacaa38Mika IsojärviIVec4 getFormatMaxIntValue (const TextureFormat& format) 4744356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi{ 4754356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi DE_ASSERT(getTextureChannelClass(format.type) == TEXTURECHANNELCLASS_SIGNED_INTEGER); 4764356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 477e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket if (format == TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT_1010102_REV) || 478e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket format == TextureFormat(TextureFormat::BGRA, TextureFormat::SIGNED_INT_1010102_REV)) 479e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket return IVec4(511, 511, 511, 1); 480e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket 4814356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi switch (format.type) 4824356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi { 4836a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::SIGNED_INT8: return IVec4(std::numeric_limits<deInt8>::max()); 4846a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::SIGNED_INT16: return IVec4(std::numeric_limits<deInt16>::max()); 4856a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::SIGNED_INT32: return IVec4(std::numeric_limits<deInt32>::max()); 4864356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 4874356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi default: 4884356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi DE_FATAL("Invalid channel type"); 4894356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi return IVec4(0); 4904356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi } 4914356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi} 4924356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 4934356bb5b4e9a1559ecea41265ee242d37aacaa38Mika IsojärviUVec4 getFormatMaxUintValue (const TextureFormat& format) 4944356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi{ 4954356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi DE_ASSERT(getTextureChannelClass(format.type) == TEXTURECHANNELCLASS_UNSIGNED_INTEGER); 4964356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 497e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket if (format == TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT_1010102_REV) || 498e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket format == TextureFormat(TextureFormat::BGRA, TextureFormat::UNSIGNED_INT_1010102_REV)) 4994356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi return UVec4(1023u, 1023u, 1023u, 3u); 5004356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 5014356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi switch (format.type) 5024356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi { 5036a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::UNSIGNED_INT8: return UVec4(std::numeric_limits<deUint8>::max()); 5046a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::UNSIGNED_INT16: return UVec4(std::numeric_limits<deUint16>::max()); 5056a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::UNSIGNED_INT24: return UVec4(0xffffffu); 5066a6286cee0349735c45cf883478570f8b273025fPyry Haulos case TextureFormat::UNSIGNED_INT32: return UVec4(std::numeric_limits<deUint32>::max()); 5074356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 5084356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi default: 5094356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi DE_FATAL("Invalid channel type"); 5104356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi return UVec4(0); 5114356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi } 5124356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi} 5134356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi 5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic IVec4 getChannelBitDepth (TextureFormat::ChannelType channelType) 5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 51607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry // make sure this table is updated if format table is updated 5175b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38); 51807104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry 5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (channelType) 5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SNORM_INT8: return IVec4(8); 5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SNORM_INT16: return IVec4(16); 5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SNORM_INT32: return IVec4(32); 5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT8: return IVec4(8); 5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT16: return IVec4(16); 52607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::UNORM_INT24: return IVec4(24); 5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT32: return IVec4(32); 528725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNORM_BYTE_44: return IVec4(4,4,0,0); 5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_565: return IVec4(5,6,5,0); 5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_4444: return IVec4(4); 5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_555: return IVec4(5,5,5,0); 5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_SHORT_5551: return IVec4(5,5,5,1); 5335b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos case TextureFormat::UNORM_SHORT_1555: return IVec4(1,5,5,5); 534725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_BYTE_44: return IVec4(4,4,0,0); 535725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_SHORT_565: return IVec4(5,6,5,0); 536725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_SHORT_4444: return IVec4(4); 537725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_SHORT_5551: return IVec4(5,5,5,1); 5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT_101010: return IVec4(10,10,10,0); 539725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::SNORM_INT_1010102_REV: return IVec4(10,10,10,2); 5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNORM_INT_1010102_REV: return IVec4(10,10,10,2); 5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SIGNED_INT8: return IVec4(8); 5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SIGNED_INT16: return IVec4(16); 5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::SIGNED_INT32: return IVec4(32); 5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT8: return IVec4(8); 5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT16: return IVec4(16); 546db6ba452c1213fd1c2b03369fdf4c1d23f07cfadJarkko Pöyry case TextureFormat::UNSIGNED_INT24: return IVec4(24); 5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT32: return IVec4(32); 548725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::SIGNED_INT_1010102_REV: return IVec4(10,10,10,2); 5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT_1010102_REV: return IVec4(10,10,10,2); 550725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_INT_16_8_8: return IVec4(16,8,0,0); 551ed7aa26e96ce420ea1d269ed45c62ed65f8c6bd4Jarkko Pöyry case TextureFormat::UNSIGNED_INT_24_8: return IVec4(24,8,0,0); 552725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_INT_24_8_REV: return IVec4(24,8,0,0); 5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::HALF_FLOAT: return IVec4(16); 5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::FLOAT: return IVec4(32); 555725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::FLOAT64: return IVec4(64); 5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV: return IVec4(11,11,10,0); 5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TextureFormat::UNSIGNED_INT_999_E5_REV: return IVec4(9,9,9,0); 558ed7aa26e96ce420ea1d269ed45c62ed65f8c6bd4Jarkko Pöyry case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV: return IVec4(32,8,0,0); 5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(false); 5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return IVec4(0); 5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5653c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIVec4 getTextureFormatBitDepth (const TextureFormat& format) 5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 5676d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const IVec4 chnBits = getChannelBitDepth(format.type); 5686d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const TextureSwizzle::Channel* map = getChannelReadSwizzle(format.order).components; 5696d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const BVec4 chnMask = BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 5706d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 5716d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 5726d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE); 5736d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const IVec4 chnSwz = IVec4((chnMask[0]) ? ((int)map[0]) : (0), 5746d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry (chnMask[1]) ? ((int)map[1]) : (0), 5756d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry (chnMask[2]) ? ((int)map[2]) : (0), 5766d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry (chnMask[3]) ? ((int)map[3]) : (0)); 577ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 578ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return select(chnBits.swizzle(chnSwz.x(), chnSwz.y(), chnSwz.z(), chnSwz.w()), IVec4(0), chnMask); 579ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry} 580ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 581ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyrystatic IVec4 getChannelMantissaBitDepth (TextureFormat::ChannelType channelType) 582ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry{ 58307104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry // make sure this table is updated if format table is updated 5845b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38); 58507104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry 586ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry switch (channelType) 587ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry { 588ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::SNORM_INT8: 589ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::SNORM_INT16: 590ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::SNORM_INT32: 591ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNORM_INT8: 592ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNORM_INT16: 59307104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry case TextureFormat::UNORM_INT24: 594ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNORM_INT32: 595725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNORM_BYTE_44: 596ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNORM_SHORT_565: 597ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNORM_SHORT_4444: 598ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNORM_SHORT_555: 599ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNORM_SHORT_5551: 6005b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos case TextureFormat::UNORM_SHORT_1555: 601725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_BYTE_44: 602725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_SHORT_565: 603725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_SHORT_4444: 604725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_SHORT_5551: 605ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNORM_INT_101010: 606725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::SNORM_INT_1010102_REV: 607ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNORM_INT_1010102_REV: 608ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::SIGNED_INT8: 609ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::SIGNED_INT16: 610ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::SIGNED_INT32: 611ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNSIGNED_INT8: 612ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNSIGNED_INT16: 613db6ba452c1213fd1c2b03369fdf4c1d23f07cfadJarkko Pöyry case TextureFormat::UNSIGNED_INT24: 614ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNSIGNED_INT32: 615725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::SIGNED_INT_1010102_REV: 616ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNSIGNED_INT_1010102_REV: 617725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_INT_16_8_8: 618ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNSIGNED_INT_24_8: 619725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_INT_24_8_REV: 620ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNSIGNED_INT_999_E5_REV: 621ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return getChannelBitDepth(channelType); 622ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 623ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::HALF_FLOAT: return IVec4(10); 624ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::FLOAT: return IVec4(23); 625725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::FLOAT64: return IVec4(52); 626ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV: return IVec4(6,6,5,0); 627ed7aa26e96ce420ea1d269ed45c62ed65f8c6bd4Jarkko Pöyry case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV: return IVec4(23,8,0,0); 628ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry default: 629ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry DE_ASSERT(false); 630ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry return IVec4(0); 631ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry } 632ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry} 633ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry 634ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko PöyryIVec4 getTextureFormatMantissaBitDepth (const TextureFormat& format) 635ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry{ 6366d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const IVec4 chnBits = getChannelMantissaBitDepth(format.type); 6376d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const TextureSwizzle::Channel* map = getChannelReadSwizzle(format.order).components; 6386d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const BVec4 chnMask = BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 6396d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 6406d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 6416d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE); 6426d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry const IVec4 chnSwz = IVec4((chnMask[0]) ? ((int)map[0]) : (0), 6436d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry (chnMask[1]) ? ((int)map[1]) : (0), 6446d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry (chnMask[2]) ? ((int)map[2]) : (0), 6456d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry (chnMask[3]) ? ((int)map[3]) : (0)); 6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return select(chnBits.swizzle(chnSwz.x(), chnSwz.y(), chnSwz.z(), chnSwz.w()), IVec4(0), chnMask); 6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 65066ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko PöyryBVec4 getTextureFormatChannelMask (const TextureFormat& format) 65166ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry{ 65266ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry const TextureSwizzle::Channel* const map = getChannelReadSwizzle(format.order).components; 65366ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry return BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 65466ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 65566ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE, 65666ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE); 65766ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry} 65866ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry 6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline float linearInterpolate (float t, float minVal, float maxVal) 6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return minVal + (maxVal - minVal) * t; 6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline Vec4 linearInterpolate (float t, const Vec4& a, const Vec4& b) 6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return a + (b - a) * t; 6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum 6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CLEAR_OPTIMIZE_THRESHOLD = 128, 6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CLEAR_OPTIMIZE_MAX_PIXEL_SIZE = 8 6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline void fillRow (const PixelBufferAccess& dst, int y, int z, int pixelSize, const deUint8* pixel) 6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 67771d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry DE_ASSERT(dst.getPixelPitch() == pixelSize); // only tightly packed 67871d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry 67971d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry deUint8* dstPtr = (deUint8*)dst.getPixelPtr(0, y, z); 6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int width = dst.getWidth(); 6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 68271d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry if (pixelSize == 8 && deIsAlignedPtr(dstPtr, pixelSize)) 6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint64 val; 6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry memcpy(&val, pixel, sizeof(val)); 6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < width; i++) 6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ((deUint64*)dstPtr)[i] = val; 6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 69071d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry else if (pixelSize == 4 && deIsAlignedPtr(dstPtr, pixelSize)) 6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 val; 6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry memcpy(&val, pixel, sizeof(val)); 6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < width; i++) 6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ((deUint32*)dstPtr)[i] = val; 6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < width; i++) 7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int j = 0; j < pixelSize; j++) 7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry dstPtr[i*pixelSize+j] = pixel[j]; 7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clear (const PixelBufferAccess& access, const Vec4& color) 7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 7086c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int pixelSize = access.getFormat().getPixelSize(); 7096c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int pixelPitch = access.getPixelPitch(); 7106c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const bool rowPixelsTightlyPacked = (pixelSize == pixelPitch); 7116c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry 7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (access.getWidth()*access.getHeight()*access.getDepth() >= CLEAR_OPTIMIZE_THRESHOLD && 7136c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry pixelSize < CLEAR_OPTIMIZE_MAX_PIXEL_SIZE && rowPixelsTightlyPacked) 7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Convert to destination format. 7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry union 7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8 u8[CLEAR_OPTIMIZE_MAX_PIXEL_SIZE]; 7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint64 u64; // Forces 64-bit alignment. 7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } pixel; 7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_STATIC_ASSERT(sizeof(pixel) == CLEAR_OPTIMIZE_MAX_PIXEL_SIZE); 7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry PixelBufferAccess(access.getFormat(), 1, 1, 1, 0, 0, &pixel.u8[0]).setPixel(color, 0, 0); 7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < access.getDepth(); z++) 7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < access.getHeight(); y++) 7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry fillRow(access, y, z, pixelSize, &pixel.u8[0]); 7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < access.getDepth(); z++) 7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < access.getHeight(); y++) 7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < access.getWidth(); x++) 7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(color, x, y, z); 7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clear (const PixelBufferAccess& access, const IVec4& color) 7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 7396c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int pixelSize = access.getFormat().getPixelSize(); 7406c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int pixelPitch = access.getPixelPitch(); 7416c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const bool rowPixelsTightlyPacked = (pixelSize == pixelPitch); 7426c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry 7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (access.getWidth()*access.getHeight()*access.getDepth() >= CLEAR_OPTIMIZE_THRESHOLD && 7446c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry pixelSize < CLEAR_OPTIMIZE_MAX_PIXEL_SIZE && rowPixelsTightlyPacked) 7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Convert to destination format. 7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry union 7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8 u8[CLEAR_OPTIMIZE_MAX_PIXEL_SIZE]; 7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint64 u64; // Forces 64-bit alignment. 7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } pixel; 7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_STATIC_ASSERT(sizeof(pixel) == CLEAR_OPTIMIZE_MAX_PIXEL_SIZE); 7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry PixelBufferAccess(access.getFormat(), 1, 1, 1, 0, 0, &pixel.u8[0]).setPixel(color, 0, 0); 7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < access.getDepth(); z++) 7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < access.getHeight(); y++) 7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry fillRow(access, y, z, pixelSize, &pixel.u8[0]); 7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < access.getDepth(); z++) 7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < access.getHeight(); y++) 7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < access.getWidth(); x++) 7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(color, x, y, z); 7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 768cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvivoid clear (const PixelBufferAccess& access, const UVec4& color) 769cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvi{ 770cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvi clear(access, color.cast<deInt32>()); 771cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvi} 772cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvi 7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clearDepth (const PixelBufferAccess& access, float depth) 7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 77571d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry DE_ASSERT(access.getFormat().order == TextureFormat::DS || access.getFormat().order == TextureFormat::D); 7766c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry 77771d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry clear(getEffectiveDepthStencilAccess(access, Sampler::MODE_DEPTH), tcu::Vec4(depth, 0.0f, 0.0f, 0.0f)); 7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clearStencil (const PixelBufferAccess& access, int stencil) 7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 78271d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry DE_ASSERT(access.getFormat().order == TextureFormat::DS || access.getFormat().order == TextureFormat::S); 7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 78471d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry clear(getEffectiveDepthStencilAccess(access, Sampler::MODE_STENCIL), tcu::UVec4(stencil, 0u, 0u, 0u)); 7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void fillWithComponentGradients1D (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal) 7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(access.getHeight() == 1); 7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < access.getWidth(); x++) 7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 792222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry float s = ((float)x + 0.5f) / (float)access.getWidth(); 7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 794222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry float r = linearInterpolate(s, minVal.x(), maxVal.x()); 7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float g = linearInterpolate(s, minVal.y(), maxVal.y()); 7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float b = linearInterpolate(s, minVal.z(), maxVal.z()); 7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float a = linearInterpolate(s, minVal.w(), maxVal.w()); 7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(tcu::Vec4(r, g, b, a), x, 0); 8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void fillWithComponentGradients2D (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal) 8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < access.getHeight(); y++) 8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < access.getWidth(); x++) 8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 809222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry float s = ((float)x + 0.5f) / (float)access.getWidth(); 810222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry float t = ((float)y + 0.5f) / (float)access.getHeight(); 8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 812222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry float r = linearInterpolate(( s + t) *0.5f, minVal.x(), maxVal.x()); 8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float g = linearInterpolate(( s + (1.0f-t))*0.5f, minVal.y(), maxVal.y()); 8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float b = linearInterpolate(((1.0f-s) + t) *0.5f, minVal.z(), maxVal.z()); 8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float a = linearInterpolate(((1.0f-s) + (1.0f-t))*0.5f, minVal.w(), maxVal.w()); 8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(tcu::Vec4(r, g, b, a), x, y); 8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void fillWithComponentGradients3D (const PixelBufferAccess& dst, const Vec4& minVal, const Vec4& maxVal) 8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < dst.getDepth(); z++) 8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < dst.getHeight(); y++) 8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < dst.getWidth(); x++) 8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float s = ((float)x + 0.5f) / (float)dst.getWidth(); 8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float t = ((float)y + 0.5f) / (float)dst.getHeight(); 8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float p = ((float)z + 0.5f) / (float)dst.getDepth(); 8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float r = linearInterpolate(s, minVal.x(), maxVal.x()); 8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float g = linearInterpolate(t, minVal.y(), maxVal.y()); 8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float b = linearInterpolate(p, minVal.z(), maxVal.z()); 8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float a = linearInterpolate(1.0f - (s+t+p)/3.0f, minVal.w(), maxVal.w()); 8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry dst.setPixel(tcu::Vec4(r, g, b, a), x, y, z); 8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithComponentGradients (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal) 8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8475a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (isCombinedDepthStencilType(access.getFormat().type)) 8485a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry { 8495a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry const bool hasDepth = access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::D; 8505a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry const bool hasStencil = access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::S; 8515a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry 8525a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry DE_ASSERT(hasDepth || hasStencil); 8535a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry 8545a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry // For combined formats, treat D and S as separate channels 8555a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (hasDepth) 8565a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry fillWithComponentGradients(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_DEPTH), minVal, maxVal); 8575a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (hasStencil) 8585a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry fillWithComponentGradients(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_STENCIL), minVal.swizzle(3,2,1,0), maxVal.swizzle(3,2,1,0)); 8595a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry } 8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 8615a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry { 8625a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (access.getHeight() == 1 && access.getDepth() == 1) 8635a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry fillWithComponentGradients1D(access, minVal, maxVal); 8645a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry else if (access.getDepth() == 1) 8655a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry fillWithComponentGradients2D(access, minVal, maxVal); 8665a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry else 8675a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry fillWithComponentGradients3D(access, minVal, maxVal); 8685a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry } 8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8715a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyrystatic void fillWithGrid1D (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB) 8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < access.getWidth(); x++) 8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int mx = (x / cellSize) % 2; 8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (mx) 8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(colorB, x, 0); 8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(colorA, x, 0); 8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8845a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyrystatic void fillWithGrid2D (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB) 8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < access.getHeight(); y++) 8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < access.getWidth(); x++) 8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int mx = (x / cellSize) % 2; 8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int my = (y / cellSize) % 2; 8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (mx ^ my) 8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(colorB, x, y); 8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(colorA, x, y); 8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9015a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyrystatic void fillWithGrid3D (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB) 9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < access.getDepth(); z++) 9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < access.getHeight(); y++) 9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < access.getWidth(); x++) 9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int mx = (x / cellSize) % 2; 9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int my = (y / cellSize) % 2; 9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int mz = (z / cellSize) % 2; 9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (mx ^ my ^ mz) 9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(colorB, x, y, z); 9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(colorA, x, y, z); 9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithGrid (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB) 9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 9245a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (isCombinedDepthStencilType(access.getFormat().type)) 9255a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry { 9265a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry const bool hasDepth = access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::D; 9275a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry const bool hasStencil = access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::S; 9285a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry 9295a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry DE_ASSERT(hasDepth || hasStencil); 9305a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry 9315a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry // For combined formats, treat D and S as separate channels 9325a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (hasDepth) 933c66f849e3e6079cf960252bf1fd1dc86a45a36c3Mika Isojärvi fillWithGrid(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_DEPTH), cellSize, colorA, colorB); 9345a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (hasStencil) 935c66f849e3e6079cf960252bf1fd1dc86a45a36c3Mika Isojärvi fillWithGrid(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_STENCIL), cellSize, colorA.swizzle(3,2,1,0), colorB.swizzle(3,2,1,0)); 9365a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry } 9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 9385a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry { 9395a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (access.getHeight() == 1 && access.getDepth() == 1) 9405a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry fillWithGrid1D(access, cellSize, colorA, colorB); 9415a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry else if (access.getDepth() == 1) 9425a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry fillWithGrid2D(access, cellSize, colorA, colorB); 9435a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry else 9445a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry fillWithGrid3D(access, cellSize, colorA, colorB); 9455a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry } 9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithRepeatableGradient (const PixelBufferAccess& access, const Vec4& colorA, const Vec4& colorB) 9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < access.getHeight(); y++) 9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < access.getWidth(); x++) 9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float s = ((float)x + 0.5f) / (float)access.getWidth(); 9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float t = ((float)y + 0.5f) / (float)access.getHeight(); 9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float a = s > 0.5f ? (2.0f - 2.0f*s) : 2.0f*s; 9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float b = t > 0.5f ? (2.0f - 2.0f*t) : 2.0f*t; 9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float p = deFloatClamp(deFloatSqrt(a*a + b*b), 0.0f, 1.0f); 9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.setPixel(linearInterpolate(p, colorA, colorB), x, y); 9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithRGBAQuads (const PixelBufferAccess& dst) 9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK_INTERNAL(dst.getDepth() == 1); 9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int width = dst.getWidth(); 9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int height = dst.getHeight(); 9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int left = width/2; 9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int top = height/2; 9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry clear(getSubregion(dst, 0, 0, 0, left, top, 1), Vec4(1.0f, 0.0f, 0.0f, 1.0f)); 9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry clear(getSubregion(dst, left, 0, 0, width-left, top, 1), Vec4(0.0f, 1.0f, 0.0f, 1.0f)); 9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry clear(getSubregion(dst, 0, top, 0, left, height-top, 1), Vec4(0.0f, 0.0f, 1.0f, 0.0f)); 9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry clear(getSubregion(dst, left, top, 0, width-left, height-top, 1), Vec4(0.5f, 0.5f, 0.5f, 1.0f)); 9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// \todo [2012-11-13 pyry] There is much better metaballs code in CL SIR value generators. 9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithMetaballs (const PixelBufferAccess& dst, int numBalls, deUint32 seed) 9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK_INTERNAL(dst.getDepth() == 1); 9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::vector<Vec2> points(numBalls); 9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::Random rnd(seed); 9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < numBalls; i++) 9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float x = rnd.getFloat(); 9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float y = rnd.getFloat(); 9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry points[i] = (Vec2(x, y)); 9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < dst.getHeight(); y++) 9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < dst.getWidth(); x++) 9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec2 p((float)x/(float)dst.getWidth(), (float)y/(float)dst.getHeight()); 9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float sum = 0.0f; 10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (std::vector<Vec2>::const_iterator i = points.begin(); i != points.end(); i++) 10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec2 d = p - *i; 10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float f = 0.01f / (d.x()*d.x() + d.y()*d.y()); 10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry sum += f; 10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry dst.setPixel(Vec4(sum), x, y); 10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid copy (const PixelBufferAccess& dst, const ConstPixelBufferAccess& src) 10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 10146c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry DE_ASSERT(src.getSize() == dst.getSize()); 10156c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry 10166c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int width = dst.getWidth(); 10176c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int height = dst.getHeight(); 10186c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int depth = dst.getDepth(); 10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10206c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int srcPixelSize = src.getFormat().getPixelSize(); 10216c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int dstPixelSize = dst.getFormat().getPixelSize(); 10226c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int srcPixelPitch = src.getPixelPitch(); 10236c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const int dstPixelPitch = dst.getPixelPitch(); 10246c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const bool srcTightlyPacked = (srcPixelSize == srcPixelPitch); 10256c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry const bool dstTightlyPacked = (dstPixelSize == dstPixelPitch); 10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10275a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry const bool srcHasDepth = (src.getFormat().order == tcu::TextureFormat::DS || src.getFormat().order == tcu::TextureFormat::D); 10285a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry const bool srcHasStencil = (src.getFormat().order == tcu::TextureFormat::DS || src.getFormat().order == tcu::TextureFormat::S); 10295a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry const bool dstHasDepth = (dst.getFormat().order == tcu::TextureFormat::DS || dst.getFormat().order == tcu::TextureFormat::D); 10305a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry const bool dstHasStencil = (dst.getFormat().order == tcu::TextureFormat::DS || dst.getFormat().order == tcu::TextureFormat::S); 10315a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry 10326c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry if (src.getFormat() == dst.getFormat() && srcTightlyPacked && dstTightlyPacked) 10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Fast-path for matching formats. 10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < depth; z++) 10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < height; y++) 10376c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry deMemcpy(dst.getPixelPtr(0, y, z), src.getPixelPtr(0, y, z), srcPixelSize*width); 10386c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry } 10396c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry else if (src.getFormat() == dst.getFormat()) 10406c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry { 10416c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry // Bit-exact copy for matching formats. 10426c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry for (int z = 0; z < depth; z++) 10436c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry for (int y = 0; y < height; y++) 10446c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry for (int x = 0; x < width; x++) 10456c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry deMemcpy(dst.getPixelPtr(x, y, z), src.getPixelPtr(x, y, z), srcPixelSize); 10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10475a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry else if (srcHasDepth || srcHasStencil || dstHasDepth || dstHasStencil) 10485a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry { 10495a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry DE_ASSERT((srcHasDepth && dstHasDepth) || (srcHasStencil && dstHasStencil)); // must have at least one common channel 10505a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry 10515a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (dstHasDepth && srcHasDepth) 10525a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry { 10535a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry for (int z = 0; z < depth; z++) 10545a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry for (int y = 0; y < height; y++) 10555a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry for (int x = 0; x < width; x++) 10565a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry dst.setPixDepth(src.getPixDepth(x, y, z), x, y, z); 10575a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry } 10585a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry else if (dstHasDepth && !srcHasDepth) 10595a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry { 10605a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry // consistency with color copies 10615a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry tcu::clearDepth(dst, 0.0f); 10625a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry } 10635a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry 10645a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry if (dstHasStencil && srcHasStencil) 10655a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry { 10665a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry for (int z = 0; z < depth; z++) 10675a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry for (int y = 0; y < height; y++) 10685a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry for (int x = 0; x < width; x++) 10695a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry dst.setPixStencil(src.getPixStencil(x, y, z), x, y, z); 10705a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry } 10715a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry else if (dstHasStencil && !srcHasStencil) 10725a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry { 10735a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry // consistency with color copies 10745a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry tcu::clearStencil(dst, 0u); 10755a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry } 10765a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry } 10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureChannelClass srcClass = getTextureChannelClass(src.getFormat().type); 10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureChannelClass dstClass = getTextureChannelClass(dst.getFormat().type); 10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool srcIsInt = srcClass == TEXTURECHANNELCLASS_SIGNED_INTEGER || srcClass == TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool dstIsInt = dstClass == TEXTURECHANNELCLASS_SIGNED_INTEGER || dstClass == TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (srcIsInt && dstIsInt) 10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < depth; z++) 10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < height; y++) 10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < width; x++) 10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry dst.setPixel(src.getPixelInt(x, y, z), x, y, z); 10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < depth; z++) 10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < height; y++) 10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < width; x++) 10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry dst.setPixel(src.getPixel(x, y, z), x, y, z); 10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid scale (const PixelBufferAccess& dst, const ConstPixelBufferAccess& src, Sampler::FilterMode filter) 11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(filter == Sampler::NEAREST || filter == Sampler::LINEAR); 11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Sampler sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, 11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry filter, filter, 0.0f, false); 11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float sX = (float)src.getWidth() / (float)dst.getWidth(); 11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float sY = (float)src.getHeight() / (float)dst.getHeight(); 11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float sZ = (float)src.getDepth() / (float)dst.getDepth(); 11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (dst.getDepth() == 1 && src.getDepth() == 1) 11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < dst.getHeight(); y++) 11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < dst.getWidth(); x++) 1116183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan dst.setPixel(linearToSRGBIfNeeded(dst.getFormat(), src.sample2D(sampler, filter, ((float)x+0.5f)*sX, ((float)y+0.5f)*sY, 0)), x, y); 11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < dst.getDepth(); z++) 11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < dst.getHeight(); y++) 11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < dst.getWidth(); x++) 1123183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan dst.setPixel(linearToSRGBIfNeeded(dst.getFormat(), src.sample3D(sampler, filter, ((float)x+0.5f)*sX, ((float)y+0.5f)*sY, ((float)z+0.5f)*sZ)), x, y, z); 11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid estimatePixelValueRange (const ConstPixelBufferAccess& access, Vec4& minVal, Vec4& maxVal) 11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const TextureFormat& format = access.getFormat(); 11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11315f69470fe8597d811df06deb940cc5b54529fb4eJarkko Pöyry switch (getTextureChannelClass(format.type)) 11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11335f69470fe8597d811df06deb940cc5b54529fb4eJarkko Pöyry case TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Normalized unsigned formats. 11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry minVal = Vec4(0.0f); 11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry maxVal = Vec4(1.0f); 11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11395f69470fe8597d811df06deb940cc5b54529fb4eJarkko Pöyry case TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Normalized signed formats. 11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry minVal = Vec4(-1.0f); 11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry maxVal = Vec4(+1.0f); 11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note Samples every 4/8th pixel. 11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry minVal = Vec4(std::numeric_limits<float>::max()); 11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry maxVal = Vec4(std::numeric_limits<float>::min()); 11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int z = 0; z < access.getDepth(); z += 2) 11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int y = 0; y < access.getHeight(); y += 2) 11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int x = 0; x < access.getWidth(); x += 2) 11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 p = access.getPixel(x, y, z); 11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1158cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi minVal[0] = (deFloatIsNaN(p[0]) ? minVal[0] : de::min(minVal[0], p[0])); 1159cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi minVal[1] = (deFloatIsNaN(p[1]) ? minVal[1] : de::min(minVal[1], p[1])); 1160cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi minVal[2] = (deFloatIsNaN(p[2]) ? minVal[2] : de::min(minVal[2], p[2])); 1161cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi minVal[3] = (deFloatIsNaN(p[3]) ? minVal[3] : de::min(minVal[3], p[3])); 1162cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi 1163cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi maxVal[0] = (deFloatIsNaN(p[0]) ? maxVal[0] : de::max(maxVal[0], p[0])); 1164cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi maxVal[1] = (deFloatIsNaN(p[1]) ? maxVal[1] : de::max(maxVal[1], p[1])); 1165cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi maxVal[2] = (deFloatIsNaN(p[2]) ? maxVal[2] : de::max(maxVal[2], p[2])); 1166cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi maxVal[3] = (deFloatIsNaN(p[3]) ? maxVal[3] : de::max(maxVal[3], p[3])); 11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid computePixelScaleBias (const ConstPixelBufferAccess& access, Vec4& scale, Vec4& bias) 11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 minVal, maxVal; 11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry estimatePixelValueRange(access, minVal, maxVal); 11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float eps = 0.0001f; 11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int c = 0; c < 4; c++) 11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (maxVal[c] - minVal[c] < eps) 11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry scale[c] = (maxVal[c] < eps) ? 1.0f : (1.0f / maxVal[c]); 11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bias[c] = (c == 3) ? (1.0f - maxVal[c]*scale[c]) : (0.0f - minVal[c]*scale[c]); 11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry scale[c] = 1.0f / (maxVal[c] - minVal[c]); 11913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bias[c] = 0.0f - minVal[c]*scale[c]; 11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryint getCubeArrayFaceIndex (CubeFace face) 11978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 11988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT((int)face >= 0 && face < CUBEFACE_LAST); 11998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 12008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (face) 12018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 12028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CUBEFACE_POSITIVE_X: return 0; 12038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CUBEFACE_NEGATIVE_X: return 1; 12048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CUBEFACE_POSITIVE_Y: return 2; 12058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CUBEFACE_NEGATIVE_Y: return 3; 12068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CUBEFACE_POSITIVE_Z: return 4; 12078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CUBEFACE_NEGATIVE_Z: return 5; 12088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 12098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 12108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return -1; 12118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 12128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 12138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 12142925635ad62614cb6c5f824c22e31e8ca6bbb03eMika IsojärvideUint32 packRGB999E5 (const tcu::Vec4& color) 12152925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi{ 12162925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi const int mBits = 9; 12172925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi const int eBits = 5; 12182925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi const int eBias = 15; 12192925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi const int eMax = (1<<eBits)-1; 12202925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi const float maxVal = (float)(((1<<mBits) - 1) * (1<<(eMax-eBias))) / (float)(1<<mBits); 12212925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi 12222925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi float rc = deFloatClamp(color[0], 0.0f, maxVal); 12232925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi float gc = deFloatClamp(color[1], 0.0f, maxVal); 12242925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi float bc = deFloatClamp(color[2], 0.0f, maxVal); 12252925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi float maxc = de::max(rc, de::max(gc, bc)); 12262925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi int expp = de::max(-eBias - 1, deFloorFloatToInt32(deFloatLog2(maxc))) + 1 + eBias; 12272925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi float e = deFloatPow(2.0f, (float)(expp-eBias-mBits)); 12282925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi int maxs = deFloorFloatToInt32(maxc / e + 0.5f); 12292925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi 12302925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi deUint32 exps = maxs == (1<<mBits) ? expp+1 : expp; 12312925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi deUint32 rs = (deUint32)deClamp32(deFloorFloatToInt32(rc / e + 0.5f), 0, (1<<9)-1); 12322925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi deUint32 gs = (deUint32)deClamp32(deFloorFloatToInt32(gc / e + 0.5f), 0, (1<<9)-1); 12332925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi deUint32 bs = (deUint32)deClamp32(deFloorFloatToInt32(bc / e + 0.5f), 0, (1<<9)-1); 12342925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi 12352925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi DE_ASSERT((exps & ~((1<<5)-1)) == 0); 12362925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi DE_ASSERT((rs & ~((1<<9)-1)) == 0); 12372925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi DE_ASSERT((gs & ~((1<<9)-1)) == 0); 12382925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi DE_ASSERT((bs & ~((1<<9)-1)) == 0); 12392925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi 12402925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi return rs | (gs << 9) | (bs << 18) | (exps << 27); 12412925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi} 1242becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi 124341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry// Sampler utils 124441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 124541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrystatic const void* addOffset (const void* ptr, int numBytes) 124641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{ 124741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return (const deUint8*)ptr + numBytes; 124841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry} 124941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 125041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrystatic void* addOffset (void* ptr, int numBytes) 125141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{ 125241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return (deUint8*)ptr + numBytes; 125341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry} 125441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 125541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrytemplate <typename AccessType> 125641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrystatic AccessType toSamplerAccess (const AccessType& baseAccess, Sampler::DepthStencilMode mode) 125741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{ 125841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // make sure to update this if type table is updated 12595b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38); 126041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 126141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry if (!isCombinedDepthStencilType(baseAccess.getFormat().type)) 126241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return baseAccess; 126341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry else 126441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 126541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry#if (DE_ENDIANNESS == DE_LITTLE_ENDIAN) 1266725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos const deUint32 uint32ByteOffsetBits0To8 = 0; //!< least significant byte in the lowest address 1267725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos const deUint32 uint32ByteOffsetBits0To24 = 0; 126800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos const deUint32 uint32ByteOffsetBits8To32 = 1; 1269725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos const deUint32 uint32ByteOffsetBits16To32 = 2; 1270725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos const deUint32 uint32ByteOffsetBits24To32 = 3; 127141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry#else 1272725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos const deUint32 uint32ByteOffsetBits0To8 = 3; //!< least significant byte in the highest address 1273725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos const deUint32 uint32ByteOffsetBits0To24 = 1; 127400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos const deUint32 uint32ByteOffsetBits8To32 = 0; 1275725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos const deUint32 uint32ByteOffsetBits16To32 = 0; 1276725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos const deUint32 uint32ByteOffsetBits24To32 = 0; 127741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry#endif 127841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 127941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // Sampled channel must exist 128041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry DE_ASSERT(baseAccess.getFormat().order == TextureFormat::DS || 128141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry (mode == Sampler::MODE_DEPTH && baseAccess.getFormat().order == TextureFormat::D) || 128241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry (mode == Sampler::MODE_STENCIL && baseAccess.getFormat().order == TextureFormat::S)); 128341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 128441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // combined formats have multiple channel classes, detect on sampler settings 128541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry switch (baseAccess.getFormat().type) 128641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 1287725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV: 128800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos { 128900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos if (mode == Sampler::MODE_DEPTH) 129000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos { 129100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos // select the float component 129200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos return AccessType(TextureFormat(TextureFormat::D, TextureFormat::FLOAT), 129300d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos baseAccess.getSize(), 129400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos baseAccess.getPitch(), 129500d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos baseAccess.getDataPtr()); 129600d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos } 129700d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos else if (mode == Sampler::MODE_STENCIL) 129800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos { 129900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos // select the uint 8 component 130000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8), 130100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos baseAccess.getSize(), 130200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos baseAccess.getPitch(), 1303725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos addOffset(baseAccess.getDataPtr(), 4 + uint32ByteOffsetBits0To8)); 130400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos } 130500d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos else 130600d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos { 130700d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos // unknown sampler mode 130800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos DE_ASSERT(false); 130900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos return AccessType(); 131000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos } 131100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos } 131200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos 1313725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_INT_16_8_8: 131441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 131541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry if (mode == Sampler::MODE_DEPTH) 131641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 1317725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos // select the unorm16 component 1318725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos return AccessType(TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT16), 131941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry baseAccess.getSize(), 132041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry baseAccess.getPitch(), 1321725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits16To32)); 132241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 132341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry else if (mode == Sampler::MODE_STENCIL) 132441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 132541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // select the uint 8 component 132641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8), 132741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry baseAccess.getSize(), 132841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry baseAccess.getPitch(), 1329725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits0To8)); 133041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 133141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry else 133241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 133341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // unknown sampler mode 133441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry DE_ASSERT(false); 133541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return AccessType(); 133641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 133741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 133841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 1339725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_INT_24_8: 134000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos { 134100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos if (mode == Sampler::MODE_DEPTH) 134200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos { 1343725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos // select the unorm24 component 1344725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos return AccessType(TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT24), 134500d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos baseAccess.getSize(), 134600d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos baseAccess.getPitch(), 1347725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits8To32)); 134800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos } 134900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos else if (mode == Sampler::MODE_STENCIL) 135000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos { 135100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos // select the uint 8 component 135200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8), 135300d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos baseAccess.getSize(), 135400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos baseAccess.getPitch(), 1355725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits0To8)); 135600d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos } 135700d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos else 135800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos { 135900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos // unknown sampler mode 136000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos DE_ASSERT(false); 136100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos return AccessType(); 136200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos } 136300d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos } 136400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos 1365725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::UNSIGNED_INT_24_8_REV: 136641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 136741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry if (mode == Sampler::MODE_DEPTH) 136841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 136941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // select the unorm24 component 137041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return AccessType(TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT24), 137141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry baseAccess.getSize(), 137241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry baseAccess.getPitch(), 1373725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits0To24)); 137441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 137541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry else if (mode == Sampler::MODE_STENCIL) 137641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 137741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // select the uint 8 component 137841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8), 137941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry baseAccess.getSize(), 138041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry baseAccess.getPitch(), 1381725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits24To32)); 138241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 138341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry else 138441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 138541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // unknown sampler mode 138641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry DE_ASSERT(false); 138741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return AccessType(); 138841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 138941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 139041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 139141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry default: 139241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry { 139341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry // unknown combined format 139441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry DE_ASSERT(false); 139541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return AccessType(); 139641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 139741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 139841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry } 139941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry} 140041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 140141920d7e0d1833907249009d156f6eb2361df97eJarkko PöyryPixelBufferAccess getEffectiveDepthStencilAccess (const PixelBufferAccess& baseAccess, Sampler::DepthStencilMode mode) 140241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{ 140341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return toSamplerAccess<PixelBufferAccess>(baseAccess, mode); 140441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry} 140541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 140641920d7e0d1833907249009d156f6eb2361df97eJarkko PöyryConstPixelBufferAccess getEffectiveDepthStencilAccess (const ConstPixelBufferAccess& baseAccess, Sampler::DepthStencilMode mode) 140741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{ 140841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return toSamplerAccess<ConstPixelBufferAccess>(baseAccess, mode); 140941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry} 141041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 141141920d7e0d1833907249009d156f6eb2361df97eJarkko PöyryTextureFormat getEffectiveDepthStencilTextureFormat (const TextureFormat& baseFormat, Sampler::DepthStencilMode mode) 141241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{ 141341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry return toSamplerAccess(ConstPixelBufferAccess(baseFormat, IVec3(0, 0, 0), DE_NULL), mode).getFormat(); 141441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry} 141541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry 14160d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytemplate <typename ViewType> 14170d61ad28c122cede72a061c4b8346a176b245b69Jarkko PöyryViewType getEffectiveTView (const ViewType& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler) 14180d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{ 14190d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry storage.resize(src.getNumLevels()); 14200d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14210d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry ViewType view = ViewType(src.getNumLevels(), &storage[0]); 14220d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14230d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry for (int levelNdx = 0; levelNdx < src.getNumLevels(); ++levelNdx) 14240d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry storage[levelNdx] = tcu::getEffectiveDepthStencilAccess(src.getLevel(levelNdx), sampler.depthStencilMode); 14250d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14260d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry return view; 14270d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry} 14280d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14290d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::TextureCubeView getEffectiveTView (const tcu::TextureCubeView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler) 14300d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{ 14310d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry storage.resize(tcu::CUBEFACE_LAST * src.getNumLevels()); 14320d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14330d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry const tcu::ConstPixelBufferAccess* storagePtrs[tcu::CUBEFACE_LAST] = 14340d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry { 14350d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry &storage[0 * src.getNumLevels()], 14360d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry &storage[1 * src.getNumLevels()], 14370d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry &storage[2 * src.getNumLevels()], 14380d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry &storage[3 * src.getNumLevels()], 14390d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry &storage[4 * src.getNumLevels()], 14400d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry &storage[5 * src.getNumLevels()], 14410d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry }; 14420d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14430d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry tcu::TextureCubeView view = tcu::TextureCubeView(src.getNumLevels(), storagePtrs); 14440d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14450d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx) 14460d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry for (int levelNdx = 0; levelNdx < src.getNumLevels(); ++levelNdx) 14470d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry storage[faceNdx * src.getNumLevels() + levelNdx] = tcu::getEffectiveDepthStencilAccess(src.getLevelFace(levelNdx, (tcu::CubeFace)faceNdx), sampler.depthStencilMode); 14480d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14490d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry return view; 14500d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry} 14510d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14520d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture1DView getEffectiveTextureView (const tcu::Texture1DView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler) 14530d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{ 14540d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry return getEffectiveTView(src, storage, sampler); 14550d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry} 14560d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14570d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture2DView getEffectiveTextureView (const tcu::Texture2DView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler) 14580d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{ 14590d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry return getEffectiveTView(src, storage, sampler); 14600d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry} 14610d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14620d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture3DView getEffectiveTextureView (const tcu::Texture3DView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler) 14630d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{ 14640d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry return getEffectiveTView(src, storage, sampler); 14650d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry} 14660d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14670d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture1DArrayView getEffectiveTextureView (const tcu::Texture1DArrayView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler) 14680d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{ 14690d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry return getEffectiveTView(src, storage, sampler); 14700d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry} 14710d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14720d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture2DArrayView getEffectiveTextureView (const tcu::Texture2DArrayView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler) 14730d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{ 14740d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry return getEffectiveTView(src, storage, sampler); 14750d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry} 14760d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14770d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::TextureCubeView getEffectiveTextureView (const tcu::TextureCubeView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler) 14780d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{ 14790d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry return getEffectiveTView(src, storage, sampler); 14800d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry} 14810d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 14820d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::TextureCubeArrayView getEffectiveTextureView (const tcu::TextureCubeArrayView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler) 14830d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{ 14840d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry return getEffectiveTView(src, storage, sampler); 14850d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry} 14860d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry 1487222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry//! Returns the effective swizzle of a border color. The effective swizzle is the 1488222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry//! equal to first writing an RGBA color with a write swizzle and then reading 1489222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry//! it back using a read swizzle, i.e. BorderSwizzle(c) == readSwizzle(writeSwizzle(C)) 1490222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic const TextureSwizzle& getBorderColorReadSwizzle (TextureFormat::ChannelOrder order) 1491222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{ 1492222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry // make sure to update these tables when channel orders are updated 1493725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 21); 1494222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1495222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle INV = {{ TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE }}; 1496222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle R = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE }}; 1497222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle A = {{ TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_3 }}; 1498222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle I = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0 }}; 1499222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle L = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ONE }}; 1500222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle LA = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3 }}; 1501222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle RG = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_1, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE }}; 1502222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle RA = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_3 }}; 1503222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle RGB = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_1, TextureSwizzle::CHANNEL_2, TextureSwizzle::CHANNEL_ONE }}; 1504222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle RGBA = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_1, TextureSwizzle::CHANNEL_2, TextureSwizzle::CHANNEL_3 }}; 1505222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle D = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE }}; 1506222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry static const TextureSwizzle S = {{ TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ZERO, TextureSwizzle::CHANNEL_ONE }}; 1507222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1508222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const TextureSwizzle* swizzle; 1509222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1510222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry switch (order) 1511222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1512222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::R: swizzle = &R; break; 1513222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::A: swizzle = &A; break; 1514222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::I: swizzle = &I; break; 1515222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::L: swizzle = &L; break; 1516222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::LA: swizzle = &LA; break; 1517222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::RG: swizzle = &RG; break; 1518222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::RA: swizzle = &RA; break; 1519222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::RGB: swizzle = &RGB; break; 1520222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::RGBA: swizzle = &RGBA; break; 1521222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::ARGB: swizzle = &RGBA; break; 1522725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos case TextureFormat::BGR: swizzle = &RGB; break; 1523222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::BGRA: swizzle = &RGBA; break; 1524222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::sR: swizzle = &R; break; 1525222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::sRG: swizzle = &RG; break; 1526222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::sRGB: swizzle = &RGB; break; 1527222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::sRGBA: swizzle = &RGBA; break; 15285b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos case TextureFormat::sBGR: swizzle = &RGB; break; 15295b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos case TextureFormat::sBGRA: swizzle = &RGBA; break; 1530222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::D: swizzle = &D; break; 1531222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::S: swizzle = &S; break; 1532222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1533222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case TextureFormat::DS: 1534222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry DE_ASSERT(false); // combined depth-stencil border color? 1535222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry swizzle = &INV; 1536222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry break; 1537222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1538222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry default: 1539222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry DE_ASSERT(false); 1540222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry swizzle = &INV; 1541222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry break; 1542222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1543222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1544222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry#ifdef DE_DEBUG 1545222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1546222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1547222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry // check that BorderSwizzle(c) == readSwizzle(writeSwizzle(C)) 1548222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const TextureSwizzle& readSwizzle = getChannelReadSwizzle(order); 1549222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const TextureSwizzle& writeSwizzle = getChannelWriteSwizzle(order); 1550222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1551222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry for (int ndx = 0; ndx < 4; ++ndx) 1552222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1553222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry TextureSwizzle::Channel writeRead = readSwizzle.components[ndx]; 1554222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry if (deInRange32(writeRead, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE) 1555222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry writeRead = writeSwizzle.components[(int)writeRead]; 1556222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry DE_ASSERT(writeRead == swizzle->components[ndx]); 1557222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1558222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1559222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1560222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry#endif 1561222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1562222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return *swizzle; 1563222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry} 1564222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1565222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::UVec4 getNBitUnsignedIntegerVec4MaxValue (const tcu::IVec4& numBits) 1566222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{ 1567222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return tcu::UVec4((numBits[0] > 0) ? (deUintMaxValue32(numBits[0])) : (0), 1568222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry (numBits[1] > 0) ? (deUintMaxValue32(numBits[1])) : (0), 1569222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry (numBits[2] > 0) ? (deUintMaxValue32(numBits[2])) : (0), 1570222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry (numBits[3] > 0) ? (deUintMaxValue32(numBits[3])) : (0)); 1571222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry} 1572222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1573222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::IVec4 getNBitSignedIntegerVec4MaxValue (const tcu::IVec4& numBits) 1574222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{ 1575222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return tcu::IVec4((numBits[0] > 0) ? (deIntMaxValue32(numBits[0])) : (0), 1576222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry (numBits[1] > 0) ? (deIntMaxValue32(numBits[1])) : (0), 1577222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry (numBits[2] > 0) ? (deIntMaxValue32(numBits[2])) : (0), 1578222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry (numBits[3] > 0) ? (deIntMaxValue32(numBits[3])) : (0)); 1579222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry} 1580222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1581222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::IVec4 getNBitSignedIntegerVec4MinValue (const tcu::IVec4& numBits) 1582222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{ 1583222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return tcu::IVec4((numBits[0] > 0) ? (deIntMinValue32(numBits[0])) : (0), 1584222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry (numBits[1] > 0) ? (deIntMinValue32(numBits[1])) : (0), 1585222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry (numBits[2] > 0) ? (deIntMinValue32(numBits[2])) : (0), 1586222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry (numBits[3] > 0) ? (deIntMinValue32(numBits[3])) : (0)); 1587222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry} 1588222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1589222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::Vec4 getTextureBorderColorFloat (const TextureFormat& format, const Sampler& sampler) 1590222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{ 1591653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos const tcu::TextureChannelClass channelClass = getTextureChannelClass(format.type); 1592222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const TextureSwizzle::Channel* channelMap = getBorderColorReadSwizzle(format.order).components; 1593222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const bool isFloat = channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT; 1594222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const bool isSigned = channelClass != tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; 1595222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const float valueMin = (isSigned) ? (-1.0f) : (0.0f); 1596222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const float valueMax = 1.0f; 1597222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry Vec4 result; 1598222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1599222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry DE_ASSERT(channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT || 1600222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT || 1601222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT); 1602222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1603222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry for (int c = 0; c < 4; c++) 1604222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1605222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const TextureSwizzle::Channel map = channelMap[c]; 1606222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry if (map == TextureSwizzle::CHANNEL_ZERO) 1607222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = 0.0f; 1608222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry else if (map == TextureSwizzle::CHANNEL_ONE) 1609222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = 1.0f; 1610222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry else if (isFloat) 1611222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1612222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry // floating point values are not clamped 1613222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = sampler.borderColor.getAccess<float>()[(int)map]; 1614222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1615222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry else 1616222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1617222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry // fixed point values are clamped to a representable range 1618222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = de::clamp(sampler.borderColor.getAccess<float>()[(int)map], valueMin, valueMax); 1619222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1620222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1621222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1622d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry return result; 1623222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry} 1624222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1625222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::IVec4 getTextureBorderColorInt (const TextureFormat& format, const Sampler& sampler) 1626222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{ 1627653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos const tcu::TextureChannelClass channelClass = getTextureChannelClass(format.type); 1628222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const TextureSwizzle::Channel* channelMap = getBorderColorReadSwizzle(format.order).components; 1629222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const IVec4 channelBits = getChannelBitDepth(format.type); 1630222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const IVec4 valueMin = getNBitSignedIntegerVec4MinValue(channelBits); 1631222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const IVec4 valueMax = getNBitSignedIntegerVec4MaxValue(channelBits); 1632222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry IVec4 result; 1633222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1634222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry DE_ASSERT(channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER); 163535f093054670f38076b8b347d37a41be90a5ac8cJarkko Pöyry DE_UNREF(channelClass); 1636222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1637222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry for (int c = 0; c < 4; c++) 1638222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1639222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const TextureSwizzle::Channel map = channelMap[c]; 1640222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry if (map == TextureSwizzle::CHANNEL_ZERO) 1641222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = 0; 1642222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry else if (map == TextureSwizzle::CHANNEL_ONE) 1643222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = 1; 1644222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry else 1645222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1646222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry // integer values are clamped to a representable range 1647222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = de::clamp(sampler.borderColor.getAccess<deInt32>()[(int)map], valueMin[(int)map], valueMax[(int)map]); 1648222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1649222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1650222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1651222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return result; 1652222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry} 1653222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1654222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::UVec4 getTextureBorderColorUint (const TextureFormat& format, const Sampler& sampler) 1655222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{ 1656653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos const tcu::TextureChannelClass channelClass = getTextureChannelClass(format.type); 1657222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const TextureSwizzle::Channel* channelMap = getBorderColorReadSwizzle(format.order).components; 1658222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const IVec4 channelBits = getChannelBitDepth(format.type); 1659222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const UVec4 valueMax = getNBitUnsignedIntegerVec4MaxValue(channelBits); 1660222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry UVec4 result; 1661222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1662222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry DE_ASSERT(channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER); 166335f093054670f38076b8b347d37a41be90a5ac8cJarkko Pöyry DE_UNREF(channelClass); 1664222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1665222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry for (int c = 0; c < 4; c++) 1666222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1667222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const TextureSwizzle::Channel map = channelMap[c]; 1668222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry if (map == TextureSwizzle::CHANNEL_ZERO) 1669222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = 0; 1670222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry else if (map == TextureSwizzle::CHANNEL_ONE) 1671222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = 1; 1672222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry else 1673222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1674222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry // integer values are clamped to a representable range 1675222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry result[c] = de::min(sampler.borderColor.getAccess<deUint32>()[(int)map], valueMax[(int)map]); 1676222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1677222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1678222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1679222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return result; 1680222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry} 1681222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1682222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytemplate <typename ScalarType> 1683222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytcu::Vector<ScalarType, 4> sampleTextureBorder (const TextureFormat& format, const Sampler& sampler) 1684222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{ 1685222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry const tcu::TextureChannelClass channelClass = getTextureChannelClass(format.type); 1686222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1687222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry switch (channelClass) 1688222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry { 1689222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 1690222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 1691222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 1692222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return getTextureBorderColorFloat(format, sampler).cast<ScalarType>(); 1693222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1694222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 1695222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return getTextureBorderColorInt(format, sampler).cast<ScalarType>(); 1696222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1697222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 1698222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return getTextureBorderColorUint(format, sampler).cast<ScalarType>(); 1699222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1700222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry default: 1701222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry DE_ASSERT(false); 1702222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry return tcu::Vector<ScalarType, 4>(); 1703222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry } 1704222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry} 1705222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 1706222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry// instantiation 1707222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytemplate tcu::Vector<float, 4> sampleTextureBorder (const TextureFormat& format, const Sampler& sampler); 1708222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytemplate tcu::Vector<deInt32, 4> sampleTextureBorder (const TextureFormat& format, const Sampler& sampler); 1709222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytemplate tcu::Vector<deUint32, 4> sampleTextureBorder (const TextureFormat& format, const Sampler& sampler); 1710222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry 17113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu 1712