Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
GrMeshBuffers.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2023 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
9
10#include "include/core/SkData.h"
11#include "include/core/SkMesh.h"
16#include "src/core/SkMeshPriv.h"
25
26#include <cstring>
27#include <utility>
28
29template <typename Base, GrGpuBufferType Type> GrMeshBuffer<Base, Type>::~GrMeshBuffer() {
30 GrResourceCache::ReturnResourceFromThread(std::move(fBuffer), fContextID);
31}
32
33template <typename Base, GrGpuBufferType Type>
34sk_sp<Base> GrMeshBuffer<Base, Type>::Make(GrDirectContext* dc, const void* data, size_t size) {
35 SkASSERT(dc);
36
38 size,
39 Type,
42 if (!buffer) {
43 return nullptr;
44 }
45
46 if (data && !buffer->updateData(data, 0, size, /*preserve=*/false)) {
47 return nullptr;
48 }
49
50 auto result = new GrMeshBuffer;
51 result->fBuffer = std::move(buffer);
52 result->fContextID = dc->directContextID();
53 return sk_sp<Base>(result);
54}
55
56template <typename Base, GrGpuBufferType Type>
58 const void* data,
59 size_t offset,
60 size_t size) {
61 if (!dc || dc != fBuffer->getContext()) {
62 return false;
63 }
64 SkASSERT(!dc->abandoned()); // If dc is abandoned then fBuffer->getContext() should be null.
65
67 auto ownedData = SkData::MakeWithCopy(data, size);
69 std::move(ownedData), fBuffer, offset);
70 return true;
71 }
72
73 sk_sp<GrGpuBuffer> tempBuffer;
74 size_t tempOffset = 0;
75 if (auto* sbm = dc->priv().getGpu()->stagingBufferManager()) {
76 auto alignment = dc->priv().caps()->transferFromBufferToBufferAlignment();
77 auto [sliceBuffer, sliceOffset, ptr] = sbm->allocateStagingBufferSlice(size, alignment);
78 if (sliceBuffer) {
79 std::memcpy(ptr, data, size);
80 tempBuffer.reset(SkRef(sliceBuffer));
81 tempOffset = sliceOffset;
82 }
83 }
84
85 if (!tempBuffer) {
86 tempBuffer = dc->priv().resourceProvider()->createBuffer(size,
90 if (!tempBuffer) {
91 return false;
92 }
93 if (!tempBuffer->updateData(data, 0, size, /*preserve=*/false)) {
94 return false;
95 }
96 }
97
99 std::move(tempBuffer), tempOffset, fBuffer, offset, size);
100
101 return true;
102}
103
104namespace SkMeshes {
105sk_sp<SkMesh::IndexBuffer> MakeIndexBuffer(GrDirectContext* dc, const void* data, size_t size) {
106 if (!dc) {
107 // Fallback to a CPU buffer.
108 return MakeIndexBuffer(data, size);
109 }
110 return SkMeshPriv::GaneshIndexBuffer::Make(dc, data, size);
111}
112
114 if (!src) {
115 return nullptr;
116 }
117 auto* ib = static_cast<SkMeshPriv::IB*>(src.get());
118 const void* data = ib->peek();
119 if (!data) {
120 return nullptr;
121 }
122 if (!dc) {
123 return MakeIndexBuffer(data, ib->size());
124 }
125 return MakeIndexBuffer(dc, data, ib->size());
126}
127
129 if (!dc) {
130 return MakeVertexBuffer(data, size);
131 }
132 return SkMeshPriv::GaneshVertexBuffer::Make(dc, data, size);
133}
134
136 if (!src) {
137 return nullptr;
138 }
139 auto* vb = static_cast<SkMeshPriv::VB*>(src.get());
140 const void* data = vb->peek();
141 if (!data) {
142 return nullptr;
143 }
144 if (!dc) {
145 return MakeVertexBuffer(data, vb->size());
146 }
147 return MakeVertexBuffer(dc, data, vb->size());
148}
149} // namespace SkMeshes
@ kDynamic_GrAccessPattern
@ kStatic_GrAccessPattern
#define SkASSERT(cond)
Definition SkAssert.h:116
static T * SkRef(T *obj)
Definition SkRefCnt.h:132
const GrCaps * caps() const
bool transferFromBufferToBufferSupport() const
Definition GrCaps.h:369
size_t transferFromBufferToBufferAlignment() const
Definition GrCaps.h:244
GrResourceProvider * resourceProvider()
bool abandoned() override
DirectContextID directContextID() const
GrDirectContextPriv priv()
void newBufferUpdateTask(sk_sp< SkData > src, sk_sp< GrGpuBuffer > dst, size_t dstOffset)
void newBufferTransferTask(sk_sp< GrGpuBuffer > src, size_t srcOffset, sk_sp< GrGpuBuffer > dst, size_t dstOffset, size_t size)
virtual GrStagingBufferManager * stagingBufferManager()
Definition GrGpu.h:76
~GrMeshBuffer() override
static sk_sp< Base > Make(GrDirectContext *, const void *data, size_t size)
bool onUpdate(GrDirectContext *, const void *data, size_t offset, size_t size) override
GrDrawingManager * drawingManager()
static std::enable_if_t< std::is_base_of_v< GrGpuResource, T >, void > ReturnResourceFromThread(sk_sp< T > &&resource, GrDirectContext::DirectContextID id)
sk_sp< GrGpuBuffer > createBuffer(size_t size, GrGpuBufferType, GrAccessPattern, ZeroInit)
static sk_sp< SkData > MakeWithCopy(const void *data, size_t length)
Definition SkData.cpp:111
void reset(T *ptr=nullptr)
Definition SkRefCnt.h:310
static const uint8_t buffer[]
GAsyncResult * result
SK_API sk_sp< SkMesh::IndexBuffer > CopyIndexBuffer(const sk_sp< SkMesh::IndexBuffer > &)
Definition SkMesh.cpp:893
SK_API sk_sp< SkMesh::IndexBuffer > MakeIndexBuffer(const void *data, size_t size)
Definition SkMesh.cpp:889
SK_API sk_sp< SkMesh::VertexBuffer > MakeVertexBuffer(const void *, size_t size)
Definition SkMesh.cpp:905
SK_API sk_sp< SkMesh::VertexBuffer > CopyVertexBuffer(const sk_sp< SkMesh::VertexBuffer > &)
Definition SkMesh.cpp:909
Point offset