vkd3d: Create descriptor pool and sets for descriptor heaps.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
01cbbaea81
commit
a1e6a1510f
|
@ -3466,6 +3466,7 @@ static ULONG STDMETHODCALLTYPE d3d12_descriptor_heap_Release(ID3D12DescriptorHea
|
|||
struct d3d12_device *device = heap->device;
|
||||
unsigned int i;
|
||||
|
||||
d3d12_descriptor_heap_cleanup(heap);
|
||||
vkd3d_private_store_destroy(&heap->private_store);
|
||||
|
||||
switch (heap->desc.Type)
|
||||
|
@ -3626,22 +3627,120 @@ struct d3d12_descriptor_heap *unsafe_impl_from_ID3D12DescriptorHeap(ID3D12Descri
|
|||
return impl_from_ID3D12DescriptorHeap(iface);
|
||||
}
|
||||
|
||||
static HRESULT d3d12_descriptor_heap_create_descriptor_pool(struct d3d12_descriptor_heap *descriptor_heap,
|
||||
VkDescriptorPool *vk_descriptor_pool)
|
||||
{
|
||||
const struct vkd3d_vk_device_procs *vk_procs = &descriptor_heap->device->vk_procs;
|
||||
VkDescriptorPoolSize vk_pool_sizes[VKD3D_MAX_BINDLESS_DESCRIPTOR_SETS];
|
||||
const struct d3d12_device *device = descriptor_heap->device;
|
||||
VkDescriptorPoolCreateInfo vk_pool_info;
|
||||
unsigned int i, pool_count = 0;
|
||||
VkResult vr;
|
||||
|
||||
for (i = 0; i < device->bindless_state.set_count; i++)
|
||||
{
|
||||
const struct vkd3d_bindless_set_info *set_info = &device->bindless_state.set_info[i];
|
||||
|
||||
if (set_info->heap_type == descriptor_heap->desc.Type)
|
||||
{
|
||||
VkDescriptorPoolSize *vk_pool_size = &vk_pool_sizes[pool_count++];
|
||||
vk_pool_size->type = vk_descriptor_type_from_bindless_set_info(set_info);
|
||||
vk_pool_size->descriptorCount = descriptor_heap->desc.NumDescriptors;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pool_count)
|
||||
return S_OK;
|
||||
|
||||
vk_pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||
vk_pool_info.pNext = NULL;
|
||||
vk_pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT;
|
||||
vk_pool_info.maxSets = pool_count;
|
||||
vk_pool_info.poolSizeCount = pool_count;
|
||||
vk_pool_info.pPoolSizes = vk_pool_sizes;
|
||||
|
||||
if ((vr = VK_CALL(vkCreateDescriptorPool(device->vk_device,
|
||||
&vk_pool_info, NULL, vk_descriptor_pool))) < 0)
|
||||
{
|
||||
ERR("Failed to create descriptor pool, vr %d.\n", vr);
|
||||
return hresult_from_vk_result(vr);
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT d3d12_descriptor_heap_create_descriptor_set(struct d3d12_descriptor_heap *descriptor_heap,
|
||||
const struct vkd3d_bindless_set_info *binding, VkDescriptorSet *vk_descriptor_set)
|
||||
{
|
||||
const struct vkd3d_vk_device_procs *vk_procs = &descriptor_heap->device->vk_procs;
|
||||
VkDescriptorSetVariableDescriptorCountAllocateInfoEXT vk_variable_count_info;
|
||||
uint32_t descriptor_count = descriptor_heap->desc.NumDescriptors;
|
||||
const struct d3d12_device *device = descriptor_heap->device;
|
||||
VkDescriptorSetAllocateInfo vk_set_info;
|
||||
VkResult vr;
|
||||
|
||||
vk_variable_count_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT;
|
||||
vk_variable_count_info.pNext = NULL;
|
||||
vk_variable_count_info.descriptorSetCount = 1;
|
||||
vk_variable_count_info.pDescriptorCounts = &descriptor_count;
|
||||
|
||||
vk_set_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
vk_set_info.pNext = &vk_variable_count_info;
|
||||
vk_set_info.descriptorPool = descriptor_heap->vk_descriptor_pool;
|
||||
vk_set_info.descriptorSetCount = 1;
|
||||
vk_set_info.pSetLayouts = &binding->vk_set_layout;
|
||||
|
||||
if ((vr = VK_CALL(vkAllocateDescriptorSets(device->vk_device, &vk_set_info, vk_descriptor_set))) < 0)
|
||||
{
|
||||
ERR("Failed to allocate descriptor set, vr %d.\n", vr);
|
||||
return hresult_from_vk_result(vr);
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT d3d12_descriptor_heap_init(struct d3d12_descriptor_heap *descriptor_heap,
|
||||
struct d3d12_device *device, const D3D12_DESCRIPTOR_HEAP_DESC *desc)
|
||||
{
|
||||
unsigned int i;
|
||||
HRESULT hr;
|
||||
|
||||
memset(descriptor_heap, 0, sizeof(*descriptor_heap));
|
||||
descriptor_heap->ID3D12DescriptorHeap_iface.lpVtbl = &d3d12_descriptor_heap_vtbl;
|
||||
descriptor_heap->refcount = 1;
|
||||
|
||||
descriptor_heap->device = device;
|
||||
descriptor_heap->desc = *desc;
|
||||
|
||||
if (desc->Flags & D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE)
|
||||
{
|
||||
if (FAILED(hr = d3d12_descriptor_heap_create_descriptor_pool(descriptor_heap,
|
||||
&descriptor_heap->vk_descriptor_pool)))
|
||||
goto fail;
|
||||
|
||||
for (i = 0; i < device->bindless_state.set_count; i++)
|
||||
{
|
||||
const struct vkd3d_bindless_set_info *set_info = &device->bindless_state.set_info[i];
|
||||
|
||||
if (set_info->heap_type == desc->Type)
|
||||
{
|
||||
unsigned int set_index = d3d12_descriptor_heap_set_index_from_binding(set_info);
|
||||
|
||||
if (FAILED(hr = d3d12_descriptor_heap_create_descriptor_set(descriptor_heap,
|
||||
set_info, &descriptor_heap->vk_descriptor_sets[set_index])))
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (FAILED(hr = vkd3d_private_store_init(&descriptor_heap->private_store)))
|
||||
return hr;
|
||||
|
||||
d3d12_device_add_ref(descriptor_heap->device = device);
|
||||
goto fail;
|
||||
|
||||
d3d12_device_add_ref(descriptor_heap->device);
|
||||
return S_OK;
|
||||
|
||||
fail:
|
||||
d3d12_descriptor_heap_cleanup(descriptor_heap);
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device,
|
||||
|
@ -3690,6 +3789,61 @@ HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device,
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
void d3d12_descriptor_heap_cleanup(struct d3d12_descriptor_heap *descriptor_heap)
|
||||
{
|
||||
const struct vkd3d_vk_device_procs *vk_procs = &descriptor_heap->device->vk_procs;
|
||||
const struct d3d12_device *device = descriptor_heap->device;
|
||||
|
||||
VK_CALL(vkDestroyDescriptorPool(device->vk_device,
|
||||
descriptor_heap->vk_descriptor_pool, NULL));
|
||||
}
|
||||
|
||||
unsigned int d3d12_descriptor_heap_set_index_from_binding(const struct vkd3d_bindless_set_info *set)
|
||||
{
|
||||
switch (set->range_type)
|
||||
{
|
||||
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
|
||||
return d3d12_descriptor_heap_sampler_set_index();
|
||||
|
||||
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
|
||||
return d3d12_descriptor_heap_cbv_set_index();
|
||||
|
||||
case D3D12_DESCRIPTOR_RANGE_TYPE_SRV:
|
||||
return d3d12_descriptor_heap_srv_set_index(
|
||||
set->binding_flag & VKD3D_SHADER_BINDING_FLAG_BUFFER);
|
||||
|
||||
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
|
||||
return d3d12_descriptor_heap_uav_set_index(
|
||||
set->binding_flag & VKD3D_SHADER_BINDING_FLAG_BUFFER);
|
||||
|
||||
default:
|
||||
WARN("Unhandled descriptor range type %d.\n", set->range_type);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int d3d12_descriptor_heap_set_index_from_magic(uint32_t magic, bool is_buffer)
|
||||
{
|
||||
switch (magic)
|
||||
{
|
||||
case VKD3D_DESCRIPTOR_MAGIC_SAMPLER:
|
||||
return d3d12_descriptor_heap_sampler_set_index();
|
||||
|
||||
case VKD3D_DESCRIPTOR_MAGIC_CBV:
|
||||
return d3d12_descriptor_heap_cbv_set_index();
|
||||
|
||||
case VKD3D_DESCRIPTOR_MAGIC_SRV:
|
||||
return d3d12_descriptor_heap_srv_set_index(is_buffer);
|
||||
|
||||
case VKD3D_DESCRIPTOR_MAGIC_UAV:
|
||||
return d3d12_descriptor_heap_uav_set_index(is_buffer);
|
||||
|
||||
default:
|
||||
WARN("Unhandled descriptor magic %#x.\n", magic);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* ID3D12QueryHeap */
|
||||
static inline struct d3d12_query_heap *impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface)
|
||||
{
|
||||
|
|
|
@ -2728,6 +2728,12 @@ void vkd3d_bindless_state_cleanup(struct vkd3d_bindless_state *bindless_state,
|
|||
VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, bindless_state->set_info[i].vk_set_layout, NULL));
|
||||
}
|
||||
|
||||
VkDescriptorType vk_descriptor_type_from_bindless_set_info(const struct vkd3d_bindless_set_info *set_info)
|
||||
{
|
||||
return vk_descriptor_type_from_d3d12_range_type(set_info->range_type,
|
||||
set_info->binding_flag == VKD3D_SHADER_BINDING_FLAG_BUFFER);
|
||||
}
|
||||
|
||||
static void vkd3d_uav_clear_pipelines_cleanup(struct vkd3d_uav_clear_pipelines *pipelines,
|
||||
struct d3d12_device *device)
|
||||
{
|
||||
|
|
|
@ -60,6 +60,8 @@ struct d3d12_command_list;
|
|||
struct d3d12_device;
|
||||
struct d3d12_resource;
|
||||
|
||||
struct vkd3d_bindless_set_info;
|
||||
|
||||
struct vkd3d_vk_global_procs
|
||||
{
|
||||
PFN_vkCreateInstance vkCreateInstance;
|
||||
|
@ -609,6 +611,9 @@ struct d3d12_descriptor_heap
|
|||
|
||||
D3D12_DESCRIPTOR_HEAP_DESC desc;
|
||||
|
||||
VkDescriptorPool vk_descriptor_pool;
|
||||
VkDescriptorSet vk_descriptor_sets[VKD3D_MAX_BINDLESS_DESCRIPTOR_SETS];
|
||||
|
||||
struct d3d12_device *device;
|
||||
|
||||
struct vkd3d_private_store private_store;
|
||||
|
@ -618,8 +623,32 @@ struct d3d12_descriptor_heap
|
|||
|
||||
HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device,
|
||||
const D3D12_DESCRIPTOR_HEAP_DESC *desc, struct d3d12_descriptor_heap **descriptor_heap) DECLSPEC_HIDDEN;
|
||||
void d3d12_descriptor_heap_cleanup(struct d3d12_descriptor_heap *descriptor_heap) DECLSPEC_HIDDEN;
|
||||
struct d3d12_descriptor_heap *unsafe_impl_from_ID3D12DescriptorHeap(ID3D12DescriptorHeap *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
static inline unsigned int d3d12_descriptor_heap_sampler_set_index()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned int d3d12_descriptor_heap_cbv_set_index()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned int d3d12_descriptor_heap_srv_set_index(bool is_buffer)
|
||||
{
|
||||
return 1 + (is_buffer ? 0 : 1);
|
||||
}
|
||||
|
||||
static inline unsigned int d3d12_descriptor_heap_uav_set_index(bool is_buffer)
|
||||
{
|
||||
return 3 + (is_buffer ? 0 : 1);
|
||||
}
|
||||
|
||||
unsigned int d3d12_descriptor_heap_set_index_from_binding(const struct vkd3d_bindless_set_info *set) DECLSPEC_HIDDEN;
|
||||
unsigned int d3d12_descriptor_heap_set_index_from_magic(uint32_t magic, bool is_buffer) DECLSPEC_HIDDEN;
|
||||
|
||||
/* ID3D12QueryHeap */
|
||||
struct d3d12_query_heap
|
||||
{
|
||||
|
@ -1111,6 +1140,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) DECLSPEC_HIDDEN;
|
||||
|
||||
VkDescriptorType vk_descriptor_type_from_bindless_set_info(const struct vkd3d_bindless_set_info *set_info) DECLSPEC_HIDDEN;
|
||||
|
||||
struct vkd3d_format_compatibility_list
|
||||
{
|
||||
DXGI_FORMAT typeless_format;
|
||||
|
|
Loading…
Reference in New Issue