1 /*
2 * Copyright 2015 Google Inc.
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/GrGpuCommandBuffer.h"
9 #include "src/gpu/GrOpFlushState.h"
10 #include "src/gpu/GrResourceProvider.h"
11 #include "src/gpu/ops/GrMeshDrawOp.h"
12
GrMeshDrawOp(uint32_t classID)13 GrMeshDrawOp::GrMeshDrawOp(uint32_t classID) : INHERITED(classID) {}
14
onPrepare(GrOpFlushState * state)15 void GrMeshDrawOp::onPrepare(GrOpFlushState* state) { this->onPrepareDraws(state); }
16
17 //////////////////////////////////////////////////////////////////////////////
18
PatternHelper(Target * target,GrPrimitiveType primitiveType,size_t vertexStride,sk_sp<const GrBuffer> indexBuffer,int verticesPerRepetition,int indicesPerRepetition,int repeatCount)19 GrMeshDrawOp::PatternHelper::PatternHelper(Target* target, GrPrimitiveType primitiveType,
20 size_t vertexStride, sk_sp<const GrBuffer> indexBuffer,
21 int verticesPerRepetition, int indicesPerRepetition,
22 int repeatCount) {
23 this->init(target, primitiveType, vertexStride, std::move(indexBuffer), verticesPerRepetition,
24 indicesPerRepetition, repeatCount);
25 }
26
init(Target * target,GrPrimitiveType primitiveType,size_t vertexStride,sk_sp<const GrBuffer> indexBuffer,int verticesPerRepetition,int indicesPerRepetition,int repeatCount)27 void GrMeshDrawOp::PatternHelper::init(Target* target, GrPrimitiveType primitiveType,
28 size_t vertexStride, sk_sp<const GrBuffer> indexBuffer,
29 int verticesPerRepetition, int indicesPerRepetition,
30 int repeatCount) {
31 SkASSERT(target);
32 if (!indexBuffer) {
33 return;
34 }
35 sk_sp<const GrBuffer> vertexBuffer;
36 int firstVertex;
37 int vertexCount = verticesPerRepetition * repeatCount;
38 fVertices = target->makeVertexSpace(vertexStride, vertexCount, &vertexBuffer, &firstVertex);
39 if (!fVertices) {
40 SkDebugf("Vertices could not be allocated for patterned rendering.");
41 return;
42 }
43 SkASSERT(vertexBuffer);
44 size_t ibSize = indexBuffer->size();
45 int maxRepetitions = static_cast<int>(ibSize / (sizeof(uint16_t) * indicesPerRepetition));
46 fMesh = target->allocMesh(primitiveType);
47 fMesh->setIndexedPatterned(std::move(indexBuffer), indicesPerRepetition, verticesPerRepetition,
48 repeatCount, maxRepetitions);
49 fMesh->setVertexData(std::move(vertexBuffer), firstVertex);
50 }
51
recordDraw(Target * target,sk_sp<const GrGeometryProcessor> gp) const52 void GrMeshDrawOp::PatternHelper::recordDraw(
53 Target* target, sk_sp<const GrGeometryProcessor> gp) const {
54 target->recordDraw(std::move(gp), fMesh);
55 }
56
recordDraw(Target * target,sk_sp<const GrGeometryProcessor> gp,const GrPipeline::FixedDynamicState * fixedDynamicState) const57 void GrMeshDrawOp::PatternHelper::recordDraw(
58 Target* target, sk_sp<const GrGeometryProcessor> gp,
59 const GrPipeline::FixedDynamicState* fixedDynamicState) const {
60 target->recordDraw(std::move(gp), fMesh, 1, fixedDynamicState, nullptr);
61 }
62
63 //////////////////////////////////////////////////////////////////////////////
64
QuadHelper(Target * target,size_t vertexStride,int quadsToDraw)65 GrMeshDrawOp::QuadHelper::QuadHelper(Target* target, size_t vertexStride, int quadsToDraw) {
66 sk_sp<const GrGpuBuffer> quadIndexBuffer = target->resourceProvider()->refQuadIndexBuffer();
67 if (!quadIndexBuffer) {
68 SkDebugf("Could not get quad index buffer.");
69 return;
70 }
71 this->init(target, GrPrimitiveType::kTriangles, vertexStride, std::move(quadIndexBuffer),
72 kVerticesPerQuad, kIndicesPerQuad, quadsToDraw);
73 }
74
75 //////////////////////////////////////////////////////////////////////////////
76
allocDynamicStateArrays(int numMeshes,int numPrimitiveProcessorTextures,bool allocScissors)77 GrPipeline::DynamicStateArrays* GrMeshDrawOp::Target::allocDynamicStateArrays(
78 int numMeshes, int numPrimitiveProcessorTextures, bool allocScissors) {
79 auto result = this->allocator()->make<GrPipeline::DynamicStateArrays>();
80 if (allocScissors) {
81 result->fScissorRects = this->allocator()->makeArray<SkIRect>(numMeshes);
82 }
83 if (numPrimitiveProcessorTextures) {
84 result->fPrimitiveProcessorTextures =
85 this->allocator()->makeArrayDefault<GrTextureProxy*>(
86 numPrimitiveProcessorTextures * numMeshes);
87 }
88 return result;
89 }
90
makeFixedDynamicState(int numPrimProcTextures)91 GrPipeline::FixedDynamicState* GrMeshDrawOp::Target::makeFixedDynamicState(
92 int numPrimProcTextures) {
93 const GrAppliedClip* clip = this->appliedClip();
94 if ((clip && clip->scissorState().enabled()) || numPrimProcTextures) {
95 const SkIRect& scissor = (clip) ? clip->scissorState().rect() : SkIRect::MakeEmpty();
96 auto fixedDynamicState =
97 this->allocator()->make<GrPipeline::FixedDynamicState>(scissor);
98 if (numPrimProcTextures) {
99 fixedDynamicState->fPrimitiveProcessorTextures =
100 this->allocator()->makeArrayDefault<GrTextureProxy*>(numPrimProcTextures);
101 }
102 return fixedDynamicState;
103 }
104 return nullptr;
105 }
106