mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 05:08:08 +02:00
radeonsi: Don't snoop context state while building shaders.
Let's use the shader key describing the state.
Ported from r600g commit b652180107.
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
This commit is contained in:
parent
f3257d80b0
commit
44ef033c25
3 changed files with 27 additions and 17 deletions
|
|
@ -55,6 +55,7 @@ struct si_shader_context
|
|||
struct tgsi_parse_context parse;
|
||||
struct tgsi_token * tokens;
|
||||
struct si_pipe_shader *shader;
|
||||
struct si_shader_key key;
|
||||
unsigned type; /* TGSI_PROCESSOR_* specifies the type of shader. */
|
||||
unsigned ninput_emitted;
|
||||
/* struct list_head inputs; */
|
||||
|
|
@ -405,7 +406,7 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
|
|||
|
||||
if (cbuf >= 0 && cbuf < 8) {
|
||||
struct r600_context *rctx = si_shader_ctx->rctx;
|
||||
compressed = (rctx->export_16bpc >> cbuf) & 0x1;
|
||||
compressed = (si_shader_ctx->key.export_16bpc >> cbuf) & 0x1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -681,7 +682,8 @@ static const struct lp_build_tgsi_action tex_action = {
|
|||
|
||||
int si_pipe_shader_create(
|
||||
struct pipe_context *ctx,
|
||||
struct si_pipe_shader *shader)
|
||||
struct si_pipe_shader *shader,
|
||||
struct si_shader_key key)
|
||||
{
|
||||
struct r600_context *rctx = (struct r600_context*)ctx;
|
||||
struct si_pipe_shader_selector *sel = shader->selector;
|
||||
|
|
@ -718,6 +720,7 @@ int si_pipe_shader_create(
|
|||
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.key = key;
|
||||
si_shader_ctx.type = si_shader_ctx.parse.FullHeader.Processor.Processor;
|
||||
si_shader_ctx.rctx = rctx;
|
||||
|
||||
|
|
|
|||
|
|
@ -77,6 +77,11 @@ struct si_shader {
|
|||
unsigned nr_cbufs;
|
||||
};
|
||||
|
||||
struct si_shader_key {
|
||||
unsigned export_16bpc:8;
|
||||
unsigned nr_cbufs:4;
|
||||
};
|
||||
|
||||
struct si_pipe_shader {
|
||||
struct si_pipe_shader_selector *selector;
|
||||
struct si_pipe_shader *next_variant;
|
||||
|
|
@ -88,11 +93,12 @@ struct si_pipe_shader {
|
|||
unsigned spi_ps_input_ena;
|
||||
unsigned sprite_coord_enable;
|
||||
unsigned so_strides[4];
|
||||
unsigned key;
|
||||
struct si_shader_key key;
|
||||
};
|
||||
|
||||
/* radeonsi_shader.c */
|
||||
int si_pipe_shader_create(struct pipe_context *ctx, struct si_pipe_shader *shader);
|
||||
int si_pipe_shader_create(struct pipe_context *ctx, struct si_pipe_shader *shader,
|
||||
struct si_shader_key key);
|
||||
void si_pipe_shader_destroy(struct pipe_context *ctx, struct si_pipe_shader *shader);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1830,19 +1830,20 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
|
|||
*/
|
||||
|
||||
/* Compute the key for the hw shader variant */
|
||||
static INLINE unsigned si_shader_selector_key(struct pipe_context *ctx,
|
||||
struct si_pipe_shader_selector *sel)
|
||||
static INLINE struct si_shader_key si_shader_selector_key(struct pipe_context *ctx,
|
||||
struct si_pipe_shader_selector *sel)
|
||||
{
|
||||
struct r600_context *rctx = (struct r600_context *)ctx;
|
||||
unsigned key = 0;
|
||||
struct si_shader_key key;
|
||||
memset(&key, 0, sizeof(key));
|
||||
|
||||
if (sel->type == PIPE_SHADER_FRAGMENT) {
|
||||
if (sel->fs_write_all)
|
||||
key |= rctx->framebuffer.nr_cbufs;
|
||||
key |= rctx->export_16bpc << 4;
|
||||
key.nr_cbufs = rctx->framebuffer.nr_cbufs;
|
||||
key.export_16bpc = rctx->export_16bpc;
|
||||
/*if (rctx->queued.named.rasterizer)
|
||||
key |= rctx->queued.named.rasterizer->flatshade << 12;*/
|
||||
/*key |== rctx->two_side << 13;*/
|
||||
key.flatshade = rctx->queued.named.rasterizer->flatshade;*/
|
||||
/*key.color_two_side |== rctx->two_side;*/
|
||||
}
|
||||
|
||||
return key;
|
||||
|
|
@ -1854,7 +1855,7 @@ int si_shader_select(struct pipe_context *ctx,
|
|||
struct si_pipe_shader_selector *sel,
|
||||
unsigned *dirty)
|
||||
{
|
||||
unsigned key;
|
||||
struct si_shader_key key;
|
||||
struct si_pipe_shader * shader = NULL;
|
||||
int r;
|
||||
|
||||
|
|
@ -1864,7 +1865,7 @@ int si_shader_select(struct pipe_context *ctx,
|
|||
* This path is also used for most shaders that don't need multiple
|
||||
* variants, it will cost just a computation of the key and this
|
||||
* test. */
|
||||
if (likely(sel->current && sel->current->key == key)) {
|
||||
if (likely(sel->current && memcmp(&sel->current->key, &key, sizeof(key)) == 0)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1872,7 +1873,7 @@ int si_shader_select(struct pipe_context *ctx,
|
|||
if (sel->num_shaders > 1) {
|
||||
struct si_pipe_shader *p = sel->current, *c = p->next_variant;
|
||||
|
||||
while (c && c->key != key) {
|
||||
while (c && memcmp(&c->key, &key, sizeof(key)) != 0) {
|
||||
p = c;
|
||||
c = c->next_variant;
|
||||
}
|
||||
|
|
@ -1887,10 +1888,10 @@ int si_shader_select(struct pipe_context *ctx,
|
|||
shader = CALLOC(1, sizeof(struct si_pipe_shader));
|
||||
shader->selector = sel;
|
||||
|
||||
r = si_pipe_shader_create(ctx, shader);
|
||||
r = si_pipe_shader_create(ctx, shader, key);
|
||||
if (unlikely(r)) {
|
||||
R600_ERR("Failed to build shader variant (type=%u, key=%u) %d\n",
|
||||
sel->type, key, r);
|
||||
R600_ERR("Failed to build shader variant (type=%u) %d\n",
|
||||
sel->type, r);
|
||||
sel->current = NULL;
|
||||
return r;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue