[engine, dma] Adjustment of the execution mask handling

This commit is contained in:
CamilleLaVey
2026-02-11 02:04:47 -04:00
committed by crueter
parent e35efd3db1
commit 635335fc85
10 changed files with 263 additions and 65 deletions
+33 -2
View File
@@ -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;