EnumConversion.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. using OpenTK.Graphics.OpenGL;
  2. using Ryujinx.Common.Logging;
  3. using Ryujinx.Graphics.GAL;
  4. using Ryujinx.Graphics.Shader;
  5. namespace Ryujinx.Graphics.OpenGL
  6. {
  7. static class EnumConversion
  8. {
  9. public static TextureWrapMode Convert(this AddressMode mode)
  10. {
  11. switch (mode)
  12. {
  13. case AddressMode.Clamp:
  14. return TextureWrapMode.Clamp;
  15. case AddressMode.Repeat:
  16. return TextureWrapMode.Repeat;
  17. case AddressMode.MirrorClamp:
  18. return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampExt;
  19. case AddressMode.MirrorClampToEdge:
  20. return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToEdgeExt;
  21. case AddressMode.MirrorClampToBorder:
  22. return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToBorderExt;
  23. case AddressMode.ClampToBorder:
  24. return TextureWrapMode.ClampToBorder;
  25. case AddressMode.MirroredRepeat:
  26. return TextureWrapMode.MirroredRepeat;
  27. case AddressMode.ClampToEdge:
  28. return TextureWrapMode.ClampToEdge;
  29. }
  30. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(AddressMode)} enum value: {mode}.");
  31. return TextureWrapMode.Clamp;
  32. }
  33. public static All Convert(this BlendFactor factor)
  34. {
  35. switch (factor)
  36. {
  37. case BlendFactor.Zero:
  38. case BlendFactor.ZeroGl:
  39. return All.Zero;
  40. case BlendFactor.One:
  41. case BlendFactor.OneGl:
  42. return All.One;
  43. case BlendFactor.SrcColor:
  44. case BlendFactor.SrcColorGl:
  45. return All.SrcColor;
  46. case BlendFactor.OneMinusSrcColor:
  47. case BlendFactor.OneMinusSrcColorGl:
  48. return All.OneMinusSrcColor;
  49. case BlendFactor.SrcAlpha:
  50. case BlendFactor.SrcAlphaGl:
  51. return All.SrcAlpha;
  52. case BlendFactor.OneMinusSrcAlpha:
  53. case BlendFactor.OneMinusSrcAlphaGl:
  54. return All.OneMinusSrcAlpha;
  55. case BlendFactor.DstAlpha:
  56. case BlendFactor.DstAlphaGl:
  57. return All.DstAlpha;
  58. case BlendFactor.OneMinusDstAlpha:
  59. case BlendFactor.OneMinusDstAlphaGl:
  60. return All.OneMinusDstAlpha;
  61. case BlendFactor.DstColor:
  62. case BlendFactor.DstColorGl:
  63. return All.DstColor;
  64. case BlendFactor.OneMinusDstColor:
  65. case BlendFactor.OneMinusDstColorGl:
  66. return All.OneMinusDstColor;
  67. case BlendFactor.SrcAlphaSaturate:
  68. case BlendFactor.SrcAlphaSaturateGl:
  69. return All.SrcAlphaSaturate;
  70. case BlendFactor.Src1Color:
  71. case BlendFactor.Src1ColorGl:
  72. return All.Src1Color;
  73. case BlendFactor.OneMinusSrc1Color:
  74. case BlendFactor.OneMinusSrc1ColorGl:
  75. return All.OneMinusSrc1Color;
  76. case BlendFactor.Src1Alpha:
  77. case BlendFactor.Src1AlphaGl:
  78. return All.Src1Alpha;
  79. case BlendFactor.OneMinusSrc1Alpha:
  80. case BlendFactor.OneMinusSrc1AlphaGl:
  81. return All.OneMinusSrc1Alpha;
  82. case BlendFactor.ConstantColor:
  83. return All.ConstantColor;
  84. case BlendFactor.OneMinusConstantColor:
  85. return All.OneMinusConstantColor;
  86. case BlendFactor.ConstantAlpha:
  87. return All.ConstantAlpha;
  88. case BlendFactor.OneMinusConstantAlpha:
  89. return All.OneMinusConstantAlpha;
  90. }
  91. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(BlendFactor)} enum value: {factor}.");
  92. return All.Zero;
  93. }
  94. public static BlendEquationMode Convert(this BlendOp op)
  95. {
  96. switch (op)
  97. {
  98. case BlendOp.Add:
  99. case BlendOp.AddGl:
  100. return BlendEquationMode.FuncAdd;
  101. case BlendOp.Minimum:
  102. case BlendOp.MinimumGl:
  103. return BlendEquationMode.Min;
  104. case BlendOp.Maximum:
  105. case BlendOp.MaximumGl:
  106. return BlendEquationMode.Max;
  107. case BlendOp.Subtract:
  108. case BlendOp.SubtractGl:
  109. return BlendEquationMode.FuncSubtract;
  110. case BlendOp.ReverseSubtract:
  111. case BlendOp.ReverseSubtractGl:
  112. return BlendEquationMode.FuncReverseSubtract;
  113. }
  114. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(BlendOp)} enum value: {op}.");
  115. return BlendEquationMode.FuncAdd;
  116. }
  117. public static TextureCompareMode Convert(this CompareMode mode)
  118. {
  119. switch (mode)
  120. {
  121. case CompareMode.None:
  122. return TextureCompareMode.None;
  123. case CompareMode.CompareRToTexture:
  124. return TextureCompareMode.CompareRToTexture;
  125. }
  126. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(CompareMode)} enum value: {mode}.");
  127. return TextureCompareMode.None;
  128. }
  129. public static All Convert(this CompareOp op)
  130. {
  131. switch (op)
  132. {
  133. case CompareOp.Never:
  134. case CompareOp.NeverGl:
  135. return All.Never;
  136. case CompareOp.Less:
  137. case CompareOp.LessGl:
  138. return All.Less;
  139. case CompareOp.Equal:
  140. case CompareOp.EqualGl:
  141. return All.Equal;
  142. case CompareOp.LessOrEqual:
  143. case CompareOp.LessOrEqualGl:
  144. return All.Lequal;
  145. case CompareOp.Greater:
  146. case CompareOp.GreaterGl:
  147. return All.Greater;
  148. case CompareOp.NotEqual:
  149. case CompareOp.NotEqualGl:
  150. return All.Notequal;
  151. case CompareOp.GreaterOrEqual:
  152. case CompareOp.GreaterOrEqualGl:
  153. return All.Gequal;
  154. case CompareOp.Always:
  155. case CompareOp.AlwaysGl:
  156. return All.Always;
  157. }
  158. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(CompareOp)} enum value: {op}.");
  159. return All.Never;
  160. }
  161. public static ClipDepthMode Convert(this DepthMode mode)
  162. {
  163. switch (mode)
  164. {
  165. case DepthMode.MinusOneToOne:
  166. return ClipDepthMode.NegativeOneToOne;
  167. case DepthMode.ZeroToOne:
  168. return ClipDepthMode.ZeroToOne;
  169. }
  170. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(DepthMode)} enum value: {mode}.");
  171. return ClipDepthMode.NegativeOneToOne;
  172. }
  173. public static All Convert(this DepthStencilMode mode)
  174. {
  175. switch (mode)
  176. {
  177. case DepthStencilMode.Depth:
  178. return All.DepthComponent;
  179. case DepthStencilMode.Stencil:
  180. return All.StencilIndex;
  181. }
  182. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(DepthStencilMode)} enum value: {mode}.");
  183. return All.Depth;
  184. }
  185. public static CullFaceMode Convert(this Face face)
  186. {
  187. switch (face)
  188. {
  189. case Face.Back:
  190. return CullFaceMode.Back;
  191. case Face.Front:
  192. return CullFaceMode.Front;
  193. case Face.FrontAndBack:
  194. return CullFaceMode.FrontAndBack;
  195. }
  196. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(Face)} enum value: {face}.");
  197. return CullFaceMode.Back;
  198. }
  199. public static FrontFaceDirection Convert(this FrontFace frontFace)
  200. {
  201. switch (frontFace)
  202. {
  203. case FrontFace.Clockwise:
  204. return FrontFaceDirection.Cw;
  205. case FrontFace.CounterClockwise:
  206. return FrontFaceDirection.Ccw;
  207. }
  208. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(FrontFace)} enum value: {frontFace}.");
  209. return FrontFaceDirection.Cw;
  210. }
  211. public static DrawElementsType Convert(this IndexType type)
  212. {
  213. switch (type)
  214. {
  215. case IndexType.UByte:
  216. return DrawElementsType.UnsignedByte;
  217. case IndexType.UShort:
  218. return DrawElementsType.UnsignedShort;
  219. case IndexType.UInt:
  220. return DrawElementsType.UnsignedInt;
  221. }
  222. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(IndexType)} enum value: {type}.");
  223. return DrawElementsType.UnsignedByte;
  224. }
  225. public static TextureMagFilter Convert(this MagFilter filter)
  226. {
  227. switch (filter)
  228. {
  229. case MagFilter.Nearest:
  230. return TextureMagFilter.Nearest;
  231. case MagFilter.Linear:
  232. return TextureMagFilter.Linear;
  233. }
  234. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(MagFilter)} enum value: {filter}.");
  235. return TextureMagFilter.Nearest;
  236. }
  237. public static TextureMinFilter Convert(this MinFilter filter)
  238. {
  239. switch (filter)
  240. {
  241. case MinFilter.Nearest:
  242. return TextureMinFilter.Nearest;
  243. case MinFilter.Linear:
  244. return TextureMinFilter.Linear;
  245. case MinFilter.NearestMipmapNearest:
  246. return TextureMinFilter.NearestMipmapNearest;
  247. case MinFilter.LinearMipmapNearest:
  248. return TextureMinFilter.LinearMipmapNearest;
  249. case MinFilter.NearestMipmapLinear:
  250. return TextureMinFilter.NearestMipmapLinear;
  251. case MinFilter.LinearMipmapLinear:
  252. return TextureMinFilter.LinearMipmapLinear;
  253. }
  254. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(MinFilter)} enum value: {filter}.");
  255. return TextureMinFilter.Nearest;
  256. }
  257. public static OpenTK.Graphics.OpenGL.PolygonMode Convert(this GAL.PolygonMode mode)
  258. {
  259. switch (mode)
  260. {
  261. case GAL.PolygonMode.Point:
  262. return OpenTK.Graphics.OpenGL.PolygonMode.Point;
  263. case GAL.PolygonMode.Line:
  264. return OpenTK.Graphics.OpenGL.PolygonMode.Line;
  265. case GAL.PolygonMode.Fill:
  266. return OpenTK.Graphics.OpenGL.PolygonMode.Fill;
  267. }
  268. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(GAL.PolygonMode)} enum value: {mode}.");
  269. return OpenTK.Graphics.OpenGL.PolygonMode.Fill;
  270. }
  271. public static PrimitiveType Convert(this PrimitiveTopology topology)
  272. {
  273. switch (topology)
  274. {
  275. case PrimitiveTopology.Points:
  276. return PrimitiveType.Points;
  277. case PrimitiveTopology.Lines:
  278. return PrimitiveType.Lines;
  279. case PrimitiveTopology.LineLoop:
  280. return PrimitiveType.LineLoop;
  281. case PrimitiveTopology.LineStrip:
  282. return PrimitiveType.LineStrip;
  283. case PrimitiveTopology.Triangles:
  284. return PrimitiveType.Triangles;
  285. case PrimitiveTopology.TriangleStrip:
  286. return PrimitiveType.TriangleStrip;
  287. case PrimitiveTopology.TriangleFan:
  288. return PrimitiveType.TriangleFan;
  289. case PrimitiveTopology.Quads:
  290. return PrimitiveType.Quads;
  291. case PrimitiveTopology.QuadStrip:
  292. return PrimitiveType.QuadStrip;
  293. case PrimitiveTopology.Polygon:
  294. return PrimitiveType.Polygon;
  295. case PrimitiveTopology.LinesAdjacency:
  296. return PrimitiveType.LinesAdjacency;
  297. case PrimitiveTopology.LineStripAdjacency:
  298. return PrimitiveType.LineStripAdjacency;
  299. case PrimitiveTopology.TrianglesAdjacency:
  300. return PrimitiveType.TrianglesAdjacency;
  301. case PrimitiveTopology.TriangleStripAdjacency:
  302. return PrimitiveType.TriangleStripAdjacency;
  303. case PrimitiveTopology.Patches:
  304. return PrimitiveType.Patches;
  305. }
  306. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(PrimitiveTopology)} enum value: {topology}.");
  307. return PrimitiveType.Points;
  308. }
  309. public static TransformFeedbackPrimitiveType ConvertToTfType(this PrimitiveTopology topology)
  310. {
  311. switch (topology)
  312. {
  313. case PrimitiveTopology.Points:
  314. return TransformFeedbackPrimitiveType.Points;
  315. case PrimitiveTopology.Lines:
  316. case PrimitiveTopology.LineLoop:
  317. case PrimitiveTopology.LineStrip:
  318. case PrimitiveTopology.LinesAdjacency:
  319. case PrimitiveTopology.LineStripAdjacency:
  320. return TransformFeedbackPrimitiveType.Lines;
  321. case PrimitiveTopology.Triangles:
  322. case PrimitiveTopology.TriangleStrip:
  323. case PrimitiveTopology.TriangleFan:
  324. case PrimitiveTopology.TrianglesAdjacency:
  325. case PrimitiveTopology.TriangleStripAdjacency:
  326. return TransformFeedbackPrimitiveType.Triangles;
  327. }
  328. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(PrimitiveTopology)} enum value: {topology}.");
  329. return TransformFeedbackPrimitiveType.Points;
  330. }
  331. public static OpenTK.Graphics.OpenGL.StencilOp Convert(this GAL.StencilOp op)
  332. {
  333. switch (op)
  334. {
  335. case GAL.StencilOp.Keep:
  336. case GAL.StencilOp.KeepGl:
  337. return OpenTK.Graphics.OpenGL.StencilOp.Keep;
  338. case GAL.StencilOp.Zero:
  339. case GAL.StencilOp.ZeroGl:
  340. return OpenTK.Graphics.OpenGL.StencilOp.Zero;
  341. case GAL.StencilOp.Replace:
  342. case GAL.StencilOp.ReplaceGl:
  343. return OpenTK.Graphics.OpenGL.StencilOp.Replace;
  344. case GAL.StencilOp.IncrementAndClamp:
  345. case GAL.StencilOp.IncrementAndClampGl:
  346. return OpenTK.Graphics.OpenGL.StencilOp.Incr;
  347. case GAL.StencilOp.DecrementAndClamp:
  348. case GAL.StencilOp.DecrementAndClampGl:
  349. return OpenTK.Graphics.OpenGL.StencilOp.Decr;
  350. case GAL.StencilOp.Invert:
  351. case GAL.StencilOp.InvertGl:
  352. return OpenTK.Graphics.OpenGL.StencilOp.Invert;
  353. case GAL.StencilOp.IncrementAndWrap:
  354. case GAL.StencilOp.IncrementAndWrapGl:
  355. return OpenTK.Graphics.OpenGL.StencilOp.IncrWrap;
  356. case GAL.StencilOp.DecrementAndWrap:
  357. case GAL.StencilOp.DecrementAndWrapGl:
  358. return OpenTK.Graphics.OpenGL.StencilOp.DecrWrap;
  359. }
  360. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(GAL.StencilOp)} enum value: {op}.");
  361. return OpenTK.Graphics.OpenGL.StencilOp.Keep;
  362. }
  363. public static All Convert(this SwizzleComponent swizzleComponent)
  364. {
  365. switch (swizzleComponent)
  366. {
  367. case SwizzleComponent.Zero:
  368. return All.Zero;
  369. case SwizzleComponent.One:
  370. return All.One;
  371. case SwizzleComponent.Red:
  372. return All.Red;
  373. case SwizzleComponent.Green:
  374. return All.Green;
  375. case SwizzleComponent.Blue:
  376. return All.Blue;
  377. case SwizzleComponent.Alpha:
  378. return All.Alpha;
  379. }
  380. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(SwizzleComponent)} enum value: {swizzleComponent}.");
  381. return All.Zero;
  382. }
  383. public static ImageTarget ConvertToImageTarget(this Target target)
  384. {
  385. return (ImageTarget)target.Convert();
  386. }
  387. public static TextureTarget Convert(this Target target)
  388. {
  389. switch (target)
  390. {
  391. case Target.Texture1D:
  392. return TextureTarget.Texture1D;
  393. case Target.Texture2D:
  394. return TextureTarget.Texture2D;
  395. case Target.Texture3D:
  396. return TextureTarget.Texture3D;
  397. case Target.Texture1DArray:
  398. return TextureTarget.Texture1DArray;
  399. case Target.Texture2DArray:
  400. return TextureTarget.Texture2DArray;
  401. case Target.Texture2DMultisample:
  402. return TextureTarget.Texture2DMultisample;
  403. case Target.Texture2DMultisampleArray:
  404. return TextureTarget.Texture2DMultisampleArray;
  405. case Target.Cubemap:
  406. return TextureTarget.TextureCubeMap;
  407. case Target.CubemapArray:
  408. return TextureTarget.TextureCubeMapArray;
  409. case Target.TextureBuffer:
  410. return TextureTarget.TextureBuffer;
  411. }
  412. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(Target)} enum value: {target}.");
  413. return TextureTarget.Texture2D;
  414. }
  415. public static NvViewportSwizzle Convert(this ViewportSwizzle swizzle)
  416. {
  417. switch (swizzle)
  418. {
  419. case ViewportSwizzle.PositiveX:
  420. return NvViewportSwizzle.ViewportSwizzlePositiveXNv;
  421. case ViewportSwizzle.PositiveY:
  422. return NvViewportSwizzle.ViewportSwizzlePositiveYNv;
  423. case ViewportSwizzle.PositiveZ:
  424. return NvViewportSwizzle.ViewportSwizzlePositiveZNv;
  425. case ViewportSwizzle.PositiveW:
  426. return NvViewportSwizzle.ViewportSwizzlePositiveWNv;
  427. case ViewportSwizzle.NegativeX:
  428. return NvViewportSwizzle.ViewportSwizzleNegativeXNv;
  429. case ViewportSwizzle.NegativeY:
  430. return NvViewportSwizzle.ViewportSwizzleNegativeYNv;
  431. case ViewportSwizzle.NegativeZ:
  432. return NvViewportSwizzle.ViewportSwizzleNegativeZNv;
  433. case ViewportSwizzle.NegativeW:
  434. return NvViewportSwizzle.ViewportSwizzleNegativeWNv;
  435. }
  436. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(ViewportSwizzle)} enum value: {swizzle}.");
  437. return NvViewportSwizzle.ViewportSwizzlePositiveXNv;
  438. }
  439. public static All Convert(this LogicalOp op)
  440. {
  441. switch (op)
  442. {
  443. case LogicalOp.Clear:
  444. return All.Clear;
  445. case LogicalOp.And:
  446. return All.And;
  447. case LogicalOp.AndReverse:
  448. return All.AndReverse;
  449. case LogicalOp.Copy:
  450. return All.Copy;
  451. case LogicalOp.AndInverted:
  452. return All.AndInverted;
  453. case LogicalOp.Noop:
  454. return All.Noop;
  455. case LogicalOp.Xor:
  456. return All.Xor;
  457. case LogicalOp.Or:
  458. return All.Or;
  459. case LogicalOp.Nor:
  460. return All.Nor;
  461. case LogicalOp.Equiv:
  462. return All.Equiv;
  463. case LogicalOp.Invert:
  464. return All.Invert;
  465. case LogicalOp.OrReverse:
  466. return All.OrReverse;
  467. case LogicalOp.CopyInverted:
  468. return All.CopyInverted;
  469. case LogicalOp.OrInverted:
  470. return All.OrInverted;
  471. case LogicalOp.Nand:
  472. return All.Nand;
  473. case LogicalOp.Set:
  474. return All.Set;
  475. }
  476. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(LogicalOp)} enum value: {op}.");
  477. return All.Never;
  478. }
  479. public static ShaderType Convert(this ShaderStage stage)
  480. {
  481. return stage switch
  482. {
  483. ShaderStage.Compute => ShaderType.ComputeShader,
  484. ShaderStage.Vertex => ShaderType.VertexShader,
  485. ShaderStage.TessellationControl => ShaderType.TessControlShader,
  486. ShaderStage.TessellationEvaluation => ShaderType.TessEvaluationShader,
  487. ShaderStage.Geometry => ShaderType.GeometryShader,
  488. ShaderStage.Fragment => ShaderType.FragmentShader,
  489. _ => ShaderType.VertexShader
  490. };
  491. }
  492. }
  493. }