Skip to content

Commit 08a309e

Browse files
committed
[D3D12] Safeguard index and vertex buffer accesses
1 parent 10cffaf commit 08a309e

5 files changed

Lines changed: 27 additions & 19 deletions

File tree

backends/gpu/direct3d12/includes/kore3/direct3d12/commandlist_functions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ void kore_d3d12_command_list_draw_indexed_indirect(kore_gpu_command_list *list,
9898

9999
void kore_d3d12_command_list_compute_indirect(kore_gpu_command_list *list, kore_gpu_buffer *indirect_buffer, uint64_t indirect_offset);
100100

101-
void kore_d3d12_command_list_queue_buffer_access(kore_gpu_command_list *list, kore_gpu_buffer *buffer, uint32_t offset, uint32_t size);
101+
void kore_d3d12_command_list_queue_buffer_access(kore_gpu_command_list *list, kore_d3d12_buffer *buffer, uint32_t offset, uint32_t size);
102102

103103
void kore_d3d12_command_list_queue_descriptor_set_access(kore_gpu_command_list *list, kore_d3d12_descriptor_set *descriptor_set);
104104

backends/gpu/direct3d12/includes/kore3/direct3d12/commandlist_structs.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ struct ID3D12Fence;
3030
#define KORE_D3D12_COMMAND_LIST_MAX_QUEUED_DESCRIPTOR_SET_ACCESSES 256
3131

3232
typedef struct kore_d3d12_buffer_access {
33-
kore_gpu_buffer *buffer;
34-
uint64_t offset;
35-
uint64_t size;
33+
kore_d3d12_buffer *buffer;
34+
uint64_t offset;
35+
uint64_t size;
3636
} kore_d3d12_buffer_access;
3737

3838
typedef struct kore_d3d12_command_list {

backends/gpu/direct3d12/sources/commandlist.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ void kore_d3d12_command_list_set_index_buffer(kore_gpu_command_list *list, kore_
192192
view.Format = index_format == KORE_GPU_INDEX_FORMAT_UINT16 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT;
193193

194194
COM_CALL1(list->d3d12.list, IASetIndexBuffer, &view);
195+
196+
if (buffer->d3d12.cpu_read || buffer->d3d12.cpu_write) {
197+
kore_d3d12_command_list_queue_buffer_access(list, &buffer->d3d12, (uint32_t)offset, (uint32_t)(buffer->d3d12.size - offset));
198+
}
195199
}
196200

197201
void kore_d3d12_command_list_set_vertex_buffer(kore_gpu_command_list *list, uint32_t slot, kore_d3d12_buffer *buffer, uint64_t offset, uint64_t size,
@@ -205,6 +209,10 @@ void kore_d3d12_command_list_set_vertex_buffer(kore_gpu_command_list *list, uint
205209
view.StrideInBytes = (UINT)stride;
206210

207211
COM_CALL3(list->d3d12.list, IASetVertexBuffers, slot, 1, &view);
212+
213+
if (buffer->cpu_read || buffer->cpu_write) {
214+
kore_d3d12_command_list_queue_buffer_access(list, buffer, (uint32_t)offset, (uint32_t)size);
215+
}
208216
}
209217

210218
void kore_d3d12_command_list_set_render_pipeline(kore_gpu_command_list *list, kore_d3d12_render_pipeline *pipeline) {
@@ -786,7 +794,7 @@ void kore_d3d12_command_list_compute_indirect(kore_gpu_command_list *list, kore_
786794
0);
787795
}
788796

789-
void kore_d3d12_command_list_queue_buffer_access(kore_gpu_command_list *list, kore_gpu_buffer *buffer, uint32_t offset, uint32_t size) {
797+
void kore_d3d12_command_list_queue_buffer_access(kore_gpu_command_list *list, kore_d3d12_buffer *buffer, uint32_t offset, uint32_t size) {
790798
kore_d3d12_buffer_access access;
791799
access.buffer = buffer;
792800
access.offset = offset;

backends/gpu/direct3d12/sources/descriptorset.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ void kore_d3d12_descriptor_set_prepare_cbv_buffer(kore_gpu_command_list *list, k
193193
}
194194

195195
if (buffer->d3d12.cpu_read || buffer->d3d12.cpu_write) {
196-
kore_d3d12_command_list_queue_buffer_access(list, buffer, offset, size);
196+
kore_d3d12_command_list_queue_buffer_access(list, &buffer->d3d12, offset, size);
197197
}
198198
}
199199

@@ -213,7 +213,7 @@ void kore_d3d12_descriptor_set_prepare_uav_buffer(kore_gpu_command_list *list, k
213213
}
214214

215215
if (buffer->d3d12.cpu_read || buffer->d3d12.cpu_write) {
216-
kore_d3d12_command_list_queue_buffer_access(list, buffer, offset, size);
216+
kore_d3d12_command_list_queue_buffer_access(list, &buffer->d3d12, offset, size);
217217
}
218218
}
219219

backends/gpu/direct3d12/sources/device.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -612,19 +612,19 @@ static void wait_for_frame(kore_gpu_device *device, uint64_t frame_index) {
612612
wait_for_fence(device, device->d3d12.frame_fence, device->d3d12.frame_event, frame_index);
613613
}
614614

615-
static void clean_buffer_accesses(kore_gpu_buffer *buffer, uint64_t finished_execution_index) {
615+
static void clean_buffer_accesses(kore_d3d12_buffer *buffer, uint64_t finished_execution_index) {
616616
kore_d3d12_buffer_range ranges[KORE_D3D12_MAX_BUFFER_RANGES];
617617
uint32_t ranges_count = 0;
618618

619-
for (uint32_t range_index = 0; range_index < buffer->d3d12.ranges_count; ++range_index) {
620-
if (buffer->d3d12.ranges[range_index].execution_index > finished_execution_index) {
621-
ranges[ranges_count] = buffer->d3d12.ranges[range_index];
619+
for (uint32_t range_index = 0; range_index < buffer->ranges_count; ++range_index) {
620+
if (buffer->ranges[range_index].execution_index > finished_execution_index) {
621+
ranges[ranges_count] = buffer->ranges[range_index];
622622
ranges_count += 1;
623623
}
624624
}
625625

626-
memcpy(&buffer->d3d12.ranges, &ranges, sizeof(ranges));
627-
buffer->d3d12.ranges_count = ranges_count;
626+
memcpy(&buffer->ranges, &ranges, sizeof(ranges));
627+
buffer->ranges_count = ranges_count;
628628
}
629629

630630
void kore_d3d12_device_execute_command_list(kore_gpu_device *device, kore_gpu_command_list *list) {
@@ -654,15 +654,15 @@ void kore_d3d12_device_execute_command_list(kore_gpu_device *device, kore_gpu_co
654654

655655
for (uint32_t buffer_access_index = 0; buffer_access_index < list->d3d12.queued_buffer_accesses_count; ++buffer_access_index) {
656656
kore_d3d12_buffer_access access = list->d3d12.queued_buffer_accesses[buffer_access_index];
657-
kore_gpu_buffer *buffer = access.buffer;
657+
kore_d3d12_buffer *buffer = access.buffer;
658658

659659
clean_buffer_accesses(buffer, COM_CALL0(device->d3d12.execution_fence, GetCompletedValue));
660660

661-
assert(buffer->d3d12.ranges_count < KORE_D3D12_MAX_BUFFER_RANGES);
662-
buffer->d3d12.ranges[buffer->d3d12.ranges_count].execution_index = device->d3d12.execution_index;
663-
buffer->d3d12.ranges[buffer->d3d12.ranges_count].offset = access.offset;
664-
buffer->d3d12.ranges[buffer->d3d12.ranges_count].size = access.size;
665-
buffer->d3d12.ranges_count += 1;
661+
assert(buffer->ranges_count < KORE_D3D12_MAX_BUFFER_RANGES);
662+
buffer->ranges[buffer->ranges_count].execution_index = device->d3d12.execution_index;
663+
buffer->ranges[buffer->ranges_count].offset = access.offset;
664+
buffer->ranges[buffer->ranges_count].size = access.size;
665+
buffer->ranges_count += 1;
666666
}
667667
list->d3d12.queued_buffer_accesses_count = 0;
668668

0 commit comments

Comments
 (0)