diff options
| author | 2019-04-16 10:11:35 -0400 | |
|---|---|---|
| committer | 2019-04-16 10:11:35 -0400 | |
| commit | 06d1c5a9912dac4f20e6f0d31839ef44d8a260f2 (patch) | |
| tree | 60b313ec3cc9854320a9abeaeead37db14091009 /src | |
| parent | Use ReadBlockUnsafe for Shader Cache (diff) | |
| download | yuzu-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.cpp | 18 | ||||
| -rw-r--r-- | src/video_core/memory_manager.h | 30 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 13 |
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 | ||
| 202 | void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const { | 202 | void 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 | ||
| 229 | void MemoryManager::ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const { | 229 | void 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 | ||
| 246 | void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { | 247 | void 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 | ||
| 273 | void MemoryManager::WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { | 274 | void 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 | ||
| 290 | void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size) { | 292 | void 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 | ||
| 320 | void 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 | |||
| 318 | void MemoryManager::MapPages(GPUVAddr base, u64 size, u8* memory, Common::PageType type, | 326 | void 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 | ||
| 74 | private: | 94 | private: |
| 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 |
| 41 | ProgramCode GetShaderCode(const GPUVAddr gpu_addr, const u8* host_ptr) { | 41 | ProgramCode 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)}; |