mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 13:43:43 +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);
|
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);
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue