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