| Index: src/gpu/GrInOrderDrawBuffer.cpp
|
| diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
|
| index 64d9cea62e57f10cd9e331e095e921806c92535d..d9926fd50aa7694c496b921bd85ad4fb16b160d0 100644
|
| --- a/src/gpu/GrInOrderDrawBuffer.cpp
|
| +++ b/src/gpu/GrInOrderDrawBuffer.cpp
|
| @@ -20,10 +20,7 @@ GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu,
|
| : INHERITED(gpu->getContext())
|
| , fCmdBuffer(kCmdBufferInitialSizeInBytes)
|
| , fLastState(NULL)
|
| - , fLastClip(NULL)
|
| , fDstGpu(gpu)
|
| - , fClipSet(true)
|
| - , fClipProxyState(kUnknown_ClipProxyState)
|
| , fVertexPool(*vertexPool)
|
| , fIndexPool(*indexPool)
|
| , fFlushing(false)
|
| @@ -176,49 +173,8 @@ void GrInOrderDrawBuffer::onDrawRect(const SkRect& rect,
|
| SkASSERT(this->drawState() == drawState);
|
| }
|
|
|
| -bool GrInOrderDrawBuffer::quickInsideClip(const SkRect& devBounds) {
|
| - if (!this->getDrawState().isClipState()) {
|
| - return true;
|
| - }
|
| - if (kUnknown_ClipProxyState == fClipProxyState) {
|
| - SkIRect rect;
|
| - bool iior;
|
| - this->getClip()->getConservativeBounds(this->getDrawState().getRenderTarget(), &rect, &iior);
|
| - if (iior) {
|
| - // The clip is a rect. We will remember that in fProxyClip. It is common for an edge (or
|
| - // all edges) of the clip to be at the edge of the RT. However, we get that clipping for
|
| - // free via the viewport. We don't want to think that clipping must be enabled in this
|
| - // case. So we extend the clip outward from the edge to avoid these false negatives.
|
| - fClipProxyState = kValid_ClipProxyState;
|
| - fClipProxy = SkRect::Make(rect);
|
| -
|
| - if (fClipProxy.fLeft <= 0) {
|
| - fClipProxy.fLeft = SK_ScalarMin;
|
| - }
|
| - if (fClipProxy.fTop <= 0) {
|
| - fClipProxy.fTop = SK_ScalarMin;
|
| - }
|
| - if (fClipProxy.fRight >= this->getDrawState().getRenderTarget()->width()) {
|
| - fClipProxy.fRight = SK_ScalarMax;
|
| - }
|
| - if (fClipProxy.fBottom >= this->getDrawState().getRenderTarget()->height()) {
|
| - fClipProxy.fBottom = SK_ScalarMax;
|
| - }
|
| - } else {
|
| - fClipProxyState = kInvalid_ClipProxyState;
|
| - }
|
| - }
|
| - if (kValid_ClipProxyState == fClipProxyState) {
|
| - return fClipProxy.contains(devBounds);
|
| - }
|
| - SkPoint originOffset = {SkIntToScalar(this->getClip()->fOrigin.fX),
|
| - SkIntToScalar(this->getClip()->fOrigin.fY)};
|
| - SkRect clipSpaceBounds = devBounds;
|
| - clipSpaceBounds.offset(originOffset);
|
| - return this->getClip()->fClipStack->quickContains(clipSpaceBounds);
|
| -}
|
| -
|
| -int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info) {
|
| +int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info,
|
| + const GrClipMaskManager::ScissorState& scissorState) {
|
| SkASSERT(!fCmdBuffer.empty());
|
| SkASSERT(info.isInstanced());
|
|
|
| @@ -246,7 +202,8 @@ int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info) {
|
| draw->fInfo.verticesPerInstance() != info.verticesPerInstance() ||
|
| draw->fInfo.indicesPerInstance() != info.indicesPerInstance() ||
|
| draw->vertexBuffer() != vertexBuffer ||
|
| - draw->indexBuffer() != geomSrc.fIndexBuffer) {
|
| + draw->indexBuffer() != geomSrc.fIndexBuffer ||
|
| + draw->fScissorState != scissorState) {
|
| return 0;
|
| }
|
| // info does not yet account for the offset from the start of the pool's VB while the previous
|
| @@ -283,37 +240,12 @@ int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info) {
|
| return instancesToConcat;
|
| }
|
|
|
| -class AutoClipReenable {
|
| -public:
|
| - AutoClipReenable() : fDrawState(NULL) {}
|
| - ~AutoClipReenable() {
|
| - if (fDrawState) {
|
| - fDrawState->enableState(GrDrawState::kClip_StateBit);
|
| - }
|
| - }
|
| - void set(GrDrawState* drawState) {
|
| - if (drawState->isClipState()) {
|
| - fDrawState = drawState;
|
| - drawState->disableState(GrDrawState::kClip_StateBit);
|
| - }
|
| - }
|
| -private:
|
| - GrDrawState* fDrawState;
|
| -};
|
| -
|
| -void GrInOrderDrawBuffer::onDraw(const DrawInfo& info) {
|
| +void GrInOrderDrawBuffer::onDraw(const DrawInfo& info,
|
| + const GrClipMaskManager::ScissorState& scissorState) {
|
|
|
| GeometryPoolState& poolState = fGeoPoolStateStack.back();
|
| const GrDrawState& drawState = this->getDrawState();
|
| - AutoClipReenable acr;
|
| -
|
| - if (drawState.isClipState() &&
|
| - info.getDevBounds() &&
|
| - this->quickInsideClip(*info.getDevBounds())) {
|
| - acr.set(this->drawState());
|
| - }
|
|
|
| - this->recordClipIfNecessary();
|
| this->recordStateIfNecessary();
|
|
|
| const GrVertexBuffer* vb;
|
| @@ -334,15 +266,15 @@ void GrInOrderDrawBuffer::onDraw(const DrawInfo& info) {
|
|
|
| Draw* draw;
|
| if (info.isInstanced()) {
|
| - int instancesConcated = this->concatInstancedDraw(info);
|
| + int instancesConcated = this->concatInstancedDraw(info, scissorState);
|
| if (info.instanceCount() > instancesConcated) {
|
| - draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, vb, ib));
|
| + draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, scissorState, vb, ib));
|
| draw->fInfo.adjustInstanceCount(-instancesConcated);
|
| } else {
|
| return;
|
| }
|
| } else {
|
| - draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, vb, ib));
|
| + draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, scissorState, vb, ib));
|
| }
|
| this->recordTraceMarkersIfNecessary();
|
|
|
| @@ -361,39 +293,44 @@ void GrInOrderDrawBuffer::onDraw(const DrawInfo& info) {
|
| }
|
| }
|
|
|
| -void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, GrPathRendering::FillType fill) {
|
| - this->recordClipIfNecessary();
|
| +void GrInOrderDrawBuffer::onStencilPath(const GrPath* path,
|
| + const GrClipMaskManager::ScissorState& scissorState,
|
| + const GrStencilSettings& stencilSettings) {
|
| // Only compare the subset of GrDrawState relevant to path stenciling?
|
| this->recordStateIfNecessary();
|
| StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, (path));
|
| - sp->fFill = fill;
|
| + sp->fScissorState = scissorState;
|
| + sp->fStencilSettings = stencilSettings;
|
| this->recordTraceMarkersIfNecessary();
|
| }
|
|
|
| void GrInOrderDrawBuffer::onDrawPath(const GrPath* path,
|
| - GrPathRendering::FillType fill,
|
| + const GrClipMaskManager::ScissorState& scissorState,
|
| + const GrStencilSettings& stencilSettings,
|
| const GrDeviceCoordTexture* dstCopy) {
|
| - this->recordClipIfNecessary();
|
| // TODO: Only compare the subset of GrDrawState relevant to path covering?
|
| this->recordStateIfNecessary();
|
| DrawPath* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPath, (path));
|
| - dp->fFill = fill;
|
| if (dstCopy) {
|
| dp->fDstCopy = *dstCopy;
|
| }
|
| + dp->fScissorState = scissorState;
|
| + dp->fStencilSettings = stencilSettings;
|
| this->recordTraceMarkersIfNecessary();
|
| }
|
|
|
| void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange,
|
| - const uint32_t indices[], int count,
|
| - const float transforms[], PathTransformType transformsType,
|
| - GrPathRendering::FillType fill,
|
| + const uint32_t indices[],
|
| + int count,
|
| + const float transforms[],
|
| + PathTransformType transformsType,
|
| + const GrClipMaskManager::ScissorState& scissorState,
|
| + const GrStencilSettings& stencilSettings,
|
| const GrDeviceCoordTexture* dstCopy) {
|
| SkASSERT(pathRange);
|
| SkASSERT(indices);
|
| SkASSERT(transforms);
|
|
|
| - this->recordClipIfNecessary();
|
| this->recordStateIfNecessary();
|
|
|
| int sizeOfIndices = sizeof(uint32_t) * count;
|
| @@ -406,7 +343,8 @@ void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange,
|
| dp->fCount = count;
|
| memcpy(dp->transforms(), transforms, sizeOfTransforms);
|
| dp->fTransformsType = transformsType;
|
| - dp->fFill = fill;
|
| + dp->fScissorState = scissorState;
|
| + dp->fStencilSettings = stencilSettings;
|
| if (dstCopy) {
|
| dp->fDstCopy = *dstCopy;
|
| }
|
| @@ -466,11 +404,9 @@ void GrInOrderDrawBuffer::reset() {
|
|
|
| fCmdBuffer.reset();
|
| fLastState = NULL;
|
| - fLastClip = NULL;
|
| fVertexPool.reset();
|
| fIndexPool.reset();
|
| fGpuCmdMarkers.reset();
|
| - fClipSet = true;
|
| }
|
|
|
| void GrInOrderDrawBuffer::flush() {
|
| @@ -493,9 +429,6 @@ void GrInOrderDrawBuffer::flush() {
|
| fVertexPool.unmap();
|
| fIndexPool.unmap();
|
|
|
| - GrDrawTarget::AutoClipRestore acr(fDstGpu);
|
| - AutoGeometryAndStatePush agasp(fDstGpu, kPreserve_ASRInit);
|
| -
|
| GrDrawState* prevDrawState = SkRef(fDstGpu->drawState());
|
|
|
| CmdBuffer::Iter iter(fCmdBuffer);
|
| @@ -540,32 +473,28 @@ void GrInOrderDrawBuffer::Draw::execute(GrClipTarget* gpu) {
|
| if (fInfo.isIndexed()) {
|
| gpu->setIndexSourceToBuffer(this->indexBuffer());
|
| }
|
| - gpu->executeDraw(fInfo);
|
| + gpu->executeDraw(fInfo, fScissorState);
|
| }
|
|
|
| void GrInOrderDrawBuffer::StencilPath::execute(GrClipTarget* gpu) {
|
| - gpu->stencilPath(this->path(), fFill);
|
| + gpu->executeStencilPath(this->path(), fScissorState, fStencilSettings);
|
| }
|
|
|
| void GrInOrderDrawBuffer::DrawPath::execute(GrClipTarget* gpu) {
|
| - gpu->executeDrawPath(this->path(), fFill, fDstCopy.texture() ? &fDstCopy : NULL);
|
| + gpu->executeDrawPath(this->path(), fScissorState, fStencilSettings,
|
| + fDstCopy.texture() ? &fDstCopy : NULL);
|
| }
|
|
|
| void GrInOrderDrawBuffer::DrawPaths::execute(GrClipTarget* gpu) {
|
| gpu->executeDrawPaths(this->pathRange(), this->indices(), fCount, this->transforms(),
|
| - fTransformsType, fFill, fDstCopy.texture() ? &fDstCopy : NULL);
|
| + fTransformsType, fScissorState, fStencilSettings,
|
| + fDstCopy.texture() ? &fDstCopy : NULL);
|
| }
|
|
|
| void GrInOrderDrawBuffer::SetState::execute(GrClipTarget* gpu) {
|
| gpu->setDrawState(&fState);
|
| }
|
|
|
| -void GrInOrderDrawBuffer::SetClip::execute(GrClipTarget* gpu) {
|
| - // Our fClipData is referenced directly, so we must remain alive for the entire
|
| - // duration of the flush (after which the gpu's previous clip is restored).
|
| - gpu->setClip(&fClipData);
|
| -}
|
| -
|
| void GrInOrderDrawBuffer::Clear::execute(GrClipTarget* gpu) {
|
| if (GrColor_ILLEGAL == fColor) {
|
| gpu->discard(this->renderTarget());
|
| @@ -798,16 +727,6 @@ void GrInOrderDrawBuffer::recordStateIfNecessary() {
|
| }
|
| }
|
|
|
| -void GrInOrderDrawBuffer::recordClipIfNecessary() {
|
| - if (this->getDrawState().isClipState() &&
|
| - fClipSet &&
|
| - (!fLastClip || *fLastClip != *this->getClip())) {
|
| - fLastClip = &GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetClip, (this->getClip()))->fClipData;
|
| - this->recordTraceMarkersIfNecessary();
|
| - fClipSet = false;
|
| - }
|
| -}
|
| -
|
| void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() {
|
| SkASSERT(!fCmdBuffer.empty());
|
| SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType));
|
| @@ -817,9 +736,3 @@ void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() {
|
| fGpuCmdMarkers.push_back(activeTraceMarkers);
|
| }
|
| }
|
| -
|
| -void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) {
|
| - INHERITED::clipWillBeSet(newClipData);
|
| - fClipSet = true;
|
| - fClipProxyState = kUnknown_ClipProxyState;
|
| -}
|
|
|