radv: always write the sample positions when a new descriptor BO is created
This was completely broken, for example in the following scenario: - submits something which needs sample positions (this creates a new descriptor BO with sample positions) - submits something which needs the tess rings (this creates a new descriptor BO with tess rings but without sample positions, ie. add_sample_positions would be FALSE) - submits something which needs sample positions again (this won't create a new descriptor BO because it incorrectly remembered that sample positions were set) Fix this by always writing the sample positions. This should fix the following flakes: - dEQP-VK.fragment_shading_barycentric.*.weights.pipeline_topology_dynamic.msaa_interpolate_at_sample.* - dEQP-VK.pipeline.fast_linked_library.multisample_interpolation.sample_interpolate_at_distinct_values.* - dEQP-VK.pipeline.fast_linked_library.multisample_interpolation.sample_interpolation_consistency.* - dEQP-VK.draw.renderpass.linear_interpolation.* - dEQP-VK.draw.dynamic_rendering.primary_cmd_buff.linear_interpolation.* These flakes were extremely hard to reproduce! Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25529>
This commit is contained in:
committed by
Marge Bot
parent
596b438936
commit
4192e01dcc
+12
-25
@@ -270,7 +270,7 @@ radv_queue_submit_empty(struct radv_queue *queue, struct vk_queue_submit *submis
|
||||
}
|
||||
|
||||
static void
|
||||
radv_fill_shader_rings(struct radv_device *device, uint32_t *map, bool add_sample_positions, uint32_t esgs_ring_size,
|
||||
radv_fill_shader_rings(struct radv_device *device, uint32_t *map, uint32_t esgs_ring_size,
|
||||
struct radeon_winsys_bo *esgs_ring_bo, uint32_t gsvs_ring_size,
|
||||
struct radeon_winsys_bo *gsvs_ring_bo, struct radeon_winsys_bo *tess_rings_bo,
|
||||
struct radeon_winsys_bo *task_rings_bo, struct radeon_winsys_bo *mesh_scratch_ring_bo,
|
||||
@@ -495,16 +495,14 @@ radv_fill_shader_rings(struct radv_device *device, uint32_t *map, bool add_sampl
|
||||
|
||||
desc += 4;
|
||||
|
||||
if (add_sample_positions) {
|
||||
/* add sample positions after all rings */
|
||||
memcpy(desc, device->sample_locations_1x, 8);
|
||||
desc += 2;
|
||||
memcpy(desc, device->sample_locations_2x, 16);
|
||||
desc += 4;
|
||||
memcpy(desc, device->sample_locations_4x, 32);
|
||||
desc += 8;
|
||||
memcpy(desc, device->sample_locations_8x, 64);
|
||||
}
|
||||
/* add sample positions after all rings */
|
||||
memcpy(desc, device->sample_locations_1x, 8);
|
||||
desc += 2;
|
||||
memcpy(desc, device->sample_locations_2x, 16);
|
||||
desc += 4;
|
||||
memcpy(desc, device->sample_locations_4x, 32);
|
||||
desc += 8;
|
||||
memcpy(desc, device->sample_locations_8x, 64);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -965,15 +963,7 @@ radv_update_preamble_cs(struct radv_queue_state *queue, struct radv_device *devi
|
||||
tess_rings_bo != queue->tess_rings_bo || task_rings_bo != queue->task_rings_bo ||
|
||||
mesh_scratch_ring_bo != queue->mesh_scratch_ring_bo || attr_ring_bo != queue->attr_ring_bo ||
|
||||
add_sample_positions) {
|
||||
uint32_t size = 0;
|
||||
if (gsvs_ring_bo || esgs_ring_bo || tess_rings_bo || task_rings_bo || mesh_scratch_ring_bo || attr_ring_bo ||
|
||||
add_sample_positions) {
|
||||
size = 176; /* 2 dword + 2 padding + 4 dword * 10 */
|
||||
if (add_sample_positions)
|
||||
size += 128; /* 64+32+16+8 = 120 bytes */
|
||||
} else if (scratch_bo) {
|
||||
size = 8; /* 2 dword */
|
||||
}
|
||||
const uint32_t size = 304;
|
||||
|
||||
result = ws->buffer_create(ws, size, 4096, RADEON_DOMAIN_VRAM,
|
||||
RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_READ_ONLY,
|
||||
@@ -1000,11 +990,8 @@ radv_update_preamble_cs(struct radv_queue_state *queue, struct radv_device *devi
|
||||
map[1] = rsrc1;
|
||||
}
|
||||
|
||||
if (esgs_ring_bo || gsvs_ring_bo || tess_rings_bo || task_rings_bo || mesh_scratch_ring_bo || attr_ring_bo ||
|
||||
add_sample_positions)
|
||||
radv_fill_shader_rings(device, map, add_sample_positions, needs->esgs_ring_size, esgs_ring_bo,
|
||||
needs->gsvs_ring_size, gsvs_ring_bo, tess_rings_bo, task_rings_bo, mesh_scratch_ring_bo,
|
||||
needs->attr_ring_size, attr_ring_bo);
|
||||
radv_fill_shader_rings(device, map, needs->esgs_ring_size, esgs_ring_bo, needs->gsvs_ring_size, gsvs_ring_bo,
|
||||
tess_rings_bo, task_rings_bo, mesh_scratch_ring_bo, needs->attr_ring_size, attr_ring_bo);
|
||||
|
||||
ws->buffer_unmap(descriptor_bo);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user