1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrVertexChunkArray.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrMeshDrawTarget.h" 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm> 13*c8dee2aaSAndroid Build Coastguard Worker ~GrVertexChunkBuilder()14*c8dee2aaSAndroid Build Coastguard WorkerGrVertexChunkBuilder::~GrVertexChunkBuilder() { 15*c8dee2aaSAndroid Build Coastguard Worker if (!fChunks->empty()) { 16*c8dee2aaSAndroid Build Coastguard Worker fTarget->putBackVertices(fCurrChunkVertexCapacity - fCurrChunkVertexCount, fStride); 17*c8dee2aaSAndroid Build Coastguard Worker fChunks->back().fCount = fCurrChunkVertexCount; 18*c8dee2aaSAndroid Build Coastguard Worker } 19*c8dee2aaSAndroid Build Coastguard Worker } 20*c8dee2aaSAndroid Build Coastguard Worker allocChunk(int minCount)21*c8dee2aaSAndroid Build Coastguard Workerbool GrVertexChunkBuilder::allocChunk(int minCount) { 22*c8dee2aaSAndroid Build Coastguard Worker if (!fChunks->empty()) { 23*c8dee2aaSAndroid Build Coastguard Worker // No need to put back vertices; the buffer is full. 24*c8dee2aaSAndroid Build Coastguard Worker fChunks->back().fCount = fCurrChunkVertexCount; 25*c8dee2aaSAndroid Build Coastguard Worker } 26*c8dee2aaSAndroid Build Coastguard Worker fCurrChunkVertexCount = 0; 27*c8dee2aaSAndroid Build Coastguard Worker GrVertexChunk* chunk = &fChunks->push_back(); 28*c8dee2aaSAndroid Build Coastguard Worker int minAllocCount = std::max(minCount, fMinVerticesPerChunk); 29*c8dee2aaSAndroid Build Coastguard Worker fCurrChunkVertexWriter = fTarget->makeVertexWriterAtLeast(fStride, minAllocCount, 30*c8dee2aaSAndroid Build Coastguard Worker minAllocCount, &chunk->fBuffer, 31*c8dee2aaSAndroid Build Coastguard Worker &chunk->fBase, 32*c8dee2aaSAndroid Build Coastguard Worker &fCurrChunkVertexCapacity); 33*c8dee2aaSAndroid Build Coastguard Worker if (!fCurrChunkVertexWriter || !chunk->fBuffer || fCurrChunkVertexCapacity < minCount) { 34*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("WARNING: Failed to allocate vertex buffer for GrVertexChunk.\n"); 35*c8dee2aaSAndroid Build Coastguard Worker fChunks->pop_back(); 36*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fCurrChunkVertexCount == 0); 37*c8dee2aaSAndroid Build Coastguard Worker fCurrChunkVertexCapacity = 0; 38*c8dee2aaSAndroid Build Coastguard Worker return false; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker fMinVerticesPerChunk *= 2; 41*c8dee2aaSAndroid Build Coastguard Worker return true; 42*c8dee2aaSAndroid Build Coastguard Worker } 43