Skip to content

Commit 536cf4c

Browse files
committed
working on better command buffers management
1 parent b7424e7 commit 536cf4c

File tree

12 files changed

+769
-33
lines changed

12 files changed

+769
-33
lines changed

src/renderer/buffers/vk_buffer.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2022/10/08 18:55:57 by maldavid #+# #+# */
9-
/* Updated: 2023/12/16 17:10:17 by maldavid ### ########.fr */
9+
/* Updated: 2023/12/17 17:35:03 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -22,6 +22,15 @@ namespace mlx
2222
{
2323
void Buffer::create(Buffer::kind type, VkDeviceSize size, VkBufferUsageFlags usage, const char* name, const void* data)
2424
{
25+
CmdResource::setDestroyer([this]()
26+
{
27+
if(_is_mapped)
28+
unmapMem();
29+
if(_buffer != VK_NULL_HANDLE)
30+
Render_Core::get().getAllocator().destroyBuffer(_allocation, _buffer);
31+
_buffer = VK_NULL_HANDLE;
32+
});
33+
2534
_usage = usage;
2635
if(type == Buffer::kind::constant || type == Buffer::kind::dynamic_device_local)
2736
{
@@ -52,11 +61,7 @@ namespace mlx
5261

5362
void Buffer::destroy() noexcept
5463
{
55-
if(_is_mapped)
56-
unmapMem();
57-
if(_buffer != VK_NULL_HANDLE)
58-
Render_Core::get().getAllocator().destroyBuffer(_allocation, _buffer);
59-
_buffer = VK_NULL_HANDLE;
64+
CmdResource::requireDestroy();
6065
}
6166

6267
void Buffer::createBuffer(VkBufferUsageFlags usage, VmaAllocationCreateInfo info, VkDeviceSize size, [[maybe_unused]] const char* name)

src/renderer/buffers/vk_buffer.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2022/10/06 23:18:52 by maldavid #+# #+# */
9-
/* Updated: 2023/12/12 21:12:44 by kbz_8 ### ########.fr */
9+
/* Updated: 2023/12/17 17:35:35 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -16,10 +16,11 @@
1616
#include <volk.h>
1717
#include <renderer/core/render_core.h>
1818
#include <mlx_profile.h>
19+
#include <renderer/core/cmd_resource.h>
1920

2021
namespace mlx
2122
{
22-
class Buffer
23+
class Buffer : public CmdResource
2324
{
2425
public:
2526
enum class kind { dynamic, dynamic_device_local, uniform, constant };

src/renderer/command/cmd_manager.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2023/04/02 17:50:52 by maldavid #+# #+# */
9-
/* Updated: 2023/04/02 17:51:46 by maldavid ### ########.fr */
9+
/* Updated: 2023/12/17 20:10:45 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -18,7 +18,7 @@ namespace mlx
1818
{
1919
_cmd_pool.init();
2020
for(int i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
21-
_cmd_buffers[i].init(this);
21+
_cmd_buffers[i].init(CmdBuffer::kind::long_time, this);
2222
}
2323

2424
void CmdManager::beginRecord(int active_image_index)

src/renderer/command/single_time_cmd_manager.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2023/12/15 19:57:49 by maldavid #+# #+# */
9-
/* Updated: 2023/12/16 18:46:26 by maldavid ### ########.fr */
9+
/* Updated: 2023/12/17 20:10:25 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

1313
#include <algorithm>
1414
#include <renderer/command/single_time_cmd_manager.h>
15+
#include <renderer/command/vk_cmd_buffer.h>
1516
#include <renderer/core/render_core.h>
1617

1718
namespace mlx
@@ -24,7 +25,7 @@ namespace mlx
2425
for(int i = 0; i < MIN_POOL_SIZE; i++)
2526
{
2627
_buffers.emplace_back();
27-
_buffers.back().init(&_pool);
28+
_buffers.back().init(CmdBuffer::kind::single_time, &_pool);
2829
}
2930
}
3031

@@ -38,7 +39,7 @@ namespace mlx
3839
return buf;
3940
}
4041
}
41-
_buffers.emplace_back().init(&_pool);
42+
_buffers.emplace_back().init(CmdBuffer::kind::single_time, &_pool);
4243
return _buffers.back();
4344
}
4445

src/renderer/command/single_time_cmd_manager.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2023/12/15 18:25:57 by maldavid #+# #+# */
9-
/* Updated: 2023/12/16 18:09:56 by maldavid ### ########.fr */
9+
/* Updated: 2023/12/17 17:36:18 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -16,10 +16,11 @@
1616
#include <vector>
1717

1818
#include <renderer/command/vk_cmd_pool.h>
19-
#include <renderer/command/vk_cmd_buffer.h>
2019

2120
namespace mlx
2221
{
22+
class CmdBuffer;
23+
2324
class SingleTimeCmdManager
2425
{
2526
public:

src/renderer/command/vk_cmd_buffer.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,26 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2022/10/06 18:26:06 by maldavid #+# #+# */
9-
/* Updated: 2023/12/16 18:51:03 by maldavid ### ########.fr */
9+
/* Updated: 2023/12/17 20:01:46 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

1313
#include "vk_cmd_buffer.h"
1414
#include <renderer/core/render_core.h>
1515
#include <renderer/command/cmd_manager.h>
1616
#include <renderer/core/vk_semaphore.h>
17+
#include <renderer/buffers/vk_buffer.h>
1718

1819
namespace mlx
1920
{
20-
void CmdBuffer::init(CmdManager* manager)
21+
void CmdBuffer::init(kind type, CmdManager* manager)
2122
{
22-
init(&manager->getCmdPool());
23+
init(type, &manager->getCmdPool());
2324
}
2425

25-
void CmdBuffer::init(CmdPool* pool)
26+
void CmdBuffer::init(kind type, CmdPool* pool)
2627
{
28+
_type = type;
2729
_pool = pool;
2830

2931
VkCommandBufferAllocateInfo allocInfo{};
@@ -58,6 +60,18 @@ namespace mlx
5860
_state = state::recording;
5961
}
6062

63+
void CmdBuffer::bindVertexBuffer(Buffer& buffer) const noexcept
64+
{
65+
if(!isRecording())
66+
{
67+
core::error::report(e_kind::warning, "Vulkan : trying to bind a vertex buffer to a non recording command buffer");
68+
return;
69+
}
70+
VkDeviceSize offset[] = { buffer.getOffset() };
71+
vkCmdBindVertexBuffers(_cmd_buffer, 0, 1, &buffer.get(), offset);
72+
buffer.recordedInCmdBuffer();
73+
}
74+
6175
void CmdBuffer::endRecord()
6276
{
6377
if(!isInit())

src/renderer/command/vk_cmd_buffer.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2022/10/06 18:25:42 by maldavid #+# #+# */
9-
/* Updated: 2023/12/16 18:44:48 by maldavid ### ########.fr */
9+
/* Updated: 2023/12/17 20:01:55 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -19,6 +19,9 @@
1919

2020
namespace mlx
2121
{
22+
class Buffer;
23+
class Image;
24+
2225
class CmdBuffer
2326
{
2427
public:
@@ -31,9 +34,15 @@ namespace mlx
3134
submitted, // buffer has been submitted
3235
};
3336

37+
enum class kind
38+
{
39+
single_time = 0,
40+
long_time
41+
};
42+
3443
public:
35-
void init(class CmdManager* manager);
36-
void init(class CmdPool* pool);
44+
void init(kind type, class CmdManager* manager);
45+
void init(kind type, class CmdPool* pool);
3746
void destroy() noexcept;
3847

3948
void beginRecord(VkCommandBufferUsageFlags usage = 0);
@@ -43,6 +52,12 @@ namespace mlx
4352
inline void reset() noexcept { vkResetCommandBuffer(_cmd_buffer, 0); }
4453
void endRecord();
4554

55+
void bindVertexBuffer(Buffer& buffer) const noexcept;
56+
void bindIndexBuffer(Buffer& buffer) const noexcept;
57+
void copyBuffer(Buffer& dst, Buffer& src) const noexcept;
58+
void copyBufferToImage(Buffer& buffer, Image& image) const noexcept;
59+
void copyImagetoBuffer(Image& image, Buffer& buffer) const noexcept;
60+
4661
inline bool isInit() const noexcept { return _state != state::uninit; }
4762
inline bool isReadyToBeUsed() const noexcept { return _state == state::ready; }
4863
inline bool isRecording() const noexcept { return _state == state::recording; }
@@ -58,6 +73,7 @@ namespace mlx
5873
VkCommandBuffer _cmd_buffer = VK_NULL_HANDLE;
5974
class CmdPool* _pool = nullptr;
6075
state _state = state::uninit;
76+
kind _type;
6177
};
6278
}
6379

src/renderer/core/cmd_resource.h

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/* ************************************************************************** */
2+
/* */
3+
/* ::: :::::::: */
4+
/* cmd_resource.h :+: :+: :+: */
5+
/* +:+ +:+ +:+ */
6+
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
7+
/* +#+#+#+#+#+ +#+ */
8+
/* Created: 2023/12/16 20:44:29 by maldavid #+# #+# */
9+
/* Updated: 2023/12/17 17:10:03 by maldavid ### ########.fr */
10+
/* */
11+
/* ************************************************************************** */
12+
13+
#ifndef __MLX_COMMAND_RESOURCE__
14+
#define __MLX_COMMAND_RESOURCE__
15+
16+
#include <function.h>
17+
18+
namespace mlx
19+
{
20+
class CmdResource
21+
{
22+
friend class SingleTimeCmdManager;
23+
public:
24+
enum class state
25+
{
26+
in_cmd_buffer = 0,
27+
out_cmd_buffer,
28+
};
29+
30+
public:
31+
CmdResource() = default;
32+
inline void recordedInCmdBuffer() noexcept { _state = state::in_cmd_buffer; }
33+
inline void removedFromCmdBuffer() noexcept
34+
{
35+
_state = state::out_cmd_buffer;
36+
if(_destroy_required && _destroy_required)
37+
{
38+
_destroyer();
39+
_destroy_required = false;
40+
}
41+
}
42+
inline void setDestroyer(func::function<void(void)>&& functor) { _destroyer = functor; }
43+
inline void requireDestroy() noexcept
44+
{
45+
if(_state == state::out_cmd_buffer && _destroyer)
46+
_destroyer();
47+
else
48+
_destroy_required = true;
49+
}
50+
virtual ~CmdResource() = default;
51+
52+
private:
53+
void realDestroy();
54+
55+
private:
56+
state _state = state::out_cmd_buffer;
57+
func::function<void(void)> _destroyer;
58+
bool _destroy_required = false;
59+
};
60+
}
61+
62+
#endif

src/renderer/images/texture.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2023/03/08 02:24:58 by maldavid #+# #+# */
9-
/* Updated: 2023/12/14 14:37:08 by maldavid ### ########.fr */
9+
/* Updated: 2023/12/17 17:23:56 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -38,7 +38,7 @@ namespace mlx
3838
void setPixel(int x, int y, uint32_t color) noexcept;
3939
int getPixel(int x, int y) noexcept;
4040

41-
inline void setDescriptor(DescriptorSet set) noexcept { _set = std::move(set); }
41+
inline void setDescriptor(DescriptorSet&& set) noexcept { _set = set; }
4242
inline VkDescriptorSet getSet() noexcept { return _set.isInit() ? _set.get() : VK_NULL_HANDLE; }
4343
inline void updateSet(int binding) noexcept { _set.writeDescriptor(binding, getImageView(), getSampler()); _has_been_updated = true; }
4444
inline bool hasBeenUpdated() const noexcept { return _has_been_updated; }

src/renderer/images/vk_image.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2023/01/25 11:59:07 by maldavid #+# #+# */
9-
/* Updated: 2023/12/16 17:10:33 by maldavid ### ########.fr */
9+
/* Updated: 2023/12/17 17:16:15 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -138,6 +138,16 @@ namespace mlx
138138

139139
void Image::create(uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, const char* name, bool dedicated_memory)
140140
{
141+
CmdResource::setDestroyer([this]()
142+
{
143+
this->destroySampler();
144+
this->destroyImageView();
145+
146+
if(_image != VK_NULL_HANDLE)
147+
Render_Core::get().getAllocator().destroyImage(_allocation, _image);
148+
_image = VK_NULL_HANDLE;
149+
});
150+
141151
_width = width;
142152
_height = height;
143153
_format = format;
@@ -367,12 +377,7 @@ namespace mlx
367377

368378
void Image::destroy() noexcept
369379
{
370-
destroySampler();
371-
destroyImageView();
372-
373-
if(_image != VK_NULL_HANDLE)
374-
Render_Core::get().getAllocator().destroyImage(_allocation, _image);
375-
_image = VK_NULL_HANDLE;
380+
CmdResource::requireDestroy();
376381
}
377382

378383
uint32_t formatSize(VkFormat format)

src/renderer/images/vk_image.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2023/01/25 11:54:21 by maldavid #+# #+# */
9-
/* Updated: 2023/12/15 21:44:30 by maldavid ### ########.fr */
9+
/* Updated: 2023/12/17 17:13:23 by maldavid ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -17,6 +17,7 @@
1717
#include <cstddef>
1818
#include <vector>
1919
#include <vma.h>
20+
#include <renderer/core/cmd_resource.h>
2021
#include <renderer/command/vk_cmd_buffer.h>
2122
#include <renderer/command/vk_cmd_pool.h>
2223
#include <mlx_profile.h>
@@ -25,7 +26,7 @@ namespace mlx
2526
{
2627
uint32_t formatSize(VkFormat format);
2728

28-
class Image
29+
class Image : public CmdResource
2930
{
3031
friend class SwapChain;
3132

0 commit comments

Comments
 (0)