#include "GPUBuffer.h" #include "GPU.h" GPUBuffer::GPUBuffer(SDL_GPUBufferUsageFlags usage, Uint32 size) { SDL_GPUBufferCreateInfo buf_info = { .usage = usage, .size = size, .props = {} }; this->size = size; buffer = SDL_CreateGPUBuffer(GPU::GetDevice(), &buf_info); } GPUBuffer::GPUBuffer(SDL_GPUBufferCreateInfo* info) { this->size = info->size; buffer = SDL_CreateGPUBuffer(GPU::GetDevice(), info); } GPUBuffer::~GPUBuffer() { SDL_ReleaseGPUBuffer(GPU::GetDevice(), buffer); } void* GPUBuffer::Transfer(void* data) { SDL_GPUTransferBufferCreateInfo transfer_info = { .usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD, .size = size, .props = {} }; SDL_GPUTransferBuffer* transfer = SDL_CreateGPUTransferBuffer(GPU::GetDevice(), &transfer_info); void* mapped = SDL_MapGPUTransferBuffer(GPU::GetDevice(), transfer, false); memcpy(mapped, data, size); SDL_UnmapGPUTransferBuffer(GPU::GetDevice(), transfer); // Copy to GPU buffer SDL_GPUCommandBuffer* cmd = SDL_AcquireGPUCommandBuffer(GPU::GetDevice()); SDL_GPUCopyPass* copy_pass = SDL_BeginGPUCopyPass(cmd); SDL_GPUTransferBufferLocation src = { .transfer_buffer = transfer, .offset = 0 }; SDL_GPUBufferRegion dst = { .buffer = buffer, .offset = 0, .size = size }; SDL_UploadToGPUBuffer(copy_pass, &src, &dst, false); SDL_EndGPUCopyPass(copy_pass); SDL_SubmitGPUCommandBuffer(cmd); SDL_WaitForGPUIdle(GPU::GetDevice()); SDL_ReleaseGPUTransferBuffer(GPU::GetDevice(), transfer); return data; } SDL_GPUBuffer* GPUBuffer::Get() { return buffer; }