EnumConversion.cs 20 KB

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