On Tue, Jun 5, 2012 at 5:03 PM, Paul Berry <[email protected]> wrote: > 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 >
Reviewed-by: Anuj Phogat <[email protected]> _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
