diff options
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 10 | ||||
| -rw-r--r-- | src/video_core/memory_manager.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/memory_manager.h | 4 |
3 files changed, 12 insertions, 4 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 6eb672475..2e616cee4 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -1316,12 +1316,16 @@ void BufferCache<P>::UpdateVertexBuffer(u32 index) { | |||
| 1316 | const GPUVAddr gpu_addr_begin = array.StartAddress(); | 1316 | const GPUVAddr gpu_addr_begin = array.StartAddress(); |
| 1317 | const GPUVAddr gpu_addr_end = limit.LimitAddress() + 1; | 1317 | const GPUVAddr gpu_addr_end = limit.LimitAddress() + 1; |
| 1318 | const std::optional<VAddr> cpu_addr = gpu_memory->GpuToCpuAddress(gpu_addr_begin); | 1318 | const std::optional<VAddr> cpu_addr = gpu_memory->GpuToCpuAddress(gpu_addr_begin); |
| 1319 | const u32 address_size = static_cast<u32>(gpu_addr_end - gpu_addr_begin); | 1319 | u32 address_size = static_cast<u32>( |
| 1320 | const u32 size = address_size; // TODO: Analyze stride and number of vertices | 1320 | std::min(gpu_addr_end - gpu_addr_begin, static_cast<u64>(std::numeric_limits<u32>::max()))); |
| 1321 | if (array.enable == 0 || size == 0 || !cpu_addr) { | 1321 | if (array.enable == 0 || address_size == 0 || !cpu_addr) { |
| 1322 | vertex_buffers[index] = NULL_BINDING; | 1322 | vertex_buffers[index] = NULL_BINDING; |
| 1323 | return; | 1323 | return; |
| 1324 | } | 1324 | } |
| 1325 | if (!gpu_memory->IsWithinGPUAddressRange(gpu_addr_end)) { | ||
| 1326 | address_size = gpu_memory->MaxContinousRange(gpu_addr_begin, address_size); | ||
| 1327 | } | ||
| 1328 | const u32 size = address_size; // TODO: Analyze stride and number of vertices | ||
| 1325 | vertex_buffers[index] = Binding{ | 1329 | vertex_buffers[index] = Binding{ |
| 1326 | .cpu_addr = *cpu_addr, | 1330 | .cpu_addr = *cpu_addr, |
| 1327 | .size = size, | 1331 | .size = size, |
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 4a692448e..3cb2d9224 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -193,7 +193,7 @@ void MemoryManager::Unmap(GPUVAddr gpu_addr, std::size_t size) { | |||
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | std::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr gpu_addr) const { | 195 | std::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr gpu_addr) const { |
| 196 | if (gpu_addr >= address_space_size) [[unlikely]] { | 196 | if (!IsWithinGPUAddressRange(gpu_addr)) [[unlikely]] { |
| 197 | return std::nullopt; | 197 | return std::nullopt; |
| 198 | } | 198 | } |
| 199 | if (GetEntry<true>(gpu_addr) != EntryType::Mapped) [[unlikely]] { | 199 | if (GetEntry<true>(gpu_addr) != EntryType::Mapped) [[unlikely]] { |
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index 9c08edc20..ae4fd98df 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h | |||
| @@ -110,6 +110,10 @@ public: | |||
| 110 | 110 | ||
| 111 | size_t MaxContinousRange(GPUVAddr gpu_addr, size_t size) const; | 111 | size_t MaxContinousRange(GPUVAddr gpu_addr, size_t size) const; |
| 112 | 112 | ||
| 113 | bool IsWithinGPUAddressRange(GPUVAddr gpu_addr) const { | ||
| 114 | return gpu_addr < address_space_size; | ||
| 115 | } | ||
| 116 | |||
| 113 | private: | 117 | private: |
| 114 | template <bool is_big_pages, typename FuncMapped, typename FuncReserved, typename FuncUnmapped> | 118 | template <bool is_big_pages, typename FuncMapped, typename FuncReserved, typename FuncUnmapped> |
| 115 | inline void MemoryOperation(GPUVAddr gpu_src_addr, std::size_t size, FuncMapped&& func_mapped, | 119 | inline void MemoryOperation(GPUVAddr gpu_src_addr, std::size_t size, FuncMapped&& func_mapped, |