[Piglit] [PATCH 02/16] msaa: Make it possible to change output type when drawing sunbursts.
Anuj Phogat
anuj.phogat at gmail.com
Thu Jun 21 18:11:08 PDT 2012
On Fri, Jun 15, 2012 at 8:32 AM, Paul Berry <stereotype441 at gmail.com> wrote:
> In order to test that MSAA works properly for integer framebuffers, we
> will need to be able to output ivec4 and uvec4 types when rendering
> the test image. This patch makes that possible by adapting the
> Sunburst GLSL program so that it can be compiled to output ivec4's,
> uvec4's, or vec4's.
> ---
> tests/spec/ext_framebuffer_multisample/common.cpp | 50 +++++++++++++++++++-
> tests/spec/ext_framebuffer_multisample/common.h | 20 ++++++++
> tests/spec/ext_framebuffer_multisample/formats.cpp | 2 +-
> 3 files changed, 69 insertions(+), 3 deletions(-)
>
> diff --git a/tests/spec/ext_framebuffer_multisample/common.cpp b/tests/spec/ext_framebuffer_multisample/common.cpp
> index 982d991..ff1ca7f 100644
> --- a/tests/spec/ext_framebuffer_multisample/common.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/common.cpp
> @@ -880,6 +880,36 @@ void Points::draw(const float (*proj)[4])
> }
> }
>
> +Sunburst::Sunburst()
> + : out_type(GL_UNSIGNED_NORMALIZED)
> +{
> +}
> +
> +
> +/**
> + * Determine the GLSL type that should be used for rendering, based on
> + * out_type.
> + */
> +const char *
> +Sunburst::get_out_type_glsl() const
> +{
> + switch(out_type) {
> + case GL_INT:
> + return "ivec4";
> + case GL_UNSIGNED_INT:
> + return "uvec4";
> + case GL_UNSIGNED_NORMALIZED:
> + case GL_FLOAT:
> + return "vec4";
> + default:
> + printf("Unrecognized out_type: %s\n",
> + piglit_get_gl_enum_name(out_type));
> + piglit_report_result(PIGLIT_FAIL);
> + return "UNKNOWN";
> + }
> +}
> +
> +
> void Sunburst::compile()
> {
> static struct vertex_attributes {
> @@ -912,24 +942,33 @@ void Sunburst::compile()
> " barycentric_coords = in_barycentric_coords;\n"
> "}\n";
>
> - static const char *frag =
> + static const char *frag_template =
> "#version 130\n"
> + "#define OUT_TYPE %s\n"
> "in vec3 barycentric_coords;\n"
> "uniform mat3x4 draw_colors;\n"
> + "out OUT_TYPE frag_out;\n"
> "\n"
> "void main()\n"
> "{\n"
> - " gl_FragColor = draw_colors * barycentric_coords;\n"
> + " frag_out = OUT_TYPE(draw_colors * barycentric_coords);\n"
> "}\n";
>
> /* Compile program */
> prog = glCreateProgram();
> GLint vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vert);
> glAttachShader(prog, vs);
> + const char *out_type_glsl = get_out_type_glsl();
> + unsigned frag_alloc_len =
> + strlen(frag_template) + strlen(out_type_glsl) + 1;
> + char *frag = (char *) malloc(frag_alloc_len);
> + sprintf(frag, frag_template, out_type_glsl);
> GLint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, frag);
> + free(frag);
> glAttachShader(prog, fs);
> glBindAttribLocation(prog, 0, "pos_within_tri");
> glBindAttribLocation(prog, 1, "in_barycentric_coords");
> + glBindFragDataLocation(prog, 0, "frag_out");
> glLinkProgram(prog);
> if (!piglit_link_check_status(prog)) {
> piglit_report_result(PIGLIT_FAIL);
> @@ -963,6 +1002,13 @@ void Sunburst::compile()
> barycentric_coords));
> }
>
> +
> +ColorGradientSunburst::ColorGradientSunburst(GLenum out_type)
> +{
> + this->out_type = out_type;
> +}
> +
> +
> void
> ColorGradientSunburst::draw(const float (*proj)[4])
> {
> diff --git a/tests/spec/ext_framebuffer_multisample/common.h b/tests/spec/ext_framebuffer_multisample/common.h
> index 07d892d..b432f86 100644
> --- a/tests/spec/ext_framebuffer_multisample/common.h
> +++ b/tests/spec/ext_framebuffer_multisample/common.h
> @@ -310,8 +310,19 @@ private:
> class Sunburst : public TestPattern
> {
> public:
> + Sunburst();
> +
> virtual void compile();
>
> + /**
> + * Type of color buffer being rendered into. Should be one of
> + * the following enum values: GL_FLOAT,
> + * GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_INT, or GL_INT.
> + *
> + * Defaults to GL_UNSIGNED_NORMALIZED.
> + */
> + GLenum out_type;
> +
> protected:
> GLint prog;
> GLint rotation_loc;
> @@ -322,6 +333,8 @@ protected:
> int num_tris;
>
> private:
> + const char *get_out_type_glsl() const;
> +
> GLuint vertex_buf;
> };
>
> @@ -330,10 +343,17 @@ private:
> *
> * This program draws triangles using a variety of colors and
> * gradients.
> + *
> + * This program is capable of drawing to floating point, integer, and
> + * unsigned integer framebuffers, controlled by the out_type
> + * constructor parameter, which should be GL_FLOAT,
> + * GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_INT, or GL_INT.
> */
> class ColorGradientSunburst : public Sunburst
> {
> public:
> + explicit ColorGradientSunburst(GLenum out_type);
> +
> virtual void draw(const float (*proj)[4]);
> };
>
> diff --git a/tests/spec/ext_framebuffer_multisample/formats.cpp b/tests/spec/ext_framebuffer_multisample/formats.cpp
> index 220de79..907f3d1 100644
> --- a/tests/spec/ext_framebuffer_multisample/formats.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/formats.cpp
> @@ -427,7 +427,7 @@ piglit_init(int argc, char **argv)
>
> fbo_formats_init_test_set(0 /* core formats */,
> GL_TRUE /* print_options */);
> - test_pattern = new ColorGradientSunburst();
> + test_pattern = new ColorGradientSunburst(GL_UNSIGNED_NORMALIZED);
> test_pattern->compile();
> }
>
> --
> 1.7.7.6
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>
More information about the Piglit
mailing list