diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 78b025fc96f..d9fcc67b198 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1786,7 +1786,8 @@ unbind_samplerview(struct zink_context *ctx, gl_shader_stage stage, unsigned slo } ctx->feedback_loops &= ~BITFIELD_BIT(idx); } - if (feedback_loops && !ctx->feedback_loops) { + if (!zink_screen(ctx->base.screen)->driver_workarounds.always_feedback_loop && + feedback_loops && !ctx->feedback_loops) { /* unset feedback loop bits */ if (ctx->gfx_pipeline_state.feedback_loop) ctx->gfx_pipeline_state.dirty = true; @@ -2825,7 +2826,8 @@ unbind_fb_surface(struct zink_context *ctx, struct pipe_surface *surf, unsigned ctx->rp_layout_changed = true; } ctx->feedback_loops &= ~BITFIELD_BIT(idx); - if (feedback_loops && !ctx->feedback_loops) { + if (!zink_screen(ctx->base.screen)->driver_workarounds.always_feedback_loop && + feedback_loops && !ctx->feedback_loops) { /* unset feedback loop bits */ if (ctx->gfx_pipeline_state.feedback_loop) ctx->gfx_pipeline_state.dirty = true; diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index af914d1ed02..e9517baa1ee 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -2267,6 +2267,20 @@ init_driver_workarounds(struct zink_screen *screen) screen->driver_workarounds.z16_unscaled_bias = 1<<15; else screen->driver_workarounds.z16_unscaled_bias = 1<<16; + /* these drivers don't use VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT, so it can always be set */ + switch (screen->info.driver_props.driverID) { + case VK_DRIVER_ID_MESA_RADV: + case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA: + case VK_DRIVER_ID_MESA_LLVMPIPE: + case VK_DRIVER_ID_MESA_VENUS: + case VK_DRIVER_ID_NVIDIA_PROPRIETARY: + case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS: + case VK_DRIVER_ID_IMAGINATION_PROPRIETARY: + screen->driver_workarounds.always_feedback_loop = screen->info.have_EXT_attachment_feedback_loop_layout; + break; + default: + break; + } } static struct zink_screen * diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 0f0a5c3f86c..567a970f7d4 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1167,6 +1167,7 @@ struct zink_screen { bool broken_l4a4; bool depth_clip_control_missing; bool implicit_sync; + bool always_feedback_loop; bool force_pipeline_library; unsigned z16_unscaled_bias; unsigned z24_unscaled_bias;