vkd3d: Add extra binding for SSBO offset buffer.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-10-23 13:58:18 +02:00 committed by Hans-Kristian Arntzen
parent 811235858c
commit b57a5dd96d
3 changed files with 31 additions and 0 deletions

View File

@ -5539,6 +5539,10 @@ static void d3d12_descriptor_heap_update_extra_bindings(struct d3d12_descriptor_
*vk_buffer = descriptor_heap->uav_counters.descriptor;
break;
case VKD3D_BINDLESS_SET_EXTRA_SSBO_OFFSET_BUFFER:
*vk_buffer = descriptor_heap->ssbo_ranges.descriptor;
break;
default:
ERR("Unsupported etra flags %#x.\n", flag);
continue;

View File

@ -330,6 +330,7 @@ struct d3d12_root_signature_info
uint32_t push_descriptor_count;
uint32_t root_constant_count;
bool has_raw_va_uav_counters;
bool has_ssbo_offset_buffer;
uint32_t cost;
};
@ -345,6 +346,9 @@ static HRESULT d3d12_root_signature_info_count_descriptors(struct d3d12_root_sig
if (device->bindless_state.flags & VKD3D_BINDLESS_RAW_SSBO)
info->binding_count += 1;
if (device->bindless_state.flags & VKD3D_SSBO_OFFSET_BUFFER)
info->has_ssbo_offset_buffer = true;
break;
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
/* separate image + buffer descriptors */
@ -355,6 +359,9 @@ static HRESULT d3d12_root_signature_info_count_descriptors(struct d3d12_root_sig
if (device->bindless_state.flags & VKD3D_RAW_VA_UAV_COUNTER)
info->has_raw_va_uav_counters = true;
if (device->bindless_state.flags & VKD3D_SSBO_OFFSET_BUFFER)
info->has_ssbo_offset_buffer = true;
break;
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
@ -845,6 +852,15 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
&root_signature->uav_counter_binding);
}
if (info.has_ssbo_offset_buffer)
{
root_signature->flags |= VKD3D_ROOT_SIGNATURE_USE_SSBO_OFFSET_BUFFER;
vkd3d_bindless_state_find_binding(&device->bindless_state,
VKD3D_BINDLESS_SET_EXTRA_SSBO_OFFSET_BUFFER,
&root_signature->offset_buffer_binding);
}
if (FAILED(hr = d3d12_root_signature_init_root_descriptors(root_signature, desc,
&info, &root_signature->push_constant_range, &context,
&root_signature->vk_root_descriptor_layout)))
@ -933,6 +949,9 @@ static unsigned int d3d12_root_signature_get_shader_interface_flags(const struct
if (root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_INLINE_UNIFORM_BLOCK)
flags |= VKD3D_SHADER_INTERFACE_PUSH_CONSTANTS_AS_UNIFORM_BUFFER;
if (root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_SSBO_OFFSET_BUFFER)
flags |= VKD3D_SHADER_INTERFACE_SSBO_OFFSET_BUFFER;
if (root_signature->device->bindless_state.flags & VKD3D_BINDLESS_CBV_AS_SSBO)
flags |= VKD3D_SHADER_INTERFACE_BINDLESS_CBV_AS_STORAGE_BUFFER;
@ -1694,6 +1713,7 @@ static HRESULT d3d12_pipeline_state_init_compute(struct d3d12_pipeline_state *st
shader_interface.push_constant_buffers = root_signature->root_constants;
shader_interface.push_constant_buffer_count = root_signature->root_constant_count;
shader_interface.push_constant_ubo_binding = &root_signature->push_constant_ubo_binding;
shader_interface.offset_buffer_binding = &root_signature->offset_buffer_binding;
if ((hr = vkd3d_create_pipeline_cache_from_d3d12_desc(device, &desc->cached_pso, &state->vk_pso_cache)) < 0)
{
@ -2527,6 +2547,7 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
shader_interface.push_constant_buffers = root_signature->root_constants;
shader_interface.push_constant_buffer_count = root_signature->root_constant_count;
shader_interface.push_constant_ubo_binding = &root_signature->push_constant_ubo_binding;
shader_interface.offset_buffer_binding = &root_signature->offset_buffer_binding;
graphics->patch_vertex_count = 0;
@ -3469,6 +3490,9 @@ HRESULT vkd3d_bindless_state_init(struct vkd3d_bindless_state *bindless_state,
if (bindless_state->flags & VKD3D_RAW_VA_UAV_COUNTER)
extra_bindings |= VKD3D_BINDLESS_SET_EXTRA_UAV_COUNTER_BUFFER;
if (bindless_state->flags & VKD3D_SSBO_OFFSET_BUFFER)
extra_bindings |= VKD3D_BINDLESS_SET_EXTRA_SSBO_OFFSET_BUFFER;
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
VKD3D_BINDLESS_SET_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLER)))
goto fail;

View File

@ -815,6 +815,7 @@ enum vkd3d_root_signature_flag
VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS = 0x00000001u,
VKD3D_ROOT_SIGNATURE_USE_INLINE_UNIFORM_BLOCK = 0x00000002u,
VKD3D_ROOT_SIGNATURE_USE_RAW_VA_UAV_COUNTERS = 0x00000004u,
VKD3D_ROOT_SIGNATURE_USE_SSBO_OFFSET_BUFFER = 0x00000008u,
};
struct d3d12_root_descriptor_table
@ -883,6 +884,7 @@ struct d3d12_root_signature
VkPushConstantRange push_constant_range;
struct vkd3d_shader_descriptor_binding push_constant_ubo_binding;
struct vkd3d_shader_descriptor_binding uav_counter_binding;
struct vkd3d_shader_descriptor_binding offset_buffer_binding;
uint32_t descriptor_table_offset;
uint32_t descriptor_table_count;
@ -1602,6 +1604,7 @@ enum vkd3d_bindless_set_flag
VKD3D_BINDLESS_SET_RAW_SSBO = (1u << 7),
VKD3D_BINDLESS_SET_EXTRA_UAV_COUNTER_BUFFER = (1u << 24),
VKD3D_BINDLESS_SET_EXTRA_SSBO_OFFSET_BUFFER = (1u << 25),
VKD3D_BINDLESS_SET_EXTRA_MASK = 0xff000000u
};