Index: src/gpu/GrGpu.cpp |
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp |
index 2a1f5b6331d79327eb72b12be4b276b13dfe389f..47863bb6fcf56848248b56f8e8816a00eceecd57 100644 |
--- a/src/gpu/GrGpu.cpp |
+++ b/src/gpu/GrGpu.cpp |
@@ -28,15 +28,18 @@ static const int INDEX_POOL_IB_COUNT = 4; |
#define DEBUG_INVAL_START_IDX -1 |
GrGpu::GrGpu(GrContext* context) |
- : INHERITED(context) |
- , fResetTimestamp(kExpiredTimestamp+1) |
+ : fResetTimestamp(kExpiredTimestamp+1) |
, fResetBits(kAll_GrBackendState) |
, fVertexPool(NULL) |
, fIndexPool(NULL) |
, fVertexPoolUseCnt(0) |
, fIndexPoolUseCnt(0) |
- , fQuadIndexBuffer(NULL) { |
+ , fQuadIndexBuffer(NULL) |
+ , fContext(context) { |
fGeomPoolStateStack.push_back(); |
+ fDrawState = &fDefaultDrawState; |
+ // We assume that fDrawState always owns a ref to the object it points at. |
+ fDefaultDrawState.ref(); |
#ifdef SK_DEBUG |
GeometryPoolState& poolState = fGeomPoolStateStack.back(); |
poolState.fPoolVertexBuffer = (GrVertexBuffer*)DEBUG_INVAL_BUFFER; |
@@ -44,6 +47,16 @@ GrGpu::GrGpu(GrContext* context) |
poolState.fPoolIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER; |
poolState.fPoolStartIndex = DEBUG_INVAL_START_IDX; |
#endif |
+ |
+ GrDrawTarget::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 = GrDrawTarget::kNone_GeometrySrcType; |
+ geoSrc.fIndexSrc = GrDrawTarget::kNone_GeometrySrcType; |
} |
GrGpu::~GrGpu() { |
@@ -52,6 +65,11 @@ GrGpu::~GrGpu() { |
fVertexPool = NULL; |
delete fIndexPool; |
fIndexPool = NULL; |
+ SkASSERT(1 == fGeoSrcStateStack.count()); |
+ SkDEBUGCODE(GrDrawTarget::GeometrySrcState& geoSrc = fGeoSrcStateStack.back()); |
+ SkASSERT(GrDrawTarget::kNone_GeometrySrcType == geoSrc.fIndexSrc); |
+ SkASSERT(GrDrawTarget::kNone_GeometrySrcType == geoSrc.fVertexSrc); |
+ SkSafeUnref(fDrawState); |
} |
void GrGpu::contextAbandoned() {} |
@@ -194,10 +212,10 @@ GrIndexBuffer* GrGpu::createInstancedIndexBuffer(const uint16_t* pattern, |
return buffer; |
} |
-void GrGpu::onClear(const SkIRect* rect, |
- GrColor color, |
- bool canIgnoreRect, |
- GrRenderTarget* renderTarget) { |
+void GrGpu::clear(const SkIRect* rect, |
+ GrColor color, |
+ bool canIgnoreRect, |
+ GrRenderTarget* renderTarget) { |
SkASSERT(renderTarget); |
this->handleDirtyContext(); |
this->onGpuClear(renderTarget, rect, color, canIgnoreRect); |
@@ -241,6 +259,118 @@ void GrGpu::resolveRenderTarget(GrRenderTarget* target) { |
this->onResolveRenderTarget(target); |
} |
+void GrGpu::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc) { |
+ // Make the dst of the copy be a render target because the default copySurface draws to the dst. |
+ desc->fOrigin = kDefault_GrSurfaceOrigin; |
+ desc->fFlags = kRenderTarget_GrSurfaceFlag | kNoStencil_GrSurfaceFlag; |
+ desc->fConfig = src->config(); |
+} |
+ |
+typedef GrTraceMarkerSet::Iter TMIter; |
+void GrGpu::saveActiveTraceMarkers() { |
+ if (this->caps()->gpuTracingSupport()) { |
+ SkASSERT(0 == fStoredTraceMarkers.count()); |
+ fStoredTraceMarkers.addSet(fActiveTraceMarkers); |
+ for (TMIter iter = fStoredTraceMarkers.begin(); iter != fStoredTraceMarkers.end(); ++iter) { |
+ this->removeGpuTraceMarker(&(*iter)); |
+ } |
+ } |
+} |
+ |
+void GrGpu::restoreActiveTraceMarkers() { |
+ if (this->caps()->gpuTracingSupport()) { |
+ SkASSERT(0 == fActiveTraceMarkers.count()); |
+ for (TMIter iter = fStoredTraceMarkers.begin(); iter != fStoredTraceMarkers.end(); ++iter) { |
+ this->addGpuTraceMarker(&(*iter)); |
+ } |
+ for (TMIter iter = fActiveTraceMarkers.begin(); iter != fActiveTraceMarkers.end(); ++iter) { |
+ this->fStoredTraceMarkers.remove(*iter); |
+ } |
+ } |
+} |
+ |
+void GrGpu::addGpuTraceMarker(const GrGpuTraceMarker* marker) { |
+ if (this->caps()->gpuTracingSupport()) { |
+ SkASSERT(fGpuTraceMarkerCount >= 0); |
+ this->fActiveTraceMarkers.add(*marker); |
+ this->didAddGpuTraceMarker(); |
+ ++fGpuTraceMarkerCount; |
+ } |
+} |
+ |
+void GrGpu::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { |
+ if (this->caps()->gpuTracingSupport()) { |
+ SkASSERT(fGpuTraceMarkerCount >= 1); |
+ this->fActiveTraceMarkers.remove(*marker); |
+ this->didRemoveGpuTraceMarker(); |
+ --fGpuTraceMarkerCount; |
+ } |
+} |
+ |
+void GrGpu::setVertexSourceToBuffer(const GrVertexBuffer* buffer) { |
+ this->releasePreviousVertexSource(); |
+ GrDrawTarget::GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); |
+ geoSrc.fVertexSrc = GrDrawTarget::kBuffer_GeometrySrcType; |
+ geoSrc.fVertexBuffer = buffer; |
+ buffer->ref(); |
+ geoSrc.fVertexSize = this->drawState()->getVertexStride(); |
+} |
+ |
+void GrGpu::setIndexSourceToBuffer(const GrIndexBuffer* buffer) { |
+ this->releasePreviousIndexSource(); |
+ GrDrawTarget::GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); |
+ geoSrc.fIndexSrc = GrDrawTarget::kBuffer_GeometrySrcType; |
+ geoSrc.fIndexBuffer = buffer; |
+ buffer->ref(); |
+} |
+ |
+void GrGpu::setDrawState(GrDrawState* drawState) { |
+ SkASSERT(fDrawState); |
+ if (NULL == drawState) { |
+ drawState = &fDefaultDrawState; |
+ } |
+ if (fDrawState != drawState) { |
+ fDrawState->unref(); |
+ drawState->ref(); |
+ fDrawState = drawState; |
+ } |
+} |
+ |
+void GrGpu::resetVertexSource() { |
+ this->releasePreviousVertexSource(); |
+ GrDrawTarget::GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); |
+ geoSrc.fVertexSrc = GrDrawTarget::kNone_GeometrySrcType; |
+} |
+ |
+void GrGpu::resetIndexSource() { |
+ this->releasePreviousIndexSource(); |
+ GrDrawTarget::GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); |
+ geoSrc.fIndexSrc = GrDrawTarget::kNone_GeometrySrcType; |
+} |
+ |
+void GrGpu::pushGeometrySource() { |
+ this->geometrySourceWillPush(); |
+ GrDrawTarget::GeometrySrcState& newState = fGeoSrcStateStack.push_back(); |
+ newState.fIndexSrc = GrDrawTarget::kNone_GeometrySrcType; |
+ newState.fVertexSrc = GrDrawTarget::kNone_GeometrySrcType; |
+#ifdef SK_DEBUG |
+ newState.fVertexCount = ~0; |
+ newState.fVertexBuffer = (GrVertexBuffer*)~0; |
+ newState.fIndexCount = ~0; |
+ newState.fIndexBuffer = (GrIndexBuffer*)~0; |
+#endif |
+} |
+ |
+void GrGpu::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(); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
static const int MAX_QUADS = 1 << 12; // max possible: (1 << 14) - 1; |
@@ -267,11 +397,11 @@ const GrIndexBuffer* GrGpu::getQuadIndexBuffer() const { |
//////////////////////////////////////////////////////////////////////////////// |
void GrGpu::geometrySourceWillPush() { |
- const GeometrySrcState& geoSrc = this->getGeomSrc(); |
- if (kReserved_GeometrySrcType == geoSrc.fVertexSrc) { |
+ const GrDrawTarget::GeometrySrcState& geoSrc = this->getGeomSrc(); |
+ if (GrDrawTarget::kReserved_GeometrySrcType == geoSrc.fVertexSrc) { |
this->finalizeReservedVertices(); |
} |
- if (kReserved_GeometrySrcType == geoSrc.fIndexSrc) { |
+ if (GrDrawTarget::kReserved_GeometrySrcType == geoSrc.fIndexSrc) { |
this->finalizeReservedIndices(); |
} |
GeometryPoolState& newState = fGeomPoolStateStack.push_back(); |
@@ -285,13 +415,14 @@ void GrGpu::geometrySourceWillPush() { |
#endif |
} |
-void GrGpu::geometrySourceWillPop(const GeometrySrcState& restoredState) { |
+void GrGpu::geometrySourceWillPop(const GrDrawTarget::GeometrySrcState& restoredState) { |
// if popping last entry then pops are unbalanced with pushes |
SkASSERT(fGeomPoolStateStack.count() > 1); |
fGeomPoolStateStack.pop_back(); |
} |
-void GrGpu::onDraw(const DrawInfo& info, const GrClipMaskManager::ScissorState& scissorState) { |
+void GrGpu::onDraw(const GrDrawTarget::DrawInfo& info, |
+ const GrClipMaskManager::ScissorState& scissorState) { |
this->handleDirtyContext(); |
if (!this->flushGraphicsState(PrimTypeToDrawType(info.primitiveType()), |
scissorState, |
@@ -320,8 +451,6 @@ void GrGpu::onDrawPath(const GrPath* path, |
const GrDeviceCoordTexture* dstCopy) { |
this->handleDirtyContext(); |
- drawState()->setDefaultVertexAttribs(); |
- |
if (!this->flushGraphicsState(kDrawPath_DrawType, scissorState, dstCopy)) { |
return; |
} |
@@ -333,14 +462,12 @@ void GrGpu::onDrawPaths(const GrPathRange* pathRange, |
const uint32_t indices[], |
int count, |
const float transforms[], |
- PathTransformType transformsType, |
+ GrDrawTarget::PathTransformType transformsType, |
const GrClipMaskManager::ScissorState& scissorState, |
const GrStencilSettings& stencilSettings, |
const GrDeviceCoordTexture* dstCopy) { |
this->handleDirtyContext(); |
- drawState()->setDefaultVertexAttribs(); |
- |
if (!this->flushGraphicsState(kDrawPaths_DrawType, scissorState, dstCopy)) { |
return; |
} |
@@ -426,17 +553,67 @@ bool GrGpu::onReserveIndexSpace(int indexCount, void** indices) { |
} |
void GrGpu::releaseReservedVertexSpace() { |
- const GeometrySrcState& geoSrc = this->getGeomSrc(); |
- SkASSERT(kReserved_GeometrySrcType == geoSrc.fVertexSrc); |
+ const GrDrawTarget::GeometrySrcState& geoSrc = this->getGeomSrc(); |
+ SkASSERT(GrDrawTarget::kReserved_GeometrySrcType == geoSrc.fVertexSrc); |
size_t bytes = geoSrc.fVertexCount * geoSrc.fVertexSize; |
fVertexPool->putBack(bytes); |
--fVertexPoolUseCnt; |
} |
void GrGpu::releaseReservedIndexSpace() { |
- const GeometrySrcState& geoSrc = this->getGeomSrc(); |
- SkASSERT(kReserved_GeometrySrcType == geoSrc.fIndexSrc); |
+ const GrDrawTarget::GeometrySrcState& geoSrc = this->getGeomSrc(); |
+ SkASSERT(GrDrawTarget::kReserved_GeometrySrcType == geoSrc.fIndexSrc); |
size_t bytes = geoSrc.fIndexCount * sizeof(uint16_t); |
fIndexPool->putBack(bytes); |
--fIndexPoolUseCnt; |
} |
+ |
+void GrGpu::releasePreviousVertexSource() { |
+ GrDrawTarget::GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); |
+ switch (geoSrc.fVertexSrc) { |
+ case GrDrawTarget::kNone_GeometrySrcType: |
+ break; |
+ case GrDrawTarget::kReserved_GeometrySrcType: |
+ this->releaseReservedVertexSpace(); |
+ break; |
+ case GrDrawTarget::kBuffer_GeometrySrcType: |
+ geoSrc.fVertexBuffer->unref(); |
+#ifdef SK_DEBUG |
+ geoSrc.fVertexBuffer = (GrVertexBuffer*)DEBUG_INVAL_BUFFER; |
+#endif |
+ break; |
+ default: |
+ SkFAIL("Unknown Vertex Source Type."); |
+ break; |
+ } |
+} |
+ |
+void GrGpu::releasePreviousIndexSource() { |
+ GrDrawTarget::GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); |
+ switch (geoSrc.fIndexSrc) { |
+ case GrDrawTarget::kNone_GeometrySrcType: // these two don't require |
+ break; |
+ case GrDrawTarget::kReserved_GeometrySrcType: |
+ this->releaseReservedIndexSpace(); |
+ break; |
+ case GrDrawTarget::kBuffer_GeometrySrcType: |
+ geoSrc.fIndexBuffer->unref(); |
+#ifdef SK_DEBUG |
+ geoSrc.fIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER; |
+#endif |
+ break; |
+ default: |
+ SkFAIL("Unknown Index Source Type."); |
+ break; |
+ } |
+} |
+ |
+void GrGpu::releaseGeometry() { |
+ int popCnt = fGeoSrcStateStack.count() - 1; |
+ while (popCnt) { |
+ this->popGeometrySource(); |
+ --popCnt; |
+ } |
+ this->resetVertexSource(); |
+ this->resetIndexSource(); |
+} |