<RestoreAdditionalProjectSources Condition="Exists('$(SolutionDir)build\$(Configuration)\')">$(SolutionDir)build\$(Configuration)\</RestoreAdditionalProjectSources>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <DefineConstants>TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;_WITH_SHADOWS;WITH_VKVG</DefineConstants>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <DefineConstants>NETSTANDARD;NETSTANDARD2_0;WITH_SHADOWS;_WITH_VKVG</DefineConstants>
- </PropertyGroup>
-
<ItemGroup Condition=" '$(Configuration)|$(Platform)' != 'BuildPackages|AnyCPU' ">
<ProjectReference Include="..\..\vke\vke.csproj" />
</ItemGroup>
// Copyright (c) 2019 Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
//
// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
-using System;
-using System.Numerics;
using vke;
using Vulkan;
cmd.Draw (3, 1, 0, 0);
}
+#if MEMORY_POOLs
public void DrawResources (vkvg.Context ctx, int width, int height) {
ResourceManager rm = Dev.resourceManager;
y += memPoolHeight;
}
}
+#endif
protected override void Dispose (bool disposing) {
Texture?.Dispose ();
vkvgSurf?.Dispose ();
```xml
<Project Sdk="Microsoft.NET.Sdk">
- <TargetFrameworks>net472</TargetFrameworks>
- <OutputType>Exe</OutputType>
+ <PropertyGroup>
+ <TargetFrameworks>net472</TargetFrameworks>
+ <OutputType>Exe</OutputType>
+ </PropertyGroup>
<ItemGroup>
<GLSLShader Include="shaders\*.*" />
</ItemGroup>
```csharp
class Program : VkWindow {
static void Main (string[] args) {
+ Instance.VALIDATION = true;
using (Program vke = new Program ()) {
vke.Run ();
}
### Vulkan Initialization
-`initVulkan` is the first method called by the 'Run' method. Default initialization will provide a vulkan window, a default swap chain bound to it, and a draw and present semaphore to sync the rendering.
+**`initVulkan`** is the first method called by the **`Run`** method. Default initialization will provide a vulkan window, a default swap chain bound to it, and a draw and present semaphore to sync the rendering.
```csharp
protected override void initVulkan () {
base.initVulkan ();
### Frame buffer creation
-The resize method is called at least once before any rendering, so it's a safe place to initialize output size related vulkan objects like the frame buffers. vke provide a FrameBuffer collection object to ease handling of multiple related buffers like those used for a swap chain for example..
+The **`OnResize`** method is called at least once before any rendering, so it's a safe place to initialize output size related vulkan objects like the frame buffers. vke provide a FrameBuffer collection object to ease handling of multiple related buffers like those used for a swap chain for example..
```csharp
FrameBuffers frameBuffers;
```
It's common to rebuild the command buffers targeting the swap chain images after a resize so that the drawing is scaled. So it's a good idea to build/rebuild your commands here.
-
-
### The command buffers
The `VkWindow` class has a default array of command buffers, one for each swap chain image. But it's up to you to allocate and populate them.
}
}
- //frame buffer collection to handle on fb per swapchain image.
+ //frame buffer collection to handle one frame buffer per swapchain image.
FrameBuffers frameBuffers;
RenderPass renderPass;
protected override void onMouseMove (double xPos, double yPos) {
double diffX = lastMouseX - xPos;
double diffY = lastMouseY - yPos;
- if (MouseButton[0]) {
+ if (GetButton (MouseButton.Left) == InputAction.Press) {
rotY -= rotSpeed * (float)diffX;
rotX += rotSpeed * (float)diffY;
- } else if (MouseButton[1]) {
+ } else if (GetButton (MouseButton.Right) == InputAction.Press) {
zoom += zoomSpeed * (float)diffY;
}
### Enabling extensions
-The `VkWindow` class provides two properties that you may override to enable additional extensions.
+The **`VkWindow`** class provides two properties that you may override to enable additional extensions.
+```csharp
+public override string[] EnabledInstanceExtensions => new string[] {
+ Ext.I.VK_EXT_debug_utils
+};
+public override string[] EnabledDeviceExtensions => new string[] {
+ Ext.D.VK_KHR_swapchain,
+};
+```
+Extension's names are organized in two subclasses of the `Ext` static class, one for the instance extensions (**`Ext.I`**) and one for the device ones (**`Ext.D`**).
### Enabling features
-Override the `configureEnabledFeatures` method of `VkWindow` to enable features.
+Override the **`configureEnabledFeatures`** method of **`VkWindow`** to enable features.
```csharp
protected override void configureEnabledFeatures (
- VkPhysicalDeviceFeatures available_features,
- ref VkPhysicalDeviceFeatures enabled_features)
-{
- enabled_features.samplerAnisotropy = available_features.samplerAnisotropy;
+ VkPhysicalDeviceFeatures available_features,
+ ref VkPhysicalDeviceFeatures enabled_features) {
+
+ enabled_features.samplerAnisotropy = available_features.samplerAnisotropy;
}
```
### Creating queues
-To create queues, override the `createQueues` method of `VkWindow`. This function is called before the logical device creation and will take care of physically available queues, creating duplicates if count exceed availability. The `base` method will create a default presentable queue.
+To create queues, override the **`createQueues`** method of **`VkWindow`**. This function is called before the logical device creation and will take care of physically available queues, creating duplicates if count exceed availability. The `base` method will create a default presentable queue.
```csharp
protected override void createQueues () {
vke.Run ();
}
}
- protected override void configureEnabledFeatures (VkPhysicalDeviceFeatures available_features, ref VkPhysicalDeviceFeatures features) {
- base.configureEnabledFeatures (available_features, ref features);
- features.textureCompressionBC = available_features.textureCompressionBC;
- features.textureCompressionASTC_LDR = available_features.textureCompressionASTC_LDR;
+ protected override void configureEnabledFeatures (VkPhysicalDeviceFeatures available_features, ref VkPhysicalDeviceFeatures enabled_features) {
+ base.configureEnabledFeatures (available_features, ref enabled_features);
+ enabled_features.textureCompressionBC = available_features.textureCompressionBC;
+ enabled_features.textureCompressionASTC_LDR = available_features.textureCompressionASTC_LDR;
}
float rotSpeed = 0.01f, zoomSpeed = 0.01f;
ushort[] indices = { 0, 1, 2, 2, 0, 3 };
int currentImgIndex = 0;
string[] imgPathes = {
- vke.samples.Utils.DataDirectory + "models/Bricks16_col.jpg",
vke.samples.Utils.DataDirectory + "textures/texturearray_rocks_bc3_unorm.ktx",
vke.samples.Utils.DataDirectory + "textures/texture.jpg",
vke.samples.Utils.DataDirectory + "textures/tex256.jpg",
pipeline = new GraphicPipeline (cfg);
-
- uboMats = new HostBuffer (dev, VkBufferUsageFlags.UniformBuffer, matrices);
- uboMats.Map ();//permanent map
+ uboMats = new HostBuffer (dev, VkBufferUsageFlags.UniformBuffer, matrices, true);
descriptorSet = descriptorPool.Allocate (dsLayout);
protected override void onMouseMove (double xPos, double yPos) {
double diffX = lastMouseX - xPos;
double diffY = lastMouseY - yPos;
- if (MouseButton[0]) {
+ if (GetButton (MouseButton.Left) == InputAction.Press) {
rotY -= rotSpeed * (float)diffX;
rotX += rotSpeed * (float)diffY;
- } else if (MouseButton[1]) {
+ } else if (GetButton (MouseButton.Right) == InputAction.Press) {
zoom += zoomSpeed * (float)diffY;
}
#extension GL_ARB_shading_language_420pack : enable
layout (location = 0) in vec3 inPos;
-layout (location = 1) in vec3 inColor;
+layout (location = 1) in vec2 inTex;
layout (binding = 0) uniform UBO
{
mat4 modelMatrix;
} ubo;
-layout (location = 0) out vec3 outColor;
+layout (location = 0) out vec2 outTex;
out gl_PerVertex
{
void main()
{
- outColor = inColor;
+ outTex = inTex;
gl_Position = ubo.projectionMatrix * ubo.viewMatrix * ubo.modelMatrix * vec4(inPos.xyz, 1.0);
}
protected override void onMouseMove (double xPos, double yPos) {
double diffX = lastMouseX - xPos;
double diffY = lastMouseY - yPos;
- if (MouseButton[0]) {
+ if (GetButton (MouseButton.Left) == InputAction.Press) {
rotY -= rotSpeed * (float)diffX;
rotX += rotSpeed * (float)diffY;
- } else if (MouseButton[1]) {
+ } else if (GetButton (MouseButton.Right) == InputAction.Press) {
zoom += zoomSpeed * (float)diffY;
}
cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat, //position
VkFormat.R32g32b32Sfloat);//color
```
-shader are automatically compiled by [`SpirVTacks`](../../SpirVTasks/README.md) if added to the project. The resulting shaders are automatically embedded in the assembly. To specifiy that the shader path is a resource name, put the **'#'** prefix. Else the path will be search on disk.
+shader are automatically compiled by [`SpirVTasks`](../../SpirVTasks/README.md) if added to the project. The resulting shaders are automatically embedded in the assembly. To specifiy that the shader path is a resource name, put the **'#'** prefix. Else the path will be search on disk.
```csharp
cfg.AddShader (VkShaderStageFlags.Vertex, "#shaders.main.vert.spv");
cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.main.frag.spv");
vke.Run ();
}
}
+ Program () : base ("triangle", 800, 600, false) { }
const float rotSpeed = 0.01f, zoomSpeed = 0.01f;
float rotX, rotY, zoom = 1f;
protected override void onMouseMove (double xPos, double yPos) {
double diffX = lastMouseX - xPos;
double diffY = lastMouseY - yPos;
- if (MouseButton [0]) {
+ if (GetButton(Glfw.MouseButton.Left) == Glfw.InputAction.Press) {
rotY -= rotSpeed * (float)diffX;
rotX += rotSpeed * (float)diffY;
- } else if (MouseButton [1]) {
+ } else if (GetButton (Glfw.MouseButton.Right) == Glfw.InputAction.Press) {
zoom += zoomSpeed * (float)diffY;
} else
return;
GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount1, true);
- Program () : base () {}
+ Program () : base ("crow", 800,600, false) {}
protected override void initVulkan () {
base.initVulkan ();
double diffX = lastMouseX - xPos;
double diffY = lastMouseY - yPos;
- if (MouseButton [0]) {
+ if (GetButton (MouseButton.Left) == InputAction.Press) {
rotY -= rotSpeed * (float)diffX;
rotX += rotSpeed * (float)diffY;
- } else if (MouseButton [1]) {
+ } else if (GetButton (MouseButton.Right) == InputAction.Press) {
zoom += zoomSpeed * (float)diffY;
} else
return;
};
public Light[] lights = {
new Light {
- position = new Vector4(1.5f,2.5f,1.5f,0f),
+ position = new Vector4(1.5f,0.5f,0.5f,0f),
color = new Vector4(1,1.0f,1.0f,1)
- },
+ }/*,
new Light {
position = new Vector4(-1.5f,2.5f,1.5f,0f),
color = new Vector4(0.8f,0.8f,1,1)
- }
+ }*/
};
FrameBuffer frameBuffer;
static void Main (string[] args) {
#if DEBUG
Instance.VALIDATION = true;
- Instance.RENDER_DOC_CAPTURE = true;
+ Instance.RENDER_DOC_CAPTURE = false;
#endif
SwapChain.PREFERED_FORMAT = VkFormat.B8g8r8a8Srgb;
DeferredPbrRenderer.TEXTURE_ARRAY = true;
protected override void onMouseMove (double xPos, double yPos) {
double diffX = lastMouseX - xPos;
double diffY = lastMouseY - yPos;
- if (MouseButton[0]) {
+ if (GetButton (MouseButton.Left) == InputAction.Press) {
camera.Rotate ((float)-diffY, (float)-diffX, 0);
- } else if (MouseButton[1]) {
+ } else if (GetButton (MouseButton.Right) == InputAction.Press) {
camera.SetZoom ((float)diffY);
} else
return;
void main()
{
- 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);
-
-
- /*
- outColor = vec4(SRGBtoLINEAR(tonemap(hdrColor.rgb)), hdrColor.a);;*/
-
-/* vec3 mapped = vec3(1.0) - exp(-hdrColor.rgb * pc.exposure);
- mapped = pow(mapped, vec3(1.0 / pc.gamma));
- outColor = vec4(mapped, hdrColor.a);*/
+ ivec2 ts = textureSize(samplerHDR);
+ vec4 hdrColor = texelFetch (samplerHDR, ivec2(gl_FragCoord.xy), gl_SampleID);
+ outColor = tonemap(hdrColor, exposure, gamma);
}
\ No newline at end of file
public PbrModel2 model;
public vke.Environment.EnvironmentCube envCube;
- string[] cubemapPathes = {
- Utils.DataDirectory + "textures/papermill.ktx",
- Utils.DataDirectory + "textures/cubemap_yokohama_bc3_unorm.ktx",
- Utils.DataDirectory + "textures/gcanyon_cube.ktx",
- Utils.DataDirectory + "textures/pisa_cube.ktx",
- Utils.DataDirectory + "textures/uffizi_cube.ktx",
- };
+ string[] cubemapPathes = samples.Utils.CubeMaps;
public PBRPipeline (Queue staggingQ, RenderPass renderPass, PipelineCache pipelineCache = null) :
base (renderPass, pipelineCache, "pbr pipeline") {
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"*/
- };
+ string[] modelPathes = vke.samples.Utils.GltfFiles;
DebugView currentDebugView = DebugView.none;
bool rebuildBuffers, reloadModel;
void buildCommandBuffers () {
+ dev.WaitIdle ();
for (int i = 0; i < swapChain.ImageCount; ++i) {
cmds[i]?.Free ();
cmds[i] = cmdPool.AllocateAndStart ();
pbrPipeline.matrices.camPos = new Vector4 (inv.M41, inv.M42, inv.M43, 0);
pbrPipeline.matrices.debugViewInputs = (float)currentDebugView;
+ dev.WaitIdle ();
+
pbrPipeline.uboMats.Update (pbrPipeline.matrices, (uint)Marshal.SizeOf<PBRPipeline.Matrices> ());
updateViewRequested = false;
protected override void onMouseMove (double xPos, double yPos) {
double diffX = lastMouseX - xPos;
double diffY = lastMouseY - yPos;
- if (MouseButton[0]) {
- camera.Rotate ((float)-diffY, (float)-diffX,0);
- } else if (MouseButton[1]) {
+ if (GetButton(MouseButton.Left)== InputAction.Press) {
+ camera.Rotate ((float)-diffY, (float)-diffX, 0);
+ } else if (GetButton (MouseButton.Right) == InputAction.Press) {
camera.SetZoom ((float)diffY);
} else
return;
<Project Sdk="Microsoft.NET.Sdk">
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <!--<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DefineConstants>_WITH_SHADOWS;_WITH_VKVG;TRACE;DEBUG</DefineConstants>
- </PropertyGroup>
+ </PropertyGroup>-->
<ItemGroup>
<GLSLShader Update="shaders/simpletexture.frag">
<LogicalName>vke.simpletexture.frag.spv</LogicalName>
double diffX = lastMouseX - xPos;
double diffY = lastMouseY - yPos;
- if (MouseButton [0]) {
+ if (GetButton (MouseButton.Left) == InputAction.Press) {
rotY -= rotSpeed * (float)diffX;
rotX += rotSpeed * (float)diffY;
- } else if (MouseButton [1]) {
+ } else if (GetButton (MouseButton.Right) == InputAction.Press) {
zoom += zoomSpeed * (float)diffY;
} else
return;
protected bool updateViewRequested = true;
protected double lastMouseX { get; private set; }
protected double lastMouseY { get; private set; }
- protected bool[] MouseButton => buttons;
/// <summary>readonly GLFW window handle</summary>
public IntPtr WindowHandle => hWin;
/**Default camera initialized with a Field of view of 40° and and aspect ratio of 1. */
protected Camera camera = new Camera (Utils.DegreesToRadians (45f), 1f);
- bool[] buttons = new bool[10];
public Modifier KeyModifiers = 0;
IntPtr currentCursor;
uint frameCount;
configureEnabledFeatures (phy.Features, ref enabledFeatures);
//First create the c# device class
- dev = new Device (phy);
- dev.debugUtilsEnabled = instance.debugUtilsEnabled;//store a boolean to prevent testing against the extension string presence.
+ dev = new Device (phy) {
+ debugUtilsEnabled = instance.debugUtilsEnabled//store a boolean to prevent testing against the extension string presence.
+ };
//create queue class
createQueues ();
}
/// <summary>
- /// Main render method called each frame. get next swapchain image, process resize if needed, submit and present to the presentQueue.
- /// Wait QueueIdle after presenting.
+ /// Main render method called each frame.
+ /// First get next swapchain image, process resize if needed, submit and present to the presentQueue.
/// </summary>
protected virtual void render () {
int idx = swapChain.GetNextImage ();
presentQueue.Submit (cmds[idx], swapChain.presentComplete, drawComplete[idx], drawFence);
presentQueue.Present (swapChain, drawComplete[idx]);
-
- //presentQueue.WaitIdle ();
}
protected virtual void onScroll (double xOffset, double yOffset) { }
protected virtual void onMouseMove (double xPos, double yPos) {
double diffX = lastMouseX - xPos;
double diffY = lastMouseY - yPos;
- if (MouseButton[(int)Glfw.MouseButton.Left]) {
+ if (GetButton(MouseButton.Left) == InputAction.Press) {
camera.Rotate ((float)-diffX, (float)-diffY);
updateViewRequested = true;
- } else if (MouseButton[(int)Glfw.MouseButton.Right]) {
+ } else if (GetButton (MouseButton.Right) == InputAction.Press) {
camera.Move ((float)diffX,0,0);
camera.Move (0, 0, (float)-diffY);
updateViewRequested = true;
protected virtual void onKeyUp (Key key, int scanCode, Modifier modifiers) { }
protected virtual void onChar (CodePoint cp) { }
- #region events delegates
+ protected InputAction GetButton (MouseButton button) =>
+ Glfw3.GetMouseButton (hWin, button);
+ #region events delegates
static CursorPosDelegate HandleCursorPosDelegate = (window, xPosition, yPosition) => {
windows[window].onMouseMove (xPosition, yPosition);
windows[window].lastMouseX = xPosition;
windows[window].lastMouseY = yPosition;
};
static MouseButtonDelegate HandleMouseButtonDelegate = (IntPtr window, Glfw.MouseButton button, InputAction action, Modifier mods) => {
- if (action == InputAction.Press) {
- windows[window].buttons[(int)button] = true;
+ if (action == InputAction.Press)
windows[window].onMouseButtonDown (button);
- } else {
- windows[window].buttons[(int)button] = false;
+ else
windows[window].onMouseButtonUp (button);
- }
};
static ScrollDelegate HandleScrollDelegate = (IntPtr window, double xOffset, double yOffset) => {
windows[window].onScroll (xOffset, yOffset);
};
static KeyDelegate HandleKeyDelegate = (IntPtr window, Key key, int scanCode, InputAction action, Modifier modifiers) => {
windows[window].KeyModifiers = modifiers;
- if (action == InputAction.Press || action == InputAction.Repeat) {
+ if (action == InputAction.Press || action == InputAction.Repeat)
windows[window].onKeyDown (key, scanCode, modifiers);
- } else {
+ else
windows[window].onKeyUp (key, scanCode, modifiers);
- }
};
static CharDelegate HandleCharDelegate = (IntPtr window, CodePoint codepoint) => {
windows[window].onChar (codepoint);
/// <param name="dstOffset">an offset in the destination buffer for the copy operation.</param>
public void CopyTo (CommandBuffer cmd, Buffer buff, ulong size = 0, ulong srcOffset = 0, ulong dstOffset = 0) {
VkBufferCopy bufferCopy = new VkBufferCopy {
- size = (size == 0) ? AllocatedDeviceMemorySize : size,
+ size = (size == 0) ? createInfo.size: size,
srcOffset = srcOffset,
dstOffset = dstOffset
};
info.basePipelineIndex = 0;
Utils.CheckResult (Vk.vkCreateComputePipelines (Dev.VkDev, Cache == null ? VkPipelineCache.Null : Cache.handle, 1, ref info, IntPtr.Zero, out handle));
-
- Dev.DestroyShaderModule (info.stage.module);
}
}
base.Activate ();
uint blockSize = blockW * blockH;
if (memoryProperty.HasFlag (VkMemoryPropertyFlags.DeviceLocal)) {
- ulong staggingSize = (ulong)ktxStream.Length + 256;//img.AllocatedDeviceMemorySize;
+ ulong staggingSize = img.AllocatedDeviceMemorySize;
Console.WriteLine ($"KtxStream size = {ktxStream.Length}, img Allocation = {img.AllocatedDeviceMemorySize}");
using (HostBuffer stagging = new HostBuffer (staggingQ.Dev, VkBufferUsageFlags.TransferSrc, staggingSize)) {
<PackageReference Include="SpirVTasks" Version="$(SpirVTasksPackageVersion)" />
<PackageReference Include="Vulkan" Version="0.2.3-beta" />
<PackageReference Include="shaderc.net" Version="0.1.0" />
- <PackageReference Include="glfw-sharp" Version="0.2.6-beta" />
+ <PackageReference Include="glfw-sharp" Version="0.2.8-beta" />
</ItemGroup>
<ItemGroup>