1/*
2 * Copyright 2021 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "src/gpu/GrEagerVertexAllocator.h"
9
10#include "src/gpu/GrMeshDrawTarget.h"
11
12//-------------------------------------------------------------------------------------------------
13void* GrEagerDynamicVertexAllocator::lock(size_t stride, int eagerCount) {
14    SkASSERT(!fLockCount);
15    SkASSERT(eagerCount);
16    if (void* data = fTarget->makeVertexSpace(stride, eagerCount, fVertexBuffer, fBaseVertex)) {
17        fLockStride = stride;
18        fLockCount = eagerCount;
19        return data;
20    }
21    fVertexBuffer->reset();
22    *fBaseVertex = 0;
23    return nullptr;
24}
25
26void GrEagerDynamicVertexAllocator::unlock(int actualCount) {
27    SkASSERT(fLockCount);
28    SkASSERT(actualCount <= fLockCount);
29    fTarget->putBackVertices(fLockCount - actualCount, fLockStride);
30    if (!actualCount) {
31        fVertexBuffer->reset();
32        *fBaseVertex = 0;
33    }
34    fLockCount = 0;
35}
36
37//-------------------------------------------------------------------------------------------------
38void* GrCpuVertexAllocator::lock(size_t stride, int eagerCount) {
39    SkASSERT(!fLockStride && !fVertices && !fVertexData);
40    SkASSERT(stride && eagerCount);
41
42    fVertices = sk_malloc_throw(eagerCount * stride);
43    fLockStride = stride;
44
45    return fVertices;
46}
47
48void GrCpuVertexAllocator::unlock(int actualCount) {
49    SkASSERT(fLockStride && fVertices && !fVertexData);
50
51    fVertices = sk_realloc_throw(fVertices, actualCount * fLockStride);
52
53    fVertexData = GrThreadSafeCache::MakeVertexData(fVertices, actualCount, fLockStride);
54
55    fVertices = nullptr;
56    fLockStride = 0;
57}
58
59sk_sp<GrThreadSafeCache::VertexData> GrCpuVertexAllocator::detachVertexData() {
60    SkASSERT(!fLockStride && !fVertices && fVertexData);
61
62    return std::move(fVertexData);
63}
64