mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 20:38:06 +02:00
dzn: Handle separate stencil usage
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20919>
This commit is contained in:
parent
789acc2ffb
commit
34f372c47c
2 changed files with 35 additions and 28 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue