vkd3d: Introduce vkd3d_buffer_view_desc.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-08-03 14:14:59 +02:00 committed by Hans-Kristian Arntzen
parent 05381caac9
commit 3c9a54cb73
3 changed files with 45 additions and 19 deletions

View File

@ -5977,7 +5977,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
{
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface);
struct vkd3d_view *base_view, *uint_view;
struct vkd3d_texture_view_desc view_desc;
const struct vkd3d_format *uint_format;
struct d3d12_resource *resource_impl;
VkClearColorValue color;
@ -6005,7 +6004,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
if (d3d12_resource_is_texture(resource_impl))
{
struct vkd3d_texture_view_desc view_desc;
memset(&view_desc, 0, sizeof(view_desc));
view_desc.view_type = base_view->info.texture.vk_view_type;
view_desc.layout = base_view->info.texture.vk_layout;
view_desc.format = uint_format;
@ -6023,8 +6024,13 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
}
else
{
if (!vkd3d_create_buffer_view(list->device, resource_impl->vk_buffer, uint_format,
base_view->info.buffer.offset, base_view->info.buffer.size, &uint_view))
struct vkd3d_buffer_view_desc view_desc;
view_desc.buffer = resource_impl->vk_buffer;
view_desc.format = uint_format;
view_desc.offset = base_view->info.buffer.offset;
view_desc.size = base_view->info.buffer.size;
if (!vkd3d_create_buffer_view(list->device, &view_desc, &uint_view))
{
ERR("Failed to create buffer view.\n");
return;

View File

@ -3100,14 +3100,13 @@ static bool vkd3d_create_vk_buffer_view(struct d3d12_device *device,
return vr == VK_SUCCESS;
}
bool vkd3d_create_buffer_view(struct d3d12_device *device, VkBuffer vk_buffer, const struct vkd3d_format *format,
VkDeviceSize offset, VkDeviceSize size, struct vkd3d_view **view)
bool vkd3d_create_buffer_view(struct d3d12_device *device, const struct vkd3d_buffer_view_desc *desc, struct vkd3d_view **view)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
struct vkd3d_view *object;
VkBufferView vk_view;
if (!vkd3d_create_vk_buffer_view(device, vk_buffer, format, offset, size, &vk_view))
if (!vkd3d_create_vk_buffer_view(device, desc->buffer, desc->format, desc->offset, desc->size, &vk_view))
return false;
if (!(object = vkd3d_view_create(VKD3D_VIEW_TYPE_BUFFER)))
@ -3117,9 +3116,9 @@ bool vkd3d_create_buffer_view(struct d3d12_device *device, VkBuffer vk_buffer, c
}
object->vk_buffer_view = vk_view;
object->format = format;
object->info.buffer.offset = offset;
object->info.buffer.size = size;
object->format = desc->format;
object->info.buffer.offset = desc->offset;
object->info.buffer.size = desc->size;
*view = object;
return true;
}
@ -3131,6 +3130,7 @@ static bool vkd3d_create_buffer_view_for_resource(struct d3d12_device *device,
unsigned int offset, unsigned int size, unsigned int structure_stride,
unsigned int flags, struct vkd3d_view **view)
{
struct vkd3d_buffer_view_desc view_desc;
const struct vkd3d_format *format;
VkDeviceSize element_size;
@ -3156,8 +3156,12 @@ static bool vkd3d_create_buffer_view_for_resource(struct d3d12_device *device,
assert(d3d12_resource_is_buffer(resource));
return vkd3d_create_buffer_view(device, resource->vk_buffer,
format, resource->heap_offset + offset * element_size, size * element_size, view);
view_desc.buffer = resource->vk_buffer;
view_desc.format = format;
view_desc.offset = resource->heap_offset + offset * element_size;
view_desc.size = size * element_size;
return vkd3d_create_buffer_view(device, &view_desc, view);
}
static void vkd3d_set_view_swizzle_for_format(VkComponentMapping *components,
@ -3467,9 +3471,13 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
{
if (!device->device_info.robustness2_features.nullDescriptor)
{
if (!vkd3d_create_buffer_view(device, null_resources->vk_buffer,
vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false),
0, VKD3D_NULL_BUFFER_SIZE, &view))
struct vkd3d_buffer_view_desc view_desc;
view_desc.buffer = null_resources->vk_buffer;
view_desc.format = vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false);
view_desc.offset = 0;
view_desc.size = VKD3D_NULL_BUFFER_SIZE;
if (!vkd3d_create_buffer_view(device, &view_desc, &view))
return;
}
@ -3700,9 +3708,13 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
{
if (!device->device_info.robustness2_features.nullDescriptor)
{
if (!vkd3d_create_buffer_view(device, null_resources->vk_buffer,
vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false),
0, VKD3D_NULL_BUFFER_SIZE, &view))
struct vkd3d_buffer_view_desc view_desc;
view_desc.buffer = null_resources->vk_buffer;
view_desc.format = vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false);
view_desc.offset = 0;
view_desc.size = VKD3D_NULL_BUFFER_SIZE;
if (!vkd3d_create_buffer_view(device, &view_desc, &view))
return;
}

View File

@ -578,6 +578,14 @@ struct vkd3d_view
void vkd3d_view_decref(struct vkd3d_view *view, struct d3d12_device *device) DECLSPEC_HIDDEN;
void vkd3d_view_incref(struct vkd3d_view *view) DECLSPEC_HIDDEN;
struct vkd3d_buffer_view_desc
{
VkBuffer buffer;
const struct vkd3d_format *format;
VkDeviceSize offset;
VkDeviceSize size;
};
struct vkd3d_texture_view_desc
{
VkImageViewType view_type;
@ -591,8 +599,8 @@ struct vkd3d_texture_view_desc
bool allowed_swizzle;
};
bool vkd3d_create_buffer_view(struct d3d12_device *device, VkBuffer vk_buffer, const struct vkd3d_format *format,
VkDeviceSize offset, VkDeviceSize size, struct vkd3d_view **view) DECLSPEC_HIDDEN;
bool vkd3d_create_buffer_view(struct d3d12_device *device,
const struct vkd3d_buffer_view_desc *desc, struct vkd3d_view **view) DECLSPEC_HIDDEN;
bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
const struct vkd3d_texture_view_desc *desc, struct vkd3d_view **view) DECLSPEC_HIDDEN;