This test is meant to check whether ARB_fragment_shader_interlock
functions as expected by simulating blending behaviour via image
load/stores. The formula used is meant to be used per-pixel not
per-sample. With multisampling disabled the tests works as expected.

Signed-off-by: Plamena Manolova <plamena.manol...@intel.com>
---
 .../image-load-store.c                             | 207 ++++++++++-----------
 1 file changed, 94 insertions(+), 113 deletions(-)

diff --git a/tests/spec/arb_fragment_shader_interlock/image-load-store.c 
b/tests/spec/arb_fragment_shader_interlock/image-load-store.c
index 597bcf7d5..b9054abfa 100644
--- a/tests/spec/arb_fragment_shader_interlock/image-load-store.c
+++ b/tests/spec/arb_fragment_shader_interlock/image-load-store.c
@@ -48,9 +48,9 @@ make_fbo(void)
        GLuint fbo;
        glGenFramebuffers(1, &fbo);
        glBindFramebuffer(GL_FRAMEBUFFER, fbo );
-       glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex_frame);
+       glBindTexture(GL_TEXTURE_2D, tex_frame);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-               GL_TEXTURE_2D_MULTISAMPLE, tex_frame, 0);
+               GL_TEXTURE_2D, tex_frame, 0);
 
        return fbo;
 }
@@ -73,29 +73,17 @@ make_shader_program(void)
                "#version 430\n"
                "#extension GL_ARB_fragment_shader_interlock: require\n"
                "layout(pixel_interlock_ordered) in;\n"
-               "layout(rgba32f, binding = 0) uniform image3D img_output;\n"
+               "layout(rgba32f, binding = 0) uniform image2D img_output;\n"
                "layout(location = 1) uniform int sample_rate;\n"
                "smooth in vec4 col_vary;\n"
                "out vec4 col_out;\n"
                "void main()\n"
                "{\n"
                "       vec4 result = vec4(0.0, 0.0, 0.0, 1.0);\n"
-               "       ivec3 current_sample_coord = ivec3(gl_FragCoord.x, 
gl_FragCoord.y, gl_SampleID);\n"
-               "       ivec3 result_coord = ivec3(gl_FragCoord.x, 
gl_FragCoord.y, sample_rate);\n"
-               "       int i;\n"
+               "       ivec2 result_coord = ivec2(gl_FragCoord.x, 
gl_FragCoord.y);\n"
                "       beginInvocationInterlockARB();\n"
-               "       vec4 current_sample_color = imageLoad(img_output, 
current_sample_coord);\n"
-               "       result.rgb += col_vary.a * col_vary.rgb + (1 - 
col_vary.a) * current_sample_color.rgb;\n"
-               "       imageStore(img_output, current_sample_coord, result);\n"
-               "\n"
-               "       for (i = 0; i < sample_rate; i++) {\n"
-               "               if (i != gl_SampleID) {\n"
-               "                       ivec3 sample_coord = 
ivec3(gl_FragCoord.x, gl_FragCoord.y, i);\n"
-               "                       vec4 sample_color = 
imageLoad(img_output, sample_coord);\n"
-               "                       result.rgb += sample_color.rgb;\n"
-               "               }\n"
-               "       }\n"
-               "       result.rgb /= sample_rate;\n"
+               "       vec4 prev_frag_color = imageLoad(img_output, 
result_coord);\n"
+               "       result.rgb += col_vary.a * col_vary.rgb + (1 - 
col_vary.a) * prev_frag_color.rgb;\n"
                "       imageStore(img_output, result_coord, result);\n"
                "       endInvocationInterlockARB();\n"
                "       col_out = result;\n"
@@ -124,10 +112,10 @@ make_texture_buffer(void)
        GLuint tex;
 
        glGenTextures(1, &tex);
-       glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
-       glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2,
-               GL_RGBA32F, piglit_width, piglit_height, false);
-       glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
+       glBindTexture(GL_TEXTURE_2D, tex);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, piglit_width, piglit_height, 
0,
+               GL_RGBA, GL_FLOAT, NULL);
+       glBindTexture(GL_TEXTURE_2D, tex);
 
        return tex;
 }
@@ -139,11 +127,11 @@ make_texture_blend(void)
 
        glGenTextures(1, &tex);
        glActiveTexture(GL_TEXTURE0);
-       glBindTexture(GL_TEXTURE_3D, tex);
-       glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-       glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-       glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-       glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+       glBindTexture(GL_TEXTURE_2D, tex);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glBindImageTexture(0, tex, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
 
        return tex;
@@ -152,25 +140,25 @@ make_texture_blend(void)
 static GLuint
 make_vao(void)
 {
-       static const float pos_col[18][6] = {
-               { -1.0, -1.0, 0.0, 1.0, 0.0, 0.25 },
-               {  0.0, -1.0, 0.0, 1.0, 0.0, 0.25 },
-               {  0.0,  1.0, 0.0, 1.0, 0.0, 0.25 },
-               {  0.0,  1.0, 0.0, 1.0, 0.0, 0.25 },
-               { -1.0,  1.0, 0.0, 1.0, 0.0, 0.25 },
-               { -1.0, -1.0, 0.0, 1.0, 0.0, 0.25 },
-               { -1.0, -1.0, 1.0, 0.0, 0.0, 0.25 },
-               {  1.0, -1.0, 1.0, 0.0, 0.0, 0.25 },
-               {  1.0,  1.0, 1.0, 0.0, 0.0, 0.25 },
-               {  1.0,  1.0, 1.0, 0.0, 0.0, 0.25 },
-               { -1.0,  1.0, 1.0, 0.0, 0.0, 0.25 },
-               { -1.0, -1.0, 1.0, 0.0, 0.0, 0.25 },
-               { -1.0, -1.0, 0.0, 0.0, 1.0, 0.25 },
-               {  1.0, -1.0, 0.0, 0.0, 1.0, 0.25 },
-               {  1.0,  1.0, 0.0, 0.0, 1.0, 0.25 },
-               {  1.0,  1.0, 0.0, 0.0, 1.0, 0.25 },
-               { -1.0,  1.0, 0.0, 0.0, 1.0, 0.25 },
-               { -1.0, -1.0, 0.0, 0.0, 1.0, 0.25 }
+       static const float pos_col[18][7] = {
+               { -1.0, -1.0, -0.2, 0.0, 1.0, 0.0, 0.25 },
+               {  0.0, -1.0, -0.2, 0.0, 1.0, 0.0, 0.25 },
+               {  0.0,  1.0, -0.2, 0.0, 1.0, 0.0, 0.25 },
+               {  0.0,  1.0, -0.2, 0.0, 1.0, 0.0, 0.25 },
+               { -1.0,  1.0, -0.2, 0.0, 1.0, 0.0, 0.25 },
+               { -1.0, -1.0, -0.2, 0.0, 1.0, 0.0, 0.25 },
+               { -1.0, -1.0, -0.1, 1.0, 0.0, 0.0, 0.25 },
+               {  1.0, -1.0, -0.1, 1.0, 0.0, 0.0, 0.25 },
+               {  1.0,  1.0, -0.1, 1.0, 0.0, 0.0, 0.25 },
+               {  1.0,  1.0, -0.1, 1.0, 0.0, 0.0, 0.25 },
+               { -1.0,  1.0, -0.1, 1.0, 0.0, 0.0, 0.25 },
+               { -1.0, -1.0, -0.1, 1.0, 0.0, 0.0, 0.25 },
+               { -1.0, -1.0,  0.0, 0.0, 0.0, 1.0, 0.25 },
+               {  1.0, -1.0,  0.0, 0.0, 0.0, 1.0, 0.25 },
+               {  1.0,  1.0,  0.0, 0.0, 0.0, 1.0, 0.25 },
+               {  1.0,  1.0,  0.0, 0.0, 0.0, 1.0, 0.25 },
+               { -1.0,  1.0,  0.0, 0.0, 0.0, 1.0, 0.25 },
+               { -1.0, -1.0,  0.0, 0.0, 0.0, 1.0, 0.25 }
        };
 
        const int stride = sizeof(pos_col[0]);
@@ -183,9 +171,9 @@ make_vao(void)
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, sizeof(pos_col), pos_col, GL_STATIC_DRAW);
 
-       glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, stride, (void *) 0);
+       glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, (void *) 0);
        glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, stride,
-               (void *)(sizeof(float) * 2));
+               (void *)(sizeof(float) * 3));
 
        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);
@@ -202,9 +190,9 @@ piglit_init(int argc, char **argv)
 {
        piglit_require_extension("GL_ARB_fragment_shader_interlock");
 
-       glEnable(GL_MULTISAMPLE);
+       glEnable(GL_DEPTH_TEST);
        glDisable(GL_CULL_FACE);
-       glClearColor(0.0, 0.0, 0.0, 1.0);
+       glClearColor(0.0, 0.0, 0.0, 0.0);
 
        prog = make_shader_program();
        vao = make_vao();
@@ -216,82 +204,75 @@ piglit_init(int argc, char **argv)
 enum piglit_result
 piglit_display(void)
 {
-       int samples[4] = { 2, 4, 8, 16 };
        bool pass = true;
-       unsigned i, j, k;
+       unsigned i, j;
        const unsigned result1[4] = { 47, 35, 63, 255 };
        const unsigned result2[4] = { 47, 0, 63, 255 };
-       int max_samples;
+       GLfloat *tex_data = calloc(piglit_width * piglit_height * 16,
+               sizeof(GLfloat));
 
        glViewport(0, 0, piglit_width, piglit_height);
-       glGetIntegerv(GL_MAX_SAMPLES, &max_samples);
-
-       for (i = 0; i < 4 && samples[i] <= max_samples; i++) {
-               GLfloat *tex_data = calloc(piglit_width * piglit_height *
-                       (samples[i] + 1) * 4, sizeof(GLfloat));
-
-               glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32F, piglit_width, 
piglit_height,
-                       samples[i] + 1, 0, GL_RGBA, GL_FLOAT, tex_data);
-
-               glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
-               glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex_frame);
-               glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples[i],
-                       GL_RGBA8, piglit_width, piglit_height, false);
-               glUniform1i(1, samples[i]);
-
-               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |
-                       GL_STENCIL_BUFFER_BIT);
-
-               glUseProgram(prog);
-               glDrawArrays(GL_TRIANGLES, 0, 18);
-
-               glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
-               glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
-               glDrawBuffer(GL_BACK);
-               glBlitFramebuffer(0, 0, piglit_width, piglit_height, 0, 0, 
piglit_width,
-                       piglit_height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
-               pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
-               piglit_present_results();
-
-               glGetTexImage(GL_TEXTURE_3D, 0, GL_RGBA, GL_FLOAT, tex_data);
-               for (j = 0; j < piglit_height; j++) {
-                       for (k = 0; k < piglit_width; k++) {
-                               unsigned l = ((piglit_width * piglit_height * 
samples[i]) +
-                                       (j * piglit_width) + k) * 4;
-                               unsigned r = fabs(tex_data[l]) * 255;
-                               unsigned g = fabs(tex_data[l + 1]) * 255;
-                               unsigned b = fabs(tex_data[l + 2]) * 255;
-                               unsigned a = fabs(tex_data[l + 3]) * 255;
-
-                               if ((k < piglit_width / 2) && (r != result1[0] 
||
-                                         g != result1[1] || b != result1[2] || 
a != result1[3])) {
-                                       printf("observed %u %u     %u %u %u 
%u\n", j, k, r,
-                                               g, b, a);
-                                       printf("expected %u %u     %u %u %u 
%u\n", j, k,
-                                               result1[0], result1[1], 
result1[2], result1[3]);
-                                       pass = false;
-                                       break;
-                               }
-
-                               if ((k > piglit_width / 2) && (r != result2[0] 
||
-                                         g != result2[1] || b != result2[2] || 
a != result2[3])) {
-                                       printf("observed %u %u     %u %u %u 
%u\n", j, k, r,
-                                               g, b, a);
-                                       printf("expected %u %u     %u %u %u 
%u\n", j, k,
-                                               result1[0], result1[1], 
result1[2], result1[3]);
-                                       pass = false;
-                                       break;
-                               }
+
+       glBindTexture(GL_TEXTURE_2D, tex_blend);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, piglit_width, piglit_height, 
0,
+               GL_RGBA, GL_FLOAT, tex_data);
+
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
+       glBindTexture(GL_TEXTURE_2D, tex_frame);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, piglit_width, piglit_height, 
0,
+               GL_RGBA, GL_FLOAT, NULL);
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |
+               GL_STENCIL_BUFFER_BIT);
+
+       glUseProgram(prog);
+       glDrawArrays(GL_TRIANGLES, 0, 18);
+
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+       glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
+       glDrawBuffer(GL_BACK);
+       glBlitFramebuffer(0, 0, piglit_width, piglit_height, 0, 0, piglit_width,
+               piglit_height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+       piglit_present_results();
+
+       glBindTexture(GL_TEXTURE_2D, tex_blend);
+       glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, tex_data);
+
+       for (i = 0; i < piglit_height; i++) {
+               for (j = 0; j < piglit_width; j++) {
+                       unsigned k = (piglit_width * i + j) * 4;
+                       unsigned r = fabs(tex_data[k]) * 255;
+                       unsigned g = fabs(tex_data[k + 1]) * 255;
+                       unsigned b = fabs(tex_data[k + 2]) * 255;
+                       unsigned a = fabs(tex_data[k + 3]) * 255;
+
+                       if ((j < piglit_width / 2) && (r != result1[0] ||
+                                 g != result1[1] || b != result1[2] || a != 
result1[3])) {
+                               printf("observed %u %u     %u %u %u %u\n", i, 
j, r, g, b, a);
+                               printf("expected %u %u     %u %u %u %u\n", i, 
j, result1[0],
+                                       result1[1], result1[2], result1[3]);
+                               pass = false;
                        }
+
+                       if ((j > piglit_width / 2) && (r != result2[0] ||
+                                 g != result2[1] || b != result2[2] || a != 
result2[3])) {
+                               printf("observed %u %u     %u %u %u %u\n", i, j,
+                                       r, g, b, a);
+                               printf("expected %u %u     %u %u %u %u\n", i, 
j, result1[0],
+                                       result1[1], result1[2], result1[3]);
+                               pass = false;
+                       }
+
                        if (!pass)
                                break;
                }
 
-               free(tex_data);
-               pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
                if (!pass)
                        break;
        }
 
+       free(tex_data);
+       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
        return pass ? PIGLIT_PASS : PIGLIT_FAIL;
 }
-- 
2.11.0

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to