| 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 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 return 0; | 212 return 0; |
| 213 } | 213 } |
| 214 | 214 |
| 215 Draw* draw = static_cast<Draw*>(&fCmdBuffer.back()); | 215 Draw* draw = static_cast<Draw*>(&fCmdBuffer.back()); |
| 216 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 216 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
| 217 const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer; | 217 const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer; |
| 218 | 218 |
| 219 if (!draw->fInfo.isInstanced() || | 219 if (!draw->fInfo.isInstanced() || |
| 220 draw->fInfo.verticesPerInstance() != info.verticesPerInstance() || | 220 draw->fInfo.verticesPerInstance() != info.verticesPerInstance() || |
| 221 draw->fInfo.indicesPerInstance() != info.indicesPerInstance() || | 221 draw->fInfo.indicesPerInstance() != info.indicesPerInstance() || |
| 222 draw->vertexBuffer() != vertexBuffer || | 222 draw->fInfo.vertexBuffer() != vertexBuffer || |
| 223 draw->indexBuffer() != geomSrc.fIndexBuffer || | 223 draw->fInfo.indexBuffer() != geomSrc.fIndexBuffer || |
| 224 draw->fScissorState != scissorState) { | 224 draw->fScissorState != scissorState) { |
| 225 return 0; | 225 return 0; |
| 226 } | 226 } |
| 227 // info does not yet account for the offset from the start of the pool's VB
while the previous | 227 // info does not yet account for the offset from the start of the pool's VB
while the previous |
| 228 // draw record does. | 228 // draw record does. |
| 229 int adjustedStartVertex = poolState.fPoolStartVertex + info.startVertex(); | 229 int adjustedStartVertex = poolState.fPoolStartVertex + info.startVertex(); |
| 230 if (draw->fInfo.startVertex() + draw->fInfo.vertexCount() != adjustedStartVe
rtex) { | 230 if (draw->fInfo.startVertex() + draw->fInfo.vertexCount() != adjustedStartVe
rtex) { |
| 231 return 0; | 231 return 0; |
| 232 } | 232 } |
| 233 | 233 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 253 draw->fType = add_trace_bit(draw->fType); | 253 draw->fType = add_trace_bit(draw->fType); |
| 254 } | 254 } |
| 255 } | 255 } |
| 256 | 256 |
| 257 return instancesToConcat; | 257 return instancesToConcat; |
| 258 } | 258 } |
| 259 | 259 |
| 260 void GrInOrderDrawBuffer::onDraw(const GrDrawState& ds, | 260 void GrInOrderDrawBuffer::onDraw(const GrDrawState& ds, |
| 261 const DrawInfo& info, | 261 const DrawInfo& info, |
| 262 const GrClipMaskManager::ScissorState& scissorS
tate) { | 262 const GrClipMaskManager::ScissorState& scissorS
tate) { |
| 263 SkASSERT(info.vertexBuffer() && (!info.isIndexed() || info.indexBuffer())); |
| 264 |
| 263 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 265 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
| 264 | 266 |
| 265 this->recordStateIfNecessary(ds, | 267 this->recordStateIfNecessary(ds, |
| 266 GrGpu::PrimTypeToDrawType(info.primitiveType())
, | 268 GrGpu::PrimTypeToDrawType(info.primitiveType())
, |
| 267 info.getDstCopy()); | 269 info.getDstCopy()); |
| 268 | 270 |
| 269 const GrVertexBuffer* vb; | |
| 270 if (kBuffer_GeometrySrcType == this->getGeomSrc().fVertexSrc) { | |
| 271 vb = this->getGeomSrc().fVertexBuffer; | |
| 272 } else { | |
| 273 vb = poolState.fPoolVertexBuffer; | |
| 274 } | |
| 275 | |
| 276 const GrIndexBuffer* ib = NULL; | |
| 277 if (info.isIndexed()) { | |
| 278 if (kBuffer_GeometrySrcType == this->getGeomSrc().fIndexSrc) { | |
| 279 ib = this->getGeomSrc().fIndexBuffer; | |
| 280 } else { | |
| 281 ib = poolState.fPoolIndexBuffer; | |
| 282 } | |
| 283 } | |
| 284 | |
| 285 Draw* draw; | 271 Draw* draw; |
| 286 if (info.isInstanced()) { | 272 if (info.isInstanced()) { |
| 287 int instancesConcated = this->concatInstancedDraw(ds, info, scissorState
); | 273 int instancesConcated = this->concatInstancedDraw(ds, info, scissorState
); |
| 288 if (info.instanceCount() > instancesConcated) { | 274 if (info.instanceCount() > instancesConcated) { |
| 289 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, scissorStat
e, vb, ib)); | 275 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, scissorStat
e)); |
| 290 draw->fInfo.adjustInstanceCount(-instancesConcated); | 276 draw->fInfo.adjustInstanceCount(-instancesConcated); |
| 291 } else { | 277 } else { |
| 292 return; | 278 return; |
| 293 } | 279 } |
| 294 } else { | 280 } else { |
| 295 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, scissorState, v
b, ib)); | 281 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, scissorState)); |
| 296 } | 282 } |
| 297 this->recordTraceMarkersIfNecessary(); | 283 this->recordTraceMarkersIfNecessary(); |
| 298 | 284 |
| 299 // Adjust the starting vertex and index when we are using reserved or array
sources to | 285 // Adjust the starting vertex and index when we are using reserved or array
sources to |
| 300 // compensate for the fact that the data was inserted into a larger vb/ib ow
ned by the pool. | 286 // compensate for the fact that the data was inserted into a larger vb/ib ow
ned by the pool. |
| 301 if (kBuffer_GeometrySrcType != this->getGeomSrc().fVertexSrc) { | 287 if (kBuffer_GeometrySrcType != this->getGeomSrc().fVertexSrc) { |
| 302 size_t bytes = (info.vertexCount() + info.startVertex()) * ds.getVertexS
tride(); | 288 size_t bytes = (info.vertexCount() + info.startVertex()) * ds.getVertexS
tride(); |
| 303 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes,
bytes); | 289 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes,
bytes); |
| 304 draw->fInfo.adjustStartVertex(poolState.fPoolStartVertex); | 290 draw->fInfo.adjustStartVertex(poolState.fPoolStartVertex); |
| 305 } | 291 } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 void GrInOrderDrawBuffer::discard(GrRenderTarget* renderTarget) { | 411 void GrInOrderDrawBuffer::discard(GrRenderTarget* renderTarget) { |
| 426 SkASSERT(renderTarget); | 412 SkASSERT(renderTarget); |
| 427 if (!this->caps()->discardRenderTargetSupport()) { | 413 if (!this->caps()->discardRenderTargetSupport()) { |
| 428 return; | 414 return; |
| 429 } | 415 } |
| 430 Clear* clr = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Clear, (renderTarget)); | 416 Clear* clr = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Clear, (renderTarget)); |
| 431 clr->fColor = GrColor_ILLEGAL; | 417 clr->fColor = GrColor_ILLEGAL; |
| 432 this->recordTraceMarkersIfNecessary(); | 418 this->recordTraceMarkersIfNecessary(); |
| 433 } | 419 } |
| 434 | 420 |
| 421 void GrInOrderDrawBuffer::setDrawBuffers(DrawInfo* info) { |
| 422 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
| 423 if (kBuffer_GeometrySrcType == this->getGeomSrc().fVertexSrc) { |
| 424 info->setVertexBuffer(this->getGeomSrc().fVertexBuffer); |
| 425 } else { |
| 426 info->setVertexBuffer(poolState.fPoolVertexBuffer); |
| 427 } |
| 428 |
| 429 if (info->isIndexed()) { |
| 430 if (kBuffer_GeometrySrcType == this->getGeomSrc().fIndexSrc) { |
| 431 info->setIndexBuffer(this->getGeomSrc().fIndexBuffer); |
| 432 } else { |
| 433 info->setIndexBuffer(poolState.fPoolIndexBuffer); |
| 434 } |
| 435 } |
| 436 } |
| 437 |
| 435 void GrInOrderDrawBuffer::reset() { | 438 void GrInOrderDrawBuffer::reset() { |
| 436 SkASSERT(1 == fGeoPoolStateStack.count()); | 439 SkASSERT(1 == fGeoPoolStateStack.count()); |
| 437 this->resetVertexSource(); | 440 this->resetVertexSource(); |
| 438 this->resetIndexSource(); | 441 this->resetIndexSource(); |
| 439 | 442 |
| 440 fCmdBuffer.reset(); | 443 fCmdBuffer.reset(); |
| 441 fLastState = NULL; | 444 fLastState = NULL; |
| 442 fVertexPool.reset(); | 445 fVertexPool.reset(); |
| 443 fIndexPool.reset(); | 446 fIndexPool.reset(); |
| 444 reset_data_buffer(&fPathIndexBuffer, kPathIdxBufferMinReserve); | 447 reset_data_buffer(&fPathIndexBuffer, kPathIdxBufferMinReserve); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); | 507 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); |
| 505 | 508 |
| 506 this->reset(); | 509 this->reset(); |
| 507 ++fDrawID; | 510 ++fDrawID; |
| 508 } | 511 } |
| 509 | 512 |
| 510 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const GrOptDra
wState* optState) { | 513 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const GrOptDra
wState* optState) { |
| 511 if (!optState) { | 514 if (!optState) { |
| 512 return; | 515 return; |
| 513 } | 516 } |
| 514 GrGpu* dstGpu = buf->fDstGpu; | 517 buf->fDstGpu->draw(*optState, fInfo, fScissorState); |
| 515 dstGpu->setVertexSourceToBuffer(this->vertexBuffer(), optState->getVertexStr
ide()); | |
| 516 if (fInfo.isIndexed()) { | |
| 517 dstGpu->setIndexSourceToBuffer(this->indexBuffer()); | |
| 518 } | |
| 519 dstGpu->draw(*optState, fInfo, fScissorState); | |
| 520 } | 518 } |
| 521 | 519 |
| 522 void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, | 520 void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, |
| 523 const GrOptDrawState* optState) { | 521 const GrOptDrawState* optState) { |
| 524 if (!optState) { | 522 if (!optState) { |
| 525 return; | 523 return; |
| 526 } | 524 } |
| 527 buf->fDstGpu->stencilPath(*optState, this->path(), fScissorState, fStencilSe
ttings); | 525 buf->fDstGpu->stencilPath(*optState, this->path(), fScissorState, fStencilSe
ttings); |
| 528 } | 526 } |
| 529 | 527 |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 | 788 |
| 791 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { | 789 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { |
| 792 SkASSERT(!fCmdBuffer.empty()); | 790 SkASSERT(!fCmdBuffer.empty()); |
| 793 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); | 791 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); |
| 794 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); | 792 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |
| 795 if (activeTraceMarkers.count() > 0) { | 793 if (activeTraceMarkers.count() > 0) { |
| 796 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); | 794 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); |
| 797 fGpuCmdMarkers.push_back(activeTraceMarkers); | 795 fGpuCmdMarkers.push_back(activeTraceMarkers); |
| 798 } | 796 } |
| 799 } | 797 } |
| OLD | NEW |