From 8502d8a77d1c8aaef33e8155a99a0c51cd00345d Mon Sep 17 00:00:00 2001 From: Arda Sahin <59416027+Arda501@users.noreply.github.com> Date: Thu, 22 Oct 2026 01:56:13 +0000 Subject: [PATCH] image: drop optional create flags the driver rejects instead of aborting (#1760) * image: request extended usage only for storage images * tests: restore block-texel-view support through the flag check loop order --------- Co-authored-by: nmzik --- .../host_gpu/renderer/image/image.cpp | 14 +++++++------ tests/ShaderRecompilerComputeTests.cpp | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/graphics/host_gpu/renderer/image/image.cpp b/src/graphics/host_gpu/renderer/image/image.cpp index cf89634f8..c2e0c9cdf 100644 --- a/src/graphics/host_gpu/renderer/image/image.cpp +++ b/src/graphics/host_gpu/renderer/image/image.cpp @@ -30,16 +30,18 @@ namespace { } } -[[nodiscard]] vk::ImageCreateFlags ImageCreateFlags(const GraphicContext& graphics, - const ImageInfo& info) { +[[nodiscard]] vk::ImageCreateFlags +ImageCreateFlags(const GraphicContext& graphics, const ImageInfo& info, vk::ImageUsageFlags usage) { vk::ImageCreateFlags flags {}; if (DepthAspectTransferFormat(info.pixel_format) == vk::Format::eUndefined) { flags |= vk::ImageCreateFlagBits::eMutableFormat; - flags |= vk::ImageCreateFlagBits::eExtendedUsage; if (info.IsBlock() && graphics.supports_block_texel_view) { flags |= vk::ImageCreateFlagBits::eBlockTexelViewCompatible; } } + if (usage & vk::ImageUsageFlagBits::eStorage) { + flags |= vk::ImageCreateFlagBits::eExtendedUsage; + } if (info.IsVolume()) { flags |= vk::ImageCreateFlagBits::e2DArrayCompatible; } @@ -59,7 +61,7 @@ namespace { const auto storage = usage | vk::ImageUsageFlagBits::eStorage; if (graphics.GetImageFormatProperties(info.pixel_format, HostImageType(info.type), vk::ImageTiling::eOptimal, storage, - ImageCreateFlags(graphics, info), + ImageCreateFlags(graphics, info, storage), nullptr) == vk::Result::eSuccess) { usage = storage; } else { @@ -702,7 +704,8 @@ Image::Image(GraphicContext& graphics, CommandScheduler& scheduler, const ImageI } vk::ImageCreateInfo create {}; - create.flags = ImageCreateFlags(graphics, info); + create.usage = ImageUsageFlags(graphics, info); + create.flags = ImageCreateFlags(graphics, info, create.usage); create.imageType = HostImageType(info.type); create.extent = info.extent; create.mipLevels = info.resources.levels; @@ -710,7 +713,6 @@ Image::Image(GraphicContext& graphics, CommandScheduler& scheduler, const ImageI create.format = info.pixel_format; create.tiling = vk::ImageTiling::eOptimal; create.initialLayout = vk::ImageLayout::eUndefined; - create.usage = ImageUsageFlags(graphics, info); create.samples = vulkan_sample_count(info.samples); vk::ImageFormatProperties properties {}; diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index aedee8f18..5e3be4d92 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -44928,6 +44928,26 @@ void CheckImageTransitionState(RenderContext &renderer) { ImageTestAccess::CopyRows(copy_capacity + 4, 1, copy_capacity) == 0, "buffered image copy does not split at the fixed scratch capacity"); + // RADV rejects 3D 128-bit BC images with block-texel views plus extended usage. + auto volume_info = MakeInfo(vk::Format::eBc7UnormBlock, 1, 1); + volume_info.guest_format = Prospero::BufferFormat::kBc7UNorm; + volume_info.type = Prospero::ImageType::kColor3D; + volume_info.extent.depth = 4; + volume_info.bytes_per_block = 16; + for (const bool supported : {false, context.supports_block_texel_view}) { + context.supports_block_texel_view = supported; + Image volume(context, scheduler, volume_info); + const auto flags = volume.backing.flags; + Require(name, "block volume create flags", + (flags & vk::ImageCreateFlagBits::e2DArrayCompatible) && + static_cast(flags & vk::ImageCreateFlagBits::eBlockTexelViewCompatible) == + supported && + static_cast(flags & vk::ImageCreateFlagBits::eExtendedUsage) == + static_cast(volume.backing.usage & + vk::ImageUsageFlagBits::eStorage), + "block volume requested extended usage without storage"); + } + Image image(context, scheduler, MakeInfo(vk::Format::eR8Unorm, 2, 3)); auto barriers = image.GetBarriers(vk::ImageLayout::eShaderReadOnlyOptimal,