diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt index 4f19e00ee4..c385951318 100644 --- a/src/shader_recompiler/CMakeLists.txt +++ b/src/shader_recompiler/CMakeLists.txt @@ -81,14 +81,12 @@ add_library(shader_recompiler STATIC environment.h exception.h frontend/ir/abstract_syntax_list.h - frontend/ir/attribute.cpp frontend/ir/attribute.h frontend/ir/basic_block.cpp frontend/ir/basic_block.h frontend/ir/breadth_first_search.h frontend/ir/condition.cpp frontend/ir/condition.h - frontend/ir/flow_test.cpp frontend/ir/flow_test.h frontend/ir/ir_emitter.cpp frontend/ir/ir_emitter.h diff --git a/src/shader_recompiler/frontend/ir/attribute.cpp b/src/shader_recompiler/frontend/ir/attribute.cpp deleted file mode 100644 index 97f253602d..0000000000 --- a/src/shader_recompiler/frontend/ir/attribute.cpp +++ /dev/null @@ -1,459 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#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(attribute) - static_cast(Attribute::Generic0X)) / 4u; -} - -u32 GenericAttributeElement(Attribute attribute) { - if (!IsGeneric(attribute)) { - throw InvalidArgument("Attribute is not generic {}", attribute); - } - return static_cast(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("", static_cast(attribute)); -} - -} // namespace Shader::IR diff --git a/src/shader_recompiler/frontend/ir/attribute.h b/src/shader_recompiler/frontend/ir/attribute.h index 7a06713803..943c8d673f 100644 --- a/src/shader_recompiler/frontend/ir/attribute.h +++ b/src/shader_recompiler/frontend/ir/attribute.h @@ -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 #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("", int(attribute)); + } +} [[nodiscard]] constexpr IR::Attribute operator+(IR::Attribute attribute, size_t value) noexcept { - return static_cast(static_cast(attribute) + value); + return IR::Attribute(size_t(attribute) + value); } } // namespace Shader::IR diff --git a/src/shader_recompiler/frontend/ir/flow_test.cpp b/src/shader_recompiler/frontend/ir/flow_test.cpp deleted file mode 100644 index c2dbe2690f..0000000000 --- a/src/shader_recompiler/frontend/ir/flow_test.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#include - -#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("", static_cast(flow_test)); -} - -} // namespace Shader::IR diff --git a/src/shader_recompiler/frontend/ir/flow_test.h b/src/shader_recompiler/frontend/ir/flow_test.h index 014ae6b659..0bb9666538 100644 --- a/src/shader_recompiler/frontend/ir/flow_test.h +++ b/src/shader_recompiler/frontend/ir/flow_test.h @@ -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 @@ -7,45 +10,58 @@ #include #include "common/common_types.h" +#include "shader_recompiler/exception.h" namespace Shader::IR { enum class FlowTest : u64 { - F, - LT, - EQ, - LE, - GT, - NE, - GE, - NUM, - NaN, - LTU, - EQU, - LEU, - GTU, - NEU, - GEU, - T, - OFF, - LO, - SFF, - LS, - HI, - SFT, - HS, - OFT, - CSM_TA, - CSM_TR, - CSM_MX, - FCSM_TA, - FCSM_TR, - FCSM_MX, - RLE, - RGT, +#define SRIR_FLOW_TEST_LIST \ + SRIR_FLOW_TEST_ELEM(F) \ + SRIR_FLOW_TEST_ELEM(LT) \ + SRIR_FLOW_TEST_ELEM(EQ) \ + SRIR_FLOW_TEST_ELEM(LE) \ + SRIR_FLOW_TEST_ELEM(GT) \ + SRIR_FLOW_TEST_ELEM(NE) \ + SRIR_FLOW_TEST_ELEM(GE) \ + SRIR_FLOW_TEST_ELEM(NUM) \ + SRIR_FLOW_TEST_ELEM(NaN) \ + SRIR_FLOW_TEST_ELEM(LTU) \ + SRIR_FLOW_TEST_ELEM(EQU) \ + SRIR_FLOW_TEST_ELEM(LEU) \ + SRIR_FLOW_TEST_ELEM(GTU) \ + SRIR_FLOW_TEST_ELEM(NEU) \ + SRIR_FLOW_TEST_ELEM(GEU) \ + SRIR_FLOW_TEST_ELEM(T) \ + SRIR_FLOW_TEST_ELEM(OFF) \ + SRIR_FLOW_TEST_ELEM(LO) \ + SRIR_FLOW_TEST_ELEM(SFF) \ + SRIR_FLOW_TEST_ELEM(LS) \ + SRIR_FLOW_TEST_ELEM(HI) \ + SRIR_FLOW_TEST_ELEM(SFT) \ + SRIR_FLOW_TEST_ELEM(HS) \ + SRIR_FLOW_TEST_ELEM(OFT) \ + SRIR_FLOW_TEST_ELEM(CSM_TA) \ + SRIR_FLOW_TEST_ELEM(CSM_TR) \ + SRIR_FLOW_TEST_ELEM(CSM_MX) \ + SRIR_FLOW_TEST_ELEM(FCSM_TA) \ + SRIR_FLOW_TEST_ELEM(FCSM_TR) \ + SRIR_FLOW_TEST_ELEM(FCSM_MX) \ + 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("", int(flow_test)); + } +} } // namespace Shader::IR