diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index 7122ca134f..0c3570ab50 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp @@ -127,18 +127,33 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache, // we can skip the whole dispatch and update the tracked state instead. Also, it is not // intended to be consumed and in such rare cases (e.g. HTile introspection, CRAA) we // will need its full emulation anyways. For cases of metadata read a warning will be logged. - for (const auto& desc : info->texture_buffers) { + const auto IsMetaUpdate = [&](const auto& desc) { const VAddr address = desc.GetSharp(*info).base_address; if (desc.is_written) { if (texture_cache.TouchMeta(address, true)) { LOG_TRACE(Render_Vulkan, "Metadata update skipped"); - return false; + return true; } } else { if (texture_cache.IsMeta(address)) { LOG_WARNING(Render_Vulkan, "Unexpected metadata read by a CS shader (buffer)"); } } + return false; + }; + + for (const auto& desc : info->buffers) { + if (desc.is_gds_buffer) { + continue; + } + if (IsMetaUpdate(desc)) { + return false; + } + } + for (const auto& desc : info->texture_buffers) { + if (IsMetaUpdate(desc)) { + return false; + } } BindBuffers(buffer_cache, texture_cache, *info, binding, push_data, set_writes, diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 279e0d82b9..1a7b1a0e7f 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -221,7 +221,7 @@ ImageId TextureCache::FindImage(const ImageInfo& info, FindFlags flags) { !IsVulkanFormatCompatible(info.pixel_format, cache_image.info.pixel_format)) { continue; } - ASSERT(cache_image.info.type == info.type || True(flags & FindFlags::RelaxFmt)); + ASSERT((cache_image.info.type == info.type || info.size == Extent3D{1, 1, 1} || True(flags & FindFlags::RelaxFmt))); image_id = cache_id; } diff --git a/src/video_core/texture_cache/types.h b/src/video_core/texture_cache/types.h index bcef193556..e20d4dcd04 100644 --- a/src/video_core/texture_cache/types.h +++ b/src/video_core/texture_cache/types.h @@ -38,6 +38,10 @@ struct Extent3D { u32 depth; auto operator<=>(const Extent3D&) const = default; + + bool operator==(const Extent3D& other) const { + return width == other.width && height == other.height && depth == other.depth; + } }; struct SubresourceLayers {