'include_dirs' : [
'../src/gpu',
],
+ 'dependencies': [
+ 'gputest.gyp:skgputest',
+ ],
},
],
],
void purgeCache();
/**
+ * Purge all the unlocked resources from the cache.
+ * This entry point is mainly meant for timing texture uploads
+ * and is not defined in normal builds of Skia.
+ */
+ void purgeAllUnlockedResources();
+
+ /**
* Creates a texture that is outside the cache. Does not count against
* cache's budget.
*/
#include "GrTest.h"
#include "GrGpu.h"
+#include "GrResourceCache.h"
void GrTestTarget::init(GrContext* ctx, GrDrawTarget* target) {
SkASSERT(!fContext);
void GrContext::setMaxTextureSizeOverride(int maxTextureSizeOverride) {
fMaxTextureSizeOverride = maxTextureSizeOverride;
}
+
+void GrContext::purgeAllUnlockedResources() {
+ fTextureCache->purgeAllUnlocked();
+}
, fTimerResult(TimerData::kAvg_Result)
, fTimerTypes(0)
, fTimeIndividualTiles(false)
+, fPurgeDecodedTex(false)
{}
PictureBenchmark::~PictureBenchmark() {
fRenderer->render(NULL);
fRenderer->resetState(true);
+ if (fPurgeDecodedTex) {
+ fRenderer->purgeTextures();
+ }
+
bool usingGpu = false;
#if SK_SUPPORT_GPU
usingGpu = fRenderer->isUsingGpuDevice();
tiledRenderer->resetState(false);
perTileTimer->end();
SkAssertResult(perTileTimerData.appendTimes(perTileTimer.get()));
+
+ if (fPurgeDecodedTex) {
+ fRenderer->purgeTextures();
+ }
}
longRunningTimer->truncatedEnd();
tiledRenderer->resetState(true);
#if 0
this->logProgress(result.c_str());
#endif
-
+ if (fPurgeDecodedTex) {
+ configName.append(" <withPurging>");
+ }
configName.append(" <averaged>");
SkString longRunningResult = longRunningTimerData.getResult(
tiledRenderer->getNormalTimeFormat().c_str(),
perRunTimer->end();
SkAssertResult(perRunTimerData.appendTimes(perRunTimer.get()));
+
+ if (fPurgeDecodedTex) {
+ fRenderer->purgeTextures();
+ }
}
longRunningTimer->truncatedEnd();
fRenderer->resetState(true);
SkAssertResult(longRunningTimerData.appendTimes(longRunningTimer.get()));
SkString configName = fRenderer->getConfigName();
+ if (fPurgeDecodedTex) {
+ configName.append(" <withPurging>");
+ }
// Beware - since the per-run-timer doesn't ever include a glFinish it can
// report a lower time then the long-running-timer
* TiledPictureRenderer.
*/
void setTimeIndividualTiles(bool indiv) { fTimeIndividualTiles = indiv; }
+ bool timeIndividualTiles() const { return fTimeIndividualTiles; }
- bool timeIndividualTiles() { return fTimeIndividualTiles; }
+ void setPurgeDecodedTex(bool purgeDecodedTex) { fPurgeDecodedTex = purgeDecodedTex; }
+ bool purgeDecodedText() const { return fPurgeDecodedTex; }
PictureRenderer* setRenderer(PictureRenderer*);
TimerData::Result fTimerResult;
uint32_t fTimerTypes; // bitfield of TimerData::TimerFlags values
bool fTimeIndividualTiles;
+ bool fPurgeDecodedTex;
void logProgress(const char msg[]);
#include "SkCanvas.h"
#include "SkData.h"
#include "SkDevice.h"
+#include "SkDiscardableMemoryPool.h"
#include "SkGPipe.h"
#if SK_SUPPORT_GPU
#include "gl/GrGLDefines.h"
#endif
}
+void PictureRenderer::purgeTextures() {
+ SkDiscardableMemoryPool* pool = SkGetGlobalDiscardableMemoryPool();
+
+ pool->dumpPool();
+
+#if SK_SUPPORT_GPU
+ SkGLContextHelper* glContext = this->getGLContext();
+ if (NULL == glContext) {
+ SkASSERT(kBitmap_DeviceType == fDeviceType);
+ return;
+ }
+
+ // resetState should've already done this
+ fGrContext->flush();
+
+ fGrContext->purgeAllUnlockedResources();
+#endif
+}
+
uint32_t PictureRenderer::recordFlags() {
return ((kNone_BBoxHierarchyType == fBBoxHierarchyType) ? 0 :
SkPicture::kOptimizeForClippedPlayback_RecordingFlag) |
void resetState(bool callFinish);
/**
+ * Remove all decoded textures from the CPU caches and all uploaded textures
+ * from the GPU.
+ */
+ void purgeTextures();
+
+ /**
* Set the backend type. Returns true on success and false on failure.
*/
bool setDeviceType(SkDeviceTypes deviceType) {
DEFINE_int32(repeat, 1, "Set the number of times to repeat each test.");
DEFINE_bool(timeIndividualTiles, false, "Report times for drawing individual tiles, rather than "
"times for drawing the whole page. Requires tiled rendering.");
+DEFINE_bool(purgeDecodedTex, false, "Purge decoded and GPU-uploaded textures "
+ "after each iteration.");
DEFINE_string(timers, "c", "[wcgWC]*: Display wall, cpu, gpu, truncated wall or truncated cpu time"
" for each picture.");
DEFINE_bool(trackDeferredCaching, false, "Only meaningful with --deferImageDecoding and "
benchmark->setTimeIndividualTiles(true);
}
+ benchmark->setPurgeDecodedTex(FLAGS_purgeDecodedTex);
+
if (FLAGS_readPath.count() < 1) {
gLogger.logError(".skp files or directories are required.\n");
exit(-1);