Merge pull request #603 from Subv/nvmap_free
GPU: Remove unmapped surfaces from the rasterizer cache and fix our nvmap::Free behavior.
This commit is contained in:
		| @@ -8,6 +8,8 @@ | ||||
| #include "core/core.h" | ||||
| #include "core/hle/service/nvdrv/devices/nvhost_as_gpu.h" | ||||
| #include "core/hle/service/nvdrv/devices/nvmap.h" | ||||
| #include "video_core/renderer_base.h" | ||||
| #include "video_core/video_core.h" | ||||
|  | ||||
| namespace Service::Nvidia::Devices { | ||||
|  | ||||
| @@ -154,6 +156,9 @@ u32 nvhost_as_gpu::UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& ou | ||||
|  | ||||
|     ASSERT_MSG(itr != buffer_mappings.end(), "Tried to unmap invalid mapping"); | ||||
|  | ||||
|     // Remove this memory region from the rasterizer cache. | ||||
|     VideoCore::g_renderer->Rasterizer()->FlushAndInvalidateRegion(params.offset, itr->second.size); | ||||
|  | ||||
|     params.offset = gpu.memory_manager->UnmapBuffer(params.offset, itr->second.size); | ||||
|  | ||||
|     buffer_mappings.erase(itr->second.offset); | ||||
|   | ||||
| @@ -148,6 +148,7 @@ u32 nvmap::IocParam(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
| } | ||||
|  | ||||
| u32 nvmap::IocFree(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     // TODO(Subv): These flags are unconfirmed. | ||||
|     enum FreeFlags { | ||||
|         Freed = 0, | ||||
|         NotFreedYet = 1, | ||||
| @@ -161,15 +162,21 @@ u32 nvmap::IocFree(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     auto itr = handles.find(params.handle); | ||||
|     ASSERT(itr != handles.end()); | ||||
|  | ||||
|     ASSERT(itr->second->refcount > 0); | ||||
|  | ||||
|     itr->second->refcount--; | ||||
|  | ||||
|     params.refcount = itr->second->refcount; | ||||
|     params.size = itr->second->size; | ||||
|  | ||||
|     if (itr->second->refcount == 0) | ||||
|     if (itr->second->refcount == 0) { | ||||
|         params.flags = Freed; | ||||
|     else | ||||
|         // The address of the nvmap is written to the output if we're finally freeing it, otherwise | ||||
|         // 0 is written. | ||||
|         params.address = itr->second->addr; | ||||
|     } else { | ||||
|         params.flags = NotFreedYet; | ||||
|         params.address = 0; | ||||
|     } | ||||
|  | ||||
|     handles.erase(params.handle); | ||||
|  | ||||
|   | ||||
| @@ -94,7 +94,7 @@ private: | ||||
|     struct IocFreeParams { | ||||
|         u32_le handle; | ||||
|         INSERT_PADDING_BYTES(4); | ||||
|         u64_le refcount; | ||||
|         u64_le address; | ||||
|         u32_le size; | ||||
|         u32_le flags; | ||||
|     }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Sebastian Valle
					Sebastian Valle