mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-22 04:10:40 +01:00
radv,aco: don't use MUBUF for multi-channel loads on GFX8 with robustness2
Fixes several dEQP-VK.robustness.robustness2.* tests on GFX8. Generations
other than GFX8 don't fail the tests because bounds-checking is done using
the index (making it per-vertex).
fossil-db (Polaris):
Totals from 1387 (0.99% of 140385) affected shaders:
(no statistics affected)
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Fixes: 03a0d39366 ("aco: use MUBUF in some situations instead of splitting vertex fetches")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9557>
This commit is contained in:
parent
6f104e9ac8
commit
5ee36cb231
5 changed files with 21 additions and 4 deletions
|
|
@ -4749,12 +4749,18 @@ void visit_load_input(isel_context *ctx, nir_intrinsic_instr *instr)
|
|||
unsigned fetch_offset = attrib_offset + channel_start * vtx_info->chan_byte_size;
|
||||
bool expanded = false;
|
||||
|
||||
/* use MUBUF when possible to avoid possible alignment issues */
|
||||
/* Use MUBUF when possible to avoid possible alignment issues.
|
||||
* We don't use MUBUF for multi-component loads because
|
||||
* robustBufferAccess2 requires that bounds checking is per-attribute,
|
||||
* but MUBUF is per-dword. Other generations get around this by doing
|
||||
* bounds checking with the index, instead of the offset like GFX8. */
|
||||
/* TODO: we could use SDWA to unpack 8/16-bit attributes without extra instructions */
|
||||
bool use_mubuf = (nfmt == V_008F0C_BUF_NUM_FORMAT_FLOAT ||
|
||||
nfmt == V_008F0C_BUF_NUM_FORMAT_UINT ||
|
||||
nfmt == V_008F0C_BUF_NUM_FORMAT_SINT) &&
|
||||
vtx_info->chan_byte_size == 4;
|
||||
vtx_info->chan_byte_size == 4 &&
|
||||
(fetch_component == 1 || ctx->options->chip_class != GFX8 ||
|
||||
!ctx->options->robust_buffer_access2);
|
||||
unsigned fetch_dfmt = V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
if (!use_mubuf) {
|
||||
fetch_dfmt = get_fetch_data_format(ctx, vtx_info, fetch_offset, attrib_stride, &fetch_component);
|
||||
|
|
|
|||
|
|
@ -2672,6 +2672,7 @@ VkResult radv_CreateDevice(
|
|||
|
||||
bool keep_shader_info = false;
|
||||
bool robust_buffer_access = false;
|
||||
bool robust_buffer_access2 = false;
|
||||
bool overallocation_disallowed = false;
|
||||
bool custom_border_colors = false;
|
||||
|
||||
|
|
@ -2710,6 +2711,12 @@ VkResult radv_CreateDevice(
|
|||
custom_border_colors = border_color_features->customBorderColors;
|
||||
break;
|
||||
}
|
||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
|
||||
const VkPhysicalDeviceRobustness2FeaturesEXT *features = (const void *)ext;
|
||||
if (features->robustBufferAccess2)
|
||||
robust_buffer_access2 = true;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -2753,7 +2760,8 @@ VkResult radv_CreateDevice(
|
|||
device->enabled_extensions.EXT_buffer_device_address ||
|
||||
device->enabled_extensions.KHR_buffer_device_address;
|
||||
|
||||
device->robust_buffer_access = robust_buffer_access;
|
||||
device->robust_buffer_access = robust_buffer_access || robust_buffer_access2;
|
||||
device->robust_buffer_access2 = robust_buffer_access2;
|
||||
|
||||
mtx_init(&device->shader_slab_mutex, mtx_plain);
|
||||
list_inithead(&device->shader_slabs);
|
||||
|
|
|
|||
|
|
@ -822,8 +822,9 @@ struct radv_device {
|
|||
struct radv_device_extension_table enabled_extensions;
|
||||
struct radv_device_dispatch_table dispatch;
|
||||
|
||||
/* Whether the app has enabled the robustBufferAccess feature. */
|
||||
/* Whether the app has enabled the robustBufferAccess/robustBufferAccess2 features. */
|
||||
bool robust_buffer_access;
|
||||
bool robust_buffer_access2;
|
||||
|
||||
/* Whether the driver uses a global BO list. */
|
||||
bool use_global_bo_list;
|
||||
|
|
|
|||
|
|
@ -1398,6 +1398,7 @@ radv_shader_variant_compile(struct radv_device *device,
|
|||
|
||||
options.explicit_scratch_args = !radv_use_llvm_for_stage(device, stage);
|
||||
options.robust_buffer_access = device->robust_buffer_access;
|
||||
options.robust_buffer_access2 = device->robust_buffer_access2;
|
||||
options.disable_optimizations = disable_optimizations;
|
||||
|
||||
return shader_variant_compile(device, module, shaders, shader_count, stage, info,
|
||||
|
|
|
|||
|
|
@ -135,6 +135,7 @@ struct radv_nir_compiler_options {
|
|||
bool explicit_scratch_args;
|
||||
bool clamp_shadow_reference;
|
||||
bool robust_buffer_access;
|
||||
bool robust_buffer_access2;
|
||||
bool dump_shader;
|
||||
bool dump_preoptir;
|
||||
bool record_ir;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue