From f425dfc20bc3e5af7d7bc83a4a48b80a240dd4e6 Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Fri, 6 Jun 2025 17:08:24 -0400 Subject: [PATCH] metal buffer API --- .../metal/src/core/buffer/metal_buffer.h | 7 ++++ .../metal/src/core/buffer/metal_buffer.m | 41 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 rendering_api/metal/src/core/buffer/metal_buffer.h create mode 100644 rendering_api/metal/src/core/buffer/metal_buffer.m diff --git a/rendering_api/metal/src/core/buffer/metal_buffer.h b/rendering_api/metal/src/core/buffer/metal_buffer.h new file mode 100644 index 0000000..a90953b --- /dev/null +++ b/rendering_api/metal/src/core/buffer/metal_buffer.h @@ -0,0 +1,7 @@ +#pragma once +#import + +struct gnPlatformBuffer_t { + id buffer, stagingBuffer; + bool useStagingBuffer; +}; diff --git a/rendering_api/metal/src/core/buffer/metal_buffer.m b/rendering_api/metal/src/core/buffer/metal_buffer.m new file mode 100644 index 0000000..5feae57 --- /dev/null +++ b/rendering_api/metal/src/core/buffer/metal_buffer.m @@ -0,0 +1,41 @@ +#include "metal_buffer.h" +#include "core/buffers/gryphn_buffer.h" +#include "core/output_device/gryphn_output_device.h" +#include "core/devices/metal_output_devices.h" + +gnReturnCode gnCreateBufferFn(gnBufferHandle buffer, gnOutputDeviceHandle device, gnBufferInfo info) { + buffer->buffer = malloc(sizeof(struct gnPlatformBuffer_t)); + MTLResourceOptions option; + buffer->buffer->useStagingBuffer = (info.usage == GN_DYNAMIC_DRAW) ? NO : YES; + if (info.usage == GN_DYNAMIC_DRAW) + option = MTLResourceStorageModeShared; + else { + option = MTLResourceStorageModePrivate; + buffer->buffer->stagingBuffer = [device->outputDevice->device newBufferWithLength:info.size options:MTLResourceStorageModeShared]; + } + buffer->buffer->buffer = [device->outputDevice->device newBufferWithLength:info.size options:option]; + return GN_SUCCESS; +} +void gnBufferDataFn(gnBufferHandle buffer, size_t dataSize, void* data) { + void* bufferData; + if (buffer->buffer->useStagingBuffer) { + memcpy(buffer->buffer->stagingBuffer.contents, data, dataSize); + id commandBuffer = [buffer->device->outputDevice->transferQueue commandBuffer]; + id encoder = [commandBuffer blitCommandEncoder]; + [encoder copyFromBuffer:buffer->buffer->stagingBuffer sourceOffset:0 toBuffer:buffer->buffer->buffer destinationOffset:0 size:dataSize]; + [encoder endEncoding]; + [commandBuffer commit]; + [commandBuffer waitUntilCompleted]; + } else + memcpy(buffer->buffer->buffer.contents, data, dataSize); +} +void gnDestroyBufferFn(gnBufferHandle buffer) { + // if (buffer->buffer->useStagingBuffer == gnTrue) { + // vkDestroyBuffer(buffer->device->outputDevice->device, buffer->buffer->stagingBuffer, NULL); + // vkFreeMemory(buffer->device->outputDevice->device, buffer->buffer->stagingBufferMemory, NULL); + // } + + // vkDestroyBuffer(buffer->device->outputDevice->device, buffer->buffer->buffer, NULL); + // vkFreeMemory(buffer->device->outputDevice->device, buffer->buffer->bufferMemory, NULL); + // free(buffer->buffer); +}