Have GMs read the GrContext via a setter/getter rather than a global.
authormtklein@google.com <mtklein@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 16 Sep 2013 20:42:15 +0000 (20:42 +0000)
committermtklein@google.com <mtklein@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 16 Sep 2013 20:42:15 +0000 (20:42 +0000)
GetGr's current global state makes things rather tricky to run GPU GMs in
parallel (DM).  This API change will let me feed the right GrContext to the
right GM in DM.

I'm not planning on changing the status quo in GM-the-tool: the new getters and
setters still just return the same global.

BUG=skia:1590
R=bsalomon@google.com, robertphillips@google.com

Review URL: https://codereview.chromium.org/23567032

git-svn-id: http://skia.googlecode.com/svn/trunk@11306 2bbb7eff-a529-9590-31e7-b0007b416f81

gm/bleed.cpp
gm/gm.cpp
gm/gm.h
gm/gmmain.cpp
gm/image.cpp
gm/texdata.cpp

index 2b2d8497cfd48fef600c7104849e3032c80281eb..dc7e96fbb122716c76d397de1cf5d59eda399354 100644 (file)
 
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
-
-namespace skiagm {
-extern GrContext* GetGr();
-};
 #endif
 
 // Create a black&white checked texture with a 1-pixel red ring
@@ -175,7 +171,7 @@ protected:
 
 
 #if SK_SUPPORT_GPU
-        GrContext* ctx = skiagm::GetGr();
+        GrContext* ctx = GM::GetGr(canvas);
         int oldMaxTextureSize = 0;
         if (NULL != ctx) {
             // shrink the max texture size so all our textures can be reasonably sized
index f794fbf9992aa76fd2b444182f340015629612cd..06d3c6dc1a6293036cdcb13178e6b44d1aef099a 100644 (file)
--- a/gm/gm.cpp
+++ b/gm/gm.cpp
@@ -62,5 +62,18 @@ void GM::drawSizeBounds(SkCanvas* canvas, SkColor color) {
     canvas->drawRect(r, paint);
 }
 
+#if SK_SUPPORT_GPU
+// canvas could almost be a const&, but accessRenderTarget isn't const.
+/*static*/ GrContext* GM::GetGr(SkCanvas* canvas) {
+    SkASSERT(NULL != canvas);
+    SkBaseDevice* device = canvas->getTopDevice();
+    GrRenderTarget* renderTarget = device->accessRenderTarget();
+    if (NULL != renderTarget) {
+        return renderTarget->getContext();
+    }
+    return NULL;
+}
+#endif
+
 // need to explicitly declare this, or we get some weird infinite loop llist
 template GMRegistry* SkTRegistry<GM*(*)(void*)>::gHead;
diff --git a/gm/gm.h b/gm/gm.h
index 6cd97b5a2bd75fcd47c0d84bbb6f3c6b86b8f359..2886f8c243fcdb5c24c3c8bf790557848e31ec67 100644 (file)
--- a/gm/gm.h
+++ b/gm/gm.h
 #include "SkString.h"
 #include "SkTRegistry.h"
 
+#if SK_SUPPORT_GPU
+#include "GrContext.h"
+#endif
+
 #define DEF_GM(code) \
     static skiagm::GM*          SK_MACRO_APPEND_LINE(F_)(void*) { code; } \
     static skiagm::GMRegistry   SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
@@ -93,6 +97,10 @@ namespace skiagm {
             fCanvasIsDeferred = isDeferred;
         }
 
+#if SK_SUPPORT_GPU
+        static GrContext* GetGr(/*very nearly const*/ SkCanvas*);
+#endif
+
     protected:
         static SkString gResourcePath;
 
index 018dfe6cedb4678bb6b9c0c534bdc6533fa879ed..493962405526226a4aab85d96f4ba1936e244471 100644 (file)
@@ -1464,48 +1464,6 @@ static const PDFRasterizerData* findPDFRasterizer(const char rasterizer[]) {
     return NULL;
 }
 
-namespace skiagm {
-#if SK_SUPPORT_GPU
-SkAutoTUnref<GrContext> gGrContext;
-/**
- * Sets the global GrContext, accessible by individual GMs
- */
-static void SetGr(GrContext* grContext) {
-    SkSafeRef(grContext);
-    gGrContext.reset(grContext);
-}
-
-/**
- * Gets the global GrContext, can be called by GM tests.
- */
-GrContext* GetGr();
-GrContext* GetGr() {
-    return gGrContext.get();
-}
-
-/**
- * Sets the global GrContext and then resets it to its previous value at
- * destruction.
- */
-class AutoResetGr : SkNoncopyable {
-public:
-    AutoResetGr() : fOld(NULL) {}
-    void set(GrContext* context) {
-        SkASSERT(NULL == fOld);
-        fOld = GetGr();
-        SkSafeRef(fOld);
-        SetGr(context);
-    }
-    ~AutoResetGr() { SetGr(fOld); SkSafeUnref(fOld); }
-private:
-    GrContext* fOld;
-};
-#else
-GrContext* GetGr();
-GrContext* GetGr() { return NULL; }
-#endif
-}
-
 template <typename T> void appendUnique(SkTDArray<T>* array, const T& value) {
     int index = array->find(value);
     if (index < 0) {
@@ -1573,7 +1531,6 @@ ErrorCombination run_multiple_configs(GMMain &gmmain, GM *gm,
         GrSurface* gpuTarget = NULL;
 #if SK_SUPPORT_GPU
         SkAutoTUnref<GrSurface> auGpuTarget;
-        AutoResetGr autogr;
         if ((errorsForThisConfig.isEmpty()) && (kGPU_Backend == config.fBackend)) {
             GrContext* gr = grFactory->get(config.fGLContextType);
             bool grSuccess = false;
@@ -1589,7 +1546,6 @@ ErrorCombination run_multiple_configs(GMMain &gmmain, GM *gm,
                 if (NULL != auGpuTarget) {
                     gpuTarget = auGpuTarget;
                     grSuccess = true;
-                    autogr.set(gr);
                     // Set the user specified cache limits if non-default.
                     size_t bytes;
                     int count;
index 3ed85f9bab7ca4653e6297ddec73e3d59c61b849..6dada0d9492c14c93fe4e275c810d363d9e0cf39 100644 (file)
 
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
-
-namespace skiagm {
-extern GrContext* GetGr();
-};
 #endif
 
 static SkData* fileToData(const char path[]) {
@@ -193,7 +189,7 @@ protected:
         SkAutoTUnref<SkSurface> surf2(SkSurface::NewPicture(info.fWidth, info.fHeight));
         SkAutoTUnref<SkSurface> surf3(SkSurface::NewPicture(info.fWidth, info.fHeight));
 #if SK_SUPPORT_GPU
-        GrContext* ctx = skiagm::GetGr();
+        GrContext* ctx = GM::GetGr(canvas);
 
         SkAutoTUnref<SkSurface> surf4(SkSurface::NewRenderTarget(ctx, info, 0));
 #endif
index b2c7139d8533159fec241fc60f4c799108b64e4d..8ba0c7741c8eab3b8e877ddca24a7804e851b837 100644 (file)
@@ -18,8 +18,6 @@
 
 namespace skiagm {
 
-extern GrContext* GetGr();
-
 static const int S = 200;
 
 class TexDataGM : public GM {
@@ -40,7 +38,7 @@ protected:
     virtual void onDraw(SkCanvas* canvas) {
         SkBaseDevice* device = canvas->getTopDevice();
         GrRenderTarget* target = device->accessRenderTarget();
-        GrContext* ctx = GetGr();
+        GrContext* ctx = GM::GetGr(canvas);
         if (ctx && target) {
             SkPMColor gTextureData[(2 * S) * (2 * S)];
             static const int stride = 2 * S;