precompute scissor rules (optimization)

This commit is contained in:
nmzik
2026-08-07 17:54:00 +02:00
parent 4b26d03dba
commit 81e52df7bf
+16 -9
View File
@@ -10,6 +10,7 @@
#include "graphics/host_gpu/renderer/render.h" #include "graphics/host_gpu/renderer/render.h"
#include <algorithm> #include <algorithm>
#include <array>
#include <atomic> #include <atomic>
#include <cmath> #include <cmath>
#include <fmt/format.h> #include <fmt/format.h>
@@ -1059,18 +1060,24 @@ static ScissorRect ScissorRectClamp(ScissorRect r, uint32_t width, uint32_t heig
return r; return r;
} }
static constexpr std::array<uint16_t, 16> MakeScissorIntersectionRules() {
std::array<uint16_t, 16> rules {};
for (uint32_t candidate = 0; candidate < rules.size(); candidate++) {
for (uint32_t combination = 0; combination < 16; combination++) {
if ((combination & candidate) == candidate) {
rules[candidate] |= static_cast<uint16_t>(1u << combination);
}
}
}
return rules;
}
static bool ScissorClipRuleToIntersectionMask(uint16_t rule, uint8_t* mask) { static bool ScissorClipRuleToIntersectionMask(uint16_t rule, uint8_t* mask) {
EXIT_IF(mask == nullptr); EXIT_IF(mask == nullptr);
for (uint32_t candidate = 0; candidate < 16; candidate++) { static constexpr auto rules = MakeScissorIntersectionRules();
uint16_t expected = 0; for (uint32_t candidate = 0; candidate < rules.size(); candidate++) {
for (uint32_t combination = 0; combination < 16; combination++) { if (rules[candidate] == rule) {
if ((combination & candidate) == candidate) {
expected |= static_cast<uint16_t>(1u << combination);
}
}
if (expected == rule) {
*mask = static_cast<uint8_t>(candidate); *mask = static_cast<uint8_t>(candidate);
return true; return true;
} }