OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrDrawPathBatch.h" | 8 #include "GrDrawPathBatch.h" |
9 | 9 |
10 static void pre_translate_transform_values(const float* xforms, | 10 static void pre_translate_transform_values(const float* xforms, |
11 GrPathRendering::PathTransformType ty
pe, int count, | 11 GrPathRendering::PathTransformType ty
pe, int count, |
12 SkScalar x, SkScalar y, float* dst); | 12 SkScalar x, SkScalar y, float* dst); |
13 | 13 |
14 SkString GrDrawPathBatch::dumpInfo() const { | 14 SkString GrDrawPathBatch::dumpInfo() const { |
15 SkString string; | 15 SkString string; |
16 string.printf("PATH: 0x%p", fPath.get()); | 16 string.printf("PATH: 0x%p", fPath.get()); |
17 return string; | 17 return string; |
18 } | 18 } |
19 | 19 |
20 void GrDrawPathBatch::onDraw(GrBatchFlushState* state) { | 20 void GrDrawPathBatch::onDraw(GrBatchFlushState* state) { |
21 GrProgramDesc desc; | 21 GrProgramDesc desc; |
22 | 22 |
23 SkAutoTUnref<GrPathProcessor> pathProc(GrPathProcessor::Create(this->color()
, | 23 SkAutoTUnref<GrPathProcessor> pathProc(GrPathProcessor::Create(this->color()
, |
24 this->overrid
es(), | 24 this->overrid
es(), |
25 this->viewMat
rix())); | 25 this->viewMat
rix())); |
26 state->gpu()->buildProgramDesc(&desc, *pathProc, *this->pipeline()); | 26 state->gpu()->pathRendering()->drawPath(*this->pipeline(), *pathProc, this->
stencilSettings(), |
27 GrPathRendering::DrawPathArgs args(pathProc, this->pipeline(), | 27 fPath.get()); |
28 &desc, &this->stencilSettings()); | |
29 state->gpu()->pathRendering()->drawPath(args, fPath.get()); | |
30 } | 28 } |
31 | 29 |
32 SkString GrDrawPathRangeBatch::dumpInfo() const { | 30 SkString GrDrawPathRangeBatch::dumpInfo() const { |
33 SkString string; | 31 SkString string; |
34 string.printf("RANGE: 0x%p COUNTS: [", fPathRange.get()); | 32 string.printf("RANGE: 0x%p COUNTS: [", fPathRange.get()); |
35 for (DrawList::Iter iter(fDraws); iter.get(); iter.next()) { | 33 for (DrawList::Iter iter(fDraws); iter.get(); iter.next()) { |
36 string.appendf("%d, ", iter.get()->fInstanceData->count()); | 34 string.appendf("%d, ", iter.get()->fInstanceData->count()); |
37 } | 35 } |
38 string.remove(string.size() - 2, 2); | 36 string.remove(string.size() - 2, 2); |
39 string.append("]"); | 37 string.append("]"); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 | 114 |
117 SkMatrix localMatrix; | 115 SkMatrix localMatrix; |
118 localMatrix.setScale(fScale, fScale); | 116 localMatrix.setScale(fScale, fScale); |
119 localMatrix.preTranslate(head.fX, head.fY); | 117 localMatrix.preTranslate(head.fX, head.fY); |
120 | 118 |
121 SkAutoTUnref<GrPathProcessor> pathProc(GrPathProcessor::Create(this->color()
, | 119 SkAutoTUnref<GrPathProcessor> pathProc(GrPathProcessor::Create(this->color()
, |
122 this->overrid
es(), | 120 this->overrid
es(), |
123 drawMatrix, | 121 drawMatrix, |
124 localMatrix))
; | 122 localMatrix))
; |
125 | 123 |
126 GrProgramDesc desc; | |
127 state->gpu()->buildProgramDesc(&desc, *pathProc, *this->pipeline()); | |
128 GrPathRendering::DrawPathArgs args(pathProc, this->pipeline(), | |
129 &desc, &this->stencilSettings()); | |
130 | |
131 if (fDraws.count() == 1) { | 124 if (fDraws.count() == 1) { |
132 const InstanceData& instances = *head.fInstanceData; | 125 const InstanceData& instances = *head.fInstanceData; |
133 state->gpu()->pathRendering()->drawPaths(args, fPathRange.get(), instanc
es.indices(), | 126 state->gpu()->pathRendering()->drawPaths(*this->pipeline(), |
| 127 *pathProc, |
| 128 this->stencilSettings(), |
| 129 fPathRange.get(), |
| 130 instances.indices(), |
134 GrPathRange::kU16_PathIndexType
, | 131 GrPathRange::kU16_PathIndexType
, |
135 instances.transformValues(), | 132 instances.transformValues(), |
136 instances.transformType(), | 133 instances.transformType(), |
137 instances.count()); | 134 instances.count()); |
138 } else { | 135 } else { |
139 int floatsPerTransform = GrPathRendering::PathTransformSize(this->transf
ormType()); | 136 int floatsPerTransform = GrPathRendering::PathTransformSize(this->transf
ormType()); |
140 SkAutoSTMalloc<4096, float> transformStorage(floatsPerTransform * fTotal
PathCount); | 137 SkAutoSTMalloc<4096, float> transformStorage(floatsPerTransform * fTotal
PathCount); |
141 SkAutoSTMalloc<2048, uint16_t> indexStorage(fTotalPathCount); | 138 SkAutoSTMalloc<2048, uint16_t> indexStorage(fTotalPathCount); |
142 int idx = 0; | 139 int idx = 0; |
143 for (DrawList::Iter iter(fDraws); iter.get(); iter.next()) { | 140 for (DrawList::Iter iter(fDraws); iter.get(); iter.next()) { |
144 const Draw& draw = *iter.get(); | 141 const Draw& draw = *iter.get(); |
145 const InstanceData& instances = *draw.fInstanceData; | 142 const InstanceData& instances = *draw.fInstanceData; |
146 memcpy(&indexStorage[idx], instances.indices(), instances.count() *
sizeof(uint16_t)); | 143 memcpy(&indexStorage[idx], instances.indices(), instances.count() *
sizeof(uint16_t)); |
147 pre_translate_transform_values(instances.transformValues(), this->tr
ansformType(), | 144 pre_translate_transform_values(instances.transformValues(), this->tr
ansformType(), |
148 instances.count(), | 145 instances.count(), |
149 draw.fX - head.fX, draw.fY - head.fY, | 146 draw.fX - head.fX, draw.fY - head.fY, |
150 &transformStorage[floatsPerTransform
* idx]); | 147 &transformStorage[floatsPerTransform
* idx]); |
151 idx += instances.count(); | 148 idx += instances.count(); |
152 | 149 |
153 // TODO: Support mismatched transform types if we start using more t
ypes other than 2D. | 150 // TODO: Support mismatched transform types if we start using more t
ypes other than 2D. |
154 SkASSERT(instances.transformType() == this->transformType()); | 151 SkASSERT(instances.transformType() == this->transformType()); |
155 } | 152 } |
156 SkASSERT(idx == fTotalPathCount); | 153 SkASSERT(idx == fTotalPathCount); |
157 | 154 |
158 state->gpu()->pathRendering()->drawPaths(args, fPathRange.get(), indexSt
orage, | 155 state->gpu()->pathRendering()->drawPaths(*this->pipeline(), |
159 GrPathRange::kU16_PathIndexType
, transformStorage, | 156 *pathProc, |
160 this->transformType(), fTotalPa
thCount); | 157 this->stencilSettings(), |
| 158 fPathRange.get(), |
| 159 indexStorage, |
| 160 GrPathRange::kU16_PathIndexType
, |
| 161 transformStorage, |
| 162 this->transformType(), |
| 163 fTotalPathCount); |
161 } | 164 } |
162 } | 165 } |
163 | 166 |
164 inline void pre_translate_transform_values(const float* xforms, | 167 inline void pre_translate_transform_values(const float* xforms, |
165 GrPathRendering::PathTransformType ty
pe, int count, | 168 GrPathRendering::PathTransformType ty
pe, int count, |
166 SkScalar x, SkScalar y, float* dst) { | 169 SkScalar x, SkScalar y, float* dst) { |
167 if (0 == x && 0 == y) { | 170 if (0 == x && 0 == y) { |
168 memcpy(dst, xforms, count * GrPathRendering::PathTransformSize(type) * s
izeof(float)); | 171 memcpy(dst, xforms, count * GrPathRendering::PathTransformSize(type) * s
izeof(float)); |
169 return; | 172 return; |
170 } | 173 } |
(...skipping 27 matching lines...) Expand all Loading... |
198 dst[i + 3] = xforms[i + 3]; | 201 dst[i + 3] = xforms[i + 3]; |
199 dst[i + 4] = xforms[i + 4]; | 202 dst[i + 4] = xforms[i + 4]; |
200 dst[i + 5] = xforms[i + 3] * x + xforms[i + 4] * y + xforms[i +
5]; | 203 dst[i + 5] = xforms[i + 3] * x + xforms[i + 4] * y + xforms[i +
5]; |
201 } | 204 } |
202 break; | 205 break; |
203 default: | 206 default: |
204 SkFAIL("Unknown transform type."); | 207 SkFAIL("Unknown transform type."); |
205 break; | 208 break; |
206 } | 209 } |
207 } | 210 } |
OLD | NEW |