summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/i965/brw_ff_gs.c7
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.c39
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.c58
3 files changed, 64 insertions, 40 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_ff_gs.c b/src/mesa/drivers/dri/i965/brw_ff_gs.c
index 016fcdf3db5..14ae4c144e9 100644
--- a/src/mesa/drivers/dri/i965/brw_ff_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_ff_gs.c
@@ -147,8 +147,9 @@ static void compile_ff_gs_prog(struct brw_context *brw,
ralloc_free(mem_ctx);
}
-static void populate_key(struct brw_context *brw,
- struct brw_ff_gs_prog_key *key)
+static void
+brw_ff_gs_populate_key(struct brw_context *brw,
+ struct brw_ff_gs_prog_key *key)
{
static const unsigned swizzle_for_offset[4] = {
BRW_SWIZZLE4(0, 1, 2, 3),
@@ -235,7 +236,7 @@ brw_upload_ff_gs_prog(struct brw_context *brw)
/* Populate the key:
*/
- populate_key(brw, &key);
+ brw_ff_gs_populate_key(brw, &key);
if (brw->ff_gs.prog_active != key.need_gs_prog) {
brw->ctx.NewDriverState |= BRW_NEW_FF_GS_PROG_DATA;
diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
index ffe74768253..e2330499ea0 100644
--- a/src/mesa/drivers/dri/i965/brw_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_gs.c
@@ -288,6 +288,30 @@ do_gs_prog(struct brw_context *brw,
return true;
}
+static void
+brw_gs_populate_key(struct brw_context *brw,
+ struct brw_gs_prog_key *key)
+{
+ struct gl_context *ctx = &brw->ctx;
+ struct brw_stage_state *stage_state = &brw->gs.base;
+ struct brw_geometry_program *gp =
+ (struct brw_geometry_program *) brw->geometry_program;
+ struct gl_program *prog = &gp->program.Base;
+
+ memset(key, 0, sizeof(*key));
+
+ key->base.program_string_id = gp->id;
+ brw_setup_vue_key_clip_info(brw, &key->base,
+ gp->program.Base.UsesClipDistanceOut);
+
+ /* _NEW_TEXTURE */
+ brw_populate_sampler_prog_key_data(ctx, prog, stage_state->sampler_count,
+ &key->base.tex);
+
+ /* BRW_NEW_VUE_MAP_VS */
+ key->input_varyings = brw->vue_map_vs.slots_valid;
+}
+
void
brw_upload_gs_prog(struct brw_context *brw)
{
@@ -327,20 +351,7 @@ brw_upload_gs_prog(struct brw_context *brw)
return;
}
- struct gl_program *prog = &gp->program.Base;
-
- memset(&key, 0, sizeof(key));
-
- key.base.program_string_id = gp->id;
- brw_setup_vue_key_clip_info(brw, &key.base,
- gp->program.Base.UsesClipDistanceOut);
-
- /* _NEW_TEXTURE */
- brw_populate_sampler_prog_key_data(ctx, prog, stage_state->sampler_count,
- &key.base.tex);
-
- /* BRW_NEW_VUE_MAP_VS */
- key.input_varyings = brw->vue_map_vs.slots_valid;
+ brw_gs_populate_key(brw, &key);
if (!brw_search_cache(&brw->cache, BRW_CACHE_GS_PROG,
&key, sizeof(key),
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
index bf16f348ec4..9069596489a 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -401,64 +401,76 @@ brw_setup_vue_key_clip_info(struct brw_context *brw,
}
}
-void
-brw_upload_vs_prog(struct brw_context *brw)
+static void
+brw_vs_populate_key(struct brw_context *brw,
+ struct brw_vs_prog_key *key)
{
struct gl_context *ctx = &brw->ctx;
- struct brw_vs_prog_key key;
/* BRW_NEW_VERTEX_PROGRAM */
struct brw_vertex_program *vp =
(struct brw_vertex_program *)brw->vertex_program;
struct gl_program *prog = (struct gl_program *) brw->vertex_program;
int i;
- if (!brw_state_dirty(brw,
- _NEW_BUFFERS |
- _NEW_LIGHT |
- _NEW_POINT |
- _NEW_POLYGON |
- _NEW_TEXTURE |
- _NEW_TRANSFORM,
- BRW_NEW_VERTEX_PROGRAM |
- BRW_NEW_VS_ATTRIB_WORKAROUNDS))
- return;
-
- memset(&key, 0, sizeof(key));
+ memset(key, 0, sizeof(*key));
/* Just upload the program verbatim for now. Always send it all
* the inputs it asks for, whether they are varying or not.
*/
- key.base.program_string_id = vp->id;
- brw_setup_vue_key_clip_info(brw, &key.base,
+ key->base.program_string_id = vp->id;
+ brw_setup_vue_key_clip_info(brw, &key->base,
vp->program.Base.UsesClipDistanceOut);
/* _NEW_POLYGON */
if (brw->gen < 6) {
- key.copy_edgeflag = (ctx->Polygon.FrontMode != GL_FILL ||
- ctx->Polygon.BackMode != GL_FILL);
+ key->copy_edgeflag = (ctx->Polygon.FrontMode != GL_FILL ||
+ ctx->Polygon.BackMode != GL_FILL);
}
if (prog->OutputsWritten & (VARYING_BIT_COL0 | VARYING_BIT_COL1 |
VARYING_BIT_BFC0 | VARYING_BIT_BFC1)) {
/* _NEW_LIGHT | _NEW_BUFFERS */
- key.clamp_vertex_color = ctx->Light._ClampVertexColor;
+ key->clamp_vertex_color = ctx->Light._ClampVertexColor;
}
/* _NEW_POINT */
if (brw->gen < 6 && ctx->Point.PointSprite) {
for (i = 0; i < 8; i++) {
if (ctx->Point.CoordReplace[i])
- key.point_coord_replace |= (1 << i);
+ key->point_coord_replace |= (1 << i);
}
}
/* _NEW_TEXTURE */
brw_populate_sampler_prog_key_data(ctx, prog, brw->vs.base.sampler_count,
- &key.base.tex);
+ &key->base.tex);
/* BRW_NEW_VS_ATTRIB_WORKAROUNDS */
- memcpy(key.gl_attrib_wa_flags, brw->vb.attrib_wa_flags,
+ memcpy(key->gl_attrib_wa_flags, brw->vb.attrib_wa_flags,
sizeof(brw->vb.attrib_wa_flags));
+}
+
+void
+brw_upload_vs_prog(struct brw_context *brw)
+{
+ struct gl_context *ctx = &brw->ctx;
+ struct brw_vs_prog_key key;
+ /* BRW_NEW_VERTEX_PROGRAM */
+ struct brw_vertex_program *vp =
+ (struct brw_vertex_program *)brw->vertex_program;
+
+ if (!brw_state_dirty(brw,
+ _NEW_BUFFERS |
+ _NEW_LIGHT |
+ _NEW_POINT |
+ _NEW_POLYGON |
+ _NEW_TEXTURE |
+ _NEW_TRANSFORM,
+ BRW_NEW_VERTEX_PROGRAM |
+ BRW_NEW_VS_ATTRIB_WORKAROUNDS))
+ return;
+
+ brw_vs_populate_key(brw, &key);
if (!brw_search_cache(&brw->cache, BRW_CACHE_VS_PROG,
&key, sizeof(key),