ext_gpu_shader4: test glBindFragDataLocationEXT

Submitted by Marek Olšák on April 15, 2019, 5:47 p.m.

Details

Message ID 20190415174727.15430-1-maraeo@gmail.com
State New
Headers show
Series "ext_gpu_shader4: test glBindFragDataLocationEXT" ( rev: 1 ) in Piglit

Not browsing as part of any series.

Commit Message

Marek Olšák April 15, 2019, 5:47 p.m.
From: Marek Olšák <marek.olsak@amd.com>

---
 tests/opengl.py                         |   7 ++
 tests/spec/gl-3.1/mixed-int-float-fbo.c | 100 +++++++++++++++++++-----
 2 files changed, 88 insertions(+), 19 deletions(-)

Patch hide | download patch | download mbox

diff --git a/tests/opengl.py b/tests/opengl.py
index 40c37a055..666b35200 100644
--- a/tests/opengl.py
+++ b/tests/opengl.py
@@ -3026,20 +3026,27 @@  with profile.test_list.group_manager(
     g(['getteximage-formats', 'init-by-rendering'])
     g(['getteximage-formats', 'init-by-clear-and-render'])
     g(['ext_framebuffer_multisample-fast-clear', 'single-sample'],
       'fbo-fast-clear')
     g(['ext_framebuffer_object-border-texture-finish'])
     add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX1')
     add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX4')
     add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX8')
     add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX16')
 
+
+with profile.test_list.group_manager(
+        PiglitGLTest,
+        grouptools.join('spec', 'ext_gpu_shader4')) as g:
+    g(['gl-3.1-mixed-int-float-fbo', 'ext_gpu_shader4'], 'bindfragdatalocation mixed-int-float-fbo')
+    g(['gl-3.1-mixed-int-float-fbo', 'ext_gpu_shader4', 'int_second'], 'bindfragdatalocation mixed-int-float-fbo int_second')
+
 with profile.test_list.group_manager(
         PiglitGLTest, grouptools.join('spec', 'ext_image_dma_buf_import')) as \
         g:
     g(['ext_image_dma_buf_import-invalid_hints'], run_concurrent=False)
     g(['ext_image_dma_buf_import-invalid_attributes'], run_concurrent=False)
     g(['ext_image_dma_buf_import-missing_attributes'], run_concurrent=False)
     g(['ext_image_dma_buf_import-ownership_transfer'], run_concurrent=False)
     g(['ext_image_dma_buf_import-unsupported_format'], run_concurrent=False)
     g(['ext_image_dma_buf_import-intel_external_sampler_only'],
       run_concurrent=False)
diff --git a/tests/spec/gl-3.1/mixed-int-float-fbo.c b/tests/spec/gl-3.1/mixed-int-float-fbo.c
index d2d7aeb65..8dfeccb41 100644
--- a/tests/spec/gl-3.1/mixed-int-float-fbo.c
+++ b/tests/spec/gl-3.1/mixed-int-float-fbo.c
@@ -26,22 +26,36 @@ 
  * Test mixed integer/float FBO.
  *
  * If the argument 'int_second' is given the 0th color attachment will
  * be a unorm texture and the 1st color attachment will be an integer texture.
  * Otherwise, the 0th color attachment will be integer and the 1st color
  * attachment will be unorm.
  */
 
 #include "piglit-util-gl.h"
 
+static bool ext_gpu_shader4 = false;
+
 PIGLIT_GL_TEST_CONFIG_BEGIN
-	config.supports_gl_core_version = 31;
+	for (int i = 1; i < argc; i++) {
+		if (!strcmp(argv[i], "ext_gpu_shader4")) {
+			ext_gpu_shader4 = true;
+			puts("Testing GL_EXT_gpu_shader4.");
+			break;
+		}
+	}
+
+	if (ext_gpu_shader4)
+		config.supports_gl_compat_version = 10;
+	else
+		config.supports_gl_core_version = 31;
+
 	config.window_visual = PIGLIT_GL_VISUAL_RGBA;
 	config.khr_no_error_support = PIGLIT_NO_ERRORS;
 PIGLIT_GL_TEST_CONFIG_END
 
 static const char *vs_text =
 	"#version 150\n"
 	"in vec4 vertex;\n"
 	"void main() \n"
 	"{ \n"
 	"   gl_Position = vertex; \n"
@@ -50,35 +64,71 @@  static const char *vs_text =
 static const char *fs_text =
 	"#version 150\n"
 	"out ivec4 outputInt;\n"
 	"out vec4 outputFloat;\n"
 	"void main() \n"
 	"{ \n"
 	"   outputInt = ivec4(1, 2, 3, 4); \n"
 	"   outputFloat = vec4(0.25, 0.5, 0.75, 1.0); \n"
 	"} \n";
 
+static const char *vs_text_gpu_shader4 =
+	"#version 110\n"
+	"attribute vec4 vertex;\n"
+	"void main() \n"
+	"{ \n"
+	"   gl_Position = vertex; \n"
+	"} \n";
+
+static const char *fs_text_gpu_shader4 =
+	"#version 110\n"
+	"#extension GL_EXT_gpu_shader4 : enable\n"
+	"varying out ivec4 outputInt;\n"
+	"varying out vec4 outputFloat;\n"
+	"void main() \n"
+	"{ \n"
+	"   outputInt = ivec4(1, 2, 3, 4); \n"
+	"   outputFloat = vec4(0.25, 0.5, 0.75, 1.0); \n"
+	"} \n";
+
 const int width = 128, height = 128;
 bool int_output_first = true;
 
 
 static GLuint
 create_program(void)
 {
-	GLuint program = piglit_build_simple_program(vs_text, fs_text);
-	if (int_output_first) {
-		glBindFragDataLocation(program, 0, "outputInt");
-		glBindFragDataLocation(program, 1, "outputFloat");
-	}
-	else {
-		glBindFragDataLocation(program, 0, "outputFloat");
-		glBindFragDataLocation(program, 1, "outputInt");
+	GLuint program;
+
+	if (ext_gpu_shader4) {
+		program = piglit_build_simple_program(vs_text_gpu_shader4,
+						      fs_text_gpu_shader4);
+
+		if (int_output_first) {
+			glBindFragDataLocationEXT(program, 0, "outputInt");
+			glBindFragDataLocationEXT(program, 1, "outputFloat");
+		}
+		else {
+			glBindFragDataLocationEXT(program, 0, "outputFloat");
+			glBindFragDataLocationEXT(program, 1, "outputInt");
+		}
+	} else {
+		program = piglit_build_simple_program(vs_text, fs_text);
+
+		if (int_output_first) {
+			glBindFragDataLocation(program, 0, "outputInt");
+			glBindFragDataLocation(program, 1, "outputFloat");
+		}
+		else {
+			glBindFragDataLocation(program, 0, "outputFloat");
+			glBindFragDataLocation(program, 1, "outputInt");
+		}
 	}
 
 	glLinkProgram(program);
 	if (!piglit_link_check_status(program))
 		piglit_report_result(PIGLIT_FAIL);
 
 	piglit_check_gl_error(GL_NO_ERROR);
 
 	return program;
 }
@@ -139,30 +189,35 @@  create_fbo(void)
 		piglit_report_result(PIGLIT_SKIP);
 	}
 
 	return fbo;
 }
 
 
 enum piglit_result
 piglit_display(void)
 {
-	const int int_clear[4] = { 99, 99, 99, 99 };
-	const float float_clear[4] = { 0.33, 0.33, 0.33, 0.33 };
-
-	if (int_output_first) {
-		glClearBufferiv(GL_COLOR, 0, int_clear);
-		glClearBufferfv(GL_COLOR, 1, float_clear);
-	}
-	else {
-		glClearBufferfv(GL_COLOR, 0, float_clear);
-		glClearBufferiv(GL_COLOR, 1, int_clear);
+	if (ext_gpu_shader4) {
+		glClearColor(0, 0, 0, 0);
+		glClear(GL_COLOR_BUFFER_BIT);
+	} else {
+		const int int_clear[4] = { 99, 99, 99, 99 };
+		const float float_clear[4] = { 0.33, 0.33, 0.33, 0.33 };
+
+		if (int_output_first) {
+			glClearBufferiv(GL_COLOR, 0, int_clear);
+			glClearBufferfv(GL_COLOR, 1, float_clear);
+		}
+		else {
+			glClearBufferfv(GL_COLOR, 0, float_clear);
+			glClearBufferiv(GL_COLOR, 1, int_clear);
+		}
 	}
 
 	piglit_draw_rect(-1, -1, 2, 2);
 
 	bool pass = true;
 
 	/* check the int target */
 	if (int_output_first) {
 		glReadBuffer(GL_COLOR_ATTACHMENT0);
 	}
@@ -205,20 +260,27 @@  piglit_display(void)
 
 	pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
 	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
 }
 
 
 void
 piglit_init(int argc, char **argv)
 {
+	if (ext_gpu_shader4) {
+		piglit_require_gl_version(20);
+		piglit_require_extension("GL_ARB_framebuffer_object");
+		piglit_require_extension("GL_EXT_gpu_shader4");
+		piglit_require_extension("GL_EXT_texture_integer");
+	}
+
 	if (argc > 1 && strcmp(argv[1], "int_second") == 0) {
 		int_output_first = false;
 	}
 
 	GLuint fbo = create_fbo();
 	GLuint program = create_program();
 
 	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 	glUseProgram(program);
 }

Comments

On 4/15/19 10:47 AM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak@amd.com>
> 
> ---
>  tests/opengl.py                         |   7 ++
>  tests/spec/gl-3.1/mixed-int-float-fbo.c | 100 +++++++++++++++++++-----
>  2 files changed, 88 insertions(+), 19 deletions(-)
> 
> diff --git a/tests/opengl.py b/tests/opengl.py
> index 40c37a055..666b35200 100644
> --- a/tests/opengl.py
> +++ b/tests/opengl.py
> @@ -3026,20 +3026,27 @@ with profile.test_list.group_manager(
>      g(['getteximage-formats', 'init-by-rendering'])
>      g(['getteximage-formats', 'init-by-clear-and-render'])
>      g(['ext_framebuffer_multisample-fast-clear', 'single-sample'],
>        'fbo-fast-clear')
>      g(['ext_framebuffer_object-border-texture-finish'])
>      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX1')
>      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX4')
>      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX8')
>      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX16')
>  
> +
> +with profile.test_list.group_manager(
> +        PiglitGLTest,
> +        grouptools.join('spec', 'ext_gpu_shader4')) as g:
> +    g(['gl-3.1-mixed-int-float-fbo', 'ext_gpu_shader4'], 'bindfragdatalocation mixed-int-float-fbo')
> +    g(['gl-3.1-mixed-int-float-fbo', 'ext_gpu_shader4', 'int_second'], 'bindfragdatalocation mixed-int-float-fbo int_second')
> +
>  with profile.test_list.group_manager(
>          PiglitGLTest, grouptools.join('spec', 'ext_image_dma_buf_import')) as \
>          g:
>      g(['ext_image_dma_buf_import-invalid_hints'], run_concurrent=False)
>      g(['ext_image_dma_buf_import-invalid_attributes'], run_concurrent=False)
>      g(['ext_image_dma_buf_import-missing_attributes'], run_concurrent=False)
>      g(['ext_image_dma_buf_import-ownership_transfer'], run_concurrent=False)
>      g(['ext_image_dma_buf_import-unsupported_format'], run_concurrent=False)
>      g(['ext_image_dma_buf_import-intel_external_sampler_only'],
>        run_concurrent=False)
> diff --git a/tests/spec/gl-3.1/mixed-int-float-fbo.c b/tests/spec/gl-3.1/mixed-int-float-fbo.c
> index d2d7aeb65..8dfeccb41 100644
> --- a/tests/spec/gl-3.1/mixed-int-float-fbo.c
> +++ b/tests/spec/gl-3.1/mixed-int-float-fbo.c
> @@ -26,22 +26,36 @@
>   * Test mixed integer/float FBO.
>   *
>   * If the argument 'int_second' is given the 0th color attachment will
>   * be a unorm texture and the 1st color attachment will be an integer texture.
>   * Otherwise, the 0th color attachment will be integer and the 1st color
>   * attachment will be unorm.
>   */
>  
>  #include "piglit-util-gl.h"
>  
> +static bool ext_gpu_shader4 = false;
> +
>  PIGLIT_GL_TEST_CONFIG_BEGIN
> -	config.supports_gl_core_version = 31;
> +	for (int i = 1; i < argc; i++) {
> +		if (!strcmp(argv[i], "ext_gpu_shader4")) {
> +			ext_gpu_shader4 = true;
> +			puts("Testing GL_EXT_gpu_shader4.");
> +			break;
> +		}
> +	}
> +
> +	if (ext_gpu_shader4)
> +		config.supports_gl_compat_version = 10;
> +	else
> +		config.supports_gl_core_version = 31;
> +
>  	config.window_visual = PIGLIT_GL_VISUAL_RGBA;
>  	config.khr_no_error_support = PIGLIT_NO_ERRORS;
>  PIGLIT_GL_TEST_CONFIG_END
>  
>  static const char *vs_text =
>  	"#version 150\n"
>  	"in vec4 vertex;\n"
>  	"void main() \n"
>  	"{ \n"
>  	"   gl_Position = vertex; \n"
> @@ -50,35 +64,71 @@ static const char *vs_text =
>  static const char *fs_text =
>  	"#version 150\n"
>  	"out ivec4 outputInt;\n"
>  	"out vec4 outputFloat;\n"
>  	"void main() \n"
>  	"{ \n"
>  	"   outputInt = ivec4(1, 2, 3, 4); \n"
>  	"   outputFloat = vec4(0.25, 0.5, 0.75, 1.0); \n"
>  	"} \n";
>  
> +static const char *vs_text_gpu_shader4 =
> +	"#version 110\n"
> +	"attribute vec4 vertex;\n"
> +	"void main() \n"
> +	"{ \n"
> +	"   gl_Position = vertex; \n"
> +	"} \n";
> +
> +static const char *fs_text_gpu_shader4 =
> +	"#version 110\n"
> +	"#extension GL_EXT_gpu_shader4 : enable\n"
> +	"varying out ivec4 outputInt;\n"
> +	"varying out vec4 outputFloat;\n"
> +	"void main() \n"
> +	"{ \n"
> +	"   outputInt = ivec4(1, 2, 3, 4); \n"
> +	"   outputFloat = vec4(0.25, 0.5, 0.75, 1.0); \n"
> +	"} \n";
> +
>  const int width = 128, height = 128;
>  bool int_output_first = true;
>  
>  
>  static GLuint
>  create_program(void)
>  {
> -	GLuint program = piglit_build_simple_program(vs_text, fs_text);
> -	if (int_output_first) {
> -		glBindFragDataLocation(program, 0, "outputInt");
> -		glBindFragDataLocation(program, 1, "outputFloat");
> -	}
> -	else {
> -		glBindFragDataLocation(program, 0, "outputFloat");
> -		glBindFragDataLocation(program, 1, "outputInt");
> +	GLuint program;
> +
> +	if (ext_gpu_shader4) {
> +		program = piglit_build_simple_program(vs_text_gpu_shader4,
> +						      fs_text_gpu_shader4);
> +
> +		if (int_output_first) {
> +			glBindFragDataLocationEXT(program, 0, "outputInt");
> +			glBindFragDataLocationEXT(program, 1, "outputFloat");

I don't know if this separation is strictly necessary.  The Khronos
gl.xml /says/ glBindFragDataLocationEXT is an alias of
glBindFragDataLocation.  There's no published GLX protocol, so there's
nothing that prevents the two from being unaliased in the future.

I don't feel very strongly about it either way.  Whichever way you
decide to do it, this patch is

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>

> +		}
> +		else {
> +			glBindFragDataLocationEXT(program, 0, "outputFloat");
> +			glBindFragDataLocationEXT(program, 1, "outputInt");
> +		}
> +	} else {
> +		program = piglit_build_simple_program(vs_text, fs_text);
> +
> +		if (int_output_first) {
> +			glBindFragDataLocation(program, 0, "outputInt");
> +			glBindFragDataLocation(program, 1, "outputFloat");
> +		}
> +		else {
> +			glBindFragDataLocation(program, 0, "outputFloat");
> +			glBindFragDataLocation(program, 1, "outputInt");
> +		}
>  	}
>  
>  	glLinkProgram(program);
>  	if (!piglit_link_check_status(program))
>  		piglit_report_result(PIGLIT_FAIL);
>  
>  	piglit_check_gl_error(GL_NO_ERROR);
>  
>  	return program;
>  }
> @@ -139,30 +189,35 @@ create_fbo(void)
>  		piglit_report_result(PIGLIT_SKIP);
>  	}
>  
>  	return fbo;
>  }
>  
>  
>  enum piglit_result
>  piglit_display(void)
>  {
> -	const int int_clear[4] = { 99, 99, 99, 99 };
> -	const float float_clear[4] = { 0.33, 0.33, 0.33, 0.33 };
> -
> -	if (int_output_first) {
> -		glClearBufferiv(GL_COLOR, 0, int_clear);
> -		glClearBufferfv(GL_COLOR, 1, float_clear);
> -	}
> -	else {
> -		glClearBufferfv(GL_COLOR, 0, float_clear);
> -		glClearBufferiv(GL_COLOR, 1, int_clear);
> +	if (ext_gpu_shader4) {
> +		glClearColor(0, 0, 0, 0);
> +		glClear(GL_COLOR_BUFFER_BIT);
> +	} else {
> +		const int int_clear[4] = { 99, 99, 99, 99 };
> +		const float float_clear[4] = { 0.33, 0.33, 0.33, 0.33 };
> +
> +		if (int_output_first) {
> +			glClearBufferiv(GL_COLOR, 0, int_clear);
> +			glClearBufferfv(GL_COLOR, 1, float_clear);
> +		}
> +		else {
> +			glClearBufferfv(GL_COLOR, 0, float_clear);
> +			glClearBufferiv(GL_COLOR, 1, int_clear);
> +		}
>  	}
>  
>  	piglit_draw_rect(-1, -1, 2, 2);
>  
>  	bool pass = true;
>  
>  	/* check the int target */
>  	if (int_output_first) {
>  		glReadBuffer(GL_COLOR_ATTACHMENT0);
>  	}
> @@ -205,20 +260,27 @@ piglit_display(void)
>  
>  	pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
>  
>  	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>  }
>  
>  
>  void
>  piglit_init(int argc, char **argv)
>  {
> +	if (ext_gpu_shader4) {
> +		piglit_require_gl_version(20);
> +		piglit_require_extension("GL_ARB_framebuffer_object");
> +		piglit_require_extension("GL_EXT_gpu_shader4");
> +		piglit_require_extension("GL_EXT_texture_integer");
> +	}
> +
>  	if (argc > 1 && strcmp(argv[1], "int_second") == 0) {
>  		int_output_first = false;
>  	}
>  
>  	GLuint fbo = create_fbo();
>  	GLuint program = create_program();
>  
>  	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
>  	glUseProgram(program);
>  }
>

On 4/15/19 5:16 PM, Marek Olšák wrote:
> It's also an execution test for "varying out".

I don't know what that has to do with glBindFragDataLocationEXT vs
glBindFragDataLocation.  Can you please explain?

> Marek
> 
> On Mon, Apr 15, 2019 at 6:28 PM Ian Romanick <idr@freedesktop.org
> <mailto:idr@freedesktop.org>> wrote:
> 
>     On 4/15/19 10:47 AM, Marek Olšák wrote:
>     > From: Marek Olšák <marek.olsak@amd.com <mailto:marek.olsak@amd.com>>
>     >
>     > ---
>     >  tests/opengl.py                         |   7 ++
>     >  tests/spec/gl-3.1/mixed-int-float-fbo.c | 100
>     +++++++++++++++++++-----
>     >  2 files changed, 88 insertions(+), 19 deletions(-)
>     >
>     > diff --git a/tests/opengl.py b/tests/opengl.py
>     > index 40c37a055..666b35200 100644
>     > --- a/tests/opengl.py
>     > +++ b/tests/opengl.py
>     > @@ -3026,20 +3026,27 @@ with profile.test_list.group_manager(
>     >      g(['getteximage-formats', 'init-by-rendering'])
>     >      g(['getteximage-formats', 'init-by-clear-and-render'])
>     >      g(['ext_framebuffer_multisample-fast-clear', 'single-sample'],
>     >        'fbo-fast-clear')
>     >      g(['ext_framebuffer_object-border-texture-finish'])
>     >      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX1')
>     >      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX4')
>     >      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX8')
>     >      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX16')
>     > 
>     > +
>     > +with profile.test_list.group_manager(
>     > +        PiglitGLTest,
>     > +        grouptools.join('spec', 'ext_gpu_shader4')) as g:
>     > +    g(['gl-3.1-mixed-int-float-fbo', 'ext_gpu_shader4'],
>     'bindfragdatalocation mixed-int-float-fbo')
>     > +    g(['gl-3.1-mixed-int-float-fbo', 'ext_gpu_shader4',
>     'int_second'], 'bindfragdatalocation mixed-int-float-fbo int_second')
>     > +
>     >  with profile.test_list.group_manager(
>     >          PiglitGLTest, grouptools.join('spec',
>     'ext_image_dma_buf_import')) as \
>     >          g:
>     >      g(['ext_image_dma_buf_import-invalid_hints'],
>     run_concurrent=False)
>     >      g(['ext_image_dma_buf_import-invalid_attributes'],
>     run_concurrent=False)
>     >      g(['ext_image_dma_buf_import-missing_attributes'],
>     run_concurrent=False)
>     >      g(['ext_image_dma_buf_import-ownership_transfer'],
>     run_concurrent=False)
>     >      g(['ext_image_dma_buf_import-unsupported_format'],
>     run_concurrent=False)
>     >      g(['ext_image_dma_buf_import-intel_external_sampler_only'],
>     >        run_concurrent=False)
>     > diff --git a/tests/spec/gl-3.1/mixed-int-float-fbo.c
>     b/tests/spec/gl-3.1/mixed-int-float-fbo.c
>     > index d2d7aeb65..8dfeccb41 100644
>     > --- a/tests/spec/gl-3.1/mixed-int-float-fbo.c
>     > +++ b/tests/spec/gl-3.1/mixed-int-float-fbo.c
>     > @@ -26,22 +26,36 @@
>     >   * Test mixed integer/float FBO.
>     >   *
>     >   * If the argument 'int_second' is given the 0th color attachment
>     will
>     >   * be a unorm texture and the 1st color attachment will be an
>     integer texture.
>     >   * Otherwise, the 0th color attachment will be integer and the
>     1st color
>     >   * attachment will be unorm.
>     >   */
>     > 
>     >  #include "piglit-util-gl.h"
>     > 
>     > +static bool ext_gpu_shader4 = false;
>     > +
>     >  PIGLIT_GL_TEST_CONFIG_BEGIN
>     > -     config.supports_gl_core_version = 31;
>     > +     for (int i = 1; i < argc; i++) {
>     > +             if (!strcmp(argv[i], "ext_gpu_shader4")) {
>     > +                     ext_gpu_shader4 = true;
>     > +                     puts("Testing GL_EXT_gpu_shader4.");
>     > +                     break;
>     > +             }
>     > +     }
>     > +
>     > +     if (ext_gpu_shader4)
>     > +             config.supports_gl_compat_version = 10;
>     > +     else
>     > +             config.supports_gl_core_version = 31;
>     > +
>     >       config.window_visual = PIGLIT_GL_VISUAL_RGBA;
>     >       config.khr_no_error_support = PIGLIT_NO_ERRORS;
>     >  PIGLIT_GL_TEST_CONFIG_END
>     > 
>     >  static const char *vs_text =
>     >       "#version 150\n"
>     >       "in vec4 vertex;\n"
>     >       "void main() \n"
>     >       "{ \n"
>     >       "   gl_Position = vertex; \n"
>     > @@ -50,35 +64,71 @@ static const char *vs_text =
>     >  static const char *fs_text =
>     >       "#version 150\n"
>     >       "out ivec4 outputInt;\n"
>     >       "out vec4 outputFloat;\n"
>     >       "void main() \n"
>     >       "{ \n"
>     >       "   outputInt = ivec4(1, 2, 3, 4); \n"
>     >       "   outputFloat = vec4(0.25, 0.5, 0.75, 1.0); \n"
>     >       "} \n";
>     > 
>     > +static const char *vs_text_gpu_shader4 =
>     > +     "#version 110\n"
>     > +     "attribute vec4 vertex;\n"
>     > +     "void main() \n"
>     > +     "{ \n"
>     > +     "   gl_Position = vertex; \n"
>     > +     "} \n";
>     > +
>     > +static const char *fs_text_gpu_shader4 =
>     > +     "#version 110\n"
>     > +     "#extension GL_EXT_gpu_shader4 : enable\n"
>     > +     "varying out ivec4 outputInt;\n"
>     > +     "varying out vec4 outputFloat;\n"
>     > +     "void main() \n"
>     > +     "{ \n"
>     > +     "   outputInt = ivec4(1, 2, 3, 4); \n"
>     > +     "   outputFloat = vec4(0.25, 0.5, 0.75, 1.0); \n"
>     > +     "} \n";
>     > +
>     >  const int width = 128, height = 128;
>     >  bool int_output_first = true;
>     > 
>     > 
>     >  static GLuint
>     >  create_program(void)
>     >  {
>     > -     GLuint program = piglit_build_simple_program(vs_text, fs_text);
>     > -     if (int_output_first) {
>     > -             glBindFragDataLocation(program, 0, "outputInt");
>     > -             glBindFragDataLocation(program, 1, "outputFloat");
>     > -     }
>     > -     else {
>     > -             glBindFragDataLocation(program, 0, "outputFloat");
>     > -             glBindFragDataLocation(program, 1, "outputInt");
>     > +     GLuint program;
>     > +
>     > +     if (ext_gpu_shader4) {
>     > +             program =
>     piglit_build_simple_program(vs_text_gpu_shader4,
>     > +                                                 
>      fs_text_gpu_shader4);
>     > +
>     > +             if (int_output_first) {
>     > +                     glBindFragDataLocationEXT(program, 0,
>     "outputInt");
>     > +                     glBindFragDataLocationEXT(program, 1,
>     "outputFloat");
> 
>     I don't know if this separation is strictly necessary.  The Khronos
>     gl.xml /says/ glBindFragDataLocationEXT is an alias of
>     glBindFragDataLocation.  There's no published GLX protocol, so there's
>     nothing that prevents the two from being unaliased in the future.
> 
>     I don't feel very strongly about it either way.  Whichever way you
>     decide to do it, this patch is
> 
>     Reviewed-by: Ian Romanick <ian.d.romanick@intel.com
>     <mailto:ian.d.romanick@intel.com>>
> 
>     > +             }
>     > +             else {
>     > +                     glBindFragDataLocationEXT(program, 0,
>     "outputFloat");
>     > +                     glBindFragDataLocationEXT(program, 1,
>     "outputInt");
>     > +             }
>     > +     } else {
>     > +             program = piglit_build_simple_program(vs_text, fs_text);
>     > +
>     > +             if (int_output_first) {
>     > +                     glBindFragDataLocation(program, 0, "outputInt");
>     > +                     glBindFragDataLocation(program, 1,
>     "outputFloat");
>     > +             }
>     > +             else {
>     > +                     glBindFragDataLocation(program, 0,
>     "outputFloat");
>     > +                     glBindFragDataLocation(program, 1, "outputInt");
>     > +             }
>     >       }
>     > 
>     >       glLinkProgram(program);
>     >       if (!piglit_link_check_status(program))
>     >               piglit_report_result(PIGLIT_FAIL);
>     > 
>     >       piglit_check_gl_error(GL_NO_ERROR);
>     > 
>     >       return program;
>     >  }
>     > @@ -139,30 +189,35 @@ create_fbo(void)
>     >               piglit_report_result(PIGLIT_SKIP);
>     >       }
>     > 
>     >       return fbo;
>     >  }
>     > 
>     > 
>     >  enum piglit_result
>     >  piglit_display(void)
>     >  {
>     > -     const int int_clear[4] = { 99, 99, 99, 99 };
>     > -     const float float_clear[4] = { 0.33, 0.33, 0.33, 0.33 };
>     > -
>     > -     if (int_output_first) {
>     > -             glClearBufferiv(GL_COLOR, 0, int_clear);
>     > -             glClearBufferfv(GL_COLOR, 1, float_clear);
>     > -     }
>     > -     else {
>     > -             glClearBufferfv(GL_COLOR, 0, float_clear);
>     > -             glClearBufferiv(GL_COLOR, 1, int_clear);
>     > +     if (ext_gpu_shader4) {
>     > +             glClearColor(0, 0, 0, 0);
>     > +             glClear(GL_COLOR_BUFFER_BIT);
>     > +     } else {
>     > +             const int int_clear[4] = { 99, 99, 99, 99 };
>     > +             const float float_clear[4] = { 0.33, 0.33, 0.33, 0.33 };
>     > +
>     > +             if (int_output_first) {
>     > +                     glClearBufferiv(GL_COLOR, 0, int_clear);
>     > +                     glClearBufferfv(GL_COLOR, 1, float_clear);
>     > +             }
>     > +             else {
>     > +                     glClearBufferfv(GL_COLOR, 0, float_clear);
>     > +                     glClearBufferiv(GL_COLOR, 1, int_clear);
>     > +             }
>     >       }
>     > 
>     >       piglit_draw_rect(-1, -1, 2, 2);
>     > 
>     >       bool pass = true;
>     > 
>     >       /* check the int target */
>     >       if (int_output_first) {
>     >               glReadBuffer(GL_COLOR_ATTACHMENT0);
>     >       }
>     > @@ -205,20 +260,27 @@ piglit_display(void)
>     > 
>     >       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
>     > 
>     >       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>     >  }
>     > 
>     > 
>     >  void
>     >  piglit_init(int argc, char **argv)
>     >  {
>     > +     if (ext_gpu_shader4) {
>     > +             piglit_require_gl_version(20);
>     > +             piglit_require_extension("GL_ARB_framebuffer_object");
>     > +             piglit_require_extension("GL_EXT_gpu_shader4");
>     > +             piglit_require_extension("GL_EXT_texture_integer");
>     > +     }
>     > +
>     >       if (argc > 1 && strcmp(argv[1], "int_second") == 0) {
>     >               int_output_first = false;
>     >       }
>     > 
>     >       GLuint fbo = create_fbo();
>     >       GLuint program = create_program();
>     > 
>     >       glBindFramebuffer(GL_FRAMEBUFFER, fbo);
>     >       glUseProgram(program);
>     >  }
>     >
>