Index: src/gpu/GrInOrderDrawBuffer.cpp |
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp |
index c180cc67d2974d587963388c5c5020793acd4b5d..b0504b75a970e1c19cfbecfc9a32d7129085d488 100644 |
--- a/src/gpu/GrInOrderDrawBuffer.cpp |
+++ b/src/gpu/GrInOrderDrawBuffer.cpp |
@@ -133,34 +133,33 @@ static inline uint8_t strip_trace_bit(uint8_t cmd) { return cmd & kCmdMask; } |
static inline bool cmd_has_trace_marker(uint8_t cmd) { return SkToBool(cmd & kTraceCmdBit); } |
-void GrInOrderDrawBuffer::onDrawRect(const SkRect& rect, |
+void GrInOrderDrawBuffer::onDrawRect(GrDrawState* ds, |
+ const SkRect& rect, |
const SkRect* localRect, |
const SkMatrix* localMatrix) { |
- GrDrawState* drawState = this->drawState(); |
- GrDrawState::AutoRestoreEffects are(drawState); |
+ GrDrawState::AutoRestoreEffects are(ds); |
- GrColor color = drawState->getColor(); |
+ GrColor color = ds->getColor(); |
+ set_vertex_attributes(ds, SkToBool(localRect), color); |
- set_vertex_attributes(drawState, SkToBool(localRect), color); |
- |
- AutoReleaseGeometry geo(this, 4, 0); |
+ AutoReleaseGeometry geo(this, 4, ds->getVertexStride(), 0); |
if (!geo.succeeded()) { |
SkDebugf("Failed to get space for vertices!\n"); |
return; |
} |
// Go to device coords to allow batching across matrix changes |
- SkMatrix matrix = drawState->getViewMatrix(); |
+ SkMatrix matrix = ds->getViewMatrix(); |
// When the caller has provided an explicit source rect for a stage then we don't want to |
// modify that stage's matrix. Otherwise if the effect is generating its source rect from |
// the vertex positions then we have to account for the view matrix change. |
GrDrawState::AutoViewMatrixRestore avmr; |
- if (!avmr.setIdentity(drawState)) { |
+ if (!avmr.setIdentity(ds)) { |
return; |
} |
- size_t vstride = drawState->getVertexStride(); |
+ size_t vstride = ds->getVertexStride(); |
geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vstride); |
matrix.mapPointsWithStride(geo.positions(), vstride, 4); |
@@ -189,19 +188,16 @@ void GrInOrderDrawBuffer::onDrawRect(const SkRect& rect, |
} |
this->setIndexSourceToBuffer(this->getContext()->getQuadIndexBuffer()); |
- this->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &devBounds); |
- |
- // to ensure that stashing the drawState ptr is valid |
- SkASSERT(this->drawState() == drawState); |
+ this->drawIndexedInstances(ds, kTriangles_GrPrimitiveType, 1, 4, 6, &devBounds); |
} |
-int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info, |
+int GrInOrderDrawBuffer::concatInstancedDraw(const GrDrawState& ds, |
+ const DrawInfo& info, |
const GrClipMaskManager::ScissorState& scissorState) { |
SkASSERT(!fCmdBuffer.empty()); |
SkASSERT(info.isInstanced()); |
const GeometrySrcState& geomSrc = this->getGeomSrc(); |
- const GrDrawState& drawState = this->getDrawState(); |
// we only attempt to concat the case when reserved verts are used with a client-specified index |
// buffer. To make this work with client-specified VBs we'd need to know if the VB was updated |
@@ -243,8 +239,7 @@ int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info, |
instancesToConcat = SkTMin(instancesToConcat, info.instanceCount()); |
// update the amount of reserved vertex data actually referenced in draws |
- size_t vertexBytes = instancesToConcat * info.verticesPerInstance() * |
- drawState.getVertexStride(); |
+ size_t vertexBytes = instancesToConcat * info.verticesPerInstance() * ds.getVertexStride(); |
poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes, vertexBytes); |
draw->fInfo.adjustInstanceCount(instancesToConcat); |
@@ -262,12 +257,13 @@ int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info, |
return instancesToConcat; |
} |
-void GrInOrderDrawBuffer::onDraw(const DrawInfo& info, |
+void GrInOrderDrawBuffer::onDraw(const GrDrawState& ds, |
+ const DrawInfo& info, |
const GrClipMaskManager::ScissorState& scissorState) { |
GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
- const GrDrawState& drawState = this->getDrawState(); |
- this->recordStateIfNecessary(GrGpu::PrimTypeToDrawType(info.primitiveType()), |
+ this->recordStateIfNecessary(ds, |
+ GrGpu::PrimTypeToDrawType(info.primitiveType()), |
info.getDstCopy()); |
const GrVertexBuffer* vb; |
@@ -288,7 +284,7 @@ void GrInOrderDrawBuffer::onDraw(const DrawInfo& info, |
Draw* draw; |
if (info.isInstanced()) { |
- int instancesConcated = this->concatInstancedDraw(info, scissorState); |
+ int instancesConcated = this->concatInstancedDraw(ds, info, scissorState); |
if (info.instanceCount() > instancesConcated) { |
draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, scissorState, vb, ib)); |
draw->fInfo.adjustInstanceCount(-instancesConcated); |
@@ -303,7 +299,7 @@ void GrInOrderDrawBuffer::onDraw(const DrawInfo& info, |
// Adjust the starting vertex and index when we are using reserved or array sources to |
// compensate for the fact that the data was inserted into a larger vb/ib owned by the pool. |
if (kBuffer_GeometrySrcType != this->getGeomSrc().fVertexSrc) { |
- size_t bytes = (info.vertexCount() + info.startVertex()) * drawState.getVertexStride(); |
+ size_t bytes = (info.vertexCount() + info.startVertex()) * ds.getVertexStride(); |
poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes, bytes); |
draw->fInfo.adjustStartVertex(poolState.fPoolStartVertex); |
} |
@@ -315,23 +311,25 @@ void GrInOrderDrawBuffer::onDraw(const DrawInfo& info, |
} |
} |
-void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, |
+void GrInOrderDrawBuffer::onStencilPath(const GrDrawState& ds, |
+ const GrPath* path, |
const GrClipMaskManager::ScissorState& scissorState, |
const GrStencilSettings& stencilSettings) { |
// Only compare the subset of GrDrawState relevant to path stenciling? |
- this->recordStateIfNecessary(GrGpu::kStencilPath_DrawType, NULL); |
+ this->recordStateIfNecessary(ds, GrGpu::kStencilPath_DrawType, NULL); |
StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, (path)); |
sp->fScissorState = scissorState; |
sp->fStencilSettings = stencilSettings; |
this->recordTraceMarkersIfNecessary(); |
} |
-void GrInOrderDrawBuffer::onDrawPath(const GrPath* path, |
+void GrInOrderDrawBuffer::onDrawPath(const GrDrawState& ds, |
+ const GrPath* path, |
const GrClipMaskManager::ScissorState& scissorState, |
const GrStencilSettings& stencilSettings, |
const GrDeviceCoordTexture* dstCopy) { |
// TODO: Only compare the subset of GrDrawState relevant to path covering? |
- this->recordStateIfNecessary(GrGpu::kDrawPath_DrawType, dstCopy); |
+ this->recordStateIfNecessary(ds, GrGpu::kDrawPath_DrawType, dstCopy); |
DrawPath* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPath, (path)); |
if (dstCopy) { |
dp->fDstCopy = *dstCopy; |
@@ -341,7 +339,8 @@ void GrInOrderDrawBuffer::onDrawPath(const GrPath* path, |
this->recordTraceMarkersIfNecessary(); |
} |
-void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange, |
+void GrInOrderDrawBuffer::onDrawPaths(const GrDrawState& ds, |
+ const GrPathRange* pathRange, |
const uint32_t indices[], |
int count, |
const float transforms[], |
@@ -353,7 +352,7 @@ void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange, |
SkASSERT(indices); |
SkASSERT(transforms); |
- this->recordStateIfNecessary(GrGpu::kDrawPaths_DrawType, dstCopy); |
+ this->recordStateIfNecessary(ds, GrGpu::kDrawPaths_DrawType, dstCopy); |
uint32_t* savedIndices = fPathIndexBuffer.append(count, indices); |
float* savedTransforms = fPathTransformBuffer.append(count * |
@@ -373,7 +372,7 @@ void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange, |
scissorState == previous->fScissorState && |
stencilSettings == previous->fStencilSettings && |
path_fill_type_is_winding(stencilSettings) && |
- !this->getDrawState().willBlendWithDst()) { |
+ !ds.willBlendWithDst()) { |
// Fold this DrawPaths call into the one previous. |
previous->fCount += count; |
return; |
@@ -396,11 +395,8 @@ void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange, |
void GrInOrderDrawBuffer::onClear(const SkIRect* rect, GrColor color, |
bool canIgnoreRect, GrRenderTarget* renderTarget) { |
+ SkASSERT(renderTarget); |
SkIRect r; |
- if (NULL == renderTarget) { |
- renderTarget = this->drawState()->getRenderTarget(); |
- SkASSERT(renderTarget); |
- } |
if (NULL == rect) { |
// We could do something smart and remove previous draws and clears to |
// the current render target. If we get that smart we have to make sure |
@@ -419,10 +415,7 @@ void GrInOrderDrawBuffer::onClear(const SkIRect* rect, GrColor color, |
void GrInOrderDrawBuffer::clearStencilClip(const SkIRect& rect, |
bool insideClip, |
GrRenderTarget* renderTarget) { |
- if (NULL == renderTarget) { |
- renderTarget = this->drawState()->getRenderTarget(); |
- SkASSERT(renderTarget); |
- } |
+ SkASSERT(renderTarget); |
ClearStencilClip* clr = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, ClearStencilClip, (renderTarget)); |
clr->fRect = rect; |
clr->fInsideClip = insideClip; |
@@ -493,7 +486,7 @@ void GrInOrderDrawBuffer::flush() { |
} |
if (kSetState_Cmd == strip_trace_bit(iter->fType)) { |
- const SetState* ss = reinterpret_cast<const SetState*>(iter.get()); |
+ SetState* ss = reinterpret_cast<SetState*>(iter.get()); |
currentOptState.reset(GrOptDrawState::Create(ss->fState, |
fDstGpu, |
&ss->fDstCopy, |
@@ -592,8 +585,8 @@ bool GrInOrderDrawBuffer::copySurface(GrSurface* dst, |
} |
} |
-bool GrInOrderDrawBuffer::canCopySurface(GrSurface* dst, |
- GrSurface* src, |
+bool GrInOrderDrawBuffer::canCopySurface(const GrSurface* dst, |
+ const GrSurface* src, |
const SkIRect& srcRect, |
const SkIPoint& dstPoint) { |
return fDstGpu->canCopySurface(dst, src, srcRect, dstPoint) || |
@@ -605,6 +598,7 @@ void GrInOrderDrawBuffer::initCopySurfaceDstDesc(const GrSurface* src, GrSurface |
} |
void GrInOrderDrawBuffer::willReserveVertexAndIndexSpace(int vertexCount, |
+ size_t vertexStride, |
int indexCount) { |
// We use geometryHints() to know whether to flush the draw buffer. We |
// can't flush if we are inside an unbalanced pushGeometrySource. |
@@ -628,12 +622,13 @@ void GrInOrderDrawBuffer::willReserveVertexAndIndexSpace(int vertexCount, |
if (!insideGeoPush && |
!unreleasedVertexSpace && |
!unreleasedIndexSpace && |
- this->geometryHints(&vcount, &icount)) { |
+ this->geometryHints(vertexStride, &vcount, &icount)) { |
this->flush(); |
} |
} |
-bool GrInOrderDrawBuffer::geometryHints(int* vertexCount, |
+bool GrInOrderDrawBuffer::geometryHints(size_t vertexStride, |
+ int* vertexCount, |
int* indexCount) const { |
// we will recommend a flush if the data could fit in a single |
// preallocated buffer but none are left and it can't fit |
@@ -650,7 +645,6 @@ bool GrInOrderDrawBuffer::geometryHints(int* vertexCount, |
*indexCount = currIndices; |
} |
if (vertexCount) { |
- size_t vertexStride = this->getDrawState().getVertexStride(); |
int32_t currVertices = fVertexPool.currentBufferVertices(vertexStride); |
if (*vertexCount > currVertices && |
(!fVertexPool.preallocatedBuffersRemaining() && |
@@ -753,10 +747,11 @@ void GrInOrderDrawBuffer::geometrySourceWillPop(const GeometrySrcState& restored |
} |
} |
-void GrInOrderDrawBuffer::recordStateIfNecessary(GrGpu::DrawType drawType, |
+void GrInOrderDrawBuffer::recordStateIfNecessary(const GrDrawState& ds, |
+ GrGpu::DrawType drawType, |
const GrDeviceCoordTexture* dstCopy) { |
if (!fLastState) { |
- SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, (this->getDrawState())); |
+ SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, (ds)); |
fLastState = &ss->fState; |
if (dstCopy) { |
ss->fDstCopy = *dstCopy; |
@@ -766,10 +761,9 @@ void GrInOrderDrawBuffer::recordStateIfNecessary(GrGpu::DrawType drawType, |
this->recordTraceMarkersIfNecessary(); |
return; |
} |
- const GrDrawState& curr = this->getDrawState(); |
- switch (GrDrawState::CombineIfPossible(*fLastState, curr, *this->caps())) { |
+ switch (GrDrawState::CombineIfPossible(*fLastState, ds, *this->caps())) { |
case GrDrawState::kIncompatible_CombinedState: { |
- SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, (curr)); |
+ SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, (ds)); |
fLastState = &ss->fState; |
if (dstCopy) { |
ss->fDstCopy = *dstCopy; |
@@ -788,7 +782,7 @@ void GrInOrderDrawBuffer::recordStateIfNecessary(GrGpu::DrawType drawType, |
// Note that this goes away when we move GrIODB over to taking optimized snapshots |
// of draw states. |
fLastState->~GrDrawState(); |
- SkNEW_PLACEMENT_ARGS(fLastState, GrDrawState, (curr)); |
+ SkNEW_PLACEMENT_ARGS(fLastState, GrDrawState, (ds)); |
this->convertDrawStateToPendingExec(fLastState); |
break; |
} |