8#include <spdlog/spdlog.h>
22 assert(!_buffer &&
"Buffer already allocated");
24 auto options = MTL::StorageModeShared;
25 _buffer = device->newBuffer(
size, options);
28 if (_usageFlags &
VERTEX) {
29 label =
"VertexBuffer";
30 }
else if (_usageFlags &
INDEX) {
31 label =
"IndexBuffer";
32 }
else if (_usageFlags &
UNIFORM) {
33 label =
"UniformBuffer";
34 }
else if (_usageFlags &
STORAGE) {
35 label =
"StorageBuffer";
37 _buffer->addDebugMarker(NS::String::string(label, NS::UTF8StringEncoding), NS::Range(0,
size - 1));
42 assert(bufferOffset + dataSize <=
size());
44 memcpy(
static_cast<uint8_t*
>(_buffer->contents()) + bufferOffset, data, dataSize);
49 assert(device !=
nullptr &&
"Cannot unlock buffer without valid device");
53 size_t size = (storage.size() + 3) & ~3;
61 if (storage.empty()) {
66 size_t totalSize = _buffer->length();
68 write(0, storage.data(), totalSize);
70 spdlog::debug(
"WriteBuffer: {} (size: {} bytes)", _buffer->label()->utf8String(), totalSize);
75 assert(!_buffer &&
"Buffer already allocated");
78 spdlog::error(
"Cannot allocate buffer without valid device");
82 MTL::ResourceOptions options = MTL::ResourceStorageModeShared;
85 options |= MTL::ResourceCPUCacheModeDefaultCache;
87 options |= MTL::ResourceCPUCacheModeWriteCombined;
90 _buffer = device->
raw()->newBuffer(
size, options);
93 const char* label =
"";
94 if (_usageFlags &
VERTEX) {
95 label =
"VertexBuffer";
96 }
else if (_usageFlags &
INDEX) {
97 label =
"IndexBuffer";
98 }
else if (_usageFlags &
UNIFORM) {
99 label =
"UniformBuffer";
100 }
else if (_usageFlags &
STORAGE) {
101 label =
"StorageBuffer";
103 _buffer->setLabel(NS::String::string(label, NS::UTF8StringEncoding));
105 spdlog::debug(
"Allocated Metal buffer: {} (size: {} bytes)", label,
size);
114 if (data && dataSize > 0) {
115 write(0, data, dataSize);
Abstract GPU interface for resource creation, state management, and draw submission.