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