vkd3d: Add layout property to texture views.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-04-24 15:53:01 +02:00 committed by Hans-Kristian Arntzen
parent 45001e05d4
commit 76b2d2af89
3 changed files with 36 additions and 6 deletions

View File

@ -3435,6 +3435,10 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
{
dst_is_depth_stencil = !!(dst_format->vk_aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT));
attachment_layout = dst_is_depth_stencil
? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
if (!(dst_format = vkd3d_meta_get_copy_image_attachment_format(&list->device->meta_ops, dst_format, src_format)))
{
ERR("No attachment format found for source format %u.\n", src_format->vk_format);
@ -3457,6 +3461,7 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
memset(&dst_view_desc, 0, sizeof(dst_view_desc));
dst_view_desc.view_type = pipeline_key.view_type;
dst_view_desc.layout = d3d12_resource_pick_layout(dst_resource, attachment_layout);
dst_view_desc.format = dst_format;
dst_view_desc.miplevel_idx = region->dstSubresource.mipLevel;
dst_view_desc.miplevel_count = 1;
@ -3466,6 +3471,7 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
memset(&src_view_desc, 0, sizeof(src_view_desc));
src_view_desc.view_type = pipeline_key.view_type;
src_view_desc.layout = d3d12_resource_pick_layout(src_resource, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
src_view_desc.format = src_format;
src_view_desc.miplevel_idx = region->srcSubresource.mipLevel;
src_view_desc.miplevel_count = 1;
@ -3562,10 +3568,6 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
vk_image_barriers[i].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
}
attachment_layout = dst_is_depth_stencil
? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
vk_image_barriers[0].oldLayout = dst_layout;
vk_image_barriers[0].newLayout = attachment_layout;
vk_image_barriers[0].image = dst_resource->u.vk_image;
@ -5285,6 +5287,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
{
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;
view_desc.miplevel_idx = base_view->info.texture.miplevel_idx;
view_desc.miplevel_count = 1;

View File

@ -2685,6 +2685,7 @@ static bool init_default_texture_view_desc(struct vkd3d_texture_view_desc *desc,
return false;
}
desc->layout = resource->common_layout;
desc->miplevel_idx = 0;
desc->miplevel_count = 1;
desc->layer_idx = 0;
@ -2759,6 +2760,7 @@ bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
object->u.vk_image_view = vk_view;
object->format = format;
object->info.texture.vk_view_type = desc->view_type;
object->info.texture.vk_layout = desc->layout;
object->info.texture.miplevel_idx = desc->miplevel_idx;
object->info.texture.layer_idx = desc->layer_idx;
object->info.texture.layer_count = desc->layer_count;
@ -2858,6 +2860,7 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
WARN("Creating NULL SRV %#x.\n", desc->ViewDimension);
vkd3d_desc.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
vkd3d_desc.format = vkd3d_get_format(device, VKD3D_NULL_SRV_FORMAT, false);
vkd3d_desc.miplevel_idx = 0;
vkd3d_desc.miplevel_count = 1;
@ -3080,6 +3083,7 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
WARN("Creating NULL UAV %#x.\n", desc->ViewDimension);
vkd3d_desc.layout = VK_IMAGE_LAYOUT_GENERAL;
vkd3d_desc.format = vkd3d_get_format(device, VKD3D_NULL_UAV_FORMAT, false);
vkd3d_desc.miplevel_idx = 0;
vkd3d_desc.miplevel_count = 1;
@ -3508,6 +3512,8 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
return;
}
vkd3d_desc.layout = d3d12_resource_pick_layout(resource, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
if (desc)
{
switch (desc->ViewDimension)
@ -3592,6 +3598,23 @@ static void d3d12_dsv_desc_destroy(struct d3d12_dsv_desc *dsv, struct d3d12_devi
memset(dsv, 0, sizeof(*dsv));
}
static VkImageLayout d3d12_dsv_layout_from_flags(UINT flags)
{
const D3D12_DSV_FLAGS mask = D3D12_DSV_FLAG_READ_ONLY_DEPTH | D3D12_DSV_FLAG_READ_ONLY_STENCIL;
switch (flags & mask)
{
default: /* case 0: */
return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
case D3D12_DSV_FLAG_READ_ONLY_DEPTH:
return VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL;
case D3D12_DSV_FLAG_READ_ONLY_STENCIL:
return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL;
case D3D12_DSV_FLAG_READ_ONLY_DEPTH | D3D12_DSV_FLAG_READ_ONLY_STENCIL:
return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
}
}
void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_device *device,
struct d3d12_resource *resource, const D3D12_DEPTH_STENCIL_VIEW_DESC *desc)
{
@ -3623,8 +3646,8 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
if (desc)
{
if (desc->Flags)
FIXME("Ignoring flags %#x.\n", desc->Flags);
vkd3d_desc.layout = d3d12_resource_pick_layout(resource,
d3d12_dsv_layout_from_flags(desc->Flags));
switch (desc->ViewDimension)
{
@ -3664,6 +3687,8 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
/* Avoid passing down UINT32_MAX here since that makes framebuffer logic later rather awkward. */
vkd3d_desc.layer_count = min(vkd3d_desc.layer_count, resource->desc.DepthOrArraySize - vkd3d_desc.layer_idx);
}
else
vkd3d_desc.layout = d3d12_resource_pick_layout(resource, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
assert(d3d12_resource_is_texture(resource));

View File

@ -514,6 +514,7 @@ struct vkd3d_view
struct
{
VkImageViewType vk_view_type;
VkImageLayout vk_layout;
unsigned int miplevel_idx;
unsigned int layer_idx;
unsigned int layer_count;
@ -527,6 +528,7 @@ void vkd3d_view_incref(struct vkd3d_view *view) DECLSPEC_HIDDEN;
struct vkd3d_texture_view_desc
{
VkImageViewType view_type;
VkImageLayout layout;
const struct vkd3d_format *format;
unsigned int miplevel_idx;
unsigned int miplevel_count;