radv: allow RADV_FORCE_VRS with pipeline VRS declared as dynamic

This is for vkd3d which needs to always declare the VRS dynamic state
because it's fully dynamic in DX12. Ignoring the VRS dynamic state
when it's a no-op seems the best way to handle this, although it's
definitely not perfect.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14910>
This commit is contained in:
Samuel Pitoiset
2022-02-07 09:41:54 +01:00
committed by Marge Bot
parent 413ea503ba
commit 6fba52cfd2
2 changed files with 37 additions and 20 deletions

View File

@@ -6612,6 +6612,23 @@ radv_emit_all_graphics_states(struct radv_cmd_buffer *cmd_buffer, const struct r
} }
} }
if (cmd_buffer->device->force_vrs != RADV_FORCE_VRS_NONE) {
struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
uint64_t dynamic_states =
cmd_buffer->state.dirty & cmd_buffer->state.emitted_pipeline->graphics.needed_dynamic_state;
if ((dynamic_states & RADV_CMD_DIRTY_DYNAMIC_FRAGMENT_SHADING_RATE) &&
d->fragment_shading_rate.size.width == 1 &&
d->fragment_shading_rate.size.height == 1 &&
d->fragment_shading_rate.combiner_ops[0] == VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR &&
d->fragment_shading_rate.combiner_ops[1] == VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR) {
/* When per-vertex VRS is forced and the dynamic fragment shading rate is a no-op, ignore
* it. This is needed for vkd3d-proton because it always declares per-draw VRS as dynamic.
*/
cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_DYNAMIC_FRAGMENT_SHADING_RATE;
}
}
radv_cmd_buffer_flush_dynamic_state(cmd_buffer, pipeline_is_dirty); radv_cmd_buffer_flush_dynamic_state(cmd_buffer, pipeline_is_dirty);
radv_emit_draw_registers(cmd_buffer, info); radv_emit_draw_registers(cmd_buffer, info);

View File

@@ -5719,28 +5719,28 @@ gfx103_pipeline_generate_vrs_state(struct radeon_cmdbuf *ctx_cs,
vk_find_struct_const(pCreateInfo->pNext, PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR) || vk_find_struct_const(pCreateInfo->pNext, PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR) ||
radv_is_state_dynamic(pCreateInfo, VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR); radv_is_state_dynamic(pCreateInfo, VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR);
if (!enable_vrs) { if (!enable_vrs && gfx103_pipeline_vrs_coarse_shading(pipeline)) {
if (gfx103_pipeline_vrs_coarse_shading(pipeline)) { /* When per-draw VRS is not enabled at all, try enabling VRS coarse shading 2x2 if the driver
/* Enable VRS coarse shading 2x2 if the driver determined that * determined that it's safe to enable.
* it's safe to enable. */
*/ mode = V_028064_VRS_COMB_MODE_OVERRIDE;
mode = V_028064_VRS_COMB_MODE_OVERRIDE; rate_x = rate_y = 1;
rate_x = rate_y = 1; } else if (!vk_find_struct_const(pCreateInfo->pNext, PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR) &&
} else if (pipeline->device->force_vrs != RADV_FORCE_VRS_NONE) { pipeline->device->force_vrs != RADV_FORCE_VRS_NONE) {
/* Force enable vertex VRS if requested by the user. */ /* Otherwise, if per-draw VRS is not enabled statically, try forcing per-vertex VRS if
radeon_set_context_reg( * requested by the user. Note that vkd3d-proton always has to declare VRS as dynamic because
ctx_cs, R_028848_PA_CL_VRS_CNTL, * in DX12 it's fully dynamic.
S_028848_SAMPLE_ITER_COMBINER_MODE(V_028848_VRS_COMB_MODE_OVERRIDE) | */
S_028848_VERTEX_RATE_COMBINER_MODE(V_028848_VRS_COMB_MODE_OVERRIDE)); radeon_set_context_reg(ctx_cs, R_028848_PA_CL_VRS_CNTL,
S_028848_SAMPLE_ITER_COMBINER_MODE(V_028848_VRS_COMB_MODE_OVERRIDE) |
S_028848_VERTEX_RATE_COMBINER_MODE(V_028848_VRS_COMB_MODE_OVERRIDE));
/* If the shader is using discard, turn off coarse shading /* If the shader is using discard, turn off coarse shading because discard at 2x2 pixel
* because discard at 2x2 pixel granularity degrades quality * granularity degrades quality too much. MIN allows sample shading but not coarse shading.
* too much. MIN allows sample shading but not coarse shading. */
*/ struct radv_shader *ps = pipeline->shaders[MESA_SHADER_FRAGMENT];
struct radv_shader *ps = pipeline->shaders[MESA_SHADER_FRAGMENT];
mode = ps->info.ps.can_discard ? V_028064_VRS_COMB_MODE_MIN : V_028064_VRS_COMB_MODE_PASSTHRU; mode = ps->info.ps.can_discard ? V_028064_VRS_COMB_MODE_MIN : V_028064_VRS_COMB_MODE_PASSTHRU;
}
} }
radeon_set_context_reg(ctx_cs, R_028064_DB_VRS_OVERRIDE_CNTL, radeon_set_context_reg(ctx_cs, R_028064_DB_VRS_OVERRIDE_CNTL,