[Mesa-dev] [PATCH 03/12] sso: add support of GL_PROGRAM_SEPARABLE and CreateShaderProgramv

Ian Romanick idr at freedesktop.org
Tue May 28 12:51:36 PDT 2013


On 05/03/2013 10:44 AM, Gregory Hainaut wrote:
> V1:
> CreateShaderProgramv is similar as CreateShaderProgramEXT. The 2 differences are
> 1/ it an array of strings
> 2/ it support the GL_PROGRAM_SEPARABLE (aka SeparateShader) flag
>
> V2: Formatting improvement
> ---
>   src/mesa/main/mtypes.h    |    5 +++
>   src/mesa/main/shaderapi.c |   94 +++++++++++++++++++++++++++++++--------------
>   src/mesa/main/shaderapi.h |    3 +-
>   3 files changed, 72 insertions(+), 30 deletions(-)
>
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 4487068..f979cd0 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2255,6 +2255,11 @@ struct gl_shader_program
>       * glClear()).
>       */
>      GLboolean InternalSeparateShader;
> +   /* ARB_separate_shader_objects
> +    * indicates whether program can be bound for individual pipeline stages using
> +    * UseProgramStages after it is next linked.
> +    */
> +   GLboolean SeparateShader;

Add a blank line before the comment block.

>
>      GLuint NumShaders;          /**< number of attached shaders */
>      struct gl_shader **Shaders; /**< List of attached the shaders */
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
> index 774163d..46072ba 100644
> --- a/src/mesa/main/shaderapi.c
> +++ b/src/mesa/main/shaderapi.c
> @@ -622,6 +622,11 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, GLint *param
>      case GL_PROGRAM_BINARY_LENGTH:
>         *params = 0;
>         return;
> +   case GL_PROGRAM_SEPARABLE:
> +      if (!ctx->Extensions.ARB_separate_shader_objects)
> +         break;
> +      *params = shProg->SeparateShader;
> +      return;
>      default:
>         break;
>      }
> @@ -1702,6 +1707,25 @@ _mesa_ProgramParameteri(GLuint program, GLenum pname, GLint value)
>          */
>         shProg->BinaryRetreivableHint = value;
>         return;
> +
> +   case GL_PROGRAM_SEPARABLE:
> +      if (!ctx->Extensions.ARB_separate_shader_objects)
> +         break;
> +
> +      /* Spec imply that the behavior is the same as ARB_get_program_binary
> +       * Chapter 7.3 Program Objects
> +       */
> +      if (value != GL_TRUE && value != GL_FALSE) {
> +         _mesa_error(ctx, GL_INVALID_VALUE,
> +                     "glProgramParameteri(pname=%s, value=%d): "
> +                     "value must be 0 or 1.",
> +                     _mesa_lookup_enum_by_nr(pname),
> +                     value);
> +         return;
> +      }
> +      shProg->SeparateShader = value;
> +      return;
> +
>      default:
>         break;
>      }
> @@ -1773,59 +1797,71 @@ _mesa_ActiveProgramEXT(GLuint program)
>      return;
>   }
>
> -
> -/**
> - * For GL_EXT_separate_shader_objects
> - */
> -GLuint GLAPIENTRY
> -_mesa_CreateShaderProgramEXT(GLenum type, const GLchar *string)
> +static GLuint
> +_mesa_create_shader_program(struct gl_context* ctx, GLboolean separate,
> +                            GLenum type, GLsizei count, const GLchar* const *strings)
>   {
> -   GET_CURRENT_CONTEXT(ctx);
>      const GLuint shader = create_shader(ctx, type);
>      GLuint program = 0;
>
>      if (shader) {
> -      shader_source(ctx, shader, _mesa_strdup(string));
> +      _mesa_ShaderSource(shader, count, strings, NULL);
> +
>         compile_shader(ctx, shader);
>
>         program = create_shader_program(ctx);
>         if (program) {
> -	 struct gl_shader_program *shProg;
> -	 struct gl_shader *sh;
> -	 GLint compiled = GL_FALSE;
> +         struct gl_shader_program *shProg;
> +         struct gl_shader *sh;
> +         GLint compiled = GL_FALSE;
>
> -	 shProg = _mesa_lookup_shader_program(ctx, program);
> -	 sh = _mesa_lookup_shader(ctx, shader);
> +         shProg = _mesa_lookup_shader_program(ctx, program);
> +         sh = _mesa_lookup_shader(ctx, shader);
>
> -	 get_shaderiv(ctx, shader, GL_COMPILE_STATUS, &compiled);
> -	 if (compiled) {
> -	    attach_shader(ctx, program, shader);
> -	    link_program(ctx, program);
> -	    detach_shader(ctx, program, shader);
> +         shProg->SeparateShader = separate;
>
> +         get_shaderiv(ctx, shader, GL_COMPILE_STATUS, &compiled);
> +         if (compiled) {
> +            attach_shader(ctx, program, shader);
> +            link_program(ctx, program);
> +            detach_shader(ctx, program, shader);
>   #if 0
> -	    /* Possibly... */
> -	    if (active-user-defined-varyings-in-linked-program) {
> -	       append-error-to-info-log;
> -	       shProg->LinkStatus = GL_FALSE;
> -	    }
> +            /* Possibly... */
> +            if (active-user-defined-varyings-in-linked-program) {
> +               append-error-to-info-log;
> +               shProg->LinkStatus = GL_FALSE;
> +            }
>   #endif
> -	 }
> +         }
>
> -	 ralloc_strcat(&shProg->InfoLog, sh->InfoLog);
> +         ralloc_strcat(&shProg->InfoLog, sh->InfoLog);
>         }
> -
>         delete_shader(ctx, shader);
>      }
> -
>      return program;

Don't delete these last two blank lines.

>   }
>
>   /**
> + * For GL_EXT_separate_shader_objects
> + */
> +GLuint GLAPIENTRY
> +_mesa_CreateShaderProgramEXT(GLenum type, const GLchar *string)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +
> +   return _mesa_create_shader_program(ctx, GL_FALSE, type, 1, &string);
> +}
> +
> +/**
>    * ARB_separate_shader_objects: Compile & Link Program
> + * Basically the same as _mesa_CreateShaderProgramEXT but
> + * with support of multiple strings and SeparateShader flag.
>    */
>   GLuint GLAPIENTRY
> -_mesa_CreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings)
> +_mesa_CreateShaderProgramv(GLenum type, GLsizei count,
> +                           const GLchar* const *strings)
>   {
> -   return 0;
> +   GET_CURRENT_CONTEXT(ctx);
> +
> +   return _mesa_create_shader_program(ctx, GL_TRUE, type, count, strings);
>   }
> diff --git a/src/mesa/main/shaderapi.h b/src/mesa/main/shaderapi.h
> index 4381703..d9b3809 100644
> --- a/src/mesa/main/shaderapi.h
> +++ b/src/mesa/main/shaderapi.h
> @@ -214,7 +214,8 @@ _mesa_CreateShaderProgramEXT(GLenum type, const GLchar *string);
>
>   /* GL_ARB_separate_shader_objects */
>   extern GLuint GLAPIENTRY
> -_mesa_CreateShaderProgramv(GLenum type, GLsizei count, const GLchar* const *strings);
> +_mesa_CreateShaderProgramv(GLenum type, GLsizei count,
> +                           const GLchar* const *strings);

Squash this hunk (and the other, similar whitespace change) back into 
patch 1 (where the function and prototype were added).

>
>   #ifdef __cplusplus
>   }
>



More information about the mesa-dev mailing list