Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Unified Diff: src/gpu/GrGpu.cpp

Issue 707953004: cleaning up geometry handling in gpu (Closed) Base URL: https://skia.googlesource.com/skia.git@solo_gpu
Patch Set: rebase try 2 Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrGpu.h ('k') | src/gpu/GrInOrderDrawBuffer.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrGpu.cpp
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp
index 47863bb6fcf56848248b56f8e8816a00eceecd57..e9bf0001aa4ba8b128df5193bf3143f49fd0e580 100644
--- a/src/gpu/GrGpu.cpp
+++ b/src/gpu/GrGpu.cpp
@@ -16,12 +16,6 @@
#include "GrStencilBuffer.h"
#include "GrVertexBuffer.h"
-// probably makes no sense for this to be less than a page
-static const size_t VERTEX_POOL_VB_SIZE = 1 << 18;
-static const int VERTEX_POOL_VB_COUNT = 4;
-static const size_t INDEX_POOL_IB_SIZE = 1 << 16;
-static const int INDEX_POOL_IB_COUNT = 4;
-
////////////////////////////////////////////////////////////////////////////////
#define DEBUG_INVAL_BUFFER 0xdeadcafe
@@ -30,46 +24,18 @@ static const int INDEX_POOL_IB_COUNT = 4;
GrGpu::GrGpu(GrContext* context)
: fResetTimestamp(kExpiredTimestamp+1)
, fResetBits(kAll_GrBackendState)
- , fVertexPool(NULL)
- , fIndexPool(NULL)
- , fVertexPoolUseCnt(0)
- , fIndexPoolUseCnt(0)
, 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;
- poolState.fPoolStartVertex = DEBUG_INVAL_START_IDX;
- 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() {
SkSafeSetNull(fQuadIndexBuffer);
- delete fVertexPool;
- 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);
+ SkSafeUnref(fGeoSrcState.fVertexBuffer);
+ SkSafeUnref(fGeoSrcState.fIndexBuffer);
}
void GrGpu::contextAbandoned() {}
@@ -308,19 +274,15 @@ void GrGpu::removeGpuTraceMarker(const GrGpuTraceMarker* marker) {
}
void GrGpu::setVertexSourceToBuffer(const GrVertexBuffer* buffer) {
- this->releasePreviousVertexSource();
- GrDrawTarget::GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
- geoSrc.fVertexSrc = GrDrawTarget::kBuffer_GeometrySrcType;
- geoSrc.fVertexBuffer = buffer;
+ SkSafeUnref(fGeoSrcState.fVertexBuffer);
+ fGeoSrcState.fVertexBuffer = buffer;
buffer->ref();
- geoSrc.fVertexSize = this->drawState()->getVertexStride();
+ fGeoSrcState.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;
+ SkSafeUnref(fGeoSrcState.fIndexBuffer);
+ fGeoSrcState.fIndexBuffer = buffer;
buffer->ref();
}
@@ -336,41 +298,6 @@ void GrGpu::setDrawState(GrDrawState* 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;
@@ -396,31 +323,6 @@ const GrIndexBuffer* GrGpu::getQuadIndexBuffer() const {
////////////////////////////////////////////////////////////////////////////////
-void GrGpu::geometrySourceWillPush() {
- const GrDrawTarget::GeometrySrcState& geoSrc = this->getGeomSrc();
- if (GrDrawTarget::kReserved_GeometrySrcType == geoSrc.fVertexSrc) {
- this->finalizeReservedVertices();
- }
- if (GrDrawTarget::kReserved_GeometrySrcType == geoSrc.fIndexSrc) {
- this->finalizeReservedIndices();
- }
- GeometryPoolState& newState = fGeomPoolStateStack.push_back();
-#ifdef SK_DEBUG
- newState.fPoolVertexBuffer = (GrVertexBuffer*)DEBUG_INVAL_BUFFER;
- newState.fPoolStartVertex = DEBUG_INVAL_START_IDX;
- newState.fPoolIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER;
- newState.fPoolStartIndex = DEBUG_INVAL_START_IDX;
-#else
- (void) newState; // silence compiler warning
-#endif
-}
-
-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 GrDrawTarget::DrawInfo& info,
const GrClipMaskManager::ScissorState& scissorState) {
this->handleDirtyContext();
@@ -476,144 +378,3 @@ void GrGpu::onDrawPaths(const GrPathRange* pathRange,
this->pathRendering()->drawPaths(pathRange, indices, count, transforms, transformsType,
stencilSettings);
}
-
-void GrGpu::finalizeReservedVertices() {
- SkASSERT(fVertexPool);
- fVertexPool->unmap();
-}
-
-void GrGpu::finalizeReservedIndices() {
- SkASSERT(fIndexPool);
- fIndexPool->unmap();
-}
-
-void GrGpu::prepareVertexPool() {
- if (NULL == fVertexPool) {
- SkASSERT(0 == fVertexPoolUseCnt);
- fVertexPool = SkNEW_ARGS(GrVertexBufferAllocPool, (this, true,
- VERTEX_POOL_VB_SIZE,
- VERTEX_POOL_VB_COUNT));
- fVertexPool->releaseGpuRef();
- } else if (!fVertexPoolUseCnt) {
- // the client doesn't have valid data in the pool
- fVertexPool->reset();
- }
-}
-
-void GrGpu::prepareIndexPool() {
- if (NULL == fIndexPool) {
- SkASSERT(0 == fIndexPoolUseCnt);
- fIndexPool = SkNEW_ARGS(GrIndexBufferAllocPool, (this, true,
- INDEX_POOL_IB_SIZE,
- INDEX_POOL_IB_COUNT));
- fIndexPool->releaseGpuRef();
- } else if (!fIndexPoolUseCnt) {
- // the client doesn't have valid data in the pool
- fIndexPool->reset();
- }
-}
-
-bool GrGpu::onReserveVertexSpace(size_t vertexSize,
- int vertexCount,
- void** vertices) {
- GeometryPoolState& geomPoolState = fGeomPoolStateStack.back();
-
- SkASSERT(vertexCount > 0);
- SkASSERT(vertices);
-
- this->prepareVertexPool();
-
- *vertices = fVertexPool->makeSpace(vertexSize,
- vertexCount,
- &geomPoolState.fPoolVertexBuffer,
- &geomPoolState.fPoolStartVertex);
- if (NULL == *vertices) {
- return false;
- }
- ++fVertexPoolUseCnt;
- return true;
-}
-
-bool GrGpu::onReserveIndexSpace(int indexCount, void** indices) {
- GeometryPoolState& geomPoolState = fGeomPoolStateStack.back();
-
- SkASSERT(indexCount > 0);
- SkASSERT(indices);
-
- this->prepareIndexPool();
-
- *indices = fIndexPool->makeSpace(indexCount,
- &geomPoolState.fPoolIndexBuffer,
- &geomPoolState.fPoolStartIndex);
- if (NULL == *indices) {
- return false;
- }
- ++fIndexPoolUseCnt;
- return true;
-}
-
-void GrGpu::releaseReservedVertexSpace() {
- 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 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();
-}
« no previous file with comments | « src/gpu/GrGpu.h ('k') | src/gpu/GrInOrderDrawBuffer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698