EnumConversion.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  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 OpenTK.Graphics.OpenGL.PolygonMode Convert(this GAL.PolygonMode mode)
  257. {
  258. switch (mode)
  259. {
  260. case GAL.PolygonMode.Point:
  261. return OpenTK.Graphics.OpenGL.PolygonMode.Point;
  262. case GAL.PolygonMode.Line:
  263. return OpenTK.Graphics.OpenGL.PolygonMode.Line;
  264. case GAL.PolygonMode.Fill:
  265. return OpenTK.Graphics.OpenGL.PolygonMode.Fill;
  266. }
  267. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(GAL.PolygonMode)} enum value: {mode}.");
  268. return OpenTK.Graphics.OpenGL.PolygonMode.Fill;
  269. }
  270. public static PrimitiveType Convert(this PrimitiveTopology topology)
  271. {
  272. switch (topology)
  273. {
  274. case PrimitiveTopology.Points:
  275. return PrimitiveType.Points;
  276. case PrimitiveTopology.Lines:
  277. return PrimitiveType.Lines;
  278. case PrimitiveTopology.LineLoop:
  279. return PrimitiveType.LineLoop;
  280. case PrimitiveTopology.LineStrip:
  281. return PrimitiveType.LineStrip;
  282. case PrimitiveTopology.Triangles:
  283. return PrimitiveType.Triangles;
  284. case PrimitiveTopology.TriangleStrip:
  285. return PrimitiveType.TriangleStrip;
  286. case PrimitiveTopology.TriangleFan:
  287. return PrimitiveType.TriangleFan;
  288. case PrimitiveTopology.Quads:
  289. return PrimitiveType.Quads;
  290. case PrimitiveTopology.QuadStrip:
  291. return PrimitiveType.QuadStrip;
  292. case PrimitiveTopology.Polygon:
  293. return PrimitiveType.Polygon;
  294. case PrimitiveTopology.LinesAdjacency:
  295. return PrimitiveType.LinesAdjacency;
  296. case PrimitiveTopology.LineStripAdjacency:
  297. return PrimitiveType.LineStripAdjacency;
  298. case PrimitiveTopology.TrianglesAdjacency:
  299. return PrimitiveType.TrianglesAdjacency;
  300. case PrimitiveTopology.TriangleStripAdjacency:
  301. return PrimitiveType.TriangleStripAdjacency;
  302. case PrimitiveTopology.Patches:
  303. return PrimitiveType.Patches;
  304. }
  305. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(PrimitiveTopology)} enum value: {topology}.");
  306. return PrimitiveType.Points;
  307. }
  308. public static TransformFeedbackPrimitiveType ConvertToTfType(this PrimitiveTopology topology)
  309. {
  310. switch (topology)
  311. {
  312. case PrimitiveTopology.Points:
  313. return TransformFeedbackPrimitiveType.Points;
  314. case PrimitiveTopology.Lines:
  315. case PrimitiveTopology.LineLoop:
  316. case PrimitiveTopology.LineStrip:
  317. case PrimitiveTopology.LinesAdjacency:
  318. case PrimitiveTopology.LineStripAdjacency:
  319. return TransformFeedbackPrimitiveType.Lines;
  320. case PrimitiveTopology.Triangles:
  321. case PrimitiveTopology.TriangleStrip:
  322. case PrimitiveTopology.TriangleFan:
  323. case PrimitiveTopology.TrianglesAdjacency:
  324. case PrimitiveTopology.TriangleStripAdjacency:
  325. return TransformFeedbackPrimitiveType.Triangles;
  326. }
  327. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(PrimitiveTopology)} enum value: {topology}.");
  328. return TransformFeedbackPrimitiveType.Points;
  329. }
  330. public static OpenTK.Graphics.OpenGL.StencilOp Convert(this GAL.StencilOp op)
  331. {
  332. switch (op)
  333. {
  334. case GAL.StencilOp.Keep:
  335. return OpenTK.Graphics.OpenGL.StencilOp.Keep;
  336. case GAL.StencilOp.Zero:
  337. return OpenTK.Graphics.OpenGL.StencilOp.Zero;
  338. case GAL.StencilOp.Replace:
  339. return OpenTK.Graphics.OpenGL.StencilOp.Replace;
  340. case GAL.StencilOp.IncrementAndClamp:
  341. return OpenTK.Graphics.OpenGL.StencilOp.Incr;
  342. case GAL.StencilOp.DecrementAndClamp:
  343. return OpenTK.Graphics.OpenGL.StencilOp.Decr;
  344. case GAL.StencilOp.Invert:
  345. return OpenTK.Graphics.OpenGL.StencilOp.Invert;
  346. case GAL.StencilOp.IncrementAndWrap:
  347. return OpenTK.Graphics.OpenGL.StencilOp.IncrWrap;
  348. case GAL.StencilOp.DecrementAndWrap:
  349. return OpenTK.Graphics.OpenGL.StencilOp.DecrWrap;
  350. }
  351. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(GAL.StencilOp)} enum value: {op}.");
  352. return OpenTK.Graphics.OpenGL.StencilOp.Keep;
  353. }
  354. public static All Convert(this SwizzleComponent swizzleComponent)
  355. {
  356. switch (swizzleComponent)
  357. {
  358. case SwizzleComponent.Zero:
  359. return All.Zero;
  360. case SwizzleComponent.One:
  361. return All.One;
  362. case SwizzleComponent.Red:
  363. return All.Red;
  364. case SwizzleComponent.Green:
  365. return All.Green;
  366. case SwizzleComponent.Blue:
  367. return All.Blue;
  368. case SwizzleComponent.Alpha:
  369. return All.Alpha;
  370. }
  371. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(SwizzleComponent)} enum value: {swizzleComponent}.");
  372. return All.Zero;
  373. }
  374. public static ImageTarget ConvertToImageTarget(this Target target)
  375. {
  376. return (ImageTarget)target.Convert();
  377. }
  378. public static TextureTarget Convert(this Target target)
  379. {
  380. switch (target)
  381. {
  382. case Target.Texture1D:
  383. return TextureTarget.Texture1D;
  384. case Target.Texture2D:
  385. return TextureTarget.Texture2D;
  386. case Target.Texture3D:
  387. return TextureTarget.Texture3D;
  388. case Target.Texture1DArray:
  389. return TextureTarget.Texture1DArray;
  390. case Target.Texture2DArray:
  391. return TextureTarget.Texture2DArray;
  392. case Target.Texture2DMultisample:
  393. return TextureTarget.Texture2DMultisample;
  394. case Target.Rectangle:
  395. return TextureTarget.TextureRectangle;
  396. case Target.Cubemap:
  397. return TextureTarget.TextureCubeMap;
  398. case Target.CubemapArray:
  399. return TextureTarget.TextureCubeMapArray;
  400. case Target.TextureBuffer:
  401. return TextureTarget.TextureBuffer;
  402. }
  403. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(Target)} enum value: {target}.");
  404. return TextureTarget.Texture2D;
  405. }
  406. public static NvViewportSwizzle Convert(this ViewportSwizzle swizzle)
  407. {
  408. switch (swizzle)
  409. {
  410. case ViewportSwizzle.PositiveX:
  411. return NvViewportSwizzle.ViewportSwizzlePositiveXNv;
  412. case ViewportSwizzle.PositiveY:
  413. return NvViewportSwizzle.ViewportSwizzlePositiveYNv;
  414. case ViewportSwizzle.PositiveZ:
  415. return NvViewportSwizzle.ViewportSwizzlePositiveZNv;
  416. case ViewportSwizzle.PositiveW:
  417. return NvViewportSwizzle.ViewportSwizzlePositiveWNv;
  418. case ViewportSwizzle.NegativeX:
  419. return NvViewportSwizzle.ViewportSwizzleNegativeXNv;
  420. case ViewportSwizzle.NegativeY:
  421. return NvViewportSwizzle.ViewportSwizzleNegativeYNv;
  422. case ViewportSwizzle.NegativeZ:
  423. return NvViewportSwizzle.ViewportSwizzleNegativeZNv;
  424. case ViewportSwizzle.NegativeW:
  425. return NvViewportSwizzle.ViewportSwizzleNegativeWNv;
  426. }
  427. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(ViewportSwizzle)} enum value: {swizzle}.");
  428. return NvViewportSwizzle.ViewportSwizzlePositiveXNv;
  429. }
  430. public static All Convert(this LogicalOp op)
  431. {
  432. switch (op)
  433. {
  434. case LogicalOp.Clear:
  435. return All.Clear;
  436. case LogicalOp.And:
  437. return All.And;
  438. case LogicalOp.AndReverse:
  439. return All.AndReverse;
  440. case LogicalOp.Copy:
  441. return All.Copy;
  442. case LogicalOp.AndInverted:
  443. return All.AndInverted;
  444. case LogicalOp.Noop:
  445. return All.Noop;
  446. case LogicalOp.Xor:
  447. return All.Xor;
  448. case LogicalOp.Or:
  449. return All.Or;
  450. case LogicalOp.Nor:
  451. return All.Nor;
  452. case LogicalOp.Equiv:
  453. return All.Equiv;
  454. case LogicalOp.Invert:
  455. return All.Invert;
  456. case LogicalOp.OrReverse:
  457. return All.OrReverse;
  458. case LogicalOp.CopyInverted:
  459. return All.CopyInverted;
  460. case LogicalOp.OrInverted:
  461. return All.OrInverted;
  462. case LogicalOp.Nand:
  463. return All.Nand;
  464. case LogicalOp.Set:
  465. return All.Set;
  466. }
  467. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(LogicalOp)} enum value: {op}.");
  468. return All.Never;
  469. }
  470. }
  471. }