1 // Copyright 2018 yuzu Emulator Project
2 // Licensed under GPLv2 or any later version
3 // Refer to the license.txt file included.
4 
5 #pragma once
6 
7 #include <array>
8 #include <memory>
9 
10 #include "common/common_types.h"
11 #include "video_core/buffer_cache/buffer_cache.h"
12 #include "video_core/engines/maxwell_3d.h"
13 #include "video_core/renderer_opengl/gl_resource_manager.h"
14 #include "video_core/renderer_opengl/gl_stream_buffer.h"
15 
16 namespace Core {
17 class System;
18 }
19 
20 namespace OpenGL {
21 
22 class Device;
23 class OGLStreamBuffer;
24 class RasterizerOpenGL;
25 
26 class Buffer : public VideoCommon::BufferBlock {
27 public:
28     explicit Buffer(const Device& device_, VAddr cpu_addr_, std::size_t size_);
29     ~Buffer();
30 
31     void Upload(std::size_t offset, std::size_t data_size, const u8* data);
32 
33     void Download(std::size_t offset, std::size_t data_size, u8* data);
34 
35     void CopyFrom(const Buffer& src, std::size_t src_offset, std::size_t dst_offset,
36                   std::size_t copy_size);
37 
Handle()38     GLuint Handle() const noexcept {
39         return gl_buffer.handle;
40     }
41 
Address()42     u64 Address() const noexcept {
43         return gpu_address;
44     }
45 
46 private:
47     OGLBuffer gl_buffer;
48     OGLBuffer read_buffer;
49     u64 gpu_address = 0;
50 };
51 
52 using GenericBufferCache = VideoCommon::BufferCache<Buffer, GLuint, OGLStreamBuffer>;
53 class OGLBufferCache final : public GenericBufferCache {
54 public:
55     explicit OGLBufferCache(VideoCore::RasterizerInterface& rasterizer_,
56                             Tegra::MemoryManager& gpu_memory_, Core::Memory::Memory& cpu_memory_,
57                             const Device& device_, std::size_t stream_size_);
58     ~OGLBufferCache();
59 
60     BufferInfo GetEmptyBuffer(std::size_t) override;
61 
Acquire()62     void Acquire() noexcept {
63         cbuf_cursor = 0;
64     }
65 
66 protected:
67     std::shared_ptr<Buffer> CreateBlock(VAddr cpu_addr, std::size_t size) override;
68 
69     BufferInfo ConstBufferUpload(const void* raw_pointer, std::size_t size) override;
70 
71 private:
72     static constexpr std::size_t NUM_CBUFS = Tegra::Engines::Maxwell3D::Regs::MaxConstBuffers *
73                                              Tegra::Engines::Maxwell3D::Regs::MaxShaderProgram;
74 
75     const Device& device;
76 
77     std::size_t cbuf_cursor = 0;
78     std::array<GLuint, NUM_CBUFS> cbufs{};
79 };
80 
81 } // namespace OpenGL
82