[Piglit] [PATCH 10/20] msaa: Add ColorGradientSunburst program.

Paul Berry stereotype441 at gmail.com
Tue Jun 5 17:03:20 PDT 2012


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



More information about the Piglit mailing list