Skip to content

KDGpu::Buffer

Module: Public API

Represents a GPU memory buffer for storing vertex, index, uniform data, etc. More...

#include <KDGpu/buffer.h>

Public Functions

Name
~Buffer()
Buffer()
Buffer(Buffer && other)
Buffer & operator=(Buffer && other)
Buffer(const Buffer & ) =delete
Buffer & operator=(const Buffer & ) =delete
const Handle< Buffer_t > & handle() const
bool isValid() const
operator Handle< Buffer_t >() const
void * map()
void unmap()
void invalidate()
void flush()
MemoryHandle externalMemoryHandle() const
BufferDeviceAddress bufferDeviceAddress() const

Friends

Name
class Device
class Queue
KDGPU_EXPORT bool operator==(const Buffer & a, const Buffer & b)

Detailed Description

1
class KDGpu::Buffer;

Represents a GPU memory buffer for storing vertex, index, uniform data, etc.

Vulkan equivalent:VkBuffer

Buffer represents a linear allocation of GPU memory that can store vertices, indices, uniform data, storage buffers, or any other structured data needed by shaders.

Key features:

  • CPU-visible mapping for reading/writing buffer contents
  • Various usage flags (vertex, index, uniform, storage, transfer)
  • Memory placement control (CPU, GPU, or CPU->GPU)
  • Buffer device addresses for bindless rendering

Lifetime: Buffers are created by Device and must remain valid while referenced by GPU commands. They use RAII and clean up automatically when destroyed.

Usage

Creating a vertex buffer:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    struct Vertex {
        float position[3];
        float color[3];
    };

    std::vector<Vertex> vertices = { /* ... */ };

    KDGpu::Buffer vertexBuffer = device.createBuffer(KDGpu::BufferOptions{
                                                             .size = vertices.size() * sizeof(Vertex),
                                                             .usage = KDGpu::BufferUsageFlagBits::VertexBufferBit,
                                                             .memoryUsage = KDGpu::MemoryUsage::CpuToGpu, // CPU-writable, GPU-readable
                                                     },
                                                     vertices.data()); // Optional initial data

Filename: kdgpu_doc_snippets.cpp

Creating an index buffer :

1
2
3
4
5
6
7
8
    std::vector<uint32_t> indices = { 0, 1, 2, 2, 3, 0 };

    KDGpu::Buffer indexBuffer = device.createBuffer(KDGpu::BufferOptions{
                                                            .size = indices.size() * sizeof(uint32_t),
                                                            .usage = KDGpu::BufferUsageFlagBits::IndexBufferBit,
                                                            .memoryUsage = KDGpu::MemoryUsage::CpuToGpu,
                                                    },
                                                    indices.data());

Filename: kdgpu_doc_snippets.cpp

Creating a uniform buffer(updated frequently) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
    struct CameraUniforms {
        glm::mat4 view;
        glm::mat4 projection;
    };

    KDGpu::Buffer uniformBuffer = device.createBuffer(KDGpu::BufferOptions{
            .size = sizeof(CameraUniforms),
            .usage = KDGpu::BufferUsageFlagBits::UniformBufferBit,
            .memoryUsage = KDGpu::MemoryUsage::CpuToGpu, // For frequent updates
    });

    // Update each frame
    Camera camera;
    void *mapped = uniformBuffer.map();
    CameraUniforms *uniforms = static_cast<CameraUniforms *>(mapped);
    uniforms->view = camera.viewMatrix();
    uniforms->projection = camera.projectionMatrix();
    uniformBuffer.flush(); // Ensure GPU sees changes
    uniformBuffer.unmap();

Filename: kdgpu_doc_snippets.cpp

Creating a storage buffer(shader read / write):

1
2
3
4
5
    KDGpu::Buffer storageBuffer = device.createBuffer(KDGpu::BufferOptions{
            .size = 1024 * 1024, // 1 MB
            .usage = KDGpu::BufferUsageFlagBits::StorageBufferBit,
            .memoryUsage = KDGpu::MemoryUsage::GpuOnly, // GPU-only for best performance
    });

Filename: kdgpu_doc_snippets.cpp

Memory usage patterns:

1
2
3
4
5
6
7
8
    // CPU to GPU: Writable from CPU, readable by GPU (staging, dynamic data)
    auto cpuToGpu = KDGpu::MemoryUsage::CpuToGpu;

    // GPU only: Best performance, require staging for uploads
    auto gpuOnly = KDGpu::MemoryUsage::GpuOnly;

    // GPU to CPU: For readback (screenshots, compute results)
    auto gpuToCpu = KDGpu::MemoryUsage::GpuToCpu;

Filename: kdgpu_doc_snippets.cpp

Mapping and unmapping:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    // Map for writing
    void *data = storageBuffer.map();
    memcpy(data, sourceData, dataSize);
    storageBuffer.unmap();

    // For non-coherent memory, flush to make changes visible to GPU
    storageBuffer.flush();

    // For reading GPU results, invalidate before reading
    storageBuffer.invalidate();
    void *results = storageBuffer.map();
    // ... read results ...
    storageBuffer.unmap();

Filename: kdgpu_doc_snippets.cpp

Buffer device addresses (for bindless):

1
2
3
4
5
6
7
8
9
    KDGpu::Buffer buffer2 = device.createBuffer(KDGpu::BufferOptions{
            .size = 1024,
            .usage = KDGpu::BufferUsageFlagBits::StorageBufferBit |
                    KDGpu::BufferUsageFlagBits::ShaderDeviceAddressBit,
            .memoryUsage = KDGpu::MemoryUsage::GpuOnly,
    });

    KDGpu::BufferDeviceAddress deviceAddress = buffer2.bufferDeviceAddress();
    // Pass deviceAddress to shader via push constants or uniforms

Filename: kdgpu_doc_snippets.cpp

Vulkan mapping:

See also:

Device, BufferOptions, Queue, BufferOptions, BindGroup

KDGpu API Overview

KDGpu to Vulkan API Mapping

Public Functions Documentation

function ~Buffer

1
~Buffer()

function Buffer

1
Buffer()

function Buffer

1
2
3
Buffer(
    Buffer && other
)

function operator=

1
2
3
Buffer & operator=(
    Buffer && other
)

function Buffer

1
2
3
Buffer(
    const Buffer & 
) =delete

function operator=

1
2
3
Buffer & operator=(
    const Buffer & 
) =delete

function handle

1
inline const Handle< Buffer_t > & handle() const

function isValid

1
inline bool isValid() const

function operator Handle< Buffer_t >

1
inline operator Handle< Buffer_t >() const

function map

1
void * map()

function unmap

1
void unmap()

function invalidate

1
void invalidate()

function flush

1
void flush()

function externalMemoryHandle

1
MemoryHandle externalMemoryHandle() const

function bufferDeviceAddress

1
BufferDeviceAddress bufferDeviceAddress() const

Friends

friend Device

1
2
3
friend class Device(
    Device 
);

friend Queue

1
2
3
friend class Queue(
    Queue 
);

friend operator==

1
2
3
4
5
friend KDGPU_EXPORT bool operator==(
    const Buffer & a,

    const Buffer & b
);

Updated on 2026-03-31 at 00:02:07 +0000