diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 7a7ecb7c9a8..aba401acabf 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -163,9 +163,6 @@ update_descriptor_stage_state(struct zink_context *ctx, enum pipe_shader_type sh { struct zink_shader *zs = shader == PIPE_SHADER_COMPUTE ? ctx->compute_stage : ctx->gfx_stages[shader]; - if (!zink_program_get_descriptor_usage(ctx, shader, type)) - return 0; - uint32_t hash = 0; for (int i = 0; i < zs->num_bindings[type]; i++) { int idx = zs->bindings[type][i].index; @@ -191,30 +188,50 @@ update_descriptor_stage_state(struct zink_context *ctx, enum pipe_shader_type sh static void update_descriptor_state(struct zink_context *ctx, enum zink_descriptor_type type, bool is_compute) -{ +{printf("UPDATE\n"); /* we shouldn't be calling this if we don't have to */ assert(!ctx->descriptor_states[is_compute].valid[type]); + bool has_any_usage = false; - if (is_compute) + if (is_compute) { /* just update compute state */ - ctx->descriptor_states[is_compute].state[type] = update_descriptor_stage_state(ctx, PIPE_SHADER_COMPUTE, type); - else { + bool has_usage = zink_program_get_descriptor_usage(ctx, PIPE_SHADER_COMPUTE, type); + if (has_usage) + ctx->descriptor_states[is_compute].state[type] = update_descriptor_stage_state(ctx, PIPE_SHADER_COMPUTE, type); + else + ctx->descriptor_states[is_compute].state[type] = 0; + has_any_usage = has_usage; + } else { /* update all gfx states */ + bool first = true; for (unsigned i = 0; i < ZINK_SHADER_COUNT; i++) { + bool has_usage = false; /* this is the incremental update for the shader stage */ - if (!ctx->gfx_descriptor_states[i].valid[type] && ctx->gfx_stages[i]) { - ctx->gfx_descriptor_states[i].state[type] = update_descriptor_stage_state(ctx, i, type); - ctx->gfx_descriptor_states[i].valid[type] = true; + if (!ctx->gfx_descriptor_states[i].valid[type]) { + ctx->gfx_descriptor_states[i].state[type] = 0; + if (ctx->gfx_stages[i]) { + has_usage = zink_program_get_descriptor_usage(ctx, i, type); + if (has_usage) + ctx->gfx_descriptor_states[i].state[type] = update_descriptor_stage_state(ctx, i, type); + ctx->gfx_descriptor_states[i].valid[type] = has_usage; + } } if (ctx->gfx_descriptor_states[i].valid[type]) { /* this is the overall state update for the descriptor set hash */ - ctx->descriptor_states[is_compute].state[type] = XXH32(&ctx->gfx_descriptor_states[i].state[type], - sizeof(uint32_t), - ctx->descriptor_states[is_compute].state[type]); + if (first) { + /* no need to double hash the first state */ + ctx->descriptor_states[is_compute].state[type] = ctx->gfx_descriptor_states[i].state[type]; + first = false; + } else { + ctx->descriptor_states[is_compute].state[type] = XXH32(&ctx->gfx_descriptor_states[i].state[type], + sizeof(uint32_t), + ctx->descriptor_states[is_compute].state[type]); + } } + has_any_usage |= has_usage; } } - ctx->descriptor_states[is_compute].valid[type] = true; + ctx->descriptor_states[is_compute].valid[type] = has_any_usage; } void diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c index 45f162d4ee3..043e9d651a9 100644 --- a/src/gallium/drivers/zink/zink_descriptors.c +++ b/src/gallium/drivers/zink/zink_descriptors.c @@ -64,12 +64,15 @@ desc_state_hash(const void *key) { const struct zink_descriptor_state_key *d_key = (void*)key; uint32_t hash = 0; - /* this is a compute shader */ - if (!d_key->exists[PIPE_SHADER_FRAGMENT]) - return d_key->state[0]; + bool first = true; for (unsigned i = 0; i < ZINK_SHADER_COUNT; i++) { - if (d_key->exists[i]) - hash = XXH32(&d_key->state[i], sizeof(uint32_t), hash); + if (d_key->exists[i]) { + if (!first) + hash = XXH32(&d_key->state[i], sizeof(uint32_t), hash); + else + hash = d_key->state[i]; + first = false; + } } return hash; }