10
10
11
11
#include " Renderer.h"
12
12
13
+ #include " platform/vulkan/utils/Types.h"
14
+
13
15
namespace Siege
14
16
{
15
17
Renderer* Renderer::instance {nullptr };
@@ -19,9 +21,11 @@ Renderer::Renderer(Window& window) : window {window}
19
21
{
20
22
if (instance == nullptr ) instance = this ;
21
23
22
- context. Init (Window::GetRequiredExtensions, Window::CreateWindowSurface );
24
+ auto extent = window. GetExtent ( );
23
25
24
- swapChain.SetWindowExtents (window.GetExtent ());
26
+ context.Init ({extent.width , extent.height },
27
+ Window::GetRequiredExtensions,
28
+ Window::CreateWindowSurface);
25
29
26
30
DescriptorPool::AddPoolSize (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 10 );
27
31
DescriptorPool::AddPoolSize (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 10 );
@@ -45,7 +49,7 @@ Renderer::~Renderer()
45
49
46
50
void Renderer::CreateCommandBuffers ()
47
51
{
48
- commandBuffers = Utils::MHArray<VkCommandBuffer>(SwapChain ::MAX_FRAMES_IN_FLIGHT);
52
+ commandBuffers = Utils::MHArray<VkCommandBuffer>(Vulkan::Swapchain ::MAX_FRAMES_IN_FLIGHT);
49
53
50
54
VkCommandBufferAllocateInfo allocInfo {};
51
55
allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
@@ -79,15 +83,16 @@ void Renderer::RecreateSwapChain()
79
83
window.WaitEvents ();
80
84
}
81
85
82
- auto oldImageFormat = swapChain.GetImageFormat ();
83
- auto oldDepthFormat = swapChain.GetDepthFormat ();
86
+ auto & swapchain = context.GetSwapchain ();
87
+
88
+ auto oldImageFormat = swapchain.GetImageFormat ();
89
+ auto oldDepthFormat = swapchain.GetDepthFormat ();
84
90
85
- // Re-create swapchain
86
- swapChain.RecreateSwapchain ();
91
+ context.RecreateSwapchain ({extent.width , extent.height });
87
92
88
93
// Re-create the pipeline once the swapchain renderpass
89
94
// becomes available again.
90
- if (!swapChain. CompareSwapFormats (oldImageFormat, oldDepthFormat))
95
+ if (!swapchain. IsSameSwapFormat (oldImageFormat, oldDepthFormat))
91
96
{
92
97
Renderer3D::RecreateMaterials ();
93
98
Renderer2D::RecreateMaterials ();
@@ -98,15 +103,17 @@ bool Renderer::StartFrame()
98
103
{
99
104
CC_ASSERT (!isFrameStarted, " Can't start a frame when a frame is already in progress!" );
100
105
101
- auto result = swapChain. AcquireNextImage (¤tImageIndex );
106
+ auto & swapchain = context. GetSwapchain ( );
102
107
103
- if (result == VK_ERROR_OUT_OF_DATE_KHR)
108
+ auto result = swapchain.AcquireNextImage (¤tImageIndex);
109
+
110
+ if (result == Vulkan::Utils::ERROR_OUT_OF_DATE)
104
111
{
105
112
RecreateSwapChain ();
106
113
return false ;
107
114
}
108
115
109
- CC_ASSERT (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR ,
116
+ CC_ASSERT (result == Vulkan::Utils::SUCCESS || result == Vulkan::Utils::SUBOPTIMAL ,
110
117
" Failed to acquire swapchain image!" );
111
118
112
119
isFrameStarted = true ;
@@ -126,7 +133,9 @@ bool Renderer::StartFrame()
126
133
127
134
void Renderer::EndFrame ()
128
135
{
129
- CC_ASSERT (isFrameStarted, " Can't end frame while frame is not in progress!" );
136
+ CC_ASSERT (isFrameStarted, " Can't end frame while frame is not in progress!" )
137
+
138
+ auto & swapchain = context.GetSwapchain ();
130
139
131
140
DrawFrame ();
132
141
@@ -137,63 +146,54 @@ void Renderer::EndFrame()
137
146
CC_ASSERT (vkEndCommandBuffer (OUT commandBuffer) == VK_SUCCESS,
138
147
" Failed to record command buffer!" );
139
148
140
- auto result = swapChain .SubmitCommandBuffers (&commandBuffer, ¤tImageIndex);
149
+ auto result = swapchain .SubmitCommandBuffers (&commandBuffer, ¤tImageIndex);
141
150
142
- if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || window.WasResized ())
151
+ if (result == Vulkan::Utils::ERROR_RESIZED || window.WasResized ())
143
152
{
144
153
window.ResetWindowResized ();
145
154
RecreateSwapChain ();
146
155
}
147
- else if (result != VK_SUCCESS)
148
- {
149
- CC_ASSERT (result == VK_SUCCESS, " Failed to submit command buffer for drawing!" );
150
- }
151
156
152
157
isFrameStarted = false ;
153
- currentFrameIndex = (currentFrameIndex + 1 ) % SwapChain ::MAX_FRAMES_IN_FLIGHT;
158
+ currentFrameIndex = (currentFrameIndex + 1 ) % Vulkan::Swapchain ::MAX_FRAMES_IN_FLIGHT;
154
159
155
160
Renderer3D::Flush ();
156
161
Renderer2D::Flush ();
157
162
}
158
163
159
164
void Renderer::BeginSwapChainRenderPass (VkCommandBuffer commandBuffer)
160
165
{
166
+ auto & swapchain = context.GetSwapchain ();
167
+
161
168
CC_ASSERT (isFrameStarted, " Can't start render pass while the frame hasn't started!" );
162
169
CC_ASSERT (commandBuffer == GetCurrentCommandBuffer (),
163
170
" Can't begin a render pass on a command buffer from another frame!" );
164
171
165
- uint32_t clearValueCount = 2 ;
166
- VkClearValue clearValues[clearValueCount];
167
- clearValues[0 ].color = clearValue;
168
- clearValues[1 ].depthStencil = {1 .0f , 0 };
172
+ auto swapExtent = swapchain.GetExtent ();
169
173
170
- RenderPass::Begin (swapChain.GetRenderPass ()->GetRenderPass (),
171
- OUT commandBuffer,
172
- swapChain.GetFrameBuffer (currentImageIndex),
173
- {0 , 0 },
174
- swapChain.GetSwapChainExtent (),
175
- clearValues,
176
- clearValueCount);
174
+ swapchain.BeginRenderPass (OUT commandBuffer, currentImageIndex, {{clearValue}, {{{1 .f , 0 .f }}}});
177
175
178
176
VkViewport viewport {};
179
177
viewport.x = 0 .0f ;
180
178
viewport.y = 0 .0f ;
181
- viewport.width = static_cast <float >(swapChain. GetSwapChainExtent () .width );
182
- viewport.height = static_cast <float >(swapChain. GetSwapChainExtent () .height );
179
+ viewport.width = static_cast <float >(swapExtent .width );
180
+ viewport.height = static_cast <float >(swapExtent .height );
183
181
viewport.minDepth = 0 .0f ;
184
182
viewport.maxDepth = 1 .0f ;
185
- VkRect2D scissor {{0 , 0 }, swapChain. GetSwapChainExtent () };
183
+ VkRect2D scissor {{0 , 0 }, {swapExtent. width , swapExtent. height } };
186
184
187
185
vkCmdSetViewport (commandBuffer, 0 , 1 , &viewport);
188
186
vkCmdSetScissor (commandBuffer, 0 , 1 , &scissor);
189
187
}
190
188
191
189
void Renderer::EndSwapChainRenderPass (VkCommandBuffer commandBuffer)
192
190
{
191
+ auto & swapchain = context.GetSwapchain ();
192
+
193
193
CC_ASSERT (isFrameStarted, " Can't end render pass while the frame hasn't started!" );
194
194
CC_ASSERT (commandBuffer == GetCurrentCommandBuffer (),
195
- " Can't begin a render pass on a command buffer from another frame!" );
195
+ " Can't end a render pass on a command buffer from another frame!" );
196
196
197
- RenderPass::End (commandBuffer);
197
+ swapchain. EndRenderPass (commandBuffer);
198
198
}
199
199
} // namespace Siege
0 commit comments