EnumConversion.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. using OpenTK.Graphics.OpenGL;
  2. using Ryujinx.Common.Logging;
  3. using Ryujinx.Graphics.GAL;
  4. using Ryujinx.Graphics.GAL.Blend;
  5. using Ryujinx.Graphics.GAL.Sampler;
  6. using Ryujinx.Graphics.GAL.Texture;
  7. namespace Ryujinx.Graphics.OpenGL
  8. {
  9. static class EnumConversion
  10. {
  11. public static TextureWrapMode Convert(this AddressMode mode)
  12. {
  13. switch (mode)
  14. {
  15. case AddressMode.Clamp:
  16. return TextureWrapMode.Clamp;
  17. case AddressMode.Repeat:
  18. return TextureWrapMode.Repeat;
  19. case AddressMode.MirrorClamp:
  20. return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampExt;
  21. case AddressMode.MirrorClampToEdge:
  22. return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToEdgeExt;
  23. case AddressMode.MirrorClampToBorder:
  24. return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToBorderExt;
  25. case AddressMode.ClampToBorder:
  26. return TextureWrapMode.ClampToBorder;
  27. case AddressMode.MirroredRepeat:
  28. return TextureWrapMode.MirroredRepeat;
  29. case AddressMode.ClampToEdge:
  30. return TextureWrapMode.ClampToEdge;
  31. }
  32. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(AddressMode)} enum value: {mode}.");
  33. return TextureWrapMode.Clamp;
  34. }
  35. public static All Convert(this BlendFactor factor)
  36. {
  37. switch (factor)
  38. {
  39. case BlendFactor.Zero:
  40. case BlendFactor.ZeroGl:
  41. return All.Zero;
  42. case BlendFactor.One:
  43. case BlendFactor.OneGl:
  44. return All.One;
  45. case BlendFactor.SrcColor:
  46. case BlendFactor.SrcColorGl:
  47. return All.SrcColor;
  48. case BlendFactor.OneMinusSrcColor:
  49. case BlendFactor.OneMinusSrcColorGl:
  50. return All.OneMinusSrcColor;
  51. case BlendFactor.SrcAlpha:
  52. case BlendFactor.SrcAlphaGl:
  53. return All.SrcAlpha;
  54. case BlendFactor.OneMinusSrcAlpha:
  55. case BlendFactor.OneMinusSrcAlphaGl:
  56. return All.OneMinusSrcAlpha;
  57. case BlendFactor.DstAlpha:
  58. case BlendFactor.DstAlphaGl:
  59. return All.DstAlpha;
  60. case BlendFactor.OneMinusDstAlpha:
  61. case BlendFactor.OneMinusDstAlphaGl:
  62. return All.OneMinusDstAlpha;
  63. case BlendFactor.DstColor:
  64. case BlendFactor.DstColorGl:
  65. return All.DstColor;
  66. case BlendFactor.OneMinusDstColor:
  67. case BlendFactor.OneMinusDstColorGl:
  68. return All.OneMinusDstColor;
  69. case BlendFactor.SrcAlphaSaturate:
  70. case BlendFactor.SrcAlphaSaturateGl:
  71. return All.SrcAlphaSaturate;
  72. case BlendFactor.Src1Color:
  73. case BlendFactor.Src1ColorGl:
  74. return All.Src1Color;
  75. case BlendFactor.OneMinusSrc1Color:
  76. case BlendFactor.OneMinusSrc1ColorGl:
  77. return All.OneMinusSrc1Color;
  78. case BlendFactor.Src1Alpha:
  79. case BlendFactor.Src1AlphaGl:
  80. return All.Src1Alpha;
  81. case BlendFactor.OneMinusSrc1Alpha:
  82. case BlendFactor.OneMinusSrc1AlphaGl:
  83. return All.OneMinusSrc1Alpha;
  84. case BlendFactor.ConstantColor:
  85. return All.ConstantColor;
  86. case BlendFactor.OneMinusConstantColor:
  87. return All.OneMinusConstantColor;
  88. case BlendFactor.ConstantAlpha:
  89. return All.ConstantAlpha;
  90. case BlendFactor.OneMinusConstantAlpha:
  91. return All.OneMinusConstantAlpha;
  92. }
  93. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(BlendFactor)} enum value: {factor}.");
  94. return All.Zero;
  95. }
  96. public static BlendEquationMode Convert(this BlendOp op)
  97. {
  98. switch (op)
  99. {
  100. case BlendOp.Add:
  101. case BlendOp.AddGl:
  102. return BlendEquationMode.FuncAdd;
  103. case BlendOp.Subtract:
  104. case BlendOp.SubtractGl:
  105. return BlendEquationMode.FuncSubtract;
  106. case BlendOp.ReverseSubtract:
  107. case BlendOp.ReverseSubtractGl:
  108. return BlendEquationMode.FuncReverseSubtract;
  109. case BlendOp.Minimum:
  110. case BlendOp.MinimumGl:
  111. return BlendEquationMode.Min;
  112. case BlendOp.Maximum:
  113. case BlendOp.MaximumGl:
  114. return BlendEquationMode.Max;
  115. }
  116. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(BlendOp)} enum value: {op}.");
  117. return BlendEquationMode.FuncAdd;
  118. }
  119. public static TextureCompareMode Convert(this CompareMode mode)
  120. {
  121. switch (mode)
  122. {
  123. case CompareMode.None:
  124. return TextureCompareMode.None;
  125. case CompareMode.CompareRToTexture:
  126. return TextureCompareMode.CompareRToTexture;
  127. }
  128. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(CompareMode)} enum value: {mode}.");
  129. return TextureCompareMode.None;
  130. }
  131. public static All Convert(this CompareOp op)
  132. {
  133. switch (op)
  134. {
  135. case CompareOp.Never:
  136. case CompareOp.NeverGl:
  137. return All.Never;
  138. case CompareOp.Less:
  139. case CompareOp.LessGl:
  140. return All.Less;
  141. case CompareOp.Equal:
  142. case CompareOp.EqualGl:
  143. return All.Equal;
  144. case CompareOp.LessOrEqual:
  145. case CompareOp.LessOrEqualGl:
  146. return All.Lequal;
  147. case CompareOp.Greater:
  148. case CompareOp.GreaterGl:
  149. return All.Greater;
  150. case CompareOp.NotEqual:
  151. case CompareOp.NotEqualGl:
  152. return All.Notequal;
  153. case CompareOp.GreaterOrEqual:
  154. case CompareOp.GreaterOrEqualGl:
  155. return All.Gequal;
  156. case CompareOp.Always:
  157. case CompareOp.AlwaysGl:
  158. return All.Always;
  159. }
  160. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(CompareOp)} enum value: {op}.");
  161. return All.Never;
  162. }
  163. public static ClipDepthMode Convert(this DepthMode mode)
  164. {
  165. switch (mode)
  166. {
  167. case DepthMode.MinusOneToOne:
  168. return ClipDepthMode.NegativeOneToOne;
  169. case DepthMode.ZeroToOne:
  170. return ClipDepthMode.ZeroToOne;
  171. }
  172. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(DepthMode)} enum value: {mode}.");
  173. return ClipDepthMode.NegativeOneToOne;
  174. }
  175. public static All Convert(this DepthStencilMode mode)
  176. {
  177. switch (mode)
  178. {
  179. case DepthStencilMode.Depth:
  180. return All.Depth;
  181. case DepthStencilMode.Stencil:
  182. return All.Stencil;
  183. }
  184. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(DepthStencilMode)} enum value: {mode}.");
  185. return All.Depth;
  186. }
  187. public static CullFaceMode Convert(this Face face)
  188. {
  189. switch (face)
  190. {
  191. case Face.Back:
  192. return CullFaceMode.Back;
  193. case Face.Front:
  194. return CullFaceMode.Front;
  195. case Face.FrontAndBack:
  196. return CullFaceMode.FrontAndBack;
  197. }
  198. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(Face)} enum value: {face}.");
  199. return CullFaceMode.Back;
  200. }
  201. public static FrontFaceDirection Convert(this FrontFace frontFace)
  202. {
  203. switch (frontFace)
  204. {
  205. case FrontFace.Clockwise:
  206. return FrontFaceDirection.Cw;
  207. case FrontFace.CounterClockwise:
  208. return FrontFaceDirection.Ccw;
  209. }
  210. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(FrontFace)} enum value: {frontFace}.");
  211. return FrontFaceDirection.Cw;
  212. }
  213. public static DrawElementsType Convert(this IndexType type)
  214. {
  215. switch (type)
  216. {
  217. case IndexType.UByte:
  218. return DrawElementsType.UnsignedByte;
  219. case IndexType.UShort:
  220. return DrawElementsType.UnsignedShort;
  221. case IndexType.UInt:
  222. return DrawElementsType.UnsignedInt;
  223. }
  224. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(IndexType)} enum value: {type}.");
  225. return DrawElementsType.UnsignedByte;
  226. }
  227. public static TextureMagFilter Convert(this MagFilter filter)
  228. {
  229. switch (filter)
  230. {
  231. case MagFilter.Nearest:
  232. return TextureMagFilter.Nearest;
  233. case MagFilter.Linear:
  234. return TextureMagFilter.Linear;
  235. }
  236. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(MagFilter)} enum value: {filter}.");
  237. return TextureMagFilter.Nearest;
  238. }
  239. public static TextureMinFilter Convert(this MinFilter filter)
  240. {
  241. switch (filter)
  242. {
  243. case MinFilter.Nearest:
  244. return TextureMinFilter.Nearest;
  245. case MinFilter.Linear:
  246. return TextureMinFilter.Linear;
  247. case MinFilter.NearestMipmapNearest:
  248. return TextureMinFilter.NearestMipmapNearest;
  249. case MinFilter.LinearMipmapNearest:
  250. return TextureMinFilter.LinearMipmapNearest;
  251. case MinFilter.NearestMipmapLinear:
  252. return TextureMinFilter.NearestMipmapLinear;
  253. case MinFilter.LinearMipmapLinear:
  254. return TextureMinFilter.LinearMipmapLinear;
  255. }
  256. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(MinFilter)} enum value: {filter}.");
  257. return TextureMinFilter.Nearest;
  258. }
  259. public static PrimitiveType Convert(this PrimitiveTopology topology)
  260. {
  261. switch (topology)
  262. {
  263. case PrimitiveTopology.Points:
  264. return PrimitiveType.Points;
  265. case PrimitiveTopology.Lines:
  266. return PrimitiveType.Lines;
  267. case PrimitiveTopology.LineLoop:
  268. return PrimitiveType.LineLoop;
  269. case PrimitiveTopology.LineStrip:
  270. return PrimitiveType.LineStrip;
  271. case PrimitiveTopology.Triangles:
  272. return PrimitiveType.Triangles;
  273. case PrimitiveTopology.TriangleStrip:
  274. return PrimitiveType.TriangleStrip;
  275. case PrimitiveTopology.TriangleFan:
  276. return PrimitiveType.TriangleFan;
  277. case PrimitiveTopology.Quads:
  278. return PrimitiveType.Quads;
  279. case PrimitiveTopology.QuadStrip:
  280. return PrimitiveType.QuadStrip;
  281. case PrimitiveTopology.Polygon:
  282. return PrimitiveType.Polygon;
  283. case PrimitiveTopology.LinesAdjacency:
  284. return PrimitiveType.LinesAdjacency;
  285. case PrimitiveTopology.LineStripAdjacency:
  286. return PrimitiveType.LineStripAdjacency;
  287. case PrimitiveTopology.TrianglesAdjacency:
  288. return PrimitiveType.TrianglesAdjacency;
  289. case PrimitiveTopology.TriangleStripAdjacency:
  290. return PrimitiveType.TriangleStripAdjacency;
  291. case PrimitiveTopology.Patches:
  292. return PrimitiveType.Patches;
  293. }
  294. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(PrimitiveTopology)} enum value: {topology}.");
  295. return PrimitiveType.Points;
  296. }
  297. public static StencilOp Convert(this GAL.DepthStencil.StencilOp op)
  298. {
  299. switch (op)
  300. {
  301. case GAL.DepthStencil.StencilOp.Keep:
  302. return StencilOp.Keep;
  303. case GAL.DepthStencil.StencilOp.Zero:
  304. return StencilOp.Zero;
  305. case GAL.DepthStencil.StencilOp.Replace:
  306. return StencilOp.Replace;
  307. case GAL.DepthStencil.StencilOp.IncrementAndClamp:
  308. return StencilOp.Incr;
  309. case GAL.DepthStencil.StencilOp.DecrementAndClamp:
  310. return StencilOp.Decr;
  311. case GAL.DepthStencil.StencilOp.Invert:
  312. return StencilOp.Invert;
  313. case GAL.DepthStencil.StencilOp.IncrementAndWrap:
  314. return StencilOp.IncrWrap;
  315. case GAL.DepthStencil.StencilOp.DecrementAndWrap:
  316. return StencilOp.DecrWrap;
  317. }
  318. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(GAL.DepthStencil.StencilOp)} enum value: {op}.");
  319. return StencilOp.Keep;
  320. }
  321. public static All Convert(this SwizzleComponent swizzleComponent)
  322. {
  323. switch (swizzleComponent)
  324. {
  325. case SwizzleComponent.Zero:
  326. return All.Zero;
  327. case SwizzleComponent.One:
  328. return All.One;
  329. case SwizzleComponent.Red:
  330. return All.Red;
  331. case SwizzleComponent.Green:
  332. return All.Green;
  333. case SwizzleComponent.Blue:
  334. return All.Blue;
  335. case SwizzleComponent.Alpha:
  336. return All.Alpha;
  337. }
  338. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(SwizzleComponent)} enum value: {swizzleComponent}.");
  339. return All.Zero;
  340. }
  341. public static ImageTarget ConvertToImageTarget(this Target target)
  342. {
  343. return (ImageTarget)target.Convert();
  344. }
  345. public static TextureTarget Convert(this Target target)
  346. {
  347. switch (target)
  348. {
  349. case Target.Texture1D:
  350. return TextureTarget.Texture1D;
  351. case Target.Texture2D:
  352. return TextureTarget.Texture2D;
  353. case Target.Texture3D:
  354. return TextureTarget.Texture3D;
  355. case Target.Texture1DArray:
  356. return TextureTarget.Texture1DArray;
  357. case Target.Texture2DArray:
  358. return TextureTarget.Texture2DArray;
  359. case Target.Texture2DMultisample:
  360. return TextureTarget.Texture2DMultisample;
  361. case Target.Rectangle:
  362. return TextureTarget.TextureRectangle;
  363. case Target.Cubemap:
  364. return TextureTarget.TextureCubeMap;
  365. case Target.CubemapArray:
  366. return TextureTarget.TextureCubeMapArray;
  367. case Target.TextureBuffer:
  368. return TextureTarget.TextureBuffer;
  369. }
  370. Logger.PrintError(LogClass.Gpu, $"Invalid {nameof(Target)} enum value: {target}.");
  371. return TextureTarget.Texture2D;
  372. }
  373. }
  374. }