From 398d181e3f9acb299b0b0881de9e735e48dc674e Mon Sep 17 00:00:00 2001 From: Sergii Liebodkin Date: Tue, 16 Apr 2024 11:29:11 +0300 Subject: [PATCH] wg_engine: added preallocated index buffers for triangle fans [issues 1479: lottie](#1479) --- src/renderer/wg_engine/tvgWgCommon.cpp | 27 ++++++++++++++++++++++++++ src/renderer/wg_engine/tvgWgCommon.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/src/renderer/wg_engine/tvgWgCommon.cpp b/src/renderer/wg_engine/tvgWgCommon.cpp index 2c7f9953..d26cd0a3 100644 --- a/src/renderer/wg_engine/tvgWgCommon.cpp +++ b/src/renderer/wg_engine/tvgWgCommon.cpp @@ -94,11 +94,14 @@ void WgContext::initialize() assert(samplerNearest); samplerLinear = createSampler(WGPUFilterMode_Linear, WGPUMipmapFilterMode_Linear); assert(samplerLinear); + allocateIndexBufferFan(1024); + assert(indexBufferFan); } void WgContext::release() { + releaseBuffer(indexBufferFan); releaseSampler(samplerNearest); releaseSampler(samplerLinear); if (device) { @@ -281,6 +284,30 @@ void WgContext::allocateIndexBuffer(WGPUBuffer& buffer, const void *data, uint64 } +void WgContext::allocateIndexBufferFan(uint64_t vertsCount) +{ + assert(vertsCount >= 3); + uint64_t indexCount = (vertsCount - 2) * 3; + if ((!indexBufferFan) || (wgpuBufferGetSize(indexBufferFan) < indexCount * sizeof(uint32_t))) { + Array indexes(indexCount); + for (size_t i = 0; i < vertsCount - 2; i++) { + indexes.push(0); + indexes.push(i + 1); + indexes.push(i + 2); + } + releaseBuffer(indexBufferFan); + WGPUBufferDescriptor bufferDesc{}; + bufferDesc.nextInChain = nullptr; + bufferDesc.label = "The index buffer"; + bufferDesc.usage = WGPUBufferUsage_CopyDst | WGPUBufferUsage_Index; + bufferDesc.size = indexCount * sizeof(uint32_t); + bufferDesc.mappedAtCreation = false; + indexBufferFan = wgpuDeviceCreateBuffer(device, &bufferDesc); + wgpuQueueWriteBuffer(queue, indexBufferFan, 0, &indexes[0], indexCount * sizeof(uint32_t)); + } +} + + void WgContext::releaseVertexBuffer(WGPUBuffer& buffer) { releaseBuffer(buffer); diff --git a/src/renderer/wg_engine/tvgWgCommon.h b/src/renderer/wg_engine/tvgWgCommon.h index 2415754a..668552a9 100644 --- a/src/renderer/wg_engine/tvgWgCommon.h +++ b/src/renderer/wg_engine/tvgWgCommon.h @@ -54,6 +54,7 @@ struct WgContext { WGPUSampler samplerNearest{}; WGPUSampler samplerLinear{}; + WGPUBuffer indexBufferFan{}; WgPipelines* pipelines{}; // external handle (do not release) @@ -75,6 +76,7 @@ struct WgContext { void allocateVertexBuffer(WGPUBuffer& buffer, const void *data, uint64_t size); void allocateIndexBuffer(WGPUBuffer& buffer, const void *data, uint64_t size); + void allocateIndexBufferFan(uint64_t size); void releaseVertexBuffer(WGPUBuffer& buffer); void releaseIndexBuffer(WGPUBuffer& buffer); };