diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 7a02c9ab141..14b552249c3 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -13770,6 +13770,8 @@ radv_CmdExecuteGeneratedCommandsEXT(VkCommandBuffer commandBuffer, VkBool32 isPr VK_FROM_HANDLE(radv_indirect_execution_set, ies, pGeneratedCommandsInfo->indirectExecutionSet); VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); const struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); + const struct radv_physical_device *pdev = radv_device_physical(device); + const struct radv_instance *instance = radv_physical_device_instance(pdev); const bool use_predication = radv_use_dgc_predication(cmd_buffer, pGeneratedCommandsInfo); const bool compute = !!(layout->vk.dgc_info & BITFIELD_BIT(MESA_VK_DGC_DISPATCH)); const bool rt = !!(layout->vk.dgc_info & BITFIELD_BIT(MESA_VK_DGC_RT)); @@ -13868,7 +13870,22 @@ radv_CmdExecuteGeneratedCommandsEXT(VkCommandBuffer commandBuffer, VkBool32 isPr ac_emit_cp_pfp_sync_me(cs->b, cmd_buffer->state.predicating); } - radv_dgc_execute_ib(cmd_buffer, pGeneratedCommandsInfo); + /* The Vulkan spec 1.4.349 says: + * + * "VUID-vkCmdExecuteGeneratedCommandsEXT-None-11062 + * If a rendering pass is currently active, the view mask must be 0." + * + * But it's a valid behavior with DX12, so it can be enabled via drirc. + */ + const uint32_t view_mask = instance->drirc.features.allow_dgc_multiview ? cmd_buffer->state.render.view_mask : 0; + if (rt || compute || !view_mask) { + radv_dgc_execute_ib(cmd_buffer, pGeneratedCommandsInfo); + } else { + u_foreach_bit (view, view_mask) { + radv_emit_view_index(&cmd_buffer->state, cmd_buffer->cs, view); + radv_dgc_execute_ib(cmd_buffer, pGeneratedCommandsInfo); + } + } if (rt) { cmd_buffer->push_constant_stages |= RADV_RT_STAGE_BITS; diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 59cfab9147e..81545799f65 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -218,6 +218,7 @@ static const driOptionDescription radv_dri_options[] = { DRI_CONF_RADV_EMULATE_RT(false) DRI_CONF_RADV_ENABLE_FLOAT16_GFX8(false) DRI_CONF_RADV_COOPERATIVE_MATRIX2_NV(false) + DRI_CONF_RADV_ALLOW_DGC_MULTIVIEW(false) DRI_CONF_RADV_WAIT_FOR_VM_MAP_UPDATES(false) DRI_CONF_RADV_NO_IMPLICIT_VARYING_SUBGROUP_SIZE(false) DRI_CONF_RADV_HIDE_REBAR_ON_DGPU(false) @@ -289,6 +290,7 @@ radv_init_dri_features_options(struct radv_instance *instance) struct radv_drirc *drirc = &instance->drirc; drirc->features.cooperative_matrix2_nv = driQueryOptionb(&drirc->options, "radv_cooperative_matrix2_nv"); + drirc->features.allow_dgc_multiview = driQueryOptionb(&drirc->options, "radv_allow_dgc_multiview"); drirc->features.emulate_rt = driQueryOptionb(&drirc->options, "radv_emulate_rt"); drirc->features.expose_float16_gfx8 = driQueryOptionb(&drirc->options, "radv_enable_float16_gfx8"); drirc->features.vk_require_etc2 = driQueryOptionb(&drirc->options, "vk_require_etc2"); diff --git a/src/amd/vulkan/radv_instance.h b/src/amd/vulkan/radv_instance.h index e4ed715e495..a87cf08eaf5 100644 --- a/src/amd/vulkan/radv_instance.h +++ b/src/amd/vulkan/radv_instance.h @@ -75,6 +75,7 @@ struct radv_drirc { struct { bool cooperative_matrix2_nv; + bool allow_dgc_multiview; bool emulate_rt; bool expose_float16_gfx8; bool vk_require_astc; diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index 315f422661e..ba189ae3ce1 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -43,6 +43,7 @@ Application bugs worked around in this file: