2 * Copyright 2021 Google LLC
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #ifndef SkMeshPriv_DEFINED
9 #define SkMeshPriv_DEFINED
11 #include "include/core/SkMesh.h"
14 #include "include/core/SkData.h"
15 #include "include/private/gpu/ganesh/GrTypesPriv.h"
16 #include "src/core/SkSLTypeShared.h"
19 #include "include/gpu/GrDirectContext.h"
20 #include "src/gpu/ganesh/GrDirectContextPriv.h"
21 #include "src/gpu/ganesh/GrGpuBuffer.h"
22 #include "src/gpu/ganesh/GrResourceCache.h"
23 #include "src/gpu/ganesh/GrResourceProvider.h"
26 struct SkMeshSpecificationPriv {
27 using Varying = SkMeshSpecification::Varying;
28 using Attribute = SkMeshSpecification::Attribute;
29 using ColorType = SkMeshSpecification::ColorType;
31 static SkSpan<const Varying> Varyings(const SkMeshSpecification& spec) {
32 return SkMakeSpan(spec.fVaryings);
35 static const SkSL::Program* VS(const SkMeshSpecification& spec) { return spec.fVS.get(); }
36 static const SkSL::Program* FS(const SkMeshSpecification& spec) { return spec.fFS.get(); }
38 static int Hash(const SkMeshSpecification& spec) { return spec.fHash; }
40 static ColorType GetColorType(const SkMeshSpecification& spec) { return spec.fColorType; }
41 static bool HasColors(const SkMeshSpecification& spec) {
42 return GetColorType(spec) != ColorType::kNone;
45 static SkColorSpace* ColorSpace(const SkMeshSpecification& spec) {
46 return spec.fColorSpace.get();
49 static SkAlphaType AlphaType(const SkMeshSpecification& spec) { return spec.fAlphaType; }
51 static bool HasLocalCoords(const SkMeshSpecification& spec) { return spec.fHasLocalCoords; }
53 static SkSLType VaryingTypeAsSLType(Varying::Type type) {
55 case Varying::Type::kFloat: return SkSLType::kFloat;
56 case Varying::Type::kFloat2: return SkSLType::kFloat2;
57 case Varying::Type::kFloat3: return SkSLType::kFloat3;
58 case Varying::Type::kFloat4: return SkSLType::kFloat4;
59 case Varying::Type::kHalf: return SkSLType::kHalf;
60 case Varying::Type::kHalf2: return SkSLType::kHalf2;
61 case Varying::Type::kHalf3: return SkSLType::kHalf3;
62 case Varying::Type::kHalf4: return SkSLType::kHalf4;
67 static GrVertexAttribType AttrTypeAsVertexAttribType(Attribute::Type type) {
69 case Attribute::Type::kFloat: return kFloat_GrVertexAttribType;
70 case Attribute::Type::kFloat2: return kFloat2_GrVertexAttribType;
71 case Attribute::Type::kFloat3: return kFloat3_GrVertexAttribType;
72 case Attribute::Type::kFloat4: return kFloat4_GrVertexAttribType;
73 case Attribute::Type::kUByte4_unorm: return kUByte4_norm_GrVertexAttribType;
78 static SkSLType AttrTypeAsSLType(Attribute::Type type) {
80 case Attribute::Type::kFloat: return SkSLType::kFloat;
81 case Attribute::Type::kFloat2: return SkSLType::kFloat2;
82 case Attribute::Type::kFloat3: return SkSLType::kFloat3;
83 case Attribute::Type::kFloat4: return SkSLType::kFloat4;
84 case Attribute::Type::kUByte4_unorm: return SkSLType::kHalf4;
93 virtual ~Buffer() = 0;
96 Buffer(const Buffer&) = delete;
98 Buffer& operator=(const Buffer&) = delete;
100 virtual sk_sp<const SkData> asData() const { return nullptr; }
103 virtual sk_sp<const GrGpuBuffer> asGpuBuffer() const { return nullptr; }
106 virtual size_t size() const = 0;
109 class IB : public Buffer, public SkMesh::IndexBuffer {};
110 class VB : public Buffer, public SkMesh::VertexBuffer {};
112 template <typename Base> class CpuBuffer final : public Base {
114 CpuBuffer() = default;
115 ~CpuBuffer() override = default;
117 static sk_sp<Base> Make(sk_sp<const SkData> data);
119 sk_sp<const SkData> asData() const override { return fData; }
121 size_t size() const override { return fData->size(); }
124 sk_sp<const SkData> fData;
127 using CpuIndexBuffer = CpuBuffer<IB>;
128 using CpuVertexBuffer = CpuBuffer<VB>;
131 template <typename Base, GrGpuBufferType> class GpuBuffer final : public Base {
133 GpuBuffer() = default;
135 ~GpuBuffer() override;
137 static sk_sp<Base> Make(GrDirectContext*, sk_sp<const SkData>);
139 sk_sp<const GrGpuBuffer> asGpuBuffer() const override { return fBuffer; }
141 size_t size() const override { return fBuffer->size(); }
144 sk_sp<GrGpuBuffer> fBuffer;
145 GrDirectContext::DirectContextID fContextID;
148 using GpuIndexBuffer = GpuBuffer<IB, GrGpuBufferType::kIndex >;
149 using GpuVertexBuffer = GpuBuffer<VB, GrGpuBufferType::kVertex>;
150 #endif // SK_SUPPORT_GPU
153 inline SkMeshPriv::Buffer::~Buffer() = default;
155 template <typename Base> sk_sp<Base> SkMeshPriv::CpuBuffer<Base>::Make(sk_sp<const SkData> data) {
157 auto result = new CpuBuffer<Base>;
158 result->fData = std::move(data);
159 return sk_sp<Base>(result);
163 template <typename Base, GrGpuBufferType Type> SkMeshPriv::GpuBuffer<Base, Type>::~GpuBuffer() {
164 GrResourceCache::ReturnResourceFromThread(std::move(fBuffer), fContextID);
167 template <typename Base, GrGpuBufferType Type>
168 sk_sp<Base> SkMeshPriv::GpuBuffer<Base, Type>::Make(GrDirectContext* dc,sk_sp<const SkData> data) {
172 sk_sp<GrGpuBuffer> buffer = dc->priv().resourceProvider()->createBuffer(
175 kStatic_GrAccessPattern,
181 auto result = new GpuBuffer;
182 result->fBuffer = std::move(buffer);
183 result->fContextID = dc->directContextID();
184 return sk_sp<Base>(result);
187 #endif // SK_SUPPORT_GPU
189 #endif // SK_ENABLE_SKSL