vkd3d: Introduce vkd3d_bindless_set_flag.

This will allow us to use the same bindless descriptor set for
different types of descriptor ranges.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-10-12 13:05:12 +02:00 committed by Hans-Kristian Arntzen
parent c097c00167
commit 3eac9f9c7d
3 changed files with 119 additions and 101 deletions

View File

@ -3495,7 +3495,7 @@ void d3d12_desc_copy(struct d3d12_desc *dst, struct d3d12_desc *src,
else
{
uint32_t set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_COUNTER);
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_COUNTER);
vk_copy = &vk_copies[copy_count++];
vk_copy->sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
@ -3931,8 +3931,7 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
vk_descriptor_type = vkd3d_bindless_state_get_cbv_descriptor_type(&device->bindless_state);
descriptor->metadata.cookie = resource ? resource->cookie : 0;
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_CBV, VKD3D_SHADER_BINDING_FLAG_BUFFER);
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state, VKD3D_BINDLESS_SET_CBV);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED;
descriptor->info.buffer = descriptor_info.buffer;
@ -3998,7 +3997,7 @@ static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_BUFFER);
VKD3D_BINDLESS_SET_SRV | VKD3D_BINDLESS_SET_BUFFER);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW;
vkd3d_init_write_descriptor_set(&vk_write, descriptor, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, &descriptor_info);
@ -4156,7 +4155,7 @@ static void vkd3d_create_texture_srv(struct d3d12_desc *descriptor,
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_IMAGE);
VKD3D_BINDLESS_SET_SRV | VKD3D_BINDLESS_SET_IMAGE);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW;
vkd3d_init_write_descriptor_set(&vk_write, descriptor, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, &descriptor_info);
@ -4261,7 +4260,7 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_BUFFER);
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_BUFFER);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW | VKD3D_DESCRIPTOR_FLAG_UAV_COUNTER;
descriptor_info[vk_write_count].buffer_view = view ? view->vk_buffer_view : VK_NULL_HANDLE;
@ -4305,7 +4304,7 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
else
{
uint32_t set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_COUNTER);
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_COUNTER);
descriptor_info[vk_write_count].buffer_view = uav_counter_view;
vkd3d_init_write_descriptor_set(&vk_write[vk_write_count], descriptor,
@ -4431,7 +4430,7 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_IMAGE);
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_IMAGE);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW;
vkd3d_init_write_descriptor_set(&vk_write, descriptor, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptor_info);
@ -4725,8 +4724,7 @@ void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
sampler->info.view = view;
sampler->metadata.cookie = view->cookie;
sampler->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, VKD3D_SHADER_BINDING_FLAG_IMAGE);
sampler->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state, VKD3D_BINDLESS_SET_SAMPLER);
sampler->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW;
descriptor_info.image.sampler = view->vk_sampler;

View File

@ -472,6 +472,24 @@ struct vkd3d_descriptor_set_context
uint32_t vk_binding;
};
static enum vkd3d_bindless_set_flag vkd3d_bindless_set_flag_from_descriptor_range_type(D3D12_DESCRIPTOR_RANGE_TYPE range_type)
{
switch (range_type)
{
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
return VKD3D_BINDLESS_SET_SAMPLER;
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
return VKD3D_BINDLESS_SET_CBV;
case D3D12_DESCRIPTOR_RANGE_TYPE_SRV:
return VKD3D_BINDLESS_SET_SRV;
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
return VKD3D_BINDLESS_SET_UAV;
default:
ERR("Unhandled descriptor range type %u.\n", range_type);
return VKD3D_BINDLESS_SET_SRV;
}
}
static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_root_signature *root_signature,
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info,
struct vkd3d_descriptor_set_context *context)
@ -503,7 +521,7 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
for (j = 0; j < range_count; ++j)
{
const D3D12_DESCRIPTOR_RANGE *range = &p->DescriptorTable.pDescriptorRanges[j];
bool is_uav = range->RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
enum vkd3d_bindless_set_flag range_flag = vkd3d_bindless_set_flag_from_descriptor_range_type(range->RangeType);
if (range->OffsetInDescriptorsFromTableStart != D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
range_descriptor_offset = range->OffsetInDescriptorsFromTableStart;
@ -516,36 +534,51 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
binding.descriptor_offset = range_descriptor_offset;
binding.shader_visibility = vkd3d_shader_visibility_from_d3d12(p->ShaderVisibility);
if (vkd3d_bindless_state_find_binding(bindless_state, range->RangeType, VKD3D_SHADER_BINDING_FLAG_BUFFER, &binding.binding))
switch (range->RangeType)
{
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_BUFFER;
table->first_binding[table->binding_count++] = binding;
}
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
if (vkd3d_bindless_state_find_binding(bindless_state, range_flag, &binding.binding))
{
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_IMAGE;
table->first_binding[table->binding_count++] = binding;
}
break;
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
if (vkd3d_bindless_state_find_binding(bindless_state, range_flag, &binding.binding))
{
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_BUFFER;
table->first_binding[table->binding_count++] = binding;
}
break;
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS |
VKD3D_SHADER_BINDING_FLAG_COUNTER;
if (vkd3d_bindless_state_find_binding(bindless_state, range->RangeType, VKD3D_SHADER_BINDING_FLAG_IMAGE, &binding.binding))
{
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_IMAGE;
table->first_binding[table->binding_count++] = binding;
}
if (root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_RAW_VA_UAV_COUNTERS)
{
binding.flags |= VKD3D_SHADER_BINDING_FLAG_RAW_VA;
binding.binding = root_signature->uav_counter_binding;
}
else if (!vkd3d_bindless_state_find_binding(bindless_state, range_flag | VKD3D_BINDLESS_SET_COUNTER, &binding.binding))
ERR("Failed to find UAV counter binding.\n");
/* Add UAV counter bindings */
if (is_uav)
{
binding.register_index = range->BaseShaderRegister;
binding.register_count = range->NumDescriptors;
binding.descriptor_offset = range_descriptor_offset;
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS |
VKD3D_SHADER_BINDING_FLAG_COUNTER;
table->first_binding[table->binding_count++] = binding;
/* fall through */
case D3D12_DESCRIPTOR_RANGE_TYPE_SRV:
if (vkd3d_bindless_state_find_binding(bindless_state, range_flag | VKD3D_BINDLESS_SET_BUFFER, &binding.binding))
{
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_BUFFER;
table->first_binding[table->binding_count++] = binding;
}
if (root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_RAW_VA_UAV_COUNTERS)
{
binding.flags |= VKD3D_SHADER_BINDING_FLAG_RAW_VA;
binding.binding = root_signature->uav_counter_binding;
}
else if (!vkd3d_bindless_state_find_binding(bindless_state, range->RangeType, VKD3D_SHADER_BINDING_FLAG_COUNTER, &binding.binding))
ERR("Failed to find UAV counter binding.\n");
table->first_binding[table->binding_count++] = binding;
if (vkd3d_bindless_state_find_binding(bindless_state, range_flag | VKD3D_BINDLESS_SET_IMAGE, &binding.binding))
{
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_IMAGE;
table->first_binding[table->binding_count++] = binding;
}
break;
default:
FIXME("Unhandled descriptor range type %u.\n", range->RangeType);
}
range_descriptor_offset = binding.descriptor_offset + binding.register_count;
@ -3254,69 +3287,50 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta
return vk_pipeline;
}
static D3D12_DESCRIPTOR_HEAP_TYPE d3d12_descriptor_heap_type_from_range_type(D3D12_DESCRIPTOR_RANGE_TYPE range_type)
static uint32_t d3d12_max_descriptor_count_from_heap_type(D3D12_DESCRIPTOR_HEAP_TYPE heap_type)
{
switch (range_type)
switch (heap_type)
{
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
case D3D12_DESCRIPTOR_RANGE_TYPE_SRV:
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
return D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
return D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
default:
ERR("Invalid descriptor range type %d.\n", range_type);
return D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
}
}
static uint32_t d3d12_max_descriptor_count_from_range_type(D3D12_DESCRIPTOR_RANGE_TYPE range_type)
{
switch (range_type)
{
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
case D3D12_DESCRIPTOR_RANGE_TYPE_SRV:
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
case D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV:
return 1000000;
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
case D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER:
return 2048;
default:
ERR("Invalid descriptor range type %d.\n", range_type);
ERR("Invalid descriptor heap type %d.\n", heap_type);
return 0;
}
}
static uint32_t d3d12_max_host_descriptor_count_from_range_type(struct d3d12_device *device, D3D12_DESCRIPTOR_RANGE_TYPE range_type)
static uint32_t d3d12_max_host_descriptor_count_from_heap_type(struct d3d12_device *device, D3D12_DESCRIPTOR_HEAP_TYPE heap_type)
{
const VkPhysicalDeviceDescriptorIndexingPropertiesEXT *limits = &device->device_info.descriptor_indexing_properties;
switch (range_type)
switch (heap_type)
{
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
return device->bindless_state.flags & VKD3D_BINDLESS_CBV_AS_SSBO
case D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV:
{
uint32_t cbv_count = device->bindless_state.flags & VKD3D_BINDLESS_CBV_AS_SSBO
? limits->maxDescriptorSetUpdateAfterBindStorageBuffers
: limits->maxDescriptorSetUpdateAfterBindUniformBuffers;
case D3D12_DESCRIPTOR_RANGE_TYPE_SRV:
return limits->maxDescriptorSetUpdateAfterBindSampledImages;
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
return min(limits->maxDescriptorSetUpdateAfterBindStorageBuffers,
uint32_t srv_count = limits->maxDescriptorSetUpdateAfterBindSampledImages;
uint32_t uav_count = min(limits->maxDescriptorSetUpdateAfterBindStorageBuffers,
limits->maxDescriptorSetUpdateAfterBindStorageImages);
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
return min(cbv_count, min(srv_count, uav_count));
}
case D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER:
return limits->maxDescriptorSetUpdateAfterBindSamplers;
default:
ERR("Invalid descriptor range type %d.\n", range_type);
ERR("Invalid descriptor heap type %d.\n", heap_type);
return 0;
}
}
static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bindless_state,
struct d3d12_device *device, D3D12_DESCRIPTOR_RANGE_TYPE range_type,
enum vkd3d_shader_binding_flag binding_flag, VkDescriptorType vk_descriptor_type)
struct d3d12_device *device, uint32_t flags, VkDescriptorType vk_descriptor_type)
{
struct vkd3d_bindless_set_info *set_info = &bindless_state->set_info[bindless_state->set_count++];
VkDescriptorSetLayoutBindingFlagsCreateInfoEXT vk_binding_flags_info;
@ -3327,9 +3341,10 @@ static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bin
VkResult vr;
set_info->vk_descriptor_type = vk_descriptor_type;
set_info->heap_type = d3d12_descriptor_heap_type_from_range_type(range_type);
set_info->range_type = range_type;
set_info->binding_flag = binding_flag;
set_info->heap_type = flags & VKD3D_BINDLESS_SET_SAMPLER
? D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER
: D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
set_info->flags = flags;
vk_binding_flags = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT |
VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT |
@ -3343,7 +3358,7 @@ static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bin
vk_binding_info.binding = 0;
vk_binding_info.descriptorType = set_info->vk_descriptor_type;
vk_binding_info.descriptorCount = d3d12_max_descriptor_count_from_range_type(range_type);
vk_binding_info.descriptorCount = d3d12_max_descriptor_count_from_heap_type(set_info->heap_type);
vk_binding_info.stageFlags = VK_SHADER_STAGE_ALL;
vk_binding_info.pImmutableSamplers = NULL;
@ -3357,7 +3372,7 @@ static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bin
&vk_set_layout_info, NULL, &set_info->vk_set_layout))) < 0)
ERR("Failed to create descriptor set layout, vr %d.\n", vr);
vk_binding_info.descriptorCount = d3d12_max_host_descriptor_count_from_range_type(device, range_type);
vk_binding_info.descriptorCount = d3d12_max_host_descriptor_count_from_heap_type(device, set_info->heap_type);
if ((vr = VK_CALL(vkCreateDescriptorSetLayout(device->vk_device,
&vk_set_layout_info, NULL, &set_info->vk_host_set_layout))) < 0)
@ -3432,35 +3447,34 @@ HRESULT vkd3d_bindless_state_init(struct vkd3d_bindless_state *bindless_state,
}
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, VKD3D_SHADER_BINDING_FLAG_IMAGE,
VK_DESCRIPTOR_TYPE_SAMPLER)))
VKD3D_BINDLESS_SET_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLER)))
goto fail;
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_CBV, VKD3D_SHADER_BINDING_FLAG_BUFFER,
VKD3D_BINDLESS_SET_CBV,
vkd3d_bindless_state_get_cbv_descriptor_type(bindless_state))))
goto fail;
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_BUFFER,
VKD3D_BINDLESS_SET_SRV | VKD3D_BINDLESS_SET_BUFFER,
VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER)) ||
FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_IMAGE,
VKD3D_BINDLESS_SET_SRV | VKD3D_BINDLESS_SET_IMAGE,
VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE)))
goto fail;
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_BUFFER,
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_BUFFER,
VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) ||
FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_IMAGE,
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_IMAGE,
VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)))
goto fail;
if (!(bindless_state->flags & VKD3D_RAW_VA_UAV_COUNTER))
{
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_COUNTER,
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_COUNTER,
VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)))
goto fail;
}
@ -3486,8 +3500,7 @@ void vkd3d_bindless_state_cleanup(struct vkd3d_bindless_state *bindless_state,
}
bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag,
struct vkd3d_shader_descriptor_binding *binding)
uint32_t flags, struct vkd3d_shader_descriptor_binding *binding)
{
unsigned int i;
@ -3495,7 +3508,7 @@ bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindle
{
const struct vkd3d_bindless_set_info *set_info = &bindless_state->set_info[i];
if (set_info->range_type == range_type && set_info->binding_flag == binding_flag)
if ((set_info->flags & flags) == flags)
{
binding->set = i;
binding->binding = 0;
@ -3506,13 +3519,12 @@ bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindle
return false;
}
unsigned int vkd3d_bindless_state_find_set(const struct vkd3d_bindless_state *bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag)
unsigned int vkd3d_bindless_state_find_set(const struct vkd3d_bindless_state *bindless_state, uint32_t flags)
{
D3D12_DESCRIPTOR_HEAP_TYPE heap_type;
unsigned int i, set_index = 0;
heap_type = range_type == D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER
heap_type = flags & VKD3D_BINDLESS_SET_SAMPLER
? D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER
: D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
@ -3522,13 +3534,13 @@ unsigned int vkd3d_bindless_state_find_set(const struct vkd3d_bindless_state *bi
if (set_info->heap_type == heap_type)
{
if (set_info->range_type == range_type && set_info->binding_flag == binding_flag)
if ((set_info->flags & flags) == flags)
return set_index;
set_index++;
}
}
ERR("No set found for range type %u, flag %#x.", range_type, binding_flag);
ERR("No set found for flags %#x.", flags);
return 0;
}

View File

@ -1570,12 +1570,22 @@ enum vkd3d_bindless_flags
VKD3D_BINDLESS_RAW_SSBO = (1u << 6),
};
enum vkd3d_bindless_set_flag
{
VKD3D_BINDLESS_SET_SAMPLER = (1u << 0),
VKD3D_BINDLESS_SET_CBV = (1u << 1),
VKD3D_BINDLESS_SET_SRV = (1u << 2),
VKD3D_BINDLESS_SET_UAV = (1u << 3),
VKD3D_BINDLESS_SET_IMAGE = (1u << 4),
VKD3D_BINDLESS_SET_BUFFER = (1u << 5),
VKD3D_BINDLESS_SET_COUNTER = (1u << 6),
};
struct vkd3d_bindless_set_info
{
VkDescriptorType vk_descriptor_type;
D3D12_DESCRIPTOR_HEAP_TYPE heap_type;
D3D12_DESCRIPTOR_RANGE_TYPE range_type;
enum vkd3d_shader_binding_flag binding_flag;
uint32_t flags; /* vkd3d_bindless_set_flag */
VkDescriptorSetLayout vk_set_layout;
VkDescriptorSetLayout vk_host_set_layout;
@ -1594,10 +1604,8 @@ HRESULT vkd3d_bindless_state_init(struct vkd3d_bindless_state *bindless_state,
void vkd3d_bindless_state_cleanup(struct vkd3d_bindless_state *bindless_state,
struct d3d12_device *device);
bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag,
struct vkd3d_shader_descriptor_binding *binding);
unsigned int vkd3d_bindless_state_find_set(const struct vkd3d_bindless_state *bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag);
uint32_t flags, struct vkd3d_shader_descriptor_binding *binding);
unsigned int vkd3d_bindless_state_find_set(const struct vkd3d_bindless_state *bindless_state, uint32_t flags);
static inline VkDescriptorType vkd3d_bindless_state_get_cbv_descriptor_type(const struct vkd3d_bindless_state *bindless_state)
{