On Monday, December 07, 2015 11:06:33 AM Timothy Arceri wrote:
> This sets up the basics for using SSO with shader runner. This will
> only support vertex and fragment shaders but is easily extended.
> 
> V2: delete pipeline in cleanup code rather than calling gen again,
> output error message when SSO fails to link
> 
> V3: add new option to [require] to allow separate shader objects to be
> enabled for the entire test.
> 
> V4:
> - remove infrastructure left over from V2 (as suggested by Ken)
> - rework linking so that we dont use glCreateShaderProgram() this
>  allows   us to support multiple shaders per stage.
> 
> Example use:
> [require]
> SSO ENABLED
> 
> Adding the ENABLED field rather than just using SSO will allow us to use
> DISABLED in future should we ever add the ability to automatically run
> all tests as SSO.
> 
> Example shader:
> 
> [require]
> GLSL >= 1.50
> SSO ENABLED
> 
> [vertex shader]
> 
> layout(location = 0) in vec4 piglit_vertex;
> 
> layout(location = 2) out vec3 a;
> layout(location = 3) out vec3 b;
> 
> void main()
> {
>     gl_Position = piglit_vertex;
>     a = vec3(0, 0, 1);
>     b = vec3(1, 0, 0);
> }
> 
> [fragment shader]
> 
> layout(location = 0) out vec4 out_color;
> 
> layout(location = 2) in vec3 b; /* should get vec3(0, 0, 1) */
> layout(location = 3) in vec3 a; /* should get vec3(1, 0, 0) */
> 
> void main()
> {
>     out_color = vec4(cross(b, a), 1);
> }
> 
> [test]
> draw rect -1 -1 2 2
> probe all rgb 0 1 0
> 
> Cc: Kenneth Graunke <[email protected]>
> ---
>  tests/shaders/shader_runner.c | 158 
> +++++++++++++++++++++++++++++-------------
>  1 file changed, 111 insertions(+), 47 deletions(-)
> 
> diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
> index eeb1aac..da21af2 100644
> --- a/tests/shaders/shader_runner.c
> +++ b/tests/shaders/shader_runner.c
> @@ -123,10 +123,12 @@ GLint shader_string_size;
>  const char *vertex_data_start = NULL;
>  const char *vertex_data_end = NULL;
>  GLuint prog;
> +GLuint pipeline;
>  size_t num_vbo_rows = 0;
>  bool vbo_present = false;
>  bool link_ok = false;
>  bool prog_in_use = false;
> +bool sso_in_use = false;
>  GLchar *prog_err_info = NULL;
>  GLuint vao = 0;
>  GLuint fbo = 0;
> @@ -480,6 +482,44 @@ compile_and_bind_program(GLenum target, const char 
> *start, int len)
>       prog_in_use = true;
>  }
>  
> +void
> +link_sso(GLenum target)
> +{
> +     GLint ok;
> +
> +     glLinkProgram(prog);
> +
> +     glGetProgramiv(prog, GL_LINK_STATUS, &ok);
> +     if (ok) {
> +             link_ok = true;
> +     } else {
> +             GLint size;
> +
> +             glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &size);
> +             prog_err_info = malloc(size);
> +
> +             glGetProgramInfoLog(prog, size, NULL, prog_err_info);
> +
> +             fprintf(stderr, "SSO glLinkProgram(%s) failed: %s\n",
> +                     target_to_short_name(target),
> +                     prog_err_info);
> +
> +             free(prog_err_info);
> +             piglit_report_result(PIGLIT_FAIL);
> +
> +             return;
> +     }
> +
> +     switch (target) {
> +     case GL_VERTEX_SHADER:
> +             glUseProgramStages(pipeline, GL_VERTEX_SHADER_BIT, prog);
> +             break;
> +     case GL_FRAGMENT_SHADER:
> +             glUseProgramStages(pipeline, GL_FRAGMENT_SHADER_BIT, prog);
> +             break;

May as well add the rest of the shader stages here, too?

Either way,
Reviewed-by: Kenneth Graunke <[email protected]>

Attachment: signature.asc
Description: This is a digitally signed message part.

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

Reply via email to