public EnvironmentCube (string cubemapPath, PipelineLayout plLayout, Queue staggingQ, RenderPass renderPass, PipelineCache cache = null)
: base (renderPass, cache, "EnvCube pipeline") {
+ using (GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, renderPass.Samples, false)) {
+ cfg.RenderPass = renderPass;
+ cfg.Layout = plLayout;
+ cfg.AddVertexBinding (0, 3 * sizeof (float));
+ cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat);
+ cfg.AddShaders (
+ new ShaderInfo (Dev, VkShaderStageFlags.Vertex, "#EnvironmentPipeline.skybox.vert.spv"),
+ new ShaderInfo (Dev, VkShaderStageFlags.Fragment, STR_FRAG_PATH)
+ );
+
+ cfg.multisampleState.rasterizationSamples = Samples;
+
+ layout = cfg.Layout;
+
+ init (cfg);
+ }
+
using (CommandPool cmdPool = new CommandPool (staggingQ.Dev, staggingQ.index)) {
vboSkybox = new GPUBuffer<float> (staggingQ, cmdPool, VkBufferUsageFlags.VertexBuffer, box_vertices);
cubemap.SetName ("skybox Texture");
cubemap.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
- using (GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, renderPass.Samples, false)) {
- cfg.RenderPass = renderPass;
- cfg.Layout = plLayout;
- cfg.AddVertexBinding (0, 3 * sizeof (float));
- cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat);
- cfg.AddShaders (
- new ShaderInfo (Dev, VkShaderStageFlags.Vertex, "#EnvironmentPipeline.skybox.vert.spv"),
- new ShaderInfo (Dev, VkShaderStageFlags.Fragment, STR_FRAG_PATH)
- );
-
- cfg.multisampleState.rasterizationSamples = Samples;
-
- layout = cfg.Layout;
-
- init (cfg);
- }
-
generateBRDFLUT (staggingQ, cmdPool);
generateCubemaps (staggingQ, cmdPool);
}
new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Vertex, VkDescriptorType.UniformBuffer),
new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler));
- GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount4, false);
+ using (GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount4, false)) {
- cfg.Layout = new PipelineLayout (dev, dsLayout);
- cfg.Layout.AddPushConstants (new VkPushConstantRange (VkShaderStageFlags.Fragment, (uint)Marshal.SizeOf<Vector4> () * 2));
+ cfg.Layout = new PipelineLayout (dev, dsLayout);
+ cfg.Layout.AddPushConstants (new VkPushConstantRange (VkShaderStageFlags.Fragment, (uint)Marshal.SizeOf<Vector4> () * 2));
- cfg.RenderPass = new RenderPass (dev, swapChain.ColorFormat, cfg.Samples);
+ cfg.RenderPass = new RenderPass (dev, swapChain.ColorFormat, cfg.Samples);
- cfg.blendAttachments[0] = new VkPipelineColorBlendAttachmentState (
- true, VkBlendFactor.One, VkBlendFactor.OneMinusSrcAlpha, VkBlendOp.Add, VkBlendFactor.One, VkBlendFactor.Zero);
+ cfg.blendAttachments[0] = new VkPipelineColorBlendAttachmentState (
+ true, VkBlendFactor.One, VkBlendFactor.OneMinusSrcAlpha, VkBlendOp.Add, VkBlendFactor.One, VkBlendFactor.Zero);
- cfg.AddVertexBinding (0, 5 * sizeof (float));
- cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat);
+ cfg.AddVertexBinding (0, 5 * sizeof (float));
+ cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat);
- cfg.AddShader (dev, VkShaderStageFlags.Vertex, "#shaders.main.vert.spv");
- cfg.AddShader (dev, VkShaderStageFlags.Fragment, "#shaders.main.frag.spv");
+ cfg.AddShader (dev, VkShaderStageFlags.Vertex, "#shaders.main.vert.spv");
+ cfg.AddShader (dev, VkShaderStageFlags.Fragment, "#shaders.main.frag.spv");
- pipeline = new GraphicPipeline (cfg);
+ pipeline = new GraphicPipeline (cfg);
+ }
uboMats = new HostBuffer (dev, VkBufferUsageFlags.UniformBuffer, matrices);
uboMats.Map ();//permanent map
namespace Triangle {
class Program : VkWindow {
static void Main (string[] args) {
+#if DEBUG
+ Instance.VALIDATION = true;
+#endif
using (Program vke = new Program ()) {
vke.Run ();
}
#if WITH_SHADOWS
cfg.AddShader (dev, VkShaderStageFlags.Fragment, "#shaders.compose_with_shadows.frag.spv", constants);
#else
- cfg.AddShader (dev, VkShaderStageFlags.Fragment, "#shaders.compose.frag.spv", constants);
+ cfg.AddShader (dev, VkShaderStageFlags.Fragment, "#shaders.compose.frag.spv", constants);
#endif
composePipeline = new GraphicPipeline (cfg);
}
/// Hold shader specialization constant value and type
/// </summary>
public class SpecializationConstant<T> : SpecializationConstant {
- T val;
- IntPtr ptr = IntPtr.Zero;
+ T val;
- public T Value {
- get { return val; }
- set {
- val = value;
- if (ptr != IntPtr.Zero)
- WriteTo (ptr);
- }
- }
+ public T Value => val;
#region CTOR
public SpecializationConstant (uint id, T value) : base(id) {
#endregion
public override uint Size => (uint)Marshal.SizeOf<T> ();
- public unsafe override void WriteTo (IntPtr ptr) {
- this.ptr = ptr;
-
+ internal unsafe override void WriteTo (IntPtr ptr) {
if (typeof (T) == typeof (float)) {
float v = Convert.ToSingle (Value);
System.Buffer.MemoryCopy (&v, ptr.ToPointer (), 4, 4);
this.id = id;
}
public abstract uint Size { get; }
- public abstract void WriteTo (IntPtr ptr);
+ internal abstract void WriteTo (IntPtr ptr);
}
/// <summary>
public List<Image> attachments = new List<Image> ();
VkFramebufferCreateInfo createInfo = VkFramebufferCreateInfo.New ();
-
+ /// <summary>Framebuffer width.</summary>
public uint Width => createInfo.width;
+ /// <summary>Framebuffer height.</summary>
public uint Height => createInfo.height;
+ /// <summary>Framebuffer layers count.</summary>
public uint Layers => createInfo.layers;
protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
/// <param name="_renderPass">Render pass.</param>
/// <param name="_width">Width.</param>
/// <param name="_height">Height.</param>
- /// <param name="views">Views.</param>
+ /// <param name="views">Array of image views. If null and not in unused state, attachment image and view will be automatically created from the
+ /// supplied renderpass configuration.</param>
public FrameBuffer (RenderPass _renderPass, uint _width, uint _height, params Image[] views)
: this (_renderPass, _width, _height) {
for (int i = 0; i < views.Length; i++) {
RenderPass = renderPass;
}
/// <summary>
- /// Create a new Pipeline with supplied RenderPass
+ /// Create a new Pipeline with supplied configuration
/// </summary>
public GraphicPipeline (GraphicPipelineConfig cfg, string name = "graphic pipeline") : this (cfg.RenderPass, cfg.Cache, name) {
layout = cfg.Layout;
init (cfg);
}
- #endregion
+ #endregion
- public override void Activate () => throw new NotSupportedException ("Please initialize graphic pipeline through the init method");
+ public override void Activate () => throw new NotSupportedException ("Please initialize graphic pipeline through the init method");
protected void init (GraphicPipelineConfig cfg) {
if (state != ActivableState.Activated) {
using static Vulkan.Vk;
namespace vke {
+ /// <summary>
+ /// Abstract base classe for vulkan pipelines.
+ /// </summary>
public abstract class Pipeline : Activable {
protected VkPipeline handle;
protected PipelineLayout layout;
protected PipelineCache Cache;
+ /// <summary>
+ /// Vulkan handle of the pipeline.
+ /// </summary>
public VkPipeline Handle => handle;
+ /// <summary>
+ /// Pipeline layout, activated on pipeline activation.
+ /// </summary>
public PipelineLayout Layout => layout;
protected readonly VkPipelineBindPoint bindPoint;
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Pipeline, handle.Handle);
+
#region CTORS
protected Pipeline (Device dev, PipelineCache cache = null, string name = "custom pipeline") : base(dev, name) {
this.Cache = cache;
}
- #endregion
-
- protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
- => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Pipeline, handle.Handle);
+ #endregion
+ /*/// <summary>
+ /// PipelineCache and PipelineLayout will also be activated if present.
+ /// </summary>
+ public override void Activate () {
+ Cache?.Activate ();
+ layout?.Activate ();
+ base.Activate ();
+ }*/
+ /// <summary>
+ /// Bind Pipeline command call
+ /// </summary>
+ /// <param name="cmd">Recording command buffer</param>
public abstract void Bind (CommandBuffer cmd);
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="cmd">Recording command buffer</param>
+ /// <param name="dset"></param>
+ /// <param name="firstSet">first descriptor set to bind</param>
public abstract void BindDescriptorSet (CommandBuffer cmd, DescriptorSet dset, uint firstSet = 0);
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="cmd">Recording command buffer</param>
+ /// <param name="obj">a blittable object that contains the data to push</param>
+ /// <param name="rangeIndex"></param>
+ /// <param name="offset">byte offset</param>
public void PushConstant (CommandBuffer cmd, object obj, int rangeIndex = 0, uint offset = 0) {
cmd.PushConstant (layout, layout.PushConstantRanges[rangeIndex].stageFlags, obj, offset);
}
/// </summary>
public static bool SaveOnDispose;
/// <summary>
- /// If true, cache will be restore on activation
+ /// If true, cache will be restored on activation
/// </summary>
public static bool LoadOnActivation;
readonly string globalConfigPath;
readonly string cacheFile;
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.PipelineCache, handle.Handle);
+
#region CTOR
public PipelineCache (Device dev, string cacheFile = "pipelines.bin", string name = "pipeline cache") : base(dev, name) {
string configRoot = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.UserProfile), ".config");
}
base.Activate ();
}
-
- protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
- => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.PipelineCache, handle.Handle);
-
+ /// <summary>
+ /// Delete pipeline backend file from disk if file exist.
+ /// </summary>
public void Delete () {
string path = Path.Combine (globalConfigPath, cacheFile);
if (File.Exists (path))
File.Delete (path);
}
-
+ /// <summary>
+ /// Save pipeline cache on disk in the user/.config/application directory.
+ /// </summary>
public void Save () {
if (state != ActivableState.Activated)
return;
}
public override void Activate () {
if (state != ActivableState.Activated) {
- presentComplete = Dev.CreateSemaphore ();
- presentComplete.SetDebugMarkerName (Dev, "Semaphore PresentComplete");
Create ();
}
base.Activate ();
/// </summary>
public void Create () {
- Dev.WaitIdle ();
+ Dev.WaitIdle ();
VkSurfaceCapabilitiesKHR capabilities = Dev.phy.GetSurfaceCapabilities (presentQueue.Surface);
if (Handle.Handle != 0)
_destroy ();
+
+ presentComplete = Dev.CreateSemaphore ();
+ presentComplete.SetDebugMarkerName (Dev, "Semaphore PresentComplete");
Handle = newSwapChain;
Utils.CheckResult (vkGetSwapchainImagesKHR (Dev.VkDev, Handle, out uint imageCount, IntPtr.Zero));
for (int i = 0; i < ImageCount; i++)
images[i].Dispose ();
vkDestroySwapchainKHR (Dev.VkDev, Handle, IntPtr.Zero);
+ Dev.DestroySemaphore (presentComplete);
}
public override string ToString () {
if (state == ActivableState.Activated) {
if (!disposing)
System.Diagnostics.Debug.WriteLine ("VKE Swapchain disposed by finalizer");
-
- Dev.DestroySemaphore (presentComplete);
+
_destroy ();
} else if (disposing)
<ItemGroup>
<PackageReference Include="SpirVTasks" Version="$(SpirVTasksPackageVersion)" />
- <PackageReference Include="Vulkan" Version="0.2.3-beta" />
+ <PackageReference Include="Vulkan" Version="0.2.4" />
<PackageReference Include="shaderc.net" Version="0.1.0" />
- <PackageReference Include="glfw-sharp" Version="0.2.10-beta" />
+ <PackageReference Include="glfw-sharp" Version="0.2.12-beta" />
</ItemGroup>
<ItemGroup>