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 #ifndef GrSimpleMesh_DEFINED
9 #define GrSimpleMesh_DEFINED
10 
11 #include "src/gpu/GrBuffer.h"
12 #include "src/gpu/GrGpuBuffer.h"
13 #include "src/gpu/GrOpsRenderPass.h"
14 
15 class GrPrimitiveProcessor;
16 
17 /**
18  * Used to communicate simple (non-instanced, direct) draws from GrOp to GrOpsRenderPass.
19  * TODO: Consider migrating every Op to make the appropriate draw directly on GrOpsRenderPass.
20  */
21 struct GrSimpleMesh {
22     void set(sk_sp<const GrBuffer> vertexBuffer, int vertexCount, int baseVertex);
23     void setIndexed(sk_sp<const GrBuffer> indexBuffer, int indexCount, int baseIndex,
24                     uint16_t minIndexValue, uint16_t maxIndexValue, GrPrimitiveRestart,
25                     sk_sp<const GrBuffer> vertexBuffer, int baseVertex);
26     void setIndexedPatterned(sk_sp<const GrBuffer> indexBuffer, int indexCount,
27                              int patternRepeatCount, int maxPatternRepetitionsInIndexBuffer,
28                              sk_sp<const GrBuffer> vertexBuffer, int patternVertexCount,
29                              int baseVertex);
30 
31     sk_sp<const GrBuffer> fIndexBuffer;
32     int fIndexCount;
33     int fPatternRepeatCount;
34     int fMaxPatternRepetitionsInIndexBuffer;
35     int fBaseIndex;
36     uint16_t fMinIndexValue;
37     uint16_t fMaxIndexValue;
38     GrPrimitiveRestart fPrimitiveRestart = GrPrimitiveRestart::kNo;
39 
40     sk_sp<const GrBuffer> fVertexBuffer;
41     int fVertexCount;
42     int fBaseVertex = 0;
43 
44     SkDEBUGCODE(bool fIsInitialized = false;)
45 };
46 
set(sk_sp<const GrBuffer> vertexBuffer,int vertexCount,int baseVertex)47 inline void GrSimpleMesh::set(sk_sp<const GrBuffer> vertexBuffer, int vertexCount, int baseVertex) {
48     SkASSERT(baseVertex >= 0);
49     fIndexBuffer.reset();
50     fVertexBuffer = std::move(vertexBuffer);
51     fVertexCount = vertexCount;
52     fBaseVertex = baseVertex;
53     SkDEBUGCODE(fIsInitialized = true;)
54 }
55 
setIndexed(sk_sp<const GrBuffer> indexBuffer,int indexCount,int baseIndex,uint16_t minIndexValue,uint16_t maxIndexValue,GrPrimitiveRestart primitiveRestart,sk_sp<const GrBuffer> vertexBuffer,int baseVertex)56 inline void GrSimpleMesh::setIndexed(sk_sp<const GrBuffer> indexBuffer, int indexCount,
57                                      int baseIndex, uint16_t minIndexValue, uint16_t maxIndexValue,
58                                      GrPrimitiveRestart primitiveRestart,
59                                      sk_sp<const GrBuffer> vertexBuffer, int baseVertex) {
60     SkASSERT(indexBuffer);
61     SkASSERT(indexCount >= 1);
62     SkASSERT(baseIndex >= 0);
63     SkASSERT(maxIndexValue >= minIndexValue);
64     SkASSERT(baseVertex >= 0);
65     fIndexBuffer = std::move(indexBuffer);
66     fIndexCount = indexCount;
67     fPatternRepeatCount = 0;
68     fBaseIndex = baseIndex;
69     fMinIndexValue = minIndexValue;
70     fMaxIndexValue = maxIndexValue;
71     fPrimitiveRestart = primitiveRestart;
72     fVertexBuffer = std::move(vertexBuffer);
73     fBaseVertex = baseVertex;
74     SkDEBUGCODE(fIsInitialized = true;)
75 }
76 
setIndexedPatterned(sk_sp<const GrBuffer> indexBuffer,int indexCount,int patternRepeatCount,int maxPatternRepetitionsInIndexBuffer,sk_sp<const GrBuffer> vertexBuffer,int patternVertexCount,int baseVertex)77 inline void GrSimpleMesh::setIndexedPatterned(
78         sk_sp<const GrBuffer> indexBuffer, int indexCount, int patternRepeatCount,
79         int maxPatternRepetitionsInIndexBuffer, sk_sp<const GrBuffer> vertexBuffer,
80         int patternVertexCount, int baseVertex) {
81     SkASSERT(indexBuffer);
82     SkASSERT(indexCount >= 1);
83     SkASSERT(patternVertexCount >= 1);
84     SkASSERT(patternRepeatCount >= 1);
85     SkASSERT(maxPatternRepetitionsInIndexBuffer >= 1);
86     SkASSERT(baseVertex >= 0);
87     fIndexBuffer = std::move(indexBuffer);
88     fIndexCount = indexCount;
89     fPatternRepeatCount = patternRepeatCount;
90     fVertexCount = patternVertexCount;
91     fMaxPatternRepetitionsInIndexBuffer = maxPatternRepetitionsInIndexBuffer;
92     fPrimitiveRestart = GrPrimitiveRestart::kNo;
93     fVertexBuffer = std::move(vertexBuffer);
94     fBaseVertex = baseVertex;
95     SkDEBUGCODE(fIsInitialized = true;)
96 }
97 
98 #endif
99