Index: tools/skiaserve/skiaserve.cpp |
diff --git a/tools/skiaserve/skiaserve.cpp b/tools/skiaserve/skiaserve.cpp |
index 85f3e1e693cd58c6a00eb8a85f4feff28891c712..cb7af9dc2e6dcc744a5c449a1dda2711d731c78e 100644 |
--- a/tools/skiaserve/skiaserve.cpp |
+++ b/tools/skiaserve/skiaserve.cpp |
@@ -76,23 +76,6 @@ struct Request { |
UrlDataManager fUrlDataManager; |
}; |
-// TODO factor this out into functions, also handle CPU path |
-SkSurface* setupSurface(GrContextFactory* factory) { |
- GrContext* context = factory->get(GrContextFactory::kNative_GLContextType, |
- GrContextFactory::kNone_GLContextOptions); |
- int maxRTSize = context->caps()->maxRenderTargetSize(); |
- SkImageInfo info = SkImageInfo::Make(SkTMin(kImageWidth, maxRTSize), |
- SkTMin(kImageHeight, maxRTSize), |
- kN32_SkColorType, kPremul_SkAlphaType); |
- uint32_t flags = 0; |
- SkSurfaceProps props(flags, SkSurfaceProps::kLegacyFontHost_InitType); |
- SkSurface* surface = SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, info, 0, |
- &props); |
- SkASSERT(surface); |
- |
- return surface; |
-} |
- |
static void write_png_callback(png_structp png_ptr, png_bytep data, png_size_t length) { |
SkWStream* out = (SkWStream*) png_get_io_ptr(png_ptr); |
out->write(data, length); |
@@ -172,12 +155,28 @@ SkData* drawToPng(Request* request, int n) { |
return writeCanvasToPng(getCanvasFromRequest(request)); |
} |
-SkSurface* setupCpuSurface() { |
+SkSurface* createCPUSurface() { |
SkImageInfo info = SkImageInfo::Make(kImageWidth, kImageHeight, kN32_SkColorType, |
kPremul_SkAlphaType); |
return SkSurface::NewRaster(info); |
} |
+SkSurface* createGPUSurface(Request* request) { |
+ GrContext* context = request->fContextFactory->get(GrContextFactory::kNative_GLContextType, |
+ GrContextFactory::kNone_GLContextOptions); |
+ int maxRTSize = context->caps()->maxRenderTargetSize(); |
+ SkImageInfo info = SkImageInfo::Make(SkTMin(kImageWidth, maxRTSize), |
+ SkTMin(kImageHeight, maxRTSize), |
+ kN32_SkColorType, kPremul_SkAlphaType); |
+ uint32_t flags = 0; |
+ SkSurfaceProps props(flags, SkSurfaceProps::kLegacyFontHost_InitType); |
+ SkSurface* surface = SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, info, 0, |
+ &props); |
+ SkASSERT(surface); |
jcgregorio
2016/02/19 15:23:56
Instead of asserting how about checking for a NULL
|
+ |
+ return surface; |
+} |
+ |
static const size_t kBufferSize = 1024; |
static int process_upload_data(void* cls, enum MHD_ValueKind kind, |
@@ -458,6 +457,41 @@ public: |
} |
}; |
+/** |
+ Controls whether GPU rendering is enabled. Posting to /enableGPU/1 turns GPU on, /enableGPU/0 |
+ disables it. |
+ */ |
+class EnableGPUHandler : public UrlHandler { |
+public: |
+ bool canHandle(const char* method, const char* url) override { |
+ static const char* kBasePath = "/enableGPU/"; |
+ return 0 == strcmp(method, MHD_HTTP_METHOD_POST) && |
+ 0 == strncmp(url, kBasePath, strlen(kBasePath)); |
+ } |
+ |
+ int handle(Request* request, MHD_Connection* connection, |
+ const char* url, const char* method, |
+ const char* upload_data, size_t* upload_data_size) override { |
+ SkTArray<SkString> commands; |
+ SkStrSplit(url, "/", &commands); |
+ |
+ if (commands.count() != 2) { |
+ return MHD_NO; |
+ } |
+ |
+ int enable; |
+ sscanf(commands[1].c_str(), "%d", &enable); |
+ |
+ if (enable) { |
+ request->fSurface.reset(createGPUSurface(request)); |
+ } |
+ else { |
+ request->fSurface.reset(createCPUSurface()); |
+ } |
+ return SendOK(connection); |
+ } |
+}; |
+ |
class PostHandler : public UrlHandler { |
public: |
bool canHandle(const char* method, const char* url) override { |
@@ -506,7 +540,7 @@ public: |
// create surface |
GrContextOptions grContextOpts; |
request->fContextFactory.reset(new GrContextFactory(grContextOpts)); |
- request->fSurface.reset(setupSurface(request->fContextFactory.get())); |
+ request->fSurface.reset(createGPUSurface(request)); |
// pour picture into debug canvas |
request->fDebugCanvas.reset(new SkDebugCanvas(kImageWidth, kImageHeight)); |
@@ -575,7 +609,7 @@ public: |
} |
// drawTo |
- SkAutoTUnref<SkSurface> surface(setupCpuSurface()); |
+ SkAutoTUnref<SkSurface> surface(createCPUSurface()); |
SkCanvas* canvas = surface->getCanvas(); |
int n; |
@@ -676,6 +710,7 @@ public: |
fHandlers.push_back(new PostHandler); |
fHandlers.push_back(new ImgHandler); |
fHandlers.push_back(new ClipAlphaHandler); |
+ fHandlers.push_back(new EnableGPUHandler); |
fHandlers.push_back(new CmdHandler); |
fHandlers.push_back(new InfoHandler); |
fHandlers.push_back(new DownloadHandler); |