[Mesa-dev] [PATCH 1/7] mesa: optionally associate a gl_program to ati_fragment_shader

Ian Romanick idr at freedesktop.org
Thu Feb 25 18:38:23 UTC 2016


On 02/24/2016 05:37 PM, Brian Paul wrote:
> On 02/24/2016 04:35 PM, Miklós Máté wrote:
>> the state tracker will use it
>>
>> Signed-off-by: Miklós Máté <mtmkls at gmail.com>
>> ---
>>   src/mesa/drivers/common/driverfuncs.c |  3 +++
>>   src/mesa/main/atifragshader.c         | 13 ++++++++++++-
>>   src/mesa/main/dd.h                    |  7 ++++++-
>>   src/mesa/main/mtypes.h                |  1 +
>>   src/mesa/main/state.c                 | 14 +++++++++++++-
>>   5 files changed, 35 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/mesa/drivers/common/driverfuncs.c
>> b/src/mesa/drivers/common/driverfuncs.c
>> index 752aaf6..65a0cf8 100644
>> --- a/src/mesa/drivers/common/driverfuncs.c
>> +++ b/src/mesa/drivers/common/driverfuncs.c
>> @@ -117,6 +117,9 @@ _mesa_init_driver_functions(struct
>> dd_function_table *driver)
>>      driver->NewProgram = _mesa_new_program;
>>      driver->DeleteProgram = _mesa_delete_program;
>>
>> +   /* ATI_fragment_shader */
>> +   driver->NewATIfs = NULL;
>> +
>>      /* simple state commands */
>>      driver->AlphaFunc = NULL;
>>      driver->BlendColor = NULL;
>> diff --git a/src/mesa/main/atifragshader.c
>> b/src/mesa/main/atifragshader.c
>> index 8fcbff6..34f45c6 100644
>> --- a/src/mesa/main/atifragshader.c
>> +++ b/src/mesa/main/atifragshader.c
>> @@ -30,6 +30,7 @@
>>   #include "main/mtypes.h"
>>   #include "main/dispatch.h"
>>   #include "main/atifragshader.h"
>> +#include "program/program.h"
>>
>>   #define MESA_DEBUG_ATI_FS 0
>>
>> @@ -63,6 +64,7 @@ _mesa_delete_ati_fragment_shader(struct gl_context
>> *ctx, struct ati_fragment_sha
>>         free(s->Instructions[i]);
>>         free(s->SetupInst[i]);
>>      }
>> +   _mesa_reference_program(ctx, &s->Program, NULL);
>>      free(s);
>>   }
>>
>> @@ -321,6 +323,8 @@ _mesa_BeginFragmentShaderATI(void)
>>            free(ctx->ATIFragmentShader.Current->SetupInst[i]);
>>      }
>>
>> +   _mesa_reference_program(ctx,
>> &ctx->ATIFragmentShader.Current->Program, NULL);
>> +
>>      /* malloc the instructions here - not sure if the best place but its
>>         a start */
>>      for (i = 0; i < MAX_NUM_PASSES_ATI; i++) {
>> @@ -405,7 +409,14 @@ _mesa_EndFragmentShaderATI(void)
>>      }
>>   #endif
>>
>> -   if (!ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_SHADER_ATI,
>> NULL)) {
>> +   if (ctx->Driver.NewATIfs) {
>> +      struct gl_program *prog = ctx->Driver.NewATIfs(ctx,
>> +                                                    
>> ctx->ATIFragmentShader.Current);
>> +      _mesa_reference_program(ctx,
>> &ctx->ATIFragmentShader.Current->Program, prog);
>> +   }
>> +
>> +   if (!ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_SHADER_ATI,
>> +                                        curProg->Program)) {
>>         ctx->ATIFragmentShader.Current->isValid = GL_FALSE;
>>         /* XXX is this the right error? */
>>         _mesa_error(ctx, GL_INVALID_OPERATION,
>> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
>> index 3f5aa5d..8410a15 100644
>> --- a/src/mesa/main/dd.h
>> +++ b/src/mesa/main/dd.h
>> @@ -473,7 +473,12 @@ struct dd_function_table {
>>      struct gl_program * (*NewProgram)(struct gl_context *ctx, GLenum
>> target,
>>                                        GLuint id);
>>      /** Delete a program */
>> -   void (*DeleteProgram)(struct gl_context *ctx, struct gl_program
>> *prog);
>> +   void (*DeleteProgram)(struct gl_context *ctx, struct gl_program
>> *prog);
>> +   /**
>> +    * Allocate a program to associate with the new ATI fragment
>> shader (optional)
>> +    */
>> +   struct gl_program * (*NewATIfs)(struct gl_context *ctx,
>> +         struct ati_fragment_shader *curProg);
> 
> The second line of the function decl should be indented more.  See other
> nearby functions for examples.

Also... what changed in the DeleteProgram line?  I've been staring at
it, but I can't see the sailboat.

> Patch looks OK otherwise.
> 
> Acked-by: Brian Paul <brianp at vmware.com>

With the various whitespace issues fixed (and I think the DeleteProgram
change is a whitespace issue of some sort), this patch is

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

Miklós, I assume you need someone to commit this for you?  I can fix the
minor whitespace problems and commit it.

>>      /**
>>       * Notify driver that a program string (and GPU code) has been
>> specified
>>       * or modified.  Return GL_TRUE or GL_FALSE to indicate if the
>> program is
>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>> index 12d3863..22e8a21 100644
>> --- a/src/mesa/main/mtypes.h
>> +++ b/src/mesa/main/mtypes.h
>> @@ -2197,6 +2197,7 @@ struct ati_fragment_shader
>>      GLboolean interpinp1;
>>      GLboolean isValid;
>>      GLuint swizzlerq;
>> +   struct gl_program *Program;
>>   };
>>
>>   /**
>> diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
>> index 57f1341..f4e8288 100644
>> --- a/src/mesa/main/state.c
>> +++ b/src/mesa/main/state.c
>> @@ -124,7 +124,8 @@ update_program(struct gl_context *ctx)
>>       * follows:
>>       *   1. OpenGL 2.0/ARB vertex/fragment shaders
>>       *   2. ARB/NV vertex/fragment programs
>> -    *   3. Programs derived from fixed-function state.
>> +    *   3. ATI fragment shader
>> +    *   4. Programs derived from fixed-function state.
>>       *
>>       * Note: it's possible for a vertex shader to get used with a
>> fragment
>>       * program (and vice versa) here, but in practice that shouldn't
>> ever
>> @@ -152,6 +153,17 @@ update_program(struct gl_context *ctx)
>>         _mesa_reference_fragprog(ctx,
>> &ctx->FragmentProgram._TexEnvProgram,
>>                      NULL);
>>      }
>> +   else if (ctx->ATIFragmentShader._Enabled &&
>> +            ctx->ATIFragmentShader.Current->Program) {
>> +       /* Use the enabled ATI fragment shader's associated program */
>> +      _mesa_reference_shader_program(ctx,
>> +                                    
>> &ctx->_Shader->_CurrentFragmentProgram,
>> +                                     NULL);
>> +      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current,
>> +                              
>> gl_fragment_program(ctx->ATIFragmentShader.Current->Program));
>> +      _mesa_reference_fragprog(ctx,
>> &ctx->FragmentProgram._TexEnvProgram,
>> +                               NULL);
>> +   }
>>      else if (ctx->FragmentProgram._MaintainTexEnvProgram) {
>>         /* Use fragment program generated from fixed-function state */
>>         struct gl_shader_program *f =
>> _mesa_get_fixed_func_fragment_program(ctx);
>>
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 



More information about the mesa-dev mailing list