| Index: dm/DMGpuGMTask.cpp
|
| diff --git a/dm/DMGpuGMTask.cpp b/dm/DMGpuGMTask.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9347ebdfe95017a002ab6297b66253769d7f2bc5
|
| --- /dev/null
|
| +++ b/dm/DMGpuGMTask.cpp
|
| @@ -0,0 +1,67 @@
|
| +#include "DMGpuGMTask.h"
|
| +#include "DMUtil.h"
|
| +#include "DMWriteTask.h"
|
| +#include "SkCommonFlags.h"
|
| +#include "SkSurface.h"
|
| +#include "SkTLS.h"
|
| +
|
| +namespace DM {
|
| +
|
| +GpuGMTask::GpuGMTask(const char* config,
|
| + Reporter* reporter,
|
| + TaskRunner* taskRunner,
|
| + skiagm::GMRegistry::Factory gmFactory,
|
| + GrContextFactory::GLContextType contextType,
|
| + GrGLStandard gpuAPI,
|
| + int sampleCount,
|
| + bool useDFText)
|
| + : GpuTask(reporter, taskRunner)
|
| + , fGM(gmFactory(NULL))
|
| + , fName(UnderJoin(fGM->getName(), config))
|
| + , fContextType(contextType)
|
| + , fGpuAPI(gpuAPI)
|
| + , fSampleCount(sampleCount)
|
| + , fUseDFText(useDFText)
|
| + {}
|
| +
|
| +static bool gAlreadyWarned[GrContextFactory::kGLContextTypeCnt][kGrGLStandardCnt];
|
| +
|
| +void GpuGMTask::draw(GrContextFactory* grFactory) {
|
| + SkImageInfo info = SkImageInfo::Make(SkScalarCeilToInt(fGM->width()),
|
| + SkScalarCeilToInt(fGM->height()),
|
| + kN32_SkColorType,
|
| + kPremul_SkAlphaType);
|
| + SkAutoTUnref<SkSurface> surface(NewGpuSurface(grFactory, fContextType, fGpuAPI, info,
|
| + fSampleCount, fUseDFText));
|
| + if (!surface) {
|
| + if (!gAlreadyWarned[fContextType][fGpuAPI]) {
|
| + SkDebugf("FYI: couldn't create GPU context, type %d API %d. Will skip.\n",
|
| + fContextType, fGpuAPI);
|
| + gAlreadyWarned[fContextType][fGpuAPI] = true;
|
| + }
|
| + return;
|
| + }
|
| + SkCanvas* canvas = surface->getCanvas();
|
| + CanvasPreflight(canvas);
|
| +
|
| + canvas->concat(fGM->getInitialTransform());
|
| + fGM->draw(canvas);
|
| + canvas->flush();
|
| +#if GR_CACHE_STATS && SK_SUPPORT_GPU
|
| + if (FLAGS_veryVerbose) {
|
| + grFactory->get(fContextType)->printCacheStats();
|
| + }
|
| +#endif
|
| +
|
| + SkBitmap bitmap;
|
| + bitmap.setInfo(info);
|
| + canvas->readPixels(&bitmap, 0, 0);
|
| +
|
| + this->spawnChild(SkNEW_ARGS(WriteTask, (*this, "GM", bitmap)));
|
| +}
|
| +
|
| +bool GpuGMTask::shouldSkip() const {
|
| + return kGPUDisabled || SkToBool(fGM->getFlags() & skiagm::GM::kSkipGPU_Flag);
|
| +}
|
| +
|
| +} // namespace DM
|
|
|