mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 05:33:36 +00:00
wg_engine: added preallocated index buffers for triangle fans
[issues 1479: lottie](#1479)
This commit is contained in:
parent
90ce9d81bc
commit
398d181e3f
2 changed files with 29 additions and 0 deletions
|
@ -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<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)
|
||||
{
|
||||
releaseBuffer(buffer);
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue