mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-22 11:56:58 +02:00
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 <Nmzik@mail.ru>
This commit is contained in:
@@ -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 {};
|
||||
|
||||
@@ -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<bool>(flags & vk::ImageCreateFlagBits::eBlockTexelViewCompatible) ==
|
||||
supported &&
|
||||
static_cast<bool>(flags & vk::ImageCreateFlagBits::eExtendedUsage) ==
|
||||
static_cast<bool>(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,
|
||||
|
||||
Reference in New Issue
Block a user