aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2015-02-02 18:26:03 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-02-02 18:26:03 -0800
commitb9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043 (patch)
treeaeef8aa338e315c71e75d7e45f0dc970ef1111ed /src
parentcb3f50468dcd6e838628b425828b8f4386a48109 (diff)
patch from issue 886233004 at patchset 40001 (http://crrev.com/886233004#ps40001)
... with changes proposed in the review. BUG=skia: Review URL: https://codereview.chromium.org/894013002
Diffstat (limited to 'src')
-rwxr-xr-xsrc/gpu/GrContext.cpp13
-rw-r--r--src/gpu/GrGpu.h93
-rw-r--r--src/gpu/GrResourceCache2.cpp40
-rw-r--r--src/gpu/GrResourceCache2.h4
-rw-r--r--src/gpu/GrTest.cpp75
-rw-r--r--src/gpu/gl/GrGLGpu.cpp20
-rw-r--r--src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp2
-rw-r--r--src/gpu/gl/builders/GrGLGeometryShaderBuilder.cpp2
-rw-r--r--src/gpu/gl/builders/GrGLShaderStringBuilder.cpp4
-rw-r--r--src/gpu/gl/builders/GrGLShaderStringBuilder.h4
-rw-r--r--src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp5
11 files changed, 150 insertions, 112 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 07073a5ee5..bcd84dd63c 100755
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -1578,16 +1578,3 @@ void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) {
}
}
-///////////////////////////////////////////////////////////////////////////////
-#if GR_CACHE_STATS
-void GrContext::printCacheStats() const {
- fResourceCache2->printStats();
-}
-#endif
-
-#if GR_GPU_STATS
-const GrContext::GPUStats* GrContext::gpuStats() const {
- return fGpu->gpuStats();
-}
-#endif
-
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
index 5680d5c115..c989589117 100644
--- a/src/gpu/GrGpu.h
+++ b/src/gpu/GrGpu.h
@@ -26,7 +26,6 @@ class GrVertexBufferAllocPool;
class GrGpu : public SkRefCnt {
public:
-
/**
* Additional blend coefficients for dual source blending, not exposed
* through GrPaint/GrContext.
@@ -62,9 +61,7 @@ public:
*/
const GrDrawTargetCaps* caps() const { return fCaps.get(); }
- GrPathRendering* pathRendering() {
- return fPathRendering.get();
- }
+ GrPathRendering* pathRendering() { return fPathRendering.get(); }
// Called by GrContext when the underlying backend context has been destroyed.
// GrGpu should use this to ensure that no backend API calls will be made from
@@ -78,11 +75,7 @@ public:
* the GrGpu that the state was modified and it shouldn't make assumptions
* about the state.
*/
- void markContextDirty(uint32_t state = kAll_GrBackendState) {
- fResetBits |= state;
- }
-
- void unimpl(const char[]);
+ void markContextDirty(uint32_t state = kAll_GrBackendState) { fResetBits |= state; }
/**
* Creates a texture object. If kRenderTarget_GrSurfaceFlag the texture can
@@ -302,33 +295,12 @@ public:
// is dirty.
ResetTimestamp getResetTimestamp() const { return fResetTimestamp; }
- GrContext::GPUStats* gpuStats() { return &fGPUStats; }
-
virtual void buildProgramDesc(GrProgramDesc*,
const GrPrimitiveProcessor&,
const GrPipeline&,
const GrProgramDesc::DescInfo&,
const GrBatchTracker&) const = 0;
- /**
- * Called at start and end of gpu trace marking
- * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start
- * and end of a code block respectively
- */
- void addGpuTraceMarker(const GrGpuTraceMarker* marker);
- void removeGpuTraceMarker(const GrGpuTraceMarker* marker);
-
- /**
- * Takes the current active set of markers and stores them for later use. Any current marker
- * in the active set is removed from the active set and the targets remove function is called.
- * These functions do not work as a stack so you cannot call save a second time before calling
- * restore. Also, it is assumed that when restore is called the current active set of markers
- * is empty. When the stored markers are added back into the active set, the targets add marker
- * is called.
- */
- void saveActiveTraceMarkers();
- void restoreActiveTraceMarkers();
-
// Called to determine whether a copySurface call would succeed or not. Derived
// classes must keep this consistent with their implementation of onCopySurface(). Fallbacks
// to issuing a draw from the src to dst take place at the GrDrawTarget level and this function
@@ -389,6 +361,53 @@ public:
int count,
const GrStencilSettings&);
+ ///////////////////////////////////////////////////////////////////////////
+ // Debugging and Stats
+
+ class Stats {
+ public:
+#if GR_GPU_STATS
+ Stats() { this->reset(); }
+
+ void reset() { fRenderTargetBinds = 0; fShaderCompilations = 0; }
+
+ int renderTargetBinds() const { return fRenderTargetBinds; }
+ void incRenderTargetBinds() { fRenderTargetBinds++; }
+ int shaderCompilations() const { return fShaderCompilations; }
+ void incShaderCompilations() { fShaderCompilations++; }
+ void dump(SkString*);
+
+ private:
+ int fRenderTargetBinds;
+ int fShaderCompilations;
+#else
+ void dump(SkString*) {};
+ void incRenderTargetBinds() {}
+ void incShaderCompilations() {}
+#endif
+ };
+
+ Stats* stats() { return &fStats; }
+
+ /**
+ * Called at start and end of gpu trace marking
+ * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start
+ * and end of a code block respectively
+ */
+ void addGpuTraceMarker(const GrGpuTraceMarker* marker);
+ void removeGpuTraceMarker(const GrGpuTraceMarker* marker);
+
+ /**
+ * Takes the current active set of markers and stores them for later use. Any current marker
+ * in the active set is removed from the active set and the targets remove function is called.
+ * These functions do not work as a stack so you cannot call save a second time before calling
+ * restore. Also, it is assumed that when restore is called the current active set of markers
+ * is empty. When the stored markers are added back into the active set, the targets add marker
+ * is called.
+ */
+ void saveActiveTraceMarkers();
+ void restoreActiveTraceMarkers();
+
protected:
// Functions used to map clip-respecting stencil tests into normal
// stencil funcs supported by GPUs.
@@ -401,14 +420,12 @@ protected:
unsigned int* ref,
unsigned int* mask);
- const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers; }
-
- GrContext::GPUStats fGPUStats;
-
- SkAutoTDelete<GrPathRendering> fPathRendering;
+ const GrTraceMarkerSet& getActiveTraceMarkers() const { return fActiveTraceMarkers; }
+ Stats fStats;
+ SkAutoTDelete<GrPathRendering> fPathRendering;
// Subclass must initialize this in its constructor.
- SkAutoTUnref<const GrDrawTargetCaps> fCaps;
+ SkAutoTUnref<const GrDrawTargetCaps> fCaps;
private:
// called when the 3D context state is unknown. Subclass should emit any
@@ -432,9 +449,7 @@ private:
// Overridden by backend specific classes to perform a clear of the stencil clip bits. This is
// ONLY used by the the clip target
- virtual void onClearStencilClip(GrRenderTarget*,
- const SkIRect& rect,
- bool insideClip) = 0;
+ virtual void onClearStencilClip(GrRenderTarget*, const SkIRect& rect, bool insideClip) = 0;
// overridden by backend-specific derived class to perform the draw call.
virtual void onDraw(const DrawArgs&, const GrDrawTarget::DrawInfo&) = 0;
diff --git a/src/gpu/GrResourceCache2.cpp b/src/gpu/GrResourceCache2.cpp
index 99c4270f99..84a8d48cbc 100644
--- a/src/gpu/GrResourceCache2.cpp
+++ b/src/gpu/GrResourceCache2.cpp
@@ -483,43 +483,3 @@ void GrResourceCache2::validate() const {
// SkASSERT(!overBudget || locked == count || fPurging);
}
#endif
-
-#if GR_CACHE_STATS
-void GrResourceCache2::printStats() const {
- this->validate();
-
- int locked = 0;
- int scratch = 0;
- int wrapped = 0;
- size_t unbudgetedSize = 0;
-
- ResourceList::Iter iter;
- GrGpuResource* resource = iter.init(fResources, ResourceList::Iter::kHead_IterStart);
-
- for ( ; resource; resource = iter.next()) {
- if (!resource->isPurgeable()) {
- ++locked;
- }
- if (resource->cacheAccess().isScratch()) {
- ++scratch;
- }
- if (resource->cacheAccess().isWrapped()) {
- ++wrapped;
- }
- if (!resource->cacheAccess().isBudgeted()) {
- unbudgetedSize += resource->gpuMemorySize();
- }
- }
-
- float countUtilization = (100.f * fBudgetedCount) / fMaxCount;
- float byteUtilization = (100.f * fBudgetedBytes) / fMaxBytes;
-
- SkDebugf("Budget: %d items %d bytes\n", fMaxCount, fMaxBytes);
- SkDebugf("\t\tEntry Count: current %d"
- " (%d budgeted, %d wrapped, %d locked, %d scratch %.2g%% full), high %d\n",
- fCount, fBudgetedCount, wrapped, locked, scratch, countUtilization, fHighWaterCount);
- SkDebugf("\t\tEntry Bytes: current %d (budgeted %d, %.2g%% full, %d unbudgeted) high %d\n",
- fBytes, fBudgetedBytes, byteUtilization, unbudgetedSize, fHighWaterBytes);
-}
-
-#endif
diff --git a/src/gpu/GrResourceCache2.h b/src/gpu/GrResourceCache2.h
index 9c9900a424..4f21db979b 100644
--- a/src/gpu/GrResourceCache2.h
+++ b/src/gpu/GrResourceCache2.h
@@ -16,6 +16,8 @@
#include "SkTInternalLList.h"
#include "SkTMultiMap.h"
+class SkString;
+
/**
* Manages the lifetime of all GrGpuResource instances.
*
@@ -146,7 +148,7 @@ public:
}
#if GR_GPU_STATS
- void printStats() const;
+ void dumpStats(SkString*) const;
#endif
private:
diff --git a/src/gpu/GrTest.cpp b/src/gpu/GrTest.cpp
index e4c7a83513..1689070308 100644
--- a/src/gpu/GrTest.cpp
+++ b/src/gpu/GrTest.cpp
@@ -10,6 +10,7 @@
#include "GrInOrderDrawBuffer.h"
#include "GrResourceCache2.h"
+#include "SkString.h"
void GrTestTarget::init(GrContext* ctx, GrDrawTarget* target) {
SkASSERT(!fContext);
@@ -40,6 +41,80 @@ void GrContext::purgeAllUnlockedResources() {
fResourceCache2->purgeAllUnlocked();
}
+void GrContext::dumpCacheStats(SkString* out) const {
+#if GR_CACHE_STATS
+ fResourceCache2->dumpStats(out);
+#endif
+}
+
+void GrContext::printCacheStats() const {
+ SkString out;
+ this->dumpCacheStats(&out);
+ SkDebugf(out.c_str());
+}
+
+void GrContext::dumpGpuStats(SkString* out) const {
+#if GR_GPU_STATS
+ return fGpu->stats()->dump(out);
+#endif
+}
+
+void GrContext::printGpuStats() const {
+ SkString out;
+ this->dumpGpuStats(&out);
+ SkDebugf(out.c_str());
+}
+
+#if GR_GPU_STATS
+void GrGpu::Stats::dump(SkString* out) {
+ out->appendf("Render Target Binds: %d\n", fRenderTargetBinds);
+ out->appendf("Shader Compilations: %d\n", fShaderCompilations);
+}
+#endif
+
+#if GR_CACHE_STATS
+void GrResourceCache2::dumpStats(SkString* out) const {
+ this->validate();
+
+ int locked = 0;
+ int scratch = 0;
+ int wrapped = 0;
+ size_t unbudgetedSize = 0;
+
+ ResourceList::Iter iter;
+ GrGpuResource* resource = iter.init(fResources, ResourceList::Iter::kHead_IterStart);
+
+ for ( ; resource; resource = iter.next()) {
+ if (!resource->isPurgeable()) {
+ ++locked;
+ }
+ if (resource->cacheAccess().isScratch()) {
+ ++scratch;
+ }
+ if (resource->cacheAccess().isWrapped()) {
+ ++wrapped;
+ }
+ if (!resource->cacheAccess().isBudgeted()) {
+ unbudgetedSize += resource->gpuMemorySize();
+ }
+ }
+
+ float countUtilization = (100.f * fBudgetedCount) / fMaxCount;
+ float byteUtilization = (100.f * fBudgetedBytes) / fMaxBytes;
+
+ out->appendf("Budget: %d items %d bytes\n", fMaxCount, (int)fMaxBytes);
+ out->appendf("\t\tEntry Count: current %d"
+ " (%d budgeted, %d wrapped, %d locked, %d scratch %.2g%% full), high %d\n",
+ fCount, fBudgetedCount, wrapped, locked, scratch, countUtilization,
+ fHighWaterCount);
+ out->appendf("\t\tEntry Bytes: current %d (budgeted %d, %.2g%% full, %d unbudgeted) high %d\n",
+ (int)fBytes, (int)fBudgetedBytes, byteUtilization,
+ (int)unbudgetedSize, (int)fHighWaterBytes);
+}
+
+#endif
+
+
///////////////////////////////////////////////////////////////////////////////
// Code for the mock context. It's built on a mock GrGpu class that does nothing.
////
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 6d14e7e6c5..e32b2e6b8f 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -850,7 +850,7 @@ bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, bool budgeted
desc.fWidth, desc.fHeight)) {
goto FAILED;
}
- fGPUStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fRTFBOID));
GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
GR_GL_COLOR_ATTACHMENT0,
@@ -865,7 +865,7 @@ bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, bool budgeted
fGLContext.caps()->markConfigAsValidColorAttachment(desc.fConfig);
}
}
- fGPUStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fTexFBOID));
if (this->glCaps().usesImplicitMSAAResolve() && desc.fSampleCnt > 0) {
@@ -1209,7 +1209,7 @@ bool GrGLGpu::attachStencilBufferToRenderTarget(GrStencilBuffer* sb, GrRenderTar
GrGLuint rb = glsb->renderbufferID();
fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
- fGPUStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fbo));
GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
GR_GL_STENCIL_ATTACHMENT,
@@ -1509,7 +1509,7 @@ void GrGLGpu::discard(GrRenderTarget* renderTarget) {
GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget);
if (renderTarget->getUniqueID() != fHWBoundRenderTargetUniqueID) {
fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
- fGPUStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID()));
}
switch (this->glCaps().invalidateFBType()) {
@@ -1670,7 +1670,7 @@ bool GrGLGpu::onReadPixels(GrRenderTarget* target,
case GrGLRenderTarget::kCanResolve_ResolveType:
this->onResolveRenderTarget(tgt);
// we don't track the state of the READ FBO ID.
- fGPUStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER,
tgt->textureFBOID()));
break;
@@ -1768,7 +1768,7 @@ void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bound)
uint32_t rtID = target->getUniqueID();
if (fHWBoundRenderTargetUniqueID != rtID) {
- fGPUStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID()));
#ifdef SK_DEBUG
// don't do this check in Chromium -- this is causing
@@ -1912,8 +1912,8 @@ void GrGLGpu::onResolveRenderTarget(GrRenderTarget* target) {
// Some extensions automatically resolves the texture when it is read.
if (this->glCaps().usesMSAARenderBuffers()) {
SkASSERT(rt->textureFBOID() != rt->renderFBOID());
- fGPUStats.incRenderTargetBinds();
- fGPUStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID()));
GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID()));
// make sure we go through flushRenderTarget() since we've modified
@@ -2519,7 +2519,7 @@ GrGLuint GrGLGpu::bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLI
SkASSERT(surface->asTexture());
GrGLuint texID = static_cast<GrGLTexture*>(surface->asTexture())->textureID();
GR_GL_CALL(this->glInterface(), GenFramebuffers(1, &tempFBOID));
- fGPUStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, tempFBOID));
GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget,
GR_GL_COLOR_ATTACHMENT0,
@@ -2532,7 +2532,7 @@ GrGLuint GrGLGpu::bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLI
viewport->fHeight = surface->height();
} else {
tempFBOID = 0;
- fGPUStats.incRenderTargetBinds();
+ fStats.incRenderTargetBinds();
GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBOID()));
*viewport = rt->getViewport();
}
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
index 46433f01c2..61932f3084 100644
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
@@ -276,7 +276,7 @@ bool GrGLFragmentShaderBuilder::compileAndAttachShaders(GrGLuint programId,
GrGLuint fragShaderId = GrGLCompileAndAttachShader(gpu->glContext(), programId,
GR_GL_FRAGMENT_SHADER, fragShaderSrc,
- gpu->gpuStats());
+ gpu->stats());
if (!fragShaderId) {
return false;
}
diff --git a/src/gpu/gl/builders/GrGLGeometryShaderBuilder.cpp b/src/gpu/gl/builders/GrGLGeometryShaderBuilder.cpp
index 573c553fa6..8be2531c96 100644
--- a/src/gpu/gl/builders/GrGLGeometryShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLGeometryShaderBuilder.cpp
@@ -62,7 +62,7 @@ bool GrGLGeometryBuilder::compileAndAttachShaders(GrGLuint programId,
GrGLuint geomShaderId =
GrGLCompileAndAttachShader(glCtx, programId,
GR_GL_GEOMETRY_SHADER, geomShaderSrc,
- fProgramBuilder->gpu()->gpuStats());
+ fProgramBuilder->gpu()->stats());
if (!geomShaderId) {
return false;
}
diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
index 4a0fee56b1..5265d203a5 100644
--- a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
@@ -21,7 +21,7 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx,
GrGLuint programId,
GrGLenum type,
const SkString& shaderSrc,
- GrContext::GPUStats* gpuStats) {
+ GrGpu::Stats* stats) {
const GrGLInterface* gli = glCtx.interface();
GrGLuint shaderId;
@@ -39,7 +39,7 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx,
const GrGLchar* sourceStr = shaderSrc.c_str();
#endif
GR_GL_CALL(gli, ShaderSource(shaderId, 1, &sourceStr, &sourceLength));
- gpuStats->incShaderCompilations();
+ stats->incShaderCompilations();
GR_GL_CALL(gli, CompileShader(shaderId));
// Calling GetShaderiv in Chromium is quite expensive. Assume success in release builds.
diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.h b/src/gpu/gl/builders/GrGLShaderStringBuilder.h
index ab8734f7c6..cf54253e80 100644
--- a/src/gpu/gl/builders/GrGLShaderStringBuilder.h
+++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.h
@@ -9,7 +9,7 @@
#define GrGLShaderStringBuilder_DEFINED
#include "GrAllocator.h"
-#include "GrContext.h"
+#include "GrGpu.h"
#include "gl/GrGLContext.h"
#include "SkTypes.h"
@@ -17,6 +17,6 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx,
GrGLuint programId,
GrGLenum type,
const SkString& shaderSrc,
- GrContext::GPUStats* gpuStats);
+ GrGpu::Stats*);
#endif
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
index f17e741169..f1671af54c 100644
--- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
@@ -85,9 +85,8 @@ bool GrGLVertexBuilder::compileAndAttachShaders(GrGLuint programId,
vertShaderSrc.append("void main() {");
vertShaderSrc.append(fCode);
vertShaderSrc.append("}\n");
- GrGLuint vertShaderId = GrGLCompileAndAttachShader(glCtx, programId,
- GR_GL_VERTEX_SHADER, vertShaderSrc,
- gpu->gpuStats());
+ GrGLuint vertShaderId = GrGLCompileAndAttachShader(glCtx, programId, GR_GL_VERTEX_SHADER,
+ vertShaderSrc, gpu->stats());
if (!vertShaderId) {
return false;
}