77
88namespace quark ::vk {
99
10+ void Buffer::StateDeleter::operator ()(State *state) const noexcept {
11+ if (state == nullptr ) {
12+ return ;
13+ }
14+
15+ if (state->allocator != nullptr && state->buffer != VK_NULL_HANDLE &&
16+ state->allocation != nullptr ) {
17+ vmaDestroyBuffer (state->allocator , state->buffer , state->allocation );
18+ }
19+
20+ delete state;
21+ }
22+
1023util::Status Buffer::create (const Buffer::CreateInfo &ci) {
1124 destroy ();
1225
1326 QUARK_ENSURE (ci.allocator != nullptr ,
1427 QUARK_ERR (util::Errc::InvalidArg, " Buffer allocator is null" ));
28+ QUARK_ENSURE (
29+ ci.allocator ->valid (),
30+ QUARK_ERR (util::Errc::InvalidArg, " Buffer allocator is not created" ));
1531 QUARK_ENSURE (ci.size > 0 ,
1632 QUARK_ERR (util::Errc::InvalidArg, " Buffer size must be > 0" ));
1733 QUARK_ENSURE (ci.usage != 0 ,
1834 QUARK_ERR (util::Errc::InvalidArg, " Buffer usage must be set" ));
1935
36+ VmaAllocator allocator = ci.allocator ->handle ();
37+
2038 VkBufferCreateInfo buffer_info{};
2139 buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO ;
2240 buffer_info.size = ci.size ;
@@ -27,45 +45,40 @@ util::Status Buffer::create(const Buffer::CreateInfo &ci) {
2745 alloc_info.usage = ci.memory_usage ;
2846 alloc_info.flags = ci.allocation_flags ;
2947
30- QUARK_VK_TRY ( vmaCreateBuffer (ci. allocator , &buffer_info, &alloc_info,
31- &buffer_, &allocation_, nullptr )) ;
48+ auto state = std::unique_ptr<State, StateDeleter>( new State{});
49+ state-> allocator = allocator ;
3250
33- allocator_ = ci.allocator ;
34- size_ = ci.size ;
35- QUARK_OK ();
36- }
51+ QUARK_VK_TRY (vmaCreateBuffer (allocator, &buffer_info, &alloc_info,
52+ &state->buffer , &state->allocation , nullptr ));
3753
38- void Buffer::destroy () noexcept {
39- if (allocator_ != nullptr && buffer_ != VK_NULL_HANDLE &&
40- allocation_ != nullptr ) {
41- vmaDestroyBuffer (allocator_, buffer_, allocation_);
42- }
54+ state->size = ci.size ;
55+ state_ = std::move (state);
4356
44- allocator_ = nullptr ;
45- buffer_ = VK_NULL_HANDLE ;
46- allocation_ = nullptr ;
47- size_ = 0 ;
57+ QUARK_OK ();
4858}
4959
60+ void Buffer::destroy () noexcept { state_.reset (); }
61+
5062util::Status Buffer::upload (const void *src, size_t byte_count,
5163 VkDeviceSize offset) {
5264 QUARK_ENSURE (valid (),
5365 QUARK_ERR (util::Errc::InvalidState, " Buffer is not created" ));
5466 QUARK_ENSURE (src != nullptr ,
5567 QUARK_ERR (util::Errc::InvalidArg, " Upload source is null" ));
56- QUARK_ENSURE (offset <= size_, QUARK_ERR (util::Errc::InvalidArg,
57- " Upload offset exceeds buffer size" ));
68+ QUARK_ENSURE (
69+ offset <= state_->size ,
70+ QUARK_ERR (util::Errc::InvalidArg, " Upload offset exceeds buffer size" ));
5871 QUARK_ENSURE (byte_count <= (std::numeric_limits<VkDeviceSize>::max)(),
5972 QUARK_ERR (util::Errc::InvalidArg,
6073 " Upload byte_count exceeds VkDeviceSize" ));
6174
6275 const VkDeviceSize copy_size = static_cast <VkDeviceSize>(byte_count);
6376 QUARK_ENSURE (
64- copy_size <= (size_ - offset),
77+ copy_size <= (state_-> size - offset),
6578 QUARK_ERR (util::Errc::InvalidArg, " Upload range exceeds buffer size" ));
6679
67- QUARK_VK_TRY (vmaCopyMemoryToAllocation (allocator_, src, allocation_, offset,
68- copy_size));
80+ QUARK_VK_TRY (vmaCopyMemoryToAllocation (
81+ state_-> allocator , src, state_-> allocation , offset, copy_size));
6982 QUARK_OK ();
7083}
7184
0 commit comments