diff --git a/src/microsoft/vulkan/dzn_device.c b/src/microsoft/vulkan/dzn_device.c index dac2695b825..1bd16a3b908 100644 --- a/src/microsoft/vulkan/dzn_device.c +++ b/src/microsoft/vulkan/dzn_device.c @@ -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, diff --git a/src/microsoft/vulkan/dzn_image.c b/src/microsoft/vulkan/dzn_image.c index 67c44294293..1fc2eb2c37b 100644 --- a/src/microsoft/vulkan/dzn_image.c +++ b/src/microsoft/vulkan/dzn_image.c @@ -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);