EnumConversion.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. using Ryujinx.Common.Logging;
  2. using Ryujinx.Graphics.GAL;
  3. using Ryujinx.Graphics.Shader;
  4. using Silk.NET.Vulkan;
  5. using System;
  6. namespace Ryujinx.Graphics.Vulkan
  7. {
  8. static class EnumConversion
  9. {
  10. public static ShaderStageFlags Convert(this ShaderStage stage)
  11. {
  12. return stage switch
  13. {
  14. ShaderStage.Vertex => ShaderStageFlags.VertexBit,
  15. ShaderStage.Geometry => ShaderStageFlags.GeometryBit,
  16. ShaderStage.TessellationControl => ShaderStageFlags.TessellationControlBit,
  17. ShaderStage.TessellationEvaluation => ShaderStageFlags.TessellationEvaluationBit,
  18. ShaderStage.Fragment => ShaderStageFlags.FragmentBit,
  19. ShaderStage.Compute => ShaderStageFlags.ComputeBit,
  20. _ => LogInvalidAndReturn(stage, nameof(ShaderStage), (ShaderStageFlags)0)
  21. };
  22. }
  23. public static PipelineStageFlags ConvertToPipelineStageFlags(this ShaderStage stage)
  24. {
  25. return stage switch
  26. {
  27. ShaderStage.Vertex => PipelineStageFlags.VertexShaderBit,
  28. ShaderStage.Geometry => PipelineStageFlags.GeometryShaderBit,
  29. ShaderStage.TessellationControl => PipelineStageFlags.TessellationControlShaderBit,
  30. ShaderStage.TessellationEvaluation => PipelineStageFlags.TessellationEvaluationShaderBit,
  31. ShaderStage.Fragment => PipelineStageFlags.FragmentShaderBit,
  32. ShaderStage.Compute => PipelineStageFlags.ComputeShaderBit,
  33. _ => LogInvalidAndReturn(stage, nameof(ShaderStage), (PipelineStageFlags)0)
  34. };
  35. }
  36. public static SamplerAddressMode Convert(this AddressMode mode)
  37. {
  38. return mode switch
  39. {
  40. AddressMode.Clamp => SamplerAddressMode.ClampToEdge, // TODO: Should be clamp.
  41. AddressMode.Repeat => SamplerAddressMode.Repeat,
  42. AddressMode.MirrorClamp => SamplerAddressMode.ClampToEdge, // TODO: Should be mirror clamp.
  43. AddressMode.MirrorClampToEdge => SamplerAddressMode.MirrorClampToEdgeKhr,
  44. AddressMode.MirrorClampToBorder => SamplerAddressMode.ClampToBorder, // TODO: Should be mirror clamp to border.
  45. AddressMode.ClampToBorder => SamplerAddressMode.ClampToBorder,
  46. AddressMode.MirroredRepeat => SamplerAddressMode.MirroredRepeat,
  47. AddressMode.ClampToEdge => SamplerAddressMode.ClampToEdge,
  48. _ => LogInvalidAndReturn(mode, nameof(AddressMode), SamplerAddressMode.ClampToEdge) // TODO: Should be clamp.
  49. };
  50. }
  51. public static Silk.NET.Vulkan.BlendFactor Convert(this GAL.BlendFactor factor)
  52. {
  53. return factor switch
  54. {
  55. GAL.BlendFactor.Zero or GAL.BlendFactor.ZeroGl => Silk.NET.Vulkan.BlendFactor.Zero,
  56. GAL.BlendFactor.One or GAL.BlendFactor.OneGl => Silk.NET.Vulkan.BlendFactor.One,
  57. GAL.BlendFactor.SrcColor or GAL.BlendFactor.SrcColorGl => Silk.NET.Vulkan.BlendFactor.SrcColor,
  58. GAL.BlendFactor.OneMinusSrcColor or GAL.BlendFactor.OneMinusSrcColorGl => Silk.NET.Vulkan.BlendFactor.OneMinusSrcColor,
  59. GAL.BlendFactor.SrcAlpha or GAL.BlendFactor.SrcAlphaGl => Silk.NET.Vulkan.BlendFactor.SrcAlpha,
  60. GAL.BlendFactor.OneMinusSrcAlpha or GAL.BlendFactor.OneMinusSrcAlphaGl => Silk.NET.Vulkan.BlendFactor.OneMinusSrcAlpha,
  61. GAL.BlendFactor.DstAlpha or GAL.BlendFactor.DstAlphaGl => Silk.NET.Vulkan.BlendFactor.DstAlpha,
  62. GAL.BlendFactor.OneMinusDstAlpha or GAL.BlendFactor.OneMinusDstAlphaGl => Silk.NET.Vulkan.BlendFactor.OneMinusDstAlpha,
  63. GAL.BlendFactor.DstColor or GAL.BlendFactor.DstColorGl => Silk.NET.Vulkan.BlendFactor.DstColor,
  64. GAL.BlendFactor.OneMinusDstColor or GAL.BlendFactor.OneMinusDstColorGl => Silk.NET.Vulkan.BlendFactor.OneMinusDstColor,
  65. GAL.BlendFactor.SrcAlphaSaturate or GAL.BlendFactor.SrcAlphaSaturateGl => Silk.NET.Vulkan.BlendFactor.SrcAlphaSaturate,
  66. GAL.BlendFactor.Src1Color or GAL.BlendFactor.Src1ColorGl => Silk.NET.Vulkan.BlendFactor.Src1Color,
  67. GAL.BlendFactor.OneMinusSrc1Color or GAL.BlendFactor.OneMinusSrc1ColorGl => Silk.NET.Vulkan.BlendFactor.OneMinusSrc1Color,
  68. GAL.BlendFactor.Src1Alpha or GAL.BlendFactor.Src1AlphaGl => Silk.NET.Vulkan.BlendFactor.Src1Alpha,
  69. GAL.BlendFactor.OneMinusSrc1Alpha or GAL.BlendFactor.OneMinusSrc1AlphaGl => Silk.NET.Vulkan.BlendFactor.OneMinusSrc1Alpha,
  70. GAL.BlendFactor.ConstantColor => Silk.NET.Vulkan.BlendFactor.ConstantColor,
  71. GAL.BlendFactor.OneMinusConstantColor => Silk.NET.Vulkan.BlendFactor.OneMinusConstantColor,
  72. GAL.BlendFactor.ConstantAlpha => Silk.NET.Vulkan.BlendFactor.ConstantAlpha,
  73. GAL.BlendFactor.OneMinusConstantAlpha => Silk.NET.Vulkan.BlendFactor.OneMinusConstantAlpha,
  74. _ => LogInvalidAndReturn(factor, nameof(GAL.BlendFactor), Silk.NET.Vulkan.BlendFactor.Zero)
  75. };
  76. }
  77. public static Silk.NET.Vulkan.BlendOp Convert(this GAL.AdvancedBlendOp op)
  78. {
  79. return op switch
  80. {
  81. GAL.AdvancedBlendOp.Zero => Silk.NET.Vulkan.BlendOp.ZeroExt,
  82. GAL.AdvancedBlendOp.Src => Silk.NET.Vulkan.BlendOp.SrcExt,
  83. GAL.AdvancedBlendOp.Dst => Silk.NET.Vulkan.BlendOp.DstExt,
  84. GAL.AdvancedBlendOp.SrcOver => Silk.NET.Vulkan.BlendOp.SrcOverExt,
  85. GAL.AdvancedBlendOp.DstOver => Silk.NET.Vulkan.BlendOp.DstOverExt,
  86. GAL.AdvancedBlendOp.SrcIn => Silk.NET.Vulkan.BlendOp.SrcInExt,
  87. GAL.AdvancedBlendOp.DstIn => Silk.NET.Vulkan.BlendOp.DstInExt,
  88. GAL.AdvancedBlendOp.SrcOut => Silk.NET.Vulkan.BlendOp.SrcOutExt,
  89. GAL.AdvancedBlendOp.DstOut => Silk.NET.Vulkan.BlendOp.DstOutExt,
  90. GAL.AdvancedBlendOp.SrcAtop => Silk.NET.Vulkan.BlendOp.SrcAtopExt,
  91. GAL.AdvancedBlendOp.DstAtop => Silk.NET.Vulkan.BlendOp.DstAtopExt,
  92. GAL.AdvancedBlendOp.Xor => Silk.NET.Vulkan.BlendOp.XorExt,
  93. GAL.AdvancedBlendOp.Plus => Silk.NET.Vulkan.BlendOp.PlusExt,
  94. GAL.AdvancedBlendOp.PlusClamped => Silk.NET.Vulkan.BlendOp.PlusClampedExt,
  95. GAL.AdvancedBlendOp.PlusClampedAlpha => Silk.NET.Vulkan.BlendOp.PlusClampedAlphaExt,
  96. GAL.AdvancedBlendOp.PlusDarker => Silk.NET.Vulkan.BlendOp.PlusDarkerExt,
  97. GAL.AdvancedBlendOp.Multiply => Silk.NET.Vulkan.BlendOp.MultiplyExt,
  98. GAL.AdvancedBlendOp.Screen => Silk.NET.Vulkan.BlendOp.ScreenExt,
  99. GAL.AdvancedBlendOp.Overlay => Silk.NET.Vulkan.BlendOp.OverlayExt,
  100. GAL.AdvancedBlendOp.Darken => Silk.NET.Vulkan.BlendOp.DarkenExt,
  101. GAL.AdvancedBlendOp.Lighten => Silk.NET.Vulkan.BlendOp.LightenExt,
  102. GAL.AdvancedBlendOp.ColorDodge => Silk.NET.Vulkan.BlendOp.ColordodgeExt,
  103. GAL.AdvancedBlendOp.ColorBurn => Silk.NET.Vulkan.BlendOp.ColorburnExt,
  104. GAL.AdvancedBlendOp.HardLight => Silk.NET.Vulkan.BlendOp.HardlightExt,
  105. GAL.AdvancedBlendOp.SoftLight => Silk.NET.Vulkan.BlendOp.SoftlightExt,
  106. GAL.AdvancedBlendOp.Difference => Silk.NET.Vulkan.BlendOp.DifferenceExt,
  107. GAL.AdvancedBlendOp.Minus => Silk.NET.Vulkan.BlendOp.MinusExt,
  108. GAL.AdvancedBlendOp.MinusClamped => Silk.NET.Vulkan.BlendOp.MinusClampedExt,
  109. GAL.AdvancedBlendOp.Exclusion => Silk.NET.Vulkan.BlendOp.ExclusionExt,
  110. GAL.AdvancedBlendOp.Contrast => Silk.NET.Vulkan.BlendOp.ContrastExt,
  111. GAL.AdvancedBlendOp.Invert => Silk.NET.Vulkan.BlendOp.InvertExt,
  112. GAL.AdvancedBlendOp.InvertRGB => Silk.NET.Vulkan.BlendOp.InvertRgbExt,
  113. GAL.AdvancedBlendOp.InvertOvg => Silk.NET.Vulkan.BlendOp.InvertOvgExt,
  114. GAL.AdvancedBlendOp.LinearDodge => Silk.NET.Vulkan.BlendOp.LineardodgeExt,
  115. GAL.AdvancedBlendOp.LinearBurn => Silk.NET.Vulkan.BlendOp.LinearburnExt,
  116. GAL.AdvancedBlendOp.VividLight => Silk.NET.Vulkan.BlendOp.VividlightExt,
  117. GAL.AdvancedBlendOp.LinearLight => Silk.NET.Vulkan.BlendOp.LinearlightExt,
  118. GAL.AdvancedBlendOp.PinLight => Silk.NET.Vulkan.BlendOp.PinlightExt,
  119. GAL.AdvancedBlendOp.HardMix => Silk.NET.Vulkan.BlendOp.HardmixExt,
  120. GAL.AdvancedBlendOp.Red => Silk.NET.Vulkan.BlendOp.RedExt,
  121. GAL.AdvancedBlendOp.Green => Silk.NET.Vulkan.BlendOp.GreenExt,
  122. GAL.AdvancedBlendOp.Blue => Silk.NET.Vulkan.BlendOp.BlueExt,
  123. GAL.AdvancedBlendOp.HslHue => Silk.NET.Vulkan.BlendOp.HslHueExt,
  124. GAL.AdvancedBlendOp.HslSaturation => Silk.NET.Vulkan.BlendOp.HslSaturationExt,
  125. GAL.AdvancedBlendOp.HslColor => Silk.NET.Vulkan.BlendOp.HslColorExt,
  126. GAL.AdvancedBlendOp.HslLuminosity => Silk.NET.Vulkan.BlendOp.HslLuminosityExt,
  127. _ => LogInvalidAndReturn(op, nameof(GAL.AdvancedBlendOp), Silk.NET.Vulkan.BlendOp.Add)
  128. };
  129. }
  130. public static Silk.NET.Vulkan.BlendOp Convert(this GAL.BlendOp op)
  131. {
  132. return op switch
  133. {
  134. GAL.BlendOp.Add or GAL.BlendOp.AddGl => Silk.NET.Vulkan.BlendOp.Add,
  135. GAL.BlendOp.Subtract or GAL.BlendOp.SubtractGl => Silk.NET.Vulkan.BlendOp.Subtract,
  136. GAL.BlendOp.ReverseSubtract or GAL.BlendOp.ReverseSubtractGl => Silk.NET.Vulkan.BlendOp.ReverseSubtract,
  137. GAL.BlendOp.Minimum or GAL.BlendOp.MinimumGl => Silk.NET.Vulkan.BlendOp.Min,
  138. GAL.BlendOp.Maximum or GAL.BlendOp.MaximumGl => Silk.NET.Vulkan.BlendOp.Max,
  139. _ => LogInvalidAndReturn(op, nameof(GAL.BlendOp), Silk.NET.Vulkan.BlendOp.Add)
  140. };
  141. }
  142. public static Silk.NET.Vulkan.BlendOverlapEXT Convert(this GAL.AdvancedBlendOverlap overlap)
  143. {
  144. return overlap switch
  145. {
  146. GAL.AdvancedBlendOverlap.Uncorrelated => Silk.NET.Vulkan.BlendOverlapEXT.UncorrelatedExt,
  147. GAL.AdvancedBlendOverlap.Disjoint => Silk.NET.Vulkan.BlendOverlapEXT.DisjointExt,
  148. GAL.AdvancedBlendOverlap.Conjoint => Silk.NET.Vulkan.BlendOverlapEXT.ConjointExt,
  149. _ => LogInvalidAndReturn(overlap, nameof(GAL.AdvancedBlendOverlap), Silk.NET.Vulkan.BlendOverlapEXT.UncorrelatedExt)
  150. };
  151. }
  152. public static Silk.NET.Vulkan.CompareOp Convert(this GAL.CompareOp op)
  153. {
  154. return op switch
  155. {
  156. GAL.CompareOp.Never or GAL.CompareOp.NeverGl => Silk.NET.Vulkan.CompareOp.Never,
  157. GAL.CompareOp.Less or GAL.CompareOp.LessGl => Silk.NET.Vulkan.CompareOp.Less,
  158. GAL.CompareOp.Equal or GAL.CompareOp.EqualGl => Silk.NET.Vulkan.CompareOp.Equal,
  159. GAL.CompareOp.LessOrEqual or GAL.CompareOp.LessOrEqualGl => Silk.NET.Vulkan.CompareOp.LessOrEqual,
  160. GAL.CompareOp.Greater or GAL.CompareOp.GreaterGl => Silk.NET.Vulkan.CompareOp.Greater,
  161. GAL.CompareOp.NotEqual or GAL.CompareOp.NotEqualGl => Silk.NET.Vulkan.CompareOp.NotEqual,
  162. GAL.CompareOp.GreaterOrEqual or GAL.CompareOp.GreaterOrEqualGl => Silk.NET.Vulkan.CompareOp.GreaterOrEqual,
  163. GAL.CompareOp.Always or GAL.CompareOp.AlwaysGl => Silk.NET.Vulkan.CompareOp.Always,
  164. _ => LogInvalidAndReturn(op, nameof(GAL.CompareOp), Silk.NET.Vulkan.CompareOp.Never)
  165. };
  166. }
  167. public static CullModeFlags Convert(this Face face)
  168. {
  169. return face switch
  170. {
  171. Face.Back => CullModeFlags.BackBit,
  172. Face.Front => CullModeFlags.FrontBit,
  173. Face.FrontAndBack => CullModeFlags.FrontAndBack,
  174. _ => LogInvalidAndReturn(face, nameof(Face), CullModeFlags.BackBit)
  175. };
  176. }
  177. public static Silk.NET.Vulkan.FrontFace Convert(this GAL.FrontFace frontFace)
  178. {
  179. // Flipped to account for origin differences.
  180. return frontFace switch
  181. {
  182. GAL.FrontFace.Clockwise => Silk.NET.Vulkan.FrontFace.CounterClockwise,
  183. GAL.FrontFace.CounterClockwise => Silk.NET.Vulkan.FrontFace.Clockwise,
  184. _ => LogInvalidAndReturn(frontFace, nameof(GAL.FrontFace), Silk.NET.Vulkan.FrontFace.Clockwise)
  185. };
  186. }
  187. public static Silk.NET.Vulkan.IndexType Convert(this GAL.IndexType type)
  188. {
  189. return type switch
  190. {
  191. GAL.IndexType.UByte => Silk.NET.Vulkan.IndexType.Uint8Ext,
  192. GAL.IndexType.UShort => Silk.NET.Vulkan.IndexType.Uint16,
  193. GAL.IndexType.UInt => Silk.NET.Vulkan.IndexType.Uint32,
  194. _ => LogInvalidAndReturn(type, nameof(GAL.IndexType), Silk.NET.Vulkan.IndexType.Uint16)
  195. };
  196. }
  197. public static Filter Convert(this MagFilter filter)
  198. {
  199. return filter switch
  200. {
  201. MagFilter.Nearest => Filter.Nearest,
  202. MagFilter.Linear => Filter.Linear,
  203. _ => LogInvalidAndReturn(filter, nameof(MagFilter), Filter.Nearest)
  204. };
  205. }
  206. public static (Filter, SamplerMipmapMode) Convert(this MinFilter filter)
  207. {
  208. return filter switch
  209. {
  210. MinFilter.Nearest => (Filter.Nearest, SamplerMipmapMode.Nearest),
  211. MinFilter.Linear => (Filter.Linear, SamplerMipmapMode.Nearest),
  212. MinFilter.NearestMipmapNearest => (Filter.Nearest, SamplerMipmapMode.Nearest),
  213. MinFilter.LinearMipmapNearest => (Filter.Linear, SamplerMipmapMode.Nearest),
  214. MinFilter.NearestMipmapLinear => (Filter.Nearest, SamplerMipmapMode.Linear),
  215. MinFilter.LinearMipmapLinear => (Filter.Linear, SamplerMipmapMode.Linear),
  216. _ => LogInvalidAndReturn(filter, nameof(MinFilter), (Filter.Nearest, SamplerMipmapMode.Nearest))
  217. };
  218. }
  219. public static Silk.NET.Vulkan.PrimitiveTopology Convert(this GAL.PrimitiveTopology topology)
  220. {
  221. return topology switch
  222. {
  223. GAL.PrimitiveTopology.Points => Silk.NET.Vulkan.PrimitiveTopology.PointList,
  224. GAL.PrimitiveTopology.Lines => Silk.NET.Vulkan.PrimitiveTopology.LineList,
  225. GAL.PrimitiveTopology.LineStrip => Silk.NET.Vulkan.PrimitiveTopology.LineStrip,
  226. GAL.PrimitiveTopology.Triangles => Silk.NET.Vulkan.PrimitiveTopology.TriangleList,
  227. GAL.PrimitiveTopology.TriangleStrip => Silk.NET.Vulkan.PrimitiveTopology.TriangleStrip,
  228. GAL.PrimitiveTopology.TriangleFan => Silk.NET.Vulkan.PrimitiveTopology.TriangleFan,
  229. GAL.PrimitiveTopology.LinesAdjacency => Silk.NET.Vulkan.PrimitiveTopology.LineListWithAdjacency,
  230. GAL.PrimitiveTopology.LineStripAdjacency => Silk.NET.Vulkan.PrimitiveTopology.LineStripWithAdjacency,
  231. GAL.PrimitiveTopology.TrianglesAdjacency => Silk.NET.Vulkan.PrimitiveTopology.TriangleListWithAdjacency,
  232. GAL.PrimitiveTopology.TriangleStripAdjacency => Silk.NET.Vulkan.PrimitiveTopology.TriangleStripWithAdjacency,
  233. GAL.PrimitiveTopology.Patches => Silk.NET.Vulkan.PrimitiveTopology.PatchList,
  234. GAL.PrimitiveTopology.Polygon => Silk.NET.Vulkan.PrimitiveTopology.TriangleFan,
  235. GAL.PrimitiveTopology.Quads => throw new NotSupportedException("Quad topology is not available in Vulkan."),
  236. GAL.PrimitiveTopology.QuadStrip => throw new NotSupportedException("QuadStrip topology is not available in Vulkan."),
  237. _ => LogInvalidAndReturn(topology, nameof(GAL.PrimitiveTopology), Silk.NET.Vulkan.PrimitiveTopology.TriangleList)
  238. };
  239. }
  240. public static Silk.NET.Vulkan.StencilOp Convert(this GAL.StencilOp op)
  241. {
  242. return op switch
  243. {
  244. GAL.StencilOp.Keep or GAL.StencilOp.KeepGl => Silk.NET.Vulkan.StencilOp.Keep,
  245. GAL.StencilOp.Zero or GAL.StencilOp.ZeroGl => Silk.NET.Vulkan.StencilOp.Zero,
  246. GAL.StencilOp.Replace or GAL.StencilOp.ReplaceGl => Silk.NET.Vulkan.StencilOp.Replace,
  247. GAL.StencilOp.IncrementAndClamp or GAL.StencilOp.IncrementAndClampGl => Silk.NET.Vulkan.StencilOp.IncrementAndClamp,
  248. GAL.StencilOp.DecrementAndClamp or GAL.StencilOp.DecrementAndClampGl => Silk.NET.Vulkan.StencilOp.DecrementAndClamp,
  249. GAL.StencilOp.Invert or GAL.StencilOp.InvertGl => Silk.NET.Vulkan.StencilOp.Invert,
  250. GAL.StencilOp.IncrementAndWrap or GAL.StencilOp.IncrementAndWrapGl => Silk.NET.Vulkan.StencilOp.IncrementAndWrap,
  251. GAL.StencilOp.DecrementAndWrap or GAL.StencilOp.DecrementAndWrapGl => Silk.NET.Vulkan.StencilOp.DecrementAndWrap,
  252. _ => LogInvalidAndReturn(op, nameof(GAL.StencilOp), Silk.NET.Vulkan.StencilOp.Keep)
  253. };
  254. }
  255. public static ComponentSwizzle Convert(this SwizzleComponent swizzleComponent)
  256. {
  257. return swizzleComponent switch
  258. {
  259. SwizzleComponent.Zero => ComponentSwizzle.Zero,
  260. SwizzleComponent.One => ComponentSwizzle.One,
  261. SwizzleComponent.Red => ComponentSwizzle.R,
  262. SwizzleComponent.Green => ComponentSwizzle.G,
  263. SwizzleComponent.Blue => ComponentSwizzle.B,
  264. SwizzleComponent.Alpha => ComponentSwizzle.A,
  265. _ => LogInvalidAndReturn(swizzleComponent, nameof(SwizzleComponent), ComponentSwizzle.Zero)
  266. };
  267. }
  268. public static ImageType Convert(this Target target)
  269. {
  270. return target switch
  271. {
  272. Target.Texture1D or
  273. Target.Texture1DArray or
  274. Target.TextureBuffer => ImageType.Type1D,
  275. Target.Texture2D or
  276. Target.Texture2DArray or
  277. Target.Texture2DMultisample or
  278. Target.Cubemap or
  279. Target.CubemapArray => ImageType.Type2D,
  280. Target.Texture3D => ImageType.Type3D,
  281. _ => LogInvalidAndReturn(target, nameof(Target), ImageType.Type2D)
  282. };
  283. }
  284. public static ImageViewType ConvertView(this Target target)
  285. {
  286. return target switch
  287. {
  288. Target.Texture1D => ImageViewType.Type1D,
  289. Target.Texture2D or Target.Texture2DMultisample => ImageViewType.Type2D,
  290. Target.Texture3D => ImageViewType.Type3D,
  291. Target.Texture1DArray => ImageViewType.Type1DArray,
  292. Target.Texture2DArray => ImageViewType.Type2DArray,
  293. Target.Cubemap => ImageViewType.TypeCube,
  294. Target.CubemapArray => ImageViewType.TypeCubeArray,
  295. _ => LogInvalidAndReturn(target, nameof(Target), ImageViewType.Type2D)
  296. };
  297. }
  298. public static ImageAspectFlags ConvertAspectFlags(this GAL.Format format)
  299. {
  300. return format switch
  301. {
  302. GAL.Format.D16Unorm or GAL.Format.D32Float => ImageAspectFlags.DepthBit,
  303. GAL.Format.S8Uint => ImageAspectFlags.StencilBit,
  304. GAL.Format.D24UnormS8Uint or
  305. GAL.Format.D32FloatS8Uint or
  306. GAL.Format.S8UintD24Unorm => ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit,
  307. _ => ImageAspectFlags.ColorBit
  308. };
  309. }
  310. public static ImageAspectFlags ConvertAspectFlags(this GAL.Format format, DepthStencilMode depthStencilMode)
  311. {
  312. return format switch
  313. {
  314. GAL.Format.D16Unorm or GAL.Format.D32Float => ImageAspectFlags.DepthBit,
  315. GAL.Format.S8Uint => ImageAspectFlags.StencilBit,
  316. GAL.Format.D24UnormS8Uint or
  317. GAL.Format.D32FloatS8Uint or
  318. GAL.Format.S8UintD24Unorm => depthStencilMode == DepthStencilMode.Stencil ? ImageAspectFlags.StencilBit : ImageAspectFlags.DepthBit,
  319. _ => ImageAspectFlags.ColorBit
  320. };
  321. }
  322. public static LogicOp Convert(this LogicalOp op)
  323. {
  324. return op switch
  325. {
  326. LogicalOp.Clear => LogicOp.Clear,
  327. LogicalOp.And => LogicOp.And,
  328. LogicalOp.AndReverse => LogicOp.AndReverse,
  329. LogicalOp.Copy => LogicOp.Copy,
  330. LogicalOp.AndInverted => LogicOp.AndInverted,
  331. LogicalOp.Noop => LogicOp.NoOp,
  332. LogicalOp.Xor => LogicOp.Xor,
  333. LogicalOp.Or => LogicOp.Or,
  334. LogicalOp.Nor => LogicOp.Nor,
  335. LogicalOp.Equiv => LogicOp.Equivalent,
  336. LogicalOp.Invert => LogicOp.Invert,
  337. LogicalOp.OrReverse => LogicOp.OrReverse,
  338. LogicalOp.CopyInverted => LogicOp.CopyInverted,
  339. LogicalOp.OrInverted => LogicOp.OrInverted,
  340. LogicalOp.Nand => LogicOp.Nand,
  341. LogicalOp.Set => LogicOp.Set,
  342. _ => LogInvalidAndReturn(op, nameof(LogicalOp), LogicOp.Copy)
  343. };
  344. }
  345. private static T2 LogInvalidAndReturn<T1, T2>(T1 value, string name, T2 defaultValue = default)
  346. {
  347. Logger.Debug?.Print(LogClass.Gpu, $"Invalid {name} enum value: {value}.");
  348. return defaultValue;
  349. }
  350. }
  351. }