This patch adds a new program to the common infrastructure for MSAA
tests, ColorGradientSunburst, which draws a triangle sunburst where
the color of each triangle is a gradient.  This program will be used
to verify proper operation of MSAA when applied to color buffer
formats.
---
 tests/spec/ext_framebuffer_multisample/common.cpp |   52 +++++++++++++++++----
 tests/spec/ext_framebuffer_multisample/common.h   |   13 +++++
 2 files changed, 56 insertions(+), 9 deletions(-)

diff --git a/tests/spec/ext_framebuffer_multisample/common.cpp 
b/tests/spec/ext_framebuffer_multisample/common.cpp
index ac23683..0ded77b 100644
--- a/tests/spec/ext_framebuffer_multisample/common.cpp
+++ b/tests/spec/ext_framebuffer_multisample/common.cpp
@@ -839,11 +839,13 @@ void Points::draw(float (*proj)[4])
 
 void Sunburst::compile()
 {
-       /* Triangle coords within (-1,-1) to (1,1) rect */
-       static const float pos_within_tri[][2] = {
-               { -0.3, -0.8 },
-               {  0.0,  1.0 },
-               {  0.3, -0.8 }
+       static struct vertex_attributes {
+               float pos_within_tri[2];
+               float barycentric_coords[3];
+       } vertex_data[] = {
+               { { -0.3, -0.8 }, { 1, 0, 0 } },
+               { {  0.0,  1.0 }, { 0, 1, 0 } },
+               { {  0.3, -0.8 }, { 0, 0, 1 } }
        };
 
        /* Total number of triangles drawn */
@@ -852,6 +854,8 @@ void Sunburst::compile()
        static const char *vert =
                "#version 130\n"
                "in vec2 pos_within_tri;\n"
+               "in vec3 in_barycentric_coords;\n"
+               "out vec3 barycentric_coords;\n"
                "uniform float rotation;\n"
                "uniform float depth;\n"
                "uniform mat4 proj;\n"
@@ -862,13 +866,17 @@ void Sunburst::compile()
                "  pos = mat2(cos(rotation), sin(rotation),\n"
                "             -sin(rotation), cos(rotation)) * pos;\n"
                "  gl_Position = proj * vec4(pos, depth, 1.0);\n"
+               "  barycentric_coords = in_barycentric_coords;\n"
                "}\n";
 
        static const char *frag =
                "#version 130\n"
+               "in vec3 barycentric_coords;\n"
+               "uniform mat3x4 draw_colors;\n"
+               "\n"
                "void main()\n"
                "{\n"
-               "  gl_FragColor = vec4(0.0);\n"
+               "  gl_FragColor = draw_colors * barycentric_coords;\n"
                "}\n";
 
        /* Compile program */
@@ -878,6 +886,7 @@ void Sunburst::compile()
        GLint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, frag);
        glAttachShader(prog, fs);
        glBindAttribLocation(prog, 0, "pos_within_tri");
+       glBindAttribLocation(prog, 1, "in_barycentric_coords");
        glLinkProgram(prog);
        if (!piglit_link_check_status(prog)) {
                piglit_report_result(PIGLIT_FAIL);
@@ -889,6 +898,7 @@ void Sunburst::compile()
        depth_loc = glGetUniformLocation(prog, "depth");
        glUniform1f(depth_loc, 0.0);
        proj_loc = glGetUniformLocation(prog, "proj");
+       draw_colors_loc = glGetUniformLocation(prog, "draw_colors");
 
        /* Set up vertex array object */
        glGenVertexArrays(1, &vao);
@@ -897,11 +907,35 @@ void Sunburst::compile()
        /* Set up vertex input buffer */
        glGenBuffers(1, &vertex_buf);
        glBindBuffer(GL_ARRAY_BUFFER, vertex_buf);
-       glBufferData(GL_ARRAY_BUFFER, sizeof(pos_within_tri), pos_within_tri,
+       glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data,
                     GL_STATIC_DRAW);
        glEnableVertexAttribArray(0);
-       glVertexAttribPointer(0, ARRAY_SIZE(pos_within_tri[0]), GL_FLOAT,
-                             GL_FALSE, sizeof(pos_within_tri[0]), (void *) 0);
+       glVertexAttribPointer(0, ARRAY_SIZE(vertex_data[0].pos_within_tri),
+                             GL_FLOAT, GL_FALSE, sizeof(vertex_data[0]),
+                             (void *) 0);
+       glEnableVertexAttribArray(1);
+       glVertexAttribPointer(1, ARRAY_SIZE(vertex_data[0].barycentric_coords),
+                             GL_FLOAT, GL_FALSE, sizeof(vertex_data[0]),
+                             (void *) offsetof(vertex_attributes,
+                                               barycentric_coords));
+}
+
+void
+ColorGradientSunburst::draw(const float (*proj)[4])
+{
+       glClear(GL_COLOR_BUFFER_BIT);
+
+       glUseProgram(prog);
+       glUniformMatrix4fv(proj_loc, 1, GL_TRUE, &proj[0][0]);
+       float draw_colors[3][4] =
+               { { 1, 0, 0, 1.0 }, { 0, 1, 0, 0.5 }, { 0, 0, 1, 1.0 } };
+       glUniformMatrix3x4fv(draw_colors_loc, 1, GL_FALSE,
+                            &draw_colors[0][0]);
+       glBindVertexArray(vao);
+       for (int i = 0; i < num_tris; ++i) {
+               glUniform1f(rotation_loc, M_PI * 2.0 * i / num_tris);
+               glDrawArrays(GL_TRIANGLES, 0, 3);
+       }
 }
 
 void
diff --git a/tests/spec/ext_framebuffer_multisample/common.h 
b/tests/spec/ext_framebuffer_multisample/common.h
index 2ea3b42..1287fc0 100644
--- a/tests/spec/ext_framebuffer_multisample/common.h
+++ b/tests/spec/ext_framebuffer_multisample/common.h
@@ -251,6 +251,7 @@ protected:
        GLint rotation_loc;
        GLint depth_loc;
        GLint proj_loc;
+       GLint draw_colors_loc;
        GLuint vao;
        int num_tris;
 
@@ -259,6 +260,18 @@ private:
 };
 
 /**
+ * Program that draws a test pattern into the color buffer.
+ *
+ * This program draws triangles using a variety of colors and
+ * gradients.
+ */
+class ColorGradientSunburst : public Sunburst
+{
+public:
+       virtual void draw(const float (*proj)[4]);
+};
+
+/**
  * Program we use to draw a test pattern into the stencil buffer.
  *
  * The triangles in this sunburst are drawn back-to-front, using no
-- 
1.7.7.6

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to