Skip to content

Commit 997dfef

Browse files
committed
feat(ApiVk): added basic dynamic rendering support
1 parent 090b562 commit 997dfef

File tree

2 files changed

+165
-10
lines changed

2 files changed

+165
-10
lines changed

src/lepus/gfx/GraphicsEngine/Apis/ApiVk.h

+16
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ namespace lepus
3838
VkFramebuffer* m_FrameBuffers;
3939
uint32_t m_FrameBufferCount;
4040
uint32_t m_CurrentImageIndex;
41+
uint32_t m_SwapChainImageCount;
42+
VkImageView* m_ImageViews;
43+
VkImage* m_Images;
44+
VkFence m_vkFence, m_vkCmdBufFence;
45+
PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR;
46+
PFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR;
4147

4248
inline void* GetUniformInternal(const char* name) override
4349
{
@@ -51,13 +57,23 @@ namespace lepus
5157
m_FrameBuffers = nullptr;
5258
m_FrameBufferCount = 0;
5359
m_CurrentImageIndex = 0;
60+
m_SwapChainImageCount = 0;
61+
m_ImageViews = nullptr;
62+
m_Images = nullptr;
63+
m_vkFence = VK_NULL_HANDLE;
64+
m_vkCmdBufFence = VK_NULL_HANDLE;
5465
}
5566

5667
GraphicsApiVk(GraphicsApiOptions* options)
5768
{
5869
m_FrameBuffers = nullptr;
5970
m_FrameBufferCount = 0;
6071
m_CurrentImageIndex = 0;
72+
m_SwapChainImageCount = 0;
73+
m_ImageViews = nullptr;
74+
m_Images = nullptr;
75+
m_vkFence = VK_NULL_HANDLE;
76+
m_vkCmdBufFence = VK_NULL_HANDLE;
6177
GraphicsApiVk::Init(options);
6278
}
6379

src/lepus/gfx/GraphicsEngine/Apis/ApiVk/ApiVk.cpp

+149-10
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,19 @@ void GraphicsApiVk::Init(GraphicsApiOptions* options)
3030
vkCreateWin32SurfaceKHR(vkbInstance.instance, &createInfo, nullptr, &_vkSurface);*/
3131

3232
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();
3446
assert(physDevWrapper);
3547
vkb::DeviceBuilder deviceBuilder(physDevWrapper.value());
3648
auto devWrapper = deviceBuilder.build();
@@ -43,7 +55,7 @@ void GraphicsApiVk::Init(GraphicsApiOptions* options)
4355
VkQueue graphicsQueue = graphicsQueueWrapper.value();
4456

4557
vkb::SwapchainBuilder swapchainBuilder(vkbDevice);
46-
auto swapchainResult = swapchainBuilder.build();
58+
auto swapchainResult = swapchainBuilder.set_desired_present_mode(VK_PRESENT_MODE_FIFO_KHR).build();
4759
assert(swapchainResult);
4860

4961
m_vkDevice = device;
@@ -52,7 +64,7 @@ void GraphicsApiVk::Init(GraphicsApiOptions* options)
5264
m_vkSwapchain = swapchainResult.value();
5365

5466
VkCommandPoolCreateInfo cmdPoolCreateInfo;
55-
cmdPoolCreateInfo.flags = 0;
67+
cmdPoolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5668
cmdPoolCreateInfo.pNext = 0;
5769
cmdPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5870
cmdPoolCreateInfo.queueFamilyIndex = vkbDevice.get_queue_index(vkb::QueueType::graphics).value();
@@ -65,6 +77,43 @@ void GraphicsApiVk::Init(GraphicsApiOptions* options)
6577
cmdBufferAllocInfo.commandPool = m_CommandPool;
6678
cmdBufferAllocInfo.commandBufferCount = 1;
6779
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");
68117
}
69118

70119
lepus::engine::objects::Mesh* GraphicsApiVk::WrapMesh(engine::objects::Mesh* mesh)
@@ -75,25 +124,32 @@ lepus::engine::objects::Mesh* GraphicsApiVk::WrapMesh(engine::objects::Mesh* mes
75124

76125
void GraphicsApiVk::ClearFrameBuffer(float r, float g, float b)
77126
{
78-
VkCommandBufferBeginInfo beginInfo;
127+
VkCommandBufferBeginInfo beginInfo = {};
79128
beginInfo.pNext = 0;
80129
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
81130
beginInfo.flags = 0;
82131
beginInfo.pInheritanceInfo = 0;
83132

133+
vkResetFences(m_vkDevice, 1, &m_vkFence);
134+
vkResetFences(m_vkDevice, 1, &m_vkCmdBufFence);
84135
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+
85140
VkImageSubresourceRange ranges;
86141
ranges.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
87142
ranges.layerCount = 1;
88143
ranges.levelCount = 1;
89144
ranges.baseArrayLayer = 0;
90145
ranges.baseMipLevel = 0;
91-
VkClearColorValue colour;
146+
VkClearColorValue colour = {};
92147
const float gamma = 2.2f;
148+
// const float gamma = 1.f / 2.2f;
93149
colour.float32[0] = powf(r, gamma);
94150
colour.float32[1] = powf(g, gamma);
95151
colour.float32[2] = powf(b, gamma);
96-
colour.float32[3] = 1.f;
152+
colour.float32[3] = 0.f;
97153
// colour.int32[0] = 100;
98154
// colour.int32[1] = 149;
99155
// colour.int32[2] = 237;
@@ -103,7 +159,7 @@ void GraphicsApiVk::ClearFrameBuffer(float r, float g, float b)
103159
// colour.uint32[2] = 237;
104160
// colour.uint32[3] = 255;
105161
uint32_t swapchainImageCount = 0;
106-
vkGetSwapchainImagesKHR(m_vkDevice, m_vkSwapchain, &swapchainImageCount, nullptr);
162+
// vkGetSwapchainImagesKHR(m_vkDevice, m_vkSwapchain, &swapchainImageCount, nullptr);
107163
if (swapchainImageCount > 0)
108164
{
109165
VkImage* swapchainImages = new VkImage[swapchainImageCount];
@@ -112,14 +168,90 @@ void GraphicsApiVk::ClearFrameBuffer(float r, float g, float b)
112168
for (uint32_t i = 0; i < swapchainImageCount; i++)
113169
{
114170

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);
116172
}
117173

118174
// delete[] swapchainImages;
119175
}
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+
120253
vkEndCommandBuffer(m_CommandBuffer);
121254

122-
vkAcquireNextImageKHR(m_vkDevice, m_vkSwapchain, UINT64_MAX, nullptr, nullptr, &m_CurrentImageIndex);
123255
// assert(acquireResult == VK_SUCCESS);
124256

125257
VkSubmitInfo submitInfo;
@@ -132,7 +264,8 @@ void GraphicsApiVk::ClearFrameBuffer(float r, float g, float b)
132264
submitInfo.signalSemaphoreCount = 0;
133265
submitInfo.waitSemaphoreCount = 0;
134266
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);
136269
}
137270

138271
void GraphicsApiVk::SwapBuffers()
@@ -153,6 +286,12 @@ void GraphicsApiVk::SwapBuffers()
153286

154287
void GraphicsApiVk::Shutdown()
155288
{
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+
156295
vkDestroyCommandPool(m_vkDevice, m_CommandPool, nullptr);
157296
vkDestroySwapchainKHR(m_vkDevice, m_vkSwapchain, nullptr);
158297
vkDestroyDevice(m_vkDevice, nullptr);

0 commit comments

Comments
 (0)