zink: remove ctx references from shader compile path
Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12842>
This commit is contained in:
@@ -196,12 +196,12 @@ update_gfx_program(struct zink_context *ctx)
|
|||||||
prog = (struct zink_gfx_program*)entry->data;
|
prog = (struct zink_gfx_program*)entry->data;
|
||||||
u_foreach_bit(stage, prog->stages_present & ~ctx->dirty_shader_stages)
|
u_foreach_bit(stage, prog->stages_present & ~ctx->dirty_shader_stages)
|
||||||
ctx->gfx_pipeline_state.modules[stage] = prog->modules[stage]->shader;
|
ctx->gfx_pipeline_state.modules[stage] = prog->modules[stage]->shader;
|
||||||
zink_update_gfx_program(ctx, prog);
|
|
||||||
} else {
|
} else {
|
||||||
|
ctx->dirty_shader_stages |= bits;
|
||||||
prog = zink_create_gfx_program(ctx, ctx->gfx_stages, ctx->gfx_pipeline_state.vertices_per_patch + 1);
|
prog = zink_create_gfx_program(ctx, ctx->gfx_stages, ctx->gfx_pipeline_state.vertices_per_patch + 1);
|
||||||
entry = _mesa_hash_table_insert_pre_hashed(ht, hash, prog->shaders, prog);
|
_mesa_hash_table_insert_pre_hashed(ht, hash, prog->shaders, prog);
|
||||||
}
|
}
|
||||||
prog = (struct zink_gfx_program*)(entry ? entry->data : NULL);
|
zink_update_gfx_program(ctx, prog);
|
||||||
if (prog && prog != ctx->curr_program)
|
if (prog && prog != ctx->curr_program)
|
||||||
zink_batch_reference_program(&ctx->batch, &prog->base);
|
zink_batch_reference_program(&ctx->batch, &prog->base);
|
||||||
if (ctx->curr_program)
|
if (ctx->curr_program)
|
||||||
|
@@ -105,17 +105,19 @@ keybox_equals(const void *void_a, const void *void_b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shader_key_vs_base_gen(struct zink_context *ctx, struct zink_shader *zs,
|
shader_key_vs_gen(struct zink_screen *screen, struct zink_shader *zs,
|
||||||
struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key)
|
struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key,
|
||||||
|
const struct zink_gfx_pipeline_state *state)
|
||||||
{
|
{
|
||||||
struct zink_vs_key_base *vs_key = &key->key.vs_base;
|
struct zink_vs_key_base *vs_key = &key->key.vs_base;
|
||||||
|
const struct zink_rasterizer_hw_state *rast_state = (void*)state;
|
||||||
key->size = sizeof(struct zink_vs_key_base);
|
key->size = sizeof(struct zink_vs_key_base);
|
||||||
|
|
||||||
vs_key->clip_halfz = ctx->rast_state && ctx->rast_state->base.clip_halfz;
|
vs_key->clip_halfz = rast_state->clip_halfz;
|
||||||
switch (zs->nir->info.stage) {
|
switch (zs->nir->info.stage) {
|
||||||
case MESA_SHADER_VERTEX:
|
case MESA_SHADER_VERTEX:
|
||||||
vs_key->last_vertex_stage = !shaders[PIPE_SHADER_TESS_EVAL] && !shaders[PIPE_SHADER_GEOMETRY];
|
vs_key->last_vertex_stage = !shaders[PIPE_SHADER_TESS_EVAL] && !shaders[PIPE_SHADER_GEOMETRY];
|
||||||
vs_key->push_drawid = ctx->gfx_pipeline_state.drawid_broken;
|
vs_key->push_drawid = state->drawid_broken;
|
||||||
break;
|
break;
|
||||||
case MESA_SHADER_TESS_EVAL:
|
case MESA_SHADER_TESS_EVAL:
|
||||||
vs_key->last_vertex_stage = !shaders[PIPE_SHADER_GEOMETRY];
|
vs_key->last_vertex_stage = !shaders[PIPE_SHADER_GEOMETRY];
|
||||||
@@ -129,36 +131,10 @@ shader_key_vs_base_gen(struct zink_context *ctx, struct zink_shader *zs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shader_key_vs_gen(struct zink_context *ctx, struct zink_shader *zs,
|
shader_key_fs_gen(struct zink_screen *screen, struct zink_shader *zs,
|
||||||
struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key)
|
struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key,
|
||||||
|
const struct zink_gfx_pipeline_state *state)
|
||||||
{
|
{
|
||||||
struct zink_vs_key *vs_key = &key->key.vs;
|
|
||||||
shader_key_vs_base_gen(ctx, zs, shaders, key);
|
|
||||||
unsigned size = MAX2(ctx->element_state->decomposed_attrs_size, ctx->element_state->decomposed_attrs_without_w_size);
|
|
||||||
switch (size) {
|
|
||||||
case 1:
|
|
||||||
vs_key->u8.decomposed_attrs = ctx->element_state->decomposed_attrs;
|
|
||||||
vs_key->u8.decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
vs_key->u16.decomposed_attrs = ctx->element_state->decomposed_attrs;
|
|
||||||
vs_key->u16.decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
vs_key->u32.decomposed_attrs = ctx->element_state->decomposed_attrs;
|
|
||||||
vs_key->u32.decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w;
|
|
||||||
break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
vs_key->size = size;
|
|
||||||
key->size += 2 * size;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
shader_key_fs_gen(struct zink_context *ctx, struct zink_shader *zs,
|
|
||||||
struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key)
|
|
||||||
{
|
|
||||||
struct zink_screen *screen = zink_screen(ctx->base.screen);
|
|
||||||
struct zink_fs_key *fs_key = &key->key.fs;
|
struct zink_fs_key *fs_key = &key->key.fs;
|
||||||
key->size = sizeof(struct zink_fs_key);
|
key->size = sizeof(struct zink_fs_key);
|
||||||
|
|
||||||
@@ -167,34 +143,36 @@ shader_key_fs_gen(struct zink_context *ctx, struct zink_shader *zs,
|
|||||||
* in VK, gl_SampleMask[] is never ignored
|
* in VK, gl_SampleMask[] is never ignored
|
||||||
*/
|
*/
|
||||||
if (zs->nir->info.outputs_written & (1 << FRAG_RESULT_SAMPLE_MASK))
|
if (zs->nir->info.outputs_written & (1 << FRAG_RESULT_SAMPLE_MASK))
|
||||||
fs_key->samples = ctx->gfx_pipeline_state.render_pass->state.samples;
|
fs_key->samples = state->render_pass->state.samples;
|
||||||
fs_key->force_dual_color_blend = screen->driconf.dual_color_blend_by_location &&
|
fs_key->force_dual_color_blend = screen->driconf.dual_color_blend_by_location &&
|
||||||
ctx->gfx_pipeline_state.blend_state &&
|
state->blend_state &&
|
||||||
ctx->gfx_pipeline_state.blend_state->dual_src_blend &&
|
state->blend_state->dual_src_blend &&
|
||||||
ctx->gfx_pipeline_state.blend_state->attachments[1].blendEnable;
|
state->blend_state->attachments[1].blendEnable;
|
||||||
if (ctx->gfx_pipeline_state.has_points && ctx->gfx_pipeline_state.coord_replace_bits) {
|
if (state->has_points && state->coord_replace_bits) {
|
||||||
fs_key->coord_replace_bits = ctx->gfx_pipeline_state.coord_replace_bits;
|
fs_key->coord_replace_bits = state->coord_replace_bits;
|
||||||
fs_key->coord_replace_yinvert = ctx->gfx_pipeline_state.coord_replace_yinvert;
|
fs_key->coord_replace_yinvert = state->coord_replace_yinvert;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shader_key_tcs_gen(struct zink_context *ctx, struct zink_shader *zs,
|
shader_key_tcs_gen(struct zink_screen *screen, struct zink_shader *zs,
|
||||||
struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key)
|
struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key,
|
||||||
|
const struct zink_gfx_pipeline_state *state)
|
||||||
{
|
{
|
||||||
key->size = 0;
|
key->size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef void (*zink_shader_key_gen)(struct zink_context *ctx, struct zink_shader *zs,
|
typedef void (*zink_shader_key_gen)(struct zink_screen *screen, struct zink_shader *zs,
|
||||||
struct zink_shader *shaders[ZINK_SHADER_COUNT],
|
struct zink_shader *shaders[ZINK_SHADER_COUNT],
|
||||||
struct zink_shader_key *key);
|
struct zink_shader_key *key,
|
||||||
|
const struct zink_gfx_pipeline_state *state);
|
||||||
static zink_shader_key_gen shader_key_vtbl[] =
|
static zink_shader_key_gen shader_key_vtbl[] =
|
||||||
{
|
{
|
||||||
[MESA_SHADER_VERTEX] = shader_key_vs_gen,
|
[MESA_SHADER_VERTEX] = shader_key_vs_gen,
|
||||||
[MESA_SHADER_TESS_CTRL] = shader_key_tcs_gen,
|
[MESA_SHADER_TESS_CTRL] = shader_key_tcs_gen,
|
||||||
/* reusing vs key for now since we're only using clip_halfz */
|
/* reusing vs key for now since we're only using clip_halfz */
|
||||||
[MESA_SHADER_TESS_EVAL] = shader_key_vs_base_gen,
|
[MESA_SHADER_TESS_EVAL] = shader_key_vs_gen,
|
||||||
[MESA_SHADER_GEOMETRY] = shader_key_vs_base_gen,
|
[MESA_SHADER_GEOMETRY] = shader_key_vs_gen,
|
||||||
[MESA_SHADER_FRAGMENT] = shader_key_fs_gen,
|
[MESA_SHADER_FRAGMENT] = shader_key_fs_gen,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -212,7 +190,9 @@ get_default_shader_module_ptr(struct zink_gfx_program *prog, struct zink_shader
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct zink_shader_module *
|
static struct zink_shader_module *
|
||||||
get_shader_module_for_stage(struct zink_context *ctx, struct zink_shader *zs, struct zink_gfx_program *prog)
|
get_shader_module_for_stage(struct zink_context *ctx, struct zink_screen *screen,
|
||||||
|
struct zink_shader *zs, struct zink_gfx_program *prog,
|
||||||
|
const struct zink_gfx_pipeline_state *state)
|
||||||
{
|
{
|
||||||
gl_shader_stage stage = zs->nir->info.stage;
|
gl_shader_stage stage = zs->nir->info.stage;
|
||||||
enum pipe_shader_type pstage = pipe_shader_type_from_mesa(stage);
|
enum pipe_shader_type pstage = pipe_shader_type_from_mesa(stage);
|
||||||
@@ -224,7 +204,27 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_shader *zs, st
|
|||||||
uint32_t hash;
|
uint32_t hash;
|
||||||
unsigned base_size = 0;
|
unsigned base_size = 0;
|
||||||
|
|
||||||
shader_key_vtbl[stage](ctx, zs, prog->shaders, &key);
|
shader_key_vtbl[stage](screen, zs, prog->shaders, &key, state);
|
||||||
|
if (ctx && stage == MESA_SHADER_VERTEX) {
|
||||||
|
unsigned size = MAX2(ctx->element_state->decomposed_attrs_size, ctx->element_state->decomposed_attrs_without_w_size);
|
||||||
|
switch (size) {
|
||||||
|
case 1:
|
||||||
|
key.key.vs.u8.decomposed_attrs = ctx->element_state->decomposed_attrs;
|
||||||
|
key.key.vs.u8.decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
key.key.vs.u16.decomposed_attrs = ctx->element_state->decomposed_attrs;
|
||||||
|
key.key.vs.u16.decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
key.key.vs.u32.decomposed_attrs = ctx->element_state->decomposed_attrs;
|
||||||
|
key.key.vs.u32.decomposed_attrs_without_w = ctx->element_state->decomposed_attrs_without_w;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
key.key.vs.size = size;
|
||||||
|
key.size += 2 * size;
|
||||||
|
}
|
||||||
/* this is default variant if there is no default or it matches the default */
|
/* this is default variant if there is no default or it matches the default */
|
||||||
if (pstage != PIPE_SHADER_TESS_CTRL && prog->default_variant_key[pstage]) {
|
if (pstage != PIPE_SHADER_TESS_CTRL && prog->default_variant_key[pstage]) {
|
||||||
const struct keybox *tmp = prog->default_variant_key[pstage];
|
const struct keybox *tmp = prog->default_variant_key[pstage];
|
||||||
@@ -264,7 +264,7 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_shader *zs, st
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
zm->hash = hash;
|
zm->hash = hash;
|
||||||
mod = zink_shader_compile(zink_screen(ctx->base.screen), zs, prog->nir[stage], &key);
|
mod = zink_shader_compile(screen, zs, prog->nir[stage], &key);
|
||||||
if (!mod) {
|
if (!mod) {
|
||||||
ralloc_free(keybox);
|
ralloc_free(keybox);
|
||||||
FREE(zm);
|
FREE(zm);
|
||||||
@@ -300,7 +300,10 @@ destroy_shader_cache(struct zink_screen *screen, struct hash_table *sc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_shader_modules(struct zink_context *ctx, struct zink_gfx_program *prog, uint32_t mask)
|
update_shader_modules(struct zink_context *ctx,
|
||||||
|
struct zink_screen *screen,
|
||||||
|
struct zink_gfx_program *prog, uint32_t mask,
|
||||||
|
struct zink_gfx_pipeline_state *state)
|
||||||
{
|
{
|
||||||
bool hash_changed = false;
|
bool hash_changed = false;
|
||||||
bool default_variants = true;
|
bool default_variants = true;
|
||||||
@@ -308,7 +311,7 @@ update_shader_modules(struct zink_context *ctx, struct zink_gfx_program *prog, u
|
|||||||
uint32_t variant_hash = prog->last_variant_hash;
|
uint32_t variant_hash = prog->last_variant_hash;
|
||||||
u_foreach_bit(pstage, mask) {
|
u_foreach_bit(pstage, mask) {
|
||||||
assert(prog->shaders[pstage]);
|
assert(prog->shaders[pstage]);
|
||||||
struct zink_shader_module *zm = get_shader_module_for_stage(ctx, prog->shaders[pstage], prog);
|
struct zink_shader_module *zm = get_shader_module_for_stage(ctx, screen, prog->shaders[pstage], prog, state);
|
||||||
if (prog->modules[pstage] != zm) {
|
if (prog->modules[pstage] != zm) {
|
||||||
if (prog->modules[pstage])
|
if (prog->modules[pstage])
|
||||||
variant_hash ^= prog->modules[pstage]->hash;
|
variant_hash ^= prog->modules[pstage]->hash;
|
||||||
@@ -317,20 +320,25 @@ update_shader_modules(struct zink_context *ctx, struct zink_gfx_program *prog, u
|
|||||||
default_variants &= zm->default_variant;
|
default_variants &= zm->default_variant;
|
||||||
prog->modules[pstage] = zm;
|
prog->modules[pstage] = zm;
|
||||||
variant_hash ^= prog->modules[pstage]->hash;
|
variant_hash ^= prog->modules[pstage]->hash;
|
||||||
ctx->gfx_pipeline_state.modules[pstage] = zm->shader;
|
state->modules[pstage] = zm->shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hash_changed) {
|
if (hash_changed && state) {
|
||||||
if (!first && likely(ctx->gfx_pipeline_state.pipeline)) //avoid on first hash
|
if (!first && likely(state->pipeline)) //avoid on first hash
|
||||||
ctx->gfx_pipeline_state.final_hash ^= prog->last_variant_hash;
|
state->final_hash ^= prog->last_variant_hash;
|
||||||
|
|
||||||
if (default_variants && !first)
|
if (default_variants && !first)
|
||||||
prog->last_variant_hash = prog->default_variant_hash;
|
prog->last_variant_hash = prog->default_variant_hash;
|
||||||
else
|
else {
|
||||||
prog->last_variant_hash = variant_hash;
|
prog->last_variant_hash = variant_hash;
|
||||||
|
if (first) {
|
||||||
|
p_atomic_dec(&prog->base.reference.count);
|
||||||
|
prog->default_variant_hash = prog->last_variant_hash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ctx->gfx_pipeline_state.final_hash ^= prog->last_variant_hash;
|
state->final_hash ^= prog->last_variant_hash;
|
||||||
ctx->gfx_pipeline_state.modules_changed = true;
|
state->modules_changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -382,7 +390,7 @@ equals_gfx_pipeline_state(const void *a, const void *b)
|
|||||||
void
|
void
|
||||||
zink_update_gfx_program(struct zink_context *ctx, struct zink_gfx_program *prog)
|
zink_update_gfx_program(struct zink_context *ctx, struct zink_gfx_program *prog)
|
||||||
{
|
{
|
||||||
update_shader_modules(ctx, prog, ctx->dirty_shader_stages & prog->stages_present);
|
update_shader_modules(ctx, zink_screen(ctx->base.screen), prog, ctx->dirty_shader_stages & prog->stages_present, &ctx->gfx_pipeline_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
VkPipelineLayout
|
VkPipelineLayout
|
||||||
@@ -477,9 +485,6 @@ zink_create_gfx_program(struct zink_context *ctx,
|
|||||||
|
|
||||||
assign_io(prog, prog->shaders);
|
assign_io(prog, prog->shaders);
|
||||||
|
|
||||||
update_shader_modules(ctx, prog, prog->stages_present);
|
|
||||||
prog->default_variant_hash = prog->last_variant_hash;
|
|
||||||
|
|
||||||
if (stages[PIPE_SHADER_GEOMETRY])
|
if (stages[PIPE_SHADER_GEOMETRY])
|
||||||
prog->last_vertex_stage = stages[PIPE_SHADER_GEOMETRY];
|
prog->last_vertex_stage = stages[PIPE_SHADER_GEOMETRY];
|
||||||
else if (stages[PIPE_SHADER_TESS_EVAL])
|
else if (stages[PIPE_SHADER_TESS_EVAL])
|
||||||
@@ -498,7 +503,7 @@ zink_create_gfx_program(struct zink_context *ctx,
|
|||||||
struct mesa_sha1 sctx;
|
struct mesa_sha1 sctx;
|
||||||
_mesa_sha1_init(&sctx);
|
_mesa_sha1_init(&sctx);
|
||||||
for (int i = 0; i < ZINK_SHADER_COUNT; ++i) {
|
for (int i = 0; i < ZINK_SHADER_COUNT; ++i) {
|
||||||
if (prog->modules[i]) {
|
if (prog->shaders[i]) {
|
||||||
simple_mtx_lock(&prog->shaders[i]->lock);
|
simple_mtx_lock(&prog->shaders[i]->lock);
|
||||||
_mesa_set_add(prog->shaders[i]->programs, prog);
|
_mesa_set_add(prog->shaders[i]->programs, prog);
|
||||||
simple_mtx_unlock(&prog->shaders[i]->lock);
|
simple_mtx_unlock(&prog->shaders[i]->lock);
|
||||||
@@ -507,7 +512,6 @@ zink_create_gfx_program(struct zink_context *ctx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_mesa_sha1_final(&sctx, prog->base.sha1);
|
_mesa_sha1_final(&sctx, prog->base.sha1);
|
||||||
p_atomic_dec(&prog->base.reference.count);
|
|
||||||
|
|
||||||
if (!screen->descriptor_program_init(ctx, &prog->base))
|
if (!screen->descriptor_program_init(ctx, &prog->base))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
Reference in New Issue
Block a user