diff options
| author | 2022-03-27 05:05:57 +0200 | |
|---|---|---|
| committer | 2023-03-05 12:18:00 +0100 | |
| commit | 8a3411b417f76db786b1d3cfffbd90926abb20ca (patch) | |
| tree | 383070bd0d4a33189f38423ceea9a5692d38ba09 /src/video_core/buffer_cache | |
| parent | Merge pull request #9884 from liamwhite/service-cleanup (diff) | |
| download | yuzu-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.h | 53 |
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; | |||
| 55 | constexpr u32 NUM_TEXTURE_BUFFERS = 16; | 55 | constexpr u32 NUM_TEXTURE_BUFFERS = 16; |
| 56 | constexpr u32 NUM_STAGES = 5; | 56 | constexpr u32 NUM_STAGES = 5; |
| 57 | 57 | ||
| 58 | enum class ObtainBufferSynchronize : u32 { | ||
| 59 | NoSynchronize = 0, | ||
| 60 | FullSynchronize = 1, | ||
| 61 | SynchronizeNoDirty = 2, | ||
| 62 | }; | ||
| 63 | |||
| 64 | enum class ObtainBufferOperation : u32 { | ||
| 65 | DoNothing = 0, | ||
| 66 | MarkAsWritten = 1, | ||
| 67 | DiscardWrite = 2, | ||
| 68 | MarkQuery = 3, | ||
| 69 | }; | ||
| 70 | |||
| 58 | using UniformBufferSizes = std::array<std::array<u32, NUM_GRAPHICS_UNIFORM_BUFFERS>, NUM_STAGES>; | 71 | using UniformBufferSizes = std::array<std::array<u32, NUM_GRAPHICS_UNIFORM_BUFFERS>, NUM_STAGES>; |
| 59 | using ComputeUniformBufferSizes = std::array<u32, NUM_COMPUTE_UNIFORM_BUFFERS>; | 72 | using 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 | ||
| 644 | template <class P> | 661 | template <class P> |
| 662 | std::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 | |||
| 697 | template <class P> | ||
| 645 | void BufferCache<P>::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, | 698 | void 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); |