Module: Mesa Branch: main Commit: 4d2a3b95730c4781234096778043f987234b6a4c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4d2a3b95730c4781234096778043f987234b6a4c
Author: Rhys Perry <pendingchao...@gmail.com> Date: Wed Oct 18 15:34:45 2023 +0100 radv: add radv_disable_trunc_coord option Signed-off-by: Rhys Perry <pendingchao...@gmail.com> Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Cc: mesa-stable Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25911> --- src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c | 9 +++++---- src/amd/vulkan/radv_device.c | 14 ++++++++++++++ src/amd/vulkan/radv_instance.c | 3 +++ src/amd/vulkan/radv_pipeline.c | 5 ++++- src/amd/vulkan/radv_private.h | 4 ++++ src/amd/vulkan/radv_sampler.c | 5 +++-- src/amd/vulkan/radv_shader.h | 1 + src/util/driconf.h | 4 ++++ 8 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c index a5d91119b8d..210a1357f00 100644 --- a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c +++ b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c @@ -34,7 +34,7 @@ typedef struct { uint32_t address32_hi; bool disable_aniso_single_level; bool has_image_load_dcc_bug; - bool conformant_trunc_coord; + bool disable_tg4_trunc_coord; const struct radv_shader_args *args; const struct radv_shader_info *info; @@ -246,7 +246,7 @@ get_sampler_desc(nir_builder *b, apply_layout_state *state, nir_deref_instr *der } uint32_t dword0_mask = - tex->op == nir_texop_tg4 && !state->conformant_trunc_coord ? C_008F30_TRUNC_COORD : 0xffffffffu; + tex->op == nir_texop_tg4 && state->disable_tg4_trunc_coord ? C_008F30_TRUNC_COORD : 0xffffffffu; const uint32_t *samplers = radv_immutable_samplers(layout, binding); return nir_imm_ivec4(b, samplers[constant_index * 4 + 0] & dword0_mask, samplers[constant_index * 4 + 1], samplers[constant_index * 4 + 2], samplers[constant_index * 4 + 3]); @@ -330,7 +330,7 @@ get_sampler_desc(nir_builder *b, apply_layout_state *state, nir_deref_instr *der comp[6] = nir_iand_imm(b, comp[6], C_00A018_WRITE_COMPRESS_ENABLE); return nir_vec(b, comp, 8); - } else if (desc_type == AC_DESC_SAMPLER && tex->op == nir_texop_tg4 && !state->conformant_trunc_coord) { + } else if (desc_type == AC_DESC_SAMPLER && tex->op == nir_texop_tg4 && state->disable_tg4_trunc_coord) { nir_def *comp[4]; for (unsigned i = 0; i < 4; i++) comp[i] = nir_channel(b, desc, i); @@ -507,7 +507,8 @@ radv_nir_apply_pipeline_layout(nir_shader *shader, struct radv_device *device, c .address32_hi = device->physical_device->rad_info.address32_hi, .disable_aniso_single_level = device->instance->disable_aniso_single_level, .has_image_load_dcc_bug = device->physical_device->rad_info.has_image_load_dcc_bug, - .conformant_trunc_coord = device->physical_device->rad_info.conformant_trunc_coord, + .disable_tg4_trunc_coord = + !device->physical_device->rad_info.conformant_trunc_coord && !device->disable_trunc_coord, .args = args, .info = info, .layout = layout, diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 1258a5ae2e4..bc98c173207 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -726,11 +726,13 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr bool use_dgc = false; bool smooth_lines = false; bool mesh_shader_queries = false; + bool dual_src_blend = false; /* Check enabled features */ if (pCreateInfo->pEnabledFeatures) { if (pCreateInfo->pEnabledFeatures->robustBufferAccess) buffer_robustness = MAX2(buffer_robustness, RADV_BUFFER_ROBUSTNESS_1); + dual_src_blend = pCreateInfo->pEnabledFeatures->dualSrcBlend; } vk_foreach_struct_const (ext, pCreateInfo->pNext) { @@ -739,6 +741,7 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr const VkPhysicalDeviceFeatures2 *features = (const void *)ext; if (features->features.robustBufferAccess) buffer_robustness = MAX2(buffer_robustness, RADV_BUFFER_ROBUSTNESS_1); + dual_src_blend |= features->features.dualSrcBlend; break; } case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: { @@ -1147,6 +1150,17 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr fprintf(stderr, "radv: Forcing anisotropy filter to %ix\n", 1 << util_logbase2(device->force_aniso)); } + device->disable_trunc_coord = device->instance->disable_trunc_coord; + + if (device->instance->vk.app_info.engine_name && !strcmp(device->instance->vk.app_info.engine_name, "DXVK")) { + /* For DXVK 2.3.0 and older, use dualSrcBlend to determine if this is D3D9. */ + bool is_d3d9 = !dual_src_blend; + if (device->instance->vk.app_info.engine_version > VK_MAKE_VERSION(2, 3, 0)) + is_d3d9 = device->instance->vk.app_info.app_version & 0x1; + + device->disable_trunc_coord &= !is_d3d9; + } + if (use_perf_counters) { size_t bo_size = PERF_CTR_BO_PASS_OFFSET + sizeof(uint64_t) * PERF_CTR_MAX_PASSES; result = device->ws->buffer_create(device->ws, bo_size, 4096, RADEON_DOMAIN_GTT, diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 57685184d69..370e16a6083 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -144,6 +144,7 @@ static const driOptionDescription radv_dri_options[] = { DRI_CONF_RADV_DISABLE_TC_COMPAT_HTILE_GENERAL(false) DRI_CONF_RADV_DISABLE_DCC(false) DRI_CONF_RADV_DISABLE_ANISO_SINGLE_LEVEL(false) + DRI_CONF_RADV_DISABLE_TRUNC_COORD(false) DRI_CONF_RADV_DISABLE_SINKING_LOAD_INPUT_FS(false) DRI_CONF_RADV_DGC(false) DRI_CONF_RADV_FLUSH_BEFORE_QUERY_COPY(false) @@ -194,6 +195,8 @@ radv_init_dri_options(struct radv_instance *instance) instance->disable_aniso_single_level = driQueryOptionb(&instance->dri_options, "radv_disable_aniso_single_level"); + instance->disable_trunc_coord = driQueryOptionb(&instance->dri_options, "radv_disable_trunc_coord"); + instance->disable_sinking_load_input_fs = driQueryOptionb(&instance->dri_options, "radv_disable_sinking_load_input_fs"); diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index a4351836e76..0e3a79f5307 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -157,6 +157,8 @@ radv_generate_pipeline_key(const struct radv_device *device, const VkPipelineSha key.disable_aniso_single_level = device->instance->disable_aniso_single_level && device->physical_device->rad_info.gfx_level < GFX8; + key.disable_trunc_coord = device->disable_trunc_coord; + key.image_2d_view_of_3d = device->image_2d_view_of_3d && device->physical_device->rad_info.gfx_level == GFX9; key.tex_non_uniform = device->instance->tex_non_uniform; @@ -626,7 +628,8 @@ radv_postprocess_nir(struct radv_device *device, const struct radv_pipeline_key NIR_PASS(_, stage->nir, ac_nir_lower_tex, &(ac_nir_lower_tex_options){ .gfx_level = gfx_level, - .lower_array_layer_round_even = !device->physical_device->rad_info.conformant_trunc_coord, + .lower_array_layer_round_even = + !device->physical_device->rad_info.conformant_trunc_coord || device->disable_trunc_coord, .fix_derivs_in_divergent_cf = fix_derivs_in_divergent_cf, .max_wqm_vgprs = 64, // TODO: improve spiller and RA support for linear VGPRs }); diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 09d7543f8d3..1cfb2af5146 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -410,6 +410,7 @@ struct radv_instance { bool disable_tc_compat_htile_in_general; bool disable_shrink_image_store; bool disable_aniso_single_level; + bool disable_trunc_coord; bool zero_vram; bool disable_sinking_load_input_fs; bool flush_before_query_copy; @@ -1054,6 +1055,9 @@ struct radv_device { /* Whether anisotropy is forced with RADV_TEX_ANISO (-1 is disabled). */ int force_aniso; + /* Always disable TRUNC_COORD. */ + bool disable_trunc_coord; + struct radv_device_border_color_data border_color_data; /* Thread trace. */ diff --git a/src/amd/vulkan/radv_sampler.c b/src/amd/vulkan/radv_sampler.c index 19fb0ef44e6..baf171dd5f7 100644 --- a/src/amd/vulkan/radv_sampler.c +++ b/src/amd/vulkan/radv_sampler.c @@ -200,8 +200,9 @@ radv_init_sampler(struct radv_device *device, struct radv_sampler *sampler, cons device->physical_device->rad_info.gfx_level == GFX8 || device->physical_device->rad_info.gfx_level == GFX9; unsigned filter_mode = radv_tex_filter_mode(sampler->vk.reduction_mode); unsigned depth_compare_func = V_008F30_SQ_TEX_DEPTH_COMPARE_NEVER; - bool trunc_coord = (pCreateInfo->minFilter == VK_FILTER_NEAREST && pCreateInfo->magFilter == VK_FILTER_NEAREST) || - device->physical_device->rad_info.conformant_trunc_coord; + bool trunc_coord = ((pCreateInfo->minFilter == VK_FILTER_NEAREST && pCreateInfo->magFilter == VK_FILTER_NEAREST) || + device->physical_device->rad_info.conformant_trunc_coord) && + !device->disable_trunc_coord; bool uses_border_color = pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER || pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER || pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index ea5ab6cc888..ab0b58d87cf 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -85,6 +85,7 @@ struct radv_pipeline_key { uint32_t use_ngg : 1; uint32_t adjust_frag_coord_z : 1; uint32_t disable_aniso_single_level : 1; + uint32_t disable_trunc_coord : 1; uint32_t disable_sinking_load_input_fs : 1; uint32_t image_2d_view_of_3d : 1; uint32_t primitives_generated_query : 1; diff --git a/src/util/driconf.h b/src/util/driconf.h index 450217931b5..941d15a2f50 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -649,6 +649,10 @@ DRI_CONF_OPT_B(radv_disable_aniso_single_level, def, \ "Disable anisotropic filtering for single level images") +#define DRI_CONF_RADV_DISABLE_TRUNC_COORD(def) \ + DRI_CONF_OPT_B(radv_disable_trunc_coord, def, \ + "Disable TRUNC_COORD to use D3D10/11/12 point sampling behaviour. This has special behaviour for DXVK.") + #define DRI_CONF_RADV_DISABLE_SINKING_LOAD_INPUT_FS(def) \ DRI_CONF_OPT_B(radv_disable_sinking_load_input_fs, def, \ "Disable sinking load inputs for fragment shaders")