| Index: src/gpu/GrInOrderDrawBuffer.cpp
|
| diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
|
| index 1840ca32d7f6cf235dd13545ef4bb933650d63f4..eb3d19da9cc6b644dbebfce7bbf6aeda0e3875eb 100644
|
| --- a/src/gpu/GrInOrderDrawBuffer.cpp
|
| +++ b/src/gpu/GrInOrderDrawBuffer.cpp
|
| @@ -190,8 +190,7 @@ void GrInOrderDrawBuffer::onDrawRect(GrPipelineBuilder* pipelineBuilder,
|
| &devBounds);
|
| }
|
|
|
| -int GrInOrderDrawBuffer::concatInstancedDraw(const GrPipelineBuilder& pipelineBuilder,
|
| - const DrawInfo& info) {
|
| +int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info) {
|
| SkASSERT(!fCmdBuffer.empty());
|
| SkASSERT(info.isInstanced());
|
|
|
| @@ -244,20 +243,19 @@ int GrInOrderDrawBuffer::concatInstancedDraw(const GrPipelineBuilder& pipelineBu
|
| return instancesToConcat;
|
| }
|
|
|
| -void GrInOrderDrawBuffer::onDraw(const GrPipelineBuilder& pipelineBuilder,
|
| - const GrGeometryProcessor* gp,
|
| +void GrInOrderDrawBuffer::onDraw(const GrGeometryProcessor* gp,
|
| const DrawInfo& info,
|
| - const GrScissorState& scissorState) {
|
| + const PipelineInfo& pipelineInfo) {
|
| SkASSERT(info.vertexBuffer() && (!info.isIndexed() || info.indexBuffer()));
|
| this->closeBatch();
|
|
|
| - if (!this->recordStateAndShouldDraw(pipelineBuilder, gp, scissorState, info.getDevBounds())) {
|
| + if (!this->setupPipelineAndShouldDraw(gp, pipelineInfo)) {
|
| return;
|
| }
|
|
|
| Draw* draw;
|
| if (info.isInstanced()) {
|
| - int instancesConcated = this->concatInstancedDraw(pipelineBuilder, info);
|
| + int instancesConcated = this->concatInstancedDraw(info);
|
| if (info.instanceCount() > instancesConcated) {
|
| draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info));
|
| draw->fInfo.adjustInstanceCount(-instancesConcated);
|
| @@ -271,10 +269,8 @@ void GrInOrderDrawBuffer::onDraw(const GrPipelineBuilder& pipelineBuilder,
|
| }
|
|
|
| void GrInOrderDrawBuffer::onDrawBatch(GrBatch* batch,
|
| - const GrPipelineBuilder& pipelineBuilder,
|
| - const GrScissorState& scissorState,
|
| - const SkRect* devBounds) {
|
| - if (!this->recordStateAndShouldDraw(batch, pipelineBuilder, scissorState, devBounds)) {
|
| + const PipelineInfo& pipelineInfo) {
|
| + if (!this->setupPipelineAndShouldDraw(batch, pipelineInfo)) {
|
| return;
|
| }
|
|
|
| @@ -310,16 +306,14 @@ void GrInOrderDrawBuffer::onStencilPath(const GrPipelineBuilder& pipelineBuilder
|
| this->recordTraceMarkersIfNecessary();
|
| }
|
|
|
| -void GrInOrderDrawBuffer::onDrawPath(const GrPipelineBuilder& pipelineBuilder,
|
| - const GrPathProcessor* pathProc,
|
| +void GrInOrderDrawBuffer::onDrawPath(const GrPathProcessor* pathProc,
|
| const GrPath* path,
|
| - const GrScissorState& scissorState,
|
| const GrStencilSettings& stencilSettings,
|
| - const SkRect* devBounds) {
|
| + const PipelineInfo& pipelineInfo) {
|
| this->closeBatch();
|
|
|
| // TODO: Only compare the subset of GrPipelineBuilder relevant to path covering?
|
| - if (!this->recordStateAndShouldDraw(pipelineBuilder, pathProc, scissorState, devBounds)) {
|
| + if (!this->setupPipelineAndShouldDraw(pathProc, pipelineInfo)) {
|
| return;
|
| }
|
| DrawPath* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPath, (path));
|
| @@ -327,23 +321,21 @@ void GrInOrderDrawBuffer::onDrawPath(const GrPipelineBuilder& pipelineBuilder,
|
| this->recordTraceMarkersIfNecessary();
|
| }
|
|
|
| -void GrInOrderDrawBuffer::onDrawPaths(const GrPipelineBuilder& pipelineBuilder,
|
| - const GrPathProcessor* pathProc,
|
| +void GrInOrderDrawBuffer::onDrawPaths(const GrPathProcessor* pathProc,
|
| const GrPathRange* pathRange,
|
| const void* indices,
|
| PathIndexType indexType,
|
| const float transformValues[],
|
| PathTransformType transformType,
|
| int count,
|
| - const GrScissorState& scissorState,
|
| const GrStencilSettings& stencilSettings,
|
| - const SkRect* devBounds) {
|
| + const PipelineInfo& pipelineInfo) {
|
| SkASSERT(pathRange);
|
| SkASSERT(indices);
|
| SkASSERT(transformValues);
|
| this->closeBatch();
|
|
|
| - if (!this->recordStateAndShouldDraw(pipelineBuilder, pathProc, scissorState, devBounds)) {
|
| + if (!this->setupPipelineAndShouldDraw(pathProc, pipelineInfo)) {
|
| return;
|
| }
|
|
|
| @@ -373,7 +365,7 @@ void GrInOrderDrawBuffer::onDrawPaths(const GrPipelineBuilder& pipelineBuilder,
|
| transformType == previous->fTransformType &&
|
| stencilSettings == previous->fStencilSettings &&
|
| path_fill_type_is_winding(stencilSettings) &&
|
| - !pipelineBuilder.willBlendWithDst(pathProc)) {
|
| + !pipelineInfo.willBlendWithDst(pathProc)) {
|
| // Fold this DrawPaths call into the one previous.
|
| previous->fCount += count;
|
| return;
|
| @@ -492,7 +484,7 @@ void GrInOrderDrawBuffer::onFlush() {
|
| // only have GrBatch and we can delete this
|
| if (ss->fPrimitiveProcessor) {
|
| this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProcessor,
|
| - ss->fPipeline,
|
| + *ss->getPipeline(),
|
| ss->fBatchTracker);
|
| }
|
| currentState = ss;
|
| @@ -514,7 +506,7 @@ void GrInOrderDrawBuffer::onFlush() {
|
|
|
| void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const SetState* state) {
|
| SkASSERT(state);
|
| - DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->fDesc,
|
| + DrawArgs args(state->fPrimitiveProcessor.get(), state->getPipeline(), &state->fDesc,
|
| &state->fBatchTracker);
|
| buf->getGpu()->draw(args, fInfo);
|
| }
|
| @@ -532,14 +524,14 @@ void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, const S
|
|
|
| void GrInOrderDrawBuffer::DrawPath::execute(GrInOrderDrawBuffer* buf, const SetState* state) {
|
| SkASSERT(state);
|
| - DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->fDesc,
|
| + DrawArgs args(state->fPrimitiveProcessor.get(), state->getPipeline(), &state->fDesc,
|
| &state->fBatchTracker);
|
| buf->getGpu()->drawPath(args, this->path(), fStencilSettings);
|
| }
|
|
|
| void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const SetState* state) {
|
| SkASSERT(state);
|
| - DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->fDesc,
|
| + DrawArgs args(state->fPrimitiveProcessor.get(), state->getPipeline(), &state->fDesc,
|
| &state->fBatchTracker);
|
| buf->getGpu()->drawPaths(args, this->pathRange(),
|
| &buf->fPathIndexBuffer[fIndicesLocation], fIndexType,
|
| @@ -549,7 +541,7 @@ void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const Set
|
|
|
| void GrInOrderDrawBuffer::DrawBatch::execute(GrInOrderDrawBuffer* buf, const SetState* state) {
|
| SkASSERT(state);
|
| - fBatch->generateGeometry(buf->getBatchTarget(), &state->fPipeline);
|
| + fBatch->generateGeometry(buf->getBatchTarget(), state->getPipeline());
|
| }
|
|
|
| void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState*) {}
|
| @@ -585,30 +577,24 @@ bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst,
|
| return false;
|
| }
|
|
|
| -bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrPipelineBuilder& pipelineBuilder,
|
| - const GrPrimitiveProcessor* primProc,
|
| - const GrScissorState& scissor,
|
| - const SkRect* devBounds) {
|
| - GrDeviceCoordTexture dstCopy;
|
| - if (!this->setupDstReadIfNecessary(pipelineBuilder, &dstCopy, devBounds)) {
|
| - return false;
|
| - }
|
| - SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState,
|
| - (pipelineBuilder, primProc, *this->getGpu()->caps(),
|
| - scissor, &dstCopy));
|
| - if (ss->fPipeline.mustSkip()) {
|
| +bool GrInOrderDrawBuffer::setupPipelineAndShouldDraw(const GrPrimitiveProcessor* primProc,
|
| + const PipelineInfo& pipelineInfo) {
|
| + SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, (primProc));
|
| + this->setupPipeline(pipelineInfo, ss->pipelineLocation());
|
| +
|
| + if (ss->getPipeline()->mustSkip()) {
|
| fCmdBuffer.pop_back();
|
| return false;
|
| }
|
|
|
| ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker,
|
| - ss->fPipeline.getInitBatchTracker());
|
| + ss->getPipeline()->getInitBatchTracker());
|
|
|
| if (fPrevState && fPrevState->fPrimitiveProcessor.get() &&
|
| fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker,
|
| *ss->fPrimitiveProcessor,
|
| ss->fBatchTracker) &&
|
| - fPrevState->fPipeline.isEqual(ss->fPipeline)) {
|
| + fPrevState->getPipeline()->isEqual(*ss->getPipeline())) {
|
| fCmdBuffer.pop_back();
|
| } else {
|
| fPrevState = ss;
|
| @@ -617,29 +603,20 @@ bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrPipelineBuilder& pipe
|
| return true;
|
| }
|
|
|
| -bool GrInOrderDrawBuffer::recordStateAndShouldDraw(GrBatch* batch,
|
| - const GrPipelineBuilder& pipelineBuilder,
|
| - const GrScissorState& scissor,
|
| - const SkRect* devBounds) {
|
| - GrDeviceCoordTexture dstCopy;
|
| - if (!this->setupDstReadIfNecessary(pipelineBuilder, &dstCopy, devBounds)) {
|
| - return false;
|
| - }
|
| - // TODO this gets much simpler when we have batches everywhere.
|
| - // If the previous command is also a set state, then we check to see if it has a Batch. If so,
|
| - // and we can make the two batches equal, and we can combine the states, then we make them equal
|
| - SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState,
|
| - (batch, pipelineBuilder, *this->getGpu()->caps(), scissor,
|
| - &dstCopy));
|
| - if (ss->fPipeline.mustSkip()) {
|
| +bool GrInOrderDrawBuffer::setupPipelineAndShouldDraw(GrBatch* batch,
|
| + const PipelineInfo& pipelineInfo) {
|
| + SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, ());
|
| + this->setupPipeline(pipelineInfo, ss->pipelineLocation());
|
| +
|
| + if (ss->getPipeline()->mustSkip()) {
|
| fCmdBuffer.pop_back();
|
| return false;
|
| }
|
|
|
| - batch->initBatchTracker(ss->fPipeline.getInitBatchTracker());
|
| + batch->initBatchTracker(ss->getPipeline()->getInitBatchTracker());
|
|
|
| if (fPrevState && !fPrevState->fPrimitiveProcessor.get() &&
|
| - fPrevState->fPipeline.isEqual(ss->fPipeline)) {
|
| + fPrevState->getPipeline()->isEqual(*ss->getPipeline())) {
|
| fCmdBuffer.pop_back();
|
| } else {
|
| this->closeBatch();
|
|
|