From 561b20699afff0dbdf00ff7e659877faf5c5992b Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 29 Jan 2024 00:32:44 -0800 Subject: [PATCH] Fix error when loading a Model without any vertices; (cherry picked from commit 3712bc3fbaa27e5d49f241dc1c32833a45a05165) --- src/modules/graphics/graphics.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/modules/graphics/graphics.c b/src/modules/graphics/graphics.c index 11831e55..a4cca785 100644 --- a/src/modules/graphics/graphics.c +++ b/src/modules/graphics/graphics.c @@ -4175,7 +4175,9 @@ Model* lovrModelCreate(const ModelInfo* info) { } }; - model->vertexBuffer = lovrBufferCreate(&vertexBufferInfo, (void**) &vertexData); + if (data->vertexCount > 0) { + model->vertexBuffer = lovrBufferCreate(&vertexBufferInfo, (void**) &vertexData); + } if (data->blendShapeVertexCount > 0) { model->blendBuffer = lovrBufferCreate(&(BufferInfo) { @@ -4398,23 +4400,25 @@ Model* lovrModelClone(Model* parent) { model->blendGroupCount = parent->blendGroupCount; model->blendShapesDirty = true; - model->vertexBuffer = lovrBufferCreate(&parent->vertexBuffer->info, NULL); + if (parent->vertexBuffer) { + model->vertexBuffer = lovrBufferCreate(&parent->vertexBuffer->info, NULL); - beginFrame(); + beginFrame(); - gpu_barrier barrier = syncTransfer(&parent->vertexBuffer->sync, GPU_CACHE_TRANSFER_READ); - gpu_sync(state.stream, &barrier, 1); + gpu_barrier barrier = syncTransfer(&parent->vertexBuffer->sync, GPU_CACHE_TRANSFER_READ); + gpu_sync(state.stream, &barrier, 1); - gpu_buffer* src = parent->vertexBuffer->gpu; - gpu_buffer* dst = model->vertexBuffer->gpu; - gpu_copy_buffers(state.stream, src, dst, 0, 0, parent->vertexBuffer->info.size); + gpu_buffer* src = parent->vertexBuffer->gpu; + gpu_buffer* dst = model->vertexBuffer->gpu; + gpu_copy_buffers(state.stream, src, dst, 0, 0, parent->vertexBuffer->info.size); - gpu_sync(state.stream, &(gpu_barrier) { - .prev = GPU_PHASE_TRANSFER, - .next = GPU_PHASE_SHADER_COMPUTE, - .flush = GPU_CACHE_TRANSFER_WRITE, - .clear = GPU_CACHE_STORAGE_READ | GPU_CACHE_STORAGE_WRITE - }, 1); + gpu_sync(state.stream, &(gpu_barrier) { + .prev = GPU_PHASE_TRANSFER, + .next = GPU_PHASE_SHADER_COMPUTE, + .flush = GPU_CACHE_TRANSFER_WRITE, + .clear = GPU_CACHE_STORAGE_READ | GPU_CACHE_STORAGE_WRITE + }, 1); + } model->draws = malloc(data->primitiveCount * sizeof(DrawInfo)); lovrAssert(model->draws, "Out of memory");