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é <mtm...@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 <bri...@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.roman...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev