metal buffer API
This commit is contained in:
7
rendering_api/metal/src/core/buffer/metal_buffer.h
Normal file
7
rendering_api/metal/src/core/buffer/metal_buffer.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
#import <Metal/Metal.h>
|
||||
|
||||
struct gnPlatformBuffer_t {
|
||||
id<MTLBuffer> buffer, stagingBuffer;
|
||||
bool useStagingBuffer;
|
||||
};
|
41
rendering_api/metal/src/core/buffer/metal_buffer.m
Normal file
41
rendering_api/metal/src/core/buffer/metal_buffer.m
Normal file
@@ -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<MTLCommandBuffer> commandBuffer = [buffer->device->outputDevice->transferQueue commandBuffer];
|
||||
id<MTLBlitCommandEncoder> 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);
|
||||
}
|
Reference in New Issue
Block a user