mirror of
https://github.com/PancakeTAS/lsfg-vk.git
synced 2025-10-30 07:01:10 +00:00
less copies for buffer init
This commit is contained in:
parent
f724229ae4
commit
80f27ad188
3 changed files with 13 additions and 15 deletions
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
#include <vulkan/vulkan_core.h>
|
#include <vulkan/vulkan_core.h>
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace Vulkan::Core {
|
namespace Vulkan::Core {
|
||||||
|
|
@ -21,14 +20,16 @@ namespace Vulkan::Core {
|
||||||
/// Create the buffer.
|
/// Create the buffer.
|
||||||
///
|
///
|
||||||
/// @param device Vulkan device
|
/// @param device Vulkan device
|
||||||
/// @param size Size of the buffer in bytes.
|
/// @param data Initial data for the buffer, also specifies the size of the buffer.
|
||||||
/// @param data Initial data for the buffer.
|
|
||||||
/// @param usage Usage flags for the buffer
|
/// @param usage Usage flags for the buffer
|
||||||
///
|
///
|
||||||
/// @throws ls::vulkan_error if object creation fails.
|
/// @throws ls::vulkan_error if object creation fails.
|
||||||
///
|
///
|
||||||
Buffer(const Device& device, size_t size, std::vector<uint8_t> data,
|
template<typename T>
|
||||||
VkBufferUsageFlags usage);
|
Buffer(const Device& device, const T& data, VkBufferUsageFlags usage)
|
||||||
|
: size(sizeof(T)) {
|
||||||
|
construct(device, reinterpret_cast<const void*>(&data), usage);
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the Vulkan handle.
|
/// Get the Vulkan handle.
|
||||||
[[nodiscard]] auto handle() const { return *this->buffer; }
|
[[nodiscard]] auto handle() const { return *this->buffer; }
|
||||||
|
|
@ -42,6 +43,8 @@ namespace Vulkan::Core {
|
||||||
Buffer& operator=(Buffer&&) noexcept = default;
|
Buffer& operator=(Buffer&&) noexcept = default;
|
||||||
~Buffer() = default;
|
~Buffer() = default;
|
||||||
private:
|
private:
|
||||||
|
void construct(const Device& device, const void* data, VkBufferUsageFlags usage);
|
||||||
|
|
||||||
std::shared_ptr<VkBuffer> buffer;
|
std::shared_ptr<VkBuffer> buffer;
|
||||||
std::shared_ptr<VkDeviceMemory> memory;
|
std::shared_ptr<VkDeviceMemory> memory;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,11 @@
|
||||||
|
|
||||||
using namespace Vulkan::Core;
|
using namespace Vulkan::Core;
|
||||||
|
|
||||||
Buffer::Buffer(const Device& device, size_t size, std::vector<uint8_t> data,
|
void Buffer::construct(const Device& device, const void* data, VkBufferUsageFlags usage) {
|
||||||
VkBufferUsageFlags usage) : size(size) {
|
|
||||||
// create buffer
|
// create buffer
|
||||||
const VkBufferCreateInfo desc{
|
const VkBufferCreateInfo desc{
|
||||||
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
||||||
.size = size,
|
.size = this->size,
|
||||||
.usage = usage,
|
.usage = usage,
|
||||||
.sharingMode = VK_SHARING_MODE_EXCLUSIVE
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE
|
||||||
};
|
};
|
||||||
|
|
@ -59,10 +58,10 @@ Buffer::Buffer(const Device& device, size_t size, std::vector<uint8_t> data,
|
||||||
|
|
||||||
// upload data to buffer
|
// upload data to buffer
|
||||||
uint8_t* buf{};
|
uint8_t* buf{};
|
||||||
res = vkMapMemory(device.handle(), memoryHandle, 0, size, 0, reinterpret_cast<void**>(&buf));
|
res = vkMapMemory(device.handle(), memoryHandle, 0, this->size, 0, reinterpret_cast<void**>(&buf));
|
||||||
if (res != VK_SUCCESS || buf == nullptr)
|
if (res != VK_SUCCESS || buf == nullptr)
|
||||||
throw ls::vulkan_error(res, "Failed to map memory for Vulkan buffer");
|
throw ls::vulkan_error(res, "Failed to map memory for Vulkan buffer");
|
||||||
std::copy_n(data.data(), std::min(size, data.size()), buf);
|
std::copy_n(reinterpret_cast<const uint8_t*>(data), this->size, buf);
|
||||||
vkUnmapMemory(device.handle(), memoryHandle);
|
vkUnmapMemory(device.handle(), memoryHandle);
|
||||||
|
|
||||||
// store buffer and memory in shared ptr
|
// store buffer and memory in shared ptr
|
||||||
|
|
|
||||||
|
|
@ -62,11 +62,7 @@ int main() {
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT
|
VK_IMAGE_ASPECT_COLOR_BIT
|
||||||
));
|
));
|
||||||
|
|
||||||
const auto* dataBuffer = reinterpret_cast<const uint8_t*>(&data);
|
const Core::Buffer buffer(device, data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||||
std::vector<uint8_t> dataVec(sizeof(DataBuffer));
|
|
||||||
std::copy_n(dataBuffer, sizeof(DataBuffer), dataVec.data());
|
|
||||||
const Core::Buffer buffer(device, dataVec.size(), dataVec,
|
|
||||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
|
|
||||||
|
|
||||||
std::vector<Core::Image> outputImages;
|
std::vector<Core::Image> outputImages;
|
||||||
outputImages.reserve(7);
|
outputImages.reserve(7);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue