| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "GrInOrderDrawBuffer.h" | 8 #include "GrInOrderDrawBuffer.h" |
| 9 | 9 |
| 10 #include "GrBufferAllocPool.h" | 10 #include "GrBufferAllocPool.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 | 81 |
| 82 The color param is used to determine whether the opaque hint can be set on t
he draw state. | 82 The color param is used to determine whether the opaque hint can be set on t
he draw state. |
| 83 The caller must populate the vertex colors itself. | 83 The caller must populate the vertex colors itself. |
| 84 | 84 |
| 85 The vertex attrib order is always pos, color, [local coords]. | 85 The vertex attrib order is always pos, color, [local coords]. |
| 86 */ | 86 */ |
| 87 static void set_vertex_attributes(GrDrawState* drawState, bool hasLocalCoords, G
rColor color) { | 87 static void set_vertex_attributes(GrDrawState* drawState, bool hasLocalCoords, G
rColor color) { |
| 88 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType | | 88 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType | |
| 89 GrDefaultGeoProcFactory::kColor_GPType; | 89 GrDefaultGeoProcFactory::kColor_GPType; |
| 90 flags |= hasLocalCoords ? GrDefaultGeoProcFactory::kLocalCoord_GPType : 0; | 90 flags |= hasLocalCoords ? GrDefaultGeoProcFactory::kLocalCoord_GPType : 0; |
| 91 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::CreateAndSetAttribs
(drawState, | 91 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(flags))->unr
ef(); |
| 92
flags))->unref(); | |
| 93 if (0xFF == GrColorUnpackA(color)) { | 92 if (0xFF == GrColorUnpackA(color)) { |
| 94 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); | 93 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
| 95 } | 94 } |
| 96 } | 95 } |
| 97 | 96 |
| 98 static bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettin
gs) { | 97 static bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettin
gs) { |
| 99 static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Fa
ce; | 98 static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Fa
ce; |
| 100 bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace); | 99 bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace); |
| 101 if (isWinding) { | 100 if (isWinding) { |
| 102 // Double check that it is in fact winding. | 101 // Double check that it is in fact winding. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 | 133 |
| 135 void GrInOrderDrawBuffer::onDrawRect(GrDrawState* ds, | 134 void GrInOrderDrawBuffer::onDrawRect(GrDrawState* ds, |
| 136 const SkRect& rect, | 135 const SkRect& rect, |
| 137 const SkRect* localRect, | 136 const SkRect* localRect, |
| 138 const SkMatrix* localMatrix) { | 137 const SkMatrix* localMatrix) { |
| 139 GrDrawState::AutoRestoreEffects are(ds); | 138 GrDrawState::AutoRestoreEffects are(ds); |
| 140 | 139 |
| 141 GrColor color = ds->getColor(); | 140 GrColor color = ds->getColor(); |
| 142 set_vertex_attributes(ds, SkToBool(localRect), color); | 141 set_vertex_attributes(ds, SkToBool(localRect), color); |
| 143 | 142 |
| 144 AutoReleaseGeometry geo(this, 4, ds->getVertexStride(), 0); | 143 size_t vstride = ds->getGeometryProcessor()->getVertexStride(); |
| 144 AutoReleaseGeometry geo(this, 4, vstride, 0); |
| 145 if (!geo.succeeded()) { | 145 if (!geo.succeeded()) { |
| 146 SkDebugf("Failed to get space for vertices!\n"); | 146 SkDebugf("Failed to get space for vertices!\n"); |
| 147 return; | 147 return; |
| 148 } | 148 } |
| 149 | 149 |
| 150 // Go to device coords to allow batching across matrix changes | 150 // Go to device coords to allow batching across matrix changes |
| 151 SkMatrix matrix = ds->getViewMatrix(); | 151 SkMatrix matrix = ds->getViewMatrix(); |
| 152 | 152 |
| 153 // When the caller has provided an explicit source rect for a stage then we
don't want to | 153 // When the caller has provided an explicit source rect for a stage then we
don't want to |
| 154 // modify that stage's matrix. Otherwise if the effect is generating its sou
rce rect from | 154 // modify that stage's matrix. Otherwise if the effect is generating its sou
rce rect from |
| 155 // the vertex positions then we have to account for the view matrix change. | 155 // the vertex positions then we have to account for the view matrix change. |
| 156 GrDrawState::AutoViewMatrixRestore avmr; | 156 GrDrawState::AutoViewMatrixRestore avmr; |
| 157 if (!avmr.setIdentity(ds)) { | 157 if (!avmr.setIdentity(ds)) { |
| 158 return; | 158 return; |
| 159 } | 159 } |
| 160 | 160 |
| 161 size_t vstride = ds->getVertexStride(); | |
| 162 | |
| 163 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom
, vstride); | 161 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom
, vstride); |
| 164 matrix.mapPointsWithStride(geo.positions(), vstride, 4); | 162 matrix.mapPointsWithStride(geo.positions(), vstride, 4); |
| 165 | 163 |
| 166 SkRect devBounds; | 164 SkRect devBounds; |
| 167 // since we already computed the dev verts, set the bounds hint. This will h
elp us avoid | 165 // since we already computed the dev verts, set the bounds hint. This will h
elp us avoid |
| 168 // unnecessary clipping in our onDraw(). | 166 // unnecessary clipping in our onDraw(). |
| 169 get_vertex_bounds(geo.vertices(), vstride, 4, &devBounds); | 167 get_vertex_bounds(geo.vertices(), vstride, 4, &devBounds); |
| 170 | 168 |
| 171 if (localRect) { | 169 if (localRect) { |
| 172 static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); | 170 static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 } | 226 } |
| 229 | 227 |
| 230 SkASSERT(poolState.fPoolStartVertex == draw->fInfo.startVertex() + draw->fIn
fo.vertexCount()); | 228 SkASSERT(poolState.fPoolStartVertex == draw->fInfo.startVertex() + draw->fIn
fo.vertexCount()); |
| 231 | 229 |
| 232 // how many instances can be concat'ed onto draw given the size of the index
buffer | 230 // how many instances can be concat'ed onto draw given the size of the index
buffer |
| 233 int instancesToConcat = this->indexCountInCurrentSource() / info.indicesPerI
nstance(); | 231 int instancesToConcat = this->indexCountInCurrentSource() / info.indicesPerI
nstance(); |
| 234 instancesToConcat -= draw->fInfo.instanceCount(); | 232 instancesToConcat -= draw->fInfo.instanceCount(); |
| 235 instancesToConcat = SkTMin(instancesToConcat, info.instanceCount()); | 233 instancesToConcat = SkTMin(instancesToConcat, info.instanceCount()); |
| 236 | 234 |
| 237 // update the amount of reserved vertex data actually referenced in draws | 235 // update the amount of reserved vertex data actually referenced in draws |
| 238 size_t vertexBytes = instancesToConcat * info.verticesPerInstance() * ds.get
VertexStride(); | 236 size_t vertexBytes = instancesToConcat * info.verticesPerInstance() * |
| 237 ds.getGeometryProcessor()->getVertexStride(); |
| 239 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes, vert
exBytes); | 238 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes, vert
exBytes); |
| 240 | 239 |
| 241 draw->fInfo.adjustInstanceCount(instancesToConcat); | 240 draw->fInfo.adjustInstanceCount(instancesToConcat); |
| 242 | 241 |
| 243 // update last fGpuCmdMarkers to include any additional trace markers that h
ave been added | 242 // update last fGpuCmdMarkers to include any additional trace markers that h
ave been added |
| 244 if (this->getActiveTraceMarkers().count() > 0) { | 243 if (this->getActiveTraceMarkers().count() > 0) { |
| 245 if (cmd_has_trace_marker(draw->fType)) { | 244 if (cmd_has_trace_marker(draw->fType)) { |
| 246 fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); | 245 fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); |
| 247 } else { | 246 } else { |
| 248 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); | 247 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 276 return; | 275 return; |
| 277 } | 276 } |
| 278 } else { | 277 } else { |
| 279 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); | 278 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); |
| 280 } | 279 } |
| 281 this->recordTraceMarkersIfNecessary(); | 280 this->recordTraceMarkersIfNecessary(); |
| 282 | 281 |
| 283 // Adjust the starting vertex and index when we are using reserved or array
sources to | 282 // Adjust the starting vertex and index when we are using reserved or array
sources to |
| 284 // compensate for the fact that the data was inserted into a larger vb/ib ow
ned by the pool. | 283 // compensate for the fact that the data was inserted into a larger vb/ib ow
ned by the pool. |
| 285 if (kBuffer_GeometrySrcType != this->getGeomSrc().fVertexSrc) { | 284 if (kBuffer_GeometrySrcType != this->getGeomSrc().fVertexSrc) { |
| 286 size_t bytes = (info.vertexCount() + info.startVertex()) * ds.getVertexS
tride(); | 285 size_t bytes = (info.vertexCount() + info.startVertex()) * |
| 286 ds.getGeometryProcessor()->getVertexStride(); |
| 287 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes,
bytes); | 287 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes,
bytes); |
| 288 draw->fInfo.adjustStartVertex(poolState.fPoolStartVertex); | 288 draw->fInfo.adjustStartVertex(poolState.fPoolStartVertex); |
| 289 } | 289 } |
| 290 | 290 |
| 291 if (info.isIndexed() && kBuffer_GeometrySrcType != this->getGeomSrc().fIndex
Src) { | 291 if (info.isIndexed() && kBuffer_GeometrySrcType != this->getGeomSrc().fIndex
Src) { |
| 292 size_t bytes = (info.indexCount() + info.startIndex()) * sizeof(uint16_t
); | 292 size_t bytes = (info.indexCount() + info.startIndex()) * sizeof(uint16_t
); |
| 293 poolState.fUsedPoolIndexBytes = SkTMax(poolState.fUsedPoolIndexBytes, by
tes); | 293 poolState.fUsedPoolIndexBytes = SkTMax(poolState.fUsedPoolIndexBytes, by
tes); |
| 294 draw->fInfo.adjustStartIndex(poolState.fPoolStartIndex); | 294 draw->fInfo.adjustStartIndex(poolState.fPoolStartIndex); |
| 295 } | 295 } |
| 296 } | 296 } |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 | 753 |
| 754 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { | 754 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { |
| 755 SkASSERT(!fCmdBuffer.empty()); | 755 SkASSERT(!fCmdBuffer.empty()); |
| 756 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); | 756 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); |
| 757 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); | 757 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |
| 758 if (activeTraceMarkers.count() > 0) { | 758 if (activeTraceMarkers.count() > 0) { |
| 759 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); | 759 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); |
| 760 fGpuCmdMarkers.push_back(activeTraceMarkers); | 760 fGpuCmdMarkers.push_back(activeTraceMarkers); |
| 761 } | 761 } |
| 762 } | 762 } |
| OLD | NEW |