mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 19:07:01 +02:00
precompute scissor rules (optimization)
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user