diff options
author | Michel Dänzer <[email protected]> | 2012-08-23 17:10:37 +0200 |
---|---|---|
committer | Michel Dänzer <[email protected]> | 2012-08-27 11:51:41 +0200 |
commit | d1e40b3d40b2e90ad4f275565f1ae27fe6f964cc (patch) | |
tree | 41a93fa06f09fad3ba0ae3071a4997c58c0406e6 /src/gallium/drivers/radeonsi/radeonsi_shader.c | |
parent | 84fdda280f4361add3802476ce9a30ac1c0b4c69 (diff) |
radeonsi: Maintain cache of pixel shader variants according to contxt state.
Mostly inspired by r600g commit 4acf71f01ea1edb253cd38cc059d4af1a2a40bf4
('r600g: cache shader variants instead of rebuilding v3').
Signed-off-by: Michel Dänzer <[email protected]>
Reviewed-by: Christian König <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
Diffstat (limited to 'src/gallium/drivers/radeonsi/radeonsi_shader.c')
-rw-r--r-- | src/gallium/drivers/radeonsi/radeonsi_shader.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c index 0f2aaef8175..671eda4a381 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c @@ -282,7 +282,8 @@ static void declare_input_fs( switch (decl->Interp.Interpolate) { case TGSI_INTERPOLATE_COLOR: /* XXX: Flat shading hangs the GPU */ - if (si_shader_ctx->rctx->queued.named.rasterizer->flatshade) { + if (si_shader_ctx->rctx->queued.named.rasterizer && + si_shader_ctx->rctx->queued.named.rasterizer->flatshade) { #if 0 intr_name = "llvm.SI.fs.interp.constant"; #else @@ -617,6 +618,7 @@ int si_pipe_shader_create( struct si_pipe_shader *shader) { struct r600_context *rctx = (struct r600_context*)ctx; + struct si_pipe_shader_selector *sel = shader->selector; struct si_shader_context si_shader_ctx; struct tgsi_shader_info shader_info; struct lp_build_tgsi_context * bld_base; @@ -633,7 +635,7 @@ int si_pipe_shader_create( radeon_llvm_context_init(&si_shader_ctx.radeon_bld); bld_base = &si_shader_ctx.radeon_bld.soa.bld_base; - tgsi_scan_shader(shader->tokens, &shader_info); + tgsi_scan_shader(sel->tokens, &shader_info); bld_base->info = &shader_info; bld_base->emit_fetch_funcs[TGSI_FILE_CONSTANT] = fetch_constant; bld_base->emit_epilogue = si_llvm_emit_epilogue; @@ -642,7 +644,7 @@ int si_pipe_shader_create( bld_base->op_actions[TGSI_OPCODE_TXP] = tex_action; si_shader_ctx.radeon_bld.load_input = declare_input; - si_shader_ctx.tokens = shader->tokens; + si_shader_ctx.tokens = sel->tokens; tgsi_parse_init(&si_shader_ctx.parse, si_shader_ctx.tokens); si_shader_ctx.shader = shader; si_shader_ctx.type = si_shader_ctx.parse.FullHeader.Processor.Processor; @@ -653,10 +655,10 @@ int si_pipe_shader_create( /* Dump TGSI code before doing TGSI->LLVM conversion in case the * conversion fails. */ if (dump) { - tgsi_dump(shader->tokens, 0); + tgsi_dump(sel->tokens, 0); } - if (!lp_build_tgsi_llvm(bld_base, shader->tokens)) { + if (!lp_build_tgsi_llvm(bld_base, sel->tokens)) { fprintf(stderr, "Failed to translate shader from TGSI to LLVM\n"); return -EINVAL; } @@ -710,6 +712,4 @@ int si_pipe_shader_create( void si_pipe_shader_destroy(struct pipe_context *ctx, struct si_pipe_shader *shader) { si_resource_reference(&shader->bo, NULL); - - memset(&shader->shader,0,sizeof(struct si_shader)); } |