| Index: src/gpu/GrDrawTarget.cpp
|
| diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
|
| index bca347dbea6edf206e0a30b53def318c554cc13d..d6fbbc24fdb3d50f539db846e0c3003abfdb27ae 100644
|
| --- a/src/gpu/GrDrawTarget.cpp
|
| +++ b/src/gpu/GrDrawTarget.cpp
|
| @@ -50,43 +50,6 @@ GrDrawTarget::DrawInfo& GrDrawTarget::DrawInfo::operator =(const DrawInfo& di) {
|
| return *this;
|
| }
|
|
|
| -#ifdef SK_DEBUG
|
| -bool GrDrawTarget::DrawInfo::isInstanced() const {
|
| - if (fInstanceCount > 0) {
|
| - SkASSERT(0 == fIndexCount % fIndicesPerInstance);
|
| - SkASSERT(0 == fVertexCount % fVerticesPerInstance);
|
| - SkASSERT(fIndexCount / fIndicesPerInstance == fInstanceCount);
|
| - SkASSERT(fVertexCount / fVerticesPerInstance == fInstanceCount);
|
| - // there is no way to specify a non-zero start index to drawIndexedInstances().
|
| - SkASSERT(0 == fStartIndex);
|
| - return true;
|
| - } else {
|
| - SkASSERT(!fVerticesPerInstance);
|
| - SkASSERT(!fIndicesPerInstance);
|
| - return false;
|
| - }
|
| -}
|
| -#endif
|
| -
|
| -void GrDrawTarget::DrawInfo::adjustInstanceCount(int instanceOffset) {
|
| - SkASSERT(this->isInstanced());
|
| - SkASSERT(instanceOffset + fInstanceCount >= 0);
|
| - fInstanceCount += instanceOffset;
|
| - fVertexCount = fVerticesPerInstance * fInstanceCount;
|
| - fIndexCount = fIndicesPerInstance * fInstanceCount;
|
| -}
|
| -
|
| -void GrDrawTarget::DrawInfo::adjustStartVertex(int vertexOffset) {
|
| - fStartVertex += vertexOffset;
|
| - SkASSERT(fStartVertex >= 0);
|
| -}
|
| -
|
| -void GrDrawTarget::DrawInfo::adjustStartIndex(int indexOffset) {
|
| - SkASSERT(this->isIndexed());
|
| - fStartIndex += indexOffset;
|
| - SkASSERT(fStartIndex >= 0);
|
| -}
|
| -
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| #define DEBUG_INVAL_BUFFER 0xdeadcafe
|
| @@ -96,288 +59,10 @@ GrDrawTarget::GrDrawTarget(GrContext* context)
|
| : fContext(context)
|
| , fGpuTraceMarkerCount(0) {
|
| SkASSERT(context);
|
| - GeometrySrcState& geoSrc = fGeoSrcStateStack.push_back();
|
| -#ifdef SK_DEBUG
|
| - geoSrc.fVertexCount = DEBUG_INVAL_START_IDX;
|
| - geoSrc.fVertexBuffer = (GrVertexBuffer*)DEBUG_INVAL_BUFFER;
|
| - geoSrc.fIndexCount = DEBUG_INVAL_START_IDX;
|
| - geoSrc.fIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER;
|
| -#endif
|
| - geoSrc.fVertexSrc = kNone_GeometrySrcType;
|
| - geoSrc.fIndexSrc = kNone_GeometrySrcType;
|
| -}
|
| -
|
| -GrDrawTarget::~GrDrawTarget() {
|
| - SkASSERT(1 == fGeoSrcStateStack.count());
|
| - SkDEBUGCODE(GeometrySrcState& geoSrc = fGeoSrcStateStack.back());
|
| - SkASSERT(kNone_GeometrySrcType == geoSrc.fIndexSrc);
|
| - SkASSERT(kNone_GeometrySrcType == geoSrc.fVertexSrc);
|
| -}
|
| -
|
| -void GrDrawTarget::releaseGeometry() {
|
| - int popCnt = fGeoSrcStateStack.count() - 1;
|
| - while (popCnt) {
|
| - this->popGeometrySource();
|
| - --popCnt;
|
| - }
|
| - this->resetVertexSource();
|
| - this->resetIndexSource();
|
| -}
|
| -
|
| -bool GrDrawTarget::reserveVertexSpace(size_t vertexSize,
|
| - int vertexCount,
|
| - void** vertices) {
|
| - GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
|
| - bool acquired = false;
|
| - if (vertexCount > 0) {
|
| - SkASSERT(vertices);
|
| - this->releasePreviousVertexSource();
|
| - geoSrc.fVertexSrc = kNone_GeometrySrcType;
|
| -
|
| - acquired = this->onReserveVertexSpace(vertexSize,
|
| - vertexCount,
|
| - vertices);
|
| - }
|
| - if (acquired) {
|
| - geoSrc.fVertexSrc = kReserved_GeometrySrcType;
|
| - geoSrc.fVertexCount = vertexCount;
|
| - geoSrc.fVertexSize = vertexSize;
|
| - } else if (vertices) {
|
| - *vertices = NULL;
|
| - }
|
| - return acquired;
|
| -}
|
| -
|
| -bool GrDrawTarget::reserveIndexSpace(int indexCount,
|
| - void** indices) {
|
| - GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
|
| - bool acquired = false;
|
| - if (indexCount > 0) {
|
| - SkASSERT(indices);
|
| - this->releasePreviousIndexSource();
|
| - geoSrc.fIndexSrc = kNone_GeometrySrcType;
|
| -
|
| - acquired = this->onReserveIndexSpace(indexCount, indices);
|
| - }
|
| - if (acquired) {
|
| - geoSrc.fIndexSrc = kReserved_GeometrySrcType;
|
| - geoSrc.fIndexCount = indexCount;
|
| - } else if (indices) {
|
| - *indices = NULL;
|
| - }
|
| - return acquired;
|
| -
|
| -}
|
| -
|
| -bool GrDrawTarget::reserveVertexAndIndexSpace(int vertexCount,
|
| - size_t vertexStride,
|
| - int indexCount,
|
| - void** vertices,
|
| - void** indices) {
|
| - this->willReserveVertexAndIndexSpace(vertexCount, vertexStride, indexCount);
|
| - if (vertexCount) {
|
| - if (!this->reserveVertexSpace(vertexStride, vertexCount, vertices)) {
|
| - if (indexCount) {
|
| - this->resetIndexSource();
|
| - }
|
| - return false;
|
| - }
|
| - }
|
| - if (indexCount) {
|
| - if (!this->reserveIndexSpace(indexCount, indices)) {
|
| - if (vertexCount) {
|
| - this->resetVertexSource();
|
| - }
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool GrDrawTarget::geometryHints(size_t vertexStride,
|
| - int32_t* vertexCount,
|
| - int32_t* indexCount) const {
|
| - if (vertexCount) {
|
| - *vertexCount = -1;
|
| - }
|
| - if (indexCount) {
|
| - *indexCount = -1;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void GrDrawTarget::releasePreviousVertexSource() {
|
| - GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
|
| - switch (geoSrc.fVertexSrc) {
|
| - case kNone_GeometrySrcType:
|
| - break;
|
| - case kReserved_GeometrySrcType:
|
| - this->releaseReservedVertexSpace();
|
| - break;
|
| - case kBuffer_GeometrySrcType:
|
| - geoSrc.fVertexBuffer->unref();
|
| -#ifdef SK_DEBUG
|
| - geoSrc.fVertexBuffer = (GrVertexBuffer*)DEBUG_INVAL_BUFFER;
|
| -#endif
|
| - break;
|
| - default:
|
| - SkFAIL("Unknown Vertex Source Type.");
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void GrDrawTarget::releasePreviousIndexSource() {
|
| - GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
|
| - switch (geoSrc.fIndexSrc) {
|
| - case kNone_GeometrySrcType: // these two don't require
|
| - break;
|
| - case kReserved_GeometrySrcType:
|
| - this->releaseReservedIndexSpace();
|
| - break;
|
| - case kBuffer_GeometrySrcType:
|
| - geoSrc.fIndexBuffer->unref();
|
| -#ifdef SK_DEBUG
|
| - geoSrc.fIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER;
|
| -#endif
|
| - break;
|
| - default:
|
| - SkFAIL("Unknown Index Source Type.");
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void GrDrawTarget::setVertexSourceToBuffer(const GrVertexBuffer* buffer, size_t vertexStride) {
|
| - this->releasePreviousVertexSource();
|
| - GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
|
| - geoSrc.fVertexSrc = kBuffer_GeometrySrcType;
|
| - geoSrc.fVertexBuffer = buffer;
|
| - buffer->ref();
|
| - geoSrc.fVertexSize = vertexStride;
|
| -}
|
| -
|
| -void GrDrawTarget::setIndexSourceToBuffer(const GrIndexBuffer* buffer) {
|
| - this->releasePreviousIndexSource();
|
| - GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
|
| - geoSrc.fIndexSrc = kBuffer_GeometrySrcType;
|
| - geoSrc.fIndexBuffer = buffer;
|
| - buffer->ref();
|
| -}
|
| -
|
| -void GrDrawTarget::resetVertexSource() {
|
| - this->releasePreviousVertexSource();
|
| - GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
|
| - geoSrc.fVertexSrc = kNone_GeometrySrcType;
|
| -}
|
| -
|
| -void GrDrawTarget::resetIndexSource() {
|
| - this->releasePreviousIndexSource();
|
| - GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
|
| - geoSrc.fIndexSrc = kNone_GeometrySrcType;
|
| -}
|
| -
|
| -void GrDrawTarget::pushGeometrySource() {
|
| - this->geometrySourceWillPush();
|
| - GeometrySrcState& newState = fGeoSrcStateStack.push_back();
|
| - newState.fIndexSrc = kNone_GeometrySrcType;
|
| - newState.fVertexSrc = kNone_GeometrySrcType;
|
| -#ifdef SK_DEBUG
|
| - newState.fVertexCount = ~0;
|
| - newState.fVertexBuffer = (GrVertexBuffer*)~0;
|
| - newState.fIndexCount = ~0;
|
| - newState.fIndexBuffer = (GrIndexBuffer*)~0;
|
| -#endif
|
| -}
|
| -
|
| -void GrDrawTarget::popGeometrySource() {
|
| - // if popping last element then pops are unbalanced with pushes
|
| - SkASSERT(fGeoSrcStateStack.count() > 1);
|
| -
|
| - this->geometrySourceWillPop(fGeoSrcStateStack.fromBack(1));
|
| - this->releasePreviousVertexSource();
|
| - this->releasePreviousIndexSource();
|
| - fGeoSrcStateStack.pop_back();
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -bool GrDrawTarget::checkDraw(const GrPipelineBuilder& pipelineBuilder,
|
| - const GrGeometryProcessor* gp,
|
| - GrPrimitiveType type,
|
| - int startVertex,
|
| - int startIndex,
|
| - int vertexCount,
|
| - int indexCount) const {
|
| -#ifdef SK_DEBUG
|
| - const GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
|
| - int maxVertex = startVertex + vertexCount;
|
| - int maxValidVertex;
|
| - switch (geoSrc.fVertexSrc) {
|
| - case kNone_GeometrySrcType:
|
| - SkFAIL("Attempting to draw without vertex src.");
|
| - case kReserved_GeometrySrcType: // fallthrough
|
| - maxValidVertex = geoSrc.fVertexCount;
|
| - break;
|
| - case kBuffer_GeometrySrcType:
|
| - maxValidVertex = static_cast<int>(geoSrc.fVertexBuffer->gpuMemorySize() /
|
| - geoSrc.fVertexSize);
|
| - break;
|
| - }
|
| - if (maxVertex > maxValidVertex) {
|
| - SkFAIL("Drawing outside valid vertex range.");
|
| - }
|
| - if (indexCount > 0) {
|
| - int maxIndex = startIndex + indexCount;
|
| - int maxValidIndex;
|
| - switch (geoSrc.fIndexSrc) {
|
| - case kNone_GeometrySrcType:
|
| - SkFAIL("Attempting to draw indexed geom without index src.");
|
| - case kReserved_GeometrySrcType: // fallthrough
|
| - maxValidIndex = geoSrc.fIndexCount;
|
| - break;
|
| - case kBuffer_GeometrySrcType:
|
| - maxValidIndex = static_cast<int>(geoSrc.fIndexBuffer->gpuMemorySize() /
|
| - sizeof(uint16_t));
|
| - break;
|
| - }
|
| - if (maxIndex > maxValidIndex) {
|
| - SkFAIL("Index reads outside valid index range.");
|
| - }
|
| - }
|
| -
|
| - SkASSERT(pipelineBuilder.getRenderTarget());
|
| -
|
| - if (gp) {
|
| - int numTextures = gp->numTextures();
|
| - for (int t = 0; t < numTextures; ++t) {
|
| - GrTexture* texture = gp->texture(t);
|
| - SkASSERT(texture->asRenderTarget() != pipelineBuilder.getRenderTarget());
|
| - }
|
| - }
|
| -
|
| - for (int s = 0; s < pipelineBuilder.numColorFragmentStages(); ++s) {
|
| - const GrProcessor* effect = pipelineBuilder.getColorFragmentStage(s).processor();
|
| - int numTextures = effect->numTextures();
|
| - for (int t = 0; t < numTextures; ++t) {
|
| - GrTexture* texture = effect->texture(t);
|
| - SkASSERT(texture->asRenderTarget() != pipelineBuilder.getRenderTarget());
|
| - }
|
| - }
|
| - for (int s = 0; s < pipelineBuilder.numCoverageFragmentStages(); ++s) {
|
| - const GrProcessor* effect = pipelineBuilder.getCoverageFragmentStage(s).processor();
|
| - int numTextures = effect->numTextures();
|
| - for (int t = 0; t < numTextures; ++t) {
|
| - GrTexture* texture = effect->texture(t);
|
| - SkASSERT(texture->asRenderTarget() != pipelineBuilder.getRenderTarget());
|
| - }
|
| - }
|
| -
|
| -#endif
|
| - if (NULL == pipelineBuilder.getRenderTarget()) {
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuilder,
|
| const GrProcOptInfo& colorPOI,
|
| const GrProcOptInfo& coveragePOI,
|
| @@ -429,100 +114,6 @@ bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuil
|
| }
|
| }
|
|
|
| -void GrDrawTarget::drawIndexed(GrPipelineBuilder* pipelineBuilder,
|
| - const GrGeometryProcessor* gp,
|
| - GrPrimitiveType type,
|
| - int startVertex,
|
| - int startIndex,
|
| - int vertexCount,
|
| - int indexCount,
|
| - const SkRect* devBounds) {
|
| - SkASSERT(pipelineBuilder);
|
| - if (indexCount > 0 &&
|
| - this->checkDraw(*pipelineBuilder, gp, type, startVertex, startIndex, vertexCount,
|
| - indexCount)) {
|
| -
|
| - // Setup clip
|
| - GrScissorState scissorState;
|
| - GrPipelineBuilder::AutoRestoreFragmentProcessors arfp;
|
| - GrPipelineBuilder::AutoRestoreStencil ars;
|
| - if (!this->setupClip(pipelineBuilder, &arfp, &ars, &scissorState, devBounds)) {
|
| - return;
|
| - }
|
| -
|
| - DrawInfo info;
|
| - info.fPrimitiveType = type;
|
| - info.fStartVertex = startVertex;
|
| - info.fStartIndex = startIndex;
|
| - info.fVertexCount = vertexCount;
|
| - info.fIndexCount = indexCount;
|
| -
|
| - info.fInstanceCount = 0;
|
| - info.fVerticesPerInstance = 0;
|
| - info.fIndicesPerInstance = 0;
|
| -
|
| - if (devBounds) {
|
| - info.setDevBounds(*devBounds);
|
| - }
|
| -
|
| - GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, gp, devBounds,
|
| - this);
|
| - if (pipelineInfo.mustSkipDraw()) {
|
| - return;
|
| - }
|
| -
|
| - this->setDrawBuffers(&info, gp->getVertexStride());
|
| -
|
| - this->onDraw(gp, info, pipelineInfo);
|
| - }
|
| -}
|
| -
|
| -void GrDrawTarget::drawNonIndexed(GrPipelineBuilder* pipelineBuilder,
|
| - const GrGeometryProcessor* gp,
|
| - GrPrimitiveType type,
|
| - int startVertex,
|
| - int vertexCount,
|
| - const SkRect* devBounds) {
|
| - SkASSERT(pipelineBuilder);
|
| - if (vertexCount > 0 && this->checkDraw(*pipelineBuilder, gp, type, startVertex, -1, vertexCount,
|
| - -1)) {
|
| -
|
| - // Setup clip
|
| - GrScissorState scissorState;
|
| - GrPipelineBuilder::AutoRestoreFragmentProcessors arfp;
|
| - GrPipelineBuilder::AutoRestoreStencil ars;
|
| - if (!this->setupClip(pipelineBuilder, &arfp, &ars, &scissorState, devBounds)) {
|
| - return;
|
| - }
|
| -
|
| - DrawInfo info;
|
| - info.fPrimitiveType = type;
|
| - info.fStartVertex = startVertex;
|
| - info.fStartIndex = 0;
|
| - info.fVertexCount = vertexCount;
|
| - info.fIndexCount = 0;
|
| -
|
| - info.fInstanceCount = 0;
|
| - info.fVerticesPerInstance = 0;
|
| - info.fIndicesPerInstance = 0;
|
| -
|
| - if (devBounds) {
|
| - info.setDevBounds(*devBounds);
|
| - }
|
| -
|
| - GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, gp, devBounds,
|
| - this);
|
| - if (pipelineInfo.mustSkipDraw()) {
|
| - return;
|
| - }
|
| -
|
| - this->setDrawBuffers(&info, gp->getVertexStride());
|
| -
|
| - this->onDraw(gp, info, pipelineInfo);
|
| - }
|
| -}
|
| -
|
| -
|
| void GrDrawTarget::drawBatch(GrPipelineBuilder* pipelineBuilder,
|
| GrBatch* batch,
|
| const SkRect* devBounds) {
|
| @@ -750,126 +341,6 @@ void GrDrawTarget::removeGpuTraceMarker(const GrGpuTraceMarker* marker) {
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -void GrDrawTarget::drawIndexedInstances(GrPipelineBuilder* pipelineBuilder,
|
| - const GrGeometryProcessor* gp,
|
| - GrPrimitiveType type,
|
| - int instanceCount,
|
| - int verticesPerInstance,
|
| - int indicesPerInstance,
|
| - const SkRect* devBounds) {
|
| - SkASSERT(pipelineBuilder);
|
| -
|
| - if (!verticesPerInstance || !indicesPerInstance) {
|
| - return;
|
| - }
|
| -
|
| - int maxInstancesPerDraw = this->indexCountInCurrentSource() / indicesPerInstance;
|
| - if (!maxInstancesPerDraw) {
|
| - return;
|
| - }
|
| -
|
| - // Setup clip
|
| - GrScissorState scissorState;
|
| - GrPipelineBuilder::AutoRestoreFragmentProcessors arfp;
|
| - GrPipelineBuilder::AutoRestoreStencil ars;
|
| - if (!this->setupClip(pipelineBuilder, &arfp, &ars, &scissorState, devBounds)) {
|
| - return;
|
| - }
|
| -
|
| - DrawInfo info;
|
| - info.fPrimitiveType = type;
|
| - info.fStartIndex = 0;
|
| - info.fStartVertex = 0;
|
| - info.fIndicesPerInstance = indicesPerInstance;
|
| - info.fVerticesPerInstance = verticesPerInstance;
|
| -
|
| - // Set the same bounds for all the draws.
|
| - if (devBounds) {
|
| - info.setDevBounds(*devBounds);
|
| - }
|
| -
|
| - while (instanceCount) {
|
| - info.fInstanceCount = SkTMin(instanceCount, maxInstancesPerDraw);
|
| - info.fVertexCount = info.fInstanceCount * verticesPerInstance;
|
| - info.fIndexCount = info.fInstanceCount * indicesPerInstance;
|
| -
|
| - if (this->checkDraw(*pipelineBuilder,
|
| - gp,
|
| - type,
|
| - info.fStartVertex,
|
| - info.fStartIndex,
|
| - info.fVertexCount,
|
| - info.fIndexCount)) {
|
| -
|
| - GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, gp, devBounds,
|
| - this);
|
| - if (pipelineInfo.mustSkipDraw()) {
|
| - return;
|
| - }
|
| -
|
| - this->setDrawBuffers(&info, gp->getVertexStride());
|
| - this->onDraw(gp, info, pipelineInfo);
|
| - }
|
| - info.fStartVertex += info.fVertexCount;
|
| - instanceCount -= info.fInstanceCount;
|
| - }
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -GrDrawTarget::AutoReleaseGeometry::AutoReleaseGeometry(
|
| - GrDrawTarget* target,
|
| - int vertexCount,
|
| - size_t vertexStride,
|
| - int indexCount) {
|
| - fTarget = NULL;
|
| - this->set(target, vertexCount, vertexStride, indexCount);
|
| -}
|
| -
|
| -GrDrawTarget::AutoReleaseGeometry::AutoReleaseGeometry() {
|
| - fTarget = NULL;
|
| -}
|
| -
|
| -GrDrawTarget::AutoReleaseGeometry::~AutoReleaseGeometry() {
|
| - this->reset();
|
| -}
|
| -
|
| -bool GrDrawTarget::AutoReleaseGeometry::set(GrDrawTarget* target,
|
| - int vertexCount,
|
| - size_t vertexStride,
|
| - int indexCount) {
|
| - this->reset();
|
| - fTarget = target;
|
| - bool success = true;
|
| - if (fTarget) {
|
| - success = target->reserveVertexAndIndexSpace(vertexCount,
|
| - vertexStride,
|
| - indexCount,
|
| - &fVertices,
|
| - &fIndices);
|
| - if (!success) {
|
| - fTarget = NULL;
|
| - this->reset();
|
| - }
|
| - }
|
| - SkASSERT(success == SkToBool(fTarget));
|
| - return success;
|
| -}
|
| -
|
| -void GrDrawTarget::AutoReleaseGeometry::reset() {
|
| - if (fTarget) {
|
| - if (fVertices) {
|
| - fTarget->resetVertexSource();
|
| - }
|
| - if (fIndices) {
|
| - fTarget->resetIndexSource();
|
| - }
|
| - fTarget = NULL;
|
| - }
|
| - fVertices = NULL;
|
| - fIndices = NULL;
|
| -}
|
| -
|
| namespace {
|
| // returns true if the read/written rect intersects the src/dst and false if not.
|
| bool clip_srcrect_and_dstpoint(const GrSurface* dst,
|
|
|