Fix precision issue in MS interpolation test
authorMaciej Jesionowski <maciej.jesionowski@mobica.com>
Wed, 21 Sep 2016 10:05:47 +0000 (12:05 +0200)
committerMaciej Jesionowski <maciej.jesionowski@mobica.com>
Wed, 21 Sep 2016 10:07:55 +0000 (12:07 +0200)
Modified test:
- dEQP-VK.pipeline.multisample_interpolation.offset_interpolate_at_pixel_center.*

Fixes #494

Change-Id: I608294bf190bb50292fa4d7dd72e0f6b18dac3ee

external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp

index b7070d6..63a1bb1 100644 (file)
@@ -1445,24 +1445,29 @@ void MSCaseInterpolateAtOffsetPixelCenter::initPrograms (vk::SourceCollections&
        std::ostringstream fs;
 
        fs << "#version 440\n"
-               << "layout(location = 0) in vec2 fs_in_pos_screen;\n"
-               << "layout(location = 1) in vec2 fs_in_offset;\n"
+               << "layout(location = 0) in  vec2 fs_in_pos_screen;\n"
+               << "layout(location = 1) in  vec2 fs_in_offset;\n"
                << "\n"
                << "layout(location = 0) out vec2 fs_out_color;\n"
                << "\n"
                << "void main (void)\n"
                << "{\n"
-               << "    const float threshold = 0.15625;\n"
+               << "    const vec2  frag_center = interpolateAtOffset(fs_in_pos_screen, vec2(0.0));\n"
+               << "    const vec2  center_diff = abs(frag_center - fs_in_pos_screen);\n"
+               << "    const float threshold   = 0.125;\n"
+               << "    bool        valuesEqual = false;\n"
                << "\n"
-               << "    const vec2 pos_interpolated_at_offset = interpolateAtOffset(fs_in_pos_screen, fs_in_offset);\n"
-               << "    const vec2 pixel_center                           = floor(fs_in_pos_screen) + vec2(0.5, 0.5);\n"
-               << "    const vec2 reference_value                        = pixel_center + fs_in_offset;\n"
-               << "    const bool valuesEqual                            = all(lessThan(abs(pos_interpolated_at_offset - reference_value), vec2(threshold)));\n"
+               << "    if (all(lessThan(center_diff, vec2(0.5 + threshold)))) {\n"
+               << "        const vec2 pos_interpolated_at_offset = interpolateAtOffset(fs_in_pos_screen, fs_in_offset);\n"
+               << "        const vec2 reference_value            = frag_center + fs_in_offset;\n"
                << "\n"
-               << "    if (valuesEqual)\n"
-               << "            fs_out_color = vec2(0.0, 1.0);\n"
-               << "    else\n"
-               << "            fs_out_color = vec2(1.0, 0.0);\n"
+               << "        valuesEqual = all(lessThan(abs(pos_interpolated_at_offset - reference_value), vec2(threshold)));\n"
+               << "    }\n"
+               << "\n"
+               << "    if (valuesEqual)\n"
+               << "        fs_out_color = vec2(0.0, 1.0);\n"
+               << "    else\n"
+               << "        fs_out_color = vec2(1.0, 0.0);\n"
                << "}\n";
 
        programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());