mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-10 03:18:55 +02:00
[vulkan] Adjusted synchronization handling in QueryCacheRuntime + ConditionalRendering setting bug with syncing
This commit is contained in:
parent
74248bd35a
commit
2dbca791f6
1 changed files with 66 additions and 11 deletions
|
|
@ -203,6 +203,11 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyncWrites() override {
|
void SyncWrites() override {
|
||||||
|
if (!direct_sync_values.empty()) {
|
||||||
|
runtime.template SyncValues<VideoCommon::SyncValuesStruct>(direct_sync_values);
|
||||||
|
direct_sync_values.clear();
|
||||||
|
}
|
||||||
|
|
||||||
if (sync_values_stash.empty()) {
|
if (sync_values_stash.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -223,8 +228,54 @@ public:
|
||||||
const auto driver_id = device.GetDriverID();
|
const auto driver_id = device.GetDriverID();
|
||||||
if (driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY ||
|
if (driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY ||
|
||||||
driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) {
|
driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) {
|
||||||
pending_sync.clear();
|
ApplyBanksWideOp<false>(
|
||||||
|
pending_sync,
|
||||||
|
[](SamplesQueryBank* bank, size_t start, size_t amount) { bank->Sync(start, amount); });
|
||||||
|
|
||||||
|
direct_sync_values.clear();
|
||||||
|
direct_sync_values.reserve(pending_sync.size());
|
||||||
|
|
||||||
|
bool has_multi_queries = accumulation_since_last_sync;
|
||||||
|
for (auto q : pending_sync) {
|
||||||
|
auto* query = GetQuery(q);
|
||||||
|
if (True(query->flags & VideoCommon::QueryFlagBits::IsRewritten)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (True(query->flags & VideoCommon::QueryFlagBits::IsInvalidated)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 total = 0;
|
||||||
|
ApplyBankOp(query, [&total](SamplesQueryBank* bank, size_t start, size_t amount) {
|
||||||
|
const auto& results = bank->GetResults();
|
||||||
|
for (size_t i = 0; i < amount; i++) {
|
||||||
|
total += results[start + i];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
total += GetAmendValue();
|
||||||
|
query->value = total;
|
||||||
|
query->flags |= VideoCommon::QueryFlagBits::IsHostSynced;
|
||||||
|
query->flags |= VideoCommon::QueryFlagBits::IsFinalValueSynced;
|
||||||
|
direct_sync_values.emplace_back(VideoCommon::SyncValuesStruct{
|
||||||
|
.address = query->guest_address,
|
||||||
|
.value = total,
|
||||||
|
.size = SamplesQueryBank::QUERY_SIZE,
|
||||||
|
});
|
||||||
|
|
||||||
|
has_multi_queries |= query->size_slots > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReplicateCurrentQueryIfNeeded();
|
||||||
|
std::function<void()> func([this] { amend_value = accumulation_value; });
|
||||||
|
rasterizer->SyncOperation(std::move(func));
|
||||||
|
AbandonCurrentQuery();
|
||||||
|
num_slots_used = 0;
|
||||||
|
first_accumulation_checkpoint = (std::numeric_limits<size_t>::max)();
|
||||||
|
last_accumulation_checkpoint = 0;
|
||||||
|
accumulation_since_last_sync = has_multi_queries;
|
||||||
sync_values_stash.clear();
|
sync_values_stash.clear();
|
||||||
|
pending_sync.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sync_values_stash.clear();
|
sync_values_stash.clear();
|
||||||
|
|
@ -570,6 +621,7 @@ private:
|
||||||
std::array<size_t, 32> resolve_table{};
|
std::array<size_t, 32> resolve_table{};
|
||||||
std::array<size_t, 32> intermediary_table{};
|
std::array<size_t, 32> intermediary_table{};
|
||||||
vk::Buffer accumulation_buffer;
|
vk::Buffer accumulation_buffer;
|
||||||
|
std::vector<VideoCommon::SyncValuesStruct> direct_sync_values;
|
||||||
std::deque<std::vector<HostSyncValues>> sync_values_stash;
|
std::deque<std::vector<HostSyncValues>> sync_values_stash;
|
||||||
std::vector<size_t> resolve_buffers;
|
std::vector<size_t> resolve_buffers;
|
||||||
|
|
||||||
|
|
@ -1423,13 +1475,6 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto driver_id = impl->device.GetDriverID();
|
|
||||||
const bool is_gpu_high = Settings::IsGPULevelHigh();
|
|
||||||
|
|
||||||
if ((!is_gpu_high && driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) || driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY || driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i = 0; i < 2; i++) {
|
for (size_t i = 0; i < 2; i++) {
|
||||||
is_null[i] = !is_in_ac[i] && check_value(objects[i]->address);
|
is_null[i] = !is_in_ac[i] && check_value(objects[i]->address);
|
||||||
}
|
}
|
||||||
|
|
@ -1442,12 +1487,22 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_gpu_high) {
|
auto driver_id = impl->device.GetDriverID();
|
||||||
return true;
|
const bool is_gpu_high = Settings::IsGPULevelHigh();
|
||||||
|
const bool driver_blocks_pair_resolve =
|
||||||
|
((!is_gpu_high && driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) ||
|
||||||
|
driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY ||
|
||||||
|
driver_id == VK_DRIVER_ID_ARM_PROPRIETARY ||
|
||||||
|
driver_id == VK_DRIVER_ID_MESA_TURNIP);
|
||||||
|
|
||||||
|
if (driver_blocks_pair_resolve || !is_gpu_high) {
|
||||||
|
EndHostConditionalRendering();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_in_bc[0] && !is_in_bc[1]) {
|
if (!is_in_bc[0] && !is_in_bc[1]) {
|
||||||
return true;
|
EndHostConditionalRendering();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
HostConditionalRenderingCompareBCImpl(object_1.address, equal_check);
|
HostConditionalRenderingCompareBCImpl(object_1.address, equal_check);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue