[shader_recompiler] macro-ify flow_test and attribute (#2900)

Of course - macros my beloved :)
Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2900
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
lizzie 2025-11-13 13:22:02 +01:00 committed by crueter
parent cfbef5c487
commit 9a046190c7
No known key found for this signature in database
GPG key ID: 425ACD2D4830EBC6
5 changed files with 293 additions and 796 deletions

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@ -6,240 +9,261 @@
#include <fmt/ranges.h>
#include "common/common_types.h"
#include "shader_recompiler/exception.h"
namespace Shader::IR {
enum class Attribute : u64 {
PrimitiveId = 24,
Layer = 25,
ViewportIndex = 26,
PointSize = 27,
PositionX = 28,
PositionY = 29,
PositionZ = 30,
PositionW = 31,
Generic0X = 32,
Generic0Y = 33,
Generic0Z = 34,
Generic0W = 35,
Generic1X = 36,
Generic1Y = 37,
Generic1Z = 38,
Generic1W = 39,
Generic2X = 40,
Generic2Y = 41,
Generic2Z = 42,
Generic2W = 43,
Generic3X = 44,
Generic3Y = 45,
Generic3Z = 46,
Generic3W = 47,
Generic4X = 48,
Generic4Y = 49,
Generic4Z = 50,
Generic4W = 51,
Generic5X = 52,
Generic5Y = 53,
Generic5Z = 54,
Generic5W = 55,
Generic6X = 56,
Generic6Y = 57,
Generic6Z = 58,
Generic6W = 59,
Generic7X = 60,
Generic7Y = 61,
Generic7Z = 62,
Generic7W = 63,
Generic8X = 64,
Generic8Y = 65,
Generic8Z = 66,
Generic8W = 67,
Generic9X = 68,
Generic9Y = 69,
Generic9Z = 70,
Generic9W = 71,
Generic10X = 72,
Generic10Y = 73,
Generic10Z = 74,
Generic10W = 75,
Generic11X = 76,
Generic11Y = 77,
Generic11Z = 78,
Generic11W = 79,
Generic12X = 80,
Generic12Y = 81,
Generic12Z = 82,
Generic12W = 83,
Generic13X = 84,
Generic13Y = 85,
Generic13Z = 86,
Generic13W = 87,
Generic14X = 88,
Generic14Y = 89,
Generic14Z = 90,
Generic14W = 91,
Generic15X = 92,
Generic15Y = 93,
Generic15Z = 94,
Generic15W = 95,
Generic16X = 96,
Generic16Y = 97,
Generic16Z = 98,
Generic16W = 99,
Generic17X = 100,
Generic17Y = 101,
Generic17Z = 102,
Generic17W = 103,
Generic18X = 104,
Generic18Y = 105,
Generic18Z = 106,
Generic18W = 107,
Generic19X = 108,
Generic19Y = 109,
Generic19Z = 110,
Generic19W = 111,
Generic20X = 112,
Generic20Y = 113,
Generic20Z = 114,
Generic20W = 115,
Generic21X = 116,
Generic21Y = 117,
Generic21Z = 118,
Generic21W = 119,
Generic22X = 120,
Generic22Y = 121,
Generic22Z = 122,
Generic22W = 123,
Generic23X = 124,
Generic23Y = 125,
Generic23Z = 126,
Generic23W = 127,
Generic24X = 128,
Generic24Y = 129,
Generic24Z = 130,
Generic24W = 131,
Generic25X = 132,
Generic25Y = 133,
Generic25Z = 134,
Generic25W = 135,
Generic26X = 136,
Generic26Y = 137,
Generic26Z = 138,
Generic26W = 139,
Generic27X = 140,
Generic27Y = 141,
Generic27Z = 142,
Generic27W = 143,
Generic28X = 144,
Generic28Y = 145,
Generic28Z = 146,
Generic28W = 147,
Generic29X = 148,
Generic29Y = 149,
Generic29Z = 150,
Generic29W = 151,
Generic30X = 152,
Generic30Y = 153,
Generic30Z = 154,
Generic30W = 155,
Generic31X = 156,
Generic31Y = 157,
Generic31Z = 158,
Generic31W = 159,
ColorFrontDiffuseR = 160,
ColorFrontDiffuseG = 161,
ColorFrontDiffuseB = 162,
ColorFrontDiffuseA = 163,
ColorFrontSpecularR = 164,
ColorFrontSpecularG = 165,
ColorFrontSpecularB = 166,
ColorFrontSpecularA = 167,
ColorBackDiffuseR = 168,
ColorBackDiffuseG = 169,
ColorBackDiffuseB = 170,
ColorBackDiffuseA = 171,
ColorBackSpecularR = 172,
ColorBackSpecularG = 173,
ColorBackSpecularB = 174,
ColorBackSpecularA = 175,
ClipDistance0 = 176,
ClipDistance1 = 177,
ClipDistance2 = 178,
ClipDistance3 = 179,
ClipDistance4 = 180,
ClipDistance5 = 181,
ClipDistance6 = 182,
ClipDistance7 = 183,
PointSpriteS = 184,
PointSpriteT = 185,
FogCoordinate = 186,
TessellationEvaluationPointU = 188,
TessellationEvaluationPointV = 189,
InstanceId = 190,
VertexId = 191,
FixedFncTexture0S = 192,
FixedFncTexture0T = 193,
FixedFncTexture0R = 194,
FixedFncTexture0Q = 195,
FixedFncTexture1S = 196,
FixedFncTexture1T = 197,
FixedFncTexture1R = 198,
FixedFncTexture1Q = 199,
FixedFncTexture2S = 200,
FixedFncTexture2T = 201,
FixedFncTexture2R = 202,
FixedFncTexture2Q = 203,
FixedFncTexture3S = 204,
FixedFncTexture3T = 205,
FixedFncTexture3R = 206,
FixedFncTexture3Q = 207,
FixedFncTexture4S = 208,
FixedFncTexture4T = 209,
FixedFncTexture4R = 210,
FixedFncTexture4Q = 211,
FixedFncTexture5S = 212,
FixedFncTexture5T = 213,
FixedFncTexture5R = 214,
FixedFncTexture5Q = 215,
FixedFncTexture6S = 216,
FixedFncTexture6T = 217,
FixedFncTexture6R = 218,
FixedFncTexture6Q = 219,
FixedFncTexture7S = 220,
FixedFncTexture7T = 221,
FixedFncTexture7R = 222,
FixedFncTexture7Q = 223,
FixedFncTexture8S = 224,
FixedFncTexture8T = 225,
FixedFncTexture8R = 226,
FixedFncTexture8Q = 227,
FixedFncTexture9S = 228,
FixedFncTexture9T = 229,
FixedFncTexture9R = 230,
FixedFncTexture9Q = 231,
ViewportMask = 232,
FrontFace = 255,
// Implementation attributes
BaseInstance = 256,
BaseVertex = 257,
DrawID = 258,
#define SRIR_ATTRIBUTE_LIST \
SRIR_ATTRIBUTE_ELEM(PrimitiveId, 24) \
SRIR_ATTRIBUTE_ELEM(Layer, 25) \
SRIR_ATTRIBUTE_ELEM(ViewportIndex, 26) \
SRIR_ATTRIBUTE_ELEM(PointSize, 27) \
SRIR_ATTRIBUTE_ELEM(PositionX, 28) \
SRIR_ATTRIBUTE_ELEM(PositionY, 29) \
SRIR_ATTRIBUTE_ELEM(PositionZ, 30) \
SRIR_ATTRIBUTE_ELEM(PositionW, 31) \
SRIR_ATTRIBUTE_ELEM(Generic0X, 32) \
SRIR_ATTRIBUTE_ELEM(Generic0Y, 33) \
SRIR_ATTRIBUTE_ELEM(Generic0Z, 34) \
SRIR_ATTRIBUTE_ELEM(Generic0W, 35) \
SRIR_ATTRIBUTE_ELEM(Generic1X, 36) \
SRIR_ATTRIBUTE_ELEM(Generic1Y, 37) \
SRIR_ATTRIBUTE_ELEM(Generic1Z, 38) \
SRIR_ATTRIBUTE_ELEM(Generic1W, 39) \
SRIR_ATTRIBUTE_ELEM(Generic2X, 40) \
SRIR_ATTRIBUTE_ELEM(Generic2Y, 41) \
SRIR_ATTRIBUTE_ELEM(Generic2Z, 42) \
SRIR_ATTRIBUTE_ELEM(Generic2W, 43) \
SRIR_ATTRIBUTE_ELEM(Generic3X, 44) \
SRIR_ATTRIBUTE_ELEM(Generic3Y, 45) \
SRIR_ATTRIBUTE_ELEM(Generic3Z, 46) \
SRIR_ATTRIBUTE_ELEM(Generic3W, 47) \
SRIR_ATTRIBUTE_ELEM(Generic4X, 48) \
SRIR_ATTRIBUTE_ELEM(Generic4Y, 49) \
SRIR_ATTRIBUTE_ELEM(Generic4Z, 50) \
SRIR_ATTRIBUTE_ELEM(Generic4W, 51) \
SRIR_ATTRIBUTE_ELEM(Generic5X, 52) \
SRIR_ATTRIBUTE_ELEM(Generic5Y, 53) \
SRIR_ATTRIBUTE_ELEM(Generic5Z, 54) \
SRIR_ATTRIBUTE_ELEM(Generic5W, 55) \
SRIR_ATTRIBUTE_ELEM(Generic6X, 56) \
SRIR_ATTRIBUTE_ELEM(Generic6Y, 57) \
SRIR_ATTRIBUTE_ELEM(Generic6Z, 58) \
SRIR_ATTRIBUTE_ELEM(Generic6W, 59) \
SRIR_ATTRIBUTE_ELEM(Generic7X, 60) \
SRIR_ATTRIBUTE_ELEM(Generic7Y, 61) \
SRIR_ATTRIBUTE_ELEM(Generic7Z, 62) \
SRIR_ATTRIBUTE_ELEM(Generic7W, 63) \
SRIR_ATTRIBUTE_ELEM(Generic8X, 64) \
SRIR_ATTRIBUTE_ELEM(Generic8Y, 65) \
SRIR_ATTRIBUTE_ELEM(Generic8Z, 66) \
SRIR_ATTRIBUTE_ELEM(Generic8W, 67) \
SRIR_ATTRIBUTE_ELEM(Generic9X, 68) \
SRIR_ATTRIBUTE_ELEM(Generic9Y, 69) \
SRIR_ATTRIBUTE_ELEM(Generic9Z, 70) \
SRIR_ATTRIBUTE_ELEM(Generic9W, 71) \
SRIR_ATTRIBUTE_ELEM(Generic10X, 72) \
SRIR_ATTRIBUTE_ELEM(Generic10Y, 73) \
SRIR_ATTRIBUTE_ELEM(Generic10Z, 74) \
SRIR_ATTRIBUTE_ELEM(Generic10W, 75) \
SRIR_ATTRIBUTE_ELEM(Generic11X, 76) \
SRIR_ATTRIBUTE_ELEM(Generic11Y, 77) \
SRIR_ATTRIBUTE_ELEM(Generic11Z, 78) \
SRIR_ATTRIBUTE_ELEM(Generic11W, 79) \
SRIR_ATTRIBUTE_ELEM(Generic12X, 80) \
SRIR_ATTRIBUTE_ELEM(Generic12Y, 81) \
SRIR_ATTRIBUTE_ELEM(Generic12Z, 82) \
SRIR_ATTRIBUTE_ELEM(Generic12W, 83) \
SRIR_ATTRIBUTE_ELEM(Generic13X, 84) \
SRIR_ATTRIBUTE_ELEM(Generic13Y, 85) \
SRIR_ATTRIBUTE_ELEM(Generic13Z, 86) \
SRIR_ATTRIBUTE_ELEM(Generic13W, 87) \
SRIR_ATTRIBUTE_ELEM(Generic14X, 88) \
SRIR_ATTRIBUTE_ELEM(Generic14Y, 89) \
SRIR_ATTRIBUTE_ELEM(Generic14Z, 90) \
SRIR_ATTRIBUTE_ELEM(Generic14W, 91) \
SRIR_ATTRIBUTE_ELEM(Generic15X, 92) \
SRIR_ATTRIBUTE_ELEM(Generic15Y, 93) \
SRIR_ATTRIBUTE_ELEM(Generic15Z, 94) \
SRIR_ATTRIBUTE_ELEM(Generic15W, 95) \
SRIR_ATTRIBUTE_ELEM(Generic16X, 96) \
SRIR_ATTRIBUTE_ELEM(Generic16Y, 97) \
SRIR_ATTRIBUTE_ELEM(Generic16Z, 98) \
SRIR_ATTRIBUTE_ELEM(Generic16W, 99) \
SRIR_ATTRIBUTE_ELEM(Generic17X, 100) \
SRIR_ATTRIBUTE_ELEM(Generic17Y, 101) \
SRIR_ATTRIBUTE_ELEM(Generic17Z, 102) \
SRIR_ATTRIBUTE_ELEM(Generic17W, 103) \
SRIR_ATTRIBUTE_ELEM(Generic18X, 104) \
SRIR_ATTRIBUTE_ELEM(Generic18Y, 105) \
SRIR_ATTRIBUTE_ELEM(Generic18Z, 106) \
SRIR_ATTRIBUTE_ELEM(Generic18W, 107) \
SRIR_ATTRIBUTE_ELEM(Generic19X, 108) \
SRIR_ATTRIBUTE_ELEM(Generic19Y, 109) \
SRIR_ATTRIBUTE_ELEM(Generic19Z, 110) \
SRIR_ATTRIBUTE_ELEM(Generic19W, 111) \
SRIR_ATTRIBUTE_ELEM(Generic20X, 112) \
SRIR_ATTRIBUTE_ELEM(Generic20Y, 113) \
SRIR_ATTRIBUTE_ELEM(Generic20Z, 114) \
SRIR_ATTRIBUTE_ELEM(Generic20W, 115) \
SRIR_ATTRIBUTE_ELEM(Generic21X, 116) \
SRIR_ATTRIBUTE_ELEM(Generic21Y, 117) \
SRIR_ATTRIBUTE_ELEM(Generic21Z, 118) \
SRIR_ATTRIBUTE_ELEM(Generic21W, 119) \
SRIR_ATTRIBUTE_ELEM(Generic22X, 120) \
SRIR_ATTRIBUTE_ELEM(Generic22Y, 121) \
SRIR_ATTRIBUTE_ELEM(Generic22Z, 122) \
SRIR_ATTRIBUTE_ELEM(Generic22W, 123) \
SRIR_ATTRIBUTE_ELEM(Generic23X, 124) \
SRIR_ATTRIBUTE_ELEM(Generic23Y, 125) \
SRIR_ATTRIBUTE_ELEM(Generic23Z, 126) \
SRIR_ATTRIBUTE_ELEM(Generic23W, 127) \
SRIR_ATTRIBUTE_ELEM(Generic24X, 128) \
SRIR_ATTRIBUTE_ELEM(Generic24Y, 129) \
SRIR_ATTRIBUTE_ELEM(Generic24Z, 130) \
SRIR_ATTRIBUTE_ELEM(Generic24W, 131) \
SRIR_ATTRIBUTE_ELEM(Generic25X, 132) \
SRIR_ATTRIBUTE_ELEM(Generic25Y, 133) \
SRIR_ATTRIBUTE_ELEM(Generic25Z, 134) \
SRIR_ATTRIBUTE_ELEM(Generic25W, 135) \
SRIR_ATTRIBUTE_ELEM(Generic26X, 136) \
SRIR_ATTRIBUTE_ELEM(Generic26Y, 137) \
SRIR_ATTRIBUTE_ELEM(Generic26Z, 138) \
SRIR_ATTRIBUTE_ELEM(Generic26W, 139) \
SRIR_ATTRIBUTE_ELEM(Generic27X, 140) \
SRIR_ATTRIBUTE_ELEM(Generic27Y, 141) \
SRIR_ATTRIBUTE_ELEM(Generic27Z, 142) \
SRIR_ATTRIBUTE_ELEM(Generic27W, 143) \
SRIR_ATTRIBUTE_ELEM(Generic28X, 144) \
SRIR_ATTRIBUTE_ELEM(Generic28Y, 145) \
SRIR_ATTRIBUTE_ELEM(Generic28Z, 146) \
SRIR_ATTRIBUTE_ELEM(Generic28W, 147) \
SRIR_ATTRIBUTE_ELEM(Generic29X, 148) \
SRIR_ATTRIBUTE_ELEM(Generic29Y, 149) \
SRIR_ATTRIBUTE_ELEM(Generic29Z, 150) \
SRIR_ATTRIBUTE_ELEM(Generic29W, 151) \
SRIR_ATTRIBUTE_ELEM(Generic30X, 152) \
SRIR_ATTRIBUTE_ELEM(Generic30Y, 153) \
SRIR_ATTRIBUTE_ELEM(Generic30Z, 154) \
SRIR_ATTRIBUTE_ELEM(Generic30W, 155) \
SRIR_ATTRIBUTE_ELEM(Generic31X, 156) \
SRIR_ATTRIBUTE_ELEM(Generic31Y, 157) \
SRIR_ATTRIBUTE_ELEM(Generic31Z, 158) \
SRIR_ATTRIBUTE_ELEM(Generic31W, 159) \
SRIR_ATTRIBUTE_ELEM(ColorFrontDiffuseR, 160) \
SRIR_ATTRIBUTE_ELEM(ColorFrontDiffuseG, 161) \
SRIR_ATTRIBUTE_ELEM(ColorFrontDiffuseB, 162) \
SRIR_ATTRIBUTE_ELEM(ColorFrontDiffuseA, 163) \
SRIR_ATTRIBUTE_ELEM(ColorFrontSpecularR, 164) \
SRIR_ATTRIBUTE_ELEM(ColorFrontSpecularG, 165) \
SRIR_ATTRIBUTE_ELEM(ColorFrontSpecularB, 166) \
SRIR_ATTRIBUTE_ELEM(ColorFrontSpecularA, 167) \
SRIR_ATTRIBUTE_ELEM(ColorBackDiffuseR, 168) \
SRIR_ATTRIBUTE_ELEM(ColorBackDiffuseG, 169) \
SRIR_ATTRIBUTE_ELEM(ColorBackDiffuseB, 170) \
SRIR_ATTRIBUTE_ELEM(ColorBackDiffuseA, 171) \
SRIR_ATTRIBUTE_ELEM(ColorBackSpecularR, 172) \
SRIR_ATTRIBUTE_ELEM(ColorBackSpecularG, 173) \
SRIR_ATTRIBUTE_ELEM(ColorBackSpecularB, 174) \
SRIR_ATTRIBUTE_ELEM(ColorBackSpecularA, 175) \
SRIR_ATTRIBUTE_ELEM(ClipDistance0, 176) \
SRIR_ATTRIBUTE_ELEM(ClipDistance1, 177) \
SRIR_ATTRIBUTE_ELEM(ClipDistance2, 178) \
SRIR_ATTRIBUTE_ELEM(ClipDistance3, 179) \
SRIR_ATTRIBUTE_ELEM(ClipDistance4, 180) \
SRIR_ATTRIBUTE_ELEM(ClipDistance5, 181) \
SRIR_ATTRIBUTE_ELEM(ClipDistance6, 182) \
SRIR_ATTRIBUTE_ELEM(ClipDistance7, 183) \
SRIR_ATTRIBUTE_ELEM(PointSpriteS, 184) \
SRIR_ATTRIBUTE_ELEM(PointSpriteT, 185) \
SRIR_ATTRIBUTE_ELEM(FogCoordinate, 186) \
SRIR_ATTRIBUTE_ELEM(TessellationEvaluationPointU, 188) \
SRIR_ATTRIBUTE_ELEM(TessellationEvaluationPointV, 189) \
SRIR_ATTRIBUTE_ELEM(InstanceId, 190) \
SRIR_ATTRIBUTE_ELEM(VertexId, 191) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture0S, 192) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture0T, 193) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture0R, 194) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture0Q, 195) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture1S, 196) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture1T, 197) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture1R, 198) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture1Q, 199) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture2S, 200) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture2T, 201) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture2R, 202) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture2Q, 203) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture3S, 204) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture3T, 205) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture3R, 206) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture3Q, 207) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture4S, 208) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture4T, 209) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture4R, 210) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture4Q, 211) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture5S, 212) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture5T, 213) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture5R, 214) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture5Q, 215) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture6S, 216) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture6T, 217) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture6R, 218) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture6Q, 219) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture7S, 220) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture7T, 221) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture7R, 222) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture7Q, 223) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture8S, 224) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture8T, 225) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture8R, 226) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture8Q, 227) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture9S, 228) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture9T, 229) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture9R, 230) \
SRIR_ATTRIBUTE_ELEM(FixedFncTexture9Q, 231) \
SRIR_ATTRIBUTE_ELEM(ViewportMask, 232) \
SRIR_ATTRIBUTE_ELEM(FrontFace, 255) \
/* Implementation attributes */ \
SRIR_ATTRIBUTE_ELEM(BaseInstance, 256) \
SRIR_ATTRIBUTE_ELEM(BaseVertex, 257) \
SRIR_ATTRIBUTE_ELEM(DrawID, 258)
#define SRIR_ATTRIBUTE_ELEM(n, v) n = v,
SRIR_ATTRIBUTE_LIST
#undef SRIR_ATTRIBUTE_ELEM
};
constexpr size_t NUM_GENERICS = 32;
constexpr size_t NUM_FIXEDFNCTEXTURE = 10;
[[nodiscard]] bool IsGeneric(Attribute attribute) noexcept;
[[nodiscard]] inline bool IsGeneric(Attribute attribute) noexcept {
return attribute >= Attribute::Generic0X && attribute <= Attribute::Generic31X;
}
[[nodiscard]] u32 GenericAttributeIndex(Attribute attribute);
[[nodiscard]] inline u32 GenericAttributeIndex(Attribute attribute) {
if (!IsGeneric(attribute))
throw InvalidArgument("Attribute is not generic {}", attribute);
return (u32(attribute) - u32(Attribute::Generic0X)) / 4u;
}
[[nodiscard]] u32 GenericAttributeElement(Attribute attribute);
[[nodiscard]] inline u32 GenericAttributeElement(Attribute attribute) {
if (!IsGeneric(attribute))
throw InvalidArgument("Attribute is not generic {}", attribute);
return u32(attribute) % 4;
}
[[nodiscard]] std::string NameOf(Attribute attribute);
[[nodiscard]] inline std::string NameOf(Attribute attribute) {
switch (attribute) {
#define SRIR_ATTRIBUTE_ELEM(n, v) case Attribute::n: return #n;
SRIR_ATTRIBUTE_LIST
#undef SRIR_ATTRIBUTE_ELEM
default:
return fmt::format("<reserved attribute {}>", int(attribute));
}
}
[[nodiscard]] constexpr IR::Attribute operator+(IR::Attribute attribute, size_t value) noexcept {
return static_cast<IR::Attribute>(static_cast<size_t>(attribute) + value);
return IR::Attribute(size_t(attribute) + value);
}
} // namespace Shader::IR