Revert "Revert "Add GrRenderTargetContext instantiate & asTextureProxy""

This reverts commit 7d7d7d19462b75f5470492dc4820a02c1eba4af2.

Reason for revert: Reverting this to see if it really was crashing on SVGs or if that was cross talk.

Original change's description:
> Revert "Add GrRenderTargetContext instantiate & asTextureProxy"
> 
> This reverts commit 9113edfff89e657dabc0ba095c54f7720550196c.
> 
> Reason for revert: Looks to be causing EXCEPTION_ACCESS_VIOLATION:
> 
> https://uberchromegw.corp.google.com/i/client.skia/builders/Test-Win-MSVC-NUC-GPU-IntelIris6100-x86_64-Debug/builds/121/steps/test_skia%20on%20Windows/logs/stdio
> https://uberchromegw.corp.google.com/i/client.skia/builders/Test-Win-MSVC-GCE-CPU-AVX2-x86-Debug/builds/2384/steps/test_skia%20on%20Windows-2008ServerR2-SP1/logs/stdio
> https://uberchromegw.corp.google.com/i/client.skia/builders/Test-Win-MSVC-ShuttleC-GPU-iHD530-x86_64-Debug/builds/785/steps/test_skia%20on%20Windows/logs/stdio
> 
> Original change's description:
> > Add GrRenderTargetContext instantiate & asTextureProxy
> > 
> > This CL also centralizes the instantiation code in GrSurfaceProxy and adds a test.
> > 
> > GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=4494
> > 
> > Change-Id: I0081d9a216dc0af293179f23bcb88acf6a822324
> > Reviewed-on: https://skia-review.googlesource.com/4494
> > Reviewed-by: Brian Salomon <bsalomon@google.com>
> > Commit-Queue: Robert Phillips <robertphillips@google.com>
> > 
> 
> TBR=bsalomon@google.com,robertphillips@google.com,reviews@skia.org
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> 
> Change-Id: I225ce7867ebd445067e5ea55ebbfd587f7fe782a
> Reviewed-on: https://skia-review.googlesource.com/4528
> Commit-Queue: Leon Scroggins <scroggo@google.com>
> Reviewed-by: Leon Scroggins <scroggo@google.com>
> 

TBR=bsalomon@google.com,robertphillips@google.com,scroggo@google.com,reviews@skia.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Change-Id: Ifc3b9ac343009a3808f5f47500eef50df438e3d9
Reviewed-on: https://skia-review.googlesource.com/4537
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/tests/RenderTargetContextTest.cpp b/tests/RenderTargetContextTest.cpp
new file mode 100644
index 0000000..9a4b874
--- /dev/null
+++ b/tests/RenderTargetContextTest.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+// This is a GPU-backend specific test.
+
+#include "Test.h"
+
+#if SK_SUPPORT_GPU
+#include "GrTextureProxy.h"
+#include "GrRenderTargetContext.h"
+
+static const int kSize = 64;
+
+static sk_sp<GrRenderTargetContext> get_rtc(GrContext* ctx, bool wrapped) {
+
+    if (wrapped) {
+        return ctx->makeRenderTargetContext(SkBackingFit::kExact,
+                                            kSize, kSize,
+                                            kRGBA_8888_GrPixelConfig, nullptr);
+    } else {
+        return ctx->makeDeferredRenderTargetContext(SkBackingFit::kExact,
+                                                    kSize, kSize,
+                                                    kRGBA_8888_GrPixelConfig, nullptr);
+    }
+}
+
+static void check_is_wrapped_status(skiatest::Reporter* reporter,
+                                    GrRenderTargetContext* rtCtx,
+                                    bool wrappedExpectation) {
+    REPORTER_ASSERT(reporter, rtCtx->isWrapped_ForTesting() == wrappedExpectation);
+
+    GrTextureProxy* tProxy = rtCtx->asDeferredTexture();
+    REPORTER_ASSERT(reporter, tProxy);
+
+    REPORTER_ASSERT(reporter, tProxy->isWrapped_ForTesting() == wrappedExpectation);
+}
+
+DEF_GPUTEST_FOR_RENDERING_CONTEXTS(RenderTargetContextTest, reporter, ctxInfo) {
+    GrContext* ctx = ctxInfo.grContext();
+
+    // A wrapped rtCtx's textureProxy is also wrapped
+    {
+        sk_sp<GrRenderTargetContext> rtCtx(get_rtc(ctx, true));
+        check_is_wrapped_status(reporter, rtCtx.get(), true);
+    }
+
+    // A deferred rtCtx's textureProxy is also deferred and GrRenderTargetContext::instantiate()
+    // swaps both from deferred to wrapped
+    {
+        sk_sp<GrRenderTargetContext> rtCtx(get_rtc(ctx, false));
+
+        check_is_wrapped_status(reporter, rtCtx.get(), false);
+
+        GrRenderTarget* rt = rtCtx->instantiate();
+        REPORTER_ASSERT(reporter, rt);
+
+        check_is_wrapped_status(reporter, rtCtx.get(), true);
+    }
+
+    // Calling instantiate on a GrRenderTargetContext's textureProxy also instantiates the
+    // GrRenderTargetContext
+    {
+        sk_sp<GrRenderTargetContext> rtCtx(get_rtc(ctx, false));
+
+        check_is_wrapped_status(reporter, rtCtx.get(), false);
+
+        GrTextureProxy* tProxy = rtCtx->asDeferredTexture();
+        REPORTER_ASSERT(reporter, tProxy);
+
+        GrTexture* tex = tProxy->instantiate(ctx->textureProvider());
+        REPORTER_ASSERT(reporter, tex);
+
+        check_is_wrapped_status(reporter, rtCtx.get(), true);
+    }
+
+    // readPixels switches a deferred rtCtx to wrapped
+    {
+        sk_sp<GrRenderTargetContext> rtCtx(get_rtc(ctx, false));
+
+        check_is_wrapped_status(reporter, rtCtx.get(), false);
+
+        SkImageInfo dstInfo = SkImageInfo::MakeN32Premul(kSize, kSize);
+        SkAutoTMalloc<uint32_t> dstBuffer(kSize * kSize);
+        static const size_t kRowBytes = sizeof(uint32_t) * kSize;
+
+        bool result = rtCtx->readPixels(dstInfo, dstBuffer.get(), kRowBytes, 0, 0);
+        REPORTER_ASSERT(reporter, result);
+
+        check_is_wrapped_status(reporter, rtCtx.get(), true);
+    }
+
+    // TODO: in a future world we should be able to add a test that the majority of
+    // GrRenderTargetContext calls do not force the instantiation of a deferred 
+    // GrRenderTargetContext
+}
+#endif