dzn: Handle separate stencil usage

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20919>
This commit is contained in:
Jesse Natalie 2023-01-25 09:02:35 -08:00 committed by Marge Bot
parent 789acc2ffb
commit 34f372c47c
2 changed files with 35 additions and 28 deletions

View file

@ -845,12 +845,17 @@ dzn_physical_device_get_image_format_properties(struct dzn_physical_device *pdev
.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,
};
VkImageUsageFlags usage = info->usage;
/* Extract input structs */
vk_foreach_struct_const(s, info->pNext) {
switch (s->sType) {
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
external_info = (const VkPhysicalDeviceExternalImageFormatInfo *)s;
break;
case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
usage |= ((const VkImageStencilUsageCreateInfo *)s)->stencilUsage;
break;
default:
dzn_debug_ignored_stype(s->sType);
break;
@ -877,7 +882,7 @@ dzn_physical_device_get_image_format_properties(struct dzn_physical_device *pdev
return VK_ERROR_FORMAT_NOT_SUPPORTED;
if (info->tiling != VK_IMAGE_TILING_OPTIMAL &&
(info->usage & ~(VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)))
(usage & ~(VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)))
return VK_ERROR_FORMAT_NOT_SUPPORTED;
if (info->tiling != VK_IMAGE_TILING_OPTIMAL &&
@ -904,24 +909,24 @@ dzn_physical_device_get_image_format_properties(struct dzn_physical_device *pdev
if (vk_format_is_block_compressed(info->format) && info->type == VK_IMAGE_TYPE_1D)
return VK_ERROR_FORMAT_NOT_SUPPORTED;
if ((info->usage & VK_IMAGE_USAGE_SAMPLED_BIT) &&
if ((usage & VK_IMAGE_USAGE_SAMPLED_BIT) &&
/* Note: format support for SAMPLED is not necessarily accurate for integer formats */
!(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_LOAD))
return VK_ERROR_FORMAT_NOT_SUPPORTED;
if ((info->usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) &&
if ((usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) &&
(!(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_SHADER_LOAD) || is_bgra4))
return VK_ERROR_FORMAT_NOT_SUPPORTED;
if ((info->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) &&
if ((usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) &&
(!(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_RENDER_TARGET) || is_bgra4))
return VK_ERROR_FORMAT_NOT_SUPPORTED;
if ((info->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) &&
if ((usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) &&
(!(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL) || is_bgra4))
return VK_ERROR_FORMAT_NOT_SUPPORTED;
if ((info->usage & VK_IMAGE_USAGE_STORAGE_BIT) &&
if ((usage & VK_IMAGE_USAGE_STORAGE_BIT) &&
(!(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW) || is_bgra4))
return VK_ERROR_FORMAT_NOT_SUPPORTED;
@ -984,7 +989,7 @@ dzn_physical_device_get_image_format_properties(struct dzn_physical_device *pdev
!(info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
(dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_MULTISAMPLE_LOAD) &&
!is_bgra4 &&
!(info->usage & VK_IMAGE_USAGE_STORAGE_BIT)) {
!(usage & VK_IMAGE_USAGE_STORAGE_BIT)) {
for (uint32_t s = VK_SAMPLE_COUNT_2_BIT; s < VK_SAMPLE_COUNT_64_BIT; s <<= 1) {
D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS ms_info = {
.Format = dfmt_info.Format,

View file

@ -90,18 +90,6 @@ dzn_image_create(struct dzn_device *device,
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
}
image->castable_formats = castable_formats;
image->castable_format_count = 0;
for (uint32_t i = 0; i < compat_format_count; i++) {
castable_formats[image->castable_format_count] =
dzn_image_get_dxgi_format(compat_formats[i], pCreateInfo->usage, 0);
if (castable_formats[image->castable_format_count] != DXGI_FORMAT_UNKNOWN)
image->castable_format_count++;
}
vk_free2(&device->vk.alloc, pAllocator, compat_formats);
#if 0
VkExternalMemoryHandleTypeFlags supported =
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT |
@ -127,6 +115,20 @@ dzn_image_create(struct dzn_device *device,
vk_image_init(&device->vk, &image->vk, pCreateInfo);
enum pipe_format pfmt = vk_format_to_pipe_format(image->vk.format);
VkImageUsageFlags usage = image->vk.usage | image->vk.stencil_usage;
image->castable_formats = castable_formats;
image->castable_format_count = 0;
for (uint32_t i = 0; i < compat_format_count; i++) {
castable_formats[image->castable_format_count] =
dzn_image_get_dxgi_format(compat_formats[i], usage, 0);
if (castable_formats[image->castable_format_count] != DXGI_FORMAT_UNKNOWN)
image->castable_format_count++;
}
vk_free2(&device->vk.alloc, pAllocator, compat_formats);
image->valid_access = D3D12_BARRIER_ACCESS_COPY_SOURCE | D3D12_BARRIER_ACCESS_COPY_DEST;
if (image->vk.tiling == VK_IMAGE_TILING_LINEAR) {
@ -151,7 +153,7 @@ dzn_image_create(struct dzn_device *device,
assert(pCreateInfo->arrayLayers == 1);
assert(pCreateInfo->samples == 1);
assert(pCreateInfo->imageType != VK_IMAGE_TYPE_3D);
assert(!(pCreateInfo->usage & ~(VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)));
assert(!(usage & ~(VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)));
D3D12_RESOURCE_DESC tmp_desc = {
.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D,
.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT,
@ -160,7 +162,7 @@ dzn_image_create(struct dzn_device *device,
.DepthOrArraySize = 1,
.MipLevels = 1,
.Format =
dzn_image_get_dxgi_format(pCreateInfo->format, pCreateInfo->usage, 0),
dzn_image_get_dxgi_format(pCreateInfo->format, usage, 0),
.SampleDesc = { .Count = 1, .Quality = 0 },
.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
.Flags = D3D12_RESOURCE_FLAG_NONE
@ -185,7 +187,7 @@ dzn_image_create(struct dzn_device *device,
} else {
image->desc.Format =
dzn_image_get_dxgi_format(pCreateInfo->format,
pCreateInfo->usage & ~VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
usage & ~VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
0),
image->desc.Dimension = (D3D12_RESOURCE_DIMENSION)(D3D12_RESOURCE_DIMENSION_TEXTURE1D + pCreateInfo->imageType);
image->desc.Width = image->vk.extent.width;
@ -214,24 +216,24 @@ dzn_image_create(struct dzn_device *device,
image->desc.Flags = D3D12_RESOURCE_FLAG_NONE;
if (image->vk.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
image->valid_access |= D3D12_BARRIER_ACCESS_RENDER_TARGET;
}
if (image->vk.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
if (usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
image->valid_access |= D3D12_BARRIER_ACCESS_DEPTH_STENCIL_READ |
D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE;
if (!(image->vk.usage & (VK_IMAGE_USAGE_SAMPLED_BIT |
if (!(usage & (VK_IMAGE_USAGE_SAMPLED_BIT |
VK_IMAGE_USAGE_STORAGE_BIT |
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
VK_IMAGE_USAGE_TRANSFER_SRC_BIT))) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE;
image->valid_access &= ~D3D12_BARRIER_ACCESS_SHADER_RESOURCE;
}
} else if (image->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) {
} else if (usage & VK_IMAGE_USAGE_STORAGE_BIT) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
image->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
}
@ -239,7 +241,7 @@ dzn_image_create(struct dzn_device *device,
/* Images with TRANSFER_DST can be cleared or passed as a blit/resolve
* destination. Both operations require the RT or DS cap flags.
*/
if ((image->vk.usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) &&
if ((usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) &&
image->vk.tiling == VK_IMAGE_TILING_OPTIMAL) {
D3D12_FEATURE_DATA_FORMAT_SUPPORT dfmt_info =
@ -259,7 +261,7 @@ dzn_image_create(struct dzn_device *device,
}
if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT &&
!(image->vk.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT))
!(usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT))
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS;
*out = dzn_image_to_handle(image);