From 0ba6789c6cd9542cb5a3890ef2cb9c800d1beab9 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?=
Date: Fri, 17 Jan 2020 03:06:38 +0100
Subject: [PATCH] debug, wip
---
SpirVTasks/CompileGLSLTask.cs | 27 ++-
SpirVTasks/README.md | 34 ++-
SpirVTasks/SpirVTasks.csproj | 72 +++---
SpirVTasks/SpirVTasks.targets | 2 +-
addons/Directory.Build.props | 15 +-
.../EnvironmentPipeline.cs | 5 +-
.../EnvironmentPipeline.csproj | 2 +-
addons/gltfLoader/gltfLoader.csproj | 2 +-
samples/Directory.Build.props | 18 +-
samples/DistanceFieldFontTest/Program.cs | 4 +-
samples/Model/main.cs | 26 +--
samples/Textured/main.cs | 13 +-
samples/TexturedCube/main.cs | 4 +-
samples/Triangle/main.cs | 39 +++-
samples/compute/delaunay.cs | 6 +-
samples/deferred/DeferredPbrRenderer.cs | 74 +++----
samples/deferred/deferred.csproj | 64 ++----
samples/deferred/main.cs | 208 ++----------------
.../shaders/compose_with_shadows.frag | 2 +-
samples/deferred/shaders/tone_mapping.frag | 16 +-
samples/deferred/shadowMapRenderer.cs | 8 +-
samples/pbr/PbrPipeline.cs | 57 ++---
samples/pbr/main.cs | 70 ++++--
samples/pbr/pbr.csproj | 11 +-
vke.net.sln | 99 ++++++---
vke/shaders/debug.frag | 12 +
vke/shaders/debug.vert | 26 +++
vke/src/Camera.cs | 7 +-
vke/src/ExtensionMethods.cs | 52 ++---
vke/src/Utils.cs | 22 ++
vke/src/VkWindow.cs | 12 +-
vke/src/base/Activable.cs | 13 +-
vke/src/base/Buffer.cs | 5 +-
vke/src/base/CommandBuffer.cs | 6 +-
vke/src/base/CommandPool.cs | 4 +-
vke/src/base/DebuDrawPipeline.cs | 4 +-
vke/src/base/DebugUtilsMessenger.cs | 16 +-
vke/src/base/DescriptorPool.cs | 19 +-
vke/src/base/DescriptorSetLayout.cs | 7 +-
vke/src/base/Device.cs | 10 +-
vke/src/base/FrameBuffer.cs | 9 +-
vke/src/base/GraphicPipeline.cs | 1 -
vke/src/base/GraphicPipelineConfig.cs | 33 ++-
vke/src/base/Image.cs | 31 ++-
vke/src/base/Instance.cs | 13 +-
vke/src/base/Pipeline.cs | 4 +-
vke/src/base/PipelineCache.cs | 5 +-
vke/src/base/PipelineLayout.cs | 4 +-
vke/src/base/QueryPool.cs | 4 +-
vke/src/base/RenderPass.cs | 8 +-
vke/src/base/SwapChain.cs | 11 +-
vke/vke.csproj | 9 +-
52 files changed, 606 insertions(+), 619 deletions(-)
create mode 100644 vke/shaders/debug.frag
create mode 100644 vke/shaders/debug.vert
diff --git a/SpirVTasks/CompileGLSLTask.cs b/SpirVTasks/CompileGLSLTask.cs
index 80765bc..e6774a6 100644
--- a/SpirVTasks/CompileGLSLTask.cs
+++ b/SpirVTasks/CompileGLSLTask.cs
@@ -61,7 +61,10 @@ namespace SpirVTasks {
get;
set;
}
- public ITaskItem Optimisation {
+ ///
+ /// Optional, set optimization flag. Accepted values are NONE, PERF and SIZE. By default PERF is selected.
+ ///
+ public ITaskItem Optimization {
get;
set;
}
@@ -205,12 +208,12 @@ namespace SpirVTasks {
}
}
string optimisationStr = "";
- if (!string.IsNullOrEmpty (Optimisation?.ItemSpec)) {
- if (string.Equals (Optimisation.ItemSpec, "perf", StringComparison.OrdinalIgnoreCase))
+ if (!string.IsNullOrEmpty (Optimization?.ItemSpec)) {
+ if (string.Equals (Optimization.ItemSpec, "perf", StringComparison.OrdinalIgnoreCase))
optimisationStr = "-O";
- else if (string.Equals (Optimisation.ItemSpec, "size", StringComparison.OrdinalIgnoreCase))
+ else if (string.Equals (Optimization.ItemSpec, "size", StringComparison.OrdinalIgnoreCase))
optimisationStr = "-Os";
- else if (string.Equals (Optimisation.ItemSpec, "none", StringComparison.OrdinalIgnoreCase))
+ else if (string.Equals (Optimization.ItemSpec, "none", StringComparison.OrdinalIgnoreCase))
optimisationStr = "-O0";
}else
optimisationStr = "-O";
@@ -229,7 +232,7 @@ namespace SpirVTasks {
glslc.OutputDataReceived += Glslc_OutputDataReceived;
glslc.ErrorDataReceived += Glslc_ErrorDataReceived;
- Log.LogMessage (MessageImportance.High, $"-> glslc {glslc.StartInfo.Arguments}");
+ Log.LogMessage (MessageImportance.Normal, $"-> glslc {glslc.StartInfo.Arguments}");
glslc.Start ();
@@ -252,9 +255,9 @@ namespace SpirVTasks {
string[] tmp = e.Data.Split (':');
- Log.LogMessage (MessageImportance.High, $"glslc: {e.Data}");
+ //Log.LogMessage (MessageImportance.High, $"glslc: {e.Data}");
- if (tmp.Length == 5) {
+ if (tmp.Length > 4) {
string srcFile = SourceFile.ItemSpec;
int line = Math.Max (0, int.Parse (tmp[1]));
@@ -271,7 +274,13 @@ namespace SpirVTasks {
//}
//Log.LogMessage (MessageImportance.High, $"====================================");
- BuildErrorEventArgs err = new BuildErrorEventArgs ("compile", tmp[2], srcFile, line, 0, 0, 0, $"{tmp[3]} {tmp[4]}", "no help", "SpirVTasks");
+
+ string msg = tmp[4];
+
+ if (tmp.Length > 5)
+ msg += tmp.Skip(5).Aggregate ((i, j) => i + ", " + j);
+
+ BuildErrorEventArgs err = new BuildErrorEventArgs ("compile", tmp[2], srcFile, line, 0, 0, 0, $"{tmp[3]} {msg}", "no help", "SpirVTasks");
BuildEngine.LogErrorEvent (err);
success = false;
} else {
diff --git a/SpirVTasks/README.md b/SpirVTasks/README.md
index e3659cd..7e72084 100644
--- a/SpirVTasks/README.md
+++ b/SpirVTasks/README.md
@@ -11,17 +11,18 @@
-`SpirVTasks` package add `SpirV` compilation support to msbuild project. Error and warning
-are routed to the `IDE`.
+**SpirVTasks** package add **SpirV** compilation support to msbuild project. Error and warning are routed to the `IDE`.
-
-#### Usage
+## Usage
```xml
+
+
+
```
-Resulting `.spv` files are embedded with resource ID = `ProjectName.file.ext.spv`. You can override the default resource id by adding a custom LogicalName.
+Resulting `.spv` files are embedded with resource ID = `ProjectName.file.ext.spv`. You can override the default resource id by adding a custom **LogicalName**.
```xml
@@ -29,14 +30,15 @@ Resulting `.spv` files are embedded with resource ID = `ProjectName.file.ext.spv
```
-`VULKAN_SDK`/bin then `PATH` are searched for the `glslc` executable. You can also use the `SpirVglslcPath` property.
+
+`VULKAN_SDK/bin` then `PATH` are searched for the `glslc` executable. You can also use the `SpirVglslcPath` property.
```xml
bin\glslc.exe
```
-#### Include in glsl
+## Include in glsl
```glsl
#include
@@ -55,6 +57,20 @@ Included files are searched from the location of the current parsed file, then i
```
-#### todo
+## Additional attributes
+
+**Optimisation** attribute will set compiler flag for resulting code optimizations.
+```
+
+```
+Default optimization if this attribute is not present is **PERF**, accepted values are:
+- NONE: no optimization.
+- PERF: spirv will be optimized for performances.
+- SIZE: resulting code size will be minimized.
+
+**DefineConstants** attribute may contains a semicolon separated list of implicit **MACRO** to define for compilation.
+
+```
+
+```
-- Error source file and line with included files.
diff --git a/SpirVTasks/SpirVTasks.csproj b/SpirVTasks/SpirVTasks.csproj
index 9657189..2636b86 100644
--- a/SpirVTasks/SpirVTasks.csproj
+++ b/SpirVTasks/SpirVTasks.csproj
@@ -1,41 +1,41 @@
+
-
- netstandard2.0
- 0.1.32
- false
- $(ReleaseVersion)
- MSBuild addon to compile and embed spirV shaders
-
- SpirVTasks
- vulkan msbuild spirv glsl addons
- $(ReleaseVersion)-beta
- True
- False
- https://github.com/jpbruyere/vk.net/blob/master/SpirVTasks/README.md
- MIT
- Jean-Philippe Bruyère
- $(SolutionDir)build\$(Configuration)\
-
- false
+
+ netstandard2.0
+
+ 0.1.37
+
+ false
+ $(ReleaseVersion)
+ MSBuild addon to compile and embed spirV shaders
+ SpirVTasks
+ vulkan msbuild spirv glsl addons
+ $(ReleaseVersion)-beta
+ True
+ False
+ https://github.com/jpbruyere/vk.net/blob/master/SpirVTasks/README.md
+ MIT
+ Jean-Philippe Bruyère
+ $(SolutionDir)build\$(Configuration)\
+ false
false
false
true
-
SpirVTasks_$(TargetFramework)
-
-
-
-
-
-
- true
- true
- build\
-
-
- true
- true
- build
-
-
-
+
+
+
+
+
+
+ true
+ true
+ build\
+
+
+ true
+ true
+ build
+
+
+
\ No newline at end of file
diff --git a/SpirVTasks/SpirVTasks.targets b/SpirVTasks/SpirVTasks.targets
index 6da971e..c1176e6 100644
--- a/SpirVTasks/SpirVTasks.targets
+++ b/SpirVTasks/SpirVTasks.targets
@@ -26,6 +26,6 @@
TaskParameter="Include"
ItemName="EmbeddedResource"/>
-
+
diff --git a/addons/Directory.Build.props b/addons/Directory.Build.props
index 29b7f6f..9f566b4 100644
--- a/addons/Directory.Build.props
+++ b/addons/Directory.Build.props
@@ -3,7 +3,7 @@
$(MSBuildThisFileDirectory)../
true
- netstandard2.0
+ netstandard2.0
https://github.com/jpbruyere/vke.net
MIT
@@ -26,17 +26,18 @@
NETSTANDARD;NETSTANDARD2_0;WITH_SHADOWS;_WITH_VKVG
-
+
-
-
-
+
+
+
-
+
+
-
+
diff --git a/addons/EnvironmentPipeline/EnvironmentPipeline.cs b/addons/EnvironmentPipeline/EnvironmentPipeline.cs
index cab3f30..fcb4c2c 100644
--- a/addons/EnvironmentPipeline/EnvironmentPipeline.cs
+++ b/addons/EnvironmentPipeline/EnvironmentPipeline.cs
@@ -5,6 +5,7 @@ using Vulkan;
namespace vke.Environment {
public class EnvironmentCube : GraphicPipeline {
+ public static string STR_FRAG_PATH = "#EnvironmentPipeline.skybox.frag.spv";
GPUBuffer vboSkybox;
@@ -13,7 +14,7 @@ namespace vke.Environment {
public Image irradianceCube { get; private set; }
public Image prefilterCube { get; set; }
- public EnvironmentCube (string cubemapPath, DescriptorSet dsSkybox, PipelineLayout plLayout, Queue staggingQ, RenderPass renderPass, PipelineCache cache = null)
+ public EnvironmentCube (string cubemapPath, PipelineLayout plLayout, Queue staggingQ, RenderPass renderPass, PipelineCache cache = null)
: base (renderPass, cache, "EnvCube pipeline") {
using (CommandPool cmdPool = new CommandPool (staggingQ.Dev, staggingQ.index)) {
@@ -33,7 +34,7 @@ namespace vke.Environment {
cfg.AddVertexBinding (0, 3 * sizeof (float));
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat);
cfg.AddShader (VkShaderStageFlags.Vertex, "#EnvironmentPipeline.skybox.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#EnvironmentPipeline.skybox.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, STR_FRAG_PATH);
cfg.multisampleState.rasterizationSamples = Samples;
layout = cfg.Layout;
diff --git a/addons/EnvironmentPipeline/EnvironmentPipeline.csproj b/addons/EnvironmentPipeline/EnvironmentPipeline.csproj
index ef6f39c..1344f29 100644
--- a/addons/EnvironmentPipeline/EnvironmentPipeline.csproj
+++ b/addons/EnvironmentPipeline/EnvironmentPipeline.csproj
@@ -3,7 +3,7 @@
EnvironmentPipeline
vke.EnvironmentPipeline
- 0.1.0
+ 0.1.2
vke.net Environment cube pipeline
vulkan c# vke.net
$(AssemblyVersion)-beta
diff --git a/addons/gltfLoader/gltfLoader.csproj b/addons/gltfLoader/gltfLoader.csproj
index 0e9ebb4..a9474c4 100644
--- a/addons/gltfLoader/gltfLoader.csproj
+++ b/addons/gltfLoader/gltfLoader.csproj
@@ -3,7 +3,7 @@
vke.gltfLoader
vke.gltfLoader
- 0.1.7
+ 0.1.8
vke.net gltf addons
C# vulkan CVKL gltf
$(AssemblyVersion)-beta
diff --git a/samples/Directory.Build.props b/samples/Directory.Build.props
index f96af28..f6d8442 100644
--- a/samples/Directory.Build.props
+++ b/samples/Directory.Build.props
@@ -19,25 +19,29 @@
- TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;_WITH_SHADOWS;WITH_VKVG
+ TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;WITH_SHADOWS;WITH_VKVG
NETSTANDARD;NETSTANDARD2_0;WITH_SHADOWS;_WITH_VKVG
-
+
-
-
+
+
-
+
-
+
+ shaders.%(Filename)%(Extension).spv
+
+
+ ui.%(Filename)%(Extension)
+
-
diff --git a/samples/DistanceFieldFontTest/Program.cs b/samples/DistanceFieldFontTest/Program.cs
index 666a1d1..7e0d330 100644
--- a/samples/DistanceFieldFontTest/Program.cs
+++ b/samples/DistanceFieldFontTest/Program.cs
@@ -92,8 +92,8 @@ namespace DistanceFieldFontTest {
cfg.AddVertexBinding (0, 5 * sizeof (float));
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#DistanceFieldFontTest.main.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#DistanceFieldFontTest.main.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Vertex, "#shaders.main.vert.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.main.frag.spv");
pipeline = new GraphicPipeline (cfg);
diff --git a/samples/Model/main.cs b/samples/Model/main.cs
index d4ce864..e93019d 100644
--- a/samples/Model/main.cs
+++ b/samples/Model/main.cs
@@ -26,10 +26,6 @@ namespace ModelSample
public Matrix4x4 model;
}
- public struct PushConstants {
- public Matrix4x4 matrix;
- }
-
Matrices matrices;
HostBuffer uboMats;
@@ -66,13 +62,7 @@ namespace ModelSample
new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
new VkDescriptorSetLayoutBinding (2, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler)
);
-
- VkPushConstantRange pushConstantRange = new VkPushConstantRange {
- stageFlags = VkShaderStageFlags.Vertex,
- size = (uint)Marshal.SizeOf(),
- offset = 0
- };
-
+
GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, NUM_SAMPLES);
cfg.rasterizationState.cullMode = VkCullModeFlags.Back;
if (NUM_SAMPLES != VkSampleCountFlags.SampleCount1) {
@@ -80,13 +70,13 @@ namespace ModelSample
cfg.multisampleState.minSampleShading = 0.5f;
}
- cfg.Layout = new PipelineLayout (dev, pushConstantRange, descLayoutMatrix, descLayoutTextures);
+ cfg.Layout = new PipelineLayout (dev, new VkPushConstantRange(VkShaderStageFlags.Vertex, (uint)Marshal.SizeOf ()), descLayoutMatrix, descLayoutTextures);
cfg.RenderPass = new RenderPass (dev, swapChain.ColorFormat, dev.GetSuitableDepthFormat (), cfg.Samples);
cfg.AddVertexBinding (0);
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#Model.model.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#Model.model.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Vertex, "#shaders.model.vert.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.model.frag.spv");
pipeline = new GraphicPipeline (cfg);
@@ -110,8 +100,8 @@ namespace ModelSample
}
public override void UpdateView () {
- matrices.projection = Matrix4x4.CreatePerspectiveFieldOfView (Utils.DegreesToRadians (45f),
- (float)swapChain.Width / (float)swapChain.Height, 0.1f, 256.0f) * Camera.VKProjectionCorrection;
+ matrices.projection = Utils.CreatePerspectiveFieldOfView (Utils.DegreesToRadians (45f),
+ (float)swapChain.Width / (float)swapChain.Height, 0.1f, 16.0f);
matrices.view =
Matrix4x4.CreateFromAxisAngle (Vector3.UnitZ, rotZ) *
Matrix4x4.CreateFromAxisAngle (Vector3.UnitY, rotY) *
@@ -148,8 +138,8 @@ namespace ModelSample
cmds[i].BindDescriptorSet (pipeline.Layout, dsMatrices);
cmds[i].BindDescriptorSet (pipeline.Layout, dsTextures, 1);
- PushConstants pc = new PushConstants { matrix = Matrix4x4.Identity };
- cmds[i].PushConstant (pipeline.Layout, VkShaderStageFlags.Vertex, pc, (uint)Marshal.SizeOf ());
+ Matrix4x4 matrix = Matrix4x4.Identity;
+ cmds[i].PushConstant (pipeline.Layout, VkShaderStageFlags.Vertex, matrix);
cmds[i].BindPipeline (pipeline);
diff --git a/samples/Textured/main.cs b/samples/Textured/main.cs
index e78dea0..b14dd45 100644
--- a/samples/Textured/main.cs
+++ b/samples/Textured/main.cs
@@ -60,13 +60,11 @@ namespace Textured {
ushort[] indices = { 0, 1, 2, 2, 0, 3 };
int currentImgIndex = 0;
string[] imgPathes = {
- "/mnt/devel/vulkan/VulkanExamples/data/models/voyager/voyager_rgba_unorm.ktx",
- "/mnt/devel/vulkan/vulkanExUpstream/data/models/voyager/voyager_astc_8x8_unorm.ktx",
- Utils.DataDirectory + "font.ktx",
- "/mnt/devel/vulkan/vulkanExUpstream/data/textures/trail_astc_8x8_unorm.ktx",
+ Utils.DataDirectory + "models/Bricks16_col.jpg",
Utils.DataDirectory + "textures/texturearray_rocks_bc3_unorm.ktx",
Utils.DataDirectory + "textures/texture.jpg",
Utils.DataDirectory + "textures/tex256.jpg",
+ Utils.DataDirectory + "font.ktx",
};
Program () : base () {
@@ -94,8 +92,8 @@ namespace Textured {
cfg.AddVertexBinding (0, 5 * sizeof(float));
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#Textured.main.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#Textured.main.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Vertex, "#shaders.main.vert.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.main.frag.spv");
pipeline = new GraphicPipeline (cfg);
@@ -112,6 +110,7 @@ namespace Textured {
}
void buildCommandBuffers () {
+ dev.WaitIdle ();
cmdPool.Reset();
for (int i = 0; i < swapChain.ImageCount; ++i) {
cmds[i].Start();
@@ -161,6 +160,8 @@ namespace Textured {
nextTexture.CreateSampler ();
nextTexture.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
+ dev.WaitIdle ();
+
DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descriptorSet, dsLayout.Bindings[1]);
uboUpdate.Write (dev, nextTexture.Descriptor);
diff --git a/samples/TexturedCube/main.cs b/samples/TexturedCube/main.cs
index 186817a..d15a029 100644
--- a/samples/TexturedCube/main.cs
+++ b/samples/TexturedCube/main.cs
@@ -131,8 +131,8 @@ namespace TextureCube {
cfg.AddVertexBinding (0, 5 * sizeof (float));
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#TexturedCube.skybox.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#TexturedCube.skybox.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Vertex, "#shaders.skybox.vert.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.skybox.frag.spv");
pipeline = new GraphicPipeline (cfg);
diff --git a/samples/Triangle/main.cs b/samples/Triangle/main.cs
index 3524a2d..d498562 100644
--- a/samples/Triangle/main.cs
+++ b/samples/Triangle/main.cs
@@ -2,12 +2,18 @@
//
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
using System;
+using System.IO;
using System.Numerics;
using System.Runtime.InteropServices;
+using System.Xml.Serialization;
using vke;
using Vulkan;
namespace Triangle {
+ public class Renderer {
+ public DescriptorPool descriptorPool;
+ [XmlIgnore] public DescriptorSetLayout dsLayout;
+ }
class Program : VkWindow {
static void Main (string[] args) {
#if DEBUG
@@ -44,8 +50,6 @@ namespace Triangle {
HostBuffer vbo;
HostBuffer uboMats;
- DescriptorPool descriptorPool;
- DescriptorSetLayout dsLayout;
DescriptorSet descriptorSet;
FrameBuffers frameBuffers;
@@ -58,6 +62,10 @@ namespace Triangle {
};
ushort[] indices = new ushort[] { 0, 1, 2 };
+
+
+ public Renderer r = new Renderer ();
+
Program () : base () {
cmds = cmdPool.AllocateCommandBuffer(swapChain.ImageCount);
@@ -65,27 +73,36 @@ namespace Triangle {
ibo = new HostBuffer (dev, VkBufferUsageFlags.IndexBuffer, indices);
uboMats = new HostBuffer (dev, VkBufferUsageFlags.UniformBuffer, matrices);
- descriptorPool = new DescriptorPool (dev, 1, new VkDescriptorPoolSize (VkDescriptorType.UniformBuffer));
- dsLayout = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, VkDescriptorType.UniformBuffer));
+ r.descriptorPool = new DescriptorPool (dev, 1,
+ new VkDescriptorPoolSize (VkDescriptorType.UniformBuffer),
+ new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler));
+
+ XmlSerializer serializer = new XmlSerializer (typeof(Renderer), Utils.GetXmlOverrides());
+ using (Stream s = new FileStream ("/home/jp/test.xml", FileMode.Create)) {
+ serializer.Serialize (s, r);
+ }
+
+
+ r.dsLayout = new DescriptorSetLayout (dev,
+ new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, VkDescriptorType.UniformBuffer));
GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount1,false);
- cfg.Layout = new PipelineLayout (dev, dsLayout);
+ cfg.Layout = new PipelineLayout (dev, r.dsLayout);
cfg.RenderPass = new RenderPass (dev, swapChain.ColorFormat, cfg.Samples);
cfg.AddVertexBinding (0);
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32b32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#Triangle.main.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#Triangle.main.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Vertex, "#shaders.main.vert.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.main.frag.spv");
pipeline = new GraphicPipeline (cfg);
//note that descriptor set is allocated after the pipeline creation that use this layout, layout is activated
//automaticaly on pipeline creation, and will be disposed automatically when no longuer in use.
- descriptorSet = descriptorPool.Allocate (dsLayout);
+ descriptorSet = r.descriptorPool.Allocate (r.dsLayout);
- DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descriptorSet, dsLayout);
+ DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descriptorSet, r.dsLayout);
uboUpdate.Write (dev, uboMats.Descriptor);
uboMats.Map ();
@@ -159,7 +176,7 @@ namespace Triangle {
pipeline.Dispose ();
frameBuffers?.Dispose();
- descriptorPool.Dispose ();
+ r.descriptorPool.Dispose ();
vbo.Dispose ();
ibo.Dispose ();
uboMats.Dispose ();
diff --git a/samples/compute/delaunay.cs b/samples/compute/delaunay.cs
index 52a3b49..4a36790 100644
--- a/samples/compute/delaunay.cs
+++ b/samples/compute/delaunay.cs
@@ -89,7 +89,7 @@ namespace delaunay {
cfg.ResetShadersAndVerticesInfos ();
cfg.AddShader (VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#compute.simpletexture.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.simpletexture.frag.spv");
cfg.blendAttachments[0] = new VkPipelineColorBlendAttachmentState (true);
@@ -97,10 +97,10 @@ namespace delaunay {
plCompute = new ComputePipeline (
new PipelineLayout (dev, new VkPushConstantRange (VkShaderStageFlags.Compute, 2 * sizeof (int)), dslCompute),
- "#compute.computeTest.comp.spv");
+ "#shaders.computeTest.comp.spv");
plNormalize = new ComputePipeline (
plCompute.Layout,
- "#compute.normalize.comp.spv");
+ "#shaders.normalize.comp.spv");
dsImage = dsPool.Allocate (dslImage);
dsetPing = dsPool.Allocate (dslCompute);
diff --git a/samples/deferred/DeferredPbrRenderer.cs b/samples/deferred/DeferredPbrRenderer.cs
index 3ccc4c0..a17e5b5 100644
--- a/samples/deferred/DeferredPbrRenderer.cs
+++ b/samples/deferred/DeferredPbrRenderer.cs
@@ -54,21 +54,21 @@ namespace deferred {
}
public Matrices matrices = new Matrices {
- scaleIBLAmbient = 0.5f,
+ scaleIBLAmbient = 1.0f,
};
public Light[] lights = {
new Light {
- position = new Vector4(2.5f,5.5f,2,0f),
- color = new Vector4(1,0.8f,0.8f,1)
+ position = new Vector4(1.5f,2.5f,1.5f,0f),
+ color = new Vector4(1,1.0f,1.0f,1)
},
- /*new Light {
- position = new Vector4(-2.5f,5.5f,2,0f),
+ new Light {
+ position = new Vector4(-1.5f,2.5f,1.5f,0f),
color = new Vector4(0.8f,0.8f,1,1)
- }*/
+ }
};
FrameBuffer frameBuffer;
- public Image gbColorRough, gbEmitMetal, gbN_AO, gbPos, hdrImgResolved, hdrImgMS;
+ public Image gbColorRough, gbEmitMetal, gbN_AO, gbPos, hdrImgResolved;
DescriptorPool descriptorPool;
DescriptorSetLayout descLayoutMain, descLayoutTextures, descLayoutGBuff;
@@ -132,14 +132,12 @@ namespace deferred {
void init_renderpass () {
renderPass = new RenderPass (dev, NUM_SAMPLES);
- renderPass.AddAttachment (HDR_FORMAT, VkImageLayout.ColorAttachmentOptimal, VkSampleCountFlags.SampleCount1);//final outpout
+ renderPass.AddAttachment (HDR_FORMAT, VkImageLayout.ShaderReadOnlyOptimal, NUM_SAMPLES);//final outpout
renderPass.AddAttachment (dev.GetSuitableDepthFormat (), VkImageLayout.DepthStencilAttachmentOptimal, NUM_SAMPLES);
renderPass.AddAttachment (VkFormat.R8g8b8a8Unorm, VkImageLayout.ColorAttachmentOptimal, NUM_SAMPLES, VkAttachmentLoadOp.Clear, VkAttachmentStoreOp.DontCare);//GBuff0 (color + roughness) and final color before resolve
renderPass.AddAttachment (VkFormat.R8g8b8a8Unorm, VkImageLayout.ColorAttachmentOptimal, NUM_SAMPLES, VkAttachmentLoadOp.Clear, VkAttachmentStoreOp.DontCare);//GBuff1 (emit + metal)
renderPass.AddAttachment (MRT_FORMAT, VkImageLayout.ColorAttachmentOptimal, NUM_SAMPLES, VkAttachmentLoadOp.Clear, VkAttachmentStoreOp.DontCare);//GBuff2 (normals + AO)
renderPass.AddAttachment (MRT_FORMAT, VkImageLayout.ColorAttachmentOptimal, NUM_SAMPLES, VkAttachmentLoadOp.Clear, VkAttachmentStoreOp.DontCare);//GBuff3 (Pos + depth)
- if (NUM_SAMPLES != VkSampleCountFlags.SampleCount1)
- renderPass.AddAttachment (HDR_FORMAT, VkImageLayout.ColorAttachmentOptimal, NUM_SAMPLES);//hdr color multisampled
renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
renderPass.ClearValues.Add (new VkClearValue { depthStencil = new VkClearDepthStencilValue (1.0f, 0) });
@@ -147,30 +145,24 @@ namespace deferred {
renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
- if (NUM_SAMPLES != VkSampleCountFlags.SampleCount1)
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
-
- uint mainHdr = NUM_SAMPLES == VkSampleCountFlags.SampleCount1 ? 0u : 6u;
SubPass[] subpass = { new SubPass (), new SubPass (), new SubPass ()};
//skybox
- subpass[SP_SKYBOX].AddColorReference (mainHdr, VkImageLayout.ColorAttachmentOptimal);
+ subpass[SP_SKYBOX].AddColorReference (0, VkImageLayout.ColorAttachmentOptimal);
//models
subpass[SP_MODELS].AddColorReference (new VkAttachmentReference (2, VkImageLayout.ColorAttachmentOptimal),
new VkAttachmentReference (3, VkImageLayout.ColorAttachmentOptimal),
new VkAttachmentReference (4, VkImageLayout.ColorAttachmentOptimal),
new VkAttachmentReference (5, VkImageLayout.ColorAttachmentOptimal));
subpass[SP_MODELS].SetDepthReference (1, VkImageLayout.DepthStencilAttachmentOptimal);
- subpass[SP_MODELS].AddPreservedReference (mainHdr);
+ subpass[SP_MODELS].AddPreservedReference (0);
//compose
- subpass[SP_COMPOSE].AddColorReference (mainHdr, VkImageLayout.ColorAttachmentOptimal);
+ subpass[SP_COMPOSE].AddColorReference (0, VkImageLayout.ColorAttachmentOptimal);
subpass[SP_COMPOSE].AddInputReference (new VkAttachmentReference (2, VkImageLayout.ShaderReadOnlyOptimal),
new VkAttachmentReference (3, VkImageLayout.ShaderReadOnlyOptimal),
new VkAttachmentReference (4, VkImageLayout.ShaderReadOnlyOptimal),
new VkAttachmentReference (5, VkImageLayout.ShaderReadOnlyOptimal));
- if (NUM_SAMPLES != VkSampleCountFlags.SampleCount1)
- subpass[SP_COMPOSE].AddResolveReference (0, VkImageLayout.ColorAttachmentOptimal);
//tone mapping
//subpass[SP_TONE_MAPPING].AddColorReference ((NUM_SAMPLES == VkSampleCountFlags.SampleCount1) ? 0u : 2u, VkImageLayout.ColorAttachmentOptimal);
//subpass[SP_TONE_MAPPING].AddInputReference (new VkAttachmentReference (6, VkImageLayout.ShaderReadOnlyOptimal));
@@ -273,11 +265,11 @@ namespace deferred {
new SpecializationConstant (1, farPlane),
new SpecializationConstant (2, MAX_MATERIAL_COUNT))) {
- cfg.AddShader (VkShaderStageFlags.Vertex, "#deferred.GBuffPbr.vert.spv");
+ cfg.AddShader (VkShaderStageFlags.Vertex, "#shaders.GBuffPbr.vert.spv");
if (TEXTURE_ARRAY)
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.GBuffPbrTexArray.frag.spv", constants);
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.GBuffPbrTexArray.frag.spv", constants);
else
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.GBuffPbr.frag.spv", constants);
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.GBuffPbr.frag.spv", constants);
gBuffPipeline = new GraphicPipeline (cfg);
}
@@ -294,25 +286,25 @@ namespace deferred {
new SpecializationConstant (0, (uint)lights.Length))) {
cfg.AddShader (VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv");
#if WITH_SHADOWS
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.compose_with_shadows.frag.spv", constants);
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.compose_with_shadows.frag.spv", constants);
#else
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.compose.frag.spv", constants);
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.compose.frag.spv", constants);
#endif
composePipeline = new GraphicPipeline (cfg);
}
//DEBUG DRAW use subpass of compose
- cfg.shaders[1] = new ShaderInfo (VkShaderStageFlags.Fragment, "#deferred.show_gbuff.frag.spv");
+ cfg.shaders[1] = new ShaderInfo (VkShaderStageFlags.Fragment, "#shaders.show_gbuff.frag.spv");
cfg.SubpassIndex = SP_COMPOSE;
debugPipeline = new GraphicPipeline (cfg);
////TONE MAPPING
- //cfg.shaders[1] = new ShaderInfo (VkShaderStageFlags.Fragment, "#deferred.tone_mapping.frag.spv");
+ //cfg.shaders[1] = new ShaderInfo (VkShaderStageFlags.Fragment, "#shaders.tone_mapping.frag.spv");
//cfg.SubpassIndex = SP_TONE_MAPPING;
//toneMappingPipeline = new GraphicPipeline (cfg);
dsMain = descriptorPool.Allocate (descLayoutMain);
dsGBuff = descriptorPool.Allocate (descLayoutGBuff);
- envCube = new EnvironmentCube (cubemapPath, dsMain, gBuffPipeline.Layout, gQueue, renderPass);
+ envCube = new EnvironmentCube (cubemapPath, gBuffPipeline.Layout, gQueue, renderPass);
matrices.prefilteredCubeMipLevels = envCube.prefilterCube.CreateInfo.mipLevels;
@@ -380,6 +372,7 @@ namespace deferred {
renderPass.BeginSubPass (cmd);
+ //cmd.BindDescriptorSet (composePipeline.Layout, dsMain);
cmd.BindDescriptorSet (composePipeline.Layout, dsGBuff, 1);
if (currentDebugView == DebugView.none)
@@ -415,15 +408,13 @@ namespace deferred {
camera.AspectRatio = (float)width / height;
matrices.projection = camera.Projection;
+ //matrices.projection = Utils.CreatePerspectiveFieldOfView (Utils.DegreesToRadians (60), 1, 0.1f, 16f);
matrices.view = camera.View;
+ //matrices.view = Matrix4x4.CreateLookAt (lights[0].position.ToVector3 (), Vector3.Zero, Vector3.UnitY);
matrices.model = camera.Model;
- matrices.camPos = new Vector4 (
- -camera.Position.Z * (float)Math.Sin (camera.Rotation.Y) * (float)Math.Cos (camera.Rotation.X),
- camera.Position.Z * (float)Math.Sin (camera.Rotation.X),
- camera.Position.Z * (float)Math.Cos (camera.Rotation.Y) * (float)Math.Cos (camera.Rotation.X),
- 0
- );
+ Matrix4x4.Invert (camera.View, out Matrix4x4 inv);
+ matrices.camPos = new Vector4 (inv.M41, inv.M42, inv.M43, 0);
uboMatrices.Update (matrices, (uint)Marshal.SizeOf ());
}
@@ -437,16 +428,13 @@ namespace deferred {
gbN_AO?.Dispose ();
gbPos?.Dispose ();
hdrImgResolved?.Dispose ();
- hdrImgMS?.Dispose ();
- hdrImgResolved = new Image (dev, HDR_FORMAT, VkImageUsageFlags.Sampled | VkImageUsageFlags.ColorAttachment | VkImageUsageFlags.TransferSrc, VkMemoryPropertyFlags.DeviceLocal, width, height, VkImageType.Image2D, VkSampleCountFlags.SampleCount1);
+ hdrImgResolved = new Image (dev, HDR_FORMAT, VkImageUsageFlags.Sampled | VkImageUsageFlags.ColorAttachment | VkImageUsageFlags.TransferSrc, VkMemoryPropertyFlags.DeviceLocal, width, height, VkImageType.Image2D, NUM_SAMPLES);
gbColorRough = new Image (dev, VkFormat.R8g8b8a8Unorm, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment | VkImageUsageFlags.TransientAttachment, VkMemoryPropertyFlags.DeviceLocal, width, height, VkImageType.Image2D, NUM_SAMPLES);
gbEmitMetal = new Image (dev, VkFormat.R8g8b8a8Unorm, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment | VkImageUsageFlags.TransientAttachment, VkMemoryPropertyFlags.DeviceLocal, width, height, VkImageType.Image2D, NUM_SAMPLES);
gbN_AO = new Image (dev, MRT_FORMAT, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment | VkImageUsageFlags.TransientAttachment, VkMemoryPropertyFlags.DeviceLocal, width, height, VkImageType.Image2D, NUM_SAMPLES);
gbPos = new Image (dev, MRT_FORMAT, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment | VkImageUsageFlags.TransientAttachment, VkMemoryPropertyFlags.DeviceLocal, width, height, VkImageType.Image2D, NUM_SAMPLES);
- if (NUM_SAMPLES != VkSampleCountFlags.SampleCount1)
- hdrImgMS = new Image (dev, HDR_FORMAT, VkImageUsageFlags.ColorAttachment | VkImageUsageFlags.TransientAttachment, VkMemoryPropertyFlags.DeviceLocal, width, height, VkImageType.Image2D, NUM_SAMPLES);
gbColorRough.CreateView (); gbColorRough.CreateSampler ();
@@ -460,9 +448,6 @@ namespace deferred {
hdrImgResolved.CreateView (); hdrImgResolved.CreateSampler ();
hdrImgResolved.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
- hdrImgMS?.CreateView ();
-
-
DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descLayoutGBuff);
uboUpdate.Write (dev, dsGBuff, gbColorRough.Descriptor,
gbEmitMetal.Descriptor,
@@ -474,7 +459,6 @@ namespace deferred {
gbN_AO.SetName ("GBuffN");
gbPos.SetName ("GBuffPos");
hdrImgResolved.SetName ("HDRimg resolved");
- hdrImgMS?.SetName ("HDRimg resolved");
}
public void Resize (uint width, uint height) {
@@ -484,11 +468,8 @@ namespace deferred {
frameBuffer?.Dispose ();
createGBuff ();
- frameBuffer = (NUM_SAMPLES == VkSampleCountFlags.SampleCount1) ?
- new FrameBuffer (renderPass, width, height, new Image[] {
- hdrImgResolved, null, gbColorRough, gbEmitMetal, gbN_AO, gbPos}) :
- new FrameBuffer (renderPass, width, height, new Image[] {
- hdrImgResolved, null, gbColorRough, gbEmitMetal, gbN_AO, gbPos, hdrImgMS});
+ frameBuffer = new FrameBuffer (renderPass, width, height, new Image[] {
+ hdrImgResolved, null, gbColorRough, gbEmitMetal, gbN_AO, gbPos});
}
public void Dispose () {
@@ -500,7 +481,6 @@ namespace deferred {
gbEmitMetal.Dispose ();
gbN_AO.Dispose ();
gbPos.Dispose ();
- hdrImgMS?.Dispose ();
hdrImgResolved.Dispose ();
gBuffPipeline.Dispose ();
diff --git a/samples/deferred/deferred.csproj b/samples/deferred/deferred.csproj
index 2db814f..06dbc9e 100644
--- a/samples/deferred/deferred.csproj
+++ b/samples/deferred/deferred.csproj
@@ -1,42 +1,26 @@
-
-
- false
-
-
-
-
- TRACE;NETSTANDARD;NETSTANDARD2_0;MEMORY_POOLS;WITH_SHADOWS;_WITH_VKVG;DEBUG;NETFRAMEWORK;NET472
-
-
- TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;MEMORY_POOLS;WITH_SHADOWS;_WITH_VKVG
-
-
-
-
-
-
-
-
-
-
- deferred.%(Filename)%(Extension)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ false
+
+
+
+ TRACE;NETSTANDARD;NETSTANDARD2_0;MEMORY_POOLS;WITH_SHADOWS;_WITH_VKVG;DEBUG;NETFRAMEWORK;NET472
+
+
+ TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;MEMORY_POOLS;WITH_SHADOWS;_WITH_VKVG
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/samples/deferred/main.cs b/samples/deferred/main.cs
index a607312..85e81aa 100644
--- a/samples/deferred/main.cs
+++ b/samples/deferred/main.cs
@@ -11,13 +11,13 @@ namespace deferred {
static void Main (string[] args) {
#if DEBUG
Instance.VALIDATION = true;
- //Instance.RENDER_DOC_CAPTURE = false;
+ Instance.RENDER_DOC_CAPTURE = true;
#endif
SwapChain.PREFERED_FORMAT = VkFormat.B8g8r8a8Srgb;
DeferredPbrRenderer.TEXTURE_ARRAY = true;
DeferredPbrRenderer.NUM_SAMPLES = VkSampleCountFlags.SampleCount1;
DeferredPbrRenderer.HDR_FORMAT = VkFormat.R16g16b16a16Sfloat;
- DeferredPbrRenderer.MRT_FORMAT = VkFormat.R32g32b32a32Sfloat;
+ DeferredPbrRenderer.MRT_FORMAT = VkFormat.R16g16b16a16Sfloat;
PbrModelTexArray.TEXTURE_DIM = 1024;
@@ -27,12 +27,11 @@ namespace deferred {
}
public override string[] EnabledInstanceExtensions => new string[] {
- Ext.I.VK_EXT_debug_utils
+ Ext.I.VK_EXT_debug_utils,
};
public override string[] EnabledDeviceExtensions => new string[] {
Ext.D.VK_KHR_swapchain,
- Ext.D.VK_EXT_debug_marker
};
protected override void configureEnabledFeatures (VkPhysicalDeviceFeatures available_features, ref VkPhysicalDeviceFeatures enabled_features) {
@@ -58,14 +57,15 @@ namespace deferred {
Utils.DataDirectory + "textures/uffizi_cube.ktx",
};
string[] modelPathes = {
+ "/mnt/devel/vkPinball/data/models/pinball.gltf",
Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf",
- Utils.DataDirectory + "models/shadow.glb",
+ //Utils.DataDirectory + "models/shadow.glb",
Utils.DataDirectory + "models/Hubble.glb",
Utils.DataDirectory + "models/MER_static.glb",
Utils.DataDirectory + "models/ISS_stationary.glb",
};
- int curModelIndex = 0;
+ int curModelIndex = 1;
bool reloadModel;
bool rebuildBuffers;
@@ -89,7 +89,7 @@ namespace deferred {
camera = new Camera (Utils.DegreesToRadians (45f), 1f, 0.1f, 16f);
- camera.SetPosition (0, 0, 2);
+ camera.SetPosition (0, 0, -2);
//renderer = new DeferredPbrRenderer (presentQueue, cubemapPathes[2], swapChain.Width, swapChain.Height, camera.NearPlane, camera.FarPlane);
renderer = new DeferredPbrRenderer (presentQueue, cubemapPathes[2], swapChain.Width, swapChain.Height, camera.NearPlane, camera.FarPlane);
@@ -106,139 +106,33 @@ namespace deferred {
);
GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, DeferredPbrRenderer.NUM_SAMPLES);
-
+ if (DeferredPbrRenderer.NUM_SAMPLES != VkSampleCountFlags.SampleCount1) {
+ cfg.multisampleState.sampleShadingEnable = true;
+ cfg.multisampleState.minSampleShading = 0.5f;
+ }
cfg.Layout = new PipelineLayout (dev,
new VkPushConstantRange (VkShaderStageFlags.Fragment, 2 * sizeof (float)),
new DescriptorSetLayout (dev, 0,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler)
+ new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler)
));
cfg.RenderPass = new RenderPass (dev, swapChain.ColorFormat, DeferredPbrRenderer.NUM_SAMPLES);
cfg.AddShader (VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.tone_mapping.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.tone_mapping.frag.spv");
plToneMap = new GraphicPipeline (cfg);
descriptorSet = descriptorPool.Allocate (cfg.Layout.DescriptorSetLayouts[0]);
- init_blur ();
- }
-
- ComputePipeline plBlur;
- DescriptorSetLayout dsLayoutBlur;
- DescriptorSet dsetBlurPing, dsetBlurPong;
- Image downSamp, downSamp2;
- CommandPool computeCmdPool;
-
- struct BlurPushCsts {
- public Vector2 texSize;
- public int dir;
- public float scale;
- public float strength;
- };
- BlurPushCsts pcBloom = new BlurPushCsts () { strength = 1.3f, scale = 0.4f };
-
- void init_blur () {
- computeCmdPool = new CommandPool (computeQ);
-
- blurComplete = dev.CreateSemaphore ();
-
- dsLayoutBlur = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Compute, VkDescriptorType.StorageImage),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Compute, VkDescriptorType.StorageImage)
- );
- plBlur = new ComputePipeline (
- new PipelineLayout (dev, new VkPushConstantRange (VkShaderStageFlags.Compute, (uint)Marshal.SizeOf ()), dsLayoutBlur),
- "#deferred.bloom.comp.spv");
-
- dsetBlurPing = descriptorPool.Allocate (dsLayoutBlur);
- dsetBlurPong = descriptorPool.Allocate (dsLayoutBlur);
- }
-
- void buildBlurCmd (CommandBuffer cmd) {
- renderer.hdrImgResolved.SetLayout (cmd, VkImageAspectFlags.Color,
- VkAccessFlags.ColorAttachmentWrite, VkAccessFlags.TransferRead,
- VkImageLayout.ColorAttachmentOptimal, VkImageLayout.TransferSrcOptimal,
- VkPipelineStageFlags.ColorAttachmentOutput, VkPipelineStageFlags.Transfer);
- downSamp.SetLayout (cmd, VkImageAspectFlags.Color,
- VkAccessFlags.ShaderRead, VkAccessFlags.TransferWrite,
- VkImageLayout.ShaderReadOnlyOptimal, VkImageLayout.TransferDstOptimal,
- VkPipelineStageFlags.FragmentShader, VkPipelineStageFlags.Transfer);
-
-
- renderer.hdrImgResolved.BlitTo (cmd, downSamp);
-
- renderer.hdrImgResolved.SetLayout (cmd, VkImageAspectFlags.Color,
- VkImageLayout.TransferSrcOptimal, VkImageLayout.ShaderReadOnlyOptimal,
- VkPipelineStageFlags.Transfer, VkPipelineStageFlags.FragmentShader);
-
- downSamp2.SetLayout (cmd, VkImageAspectFlags.Color,
- 0, VkAccessFlags.MemoryWrite,
- VkImageLayout.Undefined, VkImageLayout.General,
- VkPipelineStageFlags.AllCommands, VkPipelineStageFlags.ComputeShader);
-
- downSamp.SetLayout (cmd, VkImageAspectFlags.Color,
- VkAccessFlags.TransferWrite, VkAccessFlags.MemoryRead,
- VkImageLayout.TransferDstOptimal, VkImageLayout.General,
- VkPipelineStageFlags.Transfer, VkPipelineStageFlags.ComputeShader);
-
- plBlur.Bind (cmd);
-
- pcBloom.dir = 0;
- /*
- plBlur.BindDescriptorSet (cmd, dsetBlurPing);
- cmd.PushConstant (plBlur.Layout, VkShaderStageFlags.Compute, pcBloom);
- cmd.Dispatch (downSamp.Width / 16, downSamp.Height / 16);
-
- cmd.SetMemoryBarrier (VkPipelineStageFlags.ComputeShader, VkPipelineStageFlags.ComputeShader,
- VkAccessFlags.ShaderWrite, VkAccessFlags.ShaderRead);
-
- plBlur.BindDescriptorSet (cmd, dsetBlurPong);
- cmd.PushConstant (plBlur.Layout, VkShaderStageFlags.Compute, 1, (uint)Marshal.SizeOf ());
- cmd.Dispatch (downSamp.Width / 16, downSamp.Height / 16);
-
- downSamp.SetLayout (cmd, VkImageAspectFlags.Color,
- VkAccessFlags.MemoryWrite, VkAccessFlags.ShaderRead,
- VkImageLayout.General, VkImageLayout.ShaderReadOnlyOptimal,
- VkPipelineStageFlags.ComputeShader, VkPipelineStageFlags.FragmentShader);*/
-
- downSamp.SetLayout (cmd, VkImageAspectFlags.Color,
- VkAccessFlags.TransferWrite, VkAccessFlags.ShaderRead,
- VkImageLayout.TransferDstOptimal, VkImageLayout.ShaderReadOnlyOptimal,
- VkPipelineStageFlags.Transfer, VkPipelineStageFlags.FragmentShader);
-
- cmd.End ();
}
-
- //CommandBuffer cmdPbr;
- //CommandBuffer cmdBlur;
- VkSemaphore blurComplete;
- const uint downSizing = 1;
- float finalDebug = -1.0f;
-
void buildCommandBuffers () {
- //cmdPbr?.Free ();
- //cmdPbr = cmdPool.AllocateAndStart ();
- //renderer.buildCommandBuffers (cmdPbr);
- //cmdPbr.End ();
-
- //cmdBlur?.Free ();
- //cmdBlur = computeCmdPool.AllocateAndStart ();
- //buildBlurCmd (cmdBlur);
-
-
for (int i = 0; i < swapChain.ImageCount; ++i) {
cmds[i]?.Free ();
cmds[i] = cmdPool.AllocateAndStart ();
renderer.buildCommandBuffers (cmds[i]);
- //renderer.hdrImgResolved.SetLayout (cmds[i], VkImageAspectFlags.Color,
- //VkAccessFlags.TransferRead, VkAccessFlags.ShaderRead,
- //VkImageLayout.TransferSrcOptimal, VkImageLayout.ShaderReadOnlyOptimal,
- //VkPipelineStageFlags.Transfer, VkPipelineStageFlags.FragmentShader);
plToneMap.RenderPass.Begin (cmds[i], frameBuffers[i]);
@@ -248,17 +142,12 @@ namespace deferred {
plToneMap.Bind (cmds[i]);
plToneMap.BindDescriptorSet (cmds[i], descriptorSet);
- cmds[i].PushConstant (plToneMap.Layout, VkShaderStageFlags.Fragment, 12, new float[] { renderer.exposure, renderer.gamma, finalDebug }, 0);
+ cmds[i].PushConstant (plToneMap.Layout, VkShaderStageFlags.Fragment, 8, new float[] { renderer.exposure, renderer.gamma }, 0);
cmds[i].Draw (3, 1, 0, 0);
plToneMap.RenderPass.End (cmds[i]);
- renderer.hdrImgResolved.SetLayout (cmds[i], VkImageAspectFlags.Color,
- VkAccessFlags.ShaderRead, VkAccessFlags.ColorAttachmentWrite,
- VkImageLayout.ShaderReadOnlyOptimal, VkImageLayout.ColorAttachmentOptimal,
- VkPipelineStageFlags.FragmentShader, VkPipelineStageFlags.ColorAttachmentOutput);
-
cmds[i].End ();
}
}
@@ -291,21 +180,6 @@ namespace deferred {
}
-
- protected override void render () {
- int idx = swapChain.GetNextImage ();
- if (idx < 0) {
- OnResize ();
- return;
- }
-
- if (cmds[idx] == null)
- return;
-
- presentQueue.Submit (cmds[idx], swapChain.presentComplete, drawComplete[idx]);
- presentQueue.Present (swapChain, drawComplete[idx]);
- }
-
protected override void OnResize () {
base.OnResize ();
@@ -315,33 +189,12 @@ namespace deferred {
UpdateView ();
- downSamp?.Dispose ();
- downSamp2?.Dispose ();
- downSamp = new Image (dev, VkFormat.R16g16b16a16Sfloat, VkImageUsageFlags.TransferDst | VkImageUsageFlags.Storage | VkImageUsageFlags.Sampled,
- VkMemoryPropertyFlags.DeviceLocal, renderer.Width / downSizing, renderer.Height / downSizing, VkImageType.Image2D);
- downSamp2 = new Image (dev, VkFormat.R16g16b16a16Sfloat, VkImageUsageFlags.Storage,
- VkMemoryPropertyFlags.DeviceLocal, renderer.Width / downSizing, renderer.Height/ downSizing, VkImageType.Image2D);
- downSamp.CreateView (); downSamp.CreateSampler ();
- downSamp.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
- downSamp2.CreateView (); downSamp2.CreateSampler ();
- downSamp2.Descriptor.imageLayout = VkImageLayout.General;
-
- downSamp.SetName ("HDRimgDownScaled");
- downSamp2.SetName ("HDRimgDownScaled2");
-
- pcBloom.texSize.X = downSamp.Width;
- pcBloom.texSize.Y = downSamp.Height;
frameBuffers?.Dispose();
frameBuffers = plToneMap.RenderPass.CreateFrameBuffers(swapChain);
- DescriptorSetWrites dsUpdate = new DescriptorSetWrites (plToneMap.Layout.DescriptorSetLayouts[0]);
- dsUpdate.Write (dev, descriptorSet, renderer.hdrImgResolved.Descriptor, downSamp.Descriptor);
-
- dsUpdate = new DescriptorSetWrites (dsLayoutBlur);
- downSamp.Descriptor.imageLayout = VkImageLayout.General;
- dsUpdate.Write (dev, dsetBlurPong, downSamp2.Descriptor, downSamp.Descriptor);
- dsUpdate.Write (dev, dsetBlurPing, downSamp.Descriptor, downSamp2.Descriptor);
+ DescriptorSetWrites dsUpdate = new DescriptorSetWrites (plToneMap.Layout.DescriptorSetLayouts[0].Bindings[0]);
+ dsUpdate.Write (dev, descriptorSet, renderer.hdrImgResolved.Descriptor);
buildCommandBuffers ();
@@ -477,30 +330,6 @@ namespace deferred {
renderer.gamma += 0.1f;
rebuildBuffers = true;
break;
- case Key.D:
- finalDebug = -finalDebug;
- rebuildBuffers = true;
- break;
- case Key.B:
- if (modifiers.HasFlag (Modifier.Control)) {
- if (modifiers.HasFlag (Modifier.Shift))
- pcBloom.strength -= 0.1f;
- else
- pcBloom.strength += 0.1f;
- } else {
- if (modifiers.HasFlag (Modifier.Shift))
- pcBloom.scale *= 1.1f;
- else
- pcBloom.scale *= 0.9f;
- }
- Console.WriteLine ($"Bloom: scale = {pcBloom.scale}, strength = {pcBloom.strength}");
- rebuildBuffers = true;
- //if (camera.Type == Camera.CamType.FirstPerson)
- // camera.Type = Camera.CamType.LookAt;
- //else
- // camera.Type = Camera.CamType.FirstPerson;
- //Console.WriteLine ($"camera type = {camera.Type}");
- break;
case Key.KeypadAdd:
curModelIndex++;
if (curModelIndex >= modelPathes.Length)
@@ -525,17 +354,12 @@ namespace deferred {
dev.WaitIdle ();
if (disposing) {
if (!isDisposed) {
- computeCmdPool.Dispose ();
- downSamp?.Dispose ();
- downSamp2?.Dispose ();
frameBuffers?.Dispose();
renderer.Dispose ();
- plBlur.Dispose ();
plToneMap.Dispose ();
descriptorPool.Dispose ();
dbgmsg.Dispose ();
}
- dev.DestroySemaphore (blurComplete);
}
base.Dispose (disposing);
}
diff --git a/samples/deferred/shaders/compose_with_shadows.frag b/samples/deferred/shaders/compose_with_shadows.frag
index 68fc8bf..95d4940 100644
--- a/samples/deferred/shaders/compose_with_shadows.frag
+++ b/samples/deferred/shaders/compose_with_shadows.frag
@@ -181,7 +181,7 @@ void main()
// Obtain final intensity as reflectance (BRDF) scaled by the energy of the light (cosine law)
vec3 color = NdotL * lights[i].color.rgb * (diffuseContrib + specContrib);
- #if SHADOW
+ #ifdef WITH_SHADOWS
vec4 shadowClip = lights[i].mvp * vec4(pos, 1);
float shadowFactor = filterPCF(shadowClip, i);
// Calculate lighting contribution from image based lighting source (IBL)
diff --git a/samples/deferred/shaders/tone_mapping.frag b/samples/deferred/shaders/tone_mapping.frag
index 138bea8..98f4a69 100644
--- a/samples/deferred/shaders/tone_mapping.frag
+++ b/samples/deferred/shaders/tone_mapping.frag
@@ -2,31 +2,27 @@
layout(push_constant) uniform PushConsts {
float exposure;
- float gamma;
- float debug;
+ float gamma;
};
#include "tonemap.inc"
-layout (set = 0, binding = 0) uniform sampler2D samplerHDR;
-layout (set = 0, binding = 1) uniform sampler2D bloom;
+layout (set = 0, binding = 0) uniform sampler2DMS samplerHDR;
layout (location = 0) in vec2 inUV;
layout (location = 0) out vec4 outColor;
void main()
{
- if (debug < 0.0f) {
- //vec4 hdrColor = texelFetch (samplerHDR, ivec2(inUV), gl_SampleID);
- vec4 hdrColor = texture (samplerHDR, inUV);
+ ivec2 ts = textureSize(samplerHDR);
+ vec4 hdrColor = texelFetch (samplerHDR, ivec2(gl_FragCoord.xy), gl_SampleID);
+ //vec4 hdrColor = texelFetch (samplerHDR, inUV);
//vec4 c = texture (bloom, inUV);
//float lum = (0.299*c.r + 0.587*c.g + 0.114*c.b);
//if (lum>1.0)
// hdrColor.rgb += c.rgb * 0.05;
//outColor = SRGBtoLINEAR(tonemap(hdrColor, exposure, gamma));
- outColor = tonemap(hdrColor, exposure, gamma);
- }else
- outColor = texture (bloom, inUV);
+ outColor = tonemap(hdrColor, exposure, gamma);
/*
diff --git a/samples/deferred/shadowMapRenderer.cs b/samples/deferred/shadowMapRenderer.cs
index 41bc120..68ca479 100644
--- a/samples/deferred/shadowMapRenderer.cs
+++ b/samples/deferred/shadowMapRenderer.cs
@@ -84,11 +84,11 @@ namespace deferred {
new VkPushConstantRange (VkShaderStageFlags.Vertex|VkShaderStageFlags.Geometry, (uint)Marshal.SizeOf ())
);
- cfg.AddVertexBinding (0);
+ cfg.AddVertexBinding (0);
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#deferred.shadow.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Geometry, "#deferred.shadow.geom.spv");
+ cfg.AddShader (VkShaderStageFlags.Vertex, "#shaders.shadow.vert.spv");
+ cfg.AddShader (VkShaderStageFlags.Geometry, "#shaders.shadow.geom.spv");
shadowPipeline = new GraphicPipeline (cfg);
@@ -110,7 +110,7 @@ namespace deferred {
}
public void update_light_matrices () {
- Matrix4x4 proj = Matrix4x4.CreatePerspectiveFieldOfView (lightFOV, 1, 0.1f, lightFarPlane);
+ Matrix4x4 proj = Utils.CreatePerspectiveFieldOfView (lightFOV, 1, 0.1f, lightFarPlane);
for (int i = 0; i < renderer.lights.Length; i++) {
Matrix4x4 view = Matrix4x4.CreateLookAt (renderer.lights[i].position.ToVector3 (), Vector3.Zero, Vector3.UnitY);
renderer.lights[i].mvp = view * proj;
diff --git a/samples/pbr/PbrPipeline.cs b/samples/pbr/PbrPipeline.cs
index 8061ae7..7376266 100644
--- a/samples/pbr/PbrPipeline.cs
+++ b/samples/pbr/PbrPipeline.cs
@@ -26,9 +26,9 @@ namespace vke {
public Matrices matrices = new Matrices {
lightDir = Vector4.Normalize (new Vector4 (0.7f, 0.6f, 0.2f, 0.0f)),
- gamma = 2.2f,
- exposure = 4.5f,
- scaleIBLAmbient = 1f,
+ gamma = 1.2f,
+ exposure = 2.5f,
+ scaleIBLAmbient = 0.9f,
debugViewInputs = 0,
debugViewEquation = 0
};
@@ -84,8 +84,8 @@ namespace vke {
cfg.AddVertexBinding (0);
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat, VkFormat.R32g32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#pbr.pbr.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#pbr.pbr_khr.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Vertex, "#shaders.pbr.vert.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.pbr_khr.frag.spv");
layout = cfg.Layout;
@@ -93,46 +93,31 @@ namespace vke {
dsMain = descriptorPool.Allocate (descLayoutMain);
- envCube = new Environment.EnvironmentCube (cubemapPathes[0], dsMain, layout, staggingQ, RenderPass);
+ envCube = new Environment.EnvironmentCube (cubemapPathes[0], layout, staggingQ, RenderPass);
matrices.prefilteredCubeMipLevels = envCube.prefilterCube.CreateInfo.mipLevels;
uboMats = new HostBuffer (Dev, VkBufferUsageFlags.UniformBuffer, matrices, true);
- string[] modelPathes = {
- Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Avocado/glTF/Avocado.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/BarramundiFish/glTF/BarramundiFish.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/BoomBoxWithAxes/glTF/BoomBoxWithAxes.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Box/glTF/Box.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/EnvironmentTest/glTF/EnvironmentTest.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/MetalRoughSpheres/glTF/MetalRoughSpheres.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/OrientationTest/glTF/OrientationTest.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Buggy/glTF/Buggy.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/2CylinderEngine/glTF-Embedded/2CylinderEngine.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/FlightHelmet/glTF/FlightHelmet.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/GearboxAssy/glTF/GearboxAssy.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Lantern/glTF/Lantern.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/SciFiHelmet/glTF/SciFiHelmet.gltf",
- "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Sponza/glTF/Sponza.gltf",
- "/mnt/devel/vkChess/data/chess.gltf"
- };
-
-
- model = new PbrModel2 (staggingQ, modelPathes[0], descLayoutTextures,
+ DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descLayoutMain.Bindings.GetRange(0,4).ToArray());
+ uboUpdate.Write (Dev, dsMain,
+ uboMats.Descriptor,
+ envCube.irradianceCube.Descriptor,
+ envCube.prefilterCube.Descriptor,
+ envCube.lutBrdf.Descriptor);
+ }
+
+ public void LoadModel (Queue staggingQ, string path) {
+ model?.Dispose ();
+
+ model = new PbrModel2 (staggingQ, path, descLayoutTextures,
AttachmentType.Color,
AttachmentType.PhysicalProps,
AttachmentType.Normal,
AttachmentType.AmbientOcclusion,
AttachmentType.Emissive);
- //model = new Model (Dev, presentQueue, Utils.DataDirectory + "models/icosphere.gltf");
- //model = new Model (Dev, presentQueue, cmdPool, Utils.DataDirectory + "models/cube.gltf");
- DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descLayoutMain.Bindings.GetRange(0,5).ToArray());
- uboUpdate.Write (Dev, dsMain,
- uboMats.Descriptor,
- envCube.irradianceCube.Descriptor,
- envCube.prefilterCube.Descriptor,
- envCube.lutBrdf.Descriptor,
- model.materialUBO.Descriptor);
+
+ DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descLayoutMain.Bindings[4]);
+ uboUpdate.Write (Dev, dsMain, model.materialUBO.Descriptor);
}
public void RecordDraw (CommandBuffer cmd) {
diff --git a/samples/pbr/main.cs b/samples/pbr/main.cs
index 94d4185..7bc30ea 100644
--- a/samples/pbr/main.cs
+++ b/samples/pbr/main.cs
@@ -20,7 +20,7 @@ namespace pbrSample {
Instance.VALIDATION = true;
Instance.RENDER_DOC_CAPTURE = false;
#endif
- SwapChain.PREFERED_FORMAT = VkFormat.B8g8r8a8Unorm;
+ SwapChain.PREFERED_FORMAT = VkFormat.B8g8r8a8Srgb;
using (Program vke = new Program ()) {
vke.Run ();
@@ -49,6 +49,30 @@ namespace pbrSample {
roughness
}
+ string[] modelPathes = {
+ Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf",
+ Utils.DataDirectory + "models/Hubble.glb",
+ Utils.DataDirectory + "models/ISS_stationary.glb",
+ Utils.DataDirectory + "models/MER_static.glb",
+ Utils.DataDirectory + "models/Box.gltf",
+
+ /*"/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Avocado/glTF/Avocado.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/BarramundiFish/glTF/BarramundiFish.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/BoomBoxWithAxes/glTF/BoomBoxWithAxes.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Box/glTF/Box.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/EnvironmentTest/glTF/EnvironmentTest.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/MetalRoughSpheres/glTF/MetalRoughSpheres.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/OrientationTest/glTF/OrientationTest.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Buggy/glTF/Buggy.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/2CylinderEngine/glTF-Embedded/2CylinderEngine.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/FlightHelmet/glTF/FlightHelmet.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/GearboxAssy/glTF/GearboxAssy.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Lantern/glTF/Lantern.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/SciFiHelmet/glTF/SciFiHelmet.gltf",
+ "/mnt/devel/vulkan/glTF-Sample-Models-master/2.0/Sponza/glTF/Sponza.gltf",
+ "/mnt/devel/vkChess/data/chess.gltf"*/
+ };
+
DebugView currentDebugView = DebugView.none;
#if PIPELINE_STATS
@@ -141,23 +165,18 @@ namespace pbrSample {
Vector4 lightPos = new Vector4 (1, 0, 0, 0);
- BoundingBox modelAABB;
+ uint curModelIndex = 0;
Program () : base() {
//UpdateFrequency = 20;
-
- camera.SetPosition (0, 0, 5);
-
+ camera = new Camera (Utils.DegreesToRadians (45f), 1f, 0.1f, 64f);
+ camera.SetPosition (0, 0, -2);
pbrPipeline = new PBRPipeline(presentQueue,
new RenderPass (dev, swapChain.ColorFormat, dev.GetSuitableDepthFormat (), samples));
-
-
- modelAABB = pbrPipeline.model.DefaultScene.AABB;
-
- //camera.Model = Matrix4x4.CreateScale (1f/ Math.Max (Math.Max (modelAABB.max.X, modelAABB.max.Y), modelAABB.max.Z));
+ loadCurrentModel ();
#if PIPELINE_STATS
statPool = new PipelineStatisticsQueryPool (dev,
@@ -175,7 +194,7 @@ namespace pbrSample {
#endif
}
- bool rebuildBuffers;
+ bool rebuildBuffers, reloadModel;
void buildCommandBuffers () {
for (int i = 0; i < swapChain.ImageCount; ++i) {
@@ -206,8 +225,15 @@ namespace pbrSample {
pbrPipeline.RenderPass.End (cmd);
}
+ void loadCurrentModel () {
+ dev.WaitIdle ();
+ pbrPipeline.LoadModel (presentQueue, modelPathes[curModelIndex]);
+ BoundingBox modelAABB = pbrPipeline.model.DefaultScene.AABB;
+ camera.Model = Matrix4x4.CreateScale (1f / Math.Max (Math.Max (modelAABB.max.X, modelAABB.max.Y), modelAABB.max.Z));
+ updateViewRequested = true;
+ }
-#region update
+ #region update
public override void UpdateView () {
camera.AspectRatio = (float)swapChain.Width / swapChain.Height;
@@ -217,12 +243,8 @@ namespace pbrSample {
pbrPipeline.matrices.model = camera.Model;
- pbrPipeline.matrices.camPos = new Vector4 (
- -camera.Position.Z * (float)Math.Sin (camera.Rotation.Y) * (float)Math.Cos (camera.Rotation.X),
- camera.Position.Z * (float)Math.Sin (camera.Rotation.X),
- camera.Position.Z * (float)Math.Cos (camera.Rotation.Y) * (float)Math.Cos (camera.Rotation.X),
- 0
- );
+ Matrix4x4.Invert (camera.View, out Matrix4x4 inv);
+ pbrPipeline.matrices.camPos = new Vector4 (inv.M41, inv.M42, inv.M43, 0);
pbrPipeline.matrices.debugViewInputs = (float)currentDebugView;
pbrPipeline.uboMats.Update (pbrPipeline.matrices, (uint)Marshal.SizeOf ());
@@ -231,6 +253,11 @@ namespace pbrSample {
}
public override void Update () {
+ if (reloadModel) {
+ loadCurrentModel ();
+ reloadModel = false;
+ rebuildBuffers = true;
+ }
#if PIPELINE_STATS
results = statPool.GetResults ();
#endif
@@ -279,6 +306,13 @@ namespace pbrSample {
protected override void onKeyDown (Key key, int scanCode, Modifier modifiers) {
switch (key) {
+ case Key.Space:
+ if (modifiers.HasFlag (Modifier.Shift))
+ curModelIndex = curModelIndex == 0 ? (uint)modelPathes.Length - 1 : curModelIndex-1;
+ else
+ curModelIndex = curModelIndex < (uint)modelPathes.Length - 1 ? curModelIndex + 1 : 0;
+ reloadModel = true;
+ break;
/*
case Key.F:
if (modifiers.HasFlag (Modifier.Shift)) {
diff --git a/samples/pbr/pbr.csproj b/samples/pbr/pbr.csproj
index 46f3468..c0a4e2c 100644
--- a/samples/pbr/pbr.csproj
+++ b/samples/pbr/pbr.csproj
@@ -1,7 +1,5 @@
-
- false
-
+
NETSTANDARD;NETSTANDARD2_0;_WITH_SHADOWS;WITH_VKVG;TRACE;DEBUG;NETFRAMEWORK;NET471
@@ -18,11 +16,4 @@
-
-
- deferred.%(Filename)%(Extension)
-
-
-
-
diff --git a/vke.net.sln b/vke.net.sln
index 498c316..4d856a0 100644
--- a/vke.net.sln
+++ b/vke.net.sln
@@ -15,122 +15,151 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{1643
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "compute", "samples\compute\compute.csproj", "{5000CDE2-99B9-47EA-B4D9-EA1631F0E14A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "deferred", "samples\deferred\deferred.csproj", "{7E10A906-8633-48E5-8FEF-94F84CD8844C}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DistanceFieldFontTest", "samples\DistanceFieldFontTest\DistanceFieldFontTest.csproj", "{77437C6D-28B5-4798-96CA-68F987770D65}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Model", "samples\Model\Model.csproj", "{A7D3FB7F-769B-4F36-9E3E-3FB71F24D306}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pbr", "samples\pbr\pbr.csproj", "{96921211-C5A8-41FC-9F3D-F35A696203F7}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Textured", "samples\Textured\Textured.csproj", "{1B2DF710-E500-49E5-8802-EBA71A05E827}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TexturedCube", "samples\TexturedCube\TexturedCube.csproj", "{8185163E-A67C-4C0E-8548-67E2A9F16309}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Triangle", "samples\Triangle\Triangle.csproj", "{A30AEC45-54A3-4120-B341-B3299CC1B00E}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpirVTasks", "SpirVTasks\SpirVTasks.csproj", "{7B05B5A7-49E2-4D05-BEF8-734F70CDBF17}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvironmentPipeline", "addons\EnvironmentPipeline\EnvironmentPipeline.csproj", "{F04C3F79-2E08-4D35-A804-43039DCB7F5E}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "deferred", "samples\deferred\deferred.csproj", "{D9A41382-444E-44ED-B638-3D8F06F2FBC2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Triangle", "samples\Triangle\Triangle.csproj", "{124152F8-FAE6-4D4B-87B9-6074DD365E9B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pbr", "samples\pbr\pbr.csproj", "{7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
DebugCrow|Any CPU = DebugCrow|Any CPU
+ ReleaseSpirVTasks|Any CPU = ReleaseSpirVTasks|Any CPU
+ BuildPackages|Any CPU = BuildPackages|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{642726F4-0592-4846-8EAF-A5D1964C85A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {642726F4-0592-4846-8EAF-A5D1964C85A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{642726F4-0592-4846-8EAF-A5D1964C85A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{642726F4-0592-4846-8EAF-A5D1964C85A7}.Release|Any CPU.Build.0 = Release|Any CPU
{642726F4-0592-4846-8EAF-A5D1964C85A7}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{642726F4-0592-4846-8EAF-A5D1964C85A7}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
+ {642726F4-0592-4846-8EAF-A5D1964C85A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {642726F4-0592-4846-8EAF-A5D1964C85A7}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
+ {642726F4-0592-4846-8EAF-A5D1964C85A7}.BuildPackages|Any CPU.Build.0 = Release|Any CPU
{FEF3AF30-5B88-4D3C-8BD7-8734200E0D1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FEF3AF30-5B88-4D3C-8BD7-8734200E0D1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FEF3AF30-5B88-4D3C-8BD7-8734200E0D1E}.Release|Any CPU.Build.0 = Release|Any CPU
{FEF3AF30-5B88-4D3C-8BD7-8734200E0D1E}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{FEF3AF30-5B88-4D3C-8BD7-8734200E0D1E}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
+ {FEF3AF30-5B88-4D3C-8BD7-8734200E0D1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FEF3AF30-5B88-4D3C-8BD7-8734200E0D1E}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
+ {FEF3AF30-5B88-4D3C-8BD7-8734200E0D1E}.BuildPackages|Any CPU.Build.0 = Release|Any CPU
{F3BBF67D-7E63-48F3-8156-ADC014D268BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F3BBF67D-7E63-48F3-8156-ADC014D268BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F3BBF67D-7E63-48F3-8156-ADC014D268BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F3BBF67D-7E63-48F3-8156-ADC014D268BB}.Release|Any CPU.Build.0 = Release|Any CPU
{F3BBF67D-7E63-48F3-8156-ADC014D268BB}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{F3BBF67D-7E63-48F3-8156-ADC014D268BB}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
+ {F3BBF67D-7E63-48F3-8156-ADC014D268BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F3BBF67D-7E63-48F3-8156-ADC014D268BB}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
+ {F3BBF67D-7E63-48F3-8156-ADC014D268BB}.BuildPackages|Any CPU.Build.0 = Release|Any CPU
{611541A0-CE88-4A83-A6FF-3917971841C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{611541A0-CE88-4A83-A6FF-3917971841C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{611541A0-CE88-4A83-A6FF-3917971841C9}.Release|Any CPU.Build.0 = Release|Any CPU
{611541A0-CE88-4A83-A6FF-3917971841C9}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{611541A0-CE88-4A83-A6FF-3917971841C9}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
{611541A0-CE88-4A83-A6FF-3917971841C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {611541A0-CE88-4A83-A6FF-3917971841C9}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
+ {611541A0-CE88-4A83-A6FF-3917971841C9}.BuildPackages|Any CPU.Build.0 = Release|Any CPU
{5000CDE2-99B9-47EA-B4D9-EA1631F0E14A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5000CDE2-99B9-47EA-B4D9-EA1631F0E14A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5000CDE2-99B9-47EA-B4D9-EA1631F0E14A}.Release|Any CPU.Build.0 = Release|Any CPU
{5000CDE2-99B9-47EA-B4D9-EA1631F0E14A}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{5000CDE2-99B9-47EA-B4D9-EA1631F0E14A}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
- {7E10A906-8633-48E5-8FEF-94F84CD8844C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7E10A906-8633-48E5-8FEF-94F84CD8844C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7E10A906-8633-48E5-8FEF-94F84CD8844C}.Release|Any CPU.Build.0 = Release|Any CPU
- {7E10A906-8633-48E5-8FEF-94F84CD8844C}.DebugCrow|Any CPU.ActiveCfg = DebugCrow|Any CPU
- {7E10A906-8633-48E5-8FEF-94F84CD8844C}.DebugCrow|Any CPU.Build.0 = DebugCrow|Any CPU
- {7E10A906-8633-48E5-8FEF-94F84CD8844C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5000CDE2-99B9-47EA-B4D9-EA1631F0E14A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5000CDE2-99B9-47EA-B4D9-EA1631F0E14A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5000CDE2-99B9-47EA-B4D9-EA1631F0E14A}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
{77437C6D-28B5-4798-96CA-68F987770D65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{77437C6D-28B5-4798-96CA-68F987770D65}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {77437C6D-28B5-4798-96CA-68F987770D65}.Release|Any CPU.Build.0 = Release|Any CPU
{77437C6D-28B5-4798-96CA-68F987770D65}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{77437C6D-28B5-4798-96CA-68F987770D65}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
+ {77437C6D-28B5-4798-96CA-68F987770D65}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {77437C6D-28B5-4798-96CA-68F987770D65}.Release|Any CPU.Build.0 = Release|Any CPU
+ {77437C6D-28B5-4798-96CA-68F987770D65}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
{A7D3FB7F-769B-4F36-9E3E-3FB71F24D306}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A7D3FB7F-769B-4F36-9E3E-3FB71F24D306}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A7D3FB7F-769B-4F36-9E3E-3FB71F24D306}.Release|Any CPU.Build.0 = Release|Any CPU
{A7D3FB7F-769B-4F36-9E3E-3FB71F24D306}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{A7D3FB7F-769B-4F36-9E3E-3FB71F24D306}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
- {96921211-C5A8-41FC-9F3D-F35A696203F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {96921211-C5A8-41FC-9F3D-F35A696203F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {96921211-C5A8-41FC-9F3D-F35A696203F7}.Release|Any CPU.Build.0 = Release|Any CPU
- {96921211-C5A8-41FC-9F3D-F35A696203F7}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
- {96921211-C5A8-41FC-9F3D-F35A696203F7}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
- {96921211-C5A8-41FC-9F3D-F35A696203F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A7D3FB7F-769B-4F36-9E3E-3FB71F24D306}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A7D3FB7F-769B-4F36-9E3E-3FB71F24D306}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A7D3FB7F-769B-4F36-9E3E-3FB71F24D306}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
{1B2DF710-E500-49E5-8802-EBA71A05E827}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1B2DF710-E500-49E5-8802-EBA71A05E827}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1B2DF710-E500-49E5-8802-EBA71A05E827}.Release|Any CPU.Build.0 = Release|Any CPU
{1B2DF710-E500-49E5-8802-EBA71A05E827}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{1B2DF710-E500-49E5-8802-EBA71A05E827}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
+ {1B2DF710-E500-49E5-8802-EBA71A05E827}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1B2DF710-E500-49E5-8802-EBA71A05E827}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1B2DF710-E500-49E5-8802-EBA71A05E827}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
{8185163E-A67C-4C0E-8548-67E2A9F16309}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8185163E-A67C-4C0E-8548-67E2A9F16309}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8185163E-A67C-4C0E-8548-67E2A9F16309}.Release|Any CPU.Build.0 = Release|Any CPU
{8185163E-A67C-4C0E-8548-67E2A9F16309}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{8185163E-A67C-4C0E-8548-67E2A9F16309}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
- {A30AEC45-54A3-4120-B341-B3299CC1B00E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A30AEC45-54A3-4120-B341-B3299CC1B00E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A30AEC45-54A3-4120-B341-B3299CC1B00E}.Release|Any CPU.Build.0 = Release|Any CPU
- {A30AEC45-54A3-4120-B341-B3299CC1B00E}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
- {A30AEC45-54A3-4120-B341-B3299CC1B00E}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
- {A30AEC45-54A3-4120-B341-B3299CC1B00E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8185163E-A67C-4C0E-8548-67E2A9F16309}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8185163E-A67C-4C0E-8548-67E2A9F16309}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8185163E-A67C-4C0E-8548-67E2A9F16309}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
{7B05B5A7-49E2-4D05-BEF8-734F70CDBF17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B05B5A7-49E2-4D05-BEF8-734F70CDBF17}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B05B5A7-49E2-4D05-BEF8-734F70CDBF17}.Release|Any CPU.Build.0 = Release|Any CPU
{7B05B5A7-49E2-4D05-BEF8-734F70CDBF17}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{7B05B5A7-49E2-4D05-BEF8-734F70CDBF17}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
+ {7B05B5A7-49E2-4D05-BEF8-734F70CDBF17}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7B05B5A7-49E2-4D05-BEF8-734F70CDBF17}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
+ {7B05B5A7-49E2-4D05-BEF8-734F70CDBF17}.BuildPackages|Any CPU.Build.0 = Release|Any CPU
{F04C3F79-2E08-4D35-A804-43039DCB7F5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F04C3F79-2E08-4D35-A804-43039DCB7F5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F04C3F79-2E08-4D35-A804-43039DCB7F5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F04C3F79-2E08-4D35-A804-43039DCB7F5E}.Release|Any CPU.Build.0 = Release|Any CPU
{F04C3F79-2E08-4D35-A804-43039DCB7F5E}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
{F04C3F79-2E08-4D35-A804-43039DCB7F5E}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
+ {F04C3F79-2E08-4D35-A804-43039DCB7F5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F04C3F79-2E08-4D35-A804-43039DCB7F5E}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
+ {F04C3F79-2E08-4D35-A804-43039DCB7F5E}.BuildPackages|Any CPU.Build.0 = Release|Any CPU
+ {D9A41382-444E-44ED-B638-3D8F06F2FBC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D9A41382-444E-44ED-B638-3D8F06F2FBC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D9A41382-444E-44ED-B638-3D8F06F2FBC2}.DebugCrow|Any CPU.ActiveCfg = DebugCrow|Any CPU
+ {D9A41382-444E-44ED-B638-3D8F06F2FBC2}.DebugCrow|Any CPU.Build.0 = DebugCrow|Any CPU
+ {D9A41382-444E-44ED-B638-3D8F06F2FBC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D9A41382-444E-44ED-B638-3D8F06F2FBC2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D9A41382-444E-44ED-B638-3D8F06F2FBC2}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
+ {124152F8-FAE6-4D4B-87B9-6074DD365E9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {124152F8-FAE6-4D4B-87B9-6074DD365E9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {124152F8-FAE6-4D4B-87B9-6074DD365E9B}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
+ {124152F8-FAE6-4D4B-87B9-6074DD365E9B}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
+ {124152F8-FAE6-4D4B-87B9-6074DD365E9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {124152F8-FAE6-4D4B-87B9-6074DD365E9B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {124152F8-FAE6-4D4B-87B9-6074DD365E9B}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
+ {7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
+ {7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
+ {7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{FEF3AF30-5B88-4D3C-8BD7-8734200E0D1E} = {4AA67AB0-C331-4CB2-9C00-B74F5DE31658}
{F3BBF67D-7E63-48F3-8156-ADC014D268BB} = {4AA67AB0-C331-4CB2-9C00-B74F5DE31658}
{611541A0-CE88-4A83-A6FF-3917971841C9} = {4AA67AB0-C331-4CB2-9C00-B74F5DE31658}
{5000CDE2-99B9-47EA-B4D9-EA1631F0E14A} = {16439374-B8DB-4643-8116-EB3358B49A12}
- {7E10A906-8633-48E5-8FEF-94F84CD8844C} = {16439374-B8DB-4643-8116-EB3358B49A12}
{77437C6D-28B5-4798-96CA-68F987770D65} = {16439374-B8DB-4643-8116-EB3358B49A12}
{A7D3FB7F-769B-4F36-9E3E-3FB71F24D306} = {16439374-B8DB-4643-8116-EB3358B49A12}
- {96921211-C5A8-41FC-9F3D-F35A696203F7} = {16439374-B8DB-4643-8116-EB3358B49A12}
{1B2DF710-E500-49E5-8802-EBA71A05E827} = {16439374-B8DB-4643-8116-EB3358B49A12}
{8185163E-A67C-4C0E-8548-67E2A9F16309} = {16439374-B8DB-4643-8116-EB3358B49A12}
- {A30AEC45-54A3-4120-B341-B3299CC1B00E} = {16439374-B8DB-4643-8116-EB3358B49A12}
{F04C3F79-2E08-4D35-A804-43039DCB7F5E} = {4AA67AB0-C331-4CB2-9C00-B74F5DE31658}
+ {D9A41382-444E-44ED-B638-3D8F06F2FBC2} = {16439374-B8DB-4643-8116-EB3358B49A12}
+ {124152F8-FAE6-4D4B-87B9-6074DD365E9B} = {16439374-B8DB-4643-8116-EB3358B49A12}
+ {7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5} = {16439374-B8DB-4643-8116-EB3358B49A12}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
diff --git a/vke/shaders/debug.frag b/vke/shaders/debug.frag
new file mode 100644
index 0000000..fd419ff
--- /dev/null
+++ b/vke/shaders/debug.frag
@@ -0,0 +1,12 @@
+#version 450
+
+#extension GL_ARB_separate_shader_objects : enable
+#extension GL_ARB_shading_language_420pack : enable
+
+layout (location = 0) in vec3 inColor;
+layout (location = 0) out vec4 outFragColor;
+
+void main()
+{
+ outFragColor = vec4(inColor, 1.0);
+}
\ No newline at end of file
diff --git a/vke/shaders/debug.vert b/vke/shaders/debug.vert
new file mode 100644
index 0000000..b3967f7
--- /dev/null
+++ b/vke/shaders/debug.vert
@@ -0,0 +1,26 @@
+#version 450
+
+#extension GL_ARB_separate_shader_objects : enable
+#extension GL_ARB_shading_language_420pack : enable
+
+layout (location = 0) in vec3 inPos;
+layout (location = 1) in vec3 inColor;
+
+layout (location = 0) out vec3 outColor;
+
+layout(push_constant) uniform PushConsts {
+ mat4 projection;
+ mat4 view;
+};
+
+out gl_PerVertex
+{
+ vec4 gl_Position;
+};
+
+void main()
+{
+ outColor = inColor;
+ //gl_Position = projection * vec4 ((view * vec4(inPos.xyz, 0.0)).xyz, 1);
+ gl_Position = projection * view * vec4(inPos.xyz, 1);
+}
diff --git a/vke/src/Camera.cs b/vke/src/Camera.cs
index c897cf2..5adf968 100644
--- a/vke/src/Camera.cs
+++ b/vke/src/Camera.cs
@@ -48,7 +48,7 @@ namespace vke {
get { return Matrix4x4.CreatePerspectiveFieldOfView (fov, aspectRatio, zNear, zFar); }
}
- public Camera (float fieldOfView, float aspectRatio, float nearPlane = 0.1f, float farPlane = 256f) {
+ public Camera (float fieldOfView, float aspectRatio, float nearPlane = 0.1f, float farPlane = 16f) {
fov = fieldOfView;
this.aspectRatio = aspectRatio;
zNear = nearPlane;
@@ -111,8 +111,9 @@ namespace vke {
}
public void Update () {
- Projection = Matrix4x4.CreatePerspectiveFieldOfView (fov, aspectRatio, zNear, zFar) * VKProjectionCorrection;
- Matrix4x4 translation = Matrix4x4.CreateTranslation (position * zoom * new Vector3(1,1,-1)) ;
+ Projection = Vulkan.Utils.CreatePerspectiveFieldOfView (fov, aspectRatio, zNear, zFar);
+
+ Matrix4x4 translation = Matrix4x4.CreateTranslation (position * zoom);// * new Vector3(1,1,-1)) ;
if (Type == CamType.LookAt) {
View =
Matrix4x4.CreateFromAxisAngle (Vector3.UnitZ, rotation.Z) *
diff --git a/vke/src/ExtensionMethods.cs b/vke/src/ExtensionMethods.cs
index afefdd9..cbdc741 100644
--- a/vke/src/ExtensionMethods.cs
+++ b/vke/src/ExtensionMethods.cs
@@ -110,59 +110,59 @@ namespace vke {
#region DebugMarkers
public static void SetDebugMarkerName (this VkCommandBuffer obj, Device dev, string name) {
- if (!dev.debugMarkersEnabled)
+ if (!dev.debugUtilsEnabled)
return;
- VkDebugMarkerObjectNameInfoEXT dmo = new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.CommandBufferEXT,
+ VkDebugUtilsObjectNameInfoEXT dmo = new VkDebugUtilsObjectNameInfoEXT (VkObjectType.CommandBuffer,
(ulong)obj.Handle.ToInt64 ()) { pObjectName = name.Pin () };
- Utils.CheckResult (vkDebugMarkerSetObjectNameEXT (dev.VkDev, ref dmo));
+ Utils.CheckResult (vkSetDebugUtilsObjectNameEXT (dev.VkDev, ref dmo));
name.Unpin ();
}
public static void SetDebugMarkerName (this VkImageView obj, Device dev, string name) {
- if (!dev.debugMarkersEnabled)
+ if (!dev.debugUtilsEnabled)
return;
- VkDebugMarkerObjectNameInfoEXT dmo = new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.ImageViewEXT,
- obj.Handle) { pObjectName = name.Pin () };
- Utils.CheckResult (vkDebugMarkerSetObjectNameEXT (dev.VkDev, ref dmo));
+ VkDebugUtilsObjectNameInfoEXT dmo = new VkDebugUtilsObjectNameInfoEXT (VkObjectType.ImageView,
+ (ulong)obj.Handle) { pObjectName = name.Pin () };
+ Utils.CheckResult (vkSetDebugUtilsObjectNameEXT (dev.VkDev, ref dmo));
name.Unpin ();
}
public static void SetDebugMarkerName (this VkSampler obj, Device dev, string name) {
- if (!dev.debugMarkersEnabled)
+ if (!dev.debugUtilsEnabled)
return;
- VkDebugMarkerObjectNameInfoEXT dmo = new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.SamplerEXT,
- obj.Handle) { pObjectName = name.Pin () };
- Utils.CheckResult (vkDebugMarkerSetObjectNameEXT (dev.VkDev, ref dmo));
+ VkDebugUtilsObjectNameInfoEXT dmo = new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Sampler,
+ (ulong)obj.Handle) { pObjectName = name.Pin () };
+ Utils.CheckResult (vkSetDebugUtilsObjectNameEXT (dev.VkDev, ref dmo));
name.Unpin ();
}
public static void SetDebugMarkerName (this VkPipeline obj, Device dev, string name) {
- if (!dev.debugMarkersEnabled)
+ if (!dev.debugUtilsEnabled)
return;
- VkDebugMarkerObjectNameInfoEXT dmo = new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.PipelineEXT,
+ VkDebugUtilsObjectNameInfoEXT dmo = new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Pipeline,
obj.Handle) { pObjectName = name.Pin () };
- Utils.CheckResult (vkDebugMarkerSetObjectNameEXT (dev.VkDev, ref dmo));
+ Utils.CheckResult (vkSetDebugUtilsObjectNameEXT (dev.VkDev, ref dmo));
name.Unpin ();
}
public static void SetDebugMarkerName (this VkDescriptorSet obj, Device dev, string name) {
- if (!dev.debugMarkersEnabled)
+ if (!dev.debugUtilsEnabled)
return;
- VkDebugMarkerObjectNameInfoEXT dmo = new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.DescriptorSetEXT,
- obj.Handle) { pObjectName = name.Pin () };
- Utils.CheckResult (vkDebugMarkerSetObjectNameEXT (dev.VkDev, ref dmo));
+ VkDebugUtilsObjectNameInfoEXT dmo = new VkDebugUtilsObjectNameInfoEXT (VkObjectType.DescriptorSet,
+ (ulong)obj.Handle) { pObjectName = name.Pin () };
+ Utils.CheckResult (vkSetDebugUtilsObjectNameEXT (dev.VkDev, ref dmo));
name.Unpin ();
}
public static void SetDebugMarkerName (this VkSemaphore obj, Device dev, string name) {
- if (!dev.debugMarkersEnabled)
+ if (!dev.debugUtilsEnabled)
return;
- VkDebugMarkerObjectNameInfoEXT dmo = new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.SemaphoreEXT,
- obj.Handle) { pObjectName = name.Pin () };
- Utils.CheckResult (vkDebugMarkerSetObjectNameEXT (dev.VkDev, ref dmo));
+ VkDebugUtilsObjectNameInfoEXT dmo = new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Semaphore,
+ (ulong)obj.Handle) { pObjectName = name.Pin () };
+ Utils.CheckResult (vkSetDebugUtilsObjectNameEXT (dev.VkDev, ref dmo));
name.Unpin ();
}
public static void SetDebugMarkerName (this VkFence obj, Device dev, string name) {
- if (!dev.debugMarkersEnabled)
+ if (!dev.debugUtilsEnabled)
return;
- VkDebugMarkerObjectNameInfoEXT dmo = new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.FenceEXT,
- obj.Handle) { pObjectName = name.Pin () };
- Utils.CheckResult (vkDebugMarkerSetObjectNameEXT (dev.VkDev, ref dmo));
+ VkDebugUtilsObjectNameInfoEXT dmo = new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Fence,
+ (ulong)obj.Handle) { pObjectName = name.Pin () };
+ Utils.CheckResult (vkSetDebugUtilsObjectNameEXT (dev.VkDev, ref dmo));
name.Unpin ();
}
#endregion
diff --git a/vke/src/Utils.cs b/vke/src/Utils.cs
index 3a8d34e..0e4db15 100644
--- a/vke/src/Utils.cs
+++ b/vke/src/Utils.cs
@@ -6,6 +6,7 @@ using System.IO;
using System.Linq;
using System.Numerics;
using System.Reflection;
+using System.Xml.Serialization;
namespace Vulkan {
public static partial class Utils {
@@ -15,6 +16,18 @@ namespace Vulkan {
if (result != VkResult.Success)
throw new InvalidOperationException (errorString + ": " + result.ToString ());
}
+ static void xmlMakeTypeFieldsAsAttributes (Type t, ref XmlAttributeOverrides overrides)
+ {
+ foreach (FieldInfo fi in t.GetFields (BindingFlags.Public | BindingFlags.Instance))
+ overrides.Add (t, fi.Name, new XmlAttributes { XmlAttribute = new XmlAttributeAttribute () });
+ }
+ public static XmlAttributeOverrides GetXmlOverrides ()
+ {
+ XmlAttributeOverrides xmlAttributeOverrides = new XmlAttributeOverrides ();
+ //Assembly avk = Assembly.GetAssembly (typeof (VkInstance));
+ xmlMakeTypeFieldsAsAttributes (typeof (VkDescriptorPoolSize), ref xmlAttributeOverrides);
+ return xmlAttributeOverrides;
+ }
///
/// Return a file or embedded resource stream.
///
@@ -377,5 +390,14 @@ namespace Vulkan {
return VkPipelineStageFlags.AllCommands;
}
}
+ public static Matrix4x4 CreatePerspectiveFieldOfView (float fov, float aspectRatio, float zNear, float zFar) {
+ float f = (float)(1.0 / System.Math.Tan (0.5 * fov));
+ return new Matrix4x4 (
+ f / aspectRatio, 0, 0, 0,
+ 0, -f, 0, 0,
+ 0, 0, zFar / (zNear - zFar), -1,
+ 0, 0, zNear * zFar / (zNear - zFar), 0
+ );
+ }
}
}
diff --git a/vke/src/VkWindow.cs b/vke/src/VkWindow.cs
index 40aa3a8..fab1325 100644
--- a/vke/src/VkWindow.cs
+++ b/vke/src/VkWindow.cs
@@ -31,6 +31,7 @@ namespace vke {
protected CommandPool cmdPool;
protected CommandBuffer[] cmds;
protected VkSemaphore[] drawComplete;
+ protected VkFence drawFence;
protected uint fps;
protected bool updateViewRequested = true;
@@ -125,6 +126,8 @@ namespace vke {
//First create the c# device class
dev = new Device (phy);
+ dev.debugUtilsEnabled = instance.debugUtilsEnabled;
+
//create queue class
createQueues ();
@@ -142,6 +145,7 @@ namespace vke {
cmds = new CommandBuffer[swapChain.ImageCount];
drawComplete = new VkSemaphore[swapChain.ImageCount];
+ drawFence = dev.CreateFence (true);
for (int i = 0; i < swapChain.ImageCount; i++) {
drawComplete[i] = dev.CreateSemaphore ();
@@ -179,10 +183,13 @@ namespace vke {
if (cmds[idx] == null)
return;
- presentQueue.Submit (cmds[idx], swapChain.presentComplete, drawComplete[idx]);
+ dev.WaitForFence (drawFence);
+ dev.ResetFence (drawFence);
+
+ presentQueue.Submit (cmds[idx], swapChain.presentComplete, drawComplete[idx], drawFence);
presentQueue.Present (swapChain, drawComplete[idx]);
- presentQueue.WaitIdle ();
+ //presentQueue.WaitIdle ();
}
protected virtual void onScroll (double xOffset, double yOffset) { }
@@ -339,6 +346,7 @@ namespace vke {
dev.DestroySemaphore (drawComplete[i]);
cmds[i].Free ();
}
+ dev.DestroyFence (drawFence);
swapChain.Dispose ();
diff --git a/vke/src/base/Activable.cs b/vke/src/base/Activable.cs
index 13ca491..6e60f8d 100644
--- a/vke/src/base/Activable.cs
+++ b/vke/src/base/Activable.cs
@@ -2,6 +2,7 @@
//
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
using System;
+using System.Xml.Serialization;
using Vulkan;
using static Vulkan.Vk;
@@ -34,7 +35,7 @@ namespace vke {
///
public abstract class Activable : IDisposable {
//count number of activation, only the first one will create a handle
- protected uint references;
+ [XmlIgnore] protected uint references;
//keep track of the current state of activation.
protected ActivableState state;
//With the debug marker extension, setting name to vulkan's object ease the debugging.
@@ -43,11 +44,11 @@ namespace vke {
/// This property has to be implemented in every vulkan object. It should return the correct debug marker info.
///
/// The debug marker info.
- protected abstract VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo { get; }
+ protected abstract VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo { get; }
///
/// Vulkan logical device this activable is bound to.
///
- public Device Dev { get; private set; }
+ [XmlIgnore] public Device Dev { get; private set; }
#region CTOR
protected Activable (Device dev) {
@@ -66,12 +67,12 @@ namespace vke {
public void SetName (string name) {
this.name = name;
- if (!Dev.debugMarkersEnabled)
+ if (!Dev.debugUtilsEnabled)
return;
- VkDebugMarkerObjectNameInfoEXT dmo = DebugMarkerInfo;
+ VkDebugUtilsObjectNameInfoEXT dmo = DebugUtilsInfo;
dmo.pObjectName = name.Pin();
- Utils.CheckResult (vkDebugMarkerSetObjectNameEXT (Dev.VkDev, ref dmo));
+ Utils.CheckResult (vkSetDebugUtilsObjectNameEXT (Dev.VkDev, ref dmo));
name.Unpin ();
}
///
diff --git a/vke/src/base/Buffer.cs b/vke/src/base/Buffer.cs
index 837a9d7..9a86f14 100644
--- a/vke/src/base/Buffer.cs
+++ b/vke/src/base/Buffer.cs
@@ -19,9 +19,8 @@ namespace vke {
public VkBufferCreateInfo Infos => createInfo;
public override bool IsLinar => true;
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT(VkDebugReportObjectTypeEXT.BufferEXT, handle.Handle);
-
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Buffer, handle.Handle);
#region CTORS
public Buffer (Device device, VkBufferUsageFlags usage, VkMemoryPropertyFlags _memoryPropertyFlags, UInt64 size)
: base (device, _memoryPropertyFlags) {
diff --git a/vke/src/base/CommandBuffer.cs b/vke/src/base/CommandBuffer.cs
index 126137b..9c65dc1 100644
--- a/vke/src/base/CommandBuffer.cs
+++ b/vke/src/base/CommandBuffer.cs
@@ -153,7 +153,7 @@ namespace vke {
dependencyFlags, 1, ref memoryBarrier, 0, IntPtr.Zero, 0, IntPtr.Zero);
}
public void BeginRegion (string name, float r = 1f, float g = 0.1f, float b=0.1f, float a = 1f) {
- if (!Device.debugMarkersEnabled)
+ if (!Device.debugUtilsEnabled)
return;
VkDebugMarkerMarkerInfoEXT info = VkDebugMarkerMarkerInfoEXT.New();
info.pMarkerName = name.Pin ();
@@ -167,7 +167,7 @@ namespace vke {
name.Unpin ();
}
public void InsertDebugMarker (string name, float r = 1f, float g = 0.1f, float b=0.1f, float a = 1f) {
- if (!Device.debugMarkersEnabled)
+ if (!Device.debugUtilsEnabled)
return;
VkDebugMarkerMarkerInfoEXT info = VkDebugMarkerMarkerInfoEXT.New();
info.pMarkerName = name.Pin ();
@@ -181,7 +181,7 @@ namespace vke {
name.Unpin ();
}
public void EndRegion () {
- if (Device.debugMarkersEnabled)
+ if (Device.debugUtilsEnabled)
vkCmdDebugMarkerEndEXT (Handle);
}
diff --git a/vke/src/base/CommandPool.cs b/vke/src/base/CommandPool.cs
index 01888e6..ead3ec1 100644
--- a/vke/src/base/CommandPool.cs
+++ b/vke/src/base/CommandPool.cs
@@ -34,8 +34,8 @@ namespace vke {
public CommandPool (Queue queue) : this(queue.dev, queue.qFamIndex) {}
#endregion
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT(VkDebugReportObjectTypeEXT.CommandPoolEXT, handle.Handle);
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.CommandPool, handle.Handle);
public override void Activate () {
if (state != ActivableState.Activated) {
diff --git a/vke/src/base/DebuDrawPipeline.cs b/vke/src/base/DebuDrawPipeline.cs
index 3ebc71a..20398cc 100644
--- a/vke/src/base/DebuDrawPipeline.cs
+++ b/vke/src/base/DebuDrawPipeline.cs
@@ -26,8 +26,8 @@ namespace vke {
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32b32Sfloat);
cfg.blendAttachments[0] = new VkPipelineColorBlendAttachmentState (true);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#CVKL.debug.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#CVKL.debug.frag.spv");
+ cfg.AddShader (VkShaderStageFlags.Vertex, "#vke.debug.vert.spv");
+ cfg.AddShader (VkShaderStageFlags.Fragment, "#vke.debug.frag.spv");
layout = cfg.Layout;
diff --git a/vke/src/base/DebugUtilsMessenger.cs b/vke/src/base/DebugUtilsMessenger.cs
index eb042d1..4c47867 100644
--- a/vke/src/base/DebugUtilsMessenger.cs
+++ b/vke/src/base/DebugUtilsMessenger.cs
@@ -3,6 +3,7 @@
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
using System;
using System.Runtime.InteropServices;
+using System.Text;
using Vulkan;
using static Vulkan.Vk;
@@ -43,8 +44,19 @@ namespace vke.DebugUtils {
break;
}
- Console.WriteLine (Marshal.PtrToStringAnsi (data.pMessage));
- Console.ForegroundColor = curColor;
+ byte [] tmp = new byte [1024];
+
+ if (data.pMessage != IntPtr.Zero) {
+ byte b = Marshal.ReadByte (data.pMessage);
+ int i = 1;
+ while (b != 0) {
+ tmp [i] = b;
+ b = Marshal.ReadByte (data.pMessage, i);
+ i++;
+ }
+ Console.WriteLine (Encoding.UTF8.GetString(tmp));
+ Console.ForegroundColor = curColor;
+ }
return false;
}
///
diff --git a/vke/src/base/DescriptorPool.cs b/vke/src/base/DescriptorPool.cs
index 38fba54..26339f5 100644
--- a/vke/src/base/DescriptorPool.cs
+++ b/vke/src/base/DescriptorPool.cs
@@ -3,20 +3,25 @@
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
using System;
using System.Collections.Generic;
+using System.Xml.Serialization;
using Vulkan;
using static Vulkan.Vk;
namespace vke {
- public sealed class DescriptorPool : Activable {
- internal VkDescriptorPool handle;
- public readonly uint MaxSets;
+ [Serializable]
+ public sealed class DescriptorPool : Activable {
+ internal VkDescriptorPool handle;
+ [XmlAttribute]
+ public uint MaxSets;
+ [XmlArrayItem("PoolSize")]
- public List PoolSizes = new List ();
-
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT(VkDebugReportObjectTypeEXT.DescriptorPoolEXT, handle.Handle);
+ public List PoolSizes = new List ();
+
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.DescriptorPool, handle.Handle);
#region CTORS
+ DescriptorPool () : base (null) {}
public DescriptorPool (Device device, uint maxSets = 1) : base (device) {
MaxSets = maxSets;
}
diff --git a/vke/src/base/DescriptorSetLayout.cs b/vke/src/base/DescriptorSetLayout.cs
index 6df04fb..d09c4c4 100644
--- a/vke/src/base/DescriptorSetLayout.cs
+++ b/vke/src/base/DescriptorSetLayout.cs
@@ -16,11 +16,12 @@ namespace vke {
public VkDescriptorSetLayoutCreateFlags Flags { get; private set; } = 0;
public List Bindings { get; private set; } = new List ();
-
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT(VkDebugReportObjectTypeEXT.DescriptorSetLayoutEXT, handle.Handle);
+
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.DescriptorSetLayout, handle.Handle);
#region CTORS
+ DescriptorSetLayout () : base (null) { }
public DescriptorSetLayout (Device device, VkDescriptorSetLayoutCreateFlags flags) : base (device) {
Flags = flags;
}
diff --git a/vke/src/base/Device.cs b/vke/src/base/Device.cs
index 2e287e4..56e38fe 100644
--- a/vke/src/base/Device.cs
+++ b/vke/src/base/Device.cs
@@ -24,7 +24,7 @@ namespace vke {
internal List queues = new List ();
- internal bool debugMarkersEnabled;
+ internal bool debugUtilsEnabled;
#if MEMORY_POOLS
public ResourceManager resourceManager;
@@ -66,12 +66,8 @@ namespace vke {
//enable only supported exceptions
List deviceExtensions = new List ();
for (int i = 0; i < extensions.Length; i++) {
- if (phy.GetDeviceExtensionSupported (extensions[i])) {
- deviceExtensions.Add (new FixedUtf8String (extensions[i]));
- //store in a bool to prevent frequent string test for debug marker ext presence
- if (extensions[i] == Ext.D.VK_EXT_debug_marker)
- debugMarkersEnabled = true;
- }
+ if (phy.GetDeviceExtensionSupported (extensions[i]))
+ deviceExtensions.Add (new FixedUtf8String (extensions[i]));
}
VkDeviceCreateInfo deviceCreateInfo = VkDeviceCreateInfo.New ();
diff --git a/vke/src/base/FrameBuffer.cs b/vke/src/base/FrameBuffer.cs
index 7ba3d00..94a69b9 100644
--- a/vke/src/base/FrameBuffer.cs
+++ b/vke/src/base/FrameBuffer.cs
@@ -21,9 +21,8 @@ namespace vke {
public uint Height => createInfo.height;
public uint Layers => createInfo.layers;
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT(VkDebugReportObjectTypeEXT.FramebufferEXT, handle.Handle);
-
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Framebuffer, handle.Handle);
#region CTORS
public FrameBuffer (RenderPass _renderPass, uint _width, uint _height, uint _layers = 1) : base(_renderPass.Dev) {
renderPass = _renderPass;
@@ -45,13 +44,13 @@ namespace vke {
Image v = views[i];
if (v == null) {
//automatically create attachment if not in unused state in the renderpass
- VkAttachmentDescription ad = renderPass.attachments[i];
+ VkAttachmentDescription ad = renderPass.Attachments[i];
VkImageUsageFlags usage = 0;
VkImageAspectFlags aspectFlags = 0;
Utils.QueryLayoutRequirements (ad.initialLayout, ref usage, ref aspectFlags);
Utils.QueryLayoutRequirements (ad.finalLayout, ref usage, ref aspectFlags);
- foreach (SubPass sp in renderPass.subpasses) {
+ foreach (SubPass sp in renderPass.SubPasses) {
//TODO:check subpass usage
}
diff --git a/vke/src/base/GraphicPipeline.cs b/vke/src/base/GraphicPipeline.cs
index 46f2b86..b0c1e67 100644
--- a/vke/src/base/GraphicPipeline.cs
+++ b/vke/src/base/GraphicPipeline.cs
@@ -15,7 +15,6 @@ namespace vke {
#region CTORS
protected GraphicPipeline (RenderPass renderPass, PipelineCache cache = null, string name = "graphic pipeline") : base(renderPass.Dev, cache, name) {
RenderPass = renderPass;
- handle.SetDebugMarkerName (Dev, name);
}
///
/// Create a new Pipeline with supplied RenderPass
diff --git a/vke/src/base/GraphicPipelineConfig.cs b/vke/src/base/GraphicPipelineConfig.cs
index bca8ee6..e96756e 100644
--- a/vke/src/base/GraphicPipelineConfig.cs
+++ b/vke/src/base/GraphicPipelineConfig.cs
@@ -10,11 +10,30 @@ using Vulkan;
using static Vulkan.Vk;
namespace vke {
+ ///
+ /// Graphic pipeline config is a helper class used to construct configurations to create pipelines.
+ /// This class has some facilities for chaining multiple pipelines creations that have small differencies
+ /// in their configurations.
+ ///
public class GraphicPipelineConfig {
public uint SubpassIndex;
+ ///
+ /// Pipeline layout. Note that layout will not be activated (handle creation) until
+ /// the creation of a new pipeline with this 'GraphicPipelineConfig'.
+ /// It is valid to use an already activated layout for a new config.
+ ///
public PipelineLayout Layout;
+ ///
+ /// See note for the 'Layout' field.
+ ///
public RenderPass RenderPass;
+ ///
+ /// VkPipelineCache to use for the pipeline creation.
+ ///
public PipelineCache Cache;
+ ///
+ /// VkPipelineBindPoint.Graphics is set by default,
+ ///
public VkPipelineBindPoint bindPoint = VkPipelineBindPoint.Graphics;
public VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = VkPipelineInputAssemblyStateCreateInfo.New ();
public VkPipelineRasterizationStateCreateInfo rasterizationState = VkPipelineRasterizationStateCreateInfo.New ();
@@ -34,7 +53,10 @@ namespace vke {
public VkSampleCountFlags Samples {
get { return multisampleState.rasterizationSamples; }
}
-
+ ///
+ /// Default constructor. Prefer the static 'CreateDefault' method to start with
+ /// a classic default configuration for rendering.
+ ///
public GraphicPipelineConfig () {
}
@@ -116,13 +138,20 @@ namespace vke {
public void AddShader (VkShaderStageFlags _stageFlags, string _spirvPath, SpecializationInfo specializationInfo = null, string _entryPoint = "main") {
shaders.Add (new ShaderInfo (_stageFlags, _spirvPath, specializationInfo, _entryPoint));
}
-
+ ///
+ /// Resets shaders and vertices in current configuration to ease reuse of
+ /// current 'GraphicPipelineConfig' for creating another pipeline.
+ ///
public void ResetShadersAndVerticesInfos () {
currentAttributeIndex = 0;
vertexBindings.Clear ();
vertexAttributes.Clear ();
ResetShaders ();
}
+ ///
+ /// Resets shaders in current config to ease reause of current 'GraphicPipelineConfig
+ /// for creating another similar pipeline with different shaders.
+ ///
public void ResetShaders () {
foreach (ShaderInfo shader in shaders)
shader.Dispose ();
diff --git a/vke/src/base/Image.cs b/vke/src/base/Image.cs
index aa5eb44..9c1cb8e 100644
--- a/vke/src/base/Image.cs
+++ b/vke/src/base/Image.cs
@@ -35,11 +35,11 @@ namespace vke {
public VkImageLayout lastKnownLayout { get; private set; }
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT(VkDebugReportObjectTypeEXT.ImageEXT, handle.Handle);
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Image, handle.Handle);
#region CTORS
- public Image (Device device, VkFormat format, VkImageUsageFlags usage, VkMemoryPropertyFlags _memoryPropertyFlags,
+ public Image (Device device, VkFormat format, VkImageUsageFlags usage, VkMemoryPropertyFlags _memoryPropertyFlags,
uint width, uint height,
VkImageType type = VkImageType.Image2D, VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1,
VkImageTiling tiling = VkImageTiling.Optimal, uint mipsLevels = 1, uint layers = 1, uint depth = 1,
@@ -414,14 +414,18 @@ namespace vke {
VkImageLayout oldImageLayout,
VkImageLayout newImageLayout,
VkPipelineStageFlags srcStageMask = VkPipelineStageFlags.AllCommands,
- VkPipelineStageFlags dstStageMask = VkPipelineStageFlags.AllCommands) {
+ VkPipelineStageFlags dstStageMask = VkPipelineStageFlags.AllCommands,
+ uint srcQueueFamilyIndex = Vk.QueueFamilyIgnored,
+ uint dstQueueFamilyIndex = Vk.QueueFamilyIgnored)
+ {
VkImageSubresourceRange subresourceRange = new VkImageSubresourceRange {
aspectMask = aspectMask,
baseMipLevel = 0,
levelCount = CreateInfo.mipLevels,
layerCount = CreateInfo.arrayLayers,
};
- SetLayout (cmdbuffer, srcAccessMask, dstAccessMask, oldImageLayout, newImageLayout, subresourceRange, srcStageMask, dstStageMask);
+ SetLayout (cmdbuffer, srcAccessMask, dstAccessMask, oldImageLayout, newImageLayout, subresourceRange, srcStageMask, dstStageMask,
+ srcQueueFamilyIndex, dstQueueFamilyIndex);
}
public void SetLayout (
CommandBuffer cmdbuffer,
@@ -431,11 +435,14 @@ namespace vke {
VkImageLayout newImageLayout,
VkImageSubresourceRange subresourceRange,
VkPipelineStageFlags srcStageMask = VkPipelineStageFlags.AllCommands,
- VkPipelineStageFlags dstStageMask = VkPipelineStageFlags.AllCommands) {
+ VkPipelineStageFlags dstStageMask = VkPipelineStageFlags.AllCommands,
+ uint srcQueueFamilyIndex = Vk.QueueFamilyIgnored,
+ uint dstQueueFamilyIndex = Vk.QueueFamilyIgnored)
+ {
VkImageMemoryBarrier imageMemoryBarrier = VkImageMemoryBarrier.New ();
- imageMemoryBarrier.srcQueueFamilyIndex = Vk.QueueFamilyIgnored;
- imageMemoryBarrier.dstQueueFamilyIndex = Vk.QueueFamilyIgnored;
+ imageMemoryBarrier.srcQueueFamilyIndex = srcQueueFamilyIndex;
+ imageMemoryBarrier.dstQueueFamilyIndex = dstQueueFamilyIndex;
imageMemoryBarrier.oldLayout = oldImageLayout;
imageMemoryBarrier.newLayout = newImageLayout;
imageMemoryBarrier.image = handle;
@@ -462,11 +469,13 @@ namespace vke {
VkImageLayout newImageLayout,
VkImageSubresourceRange subresourceRange,
VkPipelineStageFlags srcStageMask = VkPipelineStageFlags.AllCommands,
- VkPipelineStageFlags dstStageMask = VkPipelineStageFlags.AllCommands) {
+ VkPipelineStageFlags dstStageMask = VkPipelineStageFlags.AllCommands,
+ uint srcQueueFamilyIndex = Vk.QueueFamilyIgnored,
+ uint dstQueueFamilyIndex = Vk.QueueFamilyIgnored) {
// Create an image barrier object
VkImageMemoryBarrier imageMemoryBarrier = VkImageMemoryBarrier.New();
- imageMemoryBarrier.srcQueueFamilyIndex = Vk.QueueFamilyIgnored;
- imageMemoryBarrier.dstQueueFamilyIndex = Vk.QueueFamilyIgnored;
+ imageMemoryBarrier.srcQueueFamilyIndex = srcQueueFamilyIndex;
+ imageMemoryBarrier.dstQueueFamilyIndex = dstQueueFamilyIndex;
imageMemoryBarrier.oldLayout = oldImageLayout;
imageMemoryBarrier.newLayout = newImageLayout;
imageMemoryBarrier.image = handle;
diff --git a/vke/src/base/Instance.cs b/vke/src/base/Instance.cs
index dbc9673..beb415a 100644
--- a/vke/src/base/Instance.cs
+++ b/vke/src/base/Instance.cs
@@ -29,7 +29,6 @@ namespace vke {
public IntPtr Handle => inst.Handle;
public VkInstance VkInstance => inst;
-
static class Strings {
public static FixedUtf8String main = "main";
@@ -37,6 +36,8 @@ namespace vke {
const string strValidationLayer = "VK_LAYER_KHRONOS_validation";
const string strRenderDocLayer = "VK_LAYER_RENDERDOC_Capture";
+ internal bool debugUtilsEnabled;
+
///
/// Create a new vulkan instance with enabled extensions given as argument.
///
@@ -49,10 +50,12 @@ namespace vke {
using (PinnedObjects pctx = new PinnedObjects ()) {
for (int i = 0; i < extensions.Length; i++) {
- if (supportedExts.Contains (extensions[i]))
- instanceExtensions.Add (extensions[i].Pin (pctx));
- else
- Console.WriteLine ($"Vulkan initialisation: Unsupported extension: {extensions[i]}");
+ if (supportedExts.Contains (extensions [i])) {
+ instanceExtensions.Add (extensions [i].Pin (pctx));
+ if (extensions [i] == Ext.I.VK_EXT_debug_utils)
+ debugUtilsEnabled = true;
+ } else
+ Console.WriteLine ($"Vulkan initialisation: Unsupported extension: {extensions [i]}");
}
diff --git a/vke/src/base/Pipeline.cs b/vke/src/base/Pipeline.cs
index 329e555..8b34025 100644
--- a/vke/src/base/Pipeline.cs
+++ b/vke/src/base/Pipeline.cs
@@ -22,8 +22,8 @@ namespace vke {
}
#endregion
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.PipelineEXT, handle.Handle);
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Pipeline, handle.Handle);
public abstract void Bind (CommandBuffer cmd);
public abstract void BindDescriptorSet (CommandBuffer cmd, DescriptorSet dset, uint firstSet = 0);
diff --git a/vke/src/base/PipelineCache.cs b/vke/src/base/PipelineCache.cs
index f38764d..51545c1 100644
--- a/vke/src/base/PipelineCache.cs
+++ b/vke/src/base/PipelineCache.cs
@@ -72,9 +72,8 @@ namespace vke {
base.Activate ();
}
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.PipelineCacheEXT, handle.Handle);
-
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.PipelineCache, handle.Handle);
public void Delete () {
string path = Path.Combine (globalConfigPath, cacheFile);
diff --git a/vke/src/base/PipelineLayout.cs b/vke/src/base/PipelineLayout.cs
index 2f932e7..0b68a63 100644
--- a/vke/src/base/PipelineLayout.cs
+++ b/vke/src/base/PipelineLayout.cs
@@ -15,8 +15,8 @@ namespace vke {
public List DescriptorSetLayouts = new List ();
public List PushConstantRanges = new List ();
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT(VkDebugReportObjectTypeEXT.PipelineLayoutEXT, handle.Handle);
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.PipelineLayout, handle.Handle);
#region CTORS
public PipelineLayout (Device device) : base (device) { }
diff --git a/vke/src/base/QueryPool.cs b/vke/src/base/QueryPool.cs
index 7a5edd3..9fa6f4c 100644
--- a/vke/src/base/QueryPool.cs
+++ b/vke/src/base/QueryPool.cs
@@ -104,8 +104,8 @@ namespace vke {
#endregion
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT(VkDebugReportObjectTypeEXT.QueryPoolEXT, handle.Handle);
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.QueryPool, handle.Handle);
public override void Activate () {
if (state != ActivableState.Activated) {
diff --git a/vke/src/base/RenderPass.cs b/vke/src/base/RenderPass.cs
index ae5e603..57ceddb 100644
--- a/vke/src/base/RenderPass.cs
+++ b/vke/src/base/RenderPass.cs
@@ -21,11 +21,13 @@ namespace vke {
public VkAttachmentDescription [] Attachments => attachments.ToArray ();
public SubPass [] SubPasses => subpasses.ToArray ();
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT(VkDebugReportObjectTypeEXT.RenderPassEXT, handle.Handle);
-
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.RenderPass, handle.Handle);
#region CTORS
+ ///
+ /// Create empty render pass with no attachment
+ ///
public RenderPass (Device device, VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1) : base(device) {
Samples = samples;
}
diff --git a/vke/src/base/SwapChain.cs b/vke/src/base/SwapChain.cs
index c752696..eba607d 100644
--- a/vke/src/base/SwapChain.cs
+++ b/vke/src/base/SwapChain.cs
@@ -26,8 +26,8 @@ namespace vke {
public VkSemaphore presentComplete;
public Image[] images;
- protected override VkDebugMarkerObjectNameInfoEXT DebugMarkerInfo
- => new VkDebugMarkerObjectNameInfoEXT (VkDebugReportObjectTypeEXT.SwapchainKhrEXT, Handle.Handle);
+ protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo
+ => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.SwapchainKHR, Handle.Handle);
/// Swapchain images count.
public uint ImageCount => (uint)images?.Length;
@@ -84,8 +84,6 @@ namespace vke {
/// Create swapchain and populate images array
///
public void Create () {
- if (state != ActivableState.Activated)
- Activate ();
Dev.WaitIdle ();
@@ -113,7 +111,10 @@ namespace vke {
_destroy ();
Handle = newSwapChain;
- VkImage[] tmp = Dev.GetSwapChainImages (Handle);
+ if (state != ActivableState.Activated)
+ Activate ();
+
+ VkImage[] tmp = Dev.GetSwapChainImages (Handle);
images = new Image[tmp.Length];
for (int i = 0; i < tmp.Length; i++) {
images[i] = new Image (Dev, tmp[i], ColorFormat, ImageUsage, Width, Height);
diff --git a/vke/vke.csproj b/vke/vke.csproj
index 2d7aab6..b11e087 100644
--- a/vke/vke.csproj
+++ b/vke/vke.csproj
@@ -1,9 +1,10 @@
- netstandard2.0
+ netstandard2.0
+
+ 0.1.11
- 0.1.8
$(ReleaseVersion)
C# vulkan library with IDispose model and references counting
https://github.com/jpbruyere/vke.net
@@ -48,8 +49,8 @@
-
-
+
+
--
2.47.3