diff options
author | Timothy Arceri <timothy.arceri@collabora.com> | 2016-06-18 16:18:17 +1000 |
---|---|---|
committer | Timothy Arceri <timothy.arceri@collabora.com> | 2016-09-27 11:11:15 +1000 |
commit | 856e0bd707d2ead26eb3a04be08885487850be38 (patch) | |
tree | e8c640e5ddba6d940c9ed1986c7a5cb3640d0745 /src/mesa/drivers/dri/i965/brw_tcs.c | |
parent | ec75570415a23f9b456b1fedf7b0c287b3e3c5c5 (diff) | |
download | external_mesa3d-856e0bd707d2ead26eb3a04be08885487850be38.zip external_mesa3d-856e0bd707d2ead26eb3a04be08885487850be38.tar.gz external_mesa3d-856e0bd707d2ead26eb3a04be08885487850be38.tar.bz2 |
i965: create populate key functions for tcs and tes
These will be used by the on disk shader cache.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_tcs.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_tcs.c | 70 |
1 files changed, 42 insertions, 28 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c b/src/mesa/drivers/dri/i965/brw_tcs.c index 7e6c69a..d62ad66 100644 --- a/src/mesa/drivers/dri/i965/brw_tcs.c +++ b/src/mesa/drivers/dri/i965/brw_tcs.c @@ -312,55 +312,69 @@ brw_codegen_tcs_prog(struct brw_context *brw, return true; } - void -brw_upload_tcs_prog(struct brw_context *brw, - uint64_t per_vertex_slots, - uint32_t per_patch_slots) +brw_tcs_populate_key(struct brw_context *brw, + struct brw_tcs_prog_key *key) { - struct gl_context *ctx = &brw->ctx; - struct gl_shader_program **current = ctx->_Shader->CurrentProgram; - struct brw_stage_state *stage_state = &brw->tcs.base; - struct brw_tcs_prog_key key; - /* BRW_NEW_TESS_PROGRAMS */ + uint64_t per_vertex_slots = brw->tess_eval_program->Base.InputsRead; + uint32_t per_patch_slots = brw->tess_eval_program->Base.PatchInputsRead; + struct brw_tess_ctrl_program *tcp = (struct brw_tess_ctrl_program *) brw->tess_ctrl_program; struct brw_tess_eval_program *tep = (struct brw_tess_eval_program *) brw->tess_eval_program; - assert(tep); - - if (!brw_state_dirty(brw, - _NEW_TEXTURE, - BRW_NEW_PATCH_PRIMITIVE | - BRW_NEW_TESS_PROGRAMS)) - return; - struct gl_program *prog = &tcp->program.Base; - memset(&key, 0, sizeof(key)); + memset(key, 0, sizeof(*key)); + + if (brw->tess_ctrl_program) { + per_vertex_slots |= brw->tess_ctrl_program->Base.OutputsWritten; + per_patch_slots |= brw->tess_ctrl_program->Base.PatchOutputsWritten; + } if (brw->gen < 8 || !tcp) - key.input_vertices = ctx->TessCtrlProgram.patch_vertices; - key.outputs_written = per_vertex_slots; - key.patch_outputs_written = per_patch_slots; + key->input_vertices = brw->ctx.TessCtrlProgram.patch_vertices; + key->outputs_written = per_vertex_slots; + key->patch_outputs_written = per_patch_slots; /* We need to specialize our code generation for tessellation levels * based on the domain the DS is expecting to tessellate. */ - key.tes_primitive_mode = tep->program.PrimitiveMode; - key.quads_workaround = brw->gen < 9 && - tep->program.PrimitiveMode == GL_QUADS && - tep->program.Spacing == GL_EQUAL; + key->tes_primitive_mode = tep->program.PrimitiveMode; + key->quads_workaround = brw->gen < 9 && + tep->program.PrimitiveMode == GL_QUADS && + tep->program.Spacing == GL_EQUAL; if (tcp) { - key.program_string_id = tcp->id; + key->program_string_id = tcp->id; /* _NEW_TEXTURE */ - brw_populate_sampler_prog_key_data(ctx, prog, &key.tex); + brw_populate_sampler_prog_key_data(&brw->ctx, prog, &key->tex); } else { - key.outputs_written = tep->program.Base.InputsRead; + key->outputs_written = tep->program.Base.InputsRead; } +} + +void +brw_upload_tcs_prog(struct brw_context *brw) +{ + struct gl_shader_program **current = brw->ctx._Shader->CurrentProgram; + struct brw_stage_state *stage_state = &brw->tcs.base; + struct brw_tcs_prog_key key; + /* BRW_NEW_TESS_PROGRAMS */ + struct brw_tess_ctrl_program *tcp = + (struct brw_tess_ctrl_program *) brw->tess_ctrl_program; + struct brw_tess_eval_program *tep = + (struct brw_tess_eval_program *) brw->tess_eval_program; + assert(tep); + + if (!brw_state_dirty(brw, + _NEW_TEXTURE, + BRW_NEW_PATCH_PRIMITIVE | + BRW_NEW_TESS_PROGRAMS)) + return; + brw_tcs_populate_key(brw, &key); if (!brw_search_cache(&brw->cache, BRW_CACHE_TCS_PROG, &key, sizeof(key), |