15
15
namespace Siege
16
16
{
17
17
Renderer* Renderer::instance {nullptr };
18
- Utils::MHArray<VkCommandBuffer> Renderer::commandBuffers;
18
+ Vulkan::CommandBuffer Renderer::commandBuffers;
19
+ uint32_t Renderer::currentFrameIndex = 0 ;
19
20
20
21
Renderer::Renderer (Window& window) : window {window}
21
22
{
@@ -37,7 +38,7 @@ Renderer::Renderer(Window& window) : window {window}
37
38
Renderer3D::Initialise ();
38
39
Renderer2D::Initialise ();
39
40
40
- CreateCommandBuffers ( );
41
+ commandBuffers = Vulkan::CommandBuffer (Vulkan::Swapchain::MAX_FRAMES_IN_FLIGHT );
41
42
}
42
43
43
44
Renderer::~Renderer ()
@@ -47,25 +48,9 @@ Renderer::~Renderer()
47
48
Renderer3D::DestroyRenderer3D ();
48
49
}
49
50
50
- void Renderer::CreateCommandBuffers ()
51
- {
52
- commandBuffers = Utils::MHArray<VkCommandBuffer>(Vulkan::Swapchain::MAX_FRAMES_IN_FLIGHT);
53
-
54
- VkCommandBufferAllocateInfo allocInfo {};
55
- allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
56
- allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
57
- allocInfo.commandPool = Vulkan::Context::GetCurrentDevice ()->GetCommandPool ();
58
- allocInfo.commandBufferCount = static_cast <uint32_t >(commandBuffers.Size ());
59
-
60
- CC_ASSERT (vkAllocateCommandBuffers (Vulkan::Context::GetVkLogicalDevice (),
61
- &allocInfo,
62
- OUT commandBuffers.Data ()) == VK_SUCCESS,
63
- " Failed to allocate command buffer" );
64
- }
65
-
66
51
void Renderer::DrawFrame ()
67
52
{
68
- auto commandBuffer = GetCurrentCommandBuffer ();
53
+ auto commandBuffer = commandBuffers. GetActiveCommandBuffer ();
69
54
70
55
Renderer2D::GlobalData global2DData = {projection};
71
56
@@ -101,7 +86,7 @@ void Renderer::RecreateSwapChain()
101
86
102
87
bool Renderer::StartFrame ()
103
88
{
104
- CC_ASSERT (!isFrameStarted, " Can't start a frame when a frame is already in progress!" );
89
+ CC_ASSERT (!isFrameStarted, " Can't start a frame when a frame is already in progress!" )
105
90
106
91
auto & swapchain = context.GetSwapchain ();
107
92
@@ -114,19 +99,13 @@ bool Renderer::StartFrame()
114
99
}
115
100
116
101
CC_ASSERT (result == Vulkan::Utils::SUCCESS || result == Vulkan::Utils::SUBOPTIMAL,
117
- " Failed to acquire swapchain image!" );
102
+ " Failed to acquire swapchain image!" )
118
103
119
104
isFrameStarted = true ;
120
105
121
- VkCommandBuffer commandBuffer = GetCurrentCommandBuffer ();
122
-
123
- VkCommandBufferBeginInfo beginInfo {};
124
- beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
125
-
126
- CC_ASSERT (vkBeginCommandBuffer (OUT commandBuffer, &beginInfo) == VK_SUCCESS,
127
- " Failed to begin recording command buffer" );
106
+ commandBuffers.Begin (currentFrameIndex);
128
107
129
- BeginSwapChainRenderPass (commandBuffer );
108
+ BeginSwapChainRenderPass ();
130
109
131
110
return true ;
132
111
}
@@ -139,14 +118,13 @@ void Renderer::EndFrame()
139
118
140
119
DrawFrame ();
141
120
142
- VkCommandBuffer commandBuffer = GetCurrentCommandBuffer ();
121
+ EndSwapChainRenderPass ();
143
122
144
- EndSwapChainRenderPass (commandBuffer );
123
+ commandBuffers. End ( );
145
124
146
- CC_ASSERT (vkEndCommandBuffer (OUT commandBuffer) == VK_SUCCESS,
147
- " Failed to record command buffer!" );
125
+ commandBuffers.SetActiveBufferIndex (currentFrameIndex);
148
126
149
- auto result = swapchain.SubmitCommandBuffers (&commandBuffer, & currentImageIndex);
127
+ auto result = swapchain.SubmitCommandBuffers (commandBuffers, currentImageIndex);
150
128
151
129
if (result == Vulkan::Utils::ERROR_RESIZED || window.WasResized ())
152
130
{
@@ -161,17 +139,15 @@ void Renderer::EndFrame()
161
139
Renderer2D::Flush ();
162
140
}
163
141
164
- void Renderer::BeginSwapChainRenderPass (VkCommandBuffer commandBuffer )
142
+ void Renderer::BeginSwapChainRenderPass ()
165
143
{
166
144
auto & swapchain = context.GetSwapchain ();
167
145
168
- CC_ASSERT (isFrameStarted, " Can't start render pass while the frame hasn't started!" );
169
- CC_ASSERT (commandBuffer == GetCurrentCommandBuffer (),
170
- " Can't begin a render pass on a command buffer from another frame!" );
146
+ CC_ASSERT (isFrameStarted, " Can't start render pass while the frame hasn't started!" )
171
147
172
148
auto swapExtent = swapchain.GetExtent ();
173
149
174
- swapchain.BeginRenderPass (OUT commandBuffer , currentImageIndex, {{clearValue}, {{{1 .f , 0 .f }}}});
150
+ swapchain.BeginRenderPass (commandBuffers , currentImageIndex, {{clearValue}, {{{1 .f , 0 .f }}}});
175
151
176
152
VkViewport viewport {};
177
153
viewport.x = 0 .0f ;
@@ -182,18 +158,16 @@ void Renderer::BeginSwapChainRenderPass(VkCommandBuffer commandBuffer)
182
158
viewport.maxDepth = 1 .0f ;
183
159
VkRect2D scissor {{0 , 0 }, {swapExtent.width , swapExtent.height }};
184
160
185
- vkCmdSetViewport (commandBuffer , 0 , 1 , &viewport);
186
- vkCmdSetScissor (commandBuffer , 0 , 1 , &scissor);
161
+ vkCmdSetViewport (commandBuffers. GetActiveCommandBuffer () , 0 , 1 , &viewport);
162
+ vkCmdSetScissor (commandBuffers. GetActiveCommandBuffer () , 0 , 1 , &scissor);
187
163
}
188
164
189
- void Renderer::EndSwapChainRenderPass (VkCommandBuffer commandBuffer )
165
+ void Renderer::EndSwapChainRenderPass ()
190
166
{
191
167
auto & swapchain = context.GetSwapchain ();
192
168
193
- CC_ASSERT (isFrameStarted, " Can't end render pass while the frame hasn't started!" );
194
- CC_ASSERT (commandBuffer == GetCurrentCommandBuffer (),
195
- " Can't end a render pass on a command buffer from another frame!" );
169
+ CC_ASSERT (isFrameStarted, " Can't end render pass while the frame hasn't started!" )
196
170
197
- swapchain.EndRenderPass (commandBuffer );
171
+ swapchain.EndRenderPass (commandBuffers );
198
172
}
199
173
} // namespace Siege
0 commit comments