Skip to content

Commit eb95e33

Browse files
authored
Merge branch 'shadps4-emu:main' into Full-Blood-N
2 parents e8e4f95 + cd7268a commit eb95e33

File tree

6 files changed

+28
-31
lines changed

6 files changed

+28
-31
lines changed

src/video_core/buffer_cache/buffer_cache.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace VideoCore {
1717
static constexpr size_t NumVertexBuffers = 32;
1818
static constexpr size_t GdsBufferSize = 64_KB;
1919
static constexpr size_t StagingBufferSize = 1_GB;
20-
static constexpr size_t UboStreamBufferSize = 128_MB;
20+
static constexpr size_t UboStreamBufferSize = 64_MB;
2121

2222
BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_,
2323
const AmdGpu::Liverpool* liverpool_, TextureCache& texture_cache_,

src/video_core/renderer_vulkan/vk_compute_pipeline.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache,
199199
buffer_barriers.emplace_back(*barrier);
200200
}
201201
if (desc.is_written) {
202-
texture_cache.MarkWritten(address, size);
202+
texture_cache.InvalidateMemoryFromGPU(address, size);
203203
}
204204
}
205205
set_writes.push_back({

src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
431431
buffer_barriers.emplace_back(*barrier);
432432
}
433433
if (desc.is_written) {
434-
texture_cache.MarkWritten(address, size);
434+
texture_cache.InvalidateMemoryFromGPU(address, size);
435435
}
436436
}
437437
set_writes.push_back({

src/video_core/texture_cache/image.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55

66
#include "common/enum.h"
77
#include "common/types.h"
8-
#include "core/libraries/videoout/buffer.h"
9-
#include "video_core/amdgpu/liverpool.h"
10-
#include "video_core/amdgpu/resource.h"
118
#include "video_core/renderer_vulkan/vk_common.h"
129
#include "video_core/texture_cache/image_info.h"
1310
#include "video_core/texture_cache/image_view.h"
14-
#include "video_core/texture_cache/types.h"
1511

1612
#include <optional>
1713

@@ -26,7 +22,9 @@ VK_DEFINE_HANDLE(VmaAllocator)
2622
namespace VideoCore {
2723

2824
enum ImageFlagBits : u32 {
29-
CpuModified = 1 << 2, ///< Contents have been modified from the CPU
25+
CpuDirty = 1 << 1, ///< Contents have been modified from the CPU
26+
GpuDirty = 1 << 2, ///< Contents have been modified from the GPU (valid data in buffer cache)
27+
Dirty = CpuDirty | GpuDirty,
3028
GpuModified = 1 << 3, ///< Contents have been modified from the GPU
3129
Tracked = 1 << 4, ///< Writes and reads are being hooked from the CPU
3230
Registered = 1 << 6, ///< True when the image is registered
@@ -108,7 +106,7 @@ struct Image {
108106
ImageInfo info;
109107
UniqueImage image;
110108
vk::ImageAspectFlags aspect_mask = vk::ImageAspectFlagBits::eColor;
111-
ImageFlagBits flags = ImageFlagBits::CpuModified;
109+
ImageFlagBits flags = ImageFlagBits::Dirty;
112110
VAddr cpu_addr = 0;
113111
VAddr cpu_addr_end = 0;
114112
std::vector<ImageViewInfo> image_view_infos;

src/video_core/texture_cache/texture_cache.cpp

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,24 +47,23 @@ void TextureCache::InvalidateMemory(VAddr address, size_t size) {
4747
std::scoped_lock lock{mutex};
4848
ForEachImageInRegion(address, size, [&](ImageId image_id, Image& image) {
4949
// Ensure image is reuploaded when accessed again.
50-
image.flags |= ImageFlagBits::CpuModified;
50+
image.flags |= ImageFlagBits::CpuDirty;
5151
// Untrack image, so the range is unprotected and the guest can write freely.
5252
UntrackImage(image_id);
5353
});
5454
}
5555

56-
void TextureCache::MarkWritten(VAddr address, size_t max_size) {
57-
static constexpr FindFlags find_flags =
58-
FindFlags::NoCreate | FindFlags::RelaxDim | FindFlags::RelaxFmt | FindFlags::RelaxSize;
59-
ImageInfo info{};
60-
info.guest_address = address;
61-
info.guest_size_bytes = max_size;
62-
const ImageId image_id = FindImage(info, find_flags);
63-
if (!image_id) {
64-
return;
65-
}
66-
// Ensure image is copied when accessed again.
67-
slot_images[image_id].flags |= ImageFlagBits::CpuModified;
56+
void TextureCache::InvalidateMemoryFromGPU(VAddr address, size_t max_size) {
57+
std::scoped_lock lock{mutex};
58+
ForEachImageInRegion(address, max_size, [&](ImageId image_id, Image& image) {
59+
// Only consider images that match base address.
60+
// TODO: Maybe also consider subresources
61+
if (image.info.guest_address != address) {
62+
return;
63+
}
64+
// Ensure image is reuploaded when accessed again.
65+
image.flags |= ImageFlagBits::GpuDirty;
66+
});
6867
}
6968

7069
void TextureCache::UnmapMemory(VAddr cpu_addr, size_t size) {
@@ -189,7 +188,7 @@ ImageId TextureCache::ExpandImage(const ImageInfo& info, ImageId image_id) {
189188
FreeImage(image_id);
190189

191190
TrackImage(new_image_id);
192-
new_image.flags &= ~ImageFlagBits::CpuModified;
191+
new_image.flags &= ~ImageFlagBits::Dirty;
193192
return new_image_id;
194193
}
195194

@@ -325,7 +324,7 @@ ImageView& TextureCache::FindDepthTarget(const ImageInfo& image_info,
325324
const ImageId image_id = FindImage(image_info);
326325
Image& image = slot_images[image_id];
327326
image.flags |= ImageFlagBits::GpuModified;
328-
image.flags &= ~ImageFlagBits::CpuModified;
327+
image.flags &= ~ImageFlagBits::Dirty;
329328
image.aspect_mask = vk::ImageAspectFlagBits::eDepth;
330329

331330
const bool has_stencil = image_info.usage.stencil;
@@ -362,11 +361,9 @@ ImageView& TextureCache::FindDepthTarget(const ImageInfo& image_info,
362361
}
363362

364363
void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_scheduler /*= nullptr*/) {
365-
if (False(image.flags & ImageFlagBits::CpuModified)) {
364+
if (False(image.flags & ImageFlagBits::Dirty)) {
366365
return;
367366
}
368-
// Mark image as validated.
369-
image.flags &= ~ImageFlagBits::CpuModified;
370367

371368
const auto& num_layers = image.info.resources.layers;
372369
const auto& num_mips = image.info.resources.levels;
@@ -380,9 +377,10 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule
380377
image.info.props.is_volume ? std::max(image.info.size.depth >> m, 1u) : 1u;
381378
const auto& [mip_size, mip_pitch, mip_height, mip_ofs] = image.info.mips_layout[m];
382379

383-
// Protect GPU modified resources from accidental reuploads.
384-
if (True(image.flags & ImageFlagBits::GpuModified) &&
385-
!buffer_cache.IsRegionGpuModified(image.info.guest_address + mip_ofs, mip_size)) {
380+
// Protect GPU modified resources from accidental CPU reuploads.
381+
const bool is_gpu_modified = True(image.flags & ImageFlagBits::GpuModified);
382+
const bool is_gpu_dirty = True(image.flags & ImageFlagBits::GpuDirty);
383+
if (is_gpu_modified && !is_gpu_dirty) {
386384
const u8* addr = std::bit_cast<u8*>(image.info.guest_address);
387385
const u64 hash = XXH3_64bits(addr + mip_ofs, mip_size);
388386
if (image.mip_hashes[m] == hash) {
@@ -438,6 +436,7 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule
438436
}
439437

440438
cmdbuf.copyBufferToImage(buffer, image.image, vk::ImageLayout::eTransferDstOptimal, image_copy);
439+
image.flags &= ~ImageFlagBits::Dirty;
441440
}
442441

443442
vk::Sampler TextureCache::GetSampler(const AmdGpu::Sampler& sampler) {

src/video_core/texture_cache/texture_cache.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class TextureCache {
5151
void InvalidateMemory(VAddr address, size_t size);
5252

5353
/// Marks an image as dirty if it exists at the provided address.
54-
void MarkWritten(VAddr address, size_t max_size);
54+
void InvalidateMemoryFromGPU(VAddr address, size_t max_size);
5555

5656
/// Evicts any images that overlap the unmapped range.
5757
void UnmapMemory(VAddr cpu_addr, size_t size);

0 commit comments

Comments
 (0)