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 | |
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 | |
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 | |
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 | |