mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
libs/vkd3d: Add support for sampler descriptors in root descriptor tables.
This commit is contained in:
parent
0a0e29fbbf
commit
074513dc4d
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user