Use GrSemaphore rather than GrFence for external texture data

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>
This commit is contained in:
Brian Osman 2017-03-02 15:09:20 -05:00 committed by Skia Commit-Bot
parent e836b7817e
commit fe3b51636d
10 changed files with 53 additions and 32 deletions

View 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",

View File

@ -324,12 +324,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.
*/

View File

@ -10,21 +10,19 @@
#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

View 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;
};

View 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;

View 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

View 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;
};

View File

@ -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);
}

View 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();

View 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,