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;
|
struct d3d12_device *device = heap->device;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
d3d12_descriptor_heap_cleanup(heap);
|
||||||
vkd3d_private_store_destroy(&heap->private_store);
|
vkd3d_private_store_destroy(&heap->private_store);
|
||||||
|
|
||||||
switch (heap->desc.Type)
|
switch (heap->desc.Type)
|
||||||
|
@ -3626,22 +3627,120 @@ struct d3d12_descriptor_heap *unsafe_impl_from_ID3D12DescriptorHeap(ID3D12Descri
|
||||||
return impl_from_ID3D12DescriptorHeap(iface);
|
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,
|
static HRESULT d3d12_descriptor_heap_init(struct d3d12_descriptor_heap *descriptor_heap,
|
||||||
struct d3d12_device *device, const D3D12_DESCRIPTOR_HEAP_DESC *desc)
|
struct d3d12_device *device, const D3D12_DESCRIPTOR_HEAP_DESC *desc)
|
||||||
{
|
{
|
||||||
|
unsigned int i;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
memset(descriptor_heap, 0, sizeof(*descriptor_heap));
|
||||||
descriptor_heap->ID3D12DescriptorHeap_iface.lpVtbl = &d3d12_descriptor_heap_vtbl;
|
descriptor_heap->ID3D12DescriptorHeap_iface.lpVtbl = &d3d12_descriptor_heap_vtbl;
|
||||||
descriptor_heap->refcount = 1;
|
descriptor_heap->refcount = 1;
|
||||||
|
descriptor_heap->device = device;
|
||||||
descriptor_heap->desc = *desc;
|
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)))
|
if (FAILED(hr = vkd3d_private_store_init(&descriptor_heap->private_store)))
|
||||||
return hr;
|
goto fail;
|
||||||
|
|
||||||
d3d12_device_add_ref(descriptor_heap->device = device);
|
|
||||||
|
|
||||||
|
d3d12_device_add_ref(descriptor_heap->device);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
d3d12_descriptor_heap_cleanup(descriptor_heap);
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device,
|
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;
|
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 */
|
/* ID3D12QueryHeap */
|
||||||
static inline struct d3d12_query_heap *impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface)
|
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));
|
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,
|
static void vkd3d_uav_clear_pipelines_cleanup(struct vkd3d_uav_clear_pipelines *pipelines,
|
||||||
struct d3d12_device *device)
|
struct d3d12_device *device)
|
||||||
{
|
{
|
||||||
|
|
|
@ -60,6 +60,8 @@ struct d3d12_command_list;
|
||||||
struct d3d12_device;
|
struct d3d12_device;
|
||||||
struct d3d12_resource;
|
struct d3d12_resource;
|
||||||
|
|
||||||
|
struct vkd3d_bindless_set_info;
|
||||||
|
|
||||||
struct vkd3d_vk_global_procs
|
struct vkd3d_vk_global_procs
|
||||||
{
|
{
|
||||||
PFN_vkCreateInstance vkCreateInstance;
|
PFN_vkCreateInstance vkCreateInstance;
|
||||||
|
@ -609,6 +611,9 @@ struct d3d12_descriptor_heap
|
||||||
|
|
||||||
D3D12_DESCRIPTOR_HEAP_DESC desc;
|
D3D12_DESCRIPTOR_HEAP_DESC desc;
|
||||||
|
|
||||||
|
VkDescriptorPool vk_descriptor_pool;
|
||||||
|
VkDescriptorSet vk_descriptor_sets[VKD3D_MAX_BINDLESS_DESCRIPTOR_SETS];
|
||||||
|
|
||||||
struct d3d12_device *device;
|
struct d3d12_device *device;
|
||||||
|
|
||||||
struct vkd3d_private_store private_store;
|
struct vkd3d_private_store private_store;
|
||||||
|
@ -618,8 +623,32 @@ struct d3d12_descriptor_heap
|
||||||
|
|
||||||
HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device,
|
HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device,
|
||||||
const D3D12_DESCRIPTOR_HEAP_DESC *desc, struct d3d12_descriptor_heap **descriptor_heap) DECLSPEC_HIDDEN;
|
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;
|
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 */
|
/* ID3D12QueryHeap */
|
||||||
struct d3d12_query_heap
|
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,
|
void vkd3d_bindless_state_cleanup(struct vkd3d_bindless_state *bindless_state,
|
||||||
struct d3d12_device *device) DECLSPEC_HIDDEN;
|
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
|
struct vkd3d_format_compatibility_list
|
||||||
{
|
{
|
||||||
DXGI_FORMAT typeless_format;
|
DXGI_FORMAT typeless_format;
|
||||||
|
|
Loading…
Reference in New Issue