[Mesa-dev] [PATCH] mesa: add GL_PROGRAM_PIPELINE support in KHR_debug calls

Timothy Arceri t_arceri at yahoo.com.au
Thu Jun 18 04:02:41 PDT 2015


On Wed, 2015-06-17 at 23:02 -0400, Ilia Mirkin wrote:
> This was apparently missed when KHR_debug or ARB_sso support was added.

SSO was still missing when I added KHR_debug, but this should have been
picked up by the object label piglit test I wrote. However the test was
broken, it failed to fail :(

I've sent a patch to fix this:
http://lists.freedesktop.org/archives/piglit/2015-June/016281.html

Your patch looks good to me and passes the fix piglit test.

Reviewed-by: Timothy Arceri <t_arceri at yahoo.com.au>


> Add label support to pipeline objects just like all the other
> debug-related objects.
> 
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> Cc: "10.5 10.6" <mesa-stable at lists.freedesktop.org>
> ---
>  src/mesa/main/mtypes.h      |  2 ++
>  src/mesa/main/objectlabel.c | 10 ++++++++--
>  src/mesa/main/pipelineobj.c | 21 +++++++++++----------
>  src/mesa/main/pipelineobj.h |  3 +++
>  4 files changed, 24 insertions(+), 12 deletions(-)
> 
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index ffa7f0c..983b9dc 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2815,6 +2815,8 @@ struct gl_pipeline_object
>  
>     mtx_t Mutex;
>  
> +   GLchar *Label;   /**< GL_KHR_debug */
> +
>     /**
>      * Programs used for rendering
>      *
> diff --git a/src/mesa/main/objectlabel.c b/src/mesa/main/objectlabel.c
> index aecb5b1..5626054 100644
> --- a/src/mesa/main/objectlabel.c
> +++ b/src/mesa/main/objectlabel.c
> @@ -30,6 +30,7 @@
>  #include "enums.h"
>  #include "fbobject.h"
>  #include "objectlabel.h"
> +#include "pipelineobj.h"
>  #include "queryobj.h"
>  #include "samplerobj.h"
>  #include "shaderobj.h"
> @@ -214,8 +215,13 @@ get_label_pointer(struct gl_context *ctx, GLenum identifier, GLuint name,
>        }
>        break;
>     case GL_PROGRAM_PIPELINE:
> -      /* requires GL 4.2 */
> -      goto invalid_enum;
> +      {
> +         struct gl_pipeline_object *pipe =
> +            _mesa_lookup_pipeline_object(ctx, name);
> +         if (pipe)
> +            labelPtr = &pipe->Label;
> +      }
> +      break;
>     default:
>        goto invalid_enum;
>     }
> diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c
> index b4795ff..279ae20 100644
> --- a/src/mesa/main/pipelineobj.c
> +++ b/src/mesa/main/pipelineobj.c
> @@ -65,6 +65,7 @@ _mesa_delete_pipeline_object(struct gl_context *ctx,
>  
>     _mesa_reference_shader_program(ctx, &obj->ActiveProgram, NULL);
>     mtx_destroy(&obj->Mutex);
> +   free(obj->Label);
>     ralloc_free(obj);
>  }
>  
> @@ -136,8 +137,8 @@ _mesa_free_pipeline_data(struct gl_context *ctx)
>   * a non-existent ID.  The spec defines ID 0 as being technically
>   * non-existent.
>   */
> -static inline struct gl_pipeline_object *
> -lookup_pipeline_object(struct gl_context *ctx, GLuint id)
> +struct gl_pipeline_object *
> +_mesa_lookup_pipeline_object(struct gl_context *ctx, GLuint id)
>  {
>     if (id == 0)
>        return NULL;
> @@ -225,7 +226,7 @@ _mesa_UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
>  {
>     GET_CURRENT_CONTEXT(ctx);
>  
> -   struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline);
> +   struct gl_pipeline_object *pipe = _mesa_lookup_pipeline_object(ctx, pipeline);
>     struct gl_shader_program *shProg = NULL;
>     GLbitfield any_valid_stages;
>  
> @@ -337,7 +338,7 @@ _mesa_ActiveShaderProgram(GLuint pipeline, GLuint program)
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     struct gl_shader_program *shProg = NULL;
> -   struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline);
> +   struct gl_pipeline_object *pipe = _mesa_lookup_pipeline_object(ctx, pipeline);
>  
>     if (program != 0) {
>        shProg = _mesa_lookup_shader_program_err(ctx, program,
> @@ -399,7 +400,7 @@ _mesa_BindProgramPipeline(GLuint pipeline)
>      */
>     if (pipeline) {
>        /* non-default pipeline object */
> -      newObj = lookup_pipeline_object(ctx, pipeline);
> +      newObj = _mesa_lookup_pipeline_object(ctx, pipeline);
>        if (!newObj) {
>           _mesa_error(ctx, GL_INVALID_OPERATION,
>                       "glBindProgramPipeline(non-gen name)");
> @@ -468,7 +469,7 @@ _mesa_DeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
>  
>     for (i = 0; i < n; i++) {
>        struct gl_pipeline_object *obj =
> -         lookup_pipeline_object(ctx, pipelines[i]);
> +         _mesa_lookup_pipeline_object(ctx, pipelines[i]);
>  
>        if (obj) {
>           assert(obj->Name == pipelines[i]);
> @@ -568,7 +569,7 @@ _mesa_IsProgramPipeline(GLuint pipeline)
>  {
>     GET_CURRENT_CONTEXT(ctx);
>  
> -   struct gl_pipeline_object *obj = lookup_pipeline_object(ctx, pipeline);
> +   struct gl_pipeline_object *obj = _mesa_lookup_pipeline_object(ctx, pipeline);
>     if (obj == NULL)
>        return GL_FALSE;
>  
> @@ -582,7 +583,7 @@ void GLAPIENTRY
>  _mesa_GetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
>  {
>     GET_CURRENT_CONTEXT(ctx);
> -   struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline);
> +   struct gl_pipeline_object *pipe = _mesa_lookup_pipeline_object(ctx, pipeline);
>  
>     /* Are geometry shaders available in this context?
>      */
> @@ -841,7 +842,7 @@ _mesa_ValidateProgramPipeline(GLuint pipeline)
>  {
>     GET_CURRENT_CONTEXT(ctx);
>  
> -   struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline);
> +   struct gl_pipeline_object *pipe = _mesa_lookup_pipeline_object(ctx, pipeline);
>  
>     if (!pipe) {
>        _mesa_error(ctx, GL_INVALID_OPERATION,
> @@ -859,7 +860,7 @@ _mesa_GetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>  
> -   struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline);
> +   struct gl_pipeline_object *pipe = _mesa_lookup_pipeline_object(ctx, pipeline);
>  
>     if (!pipe) {
>        _mesa_error(ctx, GL_INVALID_VALUE,
> diff --git a/src/mesa/main/pipelineobj.h b/src/mesa/main/pipelineobj.h
> index b57bcb9..6dee775 100644
> --- a/src/mesa/main/pipelineobj.h
> +++ b/src/mesa/main/pipelineobj.h
> @@ -45,6 +45,9 @@ _mesa_init_pipeline(struct gl_context *ctx);
>  extern void
>  _mesa_free_pipeline_data(struct gl_context *ctx);
>  
> +extern struct gl_pipeline_object *
> +_mesa_lookup_pipeline_object(struct gl_context *ctx, GLuint id);
> +
>  extern void
>  _mesa_reference_pipeline_object_(struct gl_context *ctx,
>                                   struct gl_pipeline_object **ptr,




More information about the mesa-dev mailing list