[Mesa-dev] [PATCH 1/7] mesa: optionally associate a gl_program to ati_fragment_shader
Brian Paul
brianp at vmware.com
Thu Feb 25 01:37:11 UTC 2016
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.
Patch looks OK otherwise.
Acked-by: Brian Paul <brianp at vmware.com>
> /**
> * 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);
>
More information about the mesa-dev
mailing list