zink: move tess/geom shader info to vs shader key
now that there exists a shader key for vertex stages, we can stop modifying the zink_shader values and instead use this as a more reliable method of detecting the state Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8682>
This commit is contained in:

committed by
Marge Bot

parent
9b8c121917
commit
26b009b054
@@ -314,17 +314,6 @@ update_so_info(struct zink_shader *sh,
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
last_vertex_stage(struct zink_shader *zs)
|
||||
{
|
||||
assert(zs->nir->info.stage != MESA_SHADER_FRAGMENT);
|
||||
if (zs->has_geometry_shader)
|
||||
return zs->nir->info.stage == MESA_SHADER_GEOMETRY;
|
||||
if (zs->has_tess_shader)
|
||||
return zs->nir->info.stage == MESA_SHADER_TESS_EVAL;
|
||||
return true;
|
||||
}
|
||||
|
||||
VkShaderModule
|
||||
zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct zink_shader_key *key,
|
||||
unsigned char *shader_slot_map, unsigned char *shader_slots_reserved)
|
||||
@@ -333,8 +322,8 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
|
||||
void *streamout = NULL;
|
||||
nir_shader *nir = zs->nir;
|
||||
/* TODO: use a separate mem ctx here for ralloc */
|
||||
if (zs->nir->info.stage != MESA_SHADER_FRAGMENT) {
|
||||
if (last_vertex_stage(zs)) {
|
||||
if (zs->nir->info.stage < MESA_SHADER_FRAGMENT) {
|
||||
if (zink_vs_key(key)->last_vertex_stage) {
|
||||
if (zs->streamout.so_info_slots)
|
||||
streamout = &zs->streamout;
|
||||
|
||||
@@ -343,7 +332,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
|
||||
NIR_PASS_V(nir, nir_lower_clip_halfz);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
} else if (zs->nir->info.stage == MESA_SHADER_FRAGMENT) {
|
||||
if (!zink_fs_key(key)->samples &&
|
||||
nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)) {
|
||||
nir = nir_shader_clone(NULL, zs->nir);
|
||||
|
@@ -73,8 +73,6 @@ struct zink_shader {
|
||||
size_t num_bindings;
|
||||
struct set *programs;
|
||||
|
||||
bool has_tess_shader; // vertex shaders need to know if a tesseval shader exists
|
||||
bool has_geometry_shader; // vertex shaders need to know if a geometry shader exists
|
||||
union {
|
||||
struct zink_shader *generated; // a generated shader that this shader "owns"
|
||||
bool is_generated; // if this is a driver-created shader (e.g., tcs)
|
||||
|
@@ -168,7 +168,6 @@ create_pipeline_layout(VkDevice dev, VkDescriptorSetLayout dsl)
|
||||
return layout;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
shader_key_vs_gen(struct zink_context *ctx, struct zink_shader *zs,
|
||||
struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key)
|
||||
@@ -178,6 +177,19 @@ shader_key_vs_gen(struct zink_context *ctx, struct zink_shader *zs,
|
||||
|
||||
vs_key->shader_id = zs->shader_id;
|
||||
vs_key->clip_halfz = ctx->rast_state->base.clip_halfz;
|
||||
switch (zs->nir->info.stage) {
|
||||
case MESA_SHADER_VERTEX:
|
||||
vs_key->last_vertex_stage = !shaders[PIPE_SHADER_TESS_EVAL] && !shaders[PIPE_SHADER_GEOMETRY];
|
||||
break;
|
||||
case MESA_SHADER_TESS_EVAL:
|
||||
vs_key->last_vertex_stage = !shaders[PIPE_SHADER_GEOMETRY];
|
||||
break;
|
||||
case MESA_SHADER_GEOMETRY:
|
||||
vs_key->last_vertex_stage = true;
|
||||
break;
|
||||
default:
|
||||
unreachable("impossible case");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -332,8 +344,6 @@ update_shader_modules(struct zink_context *ctx, struct zink_shader *stages[ZINK_
|
||||
enum pipe_shader_type type = pipe_shader_type_from_mesa(i);
|
||||
if (dirty[i]) {
|
||||
struct zink_shader_module *zm;
|
||||
dirty[i]->has_geometry_shader = dirty[MESA_SHADER_GEOMETRY] || stages[PIPE_SHADER_GEOMETRY];
|
||||
dirty[i]->has_tess_shader = dirty[MESA_SHADER_TESS_EVAL] || stages[PIPE_SHADER_TESS_EVAL];
|
||||
zm = get_shader_module_for_stage(ctx, dirty[i], prog);
|
||||
zink_shader_module_reference(zink_screen(ctx->base.screen), &prog->modules[type], zm);
|
||||
/* we probably need a new pipeline when we switch shader modules */
|
||||
|
@@ -29,6 +29,7 @@
|
||||
struct zink_vs_key {
|
||||
unsigned shader_id;
|
||||
bool clip_halfz;
|
||||
bool last_vertex_stage;
|
||||
};
|
||||
|
||||
struct zink_fs_key {
|
||||
|
Reference in New Issue
Block a user