| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrAALinearizingConvexPathRenderer.h" | 9 #include "GrAALinearizingConvexPathRenderer.h" |
| 10 | 10 |
| 11 #include "GrAAConvexTessellator.h" | 11 #include "GrAAConvexTessellator.h" |
| 12 #include "GrBatchTarget.h" | 12 #include "GrBatchFlushState.h" |
| 13 #include "GrBatchTest.h" | 13 #include "GrBatchTest.h" |
| 14 #include "GrContext.h" | 14 #include "GrContext.h" |
| 15 #include "GrDefaultGeoProcFactory.h" | 15 #include "GrDefaultGeoProcFactory.h" |
| 16 #include "GrGeometryProcessor.h" | 16 #include "GrGeometryProcessor.h" |
| 17 #include "GrInvariantOutput.h" | 17 #include "GrInvariantOutput.h" |
| 18 #include "GrPathUtils.h" | 18 #include "GrPathUtils.h" |
| 19 #include "GrProcessor.h" | 19 #include "GrProcessor.h" |
| 20 #include "GrPipelineBuilder.h" | 20 #include "GrPipelineBuilder.h" |
| 21 #include "GrStrokeInfo.h" | 21 #include "GrStrokeInfo.h" |
| 22 #include "SkGeometry.h" | 22 #include "SkGeometry.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 | 148 |
| 149 // setup batch properties | 149 // setup batch properties |
| 150 fBatch.fColorIgnored = !opt.readsColor(); | 150 fBatch.fColorIgnored = !opt.readsColor(); |
| 151 fBatch.fColor = fGeoData[0].fColor; | 151 fBatch.fColor = fGeoData[0].fColor; |
| 152 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); | 152 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); |
| 153 fBatch.fCoverageIgnored = !opt.readsCoverage(); | 153 fBatch.fCoverageIgnored = !opt.readsCoverage(); |
| 154 fBatch.fLinesOnly = SkPath::kLine_SegmentMask == fGeoData[0].fPath.getSe
gmentMasks(); | 154 fBatch.fLinesOnly = SkPath::kLine_SegmentMask == fGeoData[0].fPath.getSe
gmentMasks(); |
| 155 fBatch.fCanTweakAlphaForCoverage = opt.canTweakAlphaForCoverage(); | 155 fBatch.fCanTweakAlphaForCoverage = opt.canTweakAlphaForCoverage(); |
| 156 } | 156 } |
| 157 | 157 |
| 158 void draw(GrBatchTarget* batchTarget, const GrPipeline* pipeline, int vertex
Count, | 158 void draw(GrVertexBatch::Target* target, const GrPipeline* pipeline, int ver
texCount, |
| 159 size_t vertexStride, void* vertices, int indexCount, uint16_t* indic
es) { | 159 size_t vertexStride, void* vertices, int indexCount, uint16_t* indic
es) { |
| 160 if (vertexCount == 0 || indexCount == 0) { | 160 if (vertexCount == 0 || indexCount == 0) { |
| 161 return; | 161 return; |
| 162 } | 162 } |
| 163 const GrVertexBuffer* vertexBuffer; | 163 const GrVertexBuffer* vertexBuffer; |
| 164 GrVertices info; | 164 GrVertices info; |
| 165 int firstVertex; | 165 int firstVertex; |
| 166 void* verts = batchTarget->makeVertSpace(vertexStride, vertexCount, &ver
texBuffer, | 166 void* verts = target->makeVertexSpace(vertexStride, vertexCount, &vertex
Buffer, |
| 167 &firstVertex); | 167 &firstVertex); |
| 168 if (!verts) { | 168 if (!verts) { |
| 169 SkDebugf("Could not allocate vertices\n"); | 169 SkDebugf("Could not allocate vertices\n"); |
| 170 return; | 170 return; |
| 171 } | 171 } |
| 172 memcpy(verts, vertices, vertexCount * vertexStride); | 172 memcpy(verts, vertices, vertexCount * vertexStride); |
| 173 | 173 |
| 174 const GrIndexBuffer* indexBuffer; | 174 const GrIndexBuffer* indexBuffer; |
| 175 int firstIndex; | 175 int firstIndex; |
| 176 uint16_t* idxs = batchTarget->makeIndexSpace(indexCount, &indexBuffer, &
firstIndex); | 176 uint16_t* idxs = target->makeIndexSpace(indexCount, &indexBuffer, &first
Index); |
| 177 if (!idxs) { | 177 if (!idxs) { |
| 178 SkDebugf("Could not allocate indices\n"); | 178 SkDebugf("Could not allocate indices\n"); |
| 179 return; | 179 return; |
| 180 } | 180 } |
| 181 memcpy(idxs, indices, indexCount * sizeof(uint16_t)); | 181 memcpy(idxs, indices, indexCount * sizeof(uint16_t)); |
| 182 info.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, indexBuffer,
firstVertex, | 182 info.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, indexBuffer,
firstVertex, |
| 183 firstIndex, vertexCount, indexCount); | 183 firstIndex, vertexCount, indexCount); |
| 184 batchTarget->draw(info); | 184 target->draw(info); |
| 185 } | 185 } |
| 186 | 186 |
| 187 void generateGeometry(GrBatchTarget* batchTarget) override { | 187 void onPrepareDraws(Target* target) override { |
| 188 bool canTweakAlphaForCoverage = this->canTweakAlphaForCoverage(); | 188 bool canTweakAlphaForCoverage = this->canTweakAlphaForCoverage(); |
| 189 | 189 |
| 190 // Setup GrGeometryProcessor | 190 // Setup GrGeometryProcessor |
| 191 SkAutoTUnref<const GrGeometryProcessor> gp(create_fill_gp(canTweakAlphaF
orCoverage, | 191 SkAutoTUnref<const GrGeometryProcessor> gp(create_fill_gp(canTweakAlphaF
orCoverage, |
| 192 this->viewMatr
ix(), | 192 this->viewMatr
ix(), |
| 193 this->usesLoca
lCoords(), | 193 this->usesLoca
lCoords(), |
| 194 this->coverage
Ignored())); | 194 this->coverage
Ignored())); |
| 195 if (!gp) { | 195 if (!gp) { |
| 196 SkDebugf("Couldn't create a GrGeometryProcessor\n"); | 196 SkDebugf("Couldn't create a GrGeometryProcessor\n"); |
| 197 return; | 197 return; |
| 198 } | 198 } |
| 199 | 199 |
| 200 batchTarget->initDraw(gp, this->pipeline()); | 200 target->initDraw(gp, this->pipeline()); |
| 201 | 201 |
| 202 size_t vertexStride = gp->getVertexStride(); | 202 size_t vertexStride = gp->getVertexStride(); |
| 203 | 203 |
| 204 SkASSERT(canTweakAlphaForCoverage ? | 204 SkASSERT(canTweakAlphaForCoverage ? |
| 205 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAt
tr) : | 205 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAt
tr) : |
| 206 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCo
verageAttr)); | 206 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCo
verageAttr)); |
| 207 | 207 |
| 208 int instanceCount = fGeoData.count(); | 208 int instanceCount = fGeoData.count(); |
| 209 | 209 |
| 210 int vertexCount = 0; | 210 int vertexCount = 0; |
| 211 int indexCount = 0; | 211 int indexCount = 0; |
| 212 int maxVertices = DEFAULT_BUFFER_SIZE; | 212 int maxVertices = DEFAULT_BUFFER_SIZE; |
| 213 int maxIndices = DEFAULT_BUFFER_SIZE; | 213 int maxIndices = DEFAULT_BUFFER_SIZE; |
| 214 uint8_t* vertices = (uint8_t*) malloc(maxVertices * vertexStride); | 214 uint8_t* vertices = (uint8_t*) malloc(maxVertices * vertexStride); |
| 215 uint16_t* indices = (uint16_t*) malloc(maxIndices * sizeof(uint16_t)); | 215 uint16_t* indices = (uint16_t*) malloc(maxIndices * sizeof(uint16_t)); |
| 216 for (int i = 0; i < instanceCount; i++) { | 216 for (int i = 0; i < instanceCount; i++) { |
| 217 Geometry& args = fGeoData[i]; | 217 Geometry& args = fGeoData[i]; |
| 218 GrAAConvexTessellator tess(args.fStrokeWidth, args.fJoin, args.fMite
rLimit); | 218 GrAAConvexTessellator tess(args.fStrokeWidth, args.fJoin, args.fMite
rLimit); |
| 219 | 219 |
| 220 if (!tess.tessellate(args.fViewMatrix, args.fPath)) { | 220 if (!tess.tessellate(args.fViewMatrix, args.fPath)) { |
| 221 continue; | 221 continue; |
| 222 } | 222 } |
| 223 | 223 |
| 224 int currentIndices = tess.numIndices(); | 224 int currentIndices = tess.numIndices(); |
| 225 SkASSERT(currentIndices <= UINT16_MAX); | 225 SkASSERT(currentIndices <= UINT16_MAX); |
| 226 if (indexCount + currentIndices > UINT16_MAX) { | 226 if (indexCount + currentIndices > UINT16_MAX) { |
| 227 // if we added the current instance, we would overflow the indic
es we can store in a | 227 // if we added the current instance, we would overflow the indic
es we can store in a |
| 228 // uint16_t. Draw what we've got so far and reset. | 228 // uint16_t. Draw what we've got so far and reset. |
| 229 draw(batchTarget, this->pipeline(), vertexCount, vertexStride, v
ertices, indexCount, | 229 draw(target, this->pipeline(), vertexCount, vertexStride, vertic
es, indexCount, |
| 230 indices); | 230 indices); |
| 231 vertexCount = 0; | 231 vertexCount = 0; |
| 232 indexCount = 0; | 232 indexCount = 0; |
| 233 } | 233 } |
| 234 int currentVertices = tess.numPts(); | 234 int currentVertices = tess.numPts(); |
| 235 if (vertexCount + currentVertices > maxVertices) { | 235 if (vertexCount + currentVertices > maxVertices) { |
| 236 maxVertices = SkTMax(vertexCount + currentVertices, maxVertices
* 2); | 236 maxVertices = SkTMax(vertexCount + currentVertices, maxVertices
* 2); |
| 237 vertices = (uint8_t*) realloc(vertices, maxVertices * vertexStri
de); | 237 vertices = (uint8_t*) realloc(vertices, maxVertices * vertexStri
de); |
| 238 } | 238 } |
| 239 if (indexCount + currentIndices > maxIndices) { | 239 if (indexCount + currentIndices > maxIndices) { |
| 240 maxIndices = SkTMax(indexCount + currentIndices, maxIndices * 2)
; | 240 maxIndices = SkTMax(indexCount + currentIndices, maxIndices * 2)
; |
| 241 indices = (uint16_t*) realloc(indices, maxIndices * sizeof(uint1
6_t)); | 241 indices = (uint16_t*) realloc(indices, maxIndices * sizeof(uint1
6_t)); |
| 242 } | 242 } |
| 243 | 243 |
| 244 extract_verts(tess, vertices + vertexStride * vertexCount, vertexStr
ide, args.fColor, | 244 extract_verts(tess, vertices + vertexStride * vertexCount, vertexStr
ide, args.fColor, |
| 245 vertexCount, indices + indexCount, canTweakAlphaForCoverage)
; | 245 vertexCount, indices + indexCount, canTweakAlphaForCoverage)
; |
| 246 vertexCount += currentVertices; | 246 vertexCount += currentVertices; |
| 247 indexCount += currentIndices; | 247 indexCount += currentIndices; |
| 248 } | 248 } |
| 249 draw(batchTarget, this->pipeline(), vertexCount, vertexStride, vertices,
indexCount, | 249 draw(target, this->pipeline(), vertexCount, vertexStride, vertices, inde
xCount, |
| 250 indices); | 250 indices); |
| 251 free(vertices); | 251 free(vertices); |
| 252 free(indices); | 252 free(indices); |
| 253 } | 253 } |
| 254 | 254 |
| 255 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 255 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 256 | 256 |
| 257 private: | 257 private: |
| 258 AAFlatteningConvexPathBatch(const Geometry& geometry) { | 258 AAFlatteningConvexPathBatch(const Geometry& geometry) { |
| 259 this->initClassID<AAFlatteningConvexPathBatch>(); | 259 this->initClassID<AAFlatteningConvexPathBatch>(); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 DRAW_BATCH_TEST_DEFINE(AAFlatteningConvexPathBatch) { | 333 DRAW_BATCH_TEST_DEFINE(AAFlatteningConvexPathBatch) { |
| 334 AAFlatteningConvexPathBatch::Geometry geometry; | 334 AAFlatteningConvexPathBatch::Geometry geometry; |
| 335 geometry.fColor = GrRandomColor(random); | 335 geometry.fColor = GrRandomColor(random); |
| 336 geometry.fViewMatrix = GrTest::TestMatrixInvertible(random); | 336 geometry.fViewMatrix = GrTest::TestMatrixInvertible(random); |
| 337 geometry.fPath = GrTest::TestPathConvex(random); | 337 geometry.fPath = GrTest::TestPathConvex(random); |
| 338 | 338 |
| 339 return AAFlatteningConvexPathBatch::Create(geometry); | 339 return AAFlatteningConvexPathBatch::Create(geometry); |
| 340 } | 340 } |
| 341 | 341 |
| 342 #endif | 342 #endif |
| OLD | NEW |