mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-03 16:02:26 +00:00
video_core: Remove some invalidation remnants
This commit is contained in:
parent
f4966ba4af
commit
3862fd11c7
@ -269,6 +269,7 @@ std::pair<Buffer*, u32> BufferCache::ObtainTempBuffer(VAddr gpu_addr, u32 size)
|
|||||||
if (buffer_id) {
|
if (buffer_id) {
|
||||||
Buffer& buffer = slot_buffers[buffer_id];
|
Buffer& buffer = slot_buffers[buffer_id];
|
||||||
if (buffer.IsInBounds(gpu_addr, size)) {
|
if (buffer.IsInBounds(gpu_addr, size)) {
|
||||||
|
SynchronizeBuffer(buffer, gpu_addr, size, false);
|
||||||
return {&buffer, buffer.Offset(gpu_addr)};
|
return {&buffer, buffer.Offset(gpu_addr)};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -552,8 +553,8 @@ void BufferCache::SynchronizeBuffer(Buffer& buffer, VAddr device_addr, u32 size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, u32 size) {
|
bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, u32 size) {
|
||||||
static constexpr FindFlags find_flags = FindFlags::NoCreate | FindFlags::RelaxDim |
|
static constexpr FindFlags find_flags =
|
||||||
FindFlags::RelaxFmt | FindFlags::RelaxSize;
|
FindFlags::NoCreate | FindFlags::RelaxDim | FindFlags::RelaxFmt | FindFlags::RelaxSize;
|
||||||
ImageInfo info{};
|
ImageInfo info{};
|
||||||
info.guest_address = device_addr;
|
info.guest_address = device_addr;
|
||||||
info.guest_size_bytes = size;
|
info.guest_size_bytes = size;
|
||||||
@ -562,6 +563,9 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Image& image = texture_cache.GetImage(image_id);
|
Image& image = texture_cache.GetImage(image_id);
|
||||||
|
if (image.info.guest_size_bytes > size) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
boost::container::small_vector<vk::BufferImageCopy, 8> copies;
|
boost::container::small_vector<vk::BufferImageCopy, 8> copies;
|
||||||
u32 offset = buffer.Offset(image.cpu_addr);
|
u32 offset = buffer.Offset(image.cpu_addr);
|
||||||
const u32 num_layers = image.info.resources.layers;
|
const u32 num_layers = image.info.resources.layers;
|
||||||
|
@ -40,20 +40,16 @@ TextureCache::~TextureCache() = default;
|
|||||||
void TextureCache::InvalidateMemory(VAddr address, size_t size) {
|
void TextureCache::InvalidateMemory(VAddr address, size_t size) {
|
||||||
std::scoped_lock lock{mutex};
|
std::scoped_lock lock{mutex};
|
||||||
ForEachImageInRegion(address, size, [&](ImageId image_id, Image& image) {
|
ForEachImageInRegion(address, size, [&](ImageId image_id, Image& image) {
|
||||||
const size_t image_dist =
|
|
||||||
image.cpu_addr > address ? image.cpu_addr - address : address - image.cpu_addr;
|
|
||||||
if (image_dist < MaxInvalidateDist) {
|
|
||||||
// Ensure image is reuploaded when accessed again.
|
// Ensure image is reuploaded when accessed again.
|
||||||
image.flags |= ImageFlagBits::CpuModified;
|
image.flags |= ImageFlagBits::CpuModified;
|
||||||
}
|
|
||||||
// Untrack image, so the range is unprotected and the guest can write freely.
|
// Untrack image, so the range is unprotected and the guest can write freely.
|
||||||
UntrackImage(image_id);
|
UntrackImage(image_id);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureCache::MarkWritten(VAddr address, size_t max_size) {
|
void TextureCache::MarkWritten(VAddr address, size_t max_size) {
|
||||||
static constexpr FindFlags find_flags = FindFlags::NoCreate | FindFlags::RelaxDim |
|
static constexpr FindFlags find_flags =
|
||||||
FindFlags::RelaxFmt | FindFlags::RelaxSize;
|
FindFlags::NoCreate | FindFlags::RelaxDim | FindFlags::RelaxFmt | FindFlags::RelaxSize;
|
||||||
ImageInfo info{};
|
ImageInfo info{};
|
||||||
info.guest_address = address;
|
info.guest_address = address;
|
||||||
info.guest_size_bytes = max_size;
|
info.guest_size_bytes = max_size;
|
||||||
@ -265,9 +261,6 @@ ImageView& TextureCache::RegisterImageView(ImageId image_id, const ImageViewInfo
|
|||||||
ImageView& TextureCache::FindTexture(const ImageInfo& info, const ImageViewInfo& view_info) {
|
ImageView& TextureCache::FindTexture(const ImageInfo& info, const ImageViewInfo& view_info) {
|
||||||
const ImageId image_id = FindImage(info);
|
const ImageId image_id = FindImage(info);
|
||||||
Image& image = slot_images[image_id];
|
Image& image = slot_images[image_id];
|
||||||
if (view_info.is_storage) {
|
|
||||||
image.flags |= ImageFlagBits::GpuModified;
|
|
||||||
}
|
|
||||||
UpdateImage(image_id);
|
UpdateImage(image_id);
|
||||||
auto& usage = image.info.usage;
|
auto& usage = image.info.usage;
|
||||||
|
|
||||||
@ -365,7 +358,6 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule
|
|||||||
if (False(image.flags & ImageFlagBits::CpuModified)) {
|
if (False(image.flags & ImageFlagBits::CpuModified)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark image as validated.
|
// Mark image as validated.
|
||||||
image.flags &= ~ImageFlagBits::CpuModified;
|
image.flags &= ~ImageFlagBits::CpuModified;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user