wg_engine: added preallocated index buffers for triangle fans

[issues 1479: lottie](#1479)
This commit is contained in:
Sergii Liebodkin 2024-04-16 11:29:11 +03:00 committed by Hermet Park
parent 90ce9d81bc
commit 398d181e3f
2 changed files with 29 additions and 0 deletions

View file

@ -94,11 +94,14 @@ void WgContext::initialize()
assert(samplerNearest); assert(samplerNearest);
samplerLinear = createSampler(WGPUFilterMode_Linear, WGPUMipmapFilterMode_Linear); samplerLinear = createSampler(WGPUFilterMode_Linear, WGPUMipmapFilterMode_Linear);
assert(samplerLinear); assert(samplerLinear);
allocateIndexBufferFan(1024);
assert(indexBufferFan);
} }
void WgContext::release() void WgContext::release()
{ {
releaseBuffer(indexBufferFan);
releaseSampler(samplerNearest); releaseSampler(samplerNearest);
releaseSampler(samplerLinear); releaseSampler(samplerLinear);
if (device) { 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<uint32_t> 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) void WgContext::releaseVertexBuffer(WGPUBuffer& buffer)
{ {
releaseBuffer(buffer); releaseBuffer(buffer);

View file

@ -54,6 +54,7 @@ struct WgContext {
WGPUSampler samplerNearest{}; WGPUSampler samplerNearest{};
WGPUSampler samplerLinear{}; WGPUSampler samplerLinear{};
WGPUBuffer indexBufferFan{};
WgPipelines* pipelines{}; // external handle (do not release) WgPipelines* pipelines{}; // external handle (do not release)
@ -75,6 +76,7 @@ struct WgContext {
void allocateVertexBuffer(WGPUBuffer& buffer, const void *data, uint64_t size); void allocateVertexBuffer(WGPUBuffer& buffer, const void *data, uint64_t size);
void allocateIndexBuffer(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 releaseVertexBuffer(WGPUBuffer& buffer);
void releaseIndexBuffer(WGPUBuffer& buffer); void releaseIndexBuffer(WGPUBuffer& buffer);
}; };