Use GrSemaphore rather than GrFence for external texture data
authorBrian Osman <brianosman@google.com>
Thu, 2 Mar 2017 20:09:20 +0000 (15:09 -0500)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Thu, 2 Mar 2017 20:47:36 +0000 (20:47 +0000)
BUG=skia:

Change-Id: I0d23eb9dcf5c01c71d3571ef97690af68b900807
Reviewed-on: https://skia-review.googlesource.com/9141
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
gn/gpu.gni
include/gpu/GrContext.h
include/gpu/GrExternalTextureData.h
include/gpu/gl/GrGLTypes.h
include/gpu/vk/GrVkTypes.h
src/gpu/GrContext.cpp
src/gpu/GrSemaphore.h
src/gpu/gl/GrGLExternalTextureData.cpp [new file with mode: 0644]
src/gpu/gl/GrGLTexture.cpp
src/image/SkImage_Gpu.cpp

index 100288f..e57a919 100644 (file)
@@ -385,6 +385,7 @@ skia_gpu_sources = [
   "$_src/gpu/gl/GrGLGpuCommandBuffer.h",
   "$_src/gpu/gl/GrGLGpuProgramCache.cpp",
   "$_src/gpu/gl/GrGLExtensions.cpp",
+  "$_src/gpu/gl/GrGLExternalTextureData.cpp",
   "$_src/gpu/gl/GrGLInterface.cpp",
   "$_src/gpu/gl/GrGLIRect.h",
   "$_src/gpu/gl/GrGLPath.cpp",
index 285525f..702fdb6 100644 (file)
@@ -325,12 +325,6 @@ public:
     void prepareSurfaceForExternalIO(GrSurface*);
 
     /**
-     * As above, but additionally flushes the backend API (eg calls glFlush), and returns a fence
-     * that can be used to determine if the surface is safe to use on another context or thread.
-     */
-    GrFence SK_WARN_UNUSED_RESULT prepareSurfaceForExternalIOAndFlush(GrSurface*);
-
-    /**
      * An ID associated with this context, guaranteed to be unique.
      */
     uint32_t uniqueID() { return fUniqueID; }
index 9ab819c..5943fd8 100644 (file)
 #define GrExternalTextureData_DEFINED
 
 #include "GrTypes.h"
-#include "GrTypesPriv.h"
+
+class GrContext;
 
 class SK_API GrExternalTextureData : SkNoncopyable {
 public:
-    GrExternalTextureData(GrFence fence) : fFence(fence) {}
     virtual ~GrExternalTextureData() {}
     virtual GrBackend getBackend() const = 0;
-    GrFence getFence() const { return fFence; }
-
 protected:
     virtual GrBackendObject getBackendObject() const = 0;
-
-    GrFence fFence;
+    virtual void attachToContext(GrContext*) = 0;
 
     friend class SkCrossContextImageData;
+    friend class SkImage;
 };
 
 #endif
index d03363c..baf87a4 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "GrExternalTextureData.h"
 #include "GrGLConfig.h"
+#include "SkRefCnt.h"
 
 /**
  * Classifies GL contexts by which standard they implement (currently as OpenGL vs. OpenGL ES).
@@ -113,19 +114,21 @@ struct GrGLTextureInfo {
     GrGLuint fID;
 };
 
+class GrSemaphore;
+
 class GrGLExternalTextureData : public GrExternalTextureData {
 public:
-    GrGLExternalTextureData(const GrGLTextureInfo& info, GrFence fence)
-            : INHERITED(fence)
-            , fInfo(info) {}
+    GrGLExternalTextureData(const GrGLTextureInfo& info, sk_sp<GrSemaphore> semaphore);
     GrBackend getBackend() const override { return kOpenGL_GrBackend; }
 
 protected:
     GrBackendObject getBackendObject() const override {
         return reinterpret_cast<GrBackendObject>(&fInfo);
     }
+    void attachToContext(GrContext*) override;
 
     GrGLTextureInfo fInfo;
+    sk_sp<GrSemaphore> fSemaphore;
 
     typedef GrExternalTextureData INHERITED;
 };
index e9a3121..c98a94a 100644 (file)
@@ -62,15 +62,16 @@ struct GrVkImageInfo {
 
 class GrVkExternalTextureData : public GrExternalTextureData {
 public:
-    GrVkExternalTextureData(const GrVkImageInfo& info, GrFence fence)
-            : INHERITED(fence)
-            , fInfo(info) {}
+    GrVkExternalTextureData(const GrVkImageInfo& info) : fInfo(info) {}
     GrBackend getBackend() const override { return kVulkan_GrBackend; }
 
 protected:
     GrBackendObject getBackendObject() const override {
         return reinterpret_cast<GrBackendObject>(&fInfo);
     }
+    void attachToContext(GrContext*) override {
+        // TODO: Implement this
+    }
 
     GrVkImageInfo fInfo;
 
index 97b525d..7dfee00 100644 (file)
@@ -546,13 +546,6 @@ void GrContext::prepareSurfaceForExternalIO(GrSurface* surface) {
     fDrawingManager->prepareSurfaceForExternalIO(surface);
 }
 
-GrFence GrContext::prepareSurfaceForExternalIOAndFlush(GrSurface* surface) {
-    this->prepareSurfaceForExternalIO(surface);
-    GrFence fence = fGpu->insertFence();
-    fGpu->flush();
-    return fence;
-}
-
 void GrContext::flushSurfaceWrites(GrSurface* surface) {
     ASSERT_SINGLE_OWNER
     RETURN_IF_ABANDONED
index bdeff09..717b4bb 100644 (file)
@@ -13,7 +13,7 @@
 class GrGpu;
 
 class GrSemaphore : public SkRefCnt {
-public:
+private:
     // This function should only be used in the case of exporting and importing a GrSemaphore object
     // from one GrContext to another. When exporting, the GrSemaphore should be set to a null GrGpu,
     // and when importing it should be set to the GrGpu of the current context. Once exported, a
@@ -23,6 +23,8 @@ public:
 protected:
     explicit GrSemaphore(const GrGpu* gpu) : fGpu(gpu) {}
 
+    friend class GrGLExternalTextureData; // resetGpu
+
     const GrGpu* fGpu;
 };
 
diff --git a/src/gpu/gl/GrGLExternalTextureData.cpp b/src/gpu/gl/GrGLExternalTextureData.cpp
new file mode 100644 (file)
index 0000000..32c49b1
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrContext.h"
+#include "GrGpu.h"
+#include "GrSemaphore.h"
+#include "gl/GrGLTypes.h"
+
+GrGLExternalTextureData::GrGLExternalTextureData(const GrGLTextureInfo& info,
+                                                 sk_sp<GrSemaphore> semaphore)
+        : fInfo(info)
+        , fSemaphore(std::move(semaphore)) {
+    SkASSERT(fSemaphore->unique());
+    fSemaphore->resetGpu(nullptr);
+}
+
+void GrGLExternalTextureData::attachToContext(GrContext* context) {
+    fSemaphore->resetGpu(context->getGpu());
+    context->getGpu()->waitSemaphore(fSemaphore);
+}
index a560988..ee029bc 100644 (file)
@@ -8,6 +8,7 @@
 #include "GrContext.h"
 #include "GrGLTexture.h"
 #include "GrGLGpu.h"
+#include "GrSemaphore.h"
 #include "GrShaderCaps.h"
 #include "SkMakeUnique.h"
 #include "SkTraceMemoryDump.h"
@@ -114,11 +115,16 @@ GrBackendObject GrGLTexture::getTextureHandle() const {
 }
 
 std::unique_ptr<GrExternalTextureData> GrGLTexture::detachBackendTexture() {
-    // Flush any pending writes to this texture, as well GL itself
-    GrFence fence = this->getContext()->prepareSurfaceForExternalIOAndFlush(this);
+    // Flush any pending writes to this texture
+    this->getContext()->prepareSurfaceForExternalIO(this);
+
+    // Set up a semaphore to be signaled once the data is ready, and flush GL
+    sk_sp<GrSemaphore> semaphore = this->getGpu()->makeSemaphore();
+    this->getGpu()->insertSemaphore(semaphore);
+    this->getGpu()->flush();
 
     // Make a copy of our GL-specific information
-    auto data = skstd::make_unique<GrGLExternalTextureData>(fInfo, fence);
+    auto data = skstd::make_unique<GrGLExternalTextureData>(fInfo, std::move(semaphore));
 
     // Ensure the cache can't reach this texture anymore
     this->detachFromCache();
index 88d1889..37a9193 100644 (file)
@@ -17,6 +17,7 @@
 #include "GrGpu.h"
 #include "GrImageTextureMaker.h"
 #include "GrRenderTargetContext.h"
+#include "GrSemaphore.h"
 #include "GrTextureAdjuster.h"
 #include "GrTexturePriv.h"
 #include "GrTextureProvider.h"
@@ -429,9 +430,7 @@ sk_sp<SkImage> SkImage::MakeFromCrossContextImageData(
     }
 
     if (ccid->fTextureData) {
-        GrFence fence = ccid->fTextureData->getFence();
-        context->getGpu()->waitFence(fence);
-        context->getGpu()->deleteFence(fence);
+        ccid->fTextureData->attachToContext(context);
     }
 
     return MakeFromAdoptedTexture(context, ccid->fDesc, ccid->fAlphaType,