10 changed files with 185 additions and 30 deletions
-
1src/video_core/CMakeLists.txt
-
2src/video_core/engines/engine_upload.cpp
-
7src/video_core/engines/maxwell_3d.cpp
-
17src/video_core/engines/maxwell_dma.cpp
-
78src/video_core/invalidation_accumulator.h
-
62src/video_core/memory_manager.cpp
-
17src/video_core/memory_manager.h
-
7src/video_core/rasterizer_interface.h
-
23src/video_core/renderer_vulkan/vk_rasterizer.cpp
-
1src/video_core/renderer_vulkan/vk_rasterizer.h
@ -0,0 +1,78 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <vector> |
||||
|
|
||||
|
#include "common/common_types.h" |
||||
|
|
||||
|
namespace VideoCommon { |
||||
|
|
||||
|
class InvalidationAccumulator { |
||||
|
public: |
||||
|
InvalidationAccumulator() = default; |
||||
|
~InvalidationAccumulator() = default; |
||||
|
|
||||
|
void Add(GPUVAddr address, size_t size) { |
||||
|
const auto reset_values = [&]() { |
||||
|
if (has_collected) { |
||||
|
buffer.emplace_back(start_address, accumulated_size); |
||||
|
} |
||||
|
start_address = address; |
||||
|
accumulated_size = size; |
||||
|
last_collection = start_address + size; |
||||
|
}; |
||||
|
if (address >= start_address && address + size <= last_collection) [[likely]] { |
||||
|
return; |
||||
|
} |
||||
|
size = (address + size + atomicy_side_mask) & atomicy_mask - address; |
||||
|
address = address & atomicy_mask; |
||||
|
if (!has_collected) [[unlikely]] { |
||||
|
reset_values(); |
||||
|
has_collected = true; |
||||
|
return; |
||||
|
} |
||||
|
if (address != last_collection) [[unlikely]] { |
||||
|
reset_values(); |
||||
|
return; |
||||
|
} |
||||
|
accumulated_size += size; |
||||
|
last_collection += size; |
||||
|
} |
||||
|
|
||||
|
void Clear() { |
||||
|
buffer.clear(); |
||||
|
start_address = 0; |
||||
|
last_collection = 0; |
||||
|
has_collected = false; |
||||
|
} |
||||
|
|
||||
|
bool AnyAccumulated() const { |
||||
|
return has_collected; |
||||
|
} |
||||
|
|
||||
|
template <typename Func> |
||||
|
void Callback(Func&& func) { |
||||
|
if (!has_collected) { |
||||
|
return; |
||||
|
} |
||||
|
buffer.emplace_back(start_address, accumulated_size); |
||||
|
for (auto& [address, size] : buffer) { |
||||
|
func(address, size); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
static constexpr size_t atomicy_bits = 5; |
||||
|
static constexpr size_t atomicy_size = 1ULL << atomicy_bits; |
||||
|
static constexpr size_t atomicy_side_mask = atomicy_size - 1; |
||||
|
static constexpr size_t atomicy_mask = ~atomicy_side_mask; |
||||
|
GPUVAddr start_address{}; |
||||
|
GPUVAddr last_collection{}; |
||||
|
size_t accumulated_size{}; |
||||
|
bool has_collected{}; |
||||
|
std::vector<std::pair<VAddr, size_t>> buffer; |
||||
|
}; |
||||
|
|
||||
|
} // namespace VideoCommon |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue