1*35238bceSAndroid Build Coastguard Worker #ifndef _TCUTEXLOOKUPVERIFIER_HPP 2*35238bceSAndroid Build Coastguard Worker #define _TCUTEXLOOKUPVERIFIER_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Tester Core 5*35238bceSAndroid Build Coastguard Worker * ---------------------------------------- 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Texture lookup simulator that is capable of verifying generic 24*35238bceSAndroid Build Coastguard Worker * lookup results based on accuracy parameters. 25*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 26*35238bceSAndroid Build Coastguard Worker 27*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "tcuTexture.hpp" 29*35238bceSAndroid Build Coastguard Worker 30*35238bceSAndroid Build Coastguard Worker namespace tcu 31*35238bceSAndroid Build Coastguard Worker { 32*35238bceSAndroid Build Coastguard Worker 33*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*! 34*35238bceSAndroid Build Coastguard Worker * \brief Generic lookup precision parameters. 35*35238bceSAndroid Build Coastguard Worker * 36*35238bceSAndroid Build Coastguard Worker * For (assumed) floating-point values recision is defined by number of 37*35238bceSAndroid Build Coastguard Worker * accurate bits in significand. Maximum number of accurate bits supported 38*35238bceSAndroid Build Coastguard Worker * is 23 (limit of single-precision FP). 39*35238bceSAndroid Build Coastguard Worker * 40*35238bceSAndroid Build Coastguard Worker * For fixed-point values precision is defined by number of bits in 41*35238bceSAndroid Build Coastguard Worker * the fractional part. 42*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 43*35238bceSAndroid Build Coastguard Worker struct LookupPrecision 44*35238bceSAndroid Build Coastguard Worker { 45*35238bceSAndroid Build Coastguard Worker IVec3 coordBits; //!< Bits per coordinate component before any transformations. Assumed to be floating-point. 46*35238bceSAndroid Build Coastguard Worker IVec3 uvwBits; //!< Bits per component in final per-level UV(W) coordinates. Assumed to be fixed-point. 47*35238bceSAndroid Build Coastguard Worker Vec4 colorThreshold; //!< Threshold for match. 48*35238bceSAndroid Build Coastguard Worker BVec4 colorMask; //!< Channel mask for comparison. 49*35238bceSAndroid Build Coastguard Worker LookupPrecisiontcu::LookupPrecision50*35238bceSAndroid Build Coastguard Worker LookupPrecision(void) : coordBits(22), uvwBits(16), colorThreshold(0.0f), colorMask(true) 51*35238bceSAndroid Build Coastguard Worker { 52*35238bceSAndroid Build Coastguard Worker } 53*35238bceSAndroid Build Coastguard Worker }; 54*35238bceSAndroid Build Coastguard Worker 55*35238bceSAndroid Build Coastguard Worker struct IntLookupPrecision 56*35238bceSAndroid Build Coastguard Worker { 57*35238bceSAndroid Build Coastguard Worker IVec3 coordBits; //!< Bits per coordinate component before any transformations. Assumed to be floating-point. 58*35238bceSAndroid Build Coastguard Worker IVec3 uvwBits; //!< Bits per component in final per-level UV(W) coordinates. Assumed to be fixed-point. 59*35238bceSAndroid Build Coastguard Worker UVec4 colorThreshold; //!< Threshold for match. 60*35238bceSAndroid Build Coastguard Worker BVec4 colorMask; //!< Channel mask for comparison. 61*35238bceSAndroid Build Coastguard Worker IntLookupPrecisiontcu::IntLookupPrecision62*35238bceSAndroid Build Coastguard Worker IntLookupPrecision(void) : coordBits(22), uvwBits(16), colorThreshold(0), colorMask(true) 63*35238bceSAndroid Build Coastguard Worker { 64*35238bceSAndroid Build Coastguard Worker } 65*35238bceSAndroid Build Coastguard Worker }; 66*35238bceSAndroid Build Coastguard Worker 67*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*! 68*35238bceSAndroid Build Coastguard Worker * \brief Lod computation precision parameters. 69*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 70*35238bceSAndroid Build Coastguard Worker struct LodPrecision 71*35238bceSAndroid Build Coastguard Worker { 72*35238bceSAndroid Build Coastguard Worker int derivateBits; //!< Number of bits in derivates. (Floating-point) 73*35238bceSAndroid Build Coastguard Worker int lodBits; //!< Number of bits in final lod (accuracy of log2()). (Fixed-point) 74*35238bceSAndroid Build Coastguard Worker LodPrecisiontcu::LodPrecision75*35238bceSAndroid Build Coastguard Worker LodPrecision(void) : derivateBits(22), lodBits(16) 76*35238bceSAndroid Build Coastguard Worker { 77*35238bceSAndroid Build Coastguard Worker } 78*35238bceSAndroid Build Coastguard Worker LodPrecisiontcu::LodPrecision79*35238bceSAndroid Build Coastguard Worker LodPrecision(int derivateBits_, int lodBits_) : derivateBits(derivateBits_), lodBits(lodBits_) 80*35238bceSAndroid Build Coastguard Worker { 81*35238bceSAndroid Build Coastguard Worker } 82*35238bceSAndroid Build Coastguard Worker }; 83*35238bceSAndroid Build Coastguard Worker 84*35238bceSAndroid Build Coastguard Worker enum TexLookupScaleMode 85*35238bceSAndroid Build Coastguard Worker { 86*35238bceSAndroid Build Coastguard Worker TEX_LOOKUP_SCALE_MINIFY = 0, 87*35238bceSAndroid Build Coastguard Worker TEX_LOOKUP_SCALE_MAGNIFY, 88*35238bceSAndroid Build Coastguard Worker 89*35238bceSAndroid Build Coastguard Worker TEX_LOOKUP_SCALE_MODE_LAST 90*35238bceSAndroid Build Coastguard Worker }; 91*35238bceSAndroid Build Coastguard Worker 92*35238bceSAndroid Build Coastguard Worker Vec4 computeFixedPointThreshold(const IVec4 &bits); 93*35238bceSAndroid Build Coastguard Worker Vec4 computeFloatingPointThreshold(const IVec4 &bits, const Vec4 &value); 94*35238bceSAndroid Build Coastguard Worker Vec4 computeColorBitsThreshold(const IVec4 &bits, const IVec4 &numAccurateBits); 95*35238bceSAndroid Build Coastguard Worker 96*35238bceSAndroid Build Coastguard Worker Vec2 computeLodBoundsFromDerivates(const float dudx, const float dudy, const LodPrecision &prec); 97*35238bceSAndroid Build Coastguard Worker Vec2 computeLodBoundsFromDerivates(const float dudx, const float dvdx, const float dudy, const float dvdy, 98*35238bceSAndroid Build Coastguard Worker const LodPrecision &prec); 99*35238bceSAndroid Build Coastguard Worker Vec2 computeLodBoundsFromDerivates(const float dudx, const float dvdx, const float dwdx, const float dudy, 100*35238bceSAndroid Build Coastguard Worker const float dvdy, const float dwdy, const LodPrecision &prec); 101*35238bceSAndroid Build Coastguard Worker Vec2 computeCubeLodBoundsFromDerivates(const Vec3 &coord, const Vec3 &coordDx, const Vec3 &coordDy, const int faceSize, 102*35238bceSAndroid Build Coastguard Worker const LodPrecision &prec); 103*35238bceSAndroid Build Coastguard Worker 104*35238bceSAndroid Build Coastguard Worker Vec2 clampLodBounds(const Vec2 &lodBounds, const Vec2 &lodMinMax, const LodPrecision &prec); 105*35238bceSAndroid Build Coastguard Worker 106*35238bceSAndroid Build Coastguard Worker bool isLookupResultValid(const Texture1DView &texture, const Sampler &sampler, const LookupPrecision &prec, 107*35238bceSAndroid Build Coastguard Worker const float coord, const Vec2 &lodBounds, const Vec4 &result); 108*35238bceSAndroid Build Coastguard Worker bool isLookupResultValid(const Texture2DView &texture, const Sampler &sampler, const LookupPrecision &prec, 109*35238bceSAndroid Build Coastguard Worker const Vec2 &coord, const Vec2 &lodBounds, const Vec4 &result); 110*35238bceSAndroid Build Coastguard Worker bool isLookupResultValid(const TextureCubeView &texture, const Sampler &sampler, const LookupPrecision &prec, 111*35238bceSAndroid Build Coastguard Worker const Vec3 &coord, const Vec2 &lodBounds, const Vec4 &result); 112*35238bceSAndroid Build Coastguard Worker bool isLookupResultValid(const Texture1DArrayView &texture, const Sampler &sampler, const LookupPrecision &prec, 113*35238bceSAndroid Build Coastguard Worker const Vec2 &coord, const Vec2 &lodBounds, const Vec4 &result); 114*35238bceSAndroid Build Coastguard Worker bool isLookupResultValid(const Texture2DArrayView &texture, const Sampler &sampler, const LookupPrecision &prec, 115*35238bceSAndroid Build Coastguard Worker const Vec3 &coord, const Vec2 &lodBounds, const Vec4 &result); 116*35238bceSAndroid Build Coastguard Worker bool isLookupResultValid(const Texture3DView &texture, const Sampler &sampler, const LookupPrecision &prec, 117*35238bceSAndroid Build Coastguard Worker const Vec3 &coord, const Vec2 &lodBounds, const Vec4 &result); 118*35238bceSAndroid Build Coastguard Worker bool isLookupResultValid(const TextureCubeArrayView &texture, const Sampler &sampler, const LookupPrecision &prec, 119*35238bceSAndroid Build Coastguard Worker const IVec4 &coordBits, const Vec4 &coord, const Vec2 &lodBounds, const Vec4 &result); 120*35238bceSAndroid Build Coastguard Worker 121*35238bceSAndroid Build Coastguard Worker bool isLevel1DLookupResultValid(const ConstPixelBufferAccess &access, const Sampler &sampler, 122*35238bceSAndroid Build Coastguard Worker TexLookupScaleMode scaleMode, const LookupPrecision &prec, const float coordX, 123*35238bceSAndroid Build Coastguard Worker const int coordY, const Vec4 &result); 124*35238bceSAndroid Build Coastguard Worker bool isLevel1DLookupResultValid(const ConstPixelBufferAccess &access, const Sampler &sampler, 125*35238bceSAndroid Build Coastguard Worker TexLookupScaleMode scaleMode, const IntLookupPrecision &prec, const float coordX, 126*35238bceSAndroid Build Coastguard Worker const int coordY, const IVec4 &result); 127*35238bceSAndroid Build Coastguard Worker bool isLevel1DLookupResultValid(const ConstPixelBufferAccess &access, const Sampler &sampler, 128*35238bceSAndroid Build Coastguard Worker TexLookupScaleMode scaleMode, const IntLookupPrecision &prec, const float coordX, 129*35238bceSAndroid Build Coastguard Worker const int coordY, const UVec4 &result); 130*35238bceSAndroid Build Coastguard Worker 131*35238bceSAndroid Build Coastguard Worker bool isLevel2DLookupResultValid(const ConstPixelBufferAccess &access, const Sampler &sampler, 132*35238bceSAndroid Build Coastguard Worker TexLookupScaleMode scaleMode, const LookupPrecision &prec, const Vec2 &coord, 133*35238bceSAndroid Build Coastguard Worker const int coordZ, const Vec4 &result); 134*35238bceSAndroid Build Coastguard Worker bool isLevel2DLookupResultValid(const ConstPixelBufferAccess &access, const Sampler &sampler, 135*35238bceSAndroid Build Coastguard Worker TexLookupScaleMode scaleMode, const IntLookupPrecision &prec, const Vec2 &coord, 136*35238bceSAndroid Build Coastguard Worker const int coordZ, const IVec4 &result); 137*35238bceSAndroid Build Coastguard Worker bool isLevel2DLookupResultValid(const ConstPixelBufferAccess &access, const Sampler &sampler, 138*35238bceSAndroid Build Coastguard Worker TexLookupScaleMode scaleMode, const IntLookupPrecision &prec, const Vec2 &coord, 139*35238bceSAndroid Build Coastguard Worker const int coordZ, const UVec4 &result); 140*35238bceSAndroid Build Coastguard Worker 141*35238bceSAndroid Build Coastguard Worker bool isLevel3DLookupResultValid(const ConstPixelBufferAccess &access, const Sampler &sampler, 142*35238bceSAndroid Build Coastguard Worker TexLookupScaleMode scaleMode, const LookupPrecision &prec, const Vec3 &coord, 143*35238bceSAndroid Build Coastguard Worker const Vec4 &result); 144*35238bceSAndroid Build Coastguard Worker bool isLevel3DLookupResultValid(const ConstPixelBufferAccess &access, const Sampler &sampler, 145*35238bceSAndroid Build Coastguard Worker TexLookupScaleMode scaleMode, const IntLookupPrecision &prec, const Vec3 &coord, 146*35238bceSAndroid Build Coastguard Worker const IVec4 &result); 147*35238bceSAndroid Build Coastguard Worker bool isLevel3DLookupResultValid(const ConstPixelBufferAccess &access, const Sampler &sampler, 148*35238bceSAndroid Build Coastguard Worker TexLookupScaleMode scaleMode, const IntLookupPrecision &prec, const Vec3 &coord, 149*35238bceSAndroid Build Coastguard Worker const UVec4 &result); 150*35238bceSAndroid Build Coastguard Worker 151*35238bceSAndroid Build Coastguard Worker bool isLinearSampleResultValid(const ConstPixelBufferAccess &level, const Sampler &sampler, const LookupPrecision &prec, 152*35238bceSAndroid Build Coastguard Worker const Vec2 &coord, const int coordZ, const Vec4 &result); 153*35238bceSAndroid Build Coastguard Worker 154*35238bceSAndroid Build Coastguard Worker bool isGatherOffsetsResultValid(const Texture2DView &texture, const Sampler &sampler, const LookupPrecision &prec, 155*35238bceSAndroid Build Coastguard Worker const Vec2 &coord, int componentNdx, const IVec2 (&offsets)[4], const Vec4 &result); 156*35238bceSAndroid Build Coastguard Worker bool isGatherOffsetsResultValid(const Texture2DView &texture, const Sampler &sampler, const IntLookupPrecision &prec, 157*35238bceSAndroid Build Coastguard Worker const Vec2 &coord, int componentNdx, const IVec2 (&offsets)[4], const IVec4 &result); 158*35238bceSAndroid Build Coastguard Worker bool isGatherOffsetsResultValid(const Texture2DView &texture, const Sampler &sampler, const IntLookupPrecision &prec, 159*35238bceSAndroid Build Coastguard Worker const Vec2 &coord, int componentNdx, const IVec2 (&offsets)[4], const UVec4 &result); 160*35238bceSAndroid Build Coastguard Worker 161*35238bceSAndroid Build Coastguard Worker bool isGatherOffsetsResultValid(const Texture2DArrayView &texture, const Sampler &sampler, const LookupPrecision &prec, 162*35238bceSAndroid Build Coastguard Worker const Vec3 &coord, int componentNdx, const IVec2 (&offsets)[4], const Vec4 &result); 163*35238bceSAndroid Build Coastguard Worker bool isGatherOffsetsResultValid(const Texture2DArrayView &texture, const Sampler &sampler, 164*35238bceSAndroid Build Coastguard Worker const IntLookupPrecision &prec, const Vec3 &coord, int componentNdx, 165*35238bceSAndroid Build Coastguard Worker const IVec2 (&offsets)[4], const IVec4 &result); 166*35238bceSAndroid Build Coastguard Worker bool isGatherOffsetsResultValid(const Texture2DArrayView &texture, const Sampler &sampler, 167*35238bceSAndroid Build Coastguard Worker const IntLookupPrecision &prec, const Vec3 &coord, int componentNdx, 168*35238bceSAndroid Build Coastguard Worker const IVec2 (&offsets)[4], const UVec4 &result); 169*35238bceSAndroid Build Coastguard Worker 170*35238bceSAndroid Build Coastguard Worker // \note For cube textures, gather is only defined without offset. 171*35238bceSAndroid Build Coastguard Worker bool isGatherResultValid(const TextureCubeView &texture, const Sampler &sampler, const LookupPrecision &prec, 172*35238bceSAndroid Build Coastguard Worker const Vec3 &coord, int componentNdx, const Vec4 &result); 173*35238bceSAndroid Build Coastguard Worker bool isGatherResultValid(const TextureCubeView &texture, const Sampler &sampler, const IntLookupPrecision &prec, 174*35238bceSAndroid Build Coastguard Worker const Vec3 &coord, int componentNdx, const IVec4 &result); 175*35238bceSAndroid Build Coastguard Worker bool isGatherResultValid(const TextureCubeView &texture, const Sampler &sampler, const IntLookupPrecision &prec, 176*35238bceSAndroid Build Coastguard Worker const Vec3 &coord, int componentNdx, const UVec4 &result); 177*35238bceSAndroid Build Coastguard Worker 178*35238bceSAndroid Build Coastguard Worker } // namespace tcu 179*35238bceSAndroid Build Coastguard Worker 180*35238bceSAndroid Build Coastguard Worker #endif // _TCUTEXLOOKUPVERIFIER_HPP 181