GetDevices: Also allow `\.` to be part of the host name
[platform/upstream/VK-GL-CTS.git] / modules / glshared / glsTextureTestUtil.cpp
index 328104e..5966e22 100644 (file)
@@ -426,17 +426,21 @@ static inline tcu::Vec4 execSample (const tcu::Texture1DArrayView& src, const Re
                return src.sample(params.sampler, s, t, lod);
 }
 
-static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture1DView& src, const tcu::Vec4& sq, const ReferenceParams& params)
+static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture1DView& rawSrc, const tcu::Vec4& sq, const ReferenceParams& params)
 {
-       float           lodBias         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture1DView                                        src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
 
-       tcu::IVec2      dstSize         = tcu::IVec2(dst.getWidth(), dst.getHeight());
-       int                     srcSize         = src.getWidth();
+       float                                                                           lodBias                         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+
+       tcu::IVec2                                                                      dstSize                         = tcu::IVec2(dst.getWidth(), dst.getHeight());
+       int                                                                                     srcSize                         = src.getWidth();
 
        // Coordinates and lod per triangle.
-       tcu::Vec3       triS[2]         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       float           triLod[2]       = { de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0]) + lodBias, params.minLod, params.maxLod),
-                                                               de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1]) + lodBias, params.minLod, params.maxLod) };
+       tcu::Vec3                                                                       triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       float                                                                           triLod[2]                       = { de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0]) + lodBias, params.minLod, params.maxLod),
+                                                                                                                                               de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1]) + lodBias, params.minLod, params.maxLod) };
 
        for (int y = 0; y < dst.getHeight(); y++)
        {
@@ -457,18 +461,22 @@ static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Text
        }
 }
 
-static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture2DView& src, const tcu::Vec4& sq, const tcu::Vec4& tq, const ReferenceParams& params)
+static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture2DView& rawSrc, const tcu::Vec4& sq, const tcu::Vec4& tq, const ReferenceParams& params)
 {
-       float           lodBias         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture2DView                                        src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
+
+       float                                                                           lodBias                         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
 
-       tcu::IVec2      dstSize         = tcu::IVec2(dst.getWidth(), dst.getHeight());
-       tcu::IVec2      srcSize         = tcu::IVec2(src.getWidth(), src.getHeight());
+       tcu::IVec2                                                                      dstSize                         = tcu::IVec2(dst.getWidth(), dst.getHeight());
+       tcu::IVec2                                                                      srcSize                         = tcu::IVec2(src.getWidth(), src.getHeight());
 
        // Coordinates and lod per triangle.
-       tcu::Vec3       triS[2]         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       tcu::Vec3       triT[2]         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       float           triLod[2]       = { de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0], triT[0]) + lodBias, params.minLod, params.maxLod),
-                                                               de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1], triT[1]) + lodBias, params.minLod, params.maxLod) };
+       tcu::Vec3                                                                       triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       float                                                                           triLod[2]                       = { de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0], triT[0]) + lodBias, params.minLod, params.maxLod),
+                                                                                                                                               de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1], triT[1]) + lodBias, params.minLod, params.maxLod) };
 
        for (int y = 0; y < dst.getHeight(); y++)
        {
@@ -490,17 +498,21 @@ static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Text
        }
 }
 
-static void sampleTextureProjected (const SurfaceAccess& dst, const tcu::Texture1DView& src, const tcu::Vec4& sq, const ReferenceParams& params)
+static void sampleTextureProjected (const SurfaceAccess& dst, const tcu::Texture1DView& rawSrc, const tcu::Vec4& sq, const ReferenceParams& params)
 {
-       float           lodBias         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
-       float           dstW            = (float)dst.getWidth();
-       float           dstH            = (float)dst.getHeight();
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture1DView                                        src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
+
+       float                                                                           lodBias                         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+       float                                                                           dstW                            = (float)dst.getWidth();
+       float                                                                           dstH                            = (float)dst.getHeight();
 
-       tcu::Vec4       uq                      = sq * (float)src.getWidth();
+       tcu::Vec4                                                                       uq                                      = sq * (float)src.getWidth();
 
-       tcu::Vec3       triS[2]         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       tcu::Vec3       triU[2]         = { uq.swizzle(0, 1, 2), uq.swizzle(3, 2, 1) };
-       tcu::Vec3       triW[2]         = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triU[2]                         = { uq.swizzle(0, 1, 2), uq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triW[2]                         = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
 
        for (int py = 0; py < dst.getHeight(); py++)
        {
@@ -526,20 +538,24 @@ static void sampleTextureProjected (const SurfaceAccess& dst, const tcu::Texture
        }
 }
 
-static void sampleTextureProjected (const SurfaceAccess& dst, const tcu::Texture2DView& src, const tcu::Vec4& sq, const tcu::Vec4& tq, const ReferenceParams& params)
+static void sampleTextureProjected (const SurfaceAccess& dst, const tcu::Texture2DView& rawSrc, const tcu::Vec4& sq, const tcu::Vec4& tq, const ReferenceParams& params)
 {
-       float           lodBias         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
-       float           dstW            = (float)dst.getWidth();
-       float           dstH            = (float)dst.getHeight();
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture2DView                                        src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
 
-       tcu::Vec4       uq                      = sq * (float)src.getWidth();
-       tcu::Vec4       vq                      = tq * (float)src.getHeight();
+       float                                                                           lodBias                         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+       float                                                                           dstW                            = (float)dst.getWidth();
+       float                                                                           dstH                            = (float)dst.getHeight();
 
-       tcu::Vec3       triS[2]         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       tcu::Vec3       triT[2]         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       tcu::Vec3       triU[2]         = { uq.swizzle(0, 1, 2), uq.swizzle(3, 2, 1) };
-       tcu::Vec3       triV[2]         = { vq.swizzle(0, 1, 2), vq.swizzle(3, 2, 1) };
-       tcu::Vec3       triW[2]         = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
+       tcu::Vec4                                                                       uq                                      = sq * (float)src.getWidth();
+       tcu::Vec4                                                                       vq                                      = tq * (float)src.getHeight();
+
+       tcu::Vec3                                                                       triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triU[2]                         = { uq.swizzle(0, 1, 2), uq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triV[2]                         = { vq.swizzle(0, 1, 2), vq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triW[2]                         = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
 
        for (int py = 0; py < dst.getHeight(); py++)
        {
@@ -628,20 +644,24 @@ static float computeCubeLodFromDerivates (LodMode lodMode, const tcu::Vec3& coor
        }
 }
 
-static void sampleTexture (const SurfaceAccess& dst, const tcu::TextureCubeView& src, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const ReferenceParams& params)
+static void sampleTextureCube (const SurfaceAccess& dst, const tcu::TextureCubeView& rawSrc, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const ReferenceParams& params)
 {
-       const tcu::IVec2        dstSize                 = tcu::IVec2(dst.getWidth(), dst.getHeight());
-       const float                     dstW                    = float(dstSize.x());
-       const float                     dstH                    = float(dstSize.y());
-       const int                       srcSize                 = src.getSize();
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::TextureCubeView                                      src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
+
+       const tcu::IVec2                                                        dstSize                         = tcu::IVec2(dst.getWidth(), dst.getHeight());
+       const float                                                                     dstW                            = float(dstSize.x());
+       const float                                                                     dstH                            = float(dstSize.y());
+       const int                                                                       srcSize                         = src.getSize();
 
        // Coordinates per triangle.
-       const tcu::Vec3         triS[2]                 = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triT[2]                 = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triR[2]                 = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triW[2]                 = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triR[2]                         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triW[2]                         = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
 
-       const float                     lodBias                 ((params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f);
+       const float                                                                     lodBias                         ((params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f);
 
        for (int py = 0; py < dst.getHeight(); py++)
        {
@@ -680,22 +700,26 @@ void sampleTexture (const SurfaceAccess& dst, const tcu::TextureCubeView& src, c
        const tcu::Vec4                         tq              = tcu::Vec4(texCoord[0+1], texCoord[3+1], texCoord[6+1], texCoord[9+1]);
        const tcu::Vec4                         rq              = tcu::Vec4(texCoord[0+2], texCoord[3+2], texCoord[6+2], texCoord[9+2]);
 
-       return sampleTexture(dst, view, sq, tq, rq, params);
+       return sampleTextureCube(dst, view, sq, tq, rq, params);
 }
 
-static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture2DArrayView& src, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const ReferenceParams& params)
+static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture2DArrayView& rawSrc, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const ReferenceParams& params)
 {
-       float           lodBias         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture2DArrayView                           src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
+
+       float                                                                           lodBias                         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
 
-       tcu::IVec2      dstSize         = tcu::IVec2(dst.getWidth(), dst.getHeight());
-       tcu::IVec2      srcSize         = tcu::IVec2(src.getWidth(), src.getHeight());
+       tcu::IVec2                                                                      dstSize                         = tcu::IVec2(dst.getWidth(), dst.getHeight());
+       tcu::IVec2                                                                      srcSize                         = tcu::IVec2(src.getWidth(), src.getHeight());
 
        // Coordinates and lod per triangle.
-       tcu::Vec3       triS[2]         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       tcu::Vec3       triT[2]         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       tcu::Vec3       triR[2]         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
-       float           triLod[2]       = { computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0], triT[0]) + lodBias,
-                                                               computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1], triT[1]) + lodBias};
+       tcu::Vec3                                                                       triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triR[2]                         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
+       float                                                                           triLod[2]                       = { computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0], triT[0]) + lodBias,
+                                                                                                                                               computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1], triT[1]) + lodBias};
 
        for (int y = 0; y < dst.getHeight(); y++)
        {
@@ -728,18 +752,22 @@ void sampleTexture (const SurfaceAccess& dst, const tcu::Texture2DArrayView& src
        sampleTextureNonProjected(dst, src, sq, tq, rq, params);
 }
 
-static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture1DArrayView& src, const tcu::Vec4& sq, const tcu::Vec4& tq, const ReferenceParams& params)
+static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture1DArrayView& rawSrc, const tcu::Vec4& sq, const tcu::Vec4& tq, const ReferenceParams& params)
 {
-       float           lodBias         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture1DArrayView                           src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
 
-       tcu::IVec2      dstSize         = tcu::IVec2(dst.getWidth(), dst.getHeight());
-       deInt32         srcSize         = src.getWidth();
+       float                                                                           lodBias                         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+
+       tcu::IVec2                                                                      dstSize                         = tcu::IVec2(dst.getWidth(), dst.getHeight());
+       deInt32                                                                         srcSize                         = src.getWidth();
 
        // Coordinates and lod per triangle.
-       tcu::Vec3       triS[2]         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       tcu::Vec3       triT[2]         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       float           triLod[2]       = { computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0]) + lodBias,
-                                                               computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1]) + lodBias};
+       tcu::Vec3                                                                       triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       float                                                                           triLod[2]                       = { computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0]) + lodBias,
+                                                                                                                                               computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1]) + lodBias};
 
        for (int y = 0; y < dst.getHeight(); y++)
        {
@@ -770,19 +798,23 @@ void sampleTexture (const SurfaceAccess& dst, const tcu::Texture1DArrayView& src
        sampleTextureNonProjected(dst, src, sq, tq, params);
 }
 
-static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture3DView& src, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const ReferenceParams& params)
+static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Texture3DView& rawSrc, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const ReferenceParams& params)
 {
-       float           lodBias         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture3DView                                        src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
+
+       float                                                                           lodBias                         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
 
-       tcu::IVec2      dstSize         = tcu::IVec2(dst.getWidth(), dst.getHeight());
-       tcu::IVec3      srcSize         = tcu::IVec3(src.getWidth(), src.getHeight(), src.getDepth());
+       tcu::IVec2                                                                      dstSize                         = tcu::IVec2(dst.getWidth(), dst.getHeight());
+       tcu::IVec3                                                                      srcSize                         = tcu::IVec3(src.getWidth(), src.getHeight(), src.getDepth());
 
        // Coordinates and lod per triangle.
-       tcu::Vec3       triS[2]         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       tcu::Vec3       triT[2]         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       tcu::Vec3       triR[2]         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
-       float           triLod[2]       = { de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0], triT[0], triR[0]) + lodBias, params.minLod, params.maxLod),
-                                                               de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1], triT[1], triR[1]) + lodBias, params.minLod, params.maxLod) };
+       tcu::Vec3                                                                       triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triR[2]                         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
+       float                                                                           triLod[2]                       = { de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[0], triT[0], triR[0]) + lodBias, params.minLod, params.maxLod),
+                                                                                                                                               de::clamp(computeNonProjectedTriLod(params.lodMode, dstSize, srcSize, triS[1], triT[1], triR[1]) + lodBias, params.minLod, params.maxLod) };
 
        for (int y = 0; y < dst.getHeight(); y++)
        {
@@ -805,23 +837,27 @@ static void sampleTextureNonProjected (const SurfaceAccess& dst, const tcu::Text
        }
 }
 
-static void sampleTextureProjected (const SurfaceAccess& dst, const tcu::Texture3DView& src, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const ReferenceParams& params)
+static void sampleTextureProjected (const SurfaceAccess& dst, const tcu::Texture3DView& rawSrc, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const ReferenceParams& params)
 {
-       float           lodBias         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
-       float           dstW            = (float)dst.getWidth();
-       float           dstH            = (float)dst.getHeight();
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture3DView                                        src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
+
+       float                                                                           lodBias                         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+       float                                                                           dstW                            = (float)dst.getWidth();
+       float                                                                           dstH                            = (float)dst.getHeight();
 
-       tcu::Vec4       uq                      = sq * (float)src.getWidth();
-       tcu::Vec4       vq                      = tq * (float)src.getHeight();
-       tcu::Vec4       wq                      = rq * (float)src.getDepth();
+       tcu::Vec4                                                                       uq                                      = sq * (float)src.getWidth();
+       tcu::Vec4                                                                       vq                                      = tq * (float)src.getHeight();
+       tcu::Vec4                                                                       wq                                      = rq * (float)src.getDepth();
 
-       tcu::Vec3       triS[2]         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       tcu::Vec3       triT[2]         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       tcu::Vec3       triR[2]         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
-       tcu::Vec3       triU[2]         = { uq.swizzle(0, 1, 2), uq.swizzle(3, 2, 1) };
-       tcu::Vec3       triV[2]         = { vq.swizzle(0, 1, 2), vq.swizzle(3, 2, 1) };
-       tcu::Vec3       triW[2]         = { wq.swizzle(0, 1, 2), wq.swizzle(3, 2, 1) };
-       tcu::Vec3       triP[2]         = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triR[2]                         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triU[2]                         = { uq.swizzle(0, 1, 2), uq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triV[2]                         = { vq.swizzle(0, 1, 2), vq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triW[2]                         = { wq.swizzle(0, 1, 2), wq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triP[2]                         = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
 
        for (int py = 0; py < dst.getHeight(); py++)
        {
@@ -862,19 +898,23 @@ void sampleTexture (const SurfaceAccess& dst, const tcu::Texture3DView& src, con
                sampleTextureNonProjected(dst, view, sq, tq, rq, params);
 }
 
-static void sampleTexture (const SurfaceAccess& dst, const tcu::TextureCubeArrayView& src, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const tcu::Vec4& qq, const ReferenceParams& params)
+static void sampleTextureCubeArray (const SurfaceAccess& dst, const tcu::TextureCubeArrayView& rawSrc, const tcu::Vec4& sq, const tcu::Vec4& tq, const tcu::Vec4& rq, const tcu::Vec4& qq, const ReferenceParams& params)
 {
-       const float             dstW    = (float)dst.getWidth();
-       const float             dstH    = (float)dst.getHeight();
+       // Separate combined DS formats
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::TextureCubeArrayView                         src                                     = getEffectiveTextureView(rawSrc, srcLevelStorage, params.sampler);
+
+       const float                                                                     dstW                            = (float)dst.getWidth();
+       const float                                                                     dstH                            = (float)dst.getHeight();
 
        // Coordinates per triangle.
-       tcu::Vec3               triS[2] = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       tcu::Vec3               triT[2] = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       tcu::Vec3               triR[2] = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
-       tcu::Vec3               triQ[2] = { qq.swizzle(0, 1, 2), qq.swizzle(3, 2, 1) };
-       const tcu::Vec3 triW[2] = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triR[2]                         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
+       tcu::Vec3                                                                       triQ[2]                         = { qq.swizzle(0, 1, 2), qq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triW[2]                         = { params.w.swizzle(0, 1, 2), params.w.swizzle(3, 2, 1) };
 
-       const float             lodBias = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
+       const float                                                                     lodBias                         = (params.flags & ReferenceParams::USE_BIAS) ? params.bias : 0.0f;
 
        for (int py = 0; py < dst.getHeight(); py++)
        {
@@ -916,7 +956,7 @@ void sampleTexture (const SurfaceAccess& dst, const tcu::TextureCubeArrayView& s
        tcu::Vec4 rq = tcu::Vec4(texCoord[0+2], texCoord[4+2], texCoord[8+2], texCoord[12+2]);
        tcu::Vec4 qq = tcu::Vec4(texCoord[0+3], texCoord[4+3], texCoord[8+3], texCoord[12+3]);
 
-       sampleTexture(dst, src, sq, tq, rq, qq, params);
+       sampleTextureCubeArray(dst, src, sq, tq, rq, qq, params);
 }
 
 void fetchTexture (const SurfaceAccess& dst, const tcu::ConstPixelBufferAccess& src, const float* texCoord, const tcu::Vec4& colorScale, const tcu::Vec4& colorBias)
@@ -1666,22 +1706,23 @@ int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&        result,
        DE_ASSERT(result.getWidth() == reference.getWidth() && result.getHeight() == reference.getHeight());
        DE_ASSERT(result.getWidth() == errorMask.getWidth() && result.getHeight() == errorMask.getHeight());
 
-       const tcu::Texture1DView        src             = getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel);
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture1DView                                        src                                     = getEffectiveTextureView(getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel), srcLevelStorage, sampleParams.sampler);
 
-       const tcu::Vec4         sq                              = tcu::Vec4(texCoord[0], texCoord[1], texCoord[2], texCoord[3]);
+       const tcu::Vec4                                                         sq                                      = tcu::Vec4(texCoord[0], texCoord[1], texCoord[2], texCoord[3]);
 
-       const tcu::IVec2        dstSize                 = tcu::IVec2(result.getWidth(), result.getHeight());
-       const float                     dstW                    = float(dstSize.x());
-       const float                     dstH                    = float(dstSize.y());
-       const int                       srcSize                 = src.getWidth();
+       const tcu::IVec2                                                        dstSize                         = tcu::IVec2(result.getWidth(), result.getHeight());
+       const float                                                                     dstW                            = float(dstSize.x());
+       const float                                                                     dstH                            = float(dstSize.y());
+       const int                                                                       srcSize                         = src.getWidth();
 
        // Coordinates and lod per triangle.
-       const tcu::Vec3         triS[2]                 = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triW[2]                 = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triW[2]                         = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
 
-       const tcu::Vec2         lodBias                 ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
+       const tcu::Vec2                                                         lodBias                         ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
 
-       int                                     numFailed               = 0;
+       int                                                                                     numFailed                       = 0;
 
        const tcu::Vec2 lodOffsets[] =
        {
@@ -1760,7 +1801,7 @@ int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&  result,
                                                          const tcu::PixelBufferAccess&                 errorMask,
                                                          const tcu::Texture2DView&                             baseView,
                                                          const float*                                                  texCoord,
-                                                         const ReferenceParams&                                        sampleParams,
+                                                         const ReferenceParams&                                sampleParams,
                                                          const tcu::LookupPrecision&                   lookupPrec,
                                                          const tcu::LodPrecision&                              lodPrec,
                                                          qpWatchDog*                                                   watchDog)
@@ -1768,24 +1809,25 @@ int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&        result,
        DE_ASSERT(result.getWidth() == reference.getWidth() && result.getHeight() == reference.getHeight());
        DE_ASSERT(result.getWidth() == errorMask.getWidth() && result.getHeight() == errorMask.getHeight());
 
-       const tcu::Texture2DView        src             = getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel);
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture2DView                                        src                                     = getEffectiveTextureView(getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel), srcLevelStorage, sampleParams.sampler);
 
-       const tcu::Vec4         sq                              = tcu::Vec4(texCoord[0+0], texCoord[2+0], texCoord[4+0], texCoord[6+0]);
-       const tcu::Vec4         tq                              = tcu::Vec4(texCoord[0+1], texCoord[2+1], texCoord[4+1], texCoord[6+1]);
+       const tcu::Vec4                                                         sq                                      = tcu::Vec4(texCoord[0+0], texCoord[2+0], texCoord[4+0], texCoord[6+0]);
+       const tcu::Vec4                                                         tq                                      = tcu::Vec4(texCoord[0+1], texCoord[2+1], texCoord[4+1], texCoord[6+1]);
 
-       const tcu::IVec2        dstSize                 = tcu::IVec2(result.getWidth(), result.getHeight());
-       const float                     dstW                    = float(dstSize.x());
-       const float                     dstH                    = float(dstSize.y());
-       const tcu::IVec2        srcSize                 = tcu::IVec2(src.getWidth(), src.getHeight());
+       const tcu::IVec2                                                        dstSize                         = tcu::IVec2(result.getWidth(), result.getHeight());
+       const float                                                                     dstW                            = float(dstSize.x());
+       const float                                                                     dstH                            = float(dstSize.y());
+       const tcu::IVec2                                                        srcSize                         = tcu::IVec2(src.getWidth(), src.getHeight());
 
        // Coordinates and lod per triangle.
-       const tcu::Vec3         triS[2]                 = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triT[2]                 = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triW[2]                 = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triW[2]                         = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
 
-       const tcu::Vec2         lodBias                 ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
+       const tcu::Vec2                                                         lodBias                         ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
 
-       int                                     numFailed               = 0;
+       int                                                                                     numFailed                       = 0;
 
        const tcu::Vec2 lodOffsets[] =
        {
@@ -1950,28 +1992,29 @@ int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&        result,
        DE_ASSERT(result.getWidth() == reference.getWidth() && result.getHeight() == reference.getHeight());
        DE_ASSERT(result.getWidth() == errorMask.getWidth() && result.getHeight() == errorMask.getHeight());
 
-       const tcu::TextureCubeView      src             = getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel);
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::TextureCubeView                                      src                                     = getEffectiveTextureView(getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel), srcLevelStorage, sampleParams.sampler);
 
-       const tcu::Vec4         sq                              = tcu::Vec4(texCoord[0+0], texCoord[3+0], texCoord[6+0], texCoord[9+0]);
-       const tcu::Vec4         tq                              = tcu::Vec4(texCoord[0+1], texCoord[3+1], texCoord[6+1], texCoord[9+1]);
-       const tcu::Vec4         rq                              = tcu::Vec4(texCoord[0+2], texCoord[3+2], texCoord[6+2], texCoord[9+2]);
+       const tcu::Vec4                                                         sq                                      = tcu::Vec4(texCoord[0+0], texCoord[3+0], texCoord[6+0], texCoord[9+0]);
+       const tcu::Vec4                                                         tq                                      = tcu::Vec4(texCoord[0+1], texCoord[3+1], texCoord[6+1], texCoord[9+1]);
+       const tcu::Vec4                                                         rq                                      = tcu::Vec4(texCoord[0+2], texCoord[3+2], texCoord[6+2], texCoord[9+2]);
 
-       const tcu::IVec2        dstSize                 = tcu::IVec2(result.getWidth(), result.getHeight());
-       const float                     dstW                    = float(dstSize.x());
-       const float                     dstH                    = float(dstSize.y());
-       const int                       srcSize                 = src.getSize();
+       const tcu::IVec2                                                        dstSize                         = tcu::IVec2(result.getWidth(), result.getHeight());
+       const float                                                                     dstW                            = float(dstSize.x());
+       const float                                                                     dstH                            = float(dstSize.y());
+       const int                                                                       srcSize                         = src.getSize();
 
        // Coordinates per triangle.
-       const tcu::Vec3         triS[2]                 = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triT[2]                 = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triR[2]                 = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triW[2]                 = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triR[2]                         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triW[2]                         = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
 
-       const tcu::Vec2         lodBias                 ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
+       const tcu::Vec2                                                         lodBias                         ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
 
-       const float                     posEps                  = 1.0f / float(1<<MIN_SUBPIXEL_BITS);
+       const float                                                                     posEps                          = 1.0f / float(1<<MIN_SUBPIXEL_BITS);
 
-       int                                     numFailed               = 0;
+       int                                                                                     numFailed                       = 0;
 
        const tcu::Vec2 lodOffsets[] =
        {
@@ -2129,28 +2172,29 @@ int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&        result,
        DE_ASSERT(result.getWidth() == reference.getWidth() && result.getHeight() == reference.getHeight());
        DE_ASSERT(result.getWidth() == errorMask.getWidth() && result.getHeight() == errorMask.getHeight());
 
-       const tcu::Texture3DView        src             = getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel);
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture3DView                                        src                                     = getEffectiveTextureView(getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel), srcLevelStorage, sampleParams.sampler);
 
-       const tcu::Vec4         sq                              = tcu::Vec4(texCoord[0+0], texCoord[3+0], texCoord[6+0], texCoord[9+0]);
-       const tcu::Vec4         tq                              = tcu::Vec4(texCoord[0+1], texCoord[3+1], texCoord[6+1], texCoord[9+1]);
-       const tcu::Vec4         rq                              = tcu::Vec4(texCoord[0+2], texCoord[3+2], texCoord[6+2], texCoord[9+2]);
+       const tcu::Vec4                                                         sq                                      = tcu::Vec4(texCoord[0+0], texCoord[3+0], texCoord[6+0], texCoord[9+0]);
+       const tcu::Vec4                                                         tq                                      = tcu::Vec4(texCoord[0+1], texCoord[3+1], texCoord[6+1], texCoord[9+1]);
+       const tcu::Vec4                                                         rq                                      = tcu::Vec4(texCoord[0+2], texCoord[3+2], texCoord[6+2], texCoord[9+2]);
 
-       const tcu::IVec2        dstSize                 = tcu::IVec2(result.getWidth(), result.getHeight());
-       const float                     dstW                    = float(dstSize.x());
-       const float                     dstH                    = float(dstSize.y());
-       const tcu::IVec3        srcSize                 = tcu::IVec3(src.getWidth(), src.getHeight(), src.getDepth());
+       const tcu::IVec2                                                        dstSize                         = tcu::IVec2(result.getWidth(), result.getHeight());
+       const float                                                                     dstW                            = float(dstSize.x());
+       const float                                                                     dstH                            = float(dstSize.y());
+       const tcu::IVec3                                                        srcSize                         = tcu::IVec3(src.getWidth(), src.getHeight(), src.getDepth());
 
        // Coordinates and lod per triangle.
-       const tcu::Vec3         triS[2]                 = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triT[2]                 = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triR[2]                 = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triW[2]                 = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triR[2]                         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triW[2]                         = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
 
-       const tcu::Vec2         lodBias                 ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
+       const tcu::Vec2                                                         lodBias                         ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
 
-       const float                     posEps                  = 1.0f / float(1<<MIN_SUBPIXEL_BITS);
+       const float                                                                     posEps                          = 1.0f / float(1<<MIN_SUBPIXEL_BITS);
 
-       int                                     numFailed               = 0;
+       int                                                                                     numFailed                       = 0;
 
        const tcu::Vec2 lodOffsets[] =
        {
@@ -2289,7 +2333,7 @@ bool verifyTextureResult (tcu::TestContext&                                               testCtx,
 int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&       result,
                                                          const tcu::ConstPixelBufferAccess&    reference,
                                                          const tcu::PixelBufferAccess&                 errorMask,
-                                                         const tcu::Texture1DArrayView&                src,
+                                                         const tcu::Texture1DArrayView&                baseView,
                                                          const float*                                                  texCoord,
                                                          const ReferenceParams&                                sampleParams,
                                                          const tcu::LookupPrecision&                   lookupPrec,
@@ -2299,22 +2343,25 @@ int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&        result,
        DE_ASSERT(result.getWidth() == reference.getWidth() && result.getHeight() == reference.getHeight());
        DE_ASSERT(result.getWidth() == errorMask.getWidth() && result.getHeight() == errorMask.getHeight());
 
-       const tcu::Vec4         sq                              = tcu::Vec4(texCoord[0+0], texCoord[2+0], texCoord[4+0], texCoord[6+0]);
-       const tcu::Vec4         tq                              = tcu::Vec4(texCoord[0+1], texCoord[2+1], texCoord[4+1], texCoord[6+1]);
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture1DArrayView                           src                                     = getEffectiveTextureView(baseView, srcLevelStorage, sampleParams.sampler);
 
-       const tcu::IVec2        dstSize                 = tcu::IVec2(result.getWidth(), result.getHeight());
-       const float                     dstW                    = float(dstSize.x());
-       const float                     dstH                    = float(dstSize.y());
-       const float                     srcSize                 = float(src.getWidth()); // For lod computation, thus #layers is ignored.
+       const tcu::Vec4                                                         sq                                      = tcu::Vec4(texCoord[0+0], texCoord[2+0], texCoord[4+0], texCoord[6+0]);
+       const tcu::Vec4                                                         tq                                      = tcu::Vec4(texCoord[0+1], texCoord[2+1], texCoord[4+1], texCoord[6+1]);
+
+       const tcu::IVec2                                                        dstSize                         = tcu::IVec2(result.getWidth(), result.getHeight());
+       const float                                                                     dstW                            = float(dstSize.x());
+       const float                                                                     dstH                            = float(dstSize.y());
+       const float                                                                     srcSize                         = float(src.getWidth()); // For lod computation, thus #layers is ignored.
 
        // Coordinates and lod per triangle.
-       const tcu::Vec3         triS[2]                 = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triT[2]                 = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triW[2]                 = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triW[2]                         = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
 
-       const tcu::Vec2         lodBias                 ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
+       const tcu::Vec2                                                         lodBias                         ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
 
-       int                                     numFailed               = 0;
+       int                                                                                     numFailed                       = 0;
 
        const tcu::Vec2 lodOffsets[] =
        {
@@ -2393,7 +2440,7 @@ int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&  result,
 int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&       result,
                                                          const tcu::ConstPixelBufferAccess&    reference,
                                                          const tcu::PixelBufferAccess&                 errorMask,
-                                                         const tcu::Texture2DArrayView&                src,
+                                                         const tcu::Texture2DArrayView&                baseView,
                                                          const float*                                                  texCoord,
                                                          const ReferenceParams&                                sampleParams,
                                                          const tcu::LookupPrecision&                   lookupPrec,
@@ -2403,24 +2450,27 @@ int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&        result,
        DE_ASSERT(result.getWidth() == reference.getWidth() && result.getHeight() == reference.getHeight());
        DE_ASSERT(result.getWidth() == errorMask.getWidth() && result.getHeight() == errorMask.getHeight());
 
-       const tcu::Vec4         sq                              = tcu::Vec4(texCoord[0+0], texCoord[3+0], texCoord[6+0], texCoord[9+0]);
-       const tcu::Vec4         tq                              = tcu::Vec4(texCoord[0+1], texCoord[3+1], texCoord[6+1], texCoord[9+1]);
-       const tcu::Vec4         rq                              = tcu::Vec4(texCoord[0+2], texCoord[3+2], texCoord[6+2], texCoord[9+2]);
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::Texture2DArrayView                           src                                     = getEffectiveTextureView(baseView, srcLevelStorage, sampleParams.sampler);
 
-       const tcu::IVec2        dstSize                 = tcu::IVec2(result.getWidth(), result.getHeight());
-       const float                     dstW                    = float(dstSize.x());
-       const float                     dstH                    = float(dstSize.y());
-       const tcu::Vec2         srcSize                 = tcu::IVec2(src.getWidth(), src.getHeight()).asFloat(); // For lod computation, thus #layers is ignored.
+       const tcu::Vec4                                                         sq                                      = tcu::Vec4(texCoord[0+0], texCoord[3+0], texCoord[6+0], texCoord[9+0]);
+       const tcu::Vec4                                                         tq                                      = tcu::Vec4(texCoord[0+1], texCoord[3+1], texCoord[6+1], texCoord[9+1]);
+       const tcu::Vec4                                                         rq                                      = tcu::Vec4(texCoord[0+2], texCoord[3+2], texCoord[6+2], texCoord[9+2]);
+
+       const tcu::IVec2                                                        dstSize                         = tcu::IVec2(result.getWidth(), result.getHeight());
+       const float                                                                     dstW                            = float(dstSize.x());
+       const float                                                                     dstH                            = float(dstSize.y());
+       const tcu::Vec2                                                         srcSize                         = tcu::IVec2(src.getWidth(), src.getHeight()).asFloat(); // For lod computation, thus #layers is ignored.
 
        // Coordinates and lod per triangle.
-       const tcu::Vec3         triS[2]                 = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triT[2]                 = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triR[2]                 = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triW[2]                 = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triR[2]                         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triW[2]                         = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
 
-       const tcu::Vec2         lodBias                 ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
+       const tcu::Vec2                                                         lodBias                         ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
 
-       int                                     numFailed               = 0;
+       int                                                                                     numFailed                       = 0;
 
        const tcu::Vec2 lodOffsets[] =
        {
@@ -2587,31 +2637,31 @@ int computeTextureLookupDiff (const tcu::ConstPixelBufferAccess&        result,
        DE_ASSERT(result.getWidth() == reference.getWidth() && result.getHeight() == reference.getHeight());
        DE_ASSERT(result.getWidth() == errorMask.getWidth() && result.getHeight() == errorMask.getHeight());
 
-       const tcu::TextureCubeArrayView src     = getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel);
+       std::vector<tcu::ConstPixelBufferAccess>        srcLevelStorage;
+       const tcu::TextureCubeArrayView                         src                                     = getEffectiveTextureView(getSubView(baseView, sampleParams.baseLevel, sampleParams.maxLevel), srcLevelStorage, sampleParams.sampler);
 
-       // What is the 'q' in all these names? Also a two char name for something that is in scope for ~120 lines and only used twice each seems excessive
-       const tcu::Vec4         sq                              = tcu::Vec4(texCoord[0+0], texCoord[4+0], texCoord[8+0], texCoord[12+0]);
-       const tcu::Vec4         tq                              = tcu::Vec4(texCoord[0+1], texCoord[4+1], texCoord[8+1], texCoord[12+1]);
-       const tcu::Vec4         rq                              = tcu::Vec4(texCoord[0+2], texCoord[4+2], texCoord[8+2], texCoord[12+2]);
-       const tcu::Vec4         qq                              = tcu::Vec4(texCoord[0+3], texCoord[4+3], texCoord[8+3], texCoord[12+3]);
+       const tcu::Vec4                                                         sq                                      = tcu::Vec4(texCoord[0+0], texCoord[4+0], texCoord[8+0], texCoord[12+0]);
+       const tcu::Vec4                                                         tq                                      = tcu::Vec4(texCoord[0+1], texCoord[4+1], texCoord[8+1], texCoord[12+1]);
+       const tcu::Vec4                                                         rq                                      = tcu::Vec4(texCoord[0+2], texCoord[4+2], texCoord[8+2], texCoord[12+2]);
+       const tcu::Vec4                                                         qq                                      = tcu::Vec4(texCoord[0+3], texCoord[4+3], texCoord[8+3], texCoord[12+3]);
 
-       const tcu::IVec2        dstSize                 = tcu::IVec2(result.getWidth(), result.getHeight());
-       const float                     dstW                    = float(dstSize.x());
-       const float                     dstH                    = float(dstSize.y());
-       const int                       srcSize                 = src.getSize();
+       const tcu::IVec2                                                        dstSize                         = tcu::IVec2(result.getWidth(), result.getHeight());
+       const float                                                                     dstW                            = float(dstSize.x());
+       const float                                                                     dstH                            = float(dstSize.y());
+       const int                                                                       srcSize                         = src.getSize();
 
        // Coordinates per triangle.
-       const tcu::Vec3         triS[2]                 = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triT[2]                 = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triR[2]                 = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triQ[2]                 = { qq.swizzle(0, 1, 2), qq.swizzle(3, 2, 1) };
-       const tcu::Vec3         triW[2]                 = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triS[2]                         = { sq.swizzle(0, 1, 2), sq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triT[2]                         = { tq.swizzle(0, 1, 2), tq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triR[2]                         = { rq.swizzle(0, 1, 2), rq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triQ[2]                         = { qq.swizzle(0, 1, 2), qq.swizzle(3, 2, 1) };
+       const tcu::Vec3                                                         triW[2]                         = { sampleParams.w.swizzle(0, 1, 2), sampleParams.w.swizzle(3, 2, 1) };
 
-       const tcu::Vec2         lodBias                 ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
+       const tcu::Vec2                                                         lodBias                         ((sampleParams.flags & ReferenceParams::USE_BIAS) ? sampleParams.bias : 0.0f);
 
-       const float                     posEps                  = 1.0f / float((1<<4) + 1); // ES3 requires at least 4 subpixel bits.
+       const float                                                                     posEps                          = 1.0f / float((1<<4) + 1); // ES3 requires at least 4 subpixel bits.
 
-       int                                     numFailed               = 0;
+       int                                                                                     numFailed                       = 0;
 
        const tcu::Vec2 lodOffsets[] =
        {
@@ -2814,6 +2864,9 @@ int computeTextureCompareDiff (const tcu::ConstPixelBufferAccess& result,
                                continue;
                        }
 
+                       // Reference result is known to be a valid result, we can
+                       // skip verification if thes results are equal
+                       if (resPix.x() != refPix.x())
                        {
                                const float             wx              = (float)px + 0.5f;
                                const float             wy              = (float)py + 0.5f;
@@ -2917,6 +2970,7 @@ int computeTextureCompareDiff (const tcu::ConstPixelBufferAccess& result,
                        const tcu::Vec4 resPix  = result.getPixel(px, py);
                        const tcu::Vec4 refPix  = reference.getPixel(px, py);
 
+                       // Other channels should trivially match to reference.
                        if (!tcu::boolAll(tcu::lessThanEqual(tcu::abs(refPix.swizzle(1,2,3) - resPix.swizzle(1,2,3)), nonShadowThreshold)))
                        {
                                errorMask.setPixel(tcu::RGBA::red.toVec(), px, py);
@@ -2924,6 +2978,9 @@ int computeTextureCompareDiff (const tcu::ConstPixelBufferAccess& result,
                                continue;
                        }
 
+                       // Reference result is known to be a valid result, we can
+                       // skip verification if thes results are equal
+                       if (resPix.x() != refPix.x())
                        {
                                const float             wx              = (float)px + 0.5f;
                                const float             wy              = (float)py + 0.5f;
@@ -3035,6 +3092,7 @@ int computeTextureCompareDiff (const tcu::ConstPixelBufferAccess& result,
                        const tcu::Vec4 resPix  = result.getPixel(px, py);
                        const tcu::Vec4 refPix  = reference.getPixel(px, py);
 
+                       // Other channels should trivially match to reference.
                        if (!tcu::boolAll(tcu::lessThanEqual(tcu::abs(refPix.swizzle(1,2,3) - resPix.swizzle(1,2,3)), nonShadowThreshold)))
                        {
                                errorMask.setPixel(tcu::RGBA::red.toVec(), px, py);
@@ -3042,6 +3100,9 @@ int computeTextureCompareDiff (const tcu::ConstPixelBufferAccess& result,
                                continue;
                        }
 
+                       // Reference result is known to be a valid result, we can
+                       // skip verification if thes results are equal
+                       if (resPix.x() != refPix.x())
                        {
                                const float             wx              = (float)px + 0.5f;
                                const float             wy              = (float)py + 0.5f;