libs/vkd3d: Add support for sampler descriptors in root descriptor tables.

This commit is contained in:
Józef Kucia 2017-08-04 17:06:33 +02:00
parent 0a0e29fbbf
commit 074513dc4d
4 changed files with 42 additions and 63 deletions

View File

@ -2267,8 +2267,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetGraphicsRootSignature(ID3D12
list->graphics_root_signature = rs;
}
static bool vk_write_descriptor_set_from_d3d12_cbv_srv_uav_desc(VkWriteDescriptorSet *vk_descriptor_write,
VkDescriptorImageInfo *vk_image_info, struct d3d12_cbv_srv_uav_desc *descriptor,
static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_descriptor_write,
VkDescriptorImageInfo *vk_image_info, struct d3d12_desc *descriptor,
VkDescriptorSet vk_descriptor_set, uint32_t vk_binding)
{
vk_descriptor_write->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
@ -2309,6 +2309,14 @@ static bool vk_write_descriptor_set_from_d3d12_cbv_srv_uav_desc(VkWriteDescripto
vk_descriptor_write->pImageInfo = vk_image_info;
}
}
else if (descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_SAMPLER)
{
vk_image_info->sampler = descriptor->u.vk_sampler;
vk_image_info->imageView = VK_NULL_HANDLE;
vk_image_info->imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
vk_descriptor_write->pImageInfo = vk_image_info;
}
else
{
FIXME("Unhandled descriptor %#x.\n", descriptor->magic);
@ -2328,8 +2336,8 @@ static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *l
const struct d3d12_root_descriptor_table_range *range;
const struct vkd3d_vk_device_procs *vk_procs;
struct d3d12_device *device = list->device;
struct d3d12_cbv_srv_uav_desc *descriptor;
unsigned int i, j, descriptor_count;
struct d3d12_desc *descriptor;
assert(root_signature->parameters[index].parameter_type == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE);
descriptor_table = &root_signature->parameters[index].u.descriptor_table;
@ -2345,7 +2353,7 @@ static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *l
return;
}
descriptor = (struct d3d12_cbv_srv_uav_desc *)(intptr_t)base_descriptor.ptr;
descriptor = (struct d3d12_desc *)(intptr_t)base_descriptor.ptr;
descriptor_count = 0;
current_descriptor_write = descriptor_writes;
@ -2355,7 +2363,7 @@ static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *l
range = &descriptor_table->ranges[i];
for (j = 0; j < range->descriptor_count; ++j, ++descriptor)
{
if (!vk_write_descriptor_set_from_d3d12_cbv_srv_uav_desc(current_descriptor_write,
if (!vk_write_descriptor_set_from_d3d12_desc(current_descriptor_write,
current_image_info, descriptor, descriptor_set, range->binding + j))
continue;

View File

@ -834,10 +834,8 @@ static UINT STDMETHODCALLTYPE d3d12_device_GetDescriptorHandleIncrementSize(ID3D
switch (descriptor_heap_type)
{
case D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV:
return sizeof(struct d3d12_cbv_srv_uav_desc);
case D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER:
return sizeof(struct d3d12_sampler_desc);
return sizeof(struct d3d12_desc);
case D3D12_DESCRIPTOR_HEAP_TYPE_RTV:
return sizeof(struct d3d12_rtv_desc);
@ -884,7 +882,7 @@ static void STDMETHODCALLTYPE d3d12_device_CreateConstantBufferView(ID3D12Device
{
TRACE("iface %p, desc %p, descriptor %#lx.\n", iface, desc, descriptor.ptr);
d3d12_cbv_srv_uav_desc_create_cbv((struct d3d12_cbv_srv_uav_desc *)descriptor.ptr,
d3d12_desc_create_cbv((struct d3d12_desc *)descriptor.ptr,
impl_from_ID3D12Device(iface), desc);
}
@ -895,7 +893,7 @@ static void STDMETHODCALLTYPE d3d12_device_CreateShaderResourceView(ID3D12Device
TRACE("iface %p, resource %p, desc %p, descriptor %#lx.\n",
iface, resource, desc, descriptor.ptr);
d3d12_cbv_srv_uav_desc_create_srv((struct d3d12_cbv_srv_uav_desc *)descriptor.ptr,
d3d12_desc_create_srv((struct d3d12_desc *)descriptor.ptr,
impl_from_ID3D12Device(iface), unsafe_impl_from_ID3D12Resource(resource), desc);
}
@ -909,7 +907,7 @@ static void STDMETHODCALLTYPE d3d12_device_CreateUnorderedAccessView(ID3D12Devic
if (counter_resource)
FIXME("Counter resources not implemented yet.\n");
d3d12_cbv_srv_uav_desc_create_uav((struct d3d12_cbv_srv_uav_desc *)descriptor.ptr,
d3d12_desc_create_uav((struct d3d12_desc *)descriptor.ptr,
impl_from_ID3D12Device(iface), unsafe_impl_from_ID3D12Resource(resource), desc);
}
@ -940,7 +938,7 @@ static void STDMETHODCALLTYPE d3d12_device_CreateSampler(ID3D12Device *iface,
{
TRACE("iface %p, desc %p, descriptor %#lx.\n", iface, desc, descriptor.ptr);
d3d12_sampler_desc_create_sampler((struct d3d12_sampler_desc *)descriptor.ptr,
d3d12_desc_create_sampler((struct d3d12_desc *)descriptor.ptr,
impl_from_ID3D12Device(iface), desc);
}

View File

@ -758,22 +758,20 @@ HRESULT vkd3d_create_image_resource(ID3D12Device *device, const D3D12_RESOURCE_D
}
/* CBVs, SRVs, UAVs */
static void d3d12_cbv_srv_uav_desc_destroy(struct d3d12_cbv_srv_uav_desc *descriptor,
static void d3d12_desc_destroy(struct d3d12_desc *descriptor,
struct d3d12_device *device)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
/* Nothing to do for VKD3D_DESCRIPTOR_MAGIC_CBV. */
if (descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_SRV)
{
VK_CALL(vkDestroyImageView(device->vk_device, descriptor->u.vk_image_view, NULL));
memset(descriptor, 0, sizeof(*descriptor));
}
else if (descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_UAV)
{
VK_CALL(vkDestroyBufferView(device->vk_device, descriptor->u.vk_buffer_view, NULL));
memset(descriptor, 0, sizeof(*descriptor));
}
else if (descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_SAMPLER)
VK_CALL(vkDestroySampler(device->vk_device, descriptor->u.vk_sampler, NULL));
memset(descriptor, 0, sizeof(*descriptor));
}
static VkResult vkd3d_create_buffer_view(struct d3d12_device *device,
@ -829,13 +827,13 @@ static VkResult vkd3d_create_texture_view(struct d3d12_device *device,
return vr;
}
void d3d12_cbv_srv_uav_desc_create_cbv(struct d3d12_cbv_srv_uav_desc *descriptor,
void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
struct d3d12_device *device, const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc)
{
struct VkDescriptorBufferInfo *buffer_info;
struct d3d12_resource *resource;
d3d12_cbv_srv_uav_desc_destroy(descriptor, device);
d3d12_desc_destroy(descriptor, device);
if (!desc)
{
@ -859,13 +857,13 @@ void d3d12_cbv_srv_uav_desc_create_cbv(struct d3d12_cbv_srv_uav_desc *descriptor
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
}
void d3d12_cbv_srv_uav_desc_create_srv(struct d3d12_cbv_srv_uav_desc *descriptor,
void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
const D3D12_SHADER_RESOURCE_VIEW_DESC *desc)
{
const struct vkd3d_format *format;
d3d12_cbv_srv_uav_desc_destroy(descriptor, device);
d3d12_desc_destroy(descriptor, device);
if (!resource)
{
@ -896,13 +894,13 @@ void d3d12_cbv_srv_uav_desc_create_srv(struct d3d12_cbv_srv_uav_desc *descriptor
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
}
void d3d12_cbv_srv_uav_desc_create_uav(struct d3d12_cbv_srv_uav_desc *descriptor,
void d3d12_desc_create_uav(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc)
{
const struct vkd3d_format *format;
d3d12_cbv_srv_uav_desc_destroy(descriptor, device);
d3d12_desc_destroy(descriptor, device);
if (!resource)
{
@ -957,17 +955,6 @@ void d3d12_cbv_srv_uav_desc_create_uav(struct d3d12_cbv_srv_uav_desc *descriptor
}
/* samplers */
static void d3d12_sampler_desc_destroy(struct d3d12_sampler_desc *sampler, struct d3d12_device *device)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
if (sampler->magic != VKD3D_DESCRIPTOR_MAGIC_SAMPLER)
return;
VK_CALL(vkDestroySampler(device->vk_device, sampler->vk_sampler, NULL));
memset(sampler, 0, sizeof(*sampler));
}
static VkFilter vk_filter_from_d3d12(D3D12_FILTER_TYPE type)
{
switch (type)
@ -1055,10 +1042,10 @@ static VkResult d3d12_create_sampler(struct d3d12_device *device, D3D12_FILTER f
return vr;
}
void d3d12_sampler_desc_create_sampler(struct d3d12_sampler_desc *sampler,
void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
struct d3d12_device *device, const D3D12_SAMPLER_DESC *desc)
{
d3d12_sampler_desc_destroy(sampler, device);
d3d12_desc_destroy(sampler, device);
if (!desc)
{
@ -1074,10 +1061,11 @@ void d3d12_sampler_desc_create_sampler(struct d3d12_sampler_desc *sampler,
if (d3d12_create_sampler(device, desc->Filter, desc->AddressU,
desc->AddressV, desc->AddressW, desc->MipLODBias, desc->MaxAnisotropy,
desc->ComparisonFunc, desc->MinLOD, desc->MaxLOD, &sampler->vk_sampler) < 0)
desc->ComparisonFunc, desc->MinLOD, desc->MaxLOD, &sampler->u.vk_sampler) < 0)
return;
sampler->magic = VKD3D_DESCRIPTOR_MAGIC_SAMPLER;
sampler->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLER;
}
HRESULT d3d12_device_create_static_sampler(struct d3d12_device *device,
@ -1261,23 +1249,13 @@ static ULONG STDMETHODCALLTYPE d3d12_descriptor_heap_Release(ID3D12DescriptorHea
switch (heap->desc.Type)
{
case D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV:
{
struct d3d12_cbv_srv_uav_desc *descriptors = (struct d3d12_cbv_srv_uav_desc *)heap->descriptors;
for (i = 0; i < heap->desc.NumDescriptors; ++i)
{
d3d12_cbv_srv_uav_desc_destroy(&descriptors[i], device);
}
break;
}
case D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER:
{
struct d3d12_sampler_desc *samplers = (struct d3d12_sampler_desc *)heap->descriptors;
struct d3d12_desc *descriptors = (struct d3d12_desc *)heap->descriptors;
for (i = 0; i < heap->desc.NumDescriptors; ++i)
{
d3d12_sampler_desc_destroy(&samplers[i], device);
d3d12_desc_destroy(&descriptors[i], device);
}
break;
}

View File

@ -179,7 +179,7 @@ HRESULT d3d12_committed_resource_create(struct d3d12_device *device,
const D3D12_CLEAR_VALUE *optimized_clear_value, struct d3d12_resource **resource) DECLSPEC_HIDDEN;
struct d3d12_resource *unsafe_impl_from_ID3D12Resource(ID3D12Resource *iface) DECLSPEC_HIDDEN;
struct d3d12_cbv_srv_uav_desc
struct d3d12_desc
{
uint32_t magic;
VkDescriptorType vk_descriptor_type;
@ -188,26 +188,21 @@ struct d3d12_cbv_srv_uav_desc
VkDescriptorBufferInfo vk_cbv_info;
VkBufferView vk_buffer_view;
VkImageView vk_image_view;
VkSampler vk_sampler;
} u;
};
void d3d12_cbv_srv_uav_desc_create_cbv(struct d3d12_cbv_srv_uav_desc *descriptor,
void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
struct d3d12_device *device, const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc) DECLSPEC_HIDDEN;
void d3d12_cbv_srv_uav_desc_create_srv(struct d3d12_cbv_srv_uav_desc *descriptor,
void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
const D3D12_SHADER_RESOURCE_VIEW_DESC *desc) DECLSPEC_HIDDEN;
void d3d12_cbv_srv_uav_desc_create_uav(struct d3d12_cbv_srv_uav_desc *descriptor,
void d3d12_desc_create_uav(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc) DECLSPEC_HIDDEN;
struct d3d12_sampler_desc
{
uint32_t magic;
VkSampler vk_sampler;
};
void d3d12_sampler_desc_create_sampler(struct d3d12_sampler_desc *sampler,
void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
struct d3d12_device *device, const D3D12_SAMPLER_DESC *desc) DECLSPEC_HIDDEN;
HRESULT d3d12_device_create_static_sampler(struct d3d12_device *device,
const D3D12_STATIC_SAMPLER_DESC *desc, VkSampler *vk_sampler) DECLSPEC_HIDDEN;