@@ -30,7 +30,19 @@ void GraphicsApiVk::Init(GraphicsApiOptions* options)
30
30
vkCreateWin32SurfaceKHR(vkbInstance.instance, &createInfo, nullptr, &_vkSurface);*/
31
31
32
32
vkb::PhysicalDeviceSelector deviceSelector (vkbInstance);
33
- auto physDevWrapper = deviceSelector.set_surface (m_vkSurface).set_minimum_version (1 , 1 ).require_dedicated_transfer_queue ().select ();
33
+
34
+ VkPhysicalDeviceVulkan13Features features = {};
35
+ features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
36
+ features.dynamicRendering = VK_TRUE;
37
+ auto physDevWrapper = deviceSelector
38
+ .set_surface (m_vkSurface)
39
+ .set_minimum_version (1 , 3 )
40
+ .add_required_extension (VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME)
41
+ .add_required_extension (VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME)
42
+ .add_required_extension (VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)
43
+ .add_required_extension_features (features)
44
+ .require_dedicated_transfer_queue ()
45
+ .select ();
34
46
assert (physDevWrapper);
35
47
vkb::DeviceBuilder deviceBuilder (physDevWrapper.value ());
36
48
auto devWrapper = deviceBuilder.build ();
@@ -43,7 +55,7 @@ void GraphicsApiVk::Init(GraphicsApiOptions* options)
43
55
VkQueue graphicsQueue = graphicsQueueWrapper.value ();
44
56
45
57
vkb::SwapchainBuilder swapchainBuilder (vkbDevice);
46
- auto swapchainResult = swapchainBuilder.build ();
58
+ auto swapchainResult = swapchainBuilder.set_desired_present_mode (VK_PRESENT_MODE_FIFO_KHR). build ();
47
59
assert (swapchainResult);
48
60
49
61
m_vkDevice = device;
@@ -52,7 +64,7 @@ void GraphicsApiVk::Init(GraphicsApiOptions* options)
52
64
m_vkSwapchain = swapchainResult.value ();
53
65
54
66
VkCommandPoolCreateInfo cmdPoolCreateInfo;
55
- cmdPoolCreateInfo.flags = 0 ;
67
+ cmdPoolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT ;
56
68
cmdPoolCreateInfo.pNext = 0 ;
57
69
cmdPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
58
70
cmdPoolCreateInfo.queueFamilyIndex = vkbDevice.get_queue_index (vkb::QueueType::graphics).value ();
@@ -65,6 +77,43 @@ void GraphicsApiVk::Init(GraphicsApiOptions* options)
65
77
cmdBufferAllocInfo.commandPool = m_CommandPool;
66
78
cmdBufferAllocInfo.commandBufferCount = 1 ;
67
79
assert (vkAllocateCommandBuffers (m_vkDevice, &cmdBufferAllocInfo, &m_CommandBuffer) == VK_SUCCESS);
80
+
81
+ vkGetSwapchainImagesKHR (m_vkDevice, m_vkSwapchain, &m_SwapChainImageCount, VK_NULL_HANDLE);
82
+ if (m_SwapChainImageCount)
83
+ {
84
+ VkImageViewUsageCreateInfo usageCreateInfo = {VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, VK_NULL_HANDLE, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT};
85
+ m_Images = new VkImage[m_SwapChainImageCount];
86
+ vkGetSwapchainImagesKHR (m_vkDevice, m_vkSwapchain, &m_SwapChainImageCount, m_Images);
87
+ m_ImageViews = new VkImageView[m_SwapChainImageCount];
88
+ VkComponentMapping componentMapping = {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY};
89
+ for (uint32_t i = 0 ; i < m_SwapChainImageCount; i++)
90
+ {
91
+ VkImageViewCreateInfo createInfo = {};
92
+ createInfo.pNext = &usageCreateInfo;
93
+ createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
94
+ createInfo.image = m_Images[i];
95
+ createInfo.flags = 0 ;
96
+ createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
97
+ createInfo.format = VK_FORMAT_B8G8R8A8_SRGB;
98
+ createInfo.components = componentMapping;
99
+ createInfo.subresourceRange = {
100
+ VK_IMAGE_ASPECT_COLOR_BIT,
101
+ 0 ,
102
+ 1 ,
103
+ 0 ,
104
+ 1 };
105
+ vkCreateImageView (m_vkDevice, &createInfo, nullptr , &m_ImageViews[i]);
106
+ }
107
+ }
108
+
109
+ VkFenceCreateInfo fenceCreateInfo = {};
110
+ fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
111
+ fenceCreateInfo.flags = 0 ;
112
+
113
+ vkCreateFence (m_vkDevice, &fenceCreateInfo, nullptr , &m_vkFence);
114
+ vkCreateFence (m_vkDevice, &fenceCreateInfo, VK_NULL_HANDLE, &m_vkCmdBufFence);
115
+ vkCmdBeginRenderingKHR = (PFN_vkCmdBeginRenderingKHR)vkGetInstanceProcAddr (m_vkInstance, " vkCmdBeginRenderingKHR" );
116
+ vkCmdEndRenderingKHR = (PFN_vkCmdEndRenderingKHR)vkGetInstanceProcAddr (m_vkInstance, " vkCmdEndRenderingKHR" );
68
117
}
69
118
70
119
lepus::engine::objects::Mesh* GraphicsApiVk::WrapMesh (engine::objects::Mesh* mesh)
@@ -75,25 +124,32 @@ lepus::engine::objects::Mesh* GraphicsApiVk::WrapMesh(engine::objects::Mesh* mes
75
124
76
125
void GraphicsApiVk::ClearFrameBuffer (float r, float g, float b)
77
126
{
78
- VkCommandBufferBeginInfo beginInfo;
127
+ VkCommandBufferBeginInfo beginInfo = {} ;
79
128
beginInfo.pNext = 0 ;
80
129
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
81
130
beginInfo.flags = 0 ;
82
131
beginInfo.pInheritanceInfo = 0 ;
83
132
133
+ vkResetFences (m_vkDevice, 1 , &m_vkFence);
134
+ vkResetFences (m_vkDevice, 1 , &m_vkCmdBufFence);
84
135
vkBeginCommandBuffer (m_CommandBuffer, &beginInfo);
136
+
137
+ vkAcquireNextImageKHR (m_vkDevice, m_vkSwapchain, UINT64_MAX, nullptr , m_vkFence, &m_CurrentImageIndex);
138
+ vkWaitForFences (m_vkDevice, 1 , &m_vkFence, VK_TRUE, UINT64_MAX);
139
+
85
140
VkImageSubresourceRange ranges;
86
141
ranges.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
87
142
ranges.layerCount = 1 ;
88
143
ranges.levelCount = 1 ;
89
144
ranges.baseArrayLayer = 0 ;
90
145
ranges.baseMipLevel = 0 ;
91
- VkClearColorValue colour;
146
+ VkClearColorValue colour = {} ;
92
147
const float gamma = 2 .2f ;
148
+ // const float gamma = 1.f / 2.2f;
93
149
colour.float32 [0 ] = powf (r, gamma );
94
150
colour.float32 [1 ] = powf (g, gamma );
95
151
colour.float32 [2 ] = powf (b, gamma );
96
- colour.float32 [3 ] = 1 .f ;
152
+ colour.float32 [3 ] = 0 .f ;
97
153
// colour.int32[0] = 100;
98
154
// colour.int32[1] = 149;
99
155
// colour.int32[2] = 237;
@@ -103,7 +159,7 @@ void GraphicsApiVk::ClearFrameBuffer(float r, float g, float b)
103
159
// colour.uint32[2] = 237;
104
160
// colour.uint32[3] = 255;
105
161
uint32_t swapchainImageCount = 0 ;
106
- vkGetSwapchainImagesKHR (m_vkDevice, m_vkSwapchain, &swapchainImageCount, nullptr );
162
+ // vkGetSwapchainImagesKHR(m_vkDevice, m_vkSwapchain, &swapchainImageCount, nullptr);
107
163
if (swapchainImageCount > 0 )
108
164
{
109
165
VkImage* swapchainImages = new VkImage[swapchainImageCount];
@@ -112,14 +168,90 @@ void GraphicsApiVk::ClearFrameBuffer(float r, float g, float b)
112
168
for (uint32_t i = 0 ; i < swapchainImageCount; i++)
113
169
{
114
170
115
- vkCmdClearColorImage (m_CommandBuffer, swapchainImages[i], VK_IMAGE_LAYOUT_GENERAL, &colour, 1 , &ranges);
171
+ // vkCmdClearColorImage(m_CommandBuffer, swapchainImages[i], VK_IMAGE_LAYOUT_GENERAL, &colour, 1, &ranges);
116
172
}
117
173
118
174
// delete[] swapchainImages;
119
175
}
176
+
177
+ VkRenderingAttachmentInfo colourAttachment = {};
178
+ colourAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
179
+ colourAttachment.clearValue = {};
180
+ colourAttachment.clearValue .depthStencil = {};
181
+ colourAttachment.clearValue .color = colour;
182
+ colourAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
183
+ colourAttachment.resolveMode = VK_RESOLVE_MODE_NONE;
184
+ colourAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
185
+ colourAttachment.imageView = m_ImageViews[m_CurrentImageIndex];
186
+ colourAttachment.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
187
+
188
+ VkRenderingInfo renderingInfo = {};
189
+ renderingInfo.pNext = VK_NULL_HANDLE;
190
+ renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
191
+ renderingInfo.layerCount = 1 ;
192
+ renderingInfo.viewMask = 0 ;
193
+ renderingInfo.colorAttachmentCount = 1 ;
194
+ renderingInfo.pColorAttachments = &colourAttachment;
195
+ VkRenderingAttachmentInfo depthAttachment = {};
196
+ depthAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
197
+ depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
198
+ depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
199
+ depthAttachment.imageView = VK_NULL_HANDLE;
200
+ depthAttachment.resolveMode = VK_RESOLVE_MODE_NONE;
201
+ VkRenderingAttachmentInfo stencilAttachment = {};
202
+ stencilAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
203
+ stencilAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
204
+ stencilAttachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
205
+ stencilAttachment.imageView = VK_NULL_HANDLE;
206
+ stencilAttachment.resolveMode = VK_RESOLVE_MODE_NONE;
207
+ // renderingInfo.pDepthAttachment = &depthAttachment;
208
+ // renderingInfo.pStencilAttachment = &stencilAttachment;
209
+ VkRect2D renderArea = {};
210
+ renderArea.offset = {0 , 0 };
211
+ renderArea.extent = {800 , 600 };
212
+ renderingInfo.renderArea = renderArea;
213
+
214
+ VkImageMemoryBarrier imgMemBarrier = {
215
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
216
+ VK_NULL_HANDLE,
217
+ VK_ACCESS_NONE,
218
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
219
+ VK_IMAGE_LAYOUT_UNDEFINED,
220
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
221
+ 0 ,
222
+ 0 ,
223
+ m_Images[m_CurrentImageIndex],
224
+ {VK_IMAGE_ASPECT_COLOR_BIT,
225
+ 0 ,
226
+ 1 ,
227
+ 0 ,
228
+ 1 }};
229
+
230
+ vkCmdPipelineBarrier (m_CommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0 , 0 , nullptr , 0 , nullptr , 1 , &imgMemBarrier);
231
+
232
+ vkCmdBeginRenderingKHR (m_CommandBuffer, &renderingInfo);
233
+ vkCmdEndRenderingKHR (m_CommandBuffer);
234
+
235
+ imgMemBarrier = {
236
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
237
+ VK_NULL_HANDLE,
238
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
239
+ VK_ACCESS_NONE,
240
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
241
+ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
242
+ 0 ,
243
+ 0 ,
244
+ m_Images[m_CurrentImageIndex],
245
+ {VK_IMAGE_ASPECT_COLOR_BIT,
246
+ 0 ,
247
+ 1 ,
248
+ 0 ,
249
+ 1 }};
250
+
251
+ vkCmdPipelineBarrier (m_CommandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0 , 0 , nullptr , 0 , nullptr , 1 , &imgMemBarrier);
252
+
120
253
vkEndCommandBuffer (m_CommandBuffer);
121
254
122
- vkAcquireNextImageKHR (m_vkDevice, m_vkSwapchain, UINT64_MAX, nullptr , nullptr , &m_CurrentImageIndex);
123
255
// assert(acquireResult == VK_SUCCESS);
124
256
125
257
VkSubmitInfo submitInfo;
@@ -132,7 +264,8 @@ void GraphicsApiVk::ClearFrameBuffer(float r, float g, float b)
132
264
submitInfo.signalSemaphoreCount = 0 ;
133
265
submitInfo.waitSemaphoreCount = 0 ;
134
266
submitInfo.pWaitDstStageMask = 0 ;
135
- vkQueueSubmit (m_vkQueue, 1 , &submitInfo, nullptr );
267
+ vkQueueSubmit (m_vkQueue, 1 , &submitInfo, m_vkCmdBufFence);
268
+ vkWaitForFences (m_vkDevice, 1 , &m_vkCmdBufFence, VK_TRUE, UINT64_MAX);
136
269
}
137
270
138
271
void GraphicsApiVk::SwapBuffers ()
@@ -153,6 +286,12 @@ void GraphicsApiVk::SwapBuffers()
153
286
154
287
void GraphicsApiVk::Shutdown ()
155
288
{
289
+ vkDestroyFence (m_vkDevice, m_vkFence, VK_NULL_HANDLE);
290
+ for (uint32_t i = 0 ; i < m_SwapChainImageCount; i++)
291
+ {
292
+ vkDestroyImageView (m_vkDevice, m_ImageViews[i], VK_NULL_HANDLE);
293
+ }
294
+
156
295
vkDestroyCommandPool (m_vkDevice, m_CommandPool, nullptr );
157
296
vkDestroySwapchainKHR (m_vkDevice, m_vkSwapchain, nullptr );
158
297
vkDestroyDevice (m_vkDevice, nullptr );
0 commit comments