zink: move some flags from driver_workarounds to separate struct

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30261>
This commit is contained in:
Mike Blumenkrantz
2024-05-14 10:39:19 -04:00
committed by Marge Bot
parent e2c90da560
commit ec3eb87f91
6 changed files with 28 additions and 25 deletions

View File

@@ -1398,7 +1398,7 @@ zink_screen_init_compiler(struct zink_screen *screen)
screen->nir_options.max_unroll_iterations_fp64 = 32;
}
if (screen->driver_workarounds.io_opt) {
if (screen->driver_compiler_workarounds.io_opt) {
screen->nir_options.io_options |= nir_io_glsl_opt_varyings;
switch (zink_driverid(screen)) {
@@ -2998,7 +2998,7 @@ zink_compiler_assign_io(struct zink_screen *screen, nir_shader *producer, nir_sh
nir_shader_instructions_pass(consumer, rewrite_read_as_0, nir_metadata_dominance, var_in);
}
}
if (consumer->info.stage == MESA_SHADER_FRAGMENT && screen->driver_workarounds.needs_sanitised_layer)
if (consumer->info.stage == MESA_SHADER_FRAGMENT && screen->driver_compiler_workarounds.needs_sanitised_layer)
do_fixup |= clamp_layer_output(producer, consumer, &io.reserved);
}
nir_shader_gather_info(producer, nir_shader_get_entrypoint(producer));
@@ -3671,7 +3671,7 @@ lower_zs_swizzle_tex_instr(nir_builder *b, nir_instr *instr, void *data)
* draw-time shader recompile to do so.
*
* We may also need to apply shader swizzles for
* driver_workarounds.needs_zs_shader_swizzle.
* driver_compiler_workarounds.needs_zs_shader_swizzle.
*/
static bool
lower_zs_swizzle_tex(nir_shader *nir, const void *swizzle, bool shadow_only)

View File

@@ -634,7 +634,7 @@ get_imageview_for_binding(struct zink_context *ctx, gl_shader_stage stage, enum
if (ctx->di.emulate_nonseamless[stage] & ctx->di.cubes[stage] & BITFIELD_BIT(idx))
return sampler_view->cube_array;
bool needs_zs_shader_swizzle = (ctx->di.zs_swizzle[stage].mask & BITFIELD_BIT(idx)) &&
zink_screen(ctx->base.screen)->driver_workarounds.needs_zs_shader_swizzle;
zink_screen(ctx->base.screen)->driver_compiler_workarounds.needs_zs_shader_swizzle;
bool needs_shadow_shader_swizzle = (stage == MESA_SHADER_FRAGMENT) && ctx->gfx_stages[MESA_SHADER_FRAGMENT] &&
(ctx->di.zs_swizzle[MESA_SHADER_FRAGMENT].mask & ctx->gfx_stages[MESA_SHADER_FRAGMENT]->fs.legacy_shadow_mask & BITFIELD_BIT(idx));
if (sampler_view->zs_view && (needs_zs_shader_swizzle || needs_shadow_shader_swizzle))
@@ -1146,7 +1146,7 @@ zink_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *pres,
* value for stencil, which also uses that view).
*/
if (ivci.subresourceRange.aspectMask == VK_IMAGE_ASPECT_DEPTH_BIT ||
zink_screen(ctx->base.screen)->driver_workarounds.needs_zs_shader_swizzle) {
zink_screen(ctx->base.screen)->driver_compiler_workarounds.needs_zs_shader_swizzle) {
VkComponentSwizzle *swizzle = (VkComponentSwizzle*)&ivci.components;
for (unsigned i = 0; i < 4; i++) {
if (swizzle[i] == VK_COMPONENT_SWIZZLE_ONE ||
@@ -2982,7 +2982,7 @@ begin_rendering(struct zink_context *ctx, bool check_msaa_expand)
ALWAYS_INLINE static void
update_layered_rendering_state(struct zink_context *ctx)
{
if (!zink_screen(ctx->base.screen)->driver_workarounds.needs_sanitised_layer)
if (!zink_screen(ctx->base.screen)->driver_compiler_workarounds.needs_sanitised_layer)
return;
unsigned framebffer_is_layered = zink_framebuffer_get_num_layers(&ctx->fb_state) > 1;
VKCTX(CmdPushConstants)(
@@ -5263,10 +5263,10 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
ctx->gfx_pipeline_state.shader_keys.key[MESA_SHADER_FRAGMENT].size = sizeof(struct zink_fs_key);
/* this condition must be updated if new fields are added to zink_cs_key */
if (screen->driver_workarounds.lower_robustImageAccess2)
if (screen->driver_compiler_workarounds.lower_robustImageAccess2)
ctx->compute_pipeline_state.key.size = sizeof(struct zink_cs_key);
if (is_robust && screen->driver_workarounds.lower_robustImageAccess2) {
if (is_robust && screen->driver_compiler_workarounds.lower_robustImageAccess2) {
ctx->compute_pipeline_state.key.key.cs.robust_access = true;
for (gl_shader_stage pstage = MESA_SHADER_VERTEX; pstage < MESA_SHADER_FRAGMENT; pstage++)
ctx->gfx_pipeline_state.shader_keys.key[pstage].key.vs_base.robust_access = true;

View File

@@ -860,7 +860,7 @@ update_cs_shader_module(struct zink_context *ctx, struct zink_compute_program *c
struct zink_shader_module *zm = NULL;
unsigned inline_size = 0, nonseamless_size = 0, zs_swizzle_size = 0;
struct zink_shader_key *key = &ctx->compute_pipeline_state.key;
ASSERTED bool check_robustness = screen->driver_workarounds.lower_robustImageAccess2 && (ctx->flags & PIPE_CONTEXT_ROBUST_BUFFER_ACCESS);
ASSERTED bool check_robustness = screen->driver_compiler_workarounds.lower_robustImageAccess2 && (ctx->flags & PIPE_CONTEXT_ROBUST_BUFFER_ACCESS);
assert(zink_cs_key(key)->robust_access == check_robustness);
if (ctx && zs->info.num_inlinable_uniforms &&
@@ -2007,7 +2007,7 @@ zink_bind_fs_state(struct pipe_context *pctx,
}
zink_set_zs_needs_shader_swizzle_key(ctx, MESA_SHADER_FRAGMENT, false);
if (shadow_mask != ctx->gfx_stages[MESA_SHADER_FRAGMENT]->fs.legacy_shadow_mask &&
!zink_screen(pctx->screen)->driver_workarounds.needs_zs_shader_swizzle)
!zink_screen(pctx->screen)->driver_compiler_workarounds.needs_zs_shader_swizzle)
zink_update_shadow_samplerviews(ctx, shadow_mask | ctx->gfx_stages[MESA_SHADER_FRAGMENT]->fs.legacy_shadow_mask);
if (!ctx->track_renderpasses && !ctx->blitting)
ctx->rp_tc_info_updated = true;

View File

@@ -386,7 +386,7 @@ zink_set_shader_key_base(struct zink_context *ctx, gl_shader_stage pstage)
static inline void
zink_set_zs_needs_shader_swizzle_key(struct zink_context *ctx, gl_shader_stage pstage, bool swizzle_update)
{
if (!zink_screen(ctx->base.screen)->driver_workarounds.needs_zs_shader_swizzle) {
if (!zink_screen(ctx->base.screen)->driver_compiler_workarounds.needs_zs_shader_swizzle) {
if (pstage != MESA_SHADER_FRAGMENT)
return;
const struct zink_fs_key_base *fs = zink_get_fs_base_key(ctx);

View File

@@ -660,7 +660,7 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
return screen->info.feats.features.robustBufferAccess &&
(screen->info.rb2_feats.robustImageAccess2 || screen->driver_workarounds.lower_robustImageAccess2);
(screen->info.rb2_feats.robustImageAccess2 || screen->driver_compiler_workarounds.lower_robustImageAccess2);
case PIPE_CAP_MULTI_DRAW_INDIRECT:
return screen->info.feats.features.multiDrawIndirect;
@@ -2955,10 +2955,10 @@ init_driver_workarounds(struct zink_screen *screen)
*/
switch (zink_driverid(screen)) {
case VK_DRIVER_ID_IMAGINATION_PROPRIETARY:
screen->driver_workarounds.needs_sanitised_layer = true;
screen->driver_compiler_workarounds.needs_sanitised_layer = true;
break;
default:
screen->driver_workarounds.needs_sanitised_layer = false;
screen->driver_compiler_workarounds.needs_sanitised_layer = false;
break;
}
/* these drivers will produce undefined results when using swizzle 1 with combined z/s textures
@@ -2967,15 +2967,15 @@ init_driver_workarounds(struct zink_screen *screen)
switch (zink_driverid(screen)) {
case VK_DRIVER_ID_IMAGINATION_PROPRIETARY:
case VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA:
screen->driver_workarounds.needs_zs_shader_swizzle = true;
screen->driver_compiler_workarounds.needs_zs_shader_swizzle = true;
break;
default:
screen->driver_workarounds.needs_zs_shader_swizzle = false;
screen->driver_compiler_workarounds.needs_zs_shader_swizzle = false;
break;
}
/* When robust contexts are advertised but robustImageAccess2 is not available */
screen->driver_workarounds.lower_robustImageAccess2 =
screen->driver_compiler_workarounds.lower_robustImageAccess2 =
!screen->info.rb2_feats.robustImageAccess2 &&
screen->info.feats.features.robustBufferAccess &&
screen->info.rb_image_feats.robustImageAccess;
@@ -3096,9 +3096,9 @@ init_optimal_keys(struct zink_screen *screen)
!screen->driver_workarounds.no_linestipple &&
!screen->driver_workarounds.no_linesmooth &&
!screen->driver_workarounds.no_hw_gl_point &&
!screen->driver_workarounds.lower_robustImageAccess2 &&
!screen->driver_compiler_workarounds.lower_robustImageAccess2 &&
!screen->driconf.emulate_point_smooth &&
!screen->driver_workarounds.needs_zs_shader_swizzle;
!screen->driver_compiler_workarounds.needs_zs_shader_swizzle;
if (!screen->optimal_keys && zink_debug & ZINK_DEBUG_OPTIMAL_KEYS && !(zink_debug & ZINK_DEBUG_QUIET)) {
fprintf(stderr, "The following criteria are preventing optimal_keys enablement:\n");
if (screen->need_decompose_attrs)
@@ -3107,7 +3107,7 @@ init_optimal_keys(struct zink_screen *screen)
fprintf(stderr, "uniform inlining must be disabled (set ZINK_INLINE_UNIFORMS=0 in your env)\n");
if (screen->driconf.emulate_point_smooth)
fprintf(stderr, "smooth point emulation is enabled\n");
if (screen->driver_workarounds.needs_zs_shader_swizzle)
if (screen->driver_compiler_workarounds.needs_zs_shader_swizzle)
fprintf(stderr, "Z/S shader swizzle workaround is enabled\n");
CHECK_OR_PRINT(have_EXT_line_rasterization);
CHECK_OR_PRINT(line_rast_feats.stippledBresenhamLines);
@@ -3521,7 +3521,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config, int64_t dev
zink_screen_fence_init(&screen->base);
if (zink_debug & ZINK_DEBUG_IOOPT)
screen->driver_workarounds.io_opt = true;
screen->driver_compiler_workarounds.io_opt = true;
zink_screen_init_compiler(screen);
if (!disk_cache_init(screen)) {
if (!screen->driver_name_is_inferred)

View File

@@ -1524,6 +1524,13 @@ struct zink_screen {
VkExtent2D maxSampleLocationGridSize[5];
VkPipelineLayout gfx_push_constant_layout;
struct {
/* these affect shader cache */
bool lower_robustImageAccess2;
bool needs_zs_shader_swizzle;
bool needs_sanitised_layer;
bool io_opt;
} driver_compiler_workarounds;
struct {
bool broken_l4a4;
/* https://gitlab.khronos.org/vulkan/vulkan/-/issues/3306
@@ -1535,15 +1542,11 @@ struct zink_screen {
bool disable_optimized_compile;
bool always_feedback_loop;
bool always_feedback_loop_zs;
bool needs_sanitised_layer;
bool track_renderpasses;
bool no_linestipple;
bool no_linesmooth;
bool no_hw_gl_point;
bool lower_robustImageAccess2;
bool needs_zs_shader_swizzle;
bool can_do_invalid_linear_modifier;
bool io_opt;
bool inconsistent_interpolation;
bool can_2d_view_sparse;
unsigned z16_unscaled_bias;