summaryrefslogtreecommitdiff
path: root/src/video_core/buffer_cache
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2022-03-27 05:05:57 +0200
committerGravatar Fernando Sahmkow2023-03-05 12:18:00 +0100
commit8a3411b417f76db786b1d3cfffbd90926abb20ca (patch)
tree383070bd0d4a33189f38423ceea9a5692d38ba09 /src/video_core/buffer_cache
parentMerge pull request #9884 from liamwhite/service-cleanup (diff)
downloadyuzu-8a3411b417f76db786b1d3cfffbd90926abb20ca.tar.gz
yuzu-8a3411b417f76db786b1d3cfffbd90926abb20ca.tar.xz
yuzu-8a3411b417f76db786b1d3cfffbd90926abb20ca.zip
Engines: Implement Accelerate DMA Texture.
Diffstat (limited to 'src/video_core/buffer_cache')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 06fd40851..2a150ccdc 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -55,6 +55,19 @@ constexpr u32 NUM_STORAGE_BUFFERS = 16;
55constexpr u32 NUM_TEXTURE_BUFFERS = 16; 55constexpr u32 NUM_TEXTURE_BUFFERS = 16;
56constexpr u32 NUM_STAGES = 5; 56constexpr u32 NUM_STAGES = 5;
57 57
58enum class ObtainBufferSynchronize : u32 {
59 NoSynchronize = 0,
60 FullSynchronize = 1,
61 SynchronizeNoDirty = 2,
62};
63
64enum class ObtainBufferOperation : u32 {
65 DoNothing = 0,
66 MarkAsWritten = 1,
67 DiscardWrite = 2,
68 MarkQuery = 3,
69};
70
58using UniformBufferSizes = std::array<std::array<u32, NUM_GRAPHICS_UNIFORM_BUFFERS>, NUM_STAGES>; 71using UniformBufferSizes = std::array<std::array<u32, NUM_GRAPHICS_UNIFORM_BUFFERS>, NUM_STAGES>;
59using ComputeUniformBufferSizes = std::array<u32, NUM_COMPUTE_UNIFORM_BUFFERS>; 72using ComputeUniformBufferSizes = std::array<u32, NUM_COMPUTE_UNIFORM_BUFFERS>;
60 73
@@ -191,6 +204,10 @@ public:
191 204
192 bool DMAClear(GPUVAddr src_address, u64 amount, u32 value); 205 bool DMAClear(GPUVAddr src_address, u64 amount, u32 value);
193 206
207 [[nodiscard]] std::pair<Buffer*, u32> ObtainBuffer(GPUVAddr gpu_addr, u32 size,
208 ObtainBufferSynchronize sync_info,
209 ObtainBufferOperation post_op);
210
194 /// Return true when a CPU region is modified from the GPU 211 /// Return true when a CPU region is modified from the GPU
195 [[nodiscard]] bool IsRegionGpuModified(VAddr addr, size_t size); 212 [[nodiscard]] bool IsRegionGpuModified(VAddr addr, size_t size);
196 213
@@ -642,6 +659,42 @@ bool BufferCache<P>::DMAClear(GPUVAddr dst_address, u64 amount, u32 value) {
642} 659}
643 660
644template <class P> 661template <class P>
662std::pair<typename P::Buffer*, u32> BufferCache<P>::ObtainBuffer(GPUVAddr gpu_addr, u32 size,
663 ObtainBufferSynchronize sync_info,
664 ObtainBufferOperation post_op) {
665 const std::optional<VAddr> cpu_addr = gpu_memory->GpuToCpuAddress(gpu_addr);
666 if (!cpu_addr) {
667 return {&slot_buffers[NULL_BUFFER_ID], 0};
668 }
669 const BufferId buffer_id = FindBuffer(*cpu_addr, size);
670 Buffer& buffer = slot_buffers[buffer_id];
671
672 // synchronize op
673 switch (sync_info) {
674 case ObtainBufferSynchronize::FullSynchronize:
675 SynchronizeBuffer(buffer, *cpu_addr, size);
676 break;
677 default:
678 break;
679 }
680
681 switch (post_op) {
682 case ObtainBufferOperation::MarkAsWritten:
683 MarkWrittenBuffer(buffer_id, *cpu_addr, size);
684 break;
685 case ObtainBufferOperation::DiscardWrite: {
686 IntervalType interval{*cpu_addr, size};
687 ClearDownload(interval);
688 break;
689 }
690 default:
691 break;
692 }
693
694 return {&buffer, buffer.Offset(*cpu_addr)};
695}
696
697template <class P>
645void BufferCache<P>::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, 698void BufferCache<P>::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr,
646 u32 size) { 699 u32 size) {
647 const std::optional<VAddr> cpu_addr = gpu_memory->GpuToCpuAddress(gpu_addr); 700 const std::optional<VAddr> cpu_addr = gpu_memory->GpuToCpuAddress(gpu_addr);