mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-28 22:06:59 +01:00
renderer: align texture overlap retirement
This commit is contained in:
+8
-37
@@ -22,7 +22,7 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <set>
|
#include <span>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <vulkan/vulkan_format_traits.hpp>
|
#include <vulkan/vulkan_format_traits.hpp>
|
||||||
|
|
||||||
@@ -279,27 +279,6 @@ void TextureCache::FreeImage(ImageId id) {
|
|||||||
DeleteImage(id);
|
DeleteImage(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureCache::DeleteImages(std::span<const ImageId> ids,
|
|
||||||
std::optional<ImageId> native_source) {
|
|
||||||
std::set<std::pair<uint32_t, uint32_t>> unique;
|
|
||||||
for (const auto id: ids) {
|
|
||||||
if (!id || !unique.emplace(id.index, id.generation).second) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
auto owner = ResolveOwner(id);
|
|
||||||
if (owner == nullptr) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (native_source == id) {
|
|
||||||
ClearGpuModified(id);
|
|
||||||
} else if (owner->IsGpuModified()) {
|
|
||||||
DownloadImage(id);
|
|
||||||
ClearGpuModified(id);
|
|
||||||
}
|
|
||||||
DeleteImage(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TextureCache::RetainImage(CommandBuffer& command, ImageId id) {
|
void TextureCache::RetainImage(CommandBuffer& command, ImageId id) {
|
||||||
auto owner = ResolveOwner(id);
|
auto owner = ResolveOwner(id);
|
||||||
if (owner == nullptr) {
|
if (owner == nullptr) {
|
||||||
@@ -729,7 +708,6 @@ ImageId TextureCache::ResolveDepthOverlap(const ImageInfo& requested, BindingTyp
|
|||||||
if (cached.binding.is_bound || cached.binding.is_target) {
|
if (cached.binding.is_bound || cached.binding.is_target) {
|
||||||
cached.binding.needs_rebind = true;
|
cached.binding.needs_rebind = true;
|
||||||
}
|
}
|
||||||
bool copied = false;
|
|
||||||
if (cached.backing.samples == replacement.backing.samples) {
|
if (cached.backing.samples == replacement.backing.samples) {
|
||||||
const bool copy_supported =
|
const bool copy_supported =
|
||||||
cached.backing.samples == 1 || cached.backing.format == replacement.backing.format ||
|
cached.backing.samples == 1 || cached.backing.format == replacement.backing.format ||
|
||||||
@@ -737,7 +715,6 @@ ImageId TextureCache::ResolveDepthOverlap(const ImageInfo& requested, BindingTyp
|
|||||||
ImageViewOps::FormatsCompatible(cached.backing.format, replacement.backing.format));
|
ImageViewOps::FormatsCompatible(cached.backing.format, replacement.backing.format));
|
||||||
if (copy_supported) {
|
if (copy_supported) {
|
||||||
CopyImage(replacement_id, cached_id);
|
CopyImage(replacement_id, cached_id);
|
||||||
copied = true;
|
|
||||||
} else {
|
} else {
|
||||||
LOGF_COLOR(Log::Color::BrightYellow,
|
LOGF_COLOR(Log::Color::BrightYellow,
|
||||||
"TextureCache: unsupported cross-format multisample depth copy\n");
|
"TextureCache: unsupported cross-format multisample depth copy\n");
|
||||||
@@ -754,18 +731,12 @@ ImageId TextureCache::ResolveDepthOverlap(const ImageInfo& requested, BindingTyp
|
|||||||
RetainImage(command, cached_id);
|
RetainImage(command, cached_id);
|
||||||
RetainImage(command, replacement_id);
|
RetainImage(command, replacement_id);
|
||||||
CommitGpuWrite(replacement);
|
CommitGpuWrite(replacement);
|
||||||
copied = true;
|
|
||||||
} else {
|
} else {
|
||||||
LOGF_COLOR(Log::Color::BrightYellow,
|
LOGF_COLOR(Log::Color::BrightYellow,
|
||||||
"TextureCache: unsupported unequal-sample depth overlap copy (%u -> %u)\n",
|
"TextureCache: unsupported unequal-sample depth overlap copy (%u -> %u)\n",
|
||||||
cached.backing.samples, replacement.backing.samples);
|
cached.backing.samples, replacement.backing.samples);
|
||||||
}
|
}
|
||||||
if (copied) {
|
FreeImage(cached_id);
|
||||||
DeleteImages(std::array {cached_id}, cached_id);
|
|
||||||
} else {
|
|
||||||
ClearGpuModified(cached_id);
|
|
||||||
DeleteImage(cached_id);
|
|
||||||
}
|
|
||||||
return replacement_id;
|
return replacement_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -787,7 +758,7 @@ TextureCache::OverlapResult TextureCache::ResolveOverlap(const ImageInfo& reques
|
|||||||
if (requested.BlockExtent() != cached.info.BlockExtent() ||
|
if (requested.BlockExtent() != cached.info.BlockExtent() ||
|
||||||
requested_block != cached_block) {
|
requested_block != cached_block) {
|
||||||
if (safe_to_delete) {
|
if (safe_to_delete) {
|
||||||
DeleteImages(std::array {cached_id}, cached_id);
|
FreeImage(cached_id);
|
||||||
}
|
}
|
||||||
return {merged_id};
|
return {merged_id};
|
||||||
}
|
}
|
||||||
@@ -804,7 +775,7 @@ TextureCache::OverlapResult TextureCache::ResolveOverlap(const ImageInfo& reques
|
|||||||
}
|
}
|
||||||
if (requested.tile_mode != cached.info.tile_mode) {
|
if (requested.tile_mode != cached.info.tile_mode) {
|
||||||
if (safe_to_delete) {
|
if (safe_to_delete) {
|
||||||
DeleteImages(std::array {cached_id}, cached_id);
|
FreeImage(cached_id);
|
||||||
}
|
}
|
||||||
return {merged_id};
|
return {merged_id};
|
||||||
}
|
}
|
||||||
@@ -840,7 +811,7 @@ TextureCache::OverlapResult TextureCache::ResolveOverlap(const ImageInfo& reques
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (safe_to_delete) {
|
if (safe_to_delete) {
|
||||||
DeleteImages(std::array {cached_id}, cached_id);
|
FreeImage(cached_id);
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@@ -854,13 +825,13 @@ TextureCache::OverlapResult TextureCache::ResolveOverlap(const ImageInfo& reques
|
|||||||
if (merged_id) {
|
if (merged_id) {
|
||||||
ResolveImage(merged_id).binding.is_target = true;
|
ResolveImage(merged_id).binding.is_target = true;
|
||||||
}
|
}
|
||||||
DeleteImages(std::array {cached_id}, cached_id);
|
FreeImage(cached_id);
|
||||||
return {merged_id};
|
return {merged_id};
|
||||||
}
|
}
|
||||||
if (merged_id) {
|
if (merged_id) {
|
||||||
CopyImageMip(merged_id, cached_id, static_cast<uint32_t>(mip),
|
CopyImageMip(merged_id, cached_id, static_cast<uint32_t>(mip),
|
||||||
static_cast<uint32_t>(layer));
|
static_cast<uint32_t>(layer));
|
||||||
DeleteImages(std::array {cached_id}, cached_id);
|
FreeImage(cached_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -879,7 +850,7 @@ ImageId TextureCache::ExpandImage(const ImageInfo& info, ImageId source_id) {
|
|||||||
InitializeImage(expanded_id,
|
InitializeImage(expanded_id,
|
||||||
ImageDesc {.info = info, .view_info = {}, .type = UploadBinding(source)});
|
ImageDesc {.info = info, .view_info = {}, .type = UploadBinding(source)});
|
||||||
CopyImage(expanded_id, source_id);
|
CopyImage(expanded_id, source_id);
|
||||||
DeleteImages(std::array {source_id}, source_id);
|
FreeImage(source_id);
|
||||||
return expanded_id;
|
return expanded_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-14
@@ -13,9 +13,7 @@
|
|||||||
#include <compare>
|
#include <compare>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <optional>
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <span>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -111,18 +109,17 @@ private:
|
|||||||
void UnregisterImage(ImageId id);
|
void UnregisterImage(ImageId id);
|
||||||
void DeleteImage(ImageId id);
|
void DeleteImage(ImageId id);
|
||||||
void FreeImage(ImageId id);
|
void FreeImage(ImageId id);
|
||||||
void DeleteImages(std::span<const ImageId> ids, std::optional<ImageId> native_source = {});
|
void RetainImage(CommandBuffer& command, ImageId id);
|
||||||
void RetainImage(CommandBuffer& command, ImageId id);
|
void TouchImage(Image& image);
|
||||||
void TouchImage(Image& image);
|
void TrackImage(ImageId id);
|
||||||
void TrackImage(ImageId id);
|
void TrackImageHead(ImageId id);
|
||||||
void TrackImageHead(ImageId id);
|
void TrackImageTail(ImageId id);
|
||||||
void TrackImageTail(ImageId id);
|
void UntrackImage(ImageId id);
|
||||||
void UntrackImage(ImageId id);
|
void UntrackImageHead(ImageId id);
|
||||||
void UntrackImageHead(ImageId id);
|
void UntrackImageTail(ImageId id);
|
||||||
void UntrackImageTail(ImageId id);
|
void MarkAsMaybeDirty(ImageId id, Image& image);
|
||||||
void MarkAsMaybeDirty(ImageId id, Image& image);
|
void TrackImageDownload(ImageId id);
|
||||||
void TrackImageDownload(ImageId id);
|
void TrackImageDownloadLocked(ImageId id, Image& image);
|
||||||
void TrackImageDownloadLocked(ImageId id, Image& image);
|
|
||||||
[[nodiscard]] static bool SameBacking(const ImageInfo& cached, const ImageInfo& requested,
|
[[nodiscard]] static bool SameBacking(const ImageInfo& cached, const ImageInfo& requested,
|
||||||
bool exact_format);
|
bool exact_format);
|
||||||
[[nodiscard]] static BindingType UploadBinding(const Image& image);
|
[[nodiscard]] static BindingType UploadBinding(const Image& image);
|
||||||
|
|||||||
@@ -7646,6 +7646,8 @@ public:
|
|||||||
array_target_view != nullptr && array_target_owner != nullptr &&
|
array_target_view != nullptr && array_target_owner != nullptr &&
|
||||||
array_target_owner->binding.needs_rebind &&
|
array_target_owner->binding.needs_rebind &&
|
||||||
expanded_array_id != array_target_id &&
|
expanded_array_id != array_target_id &&
|
||||||
|
!TextureCacheTestAccess::Contains(texture_cache,
|
||||||
|
array_target_id) &&
|
||||||
array_binding.resources.images[0].image_view != nullptr &&
|
array_binding.resources.images[0].image_view != nullptr &&
|
||||||
array_binding.resources.images[0].desc.info.type ==
|
array_binding.resources.images[0].desc.info.type ==
|
||||||
Prospero::ImageType::kColor2D &&
|
Prospero::ImageType::kColor2D &&
|
||||||
|
|||||||
Reference in New Issue
Block a user