summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-04-16 10:11:35 -0400
committerGravatar Fernando Sahmkow2019-04-16 10:11:35 -0400
commit06d1c5a9912dac4f20e6f0d31839ef44d8a260f2 (patch)
tree60b313ec3cc9854320a9abeaeead37db14091009 /src
parentUse ReadBlockUnsafe for Shader Cache (diff)
downloadyuzu-06d1c5a9912dac4f20e6f0d31839ef44d8a260f2.tar.gz
yuzu-06d1c5a9912dac4f20e6f0d31839ef44d8a260f2.tar.xz
yuzu-06d1c5a9912dac4f20e6f0d31839ef44d8a260f2.zip
Document unsafe versions and add BlockCopyUnsafe
Diffstat (limited to 'src')
-rw-r--r--src/video_core/memory_manager.cpp18
-rw-r--r--src/video_core/memory_manager.h30
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp13
3 files changed, 45 insertions, 16 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp
index 20d744c61..18a8d2684 100644
--- a/src/video_core/memory_manager.cpp
+++ b/src/video_core/memory_manager.cpp
@@ -199,7 +199,7 @@ const u8* MemoryManager::GetPointer(GPUVAddr addr) const {
199 return {}; 199 return {};
200} 200}
201 201
202void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const { 202void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, const std::size_t size) const {
203 std::size_t remaining_size{size}; 203 std::size_t remaining_size{size};
204 std::size_t page_index{src_addr >> page_bits}; 204 std::size_t page_index{src_addr >> page_bits};
205 std::size_t page_offset{src_addr & page_mask}; 205 std::size_t page_offset{src_addr & page_mask};
@@ -226,7 +226,8 @@ void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t
226 } 226 }
227} 227}
228 228
229void MemoryManager::ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const { 229void MemoryManager::ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer,
230 const std::size_t size) const {
230 std::size_t remaining_size{size}; 231 std::size_t remaining_size{size};
231 std::size_t page_index{src_addr >> page_bits}; 232 std::size_t page_index{src_addr >> page_bits};
232 std::size_t page_offset{src_addr & page_mask}; 233 std::size_t page_offset{src_addr & page_mask};
@@ -243,7 +244,7 @@ void MemoryManager::ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, std::s
243 } 244 }
244} 245}
245 246
246void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { 247void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, const std::size_t size) {
247 std::size_t remaining_size{size}; 248 std::size_t remaining_size{size};
248 std::size_t page_index{dest_addr >> page_bits}; 249 std::size_t page_index{dest_addr >> page_bits};
249 std::size_t page_offset{dest_addr & page_mask}; 250 std::size_t page_offset{dest_addr & page_mask};
@@ -270,7 +271,8 @@ void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::
270 } 271 }
271} 272}
272 273
273void MemoryManager::WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { 274void MemoryManager::WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer,
275 const std::size_t size) {
274 std::size_t remaining_size{size}; 276 std::size_t remaining_size{size};
275 std::size_t page_index{dest_addr >> page_bits}; 277 std::size_t page_index{dest_addr >> page_bits};
276 std::size_t page_offset{dest_addr & page_mask}; 278 std::size_t page_offset{dest_addr & page_mask};
@@ -287,7 +289,7 @@ void MemoryManager::WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer,
287 } 289 }
288} 290}
289 291
290void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size) { 292void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, const std::size_t size) {
291 std::size_t remaining_size{size}; 293 std::size_t remaining_size{size};
292 std::size_t page_index{src_addr >> page_bits}; 294 std::size_t page_index{src_addr >> page_bits};
293 std::size_t page_offset{src_addr & page_mask}; 295 std::size_t page_offset{src_addr & page_mask};
@@ -315,6 +317,12 @@ void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t
315 } 317 }
316} 318}
317 319
320void MemoryManager::CopyBlockUnsafe(GPUVAddr dest_addr, GPUVAddr src_addr, const std::size_t size) {
321 std::vector<u8> tmp_buffer(size);
322 ReadBlockUnsafe(src_addr, tmp_buffer.data(), size);
323 WriteBlockUnsafe(dest_addr, tmp_buffer.data(), size);
324}
325
318void MemoryManager::MapPages(GPUVAddr base, u64 size, u8* memory, Common::PageType type, 326void MemoryManager::MapPages(GPUVAddr base, u64 size, u8* memory, Common::PageType type,
319 VAddr backing_addr) { 327 VAddr backing_addr) {
320 LOG_DEBUG(HW_GPU, "Mapping {} onto {:016X}-{:016X}", fmt::ptr(memory), base * page_size, 328 LOG_DEBUG(HW_GPU, "Mapping {} onto {:016X}-{:016X}", fmt::ptr(memory), base * page_size,
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h
index 29f3860c1..084d834c8 100644
--- a/src/video_core/memory_manager.h
+++ b/src/video_core/memory_manager.h
@@ -65,11 +65,31 @@ public:
65 u8* GetPointer(GPUVAddr addr); 65 u8* GetPointer(GPUVAddr addr);
66 const u8* GetPointer(GPUVAddr addr) const; 66 const u8* GetPointer(GPUVAddr addr) const;
67 67
68 void ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const; 68
69 void WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); 69 /*
70 void ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const; 70 * ReadBlock and WriteBlock are full read and write operations over virtual
71 void WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); 71 * GPU Memory. It's important to use these when GPU memory may not be continous
72 void CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size); 72 * in the Host Memory counterpart. Note: This functions cause Host GPU Memory
73 * Flushes and Invalidations, respectively to each operation.
74 */
75 void ReadBlock(GPUVAddr src_addr, void* dest_buffer, const std::size_t size) const;
76 void WriteBlock(GPUVAddr dest_addr, const void* src_buffer, const std::size_t size);
77 void CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, const std::size_t size);
78
79 /*
80 * ReadBlockUnsafe and WriteBlockUnsafe are special versions of ReadBlock and
81 * WriteBlock respectively. In this versions, no flushing or invalidation is actually
82 * done and their performance is similar to a memcpy. This functions can be used
83 * on either of this 2 scenarios instead of their safe counterpart:
84 * - Memory which is sure to never be represented in the Host GPU.
85 * - Memory Managed by a Cache Manager. Example: Texture Flushing should use
86 * WriteBlockUnsafe instead of WriteBlock since it shouldn't invalidate the texture
87 * being flushed.
88 */
89 void ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, const std::size_t size) const;
90 void WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, const std::size_t size);
91 void CopyBlockUnsafe(GPUVAddr dest_addr, GPUVAddr src_addr, const std::size_t size);
92
73 93
74private: 94private:
75 using VMAMap = std::map<GPUVAddr, VirtualMemoryArea>; 95 using VMAMap = std::map<GPUVAddr, VirtualMemoryArea>;
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 90598e291..43f2906a8 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -38,14 +38,15 @@ GPUVAddr GetShaderAddress(Maxwell::ShaderProgram program) {
38} 38}
39 39
40/// Gets the shader program code from memory for the specified address 40/// Gets the shader program code from memory for the specified address
41ProgramCode GetShaderCode(const GPUVAddr gpu_addr, const u8* host_ptr) { 41ProgramCode GetShaderCode(Tegra::MemoryManager& memory_manager, const GPUVAddr gpu_addr,
42 auto& memory_manager{Core::System::GetInstance().GPU().MemoryManager()}; 42 const u8* host_ptr) {
43 ProgramCode program_code(VideoCommon::Shader::MAX_PROGRAM_LENGTH); 43 ProgramCode program_code(VideoCommon::Shader::MAX_PROGRAM_LENGTH);
44 ASSERT_OR_EXECUTE(host_ptr != nullptr, { 44 ASSERT_OR_EXECUTE(host_ptr != nullptr, {
45 std::fill(program_code.begin(), program_code.end(), 0); 45 std::fill(program_code.begin(), program_code.end(), 0);
46 return program_code; 46 return program_code;
47 }); 47 });
48 memory_manager.ReadBlockUnsafe(gpu_addr, program_code.data(), program_code.size() * sizeof(u64)); 48 memory_manager.ReadBlockUnsafe(gpu_addr, program_code.data(),
49 program_code.size() * sizeof(u64));
49 return program_code; 50 return program_code;
50} 51}
51 52
@@ -498,12 +499,12 @@ Shader ShaderCacheOpenGL::GetStageProgram(Maxwell::ShaderProgram program) {
498 499
499 if (!shader) { 500 if (!shader) {
500 // No shader found - create a new one 501 // No shader found - create a new one
501 ProgramCode program_code{GetShaderCode(program_addr, host_ptr)}; 502 ProgramCode program_code{GetShaderCode(memory_manager, program_addr, host_ptr)};
502 ProgramCode program_code_b; 503 ProgramCode program_code_b;
503 if (program == Maxwell::ShaderProgram::VertexA) { 504 if (program == Maxwell::ShaderProgram::VertexA) {
504 const GPUVAddr program_addr_b{GetShaderAddress(Maxwell::ShaderProgram::VertexB)}; 505 const GPUVAddr program_addr_b{GetShaderAddress(Maxwell::ShaderProgram::VertexB)};
505 program_code_b = 506 program_code_b = GetShaderCode(memory_manager, program_addr_b,
506 GetShaderCode(program_addr_b, memory_manager.GetPointer(program_addr_b)); 507 memory_manager.GetPointer(program_addr_b));
507 } 508 }
508 const u64 unique_identifier = GetUniqueIdentifier(program, program_code, program_code_b); 509 const u64 unique_identifier = GetUniqueIdentifier(program, program_code, program_code_b);
509 const VAddr cpu_addr{*memory_manager.GpuToCpuAddress(program_addr)}; 510 const VAddr cpu_addr{*memory_manager.GpuToCpuAddress(program_addr)};