Cogs.Core
Buffer.cpp
1#include "Buffer.h"
2
3void Cogs::Core::BufferResource::set(size_t offset, size_t size, const uint8_t * data)
4{
5 assert(bytes.size() >= (offset + size) && "Buffer offset + size out of range.");
6
7 std::memcpy((char *)bytes.data() + offset, data, size);
8
9 invalidate(offset, size);
10}
11
12void Cogs::Core::BufferResource::invalidate(size_t /*offset*/, size_t /*size*/)
13{
14 // BufferManager overrides ResourceManagerBase::resourceChanged, which is responsible to put
15 // the resource into the updatedResources queue, and those resources get the changed flag
16 // cleared in activateResources. So for buffers, this flag doesn't get cleared automatically.
17 // We force-clear it here to force a generation change, so change can be detected.
18 unsetFlag(ResourceFlags::Changed);
19 setChanged();
20}
21
23{
24 assert((bufferFlags & BufferFlags::Mapped) == 0 && "Cannot resize mapped buffer.");
25
26 bytes.resize(size);
27
28 invalidate(0, size);
29}
30
32{
33 assert((bufferFlags & BufferFlags::Mapped) == 0 && "Cannot resize mapped buffer.");
34
35 bytes.reset(size, allocator);
36
37 invalidate(0, size);
38}
39
40void * Cogs::Core::BufferResource::map(uint32_t /*flags*/)
41{
42 assert((bufferFlags & BufferFlags::Mapped) == 0 && "Buffer already mapped.");
43
44 bufferFlags |= BufferFlags::Mapped;
45
46 return bytes.data();
47}
48
50{
51 assert((bufferFlags & BufferFlags::Mapped) != 0 && "Buffer not mapped.");
52
53 bufferFlags &= ~BufferFlags::Mapped;
54
55 invalidate(0, size());
56}
Base allocator implementation.
Definition: Allocator.h:30
void setChanged(Cogs::Core::Context *context, Cogs::ComponentModel::Component *component, Reflection::FieldId fieldId)
Must be Called after changing a Component field. Mark field changed. Request engine update.
Definition: FieldSetter.h:25
Buffer state flags.
Definition: Buffer.h:18
@ Mapped
Buffer data is mapped by client code.
Definition: Buffer.h:27
void unmap()
Unmap the buffer, signaling writes to mapped buffer memory are done.
Definition: Buffer.cpp:49
void invalidate(size_t offset, size_t size)
Invalidates buffer contents, signaling data should be updated/transfered to GPU.
Definition: Buffer.cpp:12
void * map(uint32_t flags)
Map the buffer data backing storage, returning a writable pointer.
Definition: Buffer.cpp:40
void resize(size_t size)
Resize the buffer to accomodate the given number of bytes.
Definition: Buffer.cpp:22
size_t size() const
Size of the buffer in bytes.
Definition: Buffer.h:62
void set(size_t offset, size_t size, const uint8_t *data)
Definition: Buffer.cpp:3
void reset(size_t size, Memory::Allocator *allocator)
Reset the buffer, resizing to size bytes using the given allocator.
Definition: Buffer.cpp:31
void * data()
Get a pointer to the buffer data.
Definition: Buffer.h:74