Fix crashes in dEQP-VK.glsl.matrix.inverse.*
authorIago Toral Quiroga <itoral@igalia.com>
Thu, 2 Feb 2017 09:09:53 +0000 (10:09 +0100)
committerPyry Haulos <phaulos@google.com>
Fri, 10 Feb 2017 21:31:31 +0000 (13:31 -0800)
This is a regression caused by altering the value of the GRID_SIZE
in commit 2ba66fa2, which results in the inverse() tests generating
input matrices which determinant is zero, and thus, cannot be
inverted, which makes the tests hit an assertion.

This patch adds a mechanism for shader tests to specify a grid size
different from the default. This allows shader testst that are
sensitive to this value, such as matrix inverse tests, to define
their own requirements.

Fixes VK-GL-CTS isssue: 66
Components: Vulkan

Affects:
dEQP-VK.glsl.matrix.inverse.*

Change-Id: I31a34c2d156ee5b98d2de1b10ac4cec1a90d480e

external/vulkancts/modules/vulkan/shaderrender/vktShaderRender.cpp
external/vulkancts/modules/vulkan/shaderrender/vktShaderRender.hpp
external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderMatrixTests.cpp

index b11d133..c1884d2 100644 (file)
@@ -58,7 +58,6 @@ using namespace vk;
 namespace
 {
 
-static const int               GRID_SIZE                       = 90;
 static const deUint32  MAX_RENDER_WIDTH        = 128;
 static const deUint32  MAX_RENDER_HEIGHT       = 128;
 static const tcu::Vec4 DEFAULT_CLEAR_COLOR     = tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f);
@@ -535,6 +534,7 @@ TestInstance* ShaderRenderCase::createInstance (Context& context) const
 ShaderRenderCaseInstance::ShaderRenderCaseInstance (Context& context)
        : vkt::TestInstance             (context)
        , m_imageBackingMode    (IMAGE_BACKING_MODE_REGULAR)
+       , m_quadGridSize                (static_cast<deUint32>(GRID_SIZE_DEFAULT_FRAGMENT))
        , m_sparseContext               (createSparseContext())
        , m_memAlloc                    (getAllocator())
        , m_clearColor                  (DEFAULT_CLEAR_COLOR)
@@ -556,9 +556,15 @@ ShaderRenderCaseInstance::ShaderRenderCaseInstance (Context&                                       context,
                                                                                                        const ShaderEvaluator&          evaluator,
                                                                                                        const UniformSetup&                     uniformSetup,
                                                                                                        const AttributeSetupFunc        attribFunc,
-                                                                                                       const ImageBackingMode          imageBackingMode)
+                                                                                                       const ImageBackingMode          imageBackingMode,
+                                                                                                       const deUint32                          gridSize)
        : vkt::TestInstance             (context)
        , m_imageBackingMode    (imageBackingMode)
+       , m_quadGridSize                (gridSize == static_cast<deUint32>(GRID_SIZE_DEFAULTS)
+                                                        ? (isVertexCase
+                                                               ? static_cast<deUint32>(GRID_SIZE_DEFAULT_VERTEX)
+                                                               : static_cast<deUint32>(GRID_SIZE_DEFAULT_FRAGMENT))
+                                                        : gridSize)
        , m_sparseContext               (createSparseContext())
        , m_memAlloc                    (getAllocator())
        , m_clearColor                  (DEFAULT_CLEAR_COLOR)
@@ -579,9 +585,15 @@ ShaderRenderCaseInstance::ShaderRenderCaseInstance (Context&                                       context,
                                                                                                        const ShaderEvaluator*          evaluator,
                                                                                                        const UniformSetup*                     uniformSetup,
                                                                                                        const AttributeSetupFunc        attribFunc,
-                                                                                                       const ImageBackingMode          imageBackingMode)
+                                                                                                       const ImageBackingMode          imageBackingMode,
+                                                                                                       const deUint32                          gridSize)
        : vkt::TestInstance             (context)
        , m_imageBackingMode    (imageBackingMode)
+       , m_quadGridSize                (gridSize == static_cast<deUint32>(GRID_SIZE_DEFAULTS)
+                                                        ? (isVertexCase
+                                                               ? static_cast<deUint32>(GRID_SIZE_DEFAULT_VERTEX)
+                                                               : static_cast<deUint32>(GRID_SIZE_DEFAULT_FRAGMENT))
+                                                        : gridSize)
        , m_sparseContext               (createSparseContext())
        , m_memAlloc                    (getAllocator())
        , m_clearColor                  (DEFAULT_CLEAR_COLOR)
@@ -737,7 +749,7 @@ tcu::TestStatus ShaderRenderCaseInstance::iterate (void)
        const int                       width                   = viewportSize.x();
        const int                       height                  = viewportSize.y();
 
-       m_quadGrid                                                      = de::MovePtr<QuadGrid>(new QuadGrid(m_isVertexCase ? GRID_SIZE : 4, width, height, getDefaultConstCoords(), m_userAttribTransforms, m_textures));
+       m_quadGrid                                                      = de::MovePtr<QuadGrid>(new QuadGrid(m_quadGridSize, width, height, getDefaultConstCoords(), m_userAttribTransforms, m_textures));
 
        // Render result.
        tcu::Surface            resImage                (width, height);
index 6d8ac05..f639cb0 100644 (file)
@@ -437,13 +437,29 @@ public:
                IMAGE_BACKING_MODE_SPARSE,
        };
 
+       // Default wertex and fragment grid sizes are used by a large collection of tests
+       // to generate input sets. Some tests might change their behavior if the
+       // default grid size values are altered, so care should be taken to confirm that
+       // any changes to default values do not produce regressions.
+       // If a particular tests needs to use a different grid size value, rather than
+       // modifying the default grid size values for all tests, it is recommended that
+       // the test specifies the required grid size using the gridSize parameter in the
+       // ShaderRenderCaseInstance constuctor instead.
+       enum
+       {
+               GRID_SIZE_DEFAULTS                      = 0,
+               GRID_SIZE_DEFAULT_VERTEX        = 90,
+               GRID_SIZE_DEFAULT_FRAGMENT      = 4,
+       };
+
                                                                                                                ShaderRenderCaseInstance        (Context&                                       context);
                                                                                                                ShaderRenderCaseInstance        (Context&                                       context,
                                                                                                                                                                        const bool                                      isVertexCase,
                                                                                                                                                                        const ShaderEvaluator&          evaluator,
                                                                                                                                                                        const UniformSetup&                     uniformSetup,
                                                                                                                                                                        const AttributeSetupFunc        attribFunc,
-                                                                                                                                                                       const ImageBackingMode          imageBackingMode = IMAGE_BACKING_MODE_REGULAR);
+                                                                                                                                                                       const ImageBackingMode          imageBackingMode = IMAGE_BACKING_MODE_REGULAR,
+                                                                                                                                                                       const deUint32                          gridSize = static_cast<deUint32>(GRID_SIZE_DEFAULTS));
 
        virtual                                                                                         ~ShaderRenderCaseInstance       (void);
        virtual tcu::TestStatus                                                         iterate                                         (void);
@@ -479,7 +495,8 @@ protected:
                                                                                                                                                                         const ShaderEvaluator*         evaluator,
                                                                                                                                                                         const UniformSetup*            uniformSetup,
                                                                                                                                                                         const AttributeSetupFunc       attribFunc,
-                                                                                                                                                                        const ImageBackingMode         imageBackingMode = IMAGE_BACKING_MODE_REGULAR);
+                                                                                                                                                                        const ImageBackingMode         imageBackingMode = IMAGE_BACKING_MODE_REGULAR,
+                                                                                                                                                                        const deUint32                         gridSize = static_cast<deUint32>(GRID_SIZE_DEFAULTS));
 
        virtual void                                                                            setup                                           (void);
        virtual void                                                                            setupUniforms                           (const tcu::Vec4& constCoords);
@@ -505,6 +522,8 @@ protected:
        bool                                                                                            isMultiSampling                         (void) const;
 
        ImageBackingMode                                                                        m_imageBackingMode;
+
+       uint32_t                                                                                        m_quadGridSize;
 private:
 
        struct SparseContext
index ea69bde..d26ce3b 100644 (file)
@@ -1411,7 +1411,7 @@ ShaderMatrixInstance::ShaderMatrixInstance (Context&                              context,
                                                                                        const ShaderInput               in0,
                                                                                        const ShaderInput               in1,
                                                                                        const MatrixOp                  op)
-       : ShaderRenderCaseInstance      (context, isVertex, evaluator, DE_NULL, DE_NULL)
+       : ShaderRenderCaseInstance      (context, isVertex, evaluator, DE_NULL, DE_NULL, IMAGE_BACKING_MODE_REGULAR, isVertex && op == OP_INVERSE ? 64 : GRID_SIZE_DEFAULTS)
        , m_in0                                         (in0)
        , m_in1                                         (in1)
        , m_op                                          (op)