mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-31 02:35:39 +00:00
[engine, dma] Adjustment of the execution mask handling
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <bitset>
|
||||
#include <array>
|
||||
#include <limits>
|
||||
#include <vector>
|
||||
|
||||
@@ -26,6 +26,11 @@ class EngineInterface {
|
||||
public:
|
||||
virtual ~EngineInterface() = default;
|
||||
|
||||
static constexpr size_t ExecutionMaskBits = (std::numeric_limits<u16>::max)();
|
||||
static constexpr size_t ExecutionMaskWordBits = 64;
|
||||
static constexpr size_t ExecutionMaskWords =
|
||||
(ExecutionMaskBits + ExecutionMaskWordBits - 1) / ExecutionMaskWordBits;
|
||||
|
||||
/// Write the value to the register identified by method.
|
||||
virtual void CallMethod(u32 method, u32 method_argument, bool is_last_call) = 0;
|
||||
|
||||
@@ -40,7 +45,33 @@ public:
|
||||
ConsumeSinkImpl();
|
||||
}
|
||||
|
||||
std::bitset<(std::numeric_limits<u16>::max)()> execution_mask{};
|
||||
void ClearExecutionMask() {
|
||||
execution_mask_words.fill(0);
|
||||
}
|
||||
|
||||
void SetExecutionMaskBit(u32 method, bool value = true) {
|
||||
if (method >= ExecutionMaskBits) {
|
||||
return;
|
||||
}
|
||||
const size_t word_index = method >> 6;
|
||||
const u64 bit_mask = 1ULL << (method & 63);
|
||||
if (value) {
|
||||
execution_mask_words[word_index] |= bit_mask;
|
||||
} else {
|
||||
execution_mask_words[word_index] &= ~bit_mask;
|
||||
}
|
||||
}
|
||||
|
||||
bool IsExecutionMaskSet(u32 method) const {
|
||||
if (method >= ExecutionMaskBits) {
|
||||
return false;
|
||||
}
|
||||
const size_t word_index = method >> 6;
|
||||
const u64 bit_mask = 1ULL << (method & 63);
|
||||
return (execution_mask_words[word_index] & bit_mask) != 0;
|
||||
}
|
||||
|
||||
std::array<u64, ExecutionMaskWords> execution_mask_words{};
|
||||
std::vector<std::pair<u32, u32>> method_sink{};
|
||||
bool current_dirty{};
|
||||
GPUVAddr current_dma_segment;
|
||||
|
||||
Reference in New Issue
Block a user