various convenience states
							parent
							
								
									424ff7f00c
								
							
						
					
					
						commit
						e9dfdb0921
					
				|  | @ -1 +1 @@ | ||||||
| Subproject commit 3379b95e449904b30d66d8bc17e4da83fc60c1be | Subproject commit 2e3871a03d99e413f84748e40bdb6c03df2ecd1c | ||||||
|  | @ -7,8 +7,11 @@ namespace Campari | ||||||
|     { |     { | ||||||
|         protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyBuffer; |         protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyBuffer; | ||||||
| 
 | 
 | ||||||
|         /* FIXME: could we have a special flags struct? */ |         public Buffer( | ||||||
|         public Buffer(RefreshDevice device, uint usageFlags, uint sizeInBytes) : base(device) |             RefreshDevice device,  | ||||||
|  |             Refresh.BufferUsageFlags usageFlags, | ||||||
|  |             uint sizeInBytes | ||||||
|  |         ) : base(device) | ||||||
|         { |         { | ||||||
|             Handle = Refresh.Refresh_CreateBuffer( |             Handle = Refresh.Refresh_CreateBuffer( | ||||||
|                 device.Handle, |                 device.Handle, | ||||||
|  |  | ||||||
|  | @ -23,17 +23,23 @@ namespace Campari | ||||||
|             RenderPass renderPass |             RenderPass renderPass | ||||||
|         ) : base(device) |         ) : base(device) | ||||||
|         { |         { | ||||||
|             var blendStateHandle = GCHandle.Alloc(colorBlendState.ColorTargetBlendStates, GCHandleType.Pinned); |  | ||||||
|             var vertexAttributesHandle = GCHandle.Alloc(vertexInputState.VertexAttributes, GCHandleType.Pinned); |             var vertexAttributesHandle = GCHandle.Alloc(vertexInputState.VertexAttributes, GCHandleType.Pinned); | ||||||
|             var vertexBindingsHandle = GCHandle.Alloc(vertexInputState.VertexBindings, GCHandleType.Pinned); |             var vertexBindingsHandle = GCHandle.Alloc(vertexInputState.VertexBindings, GCHandleType.Pinned); | ||||||
|             var viewportHandle = GCHandle.Alloc(viewportState.Viewports, GCHandleType.Pinned); |             var viewportHandle = GCHandle.Alloc(viewportState.Viewports, GCHandleType.Pinned); | ||||||
|             var scissorHandle = GCHandle.Alloc(viewportState.Scissors, GCHandleType.Pinned); |             var scissorHandle = GCHandle.Alloc(viewportState.Scissors, GCHandleType.Pinned); | ||||||
| 
 | 
 | ||||||
|  |             var colorTargetBlendStates = stackalloc Refresh.ColorTargetBlendState[colorBlendState.ColorTargetBlendStates.Length]; | ||||||
|  | 
 | ||||||
|  |             for (var i = 0; i < colorBlendState.ColorTargetBlendStates.Length; i += 1) | ||||||
|  |             { | ||||||
|  |                 colorTargetBlendStates[i] = colorBlendState.ColorTargetBlendStates[i].ToRefreshColorTargetBlendState(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             Refresh.GraphicsPipelineCreateInfo graphicsPipelineCreateInfo; |             Refresh.GraphicsPipelineCreateInfo graphicsPipelineCreateInfo; | ||||||
| 
 | 
 | ||||||
|             graphicsPipelineCreateInfo.colorBlendState.logicOpEnable = Conversions.BoolToByte(colorBlendState.LogicOpEnable); |             graphicsPipelineCreateInfo.colorBlendState.logicOpEnable = Conversions.BoolToByte(colorBlendState.LogicOpEnable); | ||||||
|             graphicsPipelineCreateInfo.colorBlendState.logicOp = colorBlendState.LogicOp; |             graphicsPipelineCreateInfo.colorBlendState.logicOp = colorBlendState.LogicOp; | ||||||
|             graphicsPipelineCreateInfo.colorBlendState.blendStates = blendStateHandle.AddrOfPinnedObject(); |             graphicsPipelineCreateInfo.colorBlendState.blendStates = (IntPtr) colorTargetBlendStates; | ||||||
|             graphicsPipelineCreateInfo.colorBlendState.blendStateCount = (uint) colorBlendState.ColorTargetBlendStates.Length; |             graphicsPipelineCreateInfo.colorBlendState.blendStateCount = (uint) colorBlendState.ColorTargetBlendStates.Length; | ||||||
|             graphicsPipelineCreateInfo.colorBlendState.blendConstants[0] = colorBlendState.BlendConstants.R; |             graphicsPipelineCreateInfo.colorBlendState.blendConstants[0] = colorBlendState.BlendConstants.R; | ||||||
|             graphicsPipelineCreateInfo.colorBlendState.blendConstants[1] = colorBlendState.BlendConstants.G; |             graphicsPipelineCreateInfo.colorBlendState.blendConstants[1] = colorBlendState.BlendConstants.G; | ||||||
|  | @ -89,7 +95,6 @@ namespace Campari | ||||||
| 
 | 
 | ||||||
|             Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, ref graphicsPipelineCreateInfo); |             Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, ref graphicsPipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             blendStateHandle.Free(); |  | ||||||
|             vertexAttributesHandle.Free(); |             vertexAttributesHandle.Free(); | ||||||
|             vertexBindingsHandle.Free(); |             vertexBindingsHandle.Free(); | ||||||
|             viewportHandle.Free(); |             viewportHandle.Free(); | ||||||
|  |  | ||||||
|  | @ -9,10 +9,15 @@ namespace Campari | ||||||
| 
 | 
 | ||||||
|         public Sampler( |         public Sampler( | ||||||
|             RefreshDevice device, |             RefreshDevice device, | ||||||
|             ref Refresh.SamplerStateCreateInfo samplerStateCreateInfo |             ref SamplerState samplerState | ||||||
|         ) : base(device) |         ) : base(device) | ||||||
|         { |         { | ||||||
|             Handle = Refresh.Refresh_CreateSampler(device.Handle, ref samplerStateCreateInfo); |             var refreshSamplerStateCreateInfo = samplerState.ToRefreshSamplerStateCreateInfo(); | ||||||
|  | 
 | ||||||
|  |             Handle = Refresh.Refresh_CreateSampler( | ||||||
|  |                 device.Handle, | ||||||
|  |                 ref refreshSamplerStateCreateInfo | ||||||
|  |             ); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -7,6 +7,6 @@ namespace Campari | ||||||
|         public bool LogicOpEnable; |         public bool LogicOpEnable; | ||||||
|         public Refresh.LogicOp LogicOp; |         public Refresh.LogicOp LogicOp; | ||||||
|         public BlendConstants BlendConstants; |         public BlendConstants BlendConstants; | ||||||
|         public Refresh.ColorTargetBlendState[] ColorTargetBlendStates; |         public ColorTargetBlendState[] ColorTargetBlendStates; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,85 @@ | ||||||
|  | using RefreshCS; | ||||||
|  | 
 | ||||||
|  | namespace Campari | ||||||
|  | { | ||||||
|  |     public struct ColorTargetBlendState | ||||||
|  |     { | ||||||
|  |         public bool BlendEnable; | ||||||
|  |         public Refresh.BlendOp AlphaBlendOp; | ||||||
|  |         public Refresh.BlendOp ColorBlendOp; | ||||||
|  |         public Refresh.ColorComponentFlags ColorWriteMask; | ||||||
|  |         public Refresh.BlendFactor DestinationAlphaBlendFactor; | ||||||
|  |         public Refresh.BlendFactor DestinationColorBlendFactor; | ||||||
|  |         public Refresh.BlendFactor SourceAlphaBlendFactor; | ||||||
|  |         public Refresh.BlendFactor SourceColorBlendFactor; | ||||||
|  | 
 | ||||||
|  |         public static readonly ColorTargetBlendState Additive = new ColorTargetBlendState | ||||||
|  |         { | ||||||
|  |             BlendEnable = true, | ||||||
|  |             AlphaBlendOp = Refresh.BlendOp.Add, | ||||||
|  |             ColorBlendOp = Refresh.BlendOp.Add, | ||||||
|  |             ColorWriteMask = Refresh.ColorComponentFlags.RGBA, | ||||||
|  |             SourceColorBlendFactor = Refresh.BlendFactor.SourceAlpha, | ||||||
|  |             SourceAlphaBlendFactor = Refresh.BlendFactor.SourceAlpha, | ||||||
|  |             DestinationColorBlendFactor = Refresh.BlendFactor.One, | ||||||
|  |             DestinationAlphaBlendFactor = Refresh.BlendFactor.One | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly ColorTargetBlendState AlphaBlend = new ColorTargetBlendState | ||||||
|  |         { | ||||||
|  |             BlendEnable = true, | ||||||
|  |             AlphaBlendOp = Refresh.BlendOp.Add, | ||||||
|  |             ColorBlendOp = Refresh.BlendOp.Add, | ||||||
|  |             ColorWriteMask = Refresh.ColorComponentFlags.RGBA, | ||||||
|  |             SourceColorBlendFactor = Refresh.BlendFactor.One, | ||||||
|  |             SourceAlphaBlendFactor = Refresh.BlendFactor.One, | ||||||
|  |             DestinationColorBlendFactor = Refresh.BlendFactor.OneMinusSourceAlpha, | ||||||
|  |             DestinationAlphaBlendFactor = Refresh.BlendFactor.OneMinusSourceAlpha | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly ColorTargetBlendState NonPremultiplied = new ColorTargetBlendState | ||||||
|  |         { | ||||||
|  |             BlendEnable = true, | ||||||
|  |             AlphaBlendOp = Refresh.BlendOp.Add, | ||||||
|  |             ColorBlendOp = Refresh.BlendOp.Add, | ||||||
|  |             ColorWriteMask = Refresh.ColorComponentFlags.RGBA, | ||||||
|  |             SourceColorBlendFactor = Refresh.BlendFactor.SourceAlpha, | ||||||
|  |             SourceAlphaBlendFactor = Refresh.BlendFactor.SourceAlpha, | ||||||
|  |             DestinationColorBlendFactor = Refresh.BlendFactor.OneMinusSourceAlpha, | ||||||
|  |             DestinationAlphaBlendFactor = Refresh.BlendFactor.OneMinusSourceAlpha | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly ColorTargetBlendState Opaque = new ColorTargetBlendState | ||||||
|  |         { | ||||||
|  |             BlendEnable = true, | ||||||
|  |             AlphaBlendOp = Refresh.BlendOp.Add, | ||||||
|  |             ColorBlendOp = Refresh.BlendOp.Add, | ||||||
|  |             ColorWriteMask = Refresh.ColorComponentFlags.RGBA, | ||||||
|  |             SourceColorBlendFactor = Refresh.BlendFactor.One, | ||||||
|  |             SourceAlphaBlendFactor = Refresh.BlendFactor.One, | ||||||
|  |             DestinationColorBlendFactor = Refresh.BlendFactor.Zero, | ||||||
|  |             DestinationAlphaBlendFactor = Refresh.BlendFactor.Zero | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly ColorTargetBlendState None = new ColorTargetBlendState | ||||||
|  |         { | ||||||
|  |             BlendEnable = false, | ||||||
|  |             ColorWriteMask = Refresh.ColorComponentFlags.RGBA | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public Refresh.ColorTargetBlendState ToRefreshColorTargetBlendState() | ||||||
|  |         { | ||||||
|  |             return new Refresh.ColorTargetBlendState | ||||||
|  |             { | ||||||
|  |                 blendEnable = Conversions.BoolToByte(BlendEnable), | ||||||
|  |                 alphaBlendOp = AlphaBlendOp, | ||||||
|  |                 colorBlendOp = ColorBlendOp, | ||||||
|  |                 colorWriteMask = ColorWriteMask, | ||||||
|  |                 destinationAlphaBlendFactor = DestinationAlphaBlendFactor, | ||||||
|  |                 destinationColorBlendFactor = DestinationColorBlendFactor, | ||||||
|  |                 sourceAlphaBlendFactor = SourceAlphaBlendFactor, | ||||||
|  |                 sourceColorBlendFactor = SourceColorBlendFactor | ||||||
|  |             }; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -13,5 +13,31 @@ namespace Campari | ||||||
|         public float MinDepthBounds; |         public float MinDepthBounds; | ||||||
|         public float MaxDepthBounds; |         public float MaxDepthBounds; | ||||||
|         public bool StencilTestEnable; |         public bool StencilTestEnable; | ||||||
|  | 
 | ||||||
|  |         public static readonly DepthStencilState DepthReadWrite = new DepthStencilState | ||||||
|  |         { | ||||||
|  |             DepthTestEnable = true, | ||||||
|  |             DepthWriteEnable = true, | ||||||
|  |             DepthBoundsTestEnable = false, | ||||||
|  |             StencilTestEnable = false, | ||||||
|  |             CompareOp = Refresh.CompareOp.LessOrEqual | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly DepthStencilState DepthRead = new DepthStencilState | ||||||
|  |         { | ||||||
|  |             DepthTestEnable = true, | ||||||
|  |             DepthWriteEnable = false, | ||||||
|  |             DepthBoundsTestEnable = false, | ||||||
|  |             StencilTestEnable = false, | ||||||
|  |             CompareOp = Refresh.CompareOp.LessOrEqual | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly DepthStencilState Disable = new DepthStencilState | ||||||
|  |         { | ||||||
|  |             DepthTestEnable = false, | ||||||
|  |             DepthWriteEnable = false, | ||||||
|  |             DepthBoundsTestEnable = false, | ||||||
|  |             StencilTestEnable = false | ||||||
|  |         }; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,5 +6,11 @@ namespace Campari | ||||||
|     { |     { | ||||||
|         public Refresh.SampleCount MultisampleCount; |         public Refresh.SampleCount MultisampleCount; | ||||||
|         public uint SampleMask; |         public uint SampleMask; | ||||||
|  | 
 | ||||||
|  |         public static readonly MultisampleState None = new MultisampleState | ||||||
|  |         { | ||||||
|  |             MultisampleCount = Refresh.SampleCount.One, | ||||||
|  |             SampleMask = uint.MaxValue | ||||||
|  |         }; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -13,5 +13,41 @@ namespace Campari | ||||||
|         public Refresh.FillMode FillMode; |         public Refresh.FillMode FillMode; | ||||||
|         public Refresh.FrontFace FrontFace; |         public Refresh.FrontFace FrontFace; | ||||||
|         public float LineWidth; |         public float LineWidth; | ||||||
|  | 
 | ||||||
|  |         public static readonly RasterizerState CullClockwise = new RasterizerState | ||||||
|  |         { | ||||||
|  |             CullMode = Refresh.CullMode.Front, | ||||||
|  |             FrontFace = Refresh.FrontFace.Clockwise, | ||||||
|  |             FillMode = Refresh.FillMode.Fill, | ||||||
|  |             DepthBiasEnable = false, | ||||||
|  |             LineWidth = 1f | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly RasterizerState CullCounterClockwise = new RasterizerState | ||||||
|  |         { | ||||||
|  |             CullMode = Refresh.CullMode.Back, | ||||||
|  |             FrontFace = Refresh.FrontFace.Clockwise, | ||||||
|  |             FillMode = Refresh.FillMode.Fill, | ||||||
|  |             DepthBiasEnable = false, | ||||||
|  |             LineWidth = 1f | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly RasterizerState CullNone = new RasterizerState | ||||||
|  |         { | ||||||
|  |             CullMode = Refresh.CullMode.None, | ||||||
|  |             FrontFace = Refresh.FrontFace.Clockwise, | ||||||
|  |             FillMode = Refresh.FillMode.Fill, | ||||||
|  |             DepthBiasEnable = false, | ||||||
|  |             LineWidth = 1f | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly RasterizerState Wireframe = new RasterizerState | ||||||
|  |         { | ||||||
|  |             CullMode = Refresh.CullMode.None, | ||||||
|  |             FrontFace = Refresh.FrontFace.Clockwise, | ||||||
|  |             FillMode = Refresh.FillMode.Fill, | ||||||
|  |             DepthBiasEnable = false, | ||||||
|  |             LineWidth = 1f | ||||||
|  |         }; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,135 @@ | ||||||
|  | using RefreshCS; | ||||||
|  | 
 | ||||||
|  | namespace Campari | ||||||
|  | { | ||||||
|  |     public struct SamplerState | ||||||
|  |     { | ||||||
|  |         public Refresh.Filter MinFilter; | ||||||
|  |         public Refresh.Filter MagFilter; | ||||||
|  |         public Refresh.SamplerMipmapMode MipmapMode; | ||||||
|  |         public Refresh.SamplerAddressMode AddressModeU; | ||||||
|  |         public Refresh.SamplerAddressMode AddressModeV; | ||||||
|  |         public Refresh.SamplerAddressMode AddressModeW; | ||||||
|  |         public float MipLodBias; | ||||||
|  |         public bool AnisotropyEnable; | ||||||
|  |         public float MaxAnisotropy; | ||||||
|  |         public bool CompareEnable; | ||||||
|  |         public Refresh.CompareOp CompareOp; | ||||||
|  |         public float MinLod; | ||||||
|  |         public float MaxLod; | ||||||
|  |         public Refresh.BorderColor BorderColor; | ||||||
|  | 
 | ||||||
|  |         public static readonly SamplerState AnisotropicClamp = new SamplerState | ||||||
|  |         { | ||||||
|  |             MinFilter = Refresh.Filter.Linear, | ||||||
|  |             MagFilter = Refresh.Filter.Linear, | ||||||
|  |             MipmapMode = Refresh.SamplerMipmapMode.Linear, | ||||||
|  |             AddressModeU = Refresh.SamplerAddressMode.ClampToEdge, | ||||||
|  |             AddressModeV = Refresh.SamplerAddressMode.ClampToEdge, | ||||||
|  |             AddressModeW = Refresh.SamplerAddressMode.ClampToEdge, | ||||||
|  |             CompareEnable = false, | ||||||
|  |             AnisotropyEnable = true, | ||||||
|  |             MaxAnisotropy = 4, | ||||||
|  |             MipLodBias = 0f, | ||||||
|  |             MinLod = 0, | ||||||
|  |             MaxLod = 1000 /* VK_LOD_CLAMP_NONE */ | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly SamplerState AnisotropicWrap = new SamplerState | ||||||
|  |         { | ||||||
|  |             MinFilter = Refresh.Filter.Linear, | ||||||
|  |             MagFilter = Refresh.Filter.Linear, | ||||||
|  |             MipmapMode = Refresh.SamplerMipmapMode.Linear, | ||||||
|  |             AddressModeU = Refresh.SamplerAddressMode.Repeat, | ||||||
|  |             AddressModeV = Refresh.SamplerAddressMode.Repeat, | ||||||
|  |             AddressModeW = Refresh.SamplerAddressMode.Repeat, | ||||||
|  |             CompareEnable = false, | ||||||
|  |             AnisotropyEnable = true, | ||||||
|  |             MaxAnisotropy = 4, | ||||||
|  |             MipLodBias = 0f, | ||||||
|  |             MinLod = 0, | ||||||
|  |             MaxLod = 1000 /* VK_LOD_CLAMP_NONE */ | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly SamplerState LinearClamp = new SamplerState | ||||||
|  |         { | ||||||
|  |             MinFilter = Refresh.Filter.Linear, | ||||||
|  |             MagFilter = Refresh.Filter.Linear, | ||||||
|  |             MipmapMode = Refresh.SamplerMipmapMode.Linear, | ||||||
|  |             AddressModeU = Refresh.SamplerAddressMode.ClampToEdge, | ||||||
|  |             AddressModeV = Refresh.SamplerAddressMode.ClampToEdge, | ||||||
|  |             AddressModeW = Refresh.SamplerAddressMode.ClampToEdge, | ||||||
|  |             CompareEnable = false, | ||||||
|  |             AnisotropyEnable = false, | ||||||
|  |             MipLodBias = 0f, | ||||||
|  |             MinLod = 0, | ||||||
|  |             MaxLod = 1000 | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly SamplerState LinearWrap = new SamplerState | ||||||
|  |         { | ||||||
|  |             MinFilter = Refresh.Filter.Linear, | ||||||
|  |             MagFilter = Refresh.Filter.Linear, | ||||||
|  |             MipmapMode = Refresh.SamplerMipmapMode.Linear, | ||||||
|  |             AddressModeU = Refresh.SamplerAddressMode.Repeat, | ||||||
|  |             AddressModeV = Refresh.SamplerAddressMode.Repeat, | ||||||
|  |             AddressModeW = Refresh.SamplerAddressMode.Repeat, | ||||||
|  |             CompareEnable = false, | ||||||
|  |             AnisotropyEnable = false, | ||||||
|  |             MipLodBias = 0f, | ||||||
|  |             MinLod = 0, | ||||||
|  |             MaxLod = 1000 | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly SamplerState PointClamp = new SamplerState | ||||||
|  |         { | ||||||
|  |             MinFilter = Refresh.Filter.Nearest, | ||||||
|  |             MagFilter = Refresh.Filter.Nearest, | ||||||
|  |             MipmapMode = Refresh.SamplerMipmapMode.Nearest, | ||||||
|  |             AddressModeU = Refresh.SamplerAddressMode.ClampToEdge, | ||||||
|  |             AddressModeV = Refresh.SamplerAddressMode.ClampToEdge, | ||||||
|  |             AddressModeW = Refresh.SamplerAddressMode.ClampToEdge, | ||||||
|  |             CompareEnable = false, | ||||||
|  |             AnisotropyEnable = false, | ||||||
|  |             MipLodBias = 0f, | ||||||
|  |             MinLod = 0, | ||||||
|  |             MaxLod = 1000 | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public static readonly SamplerState PointWrap = new SamplerState | ||||||
|  |         { | ||||||
|  |             MinFilter = Refresh.Filter.Nearest, | ||||||
|  |             MagFilter = Refresh.Filter.Nearest, | ||||||
|  |             MipmapMode = Refresh.SamplerMipmapMode.Nearest, | ||||||
|  |             AddressModeU = Refresh.SamplerAddressMode.Repeat, | ||||||
|  |             AddressModeV = Refresh.SamplerAddressMode.Repeat, | ||||||
|  |             AddressModeW = Refresh.SamplerAddressMode.Repeat, | ||||||
|  |             CompareEnable = false, | ||||||
|  |             AnisotropyEnable = false, | ||||||
|  |             MipLodBias = 0f, | ||||||
|  |             MinLod = 0, | ||||||
|  |             MaxLod = 1000 | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         public Refresh.SamplerStateCreateInfo ToRefreshSamplerStateCreateInfo() | ||||||
|  |         { | ||||||
|  |             return new Refresh.SamplerStateCreateInfo | ||||||
|  |             { | ||||||
|  |                 minFilter = MinFilter, | ||||||
|  |                 magFilter = MagFilter, | ||||||
|  |                 mipmapMode = MipmapMode, | ||||||
|  |                 addressModeU = AddressModeU, | ||||||
|  |                 addressModeV = AddressModeV, | ||||||
|  |                 addressModeW = AddressModeW, | ||||||
|  |                 mipLodBias = MipLodBias, | ||||||
|  |                 anisotropyEnable = Conversions.BoolToByte(AnisotropyEnable), | ||||||
|  |                 maxAnisotropy = MaxAnisotropy, | ||||||
|  |                 compareEnable = Conversions.BoolToByte(CompareEnable), | ||||||
|  |                 compareOp = CompareOp, | ||||||
|  |                 minLod = MinLod, | ||||||
|  |                 maxLod = MaxLod, | ||||||
|  |                 borderColor = BorderColor | ||||||
|  |             }; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,31 @@ | ||||||
|  | using RefreshCS; | ||||||
|  | 
 | ||||||
|  | namespace Campari | ||||||
|  | { | ||||||
|  |     public struct TextureCreateInfo | ||||||
|  |     { | ||||||
|  |         public uint Width; | ||||||
|  |         public uint Height; | ||||||
|  |         public uint Depth; | ||||||
|  |         public bool IsCube; | ||||||
|  |         public Refresh.SampleCount SampleCount; | ||||||
|  |         public uint LevelCount; | ||||||
|  |         public Refresh.ColorFormat Format; | ||||||
|  |         public Refresh.TextureUsageFlags UsageFlags; | ||||||
|  | 
 | ||||||
|  |         public Refresh.TextureCreateInfo ToRefreshTextureCreateInfo() | ||||||
|  |         { | ||||||
|  |             return new Refresh.TextureCreateInfo | ||||||
|  |             { | ||||||
|  |                 width = Width, | ||||||
|  |                 height = Height, | ||||||
|  |                 depth = Depth, | ||||||
|  |                 isCube = Conversions.BoolToByte(IsCube), | ||||||
|  |                 sampleCount = SampleCount, | ||||||
|  |                 levelCount = LevelCount, | ||||||
|  |                 format = Format, | ||||||
|  |                 usageFlags = UsageFlags | ||||||
|  |             }; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										123
									
								
								src/Texture.cs
								
								
								
								
							
							
						
						
									
										123
									
								
								src/Texture.cs
								
								
								
								
							|  | @ -21,34 +21,111 @@ namespace Campari | ||||||
|                 out var channels |                 out var channels | ||||||
|             ); |             ); | ||||||
| 
 | 
 | ||||||
|             Refresh.TextureCreateInfo textureCreateInfo; |             Campari.TextureCreateInfo textureCreateInfo; | ||||||
|             textureCreateInfo.width = (uint) width; |             textureCreateInfo.Width = (uint)width; | ||||||
|             textureCreateInfo.height = (uint) height; |             textureCreateInfo.Height = (uint)height; | ||||||
|             textureCreateInfo.depth = 1; |             textureCreateInfo.Depth = 1; | ||||||
|             textureCreateInfo.format = Refresh.ColorFormat.R8G8B8A8; |             textureCreateInfo.Format = Refresh.ColorFormat.R8G8B8A8; | ||||||
|             textureCreateInfo.isCube = 0; |             textureCreateInfo.IsCube = false; | ||||||
|             textureCreateInfo.levelCount = 1; |             textureCreateInfo.LevelCount = 1; | ||||||
|             textureCreateInfo.sampleCount = Refresh.SampleCount.One; |             textureCreateInfo.SampleCount = Refresh.SampleCount.One; | ||||||
|             textureCreateInfo.usageFlags = (uint) Refresh.TextureUsageFlagBits.SamplerBit; |             textureCreateInfo.UsageFlags = Refresh.TextureUsageFlags.SamplerBit; | ||||||
| 
 | 
 | ||||||
|             var texture = new Texture(device, ref textureCreateInfo); |             var texture = new Texture(device, ref textureCreateInfo); | ||||||
| 
 | 
 | ||||||
|             texture.SetData(pixels, (uint) (width * height * 4)); |             texture.SetData(pixels, (uint)(width * height * 4)); | ||||||
| 
 | 
 | ||||||
|             Refresh.Refresh_Image_Free(pixels); |             Refresh.Refresh_Image_Free(pixels); | ||||||
|             return texture; |             return texture; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Texture(RefreshDevice device, ref Refresh.TextureCreateInfo textureCreateInfo) : base(device) |         public static Texture CreateTexture2D( | ||||||
|  |             RefreshDevice device, | ||||||
|  |             uint width, | ||||||
|  |             uint height, | ||||||
|  |             Refresh.ColorFormat format, | ||||||
|  |             Refresh.TextureUsageFlags usageFlags, | ||||||
|  |             Refresh.SampleCount sampleCount = Refresh.SampleCount.One, | ||||||
|  |             uint levelCount = 1 | ||||||
|  |         ) | ||||||
|         { |         { | ||||||
|  |             var textureCreateInfo = new Campari.TextureCreateInfo | ||||||
|  |             { | ||||||
|  |                 Width = width, | ||||||
|  |                 Height = height, | ||||||
|  |                 Depth = 1, | ||||||
|  |                 IsCube = false, | ||||||
|  |                 SampleCount = sampleCount, | ||||||
|  |                 LevelCount = levelCount, | ||||||
|  |                 Format = format, | ||||||
|  |                 UsageFlags = usageFlags | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             return new Texture(device, ref textureCreateInfo); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static Texture CreateTexture3D( | ||||||
|  |             RefreshDevice device, | ||||||
|  |             uint width, | ||||||
|  |             uint height, | ||||||
|  |             uint depth, | ||||||
|  |             Refresh.ColorFormat format, | ||||||
|  |             Refresh.TextureUsageFlags usageFlags, | ||||||
|  |             Refresh.SampleCount sampleCount = Refresh.SampleCount.One, | ||||||
|  |             uint levelCount = 1 | ||||||
|  |         ) | ||||||
|  |         { | ||||||
|  |             var textureCreateInfo = new Campari.TextureCreateInfo | ||||||
|  |             { | ||||||
|  |                 Width = width, | ||||||
|  |                 Height = height, | ||||||
|  |                 Depth = depth, | ||||||
|  |                 IsCube = false, | ||||||
|  |                 SampleCount = sampleCount, | ||||||
|  |                 LevelCount = levelCount, | ||||||
|  |                 Format = format, | ||||||
|  |                 UsageFlags = usageFlags | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             return new Texture(device, ref textureCreateInfo); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static Texture CreateTextureCube( | ||||||
|  |             RefreshDevice device, | ||||||
|  |             uint size, | ||||||
|  |             Refresh.ColorFormat format, | ||||||
|  |             Refresh.TextureUsageFlags usageFlags, | ||||||
|  |             Refresh.SampleCount sampleCount = Refresh.SampleCount.One, | ||||||
|  |             uint levelCount = 1 | ||||||
|  |         ) | ||||||
|  |         { | ||||||
|  |             var textureCreateInfo = new Campari.TextureCreateInfo | ||||||
|  |             { | ||||||
|  |                 Width = size, | ||||||
|  |                 Height = size, | ||||||
|  |                 Depth = 1, | ||||||
|  |                 IsCube = true, | ||||||
|  |                 SampleCount = sampleCount, | ||||||
|  |                 LevelCount = levelCount, | ||||||
|  |                 Format = format, | ||||||
|  |                 UsageFlags = usageFlags | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             return new Texture(device, ref textureCreateInfo); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public Texture(RefreshDevice device, ref Campari.TextureCreateInfo textureCreateInfo) : base(device) | ||||||
|  |         { | ||||||
|  |             var refreshTextureCreateInfo = textureCreateInfo.ToRefreshTextureCreateInfo(); | ||||||
|  | 
 | ||||||
|             Handle = Refresh.Refresh_CreateTexture( |             Handle = Refresh.Refresh_CreateTexture( | ||||||
|                 device.Handle, |                 device.Handle, | ||||||
|                 ref textureCreateInfo |                 ref refreshTextureCreateInfo | ||||||
|             ); |             ); | ||||||
| 
 | 
 | ||||||
|             Format = textureCreateInfo.format; |             Format = textureCreateInfo.Format; | ||||||
|             Width = textureCreateInfo.width; |             Width = textureCreateInfo.Width; | ||||||
|             Height = textureCreateInfo.height; |             Height = textureCreateInfo.Height; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void SetData(IntPtr data, uint dataLengthInBytes) |         public void SetData(IntPtr data, uint dataLengthInBytes) | ||||||
|  | @ -57,8 +134,8 @@ namespace Campari | ||||||
|             textureSlice.texture = Handle; |             textureSlice.texture = Handle; | ||||||
|             textureSlice.rectangle.x = 0; |             textureSlice.rectangle.x = 0; | ||||||
|             textureSlice.rectangle.y = 0; |             textureSlice.rectangle.y = 0; | ||||||
|             textureSlice.rectangle.w = (int) Width; |             textureSlice.rectangle.w = (int)Width; | ||||||
|             textureSlice.rectangle.h = (int) Height; |             textureSlice.rectangle.h = (int)Height; | ||||||
|             textureSlice.level = 0; |             textureSlice.level = 0; | ||||||
|             textureSlice.layer = 0; |             textureSlice.layer = 0; | ||||||
|             textureSlice.depth = 0; |             textureSlice.depth = 0; | ||||||
|  | @ -70,5 +147,17 @@ namespace Campari | ||||||
|                 dataLengthInBytes |                 dataLengthInBytes | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public void SetData(ref TextureSlice textureSlice, IntPtr data, uint dataLengthInBytes) | ||||||
|  |         { | ||||||
|  |             var refreshTextureSlice = textureSlice.ToRefreshTextureSlice(); | ||||||
|  | 
 | ||||||
|  |             Refresh.Refresh_SetTextureData( | ||||||
|  |                 Device.Handle, | ||||||
|  |                 ref refreshTextureSlice, | ||||||
|  |                 data, | ||||||
|  |                 dataLengthInBytes | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue