/ src / Ryujinx.Graphics.OpenGL / EnumConversion.cs
EnumConversion.cs
  1  using OpenTK.Graphics.OpenGL;
  2  using Ryujinx.Common.Logging;
  3  using Ryujinx.Graphics.GAL;
  4  using Ryujinx.Graphics.Shader;
  5  
  6  namespace Ryujinx.Graphics.OpenGL
  7  {
  8      static class EnumConversion
  9      {
 10          public static TextureWrapMode Convert(this AddressMode mode)
 11          {
 12              switch (mode)
 13              {
 14                  case AddressMode.Clamp:
 15                      return TextureWrapMode.Clamp;
 16                  case AddressMode.Repeat:
 17                      return TextureWrapMode.Repeat;
 18                  case AddressMode.MirrorClamp:
 19                      return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampExt;
 20                  case AddressMode.MirrorClampToEdge:
 21                      return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToEdgeExt;
 22                  case AddressMode.MirrorClampToBorder:
 23                      return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToBorderExt;
 24                  case AddressMode.ClampToBorder:
 25                      return TextureWrapMode.ClampToBorder;
 26                  case AddressMode.MirroredRepeat:
 27                      return TextureWrapMode.MirroredRepeat;
 28                  case AddressMode.ClampToEdge:
 29                      return TextureWrapMode.ClampToEdge;
 30              }
 31  
 32              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(AddressMode)} enum value: {mode}.");
 33  
 34              return TextureWrapMode.Clamp;
 35          }
 36  
 37          public static NvBlendEquationAdvanced Convert(this AdvancedBlendOp op)
 38          {
 39              switch (op)
 40              {
 41                  case AdvancedBlendOp.Zero:
 42                      return NvBlendEquationAdvanced.Zero;
 43                  case AdvancedBlendOp.Src:
 44                      return NvBlendEquationAdvanced.SrcNv;
 45                  case AdvancedBlendOp.Dst:
 46                      return NvBlendEquationAdvanced.DstNv;
 47                  case AdvancedBlendOp.SrcOver:
 48                      return NvBlendEquationAdvanced.SrcOverNv;
 49                  case AdvancedBlendOp.DstOver:
 50                      return NvBlendEquationAdvanced.DstOverNv;
 51                  case AdvancedBlendOp.SrcIn:
 52                      return NvBlendEquationAdvanced.SrcInNv;
 53                  case AdvancedBlendOp.DstIn:
 54                      return NvBlendEquationAdvanced.DstInNv;
 55                  case AdvancedBlendOp.SrcOut:
 56                      return NvBlendEquationAdvanced.SrcOutNv;
 57                  case AdvancedBlendOp.DstOut:
 58                      return NvBlendEquationAdvanced.DstOutNv;
 59                  case AdvancedBlendOp.SrcAtop:
 60                      return NvBlendEquationAdvanced.SrcAtopNv;
 61                  case AdvancedBlendOp.DstAtop:
 62                      return NvBlendEquationAdvanced.DstAtopNv;
 63                  case AdvancedBlendOp.Xor:
 64                      return NvBlendEquationAdvanced.XorNv;
 65                  case AdvancedBlendOp.Plus:
 66                      return NvBlendEquationAdvanced.PlusNv;
 67                  case AdvancedBlendOp.PlusClamped:
 68                      return NvBlendEquationAdvanced.PlusClampedNv;
 69                  case AdvancedBlendOp.PlusClampedAlpha:
 70                      return NvBlendEquationAdvanced.PlusClampedAlphaNv;
 71                  case AdvancedBlendOp.PlusDarker:
 72                      return NvBlendEquationAdvanced.PlusDarkerNv;
 73                  case AdvancedBlendOp.Multiply:
 74                      return NvBlendEquationAdvanced.MultiplyNv;
 75                  case AdvancedBlendOp.Screen:
 76                      return NvBlendEquationAdvanced.ScreenNv;
 77                  case AdvancedBlendOp.Overlay:
 78                      return NvBlendEquationAdvanced.OverlayNv;
 79                  case AdvancedBlendOp.Darken:
 80                      return NvBlendEquationAdvanced.DarkenNv;
 81                  case AdvancedBlendOp.Lighten:
 82                      return NvBlendEquationAdvanced.LightenNv;
 83                  case AdvancedBlendOp.ColorDodge:
 84                      return NvBlendEquationAdvanced.ColordodgeNv;
 85                  case AdvancedBlendOp.ColorBurn:
 86                      return NvBlendEquationAdvanced.ColorburnNv;
 87                  case AdvancedBlendOp.HardLight:
 88                      return NvBlendEquationAdvanced.HardlightNv;
 89                  case AdvancedBlendOp.SoftLight:
 90                      return NvBlendEquationAdvanced.SoftlightNv;
 91                  case AdvancedBlendOp.Difference:
 92                      return NvBlendEquationAdvanced.DifferenceNv;
 93                  case AdvancedBlendOp.Minus:
 94                      return NvBlendEquationAdvanced.MinusNv;
 95                  case AdvancedBlendOp.MinusClamped:
 96                      return NvBlendEquationAdvanced.MinusClampedNv;
 97                  case AdvancedBlendOp.Exclusion:
 98                      return NvBlendEquationAdvanced.ExclusionNv;
 99                  case AdvancedBlendOp.Contrast:
100                      return NvBlendEquationAdvanced.ContrastNv;
101                  case AdvancedBlendOp.Invert:
102                      return NvBlendEquationAdvanced.Invert;
103                  case AdvancedBlendOp.InvertRGB:
104                      return NvBlendEquationAdvanced.InvertRgbNv;
105                  case AdvancedBlendOp.InvertOvg:
106                      return NvBlendEquationAdvanced.InvertOvgNv;
107                  case AdvancedBlendOp.LinearDodge:
108                      return NvBlendEquationAdvanced.LineardodgeNv;
109                  case AdvancedBlendOp.LinearBurn:
110                      return NvBlendEquationAdvanced.LinearburnNv;
111                  case AdvancedBlendOp.VividLight:
112                      return NvBlendEquationAdvanced.VividlightNv;
113                  case AdvancedBlendOp.LinearLight:
114                      return NvBlendEquationAdvanced.LinearlightNv;
115                  case AdvancedBlendOp.PinLight:
116                      return NvBlendEquationAdvanced.PinlightNv;
117                  case AdvancedBlendOp.HardMix:
118                      return NvBlendEquationAdvanced.HardmixNv;
119                  case AdvancedBlendOp.Red:
120                      return NvBlendEquationAdvanced.RedNv;
121                  case AdvancedBlendOp.Green:
122                      return NvBlendEquationAdvanced.GreenNv;
123                  case AdvancedBlendOp.Blue:
124                      return NvBlendEquationAdvanced.BlueNv;
125                  case AdvancedBlendOp.HslHue:
126                      return NvBlendEquationAdvanced.HslHueNv;
127                  case AdvancedBlendOp.HslSaturation:
128                      return NvBlendEquationAdvanced.HslSaturationNv;
129                  case AdvancedBlendOp.HslColor:
130                      return NvBlendEquationAdvanced.HslColorNv;
131                  case AdvancedBlendOp.HslLuminosity:
132                      return NvBlendEquationAdvanced.HslLuminosityNv;
133              }
134  
135              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(AdvancedBlendOp)} enum value: {op}.");
136  
137              return NvBlendEquationAdvanced.Zero;
138          }
139  
140          public static All Convert(this AdvancedBlendOverlap overlap)
141          {
142              switch (overlap)
143              {
144                  case AdvancedBlendOverlap.Uncorrelated:
145                      return All.UncorrelatedNv;
146                  case AdvancedBlendOverlap.Disjoint:
147                      return All.DisjointNv;
148                  case AdvancedBlendOverlap.Conjoint:
149                      return All.ConjointNv;
150              }
151  
152              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(AdvancedBlendOverlap)} enum value: {overlap}.");
153  
154              return All.UncorrelatedNv;
155          }
156  
157          public static All Convert(this BlendFactor factor)
158          {
159              switch (factor)
160              {
161                  case BlendFactor.Zero:
162                  case BlendFactor.ZeroGl:
163                      return All.Zero;
164                  case BlendFactor.One:
165                  case BlendFactor.OneGl:
166                      return All.One;
167                  case BlendFactor.SrcColor:
168                  case BlendFactor.SrcColorGl:
169                      return All.SrcColor;
170                  case BlendFactor.OneMinusSrcColor:
171                  case BlendFactor.OneMinusSrcColorGl:
172                      return All.OneMinusSrcColor;
173                  case BlendFactor.SrcAlpha:
174                  case BlendFactor.SrcAlphaGl:
175                      return All.SrcAlpha;
176                  case BlendFactor.OneMinusSrcAlpha:
177                  case BlendFactor.OneMinusSrcAlphaGl:
178                      return All.OneMinusSrcAlpha;
179                  case BlendFactor.DstAlpha:
180                  case BlendFactor.DstAlphaGl:
181                      return All.DstAlpha;
182                  case BlendFactor.OneMinusDstAlpha:
183                  case BlendFactor.OneMinusDstAlphaGl:
184                      return All.OneMinusDstAlpha;
185                  case BlendFactor.DstColor:
186                  case BlendFactor.DstColorGl:
187                      return All.DstColor;
188                  case BlendFactor.OneMinusDstColor:
189                  case BlendFactor.OneMinusDstColorGl:
190                      return All.OneMinusDstColor;
191                  case BlendFactor.SrcAlphaSaturate:
192                  case BlendFactor.SrcAlphaSaturateGl:
193                      return All.SrcAlphaSaturate;
194                  case BlendFactor.Src1Color:
195                  case BlendFactor.Src1ColorGl:
196                      return All.Src1Color;
197                  case BlendFactor.OneMinusSrc1Color:
198                  case BlendFactor.OneMinusSrc1ColorGl:
199                      return All.OneMinusSrc1Color;
200                  case BlendFactor.Src1Alpha:
201                  case BlendFactor.Src1AlphaGl:
202                      return All.Src1Alpha;
203                  case BlendFactor.OneMinusSrc1Alpha:
204                  case BlendFactor.OneMinusSrc1AlphaGl:
205                      return All.OneMinusSrc1Alpha;
206                  case BlendFactor.ConstantColor:
207                      return All.ConstantColor;
208                  case BlendFactor.OneMinusConstantColor:
209                      return All.OneMinusConstantColor;
210                  case BlendFactor.ConstantAlpha:
211                      return All.ConstantAlpha;
212                  case BlendFactor.OneMinusConstantAlpha:
213                      return All.OneMinusConstantAlpha;
214              }
215  
216              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(BlendFactor)} enum value: {factor}.");
217  
218              return All.Zero;
219          }
220  
221          public static BlendEquationMode Convert(this BlendOp op)
222          {
223              switch (op)
224              {
225                  case BlendOp.Add:
226                  case BlendOp.AddGl:
227                      return BlendEquationMode.FuncAdd;
228                  case BlendOp.Minimum:
229                  case BlendOp.MinimumGl:
230                      return BlendEquationMode.Min;
231                  case BlendOp.Maximum:
232                  case BlendOp.MaximumGl:
233                      return BlendEquationMode.Max;
234                  case BlendOp.Subtract:
235                  case BlendOp.SubtractGl:
236                      return BlendEquationMode.FuncSubtract;
237                  case BlendOp.ReverseSubtract:
238                  case BlendOp.ReverseSubtractGl:
239                      return BlendEquationMode.FuncReverseSubtract;
240              }
241  
242              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(BlendOp)} enum value: {op}.");
243  
244              return BlendEquationMode.FuncAdd;
245          }
246  
247          public static TextureCompareMode Convert(this CompareMode mode)
248          {
249              switch (mode)
250              {
251                  case CompareMode.None:
252                      return TextureCompareMode.None;
253                  case CompareMode.CompareRToTexture:
254                      return TextureCompareMode.CompareRToTexture;
255              }
256  
257              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(CompareMode)} enum value: {mode}.");
258  
259              return TextureCompareMode.None;
260          }
261  
262          public static All Convert(this CompareOp op)
263          {
264              switch (op)
265              {
266                  case CompareOp.Never:
267                  case CompareOp.NeverGl:
268                      return All.Never;
269                  case CompareOp.Less:
270                  case CompareOp.LessGl:
271                      return All.Less;
272                  case CompareOp.Equal:
273                  case CompareOp.EqualGl:
274                      return All.Equal;
275                  case CompareOp.LessOrEqual:
276                  case CompareOp.LessOrEqualGl:
277                      return All.Lequal;
278                  case CompareOp.Greater:
279                  case CompareOp.GreaterGl:
280                      return All.Greater;
281                  case CompareOp.NotEqual:
282                  case CompareOp.NotEqualGl:
283                      return All.Notequal;
284                  case CompareOp.GreaterOrEqual:
285                  case CompareOp.GreaterOrEqualGl:
286                      return All.Gequal;
287                  case CompareOp.Always:
288                  case CompareOp.AlwaysGl:
289                      return All.Always;
290              }
291  
292              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(CompareOp)} enum value: {op}.");
293  
294              return All.Never;
295          }
296  
297          public static ClipDepthMode Convert(this DepthMode mode)
298          {
299              switch (mode)
300              {
301                  case DepthMode.MinusOneToOne:
302                      return ClipDepthMode.NegativeOneToOne;
303                  case DepthMode.ZeroToOne:
304                      return ClipDepthMode.ZeroToOne;
305              }
306  
307              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(DepthMode)} enum value: {mode}.");
308  
309              return ClipDepthMode.NegativeOneToOne;
310          }
311  
312          public static All Convert(this DepthStencilMode mode)
313          {
314              switch (mode)
315              {
316                  case DepthStencilMode.Depth:
317                      return All.DepthComponent;
318                  case DepthStencilMode.Stencil:
319                      return All.StencilIndex;
320              }
321  
322              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(DepthStencilMode)} enum value: {mode}.");
323  
324              return All.Depth;
325          }
326  
327          public static CullFaceMode Convert(this Face face)
328          {
329              switch (face)
330              {
331                  case Face.Back:
332                      return CullFaceMode.Back;
333                  case Face.Front:
334                      return CullFaceMode.Front;
335                  case Face.FrontAndBack:
336                      return CullFaceMode.FrontAndBack;
337              }
338  
339              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(Face)} enum value: {face}.");
340  
341              return CullFaceMode.Back;
342          }
343  
344          public static FrontFaceDirection Convert(this FrontFace frontFace)
345          {
346              switch (frontFace)
347              {
348                  case FrontFace.Clockwise:
349                      return FrontFaceDirection.Cw;
350                  case FrontFace.CounterClockwise:
351                      return FrontFaceDirection.Ccw;
352              }
353  
354              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(FrontFace)} enum value: {frontFace}.");
355  
356              return FrontFaceDirection.Cw;
357          }
358  
359          public static DrawElementsType Convert(this IndexType type)
360          {
361              switch (type)
362              {
363                  case IndexType.UByte:
364                      return DrawElementsType.UnsignedByte;
365                  case IndexType.UShort:
366                      return DrawElementsType.UnsignedShort;
367                  case IndexType.UInt:
368                      return DrawElementsType.UnsignedInt;
369              }
370  
371              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(IndexType)} enum value: {type}.");
372  
373              return DrawElementsType.UnsignedByte;
374          }
375  
376          public static TextureMagFilter Convert(this MagFilter filter)
377          {
378              switch (filter)
379              {
380                  case MagFilter.Nearest:
381                      return TextureMagFilter.Nearest;
382                  case MagFilter.Linear:
383                      return TextureMagFilter.Linear;
384              }
385  
386              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(MagFilter)} enum value: {filter}.");
387  
388              return TextureMagFilter.Nearest;
389          }
390  
391          public static TextureMinFilter Convert(this MinFilter filter)
392          {
393              switch (filter)
394              {
395                  case MinFilter.Nearest:
396                      return TextureMinFilter.Nearest;
397                  case MinFilter.Linear:
398                      return TextureMinFilter.Linear;
399                  case MinFilter.NearestMipmapNearest:
400                      return TextureMinFilter.NearestMipmapNearest;
401                  case MinFilter.LinearMipmapNearest:
402                      return TextureMinFilter.LinearMipmapNearest;
403                  case MinFilter.NearestMipmapLinear:
404                      return TextureMinFilter.NearestMipmapLinear;
405                  case MinFilter.LinearMipmapLinear:
406                      return TextureMinFilter.LinearMipmapLinear;
407              }
408  
409              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(MinFilter)} enum value: {filter}.");
410  
411              return TextureMinFilter.Nearest;
412          }
413  
414          public static OpenTK.Graphics.OpenGL.PolygonMode Convert(this GAL.PolygonMode mode)
415          {
416              switch (mode)
417              {
418                  case GAL.PolygonMode.Point:
419                      return OpenTK.Graphics.OpenGL.PolygonMode.Point;
420                  case GAL.PolygonMode.Line:
421                      return OpenTK.Graphics.OpenGL.PolygonMode.Line;
422                  case GAL.PolygonMode.Fill:
423                      return OpenTK.Graphics.OpenGL.PolygonMode.Fill;
424              }
425  
426              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(GAL.PolygonMode)} enum value: {mode}.");
427  
428              return OpenTK.Graphics.OpenGL.PolygonMode.Fill;
429          }
430  
431          public static PrimitiveType Convert(this PrimitiveTopology topology)
432          {
433              switch (topology)
434              {
435                  case PrimitiveTopology.Points:
436                      return PrimitiveType.Points;
437                  case PrimitiveTopology.Lines:
438                      return PrimitiveType.Lines;
439                  case PrimitiveTopology.LineLoop:
440                      return PrimitiveType.LineLoop;
441                  case PrimitiveTopology.LineStrip:
442                      return PrimitiveType.LineStrip;
443                  case PrimitiveTopology.Triangles:
444                      return PrimitiveType.Triangles;
445                  case PrimitiveTopology.TriangleStrip:
446                      return PrimitiveType.TriangleStrip;
447                  case PrimitiveTopology.TriangleFan:
448                      return PrimitiveType.TriangleFan;
449                  case PrimitiveTopology.Quads:
450                      return PrimitiveType.Quads;
451                  case PrimitiveTopology.QuadStrip:
452                      return PrimitiveType.QuadStrip;
453                  case PrimitiveTopology.Polygon:
454                      return PrimitiveType.TriangleFan;
455                  case PrimitiveTopology.LinesAdjacency:
456                      return PrimitiveType.LinesAdjacency;
457                  case PrimitiveTopology.LineStripAdjacency:
458                      return PrimitiveType.LineStripAdjacency;
459                  case PrimitiveTopology.TrianglesAdjacency:
460                      return PrimitiveType.TrianglesAdjacency;
461                  case PrimitiveTopology.TriangleStripAdjacency:
462                      return PrimitiveType.TriangleStripAdjacency;
463                  case PrimitiveTopology.Patches:
464                      return PrimitiveType.Patches;
465              }
466  
467              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(PrimitiveTopology)} enum value: {topology}.");
468  
469              return PrimitiveType.Points;
470          }
471  
472          public static TransformFeedbackPrimitiveType ConvertToTfType(this PrimitiveTopology topology)
473          {
474              switch (topology)
475              {
476                  case PrimitiveTopology.Points:
477                      return TransformFeedbackPrimitiveType.Points;
478                  case PrimitiveTopology.Lines:
479                  case PrimitiveTopology.LineLoop:
480                  case PrimitiveTopology.LineStrip:
481                  case PrimitiveTopology.LinesAdjacency:
482                  case PrimitiveTopology.LineStripAdjacency:
483                      return TransformFeedbackPrimitiveType.Lines;
484                  case PrimitiveTopology.Triangles:
485                  case PrimitiveTopology.TriangleStrip:
486                  case PrimitiveTopology.TriangleFan:
487                  case PrimitiveTopology.TrianglesAdjacency:
488                  case PrimitiveTopology.TriangleStripAdjacency:
489                      return TransformFeedbackPrimitiveType.Triangles;
490              }
491  
492              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(PrimitiveTopology)} enum value: {topology}.");
493  
494              return TransformFeedbackPrimitiveType.Points;
495          }
496  
497          public static OpenTK.Graphics.OpenGL.StencilOp Convert(this GAL.StencilOp op)
498          {
499              switch (op)
500              {
501                  case GAL.StencilOp.Keep:
502                  case GAL.StencilOp.KeepGl:
503                      return OpenTK.Graphics.OpenGL.StencilOp.Keep;
504                  case GAL.StencilOp.Zero:
505                  case GAL.StencilOp.ZeroGl:
506                      return OpenTK.Graphics.OpenGL.StencilOp.Zero;
507                  case GAL.StencilOp.Replace:
508                  case GAL.StencilOp.ReplaceGl:
509                      return OpenTK.Graphics.OpenGL.StencilOp.Replace;
510                  case GAL.StencilOp.IncrementAndClamp:
511                  case GAL.StencilOp.IncrementAndClampGl:
512                      return OpenTK.Graphics.OpenGL.StencilOp.Incr;
513                  case GAL.StencilOp.DecrementAndClamp:
514                  case GAL.StencilOp.DecrementAndClampGl:
515                      return OpenTK.Graphics.OpenGL.StencilOp.Decr;
516                  case GAL.StencilOp.Invert:
517                  case GAL.StencilOp.InvertGl:
518                      return OpenTK.Graphics.OpenGL.StencilOp.Invert;
519                  case GAL.StencilOp.IncrementAndWrap:
520                  case GAL.StencilOp.IncrementAndWrapGl:
521                      return OpenTK.Graphics.OpenGL.StencilOp.IncrWrap;
522                  case GAL.StencilOp.DecrementAndWrap:
523                  case GAL.StencilOp.DecrementAndWrapGl:
524                      return OpenTK.Graphics.OpenGL.StencilOp.DecrWrap;
525              }
526  
527              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(GAL.StencilOp)} enum value: {op}.");
528  
529              return OpenTK.Graphics.OpenGL.StencilOp.Keep;
530          }
531  
532          public static All Convert(this SwizzleComponent swizzleComponent)
533          {
534              switch (swizzleComponent)
535              {
536                  case SwizzleComponent.Zero:
537                      return All.Zero;
538                  case SwizzleComponent.One:
539                      return All.One;
540                  case SwizzleComponent.Red:
541                      return All.Red;
542                  case SwizzleComponent.Green:
543                      return All.Green;
544                  case SwizzleComponent.Blue:
545                      return All.Blue;
546                  case SwizzleComponent.Alpha:
547                      return All.Alpha;
548              }
549  
550              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(SwizzleComponent)} enum value: {swizzleComponent}.");
551  
552              return All.Zero;
553          }
554  
555          public static ImageTarget ConvertToImageTarget(this Target target)
556          {
557              return (ImageTarget)target.Convert();
558          }
559  
560          public static TextureTarget Convert(this Target target)
561          {
562              switch (target)
563              {
564                  case Target.Texture1D:
565                      return TextureTarget.Texture1D;
566                  case Target.Texture2D:
567                      return TextureTarget.Texture2D;
568                  case Target.Texture3D:
569                      return TextureTarget.Texture3D;
570                  case Target.Texture1DArray:
571                      return TextureTarget.Texture1DArray;
572                  case Target.Texture2DArray:
573                      return TextureTarget.Texture2DArray;
574                  case Target.Texture2DMultisample:
575                      return TextureTarget.Texture2DMultisample;
576                  case Target.Texture2DMultisampleArray:
577                      return TextureTarget.Texture2DMultisampleArray;
578                  case Target.Cubemap:
579                      return TextureTarget.TextureCubeMap;
580                  case Target.CubemapArray:
581                      return TextureTarget.TextureCubeMapArray;
582                  case Target.TextureBuffer:
583                      return TextureTarget.TextureBuffer;
584              }
585  
586              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(Target)} enum value: {target}.");
587  
588              return TextureTarget.Texture2D;
589          }
590  
591          public static NvViewportSwizzle Convert(this ViewportSwizzle swizzle)
592          {
593              switch (swizzle)
594              {
595                  case ViewportSwizzle.PositiveX:
596                      return NvViewportSwizzle.ViewportSwizzlePositiveXNv;
597                  case ViewportSwizzle.PositiveY:
598                      return NvViewportSwizzle.ViewportSwizzlePositiveYNv;
599                  case ViewportSwizzle.PositiveZ:
600                      return NvViewportSwizzle.ViewportSwizzlePositiveZNv;
601                  case ViewportSwizzle.PositiveW:
602                      return NvViewportSwizzle.ViewportSwizzlePositiveWNv;
603                  case ViewportSwizzle.NegativeX:
604                      return NvViewportSwizzle.ViewportSwizzleNegativeXNv;
605                  case ViewportSwizzle.NegativeY:
606                      return NvViewportSwizzle.ViewportSwizzleNegativeYNv;
607                  case ViewportSwizzle.NegativeZ:
608                      return NvViewportSwizzle.ViewportSwizzleNegativeZNv;
609                  case ViewportSwizzle.NegativeW:
610                      return NvViewportSwizzle.ViewportSwizzleNegativeWNv;
611              }
612  
613              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(ViewportSwizzle)} enum value: {swizzle}.");
614  
615              return NvViewportSwizzle.ViewportSwizzlePositiveXNv;
616          }
617  
618          public static All Convert(this LogicalOp op)
619          {
620              switch (op)
621              {
622                  case LogicalOp.Clear:
623                      return All.Clear;
624                  case LogicalOp.And:
625                      return All.And;
626                  case LogicalOp.AndReverse:
627                      return All.AndReverse;
628                  case LogicalOp.Copy:
629                      return All.Copy;
630                  case LogicalOp.AndInverted:
631                      return All.AndInverted;
632                  case LogicalOp.Noop:
633                      return All.Noop;
634                  case LogicalOp.Xor:
635                      return All.Xor;
636                  case LogicalOp.Or:
637                      return All.Or;
638                  case LogicalOp.Nor:
639                      return All.Nor;
640                  case LogicalOp.Equiv:
641                      return All.Equiv;
642                  case LogicalOp.Invert:
643                      return All.Invert;
644                  case LogicalOp.OrReverse:
645                      return All.OrReverse;
646                  case LogicalOp.CopyInverted:
647                      return All.CopyInverted;
648                  case LogicalOp.OrInverted:
649                      return All.OrInverted;
650                  case LogicalOp.Nand:
651                      return All.Nand;
652                  case LogicalOp.Set:
653                      return All.Set;
654              }
655  
656              Logger.Debug?.Print(LogClass.Gpu, $"Invalid {nameof(LogicalOp)} enum value: {op}.");
657  
658              return All.Never;
659          }
660  
661          public static ShaderType Convert(this ShaderStage stage)
662          {
663              return stage switch
664              {
665                  ShaderStage.Compute => ShaderType.ComputeShader,
666                  ShaderStage.Vertex => ShaderType.VertexShader,
667                  ShaderStage.TessellationControl => ShaderType.TessControlShader,
668                  ShaderStage.TessellationEvaluation => ShaderType.TessEvaluationShader,
669                  ShaderStage.Geometry => ShaderType.GeometryShader,
670                  ShaderStage.Fragment => ShaderType.FragmentShader,
671                  _ => ShaderType.VertexShader,
672              };
673          }
674      }
675  }