Index: src/gpu/GrDrawTarget.cpp |
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp |
index d6fbbc24fdb3d50f539db846e0c3003abfdb27ae..00f6a8ad804a342bfbfd134c0e88ecc5bf4598eb 100644 |
--- a/src/gpu/GrDrawTarget.cpp |
+++ b/src/gpu/GrDrawTarget.cpp |
@@ -9,6 +9,7 @@ |
#include "GrDrawTarget.h" |
#include "GrBatch.h" |
+#include "GrBufferAllocPool.h" |
#include "GrContext.h" |
#include "GrDrawTargetCaps.h" |
#include "GrPath.h" |
@@ -55,9 +56,15 @@ GrDrawTarget::DrawInfo& GrDrawTarget::DrawInfo::operator =(const DrawInfo& di) { |
#define DEBUG_INVAL_BUFFER 0xdeadcafe |
#define DEBUG_INVAL_START_IDX -1 |
-GrDrawTarget::GrDrawTarget(GrContext* context) |
+GrDrawTarget::GrDrawTarget(GrContext* context, |
+ GrVertexBufferAllocPool* vpool, |
+ GrIndexBufferAllocPool* ipool) |
: fContext(context) |
- , fGpuTraceMarkerCount(0) { |
+ , fCaps(SkRef(context->getGpu()->caps())) |
+ , fGpuTraceMarkerCount(0) |
+ , fVertexPool(vpool) |
+ , fIndexPool(ipool) |
+ , fFlushing(false) { |
SkASSERT(context); |
} |
@@ -93,7 +100,13 @@ bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuil |
// MSAA consideration: When there is support for reading MSAA samples in the shader we could |
// have per-sample dst values by making the copy multisampled. |
GrSurfaceDesc desc; |
- this->initCopySurfaceDstDesc(rt, &desc); |
+ if (!this->getGpu()->initCopySurfaceDstDesc(rt, &desc)) { |
+ desc.fOrigin = kDefault_GrSurfaceOrigin; |
+ desc.fFlags = kRenderTarget_GrSurfaceFlag; |
+ desc.fConfig = rt->config(); |
+ } |
+ |
+ |
desc.fWidth = copyRect.width(); |
desc.fHeight = copyRect.height(); |
@@ -114,6 +127,29 @@ bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuil |
} |
} |
+void GrDrawTarget::reset() { |
+ fVertexPool->reset(); |
+ fIndexPool->reset(); |
+ |
+ this->onReset(); |
+} |
+ |
+void GrDrawTarget::flush() { |
+ if (fFlushing) { |
+ return; |
+ } |
+ fFlushing = true; |
+ |
+ this->getGpu()->saveActiveTraceMarkers(); |
+ |
+ this->onFlush(); |
+ |
+ this->getGpu()->restoreActiveTraceMarkers(); |
+ |
+ fFlushing = false; |
+ this->reset(); |
+} |
+ |
void GrDrawTarget::drawBatch(GrPipelineBuilder* pipelineBuilder, |
GrBatch* batch, |
const SkRect* devBounds) { |
@@ -413,7 +449,8 @@ bool GrDrawTarget::copySurface(GrSurface* dst, |
return true; |
} |
- if (this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint)) { |
+ if (this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPoint)) { |
+ this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint); |
return true; |
} |
@@ -457,23 +494,8 @@ bool GrDrawTarget::canCopySurface(const GrSurface* dst, |
&clippedDstPoint)) { |
return true; |
} |
- return this->internalCanCopySurface(dst, src, clippedSrcRect, clippedDstPoint); |
-} |
- |
-bool GrDrawTarget::internalCanCopySurface(const GrSurface* dst, |
- const GrSurface* src, |
- const SkIRect& clippedSrcRect, |
- const SkIPoint& clippedDstPoint) { |
- // Check that the read/write rects are contained within the src/dst bounds. |
- SkASSERT(!clippedSrcRect.isEmpty()); |
- SkASSERT(SkIRect::MakeWH(src->width(), src->height()).contains(clippedSrcRect)); |
- SkASSERT(clippedDstPoint.fX >= 0 && clippedDstPoint.fY >= 0); |
- SkASSERT(clippedDstPoint.fX + clippedSrcRect.width() <= dst->width() && |
- clippedDstPoint.fY + clippedSrcRect.height() <= dst->height()); |
- |
- // The base class can do it as a draw or the subclass may be able to handle it. |
return ((dst != src) && dst->asRenderTarget() && src->asTexture()) || |
- this->onCanCopySurface(dst, src, clippedSrcRect, clippedDstPoint); |
+ this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPoint); |
} |
void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo, |