[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

@ -81,14 +81,12 @@ add_library(shader_recompiler STATIC
environment.h environment.h
exception.h exception.h
frontend/ir/abstract_syntax_list.h frontend/ir/abstract_syntax_list.h
frontend/ir/attribute.cpp
frontend/ir/attribute.h frontend/ir/attribute.h
frontend/ir/basic_block.cpp frontend/ir/basic_block.cpp
frontend/ir/basic_block.h frontend/ir/basic_block.h
frontend/ir/breadth_first_search.h frontend/ir/breadth_first_search.h
frontend/ir/condition.cpp frontend/ir/condition.cpp
frontend/ir/condition.h frontend/ir/condition.h
frontend/ir/flow_test.cpp
frontend/ir/flow_test.h frontend/ir/flow_test.h
frontend/ir/ir_emitter.cpp frontend/ir/ir_emitter.cpp
frontend/ir/ir_emitter.h frontend/ir/ir_emitter.h

View file

@ -1,459 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <fmt/ranges.h>
#include "shader_recompiler/exception.h"
#include "shader_recompiler/frontend/ir/attribute.h"
namespace Shader::IR {
bool IsGeneric(Attribute attribute) noexcept {
return attribute >= Attribute::Generic0X && attribute <= Attribute::Generic31X;
}
u32 GenericAttributeIndex(Attribute attribute) {
if (!IsGeneric(attribute)) {
throw InvalidArgument("Attribute is not generic {}", attribute);
}
return (static_cast<u32>(attribute) - static_cast<u32>(Attribute::Generic0X)) / 4u;
}
u32 GenericAttributeElement(Attribute attribute) {
if (!IsGeneric(attribute)) {
throw InvalidArgument("Attribute is not generic {}", attribute);
}
return static_cast<u32>(attribute) % 4;
}
std::string NameOf(Attribute attribute) {
switch (attribute) {
case Attribute::PrimitiveId:
return "PrimitiveId";
case Attribute::Layer:
return "Layer";
case Attribute::ViewportIndex:
return "ViewportIndex";
case Attribute::PointSize:
return "PointSize";
case Attribute::PositionX:
return "Position.X";
case Attribute::PositionY:
return "Position.Y";
case Attribute::PositionZ:
return "Position.Z";
case Attribute::PositionW:
return "Position.W";
case Attribute::Generic0X:
return "Generic[0].X";
case Attribute::Generic0Y:
return "Generic[0].Y";
case Attribute::Generic0Z:
return "Generic[0].Z";
case Attribute::Generic0W:
return "Generic[0].W";
case Attribute::Generic1X:
return "Generic[1].X";
case Attribute::Generic1Y:
return "Generic[1].Y";
case Attribute::Generic1Z:
return "Generic[1].Z";
case Attribute::Generic1W:
return "Generic[1].W";
case Attribute::Generic2X:
return "Generic[2].X";
case Attribute::Generic2Y:
return "Generic[2].Y";
case Attribute::Generic2Z:
return "Generic[2].Z";
case Attribute::Generic2W:
return "Generic[2].W";
case Attribute::Generic3X:
return "Generic[3].X";
case Attribute::Generic3Y:
return "Generic[3].Y";
case Attribute::Generic3Z:
return "Generic[3].Z";
case Attribute::Generic3W:
return "Generic[3].W";
case Attribute::Generic4X:
return "Generic[4].X";
case Attribute::Generic4Y:
return "Generic[4].Y";
case Attribute::Generic4Z:
return "Generic[4].Z";
case Attribute::Generic4W:
return "Generic[4].W";
case Attribute::Generic5X:
return "Generic[5].X";
case Attribute::Generic5Y:
return "Generic[5].Y";
case Attribute::Generic5Z:
return "Generic[5].Z";
case Attribute::Generic5W:
return "Generic[5].W";
case Attribute::Generic6X:
return "Generic[6].X";
case Attribute::Generic6Y:
return "Generic[6].Y";
case Attribute::Generic6Z:
return "Generic[6].Z";
case Attribute::Generic6W:
return "Generic[6].W";
case Attribute::Generic7X:
return "Generic[7].X";
case Attribute::Generic7Y:
return "Generic[7].Y";
case Attribute::Generic7Z:
return "Generic[7].Z";
case Attribute::Generic7W:
return "Generic[7].W";
case Attribute::Generic8X:
return "Generic[8].X";
case Attribute::Generic8Y:
return "Generic[8].Y";
case Attribute::Generic8Z:
return "Generic[8].Z";
case Attribute::Generic8W:
return "Generic[8].W";
case Attribute::Generic9X:
return "Generic[9].X";
case Attribute::Generic9Y:
return "Generic[9].Y";
case Attribute::Generic9Z:
return "Generic[9].Z";
case Attribute::Generic9W:
return "Generic[9].W";
case Attribute::Generic10X:
return "Generic[10].X";
case Attribute::Generic10Y:
return "Generic[10].Y";
case Attribute::Generic10Z:
return "Generic[10].Z";
case Attribute::Generic10W:
return "Generic[10].W";
case Attribute::Generic11X:
return "Generic[11].X";
case Attribute::Generic11Y:
return "Generic[11].Y";
case Attribute::Generic11Z:
return "Generic[11].Z";
case Attribute::Generic11W:
return "Generic[11].W";
case Attribute::Generic12X:
return "Generic[12].X";
case Attribute::Generic12Y:
return "Generic[12].Y";
case Attribute::Generic12Z:
return "Generic[12].Z";
case Attribute::Generic12W:
return "Generic[12].W";
case Attribute::Generic13X:
return "Generic[13].X";
case Attribute::Generic13Y:
return "Generic[13].Y";
case Attribute::Generic13Z:
return "Generic[13].Z";
case Attribute::Generic13W:
return "Generic[13].W";
case Attribute::Generic14X:
return "Generic[14].X";
case Attribute::Generic14Y:
return "Generic[14].Y";
case Attribute::Generic14Z:
return "Generic[14].Z";
case Attribute::Generic14W:
return "Generic[14].W";
case Attribute::Generic15X:
return "Generic[15].X";
case Attribute::Generic15Y:
return "Generic[15].Y";
case Attribute::Generic15Z:
return "Generic[15].Z";
case Attribute::Generic15W:
return "Generic[15].W";
case Attribute::Generic16X:
return "Generic[16].X";
case Attribute::Generic16Y:
return "Generic[16].Y";
case Attribute::Generic16Z:
return "Generic[16].Z";
case Attribute::Generic16W:
return "Generic[16].W";
case Attribute::Generic17X:
return "Generic[17].X";
case Attribute::Generic17Y:
return "Generic[17].Y";
case Attribute::Generic17Z:
return "Generic[17].Z";
case Attribute::Generic17W:
return "Generic[17].W";
case Attribute::Generic18X:
return "Generic[18].X";
case Attribute::Generic18Y:
return "Generic[18].Y";
case Attribute::Generic18Z:
return "Generic[18].Z";
case Attribute::Generic18W:
return "Generic[18].W";
case Attribute::Generic19X:
return "Generic[19].X";
case Attribute::Generic19Y:
return "Generic[19].Y";
case Attribute::Generic19Z:
return "Generic[19].Z";
case Attribute::Generic19W:
return "Generic[19].W";
case Attribute::Generic20X:
return "Generic[20].X";
case Attribute::Generic20Y:
return "Generic[20].Y";
case Attribute::Generic20Z:
return "Generic[20].Z";
case Attribute::Generic20W:
return "Generic[20].W";
case Attribute::Generic21X:
return "Generic[21].X";
case Attribute::Generic21Y:
return "Generic[21].Y";
case Attribute::Generic21Z:
return "Generic[21].Z";
case Attribute::Generic21W:
return "Generic[21].W";
case Attribute::Generic22X:
return "Generic[22].X";
case Attribute::Generic22Y:
return "Generic[22].Y";
case Attribute::Generic22Z:
return "Generic[22].Z";
case Attribute::Generic22W:
return "Generic[22].W";
case Attribute::Generic23X:
return "Generic[23].X";
case Attribute::Generic23Y:
return "Generic[23].Y";
case Attribute::Generic23Z:
return "Generic[23].Z";
case Attribute::Generic23W:
return "Generic[23].W";
case Attribute::Generic24X:
return "Generic[24].X";
case Attribute::Generic24Y:
return "Generic[24].Y";
case Attribute::Generic24Z:
return "Generic[24].Z";
case Attribute::Generic24W:
return "Generic[24].W";
case Attribute::Generic25X:
return "Generic[25].X";
case Attribute::Generic25Y:
return "Generic[25].Y";
case Attribute::Generic25Z:
return "Generic[25].Z";
case Attribute::Generic25W:
return "Generic[25].W";
case Attribute::Generic26X:
return "Generic[26].X";
case Attribute::Generic26Y:
return "Generic[26].Y";
case Attribute::Generic26Z:
return "Generic[26].Z";
case Attribute::Generic26W:
return "Generic[26].W";
case Attribute::Generic27X:
return "Generic[27].X";
case Attribute::Generic27Y:
return "Generic[27].Y";
case Attribute::Generic27Z:
return "Generic[27].Z";
case Attribute::Generic27W:
return "Generic[27].W";
case Attribute::Generic28X:
return "Generic[28].X";
case Attribute::Generic28Y:
return "Generic[28].Y";
case Attribute::Generic28Z:
return "Generic[28].Z";
case Attribute::Generic28W:
return "Generic[28].W";
case Attribute::Generic29X:
return "Generic[29].X";
case Attribute::Generic29Y:
return "Generic[29].Y";
case Attribute::Generic29Z:
return "Generic[29].Z";
case Attribute::Generic29W:
return "Generic[29].W";
case Attribute::Generic30X:
return "Generic[30].X";
case Attribute::Generic30Y:
return "Generic[30].Y";
case Attribute::Generic30Z:
return "Generic[30].Z";
case Attribute::Generic30W:
return "Generic[30].W";
case Attribute::Generic31X:
return "Generic[31].X";
case Attribute::Generic31Y:
return "Generic[31].Y";
case Attribute::Generic31Z:
return "Generic[31].Z";
case Attribute::Generic31W:
return "Generic[31].W";
case Attribute::ColorFrontDiffuseR:
return "ColorFrontDiffuse.R";
case Attribute::ColorFrontDiffuseG:
return "ColorFrontDiffuse.G";
case Attribute::ColorFrontDiffuseB:
return "ColorFrontDiffuse.B";
case Attribute::ColorFrontDiffuseA:
return "ColorFrontDiffuse.A";
case Attribute::ColorFrontSpecularR:
return "ColorFrontSpecular.R";
case Attribute::ColorFrontSpecularG:
return "ColorFrontSpecular.G";
case Attribute::ColorFrontSpecularB:
return "ColorFrontSpecular.B";
case Attribute::ColorFrontSpecularA:
return "ColorFrontSpecular.A";
case Attribute::ColorBackDiffuseR:
return "ColorBackDiffuse.R";
case Attribute::ColorBackDiffuseG:
return "ColorBackDiffuse.G";
case Attribute::ColorBackDiffuseB:
return "ColorBackDiffuse.B";
case Attribute::ColorBackDiffuseA:
return "ColorBackDiffuse.A";
case Attribute::ColorBackSpecularR:
return "ColorBackSpecular.R";
case Attribute::ColorBackSpecularG:
return "ColorBackSpecular.G";
case Attribute::ColorBackSpecularB:
return "ColorBackSpecular.B";
case Attribute::ColorBackSpecularA:
return "ColorBackSpecular.A";
case Attribute::ClipDistance0:
return "ClipDistance[0]";
case Attribute::ClipDistance1:
return "ClipDistance[1]";
case Attribute::ClipDistance2:
return "ClipDistance[2]";
case Attribute::ClipDistance3:
return "ClipDistance[3]";
case Attribute::ClipDistance4:
return "ClipDistance[4]";
case Attribute::ClipDistance5:
return "ClipDistance[5]";
case Attribute::ClipDistance6:
return "ClipDistance[6]";
case Attribute::ClipDistance7:
return "ClipDistance[7]";
case Attribute::PointSpriteS:
return "PointSprite.S";
case Attribute::PointSpriteT:
return "PointSprite.T";
case Attribute::FogCoordinate:
return "FogCoordinate";
case Attribute::TessellationEvaluationPointU:
return "TessellationEvaluationPoint.U";
case Attribute::TessellationEvaluationPointV:
return "TessellationEvaluationPoint.V";
case Attribute::InstanceId:
return "InstanceId";
case Attribute::VertexId:
return "VertexId";
case Attribute::FixedFncTexture0S:
return "FixedFncTexture[0].S";
case Attribute::FixedFncTexture0T:
return "FixedFncTexture[0].T";
case Attribute::FixedFncTexture0R:
return "FixedFncTexture[0].R";
case Attribute::FixedFncTexture0Q:
return "FixedFncTexture[0].Q";
case Attribute::FixedFncTexture1S:
return "FixedFncTexture[1].S";
case Attribute::FixedFncTexture1T:
return "FixedFncTexture[1].T";
case Attribute::FixedFncTexture1R:
return "FixedFncTexture[1].R";
case Attribute::FixedFncTexture1Q:
return "FixedFncTexture[1].Q";
case Attribute::FixedFncTexture2S:
return "FixedFncTexture[2].S";
case Attribute::FixedFncTexture2T:
return "FixedFncTexture[2].T";
case Attribute::FixedFncTexture2R:
return "FixedFncTexture[2].R";
case Attribute::FixedFncTexture2Q:
return "FixedFncTexture[2].Q";
case Attribute::FixedFncTexture3S:
return "FixedFncTexture[3].S";
case Attribute::FixedFncTexture3T:
return "FixedFncTexture[3].T";
case Attribute::FixedFncTexture3R:
return "FixedFncTexture[3].R";
case Attribute::FixedFncTexture3Q:
return "FixedFncTexture[3].Q";
case Attribute::FixedFncTexture4S:
return "FixedFncTexture[4].S";
case Attribute::FixedFncTexture4T:
return "FixedFncTexture[4].T";
case Attribute::FixedFncTexture4R:
return "FixedFncTexture[4].R";
case Attribute::FixedFncTexture4Q:
return "FixedFncTexture[4].Q";
case Attribute::FixedFncTexture5S:
return "FixedFncTexture[5].S";
case Attribute::FixedFncTexture5T:
return "FixedFncTexture[5].T";
case Attribute::FixedFncTexture5R:
return "FixedFncTexture[5].R";
case Attribute::FixedFncTexture5Q:
return "FixedFncTexture[5].Q";
case Attribute::FixedFncTexture6S:
return "FixedFncTexture[6].S";
case Attribute::FixedFncTexture6T:
return "FixedFncTexture[6].T";
case Attribute::FixedFncTexture6R:
return "FixedFncTexture[6].R";
case Attribute::FixedFncTexture6Q:
return "FixedFncTexture[6].Q";
case Attribute::FixedFncTexture7S:
return "FixedFncTexture[7].S";
case Attribute::FixedFncTexture7T:
return "FixedFncTexture[7].T";
case Attribute::FixedFncTexture7R:
return "FixedFncTexture[7].R";
case Attribute::FixedFncTexture7Q:
return "FixedFncTexture[7].Q";
case Attribute::FixedFncTexture8S:
return "FixedFncTexture[8].S";
case Attribute::FixedFncTexture8T:
return "FixedFncTexture[8].T";
case Attribute::FixedFncTexture8R:
return "FixedFncTexture[8].R";
case Attribute::FixedFncTexture8Q:
return "FixedFncTexture[8].Q";
case Attribute::FixedFncTexture9S:
return "FixedFncTexture[9].S";
case Attribute::FixedFncTexture9T:
return "FixedFncTexture[9].T";
case Attribute::FixedFncTexture9R:
return "FixedFncTexture[9].R";
case Attribute::FixedFncTexture9Q:
return "FixedFncTexture[9].Q";
case Attribute::ViewportMask:
return "ViewportMask";
case Attribute::FrontFace:
return "FrontFace";
case Attribute::BaseInstance:
return "BaseInstance";
case Attribute::BaseVertex:
return "BaseVertex";
case Attribute::DrawID:
return "DrawID";
}
return fmt::format("<reserved attribute {}>", static_cast<int>(attribute));
}
} // namespace Shader::IR

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

View file

@ -1,82 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <string>
#include <fmt/ranges.h>
#include "shader_recompiler/frontend/ir/flow_test.h"
namespace Shader::IR {
std::string NameOf(FlowTest flow_test) {
switch (flow_test) {
case FlowTest::F:
return "F";
case FlowTest::LT:
return "LT";
case FlowTest::EQ:
return "EQ";
case FlowTest::LE:
return "LE";
case FlowTest::GT:
return "GT";
case FlowTest::NE:
return "NE";
case FlowTest::GE:
return "GE";
case FlowTest::NUM:
return "NUM";
case FlowTest::NaN:
return "NAN";
case FlowTest::LTU:
return "LTU";
case FlowTest::EQU:
return "EQU";
case FlowTest::LEU:
return "LEU";
case FlowTest::GTU:
return "GTU";
case FlowTest::NEU:
return "NEU";
case FlowTest::GEU:
return "GEU";
case FlowTest::T:
return "T";
case FlowTest::OFF:
return "OFF";
case FlowTest::LO:
return "LO";
case FlowTest::SFF:
return "SFF";
case FlowTest::LS:
return "LS";
case FlowTest::HI:
return "HI";
case FlowTest::SFT:
return "SFT";
case FlowTest::HS:
return "HS";
case FlowTest::OFT:
return "OFT";
case FlowTest::CSM_TA:
return "CSM_TA";
case FlowTest::CSM_TR:
return "CSM_TR";
case FlowTest::CSM_MX:
return "CSM_MX";
case FlowTest::FCSM_TA:
return "FCSM_TA";
case FlowTest::FCSM_TR:
return "FCSM_TR";
case FlowTest::FCSM_MX:
return "FCSM_MX";
case FlowTest::RLE:
return "RLE";
case FlowTest::RGT:
return "RGT";
}
return fmt::format("<invalid flow test {}>", static_cast<int>(flow_test));
}
} // namespace Shader::IR

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-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -7,45 +10,58 @@
#include <fmt/ranges.h> #include <fmt/ranges.h>
#include "common/common_types.h" #include "common/common_types.h"
#include "shader_recompiler/exception.h"
namespace Shader::IR { namespace Shader::IR {
enum class FlowTest : u64 { enum class FlowTest : u64 {
F, #define SRIR_FLOW_TEST_LIST \
LT, SRIR_FLOW_TEST_ELEM(F) \
EQ, SRIR_FLOW_TEST_ELEM(LT) \
LE, SRIR_FLOW_TEST_ELEM(EQ) \
GT, SRIR_FLOW_TEST_ELEM(LE) \
NE, SRIR_FLOW_TEST_ELEM(GT) \
GE, SRIR_FLOW_TEST_ELEM(NE) \
NUM, SRIR_FLOW_TEST_ELEM(GE) \
NaN, SRIR_FLOW_TEST_ELEM(NUM) \
LTU, SRIR_FLOW_TEST_ELEM(NaN) \
EQU, SRIR_FLOW_TEST_ELEM(LTU) \
LEU, SRIR_FLOW_TEST_ELEM(EQU) \
GTU, SRIR_FLOW_TEST_ELEM(LEU) \
NEU, SRIR_FLOW_TEST_ELEM(GTU) \
GEU, SRIR_FLOW_TEST_ELEM(NEU) \
T, SRIR_FLOW_TEST_ELEM(GEU) \
OFF, SRIR_FLOW_TEST_ELEM(T) \
LO, SRIR_FLOW_TEST_ELEM(OFF) \
SFF, SRIR_FLOW_TEST_ELEM(LO) \
LS, SRIR_FLOW_TEST_ELEM(SFF) \
HI, SRIR_FLOW_TEST_ELEM(LS) \
SFT, SRIR_FLOW_TEST_ELEM(HI) \
HS, SRIR_FLOW_TEST_ELEM(SFT) \
OFT, SRIR_FLOW_TEST_ELEM(HS) \
CSM_TA, SRIR_FLOW_TEST_ELEM(OFT) \
CSM_TR, SRIR_FLOW_TEST_ELEM(CSM_TA) \
CSM_MX, SRIR_FLOW_TEST_ELEM(CSM_TR) \
FCSM_TA, SRIR_FLOW_TEST_ELEM(CSM_MX) \
FCSM_TR, SRIR_FLOW_TEST_ELEM(FCSM_TA) \
FCSM_MX, SRIR_FLOW_TEST_ELEM(FCSM_TR) \
RLE, SRIR_FLOW_TEST_ELEM(FCSM_MX) \
RGT, SRIR_FLOW_TEST_ELEM(RLE) \
SRIR_FLOW_TEST_ELEM(RGT)
#define SRIR_FLOW_TEST_ELEM(n) n,
SRIR_FLOW_TEST_LIST
#undef SRIR_FLOW_TEST_ELEM
}; };
[[nodiscard]] std::string NameOf(FlowTest flow_test); [[nodiscard]] inline std::string NameOf(FlowTest flow_test) {
switch (flow_test) {
#define SRIR_FLOW_TEST_ELEM(n) case FlowTest::n: return #n;
SRIR_FLOW_TEST_LIST
#undef SRIR_FLOW_TEST_ELEM
default:
return fmt::format("<invalid flow test {}>", int(flow_test));
}
}
} // namespace Shader::IR } // namespace Shader::IR