summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar Lioncash2018-08-28 10:57:56 -0400
committerGravatar Lioncash2018-08-28 11:11:50 -0400
commit45fb74d2623182b38af422bc6c8a51040860143f (patch)
treead65e21b3984d876241fc478d7624abfceb55e86 /src/video_core
parentMerge pull request #1165 from bunnei/shader-cache (diff)
downloadyuzu-45fb74d2623182b38af422bc6c8a51040860143f.tar.gz
yuzu-45fb74d2623182b38af422bc6c8a51040860143f.tar.xz
yuzu-45fb74d2623182b38af422bc6c8a51040860143f.zip
gpu: Make memory_manager private
Makes the class interface consistent and provides accessors for obtaining a reference to the memory manager instance. Given we also return references, this makes our more flimsy uses of const apparent, given const doesn't propagate through pointers in the way one would typically expect. This makes our mutable state more apparent in some places.
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/gpu.cpp14
-rw-r--r--src/video_core/gpu.h12
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp16
4 files changed, 30 insertions, 16 deletions
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp
index 9758adcfd..e6d8e65c6 100644
--- a/src/video_core/gpu.cpp
+++ b/src/video_core/gpu.cpp
@@ -22,7 +22,7 @@ u32 FramebufferConfig::BytesPerPixel(PixelFormat format) {
22} 22}
23 23
24GPU::GPU(VideoCore::RasterizerInterface& rasterizer) { 24GPU::GPU(VideoCore::RasterizerInterface& rasterizer) {
25 memory_manager = std::make_unique<MemoryManager>(); 25 memory_manager = std::make_unique<Tegra::MemoryManager>();
26 maxwell_3d = std::make_unique<Engines::Maxwell3D>(rasterizer, *memory_manager); 26 maxwell_3d = std::make_unique<Engines::Maxwell3D>(rasterizer, *memory_manager);
27 fermi_2d = std::make_unique<Engines::Fermi2D>(*memory_manager); 27 fermi_2d = std::make_unique<Engines::Fermi2D>(*memory_manager);
28 maxwell_compute = std::make_unique<Engines::MaxwellCompute>(); 28 maxwell_compute = std::make_unique<Engines::MaxwellCompute>();
@@ -31,14 +31,22 @@ GPU::GPU(VideoCore::RasterizerInterface& rasterizer) {
31 31
32GPU::~GPU() = default; 32GPU::~GPU() = default;
33 33
34const Engines::Maxwell3D& GPU::Maxwell3D() const { 34Engines::Maxwell3D& GPU::Maxwell3D() {
35 return *maxwell_3d; 35 return *maxwell_3d;
36} 36}
37 37
38Engines::Maxwell3D& GPU::Maxwell3D() { 38const Engines::Maxwell3D& GPU::Maxwell3D() const {
39 return *maxwell_3d; 39 return *maxwell_3d;
40} 40}
41 41
42MemoryManager& GPU::MemoryManager() {
43 return *memory_manager;
44}
45
46const MemoryManager& GPU::MemoryManager() const {
47 return *memory_manager;
48}
49
42u32 RenderTargetBytesPerPixel(RenderTargetFormat format) { 50u32 RenderTargetBytesPerPixel(RenderTargetFormat format) {
43 ASSERT(format != RenderTargetFormat::NONE); 51 ASSERT(format != RenderTargetFormat::NONE);
44 52
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h
index 2697e1c27..2c3dbd97b 100644
--- a/src/video_core/gpu.h
+++ b/src/video_core/gpu.h
@@ -117,18 +117,24 @@ public:
117 /// Processes a command list stored at the specified address in GPU memory. 117 /// Processes a command list stored at the specified address in GPU memory.
118 void ProcessCommandList(GPUVAddr address, u32 size); 118 void ProcessCommandList(GPUVAddr address, u32 size);
119 119
120 /// Returns a reference to the Maxwell3D GPU engine.
121 Engines::Maxwell3D& Maxwell3D();
122
120 /// Returns a const reference to the Maxwell3D GPU engine. 123 /// Returns a const reference to the Maxwell3D GPU engine.
121 const Engines::Maxwell3D& Maxwell3D() const; 124 const Engines::Maxwell3D& Maxwell3D() const;
122 125
123 /// Returns a reference to the Maxwell3D GPU engine. 126 /// Returns a reference to the GPU memory manager.
124 Engines::Maxwell3D& Maxwell3D(); 127 Tegra::MemoryManager& MemoryManager();
125 128
126 std::unique_ptr<MemoryManager> memory_manager; 129 /// Returns a const reference to the GPU memory manager.
130 const Tegra::MemoryManager& MemoryManager() const;
127 131
128private: 132private:
129 /// Writes a single register in the engine bound to the specified subchannel 133 /// Writes a single register in the engine bound to the specified subchannel
130 void WriteReg(u32 method, u32 subchannel, u32 value, u32 remaining_params); 134 void WriteReg(u32 method, u32 subchannel, u32 value, u32 remaining_params);
131 135
136 std::unique_ptr<Tegra::MemoryManager> memory_manager;
137
132 /// Mapping of command subchannels to their bound engine ids. 138 /// Mapping of command subchannels to their bound engine ids.
133 std::unordered_map<u32, EngineID> bound_engines; 139 std::unordered_map<u32, EngineID> bound_engines;
134 140
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 9951d8178..fddfb2d83 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -425,8 +425,8 @@ std::tuple<u8*, GLintptr, GLintptr> RasterizerOpenGL::UploadMemory(u8* buffer_pt
425 std::tie(buffer_ptr, buffer_offset) = AlignBuffer(buffer_ptr, buffer_offset, alignment); 425 std::tie(buffer_ptr, buffer_offset) = AlignBuffer(buffer_ptr, buffer_offset, alignment);
426 GLintptr uploaded_offset = buffer_offset; 426 GLintptr uploaded_offset = buffer_offset;
427 427
428 const auto& memory_manager = Core::System::GetInstance().GPU().memory_manager; 428 auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager();
429 const boost::optional<VAddr> cpu_addr{memory_manager->GpuToCpuAddress(gpu_addr)}; 429 const boost::optional<VAddr> cpu_addr{memory_manager.GpuToCpuAddress(gpu_addr)};
430 Memory::ReadBlock(*cpu_addr, buffer_ptr, size); 430 Memory::ReadBlock(*cpu_addr, buffer_ptr, size);
431 431
432 buffer_ptr += size; 432 buffer_ptr += size;
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index 65305000c..d87f90a62 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -168,8 +168,8 @@ static const FormatTuple& GetFormatTuple(PixelFormat pixel_format, ComponentType
168} 168}
169 169
170VAddr SurfaceParams::GetCpuAddr() const { 170VAddr SurfaceParams::GetCpuAddr() const {
171 const auto& gpu = Core::System::GetInstance().GPU(); 171 auto& gpu = Core::System::GetInstance().GPU();
172 return *gpu.memory_manager->GpuToCpuAddress(addr); 172 return *gpu.MemoryManager().GpuToCpuAddress(addr);
173} 173}
174 174
175static bool IsPixelFormatASTC(PixelFormat format) { 175static bool IsPixelFormatASTC(PixelFormat format) {
@@ -220,14 +220,14 @@ void MortonCopy(u32 stride, u32 block_height, u32 height, std::vector<u8>& gl_bu
220 Tegra::GPUVAddr addr) { 220 Tegra::GPUVAddr addr) {
221 constexpr u32 bytes_per_pixel = SurfaceParams::GetFormatBpp(format) / CHAR_BIT; 221 constexpr u32 bytes_per_pixel = SurfaceParams::GetFormatBpp(format) / CHAR_BIT;
222 constexpr u32 gl_bytes_per_pixel = CachedSurface::GetGLBytesPerPixel(format); 222 constexpr u32 gl_bytes_per_pixel = CachedSurface::GetGLBytesPerPixel(format);
223 const auto& gpu = Core::System::GetInstance().GPU(); 223 auto& gpu = Core::System::GetInstance().GPU();
224 224
225 if (morton_to_gl) { 225 if (morton_to_gl) {
226 // With the BCn formats (DXT and DXN), each 4x4 tile is swizzled instead of just individual 226 // With the BCn formats (DXT and DXN), each 4x4 tile is swizzled instead of just individual
227 // pixel values. 227 // pixel values.
228 const u32 tile_size{IsFormatBCn(format) ? 4U : 1U}; 228 const u32 tile_size{IsFormatBCn(format) ? 4U : 1U};
229 const std::vector<u8> data = 229 const std::vector<u8> data =
230 Tegra::Texture::UnswizzleTexture(*gpu.memory_manager->GpuToCpuAddress(addr), tile_size, 230 Tegra::Texture::UnswizzleTexture(*gpu.MemoryManager().GpuToCpuAddress(addr), tile_size,
231 bytes_per_pixel, stride, height, block_height); 231 bytes_per_pixel, stride, height, block_height);
232 const size_t size_to_copy{std::min(gl_buffer.size(), data.size())}; 232 const size_t size_to_copy{std::min(gl_buffer.size(), data.size())};
233 gl_buffer.assign(data.begin(), data.begin() + size_to_copy); 233 gl_buffer.assign(data.begin(), data.begin() + size_to_copy);
@@ -237,7 +237,7 @@ void MortonCopy(u32 stride, u32 block_height, u32 height, std::vector<u8>& gl_bu
237 LOG_WARNING(Render_OpenGL, "need to use correct swizzle/GOB parameters!"); 237 LOG_WARNING(Render_OpenGL, "need to use correct swizzle/GOB parameters!");
238 VideoCore::MortonCopyPixels128( 238 VideoCore::MortonCopyPixels128(
239 stride, height, bytes_per_pixel, gl_bytes_per_pixel, 239 stride, height, bytes_per_pixel, gl_bytes_per_pixel,
240 Memory::GetPointer(*gpu.memory_manager->GpuToCpuAddress(addr)), gl_buffer.data(), 240 Memory::GetPointer(*gpu.MemoryManager().GpuToCpuAddress(addr)), gl_buffer.data(),
241 morton_to_gl); 241 morton_to_gl);
242 } 242 }
243} 243}
@@ -754,9 +754,9 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool pres
754 return {}; 754 return {};
755 } 755 }
756 756
757 const auto& gpu = Core::System::GetInstance().GPU(); 757 auto& gpu = Core::System::GetInstance().GPU();
758 // Don't try to create any entries in the cache if the address of the texture is invalid. 758 // Don't try to create any entries in the cache if the address of the texture is invalid.
759 if (gpu.memory_manager->GpuToCpuAddress(params.addr) == boost::none) 759 if (gpu.MemoryManager().GpuToCpuAddress(params.addr) == boost::none)
760 return {}; 760 return {};
761 761
762 // Look up surface in the cache based on address 762 // Look up surface in the cache based on address
@@ -848,7 +848,7 @@ Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& surface,
848 "reinterpretation but the texture is tiled."); 848 "reinterpretation but the texture is tiled.");
849 } 849 }
850 size_t remaining_size = new_params.SizeInBytes() - params.SizeInBytes(); 850 size_t remaining_size = new_params.SizeInBytes() - params.SizeInBytes();
851 auto address = Core::System::GetInstance().GPU().memory_manager->GpuToCpuAddress( 851 auto address = Core::System::GetInstance().GPU().MemoryManager().GpuToCpuAddress(
852 new_params.addr + params.SizeInBytes()); 852 new_params.addr + params.SizeInBytes());
853 std::vector<u8> data(remaining_size); 853 std::vector<u8> data(remaining_size);
854 Memory::ReadBlock(*address, data.data(), data.size()); 854 Memory::ReadBlock(*address, data.data(), data.size());