From 374adc8bb7cb8ee3161250c166b14e797e7777f0 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 23 Oct 2020 17:09:41 +0200 Subject: [PATCH] vkd3d: Account for buffer offset info in clear_uav. Signed-off-by: Philip Rebohle --- libs/vkd3d/command.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 199d4b17..273f2671 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -5711,7 +5711,7 @@ struct vkd3d_clear_uav_info } u; }; -static void d3d12_command_list_clear_uav(struct d3d12_command_list *list, +static void d3d12_command_list_clear_uav(struct d3d12_command_list *list, const struct d3d12_desc *desc, struct d3d12_resource *resource, const struct vkd3d_clear_uav_info *args, const VkClearColorValue *clear_color, UINT rect_count, const D3D12_RECT *rects) { @@ -5724,6 +5724,7 @@ static void d3d12_command_list_clear_uav(struct d3d12_command_list *list, D3D12_RECT full_rect, curr_rect; VkWriteDescriptorSet write_set; VkExtent3D workgroup_size; + uint32_t extra_offset; d3d12_command_list_track_resource_usage(list, resource); d3d12_command_list_end_current_render_pass(list, false); @@ -5802,6 +5803,7 @@ static void d3d12_command_list_clear_uav(struct d3d12_command_list *list, full_rect.right = d3d12_resource_desc_get_width(&resource->desc, miplevel_idx); full_rect.top = 0; full_rect.bottom = d3d12_resource_desc_get_height(&resource->desc, miplevel_idx); + extra_offset = 0; if (d3d12_resource_is_buffer(resource)) { @@ -5812,6 +5814,12 @@ static void d3d12_command_list_clear_uav(struct d3d12_command_list *list, : sizeof(uint32_t); /* structured buffer */ full_rect.right = args->u.view->info.buffer.size / byte_count; } + else if (list->device->bindless_state.flags & VKD3D_SSBO_OFFSET_BUFFER) + { + const struct vkd3d_bound_ssbo_range *ranges = desc->heap->ssbo_ranges.host_ptr; + extra_offset = ranges[desc->heap_offset].offset / sizeof(uint32_t); + full_rect.right = ranges[desc->heap_offset].length / sizeof(uint32_t); + } else full_rect.right = args->u.buffer.range / sizeof(uint32_t); } @@ -5840,7 +5848,7 @@ static void d3d12_command_list_clear_uav(struct d3d12_command_list *list, continue; } - clear_args.offset.x = curr_rect.left; + clear_args.offset.x = curr_rect.left + extra_offset; clear_args.offset.y = curr_rect.top; clear_args.extent.width = curr_rect.right - curr_rect.left; clear_args.extent.height = curr_rect.bottom - curr_rect.top; @@ -5956,7 +5964,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3 } } - d3d12_command_list_clear_uav(list, resource_impl, &args, &color, rect_count, rects); + d3d12_command_list_clear_uav(list, desc, resource_impl, &args, &color, rect_count, rects); } static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewFloat(d3d12_command_list_iface *iface, @@ -5977,7 +5985,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewFloat(d resource_impl = unsafe_impl_from_ID3D12Resource(resource); vkd3d_clear_uav_info_from_desc(&args, desc); - d3d12_command_list_clear_uav(list, resource_impl, &args, &color, rect_count, rects); + d3d12_command_list_clear_uav(list, desc, resource_impl, &args, &color, rect_count, rects); } static void STDMETHODCALLTYPE d3d12_command_list_DiscardResource(d3d12_command_list_iface *iface,