1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */
7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrInOrderDrawBuffer.h"
9fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org
10e40d39725908d99d255496025411e5c9ca32663erobertphillipsGrInOrderDrawBuffer::GrInOrderDrawBuffer(GrContext* context)
11e40d39725908d99d255496025411e5c9ca32663erobertphillips    : INHERITED(context)
123b58d75170508567436cce259384d336949407d4joshualitt    , fCommands(GrCommandBuilder::Create(context->getGpu(), false))
139888b22fc9cd5d3260d2c3639aec20dc79915d37robertphillips    , fPathIndexBuffer(kPathIdxBufferMinReserve * sizeof(char)/4)
149888b22fc9cd5d3260d2c3639aec20dc79915d37robertphillips    , fPathTransformBuffer(kPathXformBufferMinReserve * sizeof(float)/4)
150911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    , fPipelineBuffer(kPipelineBufferMinReserve)
16dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    , fDrawID(0) {
17ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
18ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
19ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrInOrderDrawBuffer::~GrInOrderDrawBuffer() {
2086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    this->reset();
21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
22ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
234d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualittvoid GrInOrderDrawBuffer::onDrawBatch(GrBatch* batch,
24e36914cb205699526988127a827d1a76c9a98d39egdaniel                                      const PipelineInfo& pipelineInfo) {
250911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    State* state = this->setupPipelineAndShouldDraw(batch, pipelineInfo);
260911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    if (!state) {
270911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        return;
280911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    }
290911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
30e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrTargetCommands::Cmd* cmd = fCommands->recordDrawBatch(state, batch);
31dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    this->recordTraceMarkersIfNecessary(cmd);
32dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
33dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
348dd688b7569df569a672a8a67b2db86a9d376cfcegdanielvoid GrInOrderDrawBuffer::onStencilPath(const GrPipelineBuilder& pipelineBuilder,
3556995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt                                        const GrPathProcessor* pathProc,
369853ccef19c200be93a6211f32589fa82a53067cjoshualitt                                        const GrPath* path,
373e79124a69d4806f0a1a776090bff718e1b90970bsalomon                                        const GrScissorState& scissorState,
382c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt                                        const GrStencilSettings& stencilSettings) {
39e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrTargetCommands::Cmd* cmd = fCommands->recordStencilPath(pipelineBuilder,
40e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                              pathProc, path, scissorState,
41e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                              stencilSettings);
42dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    this->recordTraceMarkersIfNecessary(cmd);
43dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
44dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
45e36914cb205699526988127a827d1a76c9a98d39egdanielvoid GrInOrderDrawBuffer::onDrawPath(const GrPathProcessor* pathProc,
469853ccef19c200be93a6211f32589fa82a53067cjoshualitt                                     const GrPath* path,
472c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt                                     const GrStencilSettings& stencilSettings,
48e36914cb205699526988127a827d1a76c9a98d39egdaniel                                     const PipelineInfo& pipelineInfo) {
490911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    State* state = this->setupPipelineAndShouldDraw(pathProc, pipelineInfo);
500911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    if (!state) {
510911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        return;
520911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    }
53e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrTargetCommands::Cmd* cmd = fCommands->recordDrawPath(state, pathProc, path, stencilSettings);
54dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    this->recordTraceMarkersIfNecessary(cmd);
55dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
56dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
57e36914cb205699526988127a827d1a76c9a98d39egdanielvoid GrInOrderDrawBuffer::onDrawPaths(const GrPathProcessor* pathProc,
589853ccef19c200be93a6211f32589fa82a53067cjoshualitt                                      const GrPathRange* pathRange,
5955b24afc178e641e17a5664beba7ab2b4982c91acdalton                                      const void* indices,
6055b24afc178e641e17a5664beba7ab2b4982c91acdalton                                      PathIndexType indexType,
6155b24afc178e641e17a5664beba7ab2b4982c91acdalton                                      const float transformValues[],
6255b24afc178e641e17a5664beba7ab2b4982c91acdalton                                      PathTransformType transformType,
632c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt                                      int count,
642c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt                                      const GrStencilSettings& stencilSettings,
65e36914cb205699526988127a827d1a76c9a98d39egdaniel                                      const PipelineInfo& pipelineInfo) {
660911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    State* state = this->setupPipelineAndShouldDraw(pathProc, pipelineInfo);
670911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    if (!state) {
680911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        return;
690911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    }
70e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrTargetCommands::Cmd* cmd = fCommands->recordDrawPaths(state, this, pathProc, pathRange,
71e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                            indices, indexType, transformValues,
72e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                            transformType, count,
73e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                            stencilSettings, pipelineInfo);
74dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    this->recordTraceMarkersIfNecessary(cmd);
75dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
76dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
7763b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomonvoid GrInOrderDrawBuffer::onClear(const SkIRect* rect, GrColor color,
7863b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon                                  bool canIgnoreRect, GrRenderTarget* renderTarget) {
79e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrTargetCommands::Cmd* cmd = fCommands->recordClear(rect, color, canIgnoreRect, renderTarget);
80dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    this->recordTraceMarkersIfNecessary(cmd);
81dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
82dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
836db519c42471aaaa8a8e1a3ece314014481ab832joshualittvoid GrInOrderDrawBuffer::clearStencilClip(const SkIRect& rect,
846db519c42471aaaa8a8e1a3ece314014481ab832joshualitt                                           bool insideClip,
856db519c42471aaaa8a8e1a3ece314014481ab832joshualitt                                           GrRenderTarget* renderTarget) {
86e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrTargetCommands::Cmd* cmd = fCommands->recordClearStencilClip(rect, insideClip, renderTarget);
87dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    this->recordTraceMarkersIfNecessary(cmd);
88dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
89dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
9028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.orgvoid GrInOrderDrawBuffer::discard(GrRenderTarget* renderTarget) {
9128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org    if (!this->caps()->discardRenderTargetSupport()) {
9228361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org        return;
9328361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org    }
94dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
95e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrTargetCommands::Cmd* cmd = fCommands->recordDiscard(renderTarget);
96dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    this->recordTraceMarkersIfNecessary(cmd);
97dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
98dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
99371bcbcb9fa7f9acba265de9de5dd23f62a64a86bsalomonvoid GrInOrderDrawBuffer::onReset() {
100e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    fCommands->reset();
1019888b22fc9cd5d3260d2c3639aec20dc79915d37robertphillips    fPathIndexBuffer.rewind();
1029888b22fc9cd5d3260d2c3639aec20dc79915d37robertphillips    fPathTransformBuffer.rewind();
1032a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    fGpuCmdMarkers.reset();
1040911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
1050911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    fPrevState.reset(NULL);
1060911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    // Note, fPrevState points into fPipelineBuffer's allocation, so we have to reset first.
1070911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    // Furthermore, we have to reset fCommands before fPipelineBuffer too.
1080911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    if (fDrawID % kPipelineBufferHighWaterMark) {
1090911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        fPipelineBuffer.rewind();
1100911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    } else {
1110911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        fPipelineBuffer.reset();
1120911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    }
113dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
114dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
115371bcbcb9fa7f9acba265de9de5dd23f62a64a86bsalomonvoid GrInOrderDrawBuffer::onFlush() {
116e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    fCommands->flush(this);
117dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    ++fDrawID;
118dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
119dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
120a73239a0096370221d3dfababf339dd6d3fed84fbsalomonvoid GrInOrderDrawBuffer::onCopySurface(GrSurface* dst,
121f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                                        GrSurface* src,
122f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                                        const SkIRect& srcRect,
123f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                                        const SkIPoint& dstPoint) {
124a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    SkASSERT(this->getGpu()->canCopySurface(dst, src, srcRect, dstPoint));
125e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrTargetCommands::Cmd* cmd = fCommands->recordCopySurface(dst, src, srcRect, dstPoint);
126dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    this->recordTraceMarkersIfNecessary(cmd);
127dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips}
128dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
129dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillipsvoid GrInOrderDrawBuffer::recordTraceMarkersIfNecessary(GrTargetCommands::Cmd* cmd) {
1307f966f4cf8baee769d7b52dce1dd48e8512302e4robertphillips    if (!cmd) {
1317f966f4cf8baee769d7b52dce1dd48e8512302e4robertphillips        return;
1327f966f4cf8baee769d7b52dce1dd48e8512302e4robertphillips    }
1332a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers();
1342a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    if (activeTraceMarkers.count() > 0) {
1357f966f4cf8baee769d7b52dce1dd48e8512302e4robertphillips        if (cmd->isTraced()) {
136bca3c9fb2d5c043985b878633e9630cf12e04bd6robertphillips            fGpuCmdMarkers[cmd->markerID()].addSet(activeTraceMarkers);
1377f966f4cf8baee769d7b52dce1dd48e8512302e4robertphillips        } else {
138bca3c9fb2d5c043985b878633e9630cf12e04bd6robertphillips            cmd->setMarkerID(fGpuCmdMarkers.count());
1397f966f4cf8baee769d7b52dce1dd48e8512302e4robertphillips            fGpuCmdMarkers.push_back(activeTraceMarkers);
1407f966f4cf8baee769d7b52dce1dd48e8512302e4robertphillips        }
1412a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    }
1422a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org}
1430911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
1440911430dfb812a9341740bfabf1c86d14fb25af4joshualittGrTargetCommands::State*
1450911430dfb812a9341740bfabf1c86d14fb25af4joshualittGrInOrderDrawBuffer::setupPipelineAndShouldDraw(const GrPrimitiveProcessor* primProc,
1460911430dfb812a9341740bfabf1c86d14fb25af4joshualitt                                                const GrDrawTarget::PipelineInfo& pipelineInfo) {
1470911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    State* state = this->allocState(primProc);
1480911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    this->setupPipeline(pipelineInfo, state->pipelineLocation());
1490911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
1500911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    if (state->getPipeline()->mustSkip()) {
1510911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        this->unallocState(state);
1520911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        return NULL;
1530911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    }
1540911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
1550911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    state->fPrimitiveProcessor->initBatchTracker(&state->fBatchTracker,
1560911430dfb812a9341740bfabf1c86d14fb25af4joshualitt                                                 state->getPipeline()->getInitBatchTracker());
1570911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
1580911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    if (fPrevState && fPrevState->fPrimitiveProcessor.get() &&
1590911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker,
1600911430dfb812a9341740bfabf1c86d14fb25af4joshualitt                                                      *state->fPrimitiveProcessor,
1610911430dfb812a9341740bfabf1c86d14fb25af4joshualitt                                                      state->fBatchTracker) &&
1620911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        fPrevState->getPipeline()->isEqual(*state->getPipeline())) {
1630911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        this->unallocState(state);
1640911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    } else {
1650911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        fPrevState.reset(state);
1660911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    }
1670911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
168e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    this->recordTraceMarkersIfNecessary(
169e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt            fCommands->recordXferBarrierIfNecessary(*fPrevState->getPipeline(), *this->caps()));
1700911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    return fPrevState;
1710911430dfb812a9341740bfabf1c86d14fb25af4joshualitt}
1720911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
1730911430dfb812a9341740bfabf1c86d14fb25af4joshualittGrTargetCommands::State*
1740911430dfb812a9341740bfabf1c86d14fb25af4joshualittGrInOrderDrawBuffer::setupPipelineAndShouldDraw(GrBatch* batch,
1750911430dfb812a9341740bfabf1c86d14fb25af4joshualitt                                                const GrDrawTarget::PipelineInfo& pipelineInfo) {
1760911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    State* state = this->allocState();
1770911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    this->setupPipeline(pipelineInfo, state->pipelineLocation());
1780911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
1790911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    if (state->getPipeline()->mustSkip()) {
1800911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        this->unallocState(state);
1810911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        return NULL;
1820911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    }
1830911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
1840911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    batch->initBatchTracker(state->getPipeline()->getInitBatchTracker());
1850911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
1860911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    if (fPrevState && !fPrevState->fPrimitiveProcessor.get() &&
1870911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        fPrevState->getPipeline()->isEqual(*state->getPipeline())) {
1880911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        this->unallocState(state);
1890911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    } else {
1900911430dfb812a9341740bfabf1c86d14fb25af4joshualitt        fPrevState.reset(state);
1910911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    }
1920911430dfb812a9341740bfabf1c86d14fb25af4joshualitt
193e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    this->recordTraceMarkersIfNecessary(
194e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt            fCommands->recordXferBarrierIfNecessary(*fPrevState->getPipeline(), *this->caps()));
1950911430dfb812a9341740bfabf1c86d14fb25af4joshualitt    return fPrevState;
1960911430dfb812a9341740bfabf1c86d14fb25af4joshualitt}
197