3
0
Fork 0
forked from suyu/suyu
suyu/src/shader_recompiler/varying_state.h
Morph 99ceb03a1c general: Convert source file copyright comments over to SPDX
This formats all copyright comments according to SPDX formatting guidelines.
Additionally, this resolves the remaining GPLv2 only licensed files by relicensing them to GPLv2.0-or-later.
2022-04-23 05:55:32 -04:00

69 lines
2.4 KiB
C++

// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <bitset>
#include <cstddef>
#include "shader_recompiler/frontend/ir/attribute.h"
namespace Shader {
struct VaryingState {
std::bitset<256> mask{};
void Set(IR::Attribute attribute, bool state = true) {
mask[static_cast<size_t>(attribute)] = state;
}
[[nodiscard]] bool operator[](IR::Attribute attribute) const noexcept {
return mask[static_cast<size_t>(attribute)];
}
[[nodiscard]] bool AnyComponent(IR::Attribute base) const noexcept {
return mask[static_cast<size_t>(base) + 0] || mask[static_cast<size_t>(base) + 1] ||
mask[static_cast<size_t>(base) + 2] || mask[static_cast<size_t>(base) + 3];
}
[[nodiscard]] bool AllComponents(IR::Attribute base) const noexcept {
return mask[static_cast<size_t>(base) + 0] && mask[static_cast<size_t>(base) + 1] &&
mask[static_cast<size_t>(base) + 2] && mask[static_cast<size_t>(base) + 3];
}
[[nodiscard]] bool IsUniform(IR::Attribute base) const noexcept {
return AnyComponent(base) == AllComponents(base);
}
[[nodiscard]] bool Generic(size_t index, size_t component) const noexcept {
return mask[static_cast<size_t>(IR::Attribute::Generic0X) + index * 4 + component];
}
[[nodiscard]] bool Generic(size_t index) const noexcept {
return Generic(index, 0) || Generic(index, 1) || Generic(index, 2) || Generic(index, 3);
}
[[nodiscard]] bool ClipDistances() const noexcept {
return AnyComponent(IR::Attribute::ClipDistance0) ||
AnyComponent(IR::Attribute::ClipDistance4);
}
[[nodiscard]] bool Legacy() const noexcept {
return AnyComponent(IR::Attribute::ColorFrontDiffuseR) ||
AnyComponent(IR::Attribute::ColorFrontSpecularR) ||
AnyComponent(IR::Attribute::ColorBackDiffuseR) ||
AnyComponent(IR::Attribute::ColorBackSpecularR) || FixedFunctionTexture() ||
mask[static_cast<size_t>(IR::Attribute::FogCoordinate)];
}
[[nodiscard]] bool FixedFunctionTexture() const noexcept {
for (size_t index = 0; index < 10; ++index) {
if (AnyComponent(IR::Attribute::FixedFncTexture0S + index * 4)) {
return true;
}
}
return false;
}
};
} // namespace Shader