fix for image view storage flag handling

This commit is contained in:
psucien 2024-09-08 20:11:00 +02:00
parent e3c2a91477
commit 56cc70dc97
3 changed files with 9 additions and 20 deletions

View file

@ -114,11 +114,11 @@ ImageViewInfo::ImageViewInfo(const AmdGpu::Liverpool::DepthBuffer& depth_buffer,
} }
ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info_, Image& image, ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info_, Image& image,
ImageId image_id_, std::optional<vk::ImageUsageFlags> usage_override /*= {}*/) ImageId image_id_)
: image_id{image_id_}, info{info_} { : image_id{image_id_}, info{info_} {
vk::ImageViewUsageCreateInfo usage_ci{}; vk::ImageViewUsageCreateInfo usage_ci{.usage = image.usage};
if (usage_override) { if (!info.is_storage) {
usage_ci.usage = usage_override.value(); usage_ci.usage &= ~vk::ImageUsageFlagBits::eStorage;
} }
// When sampling D32 texture from shader, the T# specifies R32 Float format so adjust it. // When sampling D32 texture from shader, the T# specifies R32 Float format so adjust it.
vk::Format format = info.format; vk::Format format = info.format;
@ -134,7 +134,7 @@ ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info
} }
const vk::ImageViewCreateInfo image_view_ci = { const vk::ImageViewCreateInfo image_view_ci = {
.pNext = usage_override ? &usage_ci : nullptr, .pNext = &usage_ci,
.image = image.image, .image = image.image,
.viewType = info.type, .viewType = info.type,
.format = instance.GetSupportedFormat(format), .format = instance.GetSupportedFormat(format),

View file

@ -8,8 +8,6 @@
#include "video_core/renderer_vulkan/vk_common.h" #include "video_core/renderer_vulkan/vk_common.h"
#include "video_core/texture_cache/types.h" #include "video_core/texture_cache/types.h"
#include <optional>
namespace Vulkan { namespace Vulkan {
class Instance; class Instance;
class Scheduler; class Scheduler;
@ -28,7 +26,7 @@ struct ImageViewInfo {
vk::Format format = vk::Format::eR8G8B8A8Unorm; vk::Format format = vk::Format::eR8G8B8A8Unorm;
SubresourceRange range; SubresourceRange range;
vk::ComponentMapping mapping{}; vk::ComponentMapping mapping{};
bool is_storage; bool is_storage = false;
auto operator<=>(const ImageViewInfo&) const = default; auto operator<=>(const ImageViewInfo&) const = default;
}; };
@ -38,8 +36,8 @@ struct Image;
constexpr Common::SlotId NULL_IMAGE_VIEW_ID{0}; constexpr Common::SlotId NULL_IMAGE_VIEW_ID{0};
struct ImageView { struct ImageView {
explicit ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info, Image& image, ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info, Image& image,
ImageId image_id, std::optional<vk::ImageUsageFlags> usage_override = {}); ImageId image_id);
~ImageView(); ~ImageView();
ImageView(const ImageView&) = delete; ImageView(const ImageView&) = delete;

View file

@ -243,16 +243,7 @@ ImageView& TextureCache::RegisterImageView(ImageId image_id, const ImageViewInfo
return slot_image_views[view_id]; return slot_image_views[view_id];
} }
// All tiled images are created with storage usage flag. This makes set of formats (e.g. sRGB) const ImageViewId view_id = slot_image_views.insert(instance, view_info, image, image_id);
// impossible to use. However, during view creation, if an image isn't used as storage we can
// temporary remove its storage bit.
std::optional<vk::ImageUsageFlags> usage_override;
if (!image.info.usage.storage) {
usage_override = image.usage & ~vk::ImageUsageFlagBits::eStorage;
}
const ImageViewId view_id =
slot_image_views.insert(instance, view_info, image, image_id, usage_override);
image.image_view_infos.emplace_back(view_info); image.image_view_infos.emplace_back(view_info);
image.image_view_ids.emplace_back(view_id); image.image_view_ids.emplace_back(view_id);
return slot_image_views[view_id]; return slot_image_views[view_id];