diff options
author | Eric Anholt <[email protected]> | 2011-01-12 12:27:12 -0800 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2011-03-11 12:55:14 -0800 |
commit | b4452c3baad6e0379eeb7f22f2e51d13999e1323 (patch) | |
tree | e8e539bcb32ab63d81cd030d7625eb0e140a28cb /src/mesa | |
parent | 7cb87dffce2c7a37f960f3a865cf92fd193dd8c5 (diff) |
mesa: Track a computed _CurrentFragmentProgram for current gl_shader_program
This is like how we track FragmentProgram._Current for the computed
ARB fragment program for fixed function texenv, but this gives direct
access to the gl_shader_program for drivers to codegen from, skipping
ARB_fp.
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/main/mtypes.h | 1 | ||||
-rw-r--r-- | src/mesa/main/state.c | 13 |
2 files changed, 10 insertions, 4 deletions
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 4f83e2e55c2..81e281941d9 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2191,6 +2191,7 @@ struct gl_shader_state struct gl_shader_program *CurrentVertexProgram; struct gl_shader_program *CurrentGeometryProgram; struct gl_shader_program *CurrentFragmentProgram; + struct gl_shader_program *_CurrentFragmentProgram; /** * Program used by glUniform calls. diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 1b2b2f32464..cf9fe8921f3 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -43,6 +43,7 @@ #include "pixel.h" #include "program/program.h" #include "program/prog_parameter.h" +#include "shaderobj.h" #include "state.h" #include "stencil.h" #include "texenvprogram.h" @@ -249,7 +250,7 @@ update_program(struct gl_context *ctx) { const struct gl_shader_program *vsProg = ctx->Shader.CurrentVertexProgram; const struct gl_shader_program *gsProg = ctx->Shader.CurrentGeometryProgram; - const struct gl_shader_program *fsProg = ctx->Shader.CurrentFragmentProgram; + struct gl_shader_program *fsProg = ctx->Shader.CurrentFragmentProgram; const struct gl_vertex_program *prevVP = ctx->VertexProgram._Current; const struct gl_fragment_program *prevFP = ctx->FragmentProgram._Current; const struct gl_geometry_program *prevGP = ctx->GeometryProgram._Current; @@ -275,20 +276,22 @@ update_program(struct gl_context *ctx) /* Use shader programs */ _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, fsProg->FragmentProgram); + _mesa_reference_shader_program(ctx, &ctx->Shader._CurrentFragmentProgram, + fsProg); } else if (ctx->FragmentProgram._Enabled) { /* use user-defined fragment program */ _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, ctx->FragmentProgram.Current); + _mesa_reference_shader_program(ctx, &ctx->Shader._CurrentFragmentProgram, + 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); -#if 0 _mesa_reference_shader_program(ctx, - &ctx->Shader.CurrentFragmentProgram, f); -#endif + &ctx->Shader._CurrentFragmentProgram, f); _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, f->FragmentProgram); @@ -296,6 +299,8 @@ update_program(struct gl_context *ctx) else { /* no fragment program */ _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL); + _mesa_reference_shader_program(ctx, &ctx->Shader._CurrentFragmentProgram, + NULL); } if (gsProg && gsProg->LinkStatus && gsProg->GeometryProgram) { |