radv: Add bound checking workaround for dynamic buffers.
I have seen a few applications and games do the dynamic buffer bounds incorrectly, this make it easier to work around, e.g. for debugging. Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
parent
e0c08183fb
commit
d1ce31d36c
|
@ -2224,6 +2224,8 @@ void radv_CmdBindDescriptorSets(
|
|||
RADV_FROM_HANDLE(radv_pipeline_layout, layout, _layout);
|
||||
unsigned dyn_idx = 0;
|
||||
|
||||
const bool no_dynamic_bounds = cmd_buffer->device->instance->debug_flags & RADV_DEBUG_NO_DYNAMIC_BOUNDS;
|
||||
|
||||
for (unsigned i = 0; i < descriptorSetCount; ++i) {
|
||||
unsigned idx = i + firstSet;
|
||||
RADV_FROM_HANDLE(radv_descriptor_set, set, pDescriptorSets[i]);
|
||||
|
@ -2238,7 +2240,7 @@ void radv_CmdBindDescriptorSets(
|
|||
uint64_t va = range->va + pDynamicOffsets[dyn_idx];
|
||||
dst[0] = va;
|
||||
dst[1] = S_008F04_BASE_ADDRESS_HI(va >> 32);
|
||||
dst[2] = range->size;
|
||||
dst[2] = no_dynamic_bounds ? 0xffffffffu : range->size;
|
||||
dst[3] = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
|
||||
S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
|
||||
S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
|
||||
|
|
|
@ -43,6 +43,7 @@ enum {
|
|||
RADV_DEBUG_SYNC_SHADERS = 0x2000,
|
||||
RADV_DEBUG_NO_SISCHED = 0x4000,
|
||||
RADV_DEBUG_PREOPTIR = 0x8000,
|
||||
RADV_DEBUG_NO_DYNAMIC_BOUNDS = 0x10000,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
|
@ -386,6 +386,7 @@ static const struct debug_control radv_debug_options[] = {
|
|||
{"syncshaders", RADV_DEBUG_SYNC_SHADERS},
|
||||
{"nosisched", RADV_DEBUG_NO_SISCHED},
|
||||
{"preoptir", RADV_DEBUG_PREOPTIR},
|
||||
{"nodynamicbounds", RADV_DEBUG_NO_DYNAMIC_BOUNDS},
|
||||
{NULL, 0}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue