aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkSurface.h14
-rw-r--r--include/gpu/GrBackendSemaphore.h7
-rw-r--r--include/gpu/GrContext.h30
-rw-r--r--src/gpu/GrContext.cpp11
-rw-r--r--src/gpu/GrDrawingManager.cpp25
-rw-r--r--src/gpu/GrDrawingManager.h18
-rw-r--r--src/gpu/GrGpu.cpp25
-rw-r--r--src/gpu/GrGpu.h10
-rw-r--r--src/gpu/GrRenderTargetContext.cpp38
-rw-r--r--src/gpu/GrRenderTargetContext.h3
-rw-r--r--src/gpu/GrSemaphore.h1
-rw-r--r--src/gpu/SkGpuDevice.cpp4
-rw-r--r--src/gpu/SkGpuDevice.h3
-rw-r--r--src/gpu/gl/GrGLGpu.cpp8
-rw-r--r--src/gpu/gl/GrGLGpu.h2
-rw-r--r--src/gpu/mock/GrMockGpu.h2
-rw-r--r--src/gpu/mtl/GrMtlGpu.h2
-rw-r--r--src/gpu/vk/GrVkCopyManager.cpp2
-rw-r--r--src/gpu/vk/GrVkGpu.cpp5
-rw-r--r--src/gpu/vk/GrVkGpu.h4
-rw-r--r--src/image/SkSurface.cpp3
-rw-r--r--src/image/SkSurface_Base.h5
-rw-r--r--src/image/SkSurface_Gpu.cpp3
-rw-r--r--src/image/SkSurface_Gpu.h3
-rw-r--r--tests/SurfaceSemaphoreTest.cpp58
25 files changed, 93 insertions, 193 deletions
diff --git a/include/core/SkSurface.h b/include/core/SkSurface.h
index d977391442..4a8d81205f 100644
--- a/include/core/SkSurface.h
+++ b/include/core/SkSurface.h
@@ -18,7 +18,6 @@ class GrBackendRenderTarget;
class GrBackendSemaphore;
class GrContext;
class GrRenderTarget;
-enum class GrSemaphoresSubmitted;
/**
* SkSurface is responsible for managing the pixels that a canvas draws into. The pixels can be
@@ -330,21 +329,16 @@ public:
* If it is not initialized, a new semaphore is created and the GrBackendSemaphore object
* is initialized with that semaphore.
*
- * The client will own and be responsible for deleting the underlying semaphores that are stored
- * and returned in initialized GrBackendSemaphore objects. The GrBackendSemaphore objects
- * themselves can be deleted as soon as this function returns.
- *
* If the backend API is OpenGL only uninitialized GrBackendSemaphores are supported.
* If the backend API is Vulkan either initialized or unitialized semaphores are supported.
* If unitialized, the semaphores which are created will be valid for use only with the VkDevice
* with which they were created.
*
- * If this call returns GrSemaphoresSubmited::kNo, the GPU backend will not have created or
- * added any semaphores to signal on the GPU. Thus the client should not have the GPU wait on
- * any of the semaphores. However, any pending surface IO will still be flushed.
+ * If this call returns false, the GPU backend will not have created or added any semaphores to
+ * signal. Thus the array of semaphores will remain uninitialized. However, any pending surface
+ * IO will still be flush.
*/
- GrSemaphoresSubmitted flushAndSignalSemaphores(int numSemaphores,
- GrBackendSemaphore signalSemaphores[]);
+ bool flushAndSignalSemaphores(int numSemaphores, GrBackendSemaphore* signalSemaphores);
/**
* Inserts a list of GPU semaphores that the current backend 3D API must wait on before
diff --git a/include/gpu/GrBackendSemaphore.h b/include/gpu/GrBackendSemaphore.h
index cea3745270..5c41532cb9 100644
--- a/include/gpu/GrBackendSemaphore.h
+++ b/include/gpu/GrBackendSemaphore.h
@@ -16,13 +16,6 @@
#include "vk/GrVkTypes.h"
#endif
-// Enum used as return value when flush with semaphores so the client knows whether the
-// semaphores were submitted to GPU or not.
-enum class GrSemaphoresSubmitted {
- kNo,
- kYes,
-};
-
/**
* Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object.
*/
diff --git a/include/gpu/GrContext.h b/include/gpu/GrContext.h
index 46a9008b63..f48b8db710 100644
--- a/include/gpu/GrContext.h
+++ b/include/gpu/GrContext.h
@@ -17,7 +17,6 @@
#include "../private/GrSingleOwner.h"
class GrAtlasGlyphCache;
-class GrBackendSemaphore;
struct GrContextOptions;
class GrContextPriv;
class GrContextThreadSafeProxy;
@@ -44,8 +43,6 @@ class SkTraceMemoryDump;
class SkImage;
class SkSurfaceProps;
-enum class GrSemaphoresSubmitted;
-
class SK_API GrContext : public SkRefCnt {
public:
/**
@@ -240,35 +237,12 @@ public:
// Misc.
/**
- * Call to ensure all drawing to the context has been issued to the underlying 3D API.
+ * Call to ensure all drawing to the context has been issued to the
+ * underlying 3D API.
*/
void flush();
/**
- * Call to ensure all drawing to the context has been issued to the underlying 3D API. After
- * issuing all commands, numSemaphore semaphores will be signaled by the gpu. The client passes
- * in an array of numSemaphores GrBackendSemaphores. In general these GrBackendSemaphore's can
- * be either initialized or not. If they are initialized, the backend uses the passed in
- * semaphore. If it is not initialized, a new semaphore is created and the GrBackendSemaphore
- * object is initialized with that semaphore.
- *
- * The client will own and be responsible for deleting the underlying semaphores that are stored
- * and returned in initialized GrBackendSemaphore objects. The GrBackendSemaphore objects
- * themselves can be deleted as soon as this function returns.
- *
- * If the backend API is OpenGL only uninitialized GrBackendSemaphores are supported.
- * If the backend API is Vulkan either initialized or unitialized semaphores are supported.
- * If unitialized, the semaphores which are created will be valid for use only with the VkDevice
- * with which they were created.
- *
- * If this call returns GrSemaphoresSubmited::kNo, the GPU backend will not have created or
- * added any semaphores to signal on the GPU. Thus the client should not have the GPU wait on
- * any of the semaphores. However, any pending commands to the context will still be flushed.
- */
- GrSemaphoresSubmitted flushAndSignalSemaphores(int numSemaphores,
- GrBackendSemaphore signalSemaphores[]);
-
- /**
* An ID associated with this context, guaranteed to be unique.
*/
uint32_t uniqueID() { return fUniqueID; }
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 6abfb6ae21..88fe379c37 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -5,7 +5,6 @@
* found in the LICENSE file.
*/
-#include "GrBackendSemaphore.h"
#include "GrContext.h"
#include "GrClip.h"
#include "GrContextOptions.h"
@@ -266,14 +265,6 @@ void GrContext::flush() {
fDrawingManager->flush(nullptr);
}
-GrSemaphoresSubmitted GrContext::flushAndSignalSemaphores(int numSemaphores,
- GrBackendSemaphore signalSemaphores[]) {
- ASSERT_SINGLE_OWNER
- if (fDrawingManager->wasAbandoned()) { return GrSemaphoresSubmitted::kNo; }
-
- return fDrawingManager->flush(nullptr, numSemaphores, signalSemaphores);
-}
-
void GrContextPriv::flush(GrSurfaceProxy* proxy) {
ASSERT_SINGLE_OWNER_PRIV
RETURN_IF_ABANDONED_PRIV
@@ -606,7 +597,7 @@ void GrContextPriv::prepareSurfaceForExternalIO(GrSurfaceProxy* proxy) {
RETURN_IF_ABANDONED_PRIV
SkASSERT(proxy);
ASSERT_OWNED_PROXY_PRIV(proxy);
- fContext->fDrawingManager->prepareSurfaceForExternalIO(proxy, 0, nullptr);
+ fContext->fDrawingManager->prepareSurfaceForExternalIO(proxy);
}
void GrContextPriv::flushSurfaceWrites(GrSurfaceProxy* proxy) {
diff --git a/src/gpu/GrDrawingManager.cpp b/src/gpu/GrDrawingManager.cpp
index 8de2471cac..eeb107118c 100644
--- a/src/gpu/GrDrawingManager.cpp
+++ b/src/gpu/GrDrawingManager.cpp
@@ -7,7 +7,6 @@
#include "GrDrawingManager.h"
-#include "GrBackendSemaphore.h"
#include "GrContext.h"
#include "GrGpu.h"
#include "GrOnFlushResourceProvider.h"
@@ -84,14 +83,11 @@ gr_instanced::OpAllocator* GrDrawingManager::instancingAllocator() {
}
// MDB TODO: make use of the 'proxy' parameter.
-GrSemaphoresSubmitted GrDrawingManager::internalFlush(GrSurfaceProxy*,
- GrResourceCache::FlushType type,
- int numSemaphores,
- GrBackendSemaphore backendSemaphores[]) {
+void GrDrawingManager::internalFlush(GrSurfaceProxy*, GrResourceCache::FlushType type) {
GR_CREATE_TRACE_MARKER_CONTEXT("GrDrawingManager", "internalFlush", fContext);
if (fFlushing || this->wasAbandoned()) {
- return GrSemaphoresSubmitted::kNo;
+ return;
}
fFlushing = true;
bool flushed = false;
@@ -194,8 +190,7 @@ GrSemaphoresSubmitted GrDrawingManager::internalFlush(GrSurfaceProxy*,
SkASSERT(fFlushState.nextDrawToken() == fFlushState.nextTokenToFlush());
- GrSemaphoresSubmitted result = fContext->getGpu()->finishFlush(numSemaphores,
- backendSemaphores);
+ fContext->getGpu()->finishFlush();
fFlushState.reset();
// We always have to notify the cache when it requested a flush so it can reset its state.
@@ -206,23 +201,20 @@ GrSemaphoresSubmitted GrDrawingManager::internalFlush(GrSurfaceProxy*,
onFlushCBObject->postFlush();
}
fFlushing = false;
-
- return result;
}
-GrSemaphoresSubmitted GrDrawingManager::prepareSurfaceForExternalIO(
- GrSurfaceProxy* proxy, int numSemaphores, GrBackendSemaphore backendSemaphores[]) {
+void GrDrawingManager::prepareSurfaceForExternalIO(GrSurfaceProxy* proxy) {
if (this->wasAbandoned()) {
- return GrSemaphoresSubmitted::kNo;
+ return;
}
SkASSERT(proxy);
- if (proxy->priv().hasPendingIO() || numSemaphores) {
- return this->flush(proxy, numSemaphores, backendSemaphores);
+ if (proxy->priv().hasPendingIO()) {
+ this->flush(proxy);
}
if (!proxy->instantiate(fContext->resourceProvider())) {
- return GrSemaphoresSubmitted::kNo;
+ return;
}
GrSurface* surface = proxy->priv().peekSurface();
@@ -230,7 +222,6 @@ GrSemaphoresSubmitted GrDrawingManager::prepareSurfaceForExternalIO(
if (fContext->getGpu() && surface->asRenderTarget()) {
fContext->getGpu()->resolveRenderTarget(surface->asRenderTarget());
}
- return GrSemaphoresSubmitted::kNo;
}
void GrDrawingManager::addOnFlushCallbackObject(GrOnFlushCallbackObject* onFlushCBObject) {
diff --git a/src/gpu/GrDrawingManager.h b/src/gpu/GrDrawingManager.h
index 6a1ad19d93..e7995fd80d 100644
--- a/src/gpu/GrDrawingManager.h
+++ b/src/gpu/GrDrawingManager.h
@@ -64,15 +64,13 @@ public:
void flushIfNecessary() {
if (fContext->getResourceCache()->requestsFlush()) {
- this->internalFlush(nullptr, GrResourceCache::kCacheRequested, 0, nullptr);
+ this->internalFlush(nullptr, GrResourceCache::kCacheRequested);
}
}
static bool ProgramUnitTest(GrContext* context, int maxStages, int maxLevels);
- GrSemaphoresSubmitted prepareSurfaceForExternalIO(GrSurfaceProxy*,
- int numSemaphores,
- GrBackendSemaphore backendSemaphores[]);
+ void prepareSurfaceForExternalIO(GrSurfaceProxy*);
void addOnFlushCallbackObject(GrOnFlushCallbackObject*);
void testingOnly_removeOnFlushCallbackObject(GrOnFlushCallbackObject*);
@@ -95,16 +93,10 @@ private:
void abandon();
void cleanup();
void reset();
- GrSemaphoresSubmitted flush(GrSurfaceProxy* proxy,
- int numSemaphores = 0,
- GrBackendSemaphore backendSemaphores[] = nullptr) {
- return this->internalFlush(proxy, GrResourceCache::FlushType::kExternal,
- numSemaphores, backendSemaphores);
+ void flush(GrSurfaceProxy* proxy) {
+ this->internalFlush(proxy, GrResourceCache::FlushType::kExternal);
}
- GrSemaphoresSubmitted internalFlush(GrSurfaceProxy*,
- GrResourceCache::FlushType,
- int numSemaphores,
- GrBackendSemaphore backendSemaphores[]);
+ void internalFlush(GrSurfaceProxy*, GrResourceCache::FlushType);
friend class GrContext; // for access to: ctor, abandon, reset & flush
friend class GrContextPriv; // access to: flush
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp
index 2f4b3f784e..afe3956747 100644
--- a/src/gpu/GrGpu.cpp
+++ b/src/gpu/GrGpu.cpp
@@ -8,7 +8,6 @@
#include "GrGpu.h"
-#include "GrBackendSemaphore.h"
#include "GrBackendSurface.h"
#include "GrBuffer.h"
#include "GrCaps.h"
@@ -20,7 +19,6 @@
#include "GrRenderTargetPriv.h"
#include "GrResourceCache.h"
#include "GrResourceProvider.h"
-#include "GrSemaphore.h"
#include "GrStencilAttachment.h"
#include "GrStencilSettings.h"
#include "GrSurfacePriv.h"
@@ -515,26 +513,3 @@ bool GrGpu::SamplePatternComparator::operator()(const SamplePattern& a,
}
return false; // Equal.
}
-
-GrSemaphoresSubmitted GrGpu::finishFlush(int numSemaphores,
- GrBackendSemaphore backendSemaphores[]) {
- if (this->caps()->fenceSyncSupport()) {
- for (int i = 0; i < numSemaphores; ++i) {
- sk_sp<GrSemaphore> semaphore;
- if (backendSemaphores[i].isInitialized()) {
- semaphore = fContext->resourceProvider()->wrapBackendSemaphore(
- backendSemaphores[i], kBorrow_GrWrapOwnership);
- } else {
- semaphore = fContext->resourceProvider()->makeSemaphore(false);
- }
- this->insertSemaphore(semaphore, false);
-
- if (!backendSemaphores[i].isInitialized()) {
- semaphore->setBackendSemaphore(&backendSemaphores[i]);
- }
- }
- }
- this->onFinishFlush((numSemaphores > 0 && this->caps()->fenceSyncSupport()));
- return this->caps()->fenceSyncSupport() ? GrSemaphoresSubmitted::kYes
- : GrSemaphoresSubmitted::kNo;
-}
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
index 9d8e65a350..c6684ac4fa 100644
--- a/src/gpu/GrGpu.h
+++ b/src/gpu/GrGpu.h
@@ -41,8 +41,6 @@ class GrStencilSettings;
class GrSurface;
class GrTexture;
-enum class GrSemaphoresSubmitted;
-
namespace gr_instanced {
class InstancedOp;
class InstancedRendering;
@@ -377,10 +375,8 @@ public:
const GrGpuCommandBuffer::LoadAndStoreInfo& stencilInfo) = 0;
// Called by GrDrawingManager when flushing.
- // Provides a hook for post-flush actions (e.g. Vulkan command buffer submits). This will also
- // insert any numSemaphore semaphores on the gpu and set the backendSemaphores to match the
- // inserted semaphores.
- GrSemaphoresSubmitted finishFlush(int numSemaphores, GrBackendSemaphore backendSemaphores[]);
+ // Provides a hook for post-flush actions (e.g. Vulkan command buffer submits).
+ virtual void finishFlush() {}
virtual GrFence SK_WARN_UNUSED_RESULT insertFence() = 0;
virtual bool waitFence(GrFence, uint64_t timeout = 1000) = 0;
@@ -619,8 +615,6 @@ private:
virtual void onQueryMultisampleSpecs(GrRenderTarget*, const GrStencilSettings&,
int* effectiveSampleCnt, SamplePattern*) = 0;
- virtual void onFinishFlush(bool insertedSemaphores) = 0;
-
void resetContext() {
this->onResetContext(fResetBits);
fResetBits = 0;
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index 2247eb3eaa..c9898c7480 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -1412,16 +1412,42 @@ void GrRenderTargetContext::drawImageLattice(const GrClip& clip,
this->addDrawOp(clip, std::move(op));
}
-GrSemaphoresSubmitted GrRenderTargetContext::prepareForExternalIO(
- int numSemaphores, GrBackendSemaphore backendSemaphores[]) {
+bool GrRenderTargetContext::prepareForExternalIO(int numSemaphores,
+ GrBackendSemaphore* backendSemaphores) {
ASSERT_SINGLE_OWNER
- if (this->drawingManager()->wasAbandoned()) { return GrSemaphoresSubmitted::kNo; }
+ RETURN_FALSE_IF_ABANDONED
SkDEBUGCODE(this->validate();)
GR_CREATE_TRACE_MARKER_CONTEXT("GrRenderTargetContext", "prepareForExternalIO", fContext);
- return this->drawingManager()->prepareSurfaceForExternalIO(fRenderTargetProxy.get(),
- numSemaphores,
- backendSemaphores);
+ if (numSemaphores && !this->caps()->fenceSyncSupport()) {
+ this->drawingManager()->prepareSurfaceForExternalIO(fRenderTargetProxy.get());
+ return false;
+ }
+
+ SkTArray<sk_sp<GrSemaphore>> semaphores(numSemaphores);
+ for (int i = 0; i < numSemaphores; ++i) {
+ if (backendSemaphores[i].isInitialized()) {
+ semaphores.push_back(fContext->resourceProvider()->wrapBackendSemaphore(
+ backendSemaphores[i], kBorrow_GrWrapOwnership));
+ } else {
+ semaphores.push_back(fContext->resourceProvider()->makeSemaphore(false));
+ }
+ // Create signal semaphore ops and force the final one to call flush.
+ bool forceFlush = (i == (numSemaphores - 1));
+ std::unique_ptr<GrOp> signalOp(GrSemaphoreOp::MakeSignal(semaphores.back(),
+ fRenderTargetProxy.get(),
+ forceFlush));
+ this->getRTOpList()->addOp(std::move(signalOp), *this->caps());
+ }
+
+ this->drawingManager()->prepareSurfaceForExternalIO(fRenderTargetProxy.get());
+
+ for (int i = 0; i < numSemaphores; ++i) {
+ if (!backendSemaphores[i].isInitialized()) {
+ semaphores[i]->setBackendSemaphore(&backendSemaphores[i]);
+ }
+ }
+ return true;
}
bool GrRenderTargetContext::waitOnSemaphores(int numSemaphores,
diff --git a/src/gpu/GrRenderTargetContext.h b/src/gpu/GrRenderTargetContext.h
index 964d9e9a4e..1958ed7c8e 100644
--- a/src/gpu/GrRenderTargetContext.h
+++ b/src/gpu/GrRenderTargetContext.h
@@ -303,8 +303,7 @@ public:
* After this returns any pending surface IO will be issued to the backend 3D API and
* if the surface has MSAA it will be resolved.
*/
- GrSemaphoresSubmitted prepareForExternalIO(int numSemaphores,
- GrBackendSemaphore backendSemaphores[]);
+ bool prepareForExternalIO(int numSemaphores, GrBackendSemaphore* backendSemaphores);
/**
* The next time this GrRenderTargetContext is flushed, the gpu will wait on the passed in
diff --git a/src/gpu/GrSemaphore.h b/src/gpu/GrSemaphore.h
index fbc5a6df56..f6148b015a 100644
--- a/src/gpu/GrSemaphore.h
+++ b/src/gpu/GrSemaphore.h
@@ -29,7 +29,6 @@ private:
protected:
explicit GrSemaphore(const GrGpu* gpu) : fGpu(gpu) {}
- friend class GrGpu; // setBackendSemaphore
friend class GrRenderTargetContext; // setBackendSemaphore
friend class GrResourceProvider; // resetGpu
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 607165cfd3..57b2d41def 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -1734,8 +1734,8 @@ void SkGpuDevice::flush() {
this->flushAndSignalSemaphores(0, nullptr);
}
-GrSemaphoresSubmitted SkGpuDevice::flushAndSignalSemaphores(int numSemaphores,
- GrBackendSemaphore signalSemaphores[]) {
+bool SkGpuDevice::flushAndSignalSemaphores(int numSemaphores,
+ GrBackendSemaphore* signalSemaphores) {
ASSERT_SINGLE_OWNER
return fRenderTargetContext->prepareForExternalIO(numSemaphores, signalSemaphores);
diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h
index f1bd937269..3fc3807d22 100644
--- a/src/gpu/SkGpuDevice.h
+++ b/src/gpu/SkGpuDevice.h
@@ -118,8 +118,7 @@ public:
sk_sp<SkSpecialImage> snapSpecial() override;
void flush() override;
- GrSemaphoresSubmitted flushAndSignalSemaphores(int numSemaphores,
- GrBackendSemaphore signalSemaphores[]);
+ bool flushAndSignalSemaphores(int numSemaphores, GrBackendSemaphore* signalSemaphores);
bool wait(int numSemaphores, const GrBackendSemaphore* waitSemaphores);
bool onAccessPixels(SkPixmap*) override;
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 209cd41be9..49be761350 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -4352,13 +4352,6 @@ bool GrGLGpu::onIsACopyNeededForTextureParams(GrTextureProxy* proxy,
return false;
}
-void GrGLGpu::onFinishFlush(bool insertedSemaphore) {
- // If we inserted semaphores during the flush, we need to call GLFlush.
- if (insertedSemaphore) {
- GL_CALL(Flush());
- }
-}
-
GrFence SK_WARN_UNUSED_RESULT GrGLGpu::insertFence() {
SkASSERT(this->caps()->fenceSyncSupport());
GrGLsync sync;
@@ -4388,6 +4381,7 @@ sk_sp<GrSemaphore> GrGLGpu::wrapBackendSemaphore(const GrBackendSemaphore& semap
return GrGLSemaphore::MakeWrapped(this, semaphore.glSync(), ownership);
}
+
void GrGLGpu::insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush) {
GrGLSemaphore* glSem = static_cast<GrGLSemaphore*>(semaphore.get());
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
index b1d19be042..9b6e004bd5 100644
--- a/src/gpu/gl/GrGLGpu.h
+++ b/src/gpu/gl/GrGLGpu.h
@@ -284,8 +284,6 @@ private:
void flushBlend(const GrXferProcessor::BlendInfo& blendInfo, const GrSwizzle&);
- void onFinishFlush(bool insertedSemaphores) override;
-
bool hasExtension(const char* ext) const { return fGLContext->hasExtension(ext); }
bool copySurfaceAsDraw(GrSurface* dst,
diff --git a/src/gpu/mock/GrMockGpu.h b/src/gpu/mock/GrMockGpu.h
index 5745a685ae..e31570ad07 100644
--- a/src/gpu/mock/GrMockGpu.h
+++ b/src/gpu/mock/GrMockGpu.h
@@ -122,8 +122,6 @@ private:
void onResolveRenderTarget(GrRenderTarget* target) override { return; }
- void onFinishFlush(bool insertedSemaphores) override {}
-
GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
int width,
int height) override;
diff --git a/src/gpu/mtl/GrMtlGpu.h b/src/gpu/mtl/GrMtlGpu.h
index edb3059655..f150e3034a 100644
--- a/src/gpu/mtl/GrMtlGpu.h
+++ b/src/gpu/mtl/GrMtlGpu.h
@@ -126,8 +126,6 @@ private:
void onResolveRenderTarget(GrRenderTarget* target) override { return; }
- void onFinishFlush(bool insertedSemaphores) override {}
-
GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
int width,
int height) override {
diff --git a/src/gpu/vk/GrVkCopyManager.cpp b/src/gpu/vk/GrVkCopyManager.cpp
index 3851bc650a..f0dc60297b 100644
--- a/src/gpu/vk/GrVkCopyManager.cpp
+++ b/src/gpu/vk/GrVkCopyManager.cpp
@@ -160,7 +160,7 @@ bool GrVkCopyManager::copySurfaceAsDraw(GrVkGpu* gpu,
if (gpu->vkCaps().newCBOnPipelineChange()) {
// We bind a new pipeline here for the copy so we must start a new command buffer.
- gpu->finishFlush(0, nullptr);
+ gpu->finishFlush();
}
GrVkRenderTarget* rt = static_cast<GrVkRenderTarget*>(dst->asRenderTarget());
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 5979ae0f49..d7094b7c18 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -1467,9 +1467,8 @@ void GrVkGpu::addImageMemoryBarrier(VkPipelineStageFlags srcStageMask,
barrier);
}
-void GrVkGpu::onFinishFlush(bool insertedSemaphore) {
- // Submit the current command buffer to the Queue. Whether we inserted semaphores or not does
- // not effect what we do here.
+void GrVkGpu::finishFlush() {
+ // Submit the current command buffer to the Queue
this->submitCommandBuffer(kSkip_SyncQueue);
}
diff --git a/src/gpu/vk/GrVkGpu.h b/src/gpu/vk/GrVkGpu.h
index d81c2e6c22..419e9e3ad6 100644
--- a/src/gpu/vk/GrVkGpu.h
+++ b/src/gpu/vk/GrVkGpu.h
@@ -125,6 +125,8 @@ public:
GrVkRenderTarget*,
const SkIRect& bounds);
+ void finishFlush() override;
+
GrFence SK_WARN_UNUSED_RESULT insertFence() override;
bool waitFence(GrFence, uint64_t timeout) override;
void deleteFence(GrFence) const override;
@@ -208,8 +210,6 @@ private:
GrPixelConfig config, GrBuffer* transferBuffer,
size_t offset, size_t rowBytes) override;
- void onFinishFlush(bool insertedSemaphores) override;
-
// Ends and submits the current command buffer to the queue and then creates a new command
// buffer and begins it. If sync is set to kForce_SyncQueue, the function will wait for all
// work in the queue to finish before returning. If this GrVkGpu object has any semaphores in
diff --git a/src/image/SkSurface.cpp b/src/image/SkSurface.cpp
index ead0062aa8..29068b2c4a 100644
--- a/src/image/SkSurface.cpp
+++ b/src/image/SkSurface.cpp
@@ -200,8 +200,7 @@ void SkSurface::flush() {
asSB(this)->onFlush(0, nullptr);
}
-GrSemaphoresSubmitted SkSurface::flushAndSignalSemaphores(int numSemaphores,
- GrBackendSemaphore signalSemaphores[]) {
+bool SkSurface::flushAndSignalSemaphores(int numSemaphores, GrBackendSemaphore* signalSemaphores) {
return asSB(this)->onFlush(numSemaphores, signalSemaphores);
}
diff --git a/src/image/SkSurface_Base.h b/src/image/SkSurface_Base.h
index c847b09aab..93528b8d5d 100644
--- a/src/image/SkSurface_Base.h
+++ b/src/image/SkSurface_Base.h
@@ -80,9 +80,8 @@ public:
* Inserts the requested number of semaphores for the gpu to signal when work is complete on the
* gpu and inits the array of GrBackendSemaphores with the signaled semaphores.
*/
- virtual GrSemaphoresSubmitted onFlush(int numSemaphores,
- GrBackendSemaphore signalSemaphores[]) {
- return (GrSemaphoresSubmitted)0;
+ virtual bool onFlush(int numSemaphores, GrBackendSemaphore* signalSemaphores) {
+ return false;
}
/**
diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp
index 7f65a3e2f2..143a6039f0 100644
--- a/src/image/SkSurface_Gpu.cpp
+++ b/src/image/SkSurface_Gpu.cpp
@@ -148,8 +148,7 @@ void SkSurface_Gpu::onDiscard() {
fDevice->accessRenderTargetContext()->discard();
}
-GrSemaphoresSubmitted SkSurface_Gpu::onFlush(int numSemaphores,
- GrBackendSemaphore signalSemaphores[]) {
+bool SkSurface_Gpu::onFlush(int numSemaphores, GrBackendSemaphore* signalSemaphores) {
return fDevice->flushAndSignalSemaphores(numSemaphores, signalSemaphores);
}
diff --git a/src/image/SkSurface_Gpu.h b/src/image/SkSurface_Gpu.h
index ebf7d4ed44..2bc9210b34 100644
--- a/src/image/SkSurface_Gpu.h
+++ b/src/image/SkSurface_Gpu.h
@@ -26,8 +26,7 @@ public:
sk_sp<SkImage> onNewImageSnapshot() override;
void onCopyOnWrite(ContentChangeMode) override;
void onDiscard() override;
- GrSemaphoresSubmitted onFlush(int numSemaphores,
- GrBackendSemaphore signalSemaphores[]) override;
+ bool onFlush(int numSemaphores, GrBackendSemaphore* signalSemaphores) override;
bool onWait(int numSemaphores, const GrBackendSemaphore* waitSemaphores) override;
SkGpuDevice* getDevice() { return fDevice.get(); }
diff --git a/tests/SurfaceSemaphoreTest.cpp b/tests/SurfaceSemaphoreTest.cpp
index bb726c2eec..cd3b8e587b 100644
--- a/tests/SurfaceSemaphoreTest.cpp
+++ b/tests/SurfaceSemaphoreTest.cpp
@@ -108,8 +108,7 @@ void draw_child(skiatest::Reporter* reporter,
void surface_semaphore_test(skiatest::Reporter* reporter,
const sk_gpu_test::ContextInfo& mainInfo,
const sk_gpu_test::ContextInfo& childInfo1,
- const sk_gpu_test::ContextInfo& childInfo2,
- bool flushContext) {
+ const sk_gpu_test::ContextInfo& childInfo2) {
GrContext* mainCtx = mainInfo.grContext();
if (!mainCtx->caps()->fenceSyncSupport()) {
return;
@@ -144,11 +143,7 @@ void surface_semaphore_test(skiatest::Reporter* reporter,
}
#endif
- if (flushContext) {
- mainCtx->flushAndSignalSemaphores(2, semaphores.get());
- } else {
- mainSurface->flushAndSignalSemaphores(2, semaphores.get());
- }
+ mainSurface->flushAndSignalSemaphores(2, semaphores.get());
sk_sp<SkImage> mainImage = mainSurface->makeImageSnapshot();
GrBackendObject backendImage = mainImage->getTextureHandle(false);
@@ -176,35 +171,31 @@ DEF_GPUTEST(SurfaceSemaphores, reporter, factory) {
#endif
for (int typeInt = 0; typeInt < sk_gpu_test::GrContextFactory::kContextTypeCnt; ++typeInt) {
- for (auto flushContext : { false, true }) {
- sk_gpu_test::GrContextFactory::ContextType contextType =
- (sk_gpu_test::GrContextFactory::ContextType) typeInt;
- // Use "native" instead of explicitly trying OpenGL and OpenGL ES. Do not use GLES on
- // desktop since tests do not account for not fixing http://skbug.com/2809
- if (contextType == sk_gpu_test::GrContextFactory::kGL_ContextType ||
- contextType == sk_gpu_test::GrContextFactory::kGLES_ContextType) {
- if (contextType != kNativeGLType) {
- continue;
- }
+ sk_gpu_test::GrContextFactory::ContextType contextType =
+ (sk_gpu_test::GrContextFactory::ContextType) typeInt;
+ // Use "native" instead of explicitly trying OpenGL and OpenGL ES. Do not use GLES on
+ // desktop since tests do not account for not fixing http://skbug.com/2809
+ if (contextType == sk_gpu_test::GrContextFactory::kGL_ContextType ||
+ contextType == sk_gpu_test::GrContextFactory::kGLES_ContextType) {
+ if (contextType != kNativeGLType) {
+ continue;
}
- sk_gpu_test::ContextInfo ctxInfo = factory->getContextInfo(
- contextType, sk_gpu_test::GrContextFactory::ContextOverrides::kDisableNVPR);
- if (!sk_gpu_test::GrContextFactory::IsRenderingContext(contextType)) {
+ }
+ sk_gpu_test::ContextInfo ctxInfo = factory->getContextInfo(
+ contextType, sk_gpu_test::GrContextFactory::ContextOverrides::kDisableNVPR);
+ if (!sk_gpu_test::GrContextFactory::IsRenderingContext(contextType)) {
+ continue;
+ }
+ skiatest::ReporterContext ctx(
+ reporter, SkString(sk_gpu_test::GrContextFactory::ContextTypeName(contextType)));
+ if (ctxInfo.grContext()) {
+ sk_gpu_test::ContextInfo child1 = factory->getSharedContextInfo(ctxInfo.grContext(), 0);
+ sk_gpu_test::ContextInfo child2 = factory->getSharedContextInfo(ctxInfo.grContext(), 1);
+ if (!child1.grContext() || !child2.grContext()) {
continue;
}
- skiatest::ReporterContext ctx(
- reporter, SkString(sk_gpu_test::GrContextFactory::ContextTypeName(contextType)));
- if (ctxInfo.grContext()) {
- sk_gpu_test::ContextInfo child1 = factory->getSharedContextInfo(ctxInfo.grContext(),
- 0);
- sk_gpu_test::ContextInfo child2 = factory->getSharedContextInfo(ctxInfo.grContext(),
- 1);
- if (!child1.grContext() || !child2.grContext()) {
- continue;
- }
- surface_semaphore_test(reporter, ctxInfo, child1, child2, flushContext);
- }
+ surface_semaphore_test(reporter, ctxInfo, child1, child2);
}
}
}
@@ -226,8 +217,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(EmptySurfaceSemaphoreTest, reporter, ctxInfo)
mainSurface->flush();
GrBackendSemaphore semaphore;
- GrSemaphoresSubmitted submitted = mainSurface->flushAndSignalSemaphores(1, &semaphore);
- REPORTER_ASSERT(reporter, GrSemaphoresSubmitted::kYes == submitted);
+ REPORTER_ASSERT(reporter, mainSurface->flushAndSignalSemaphores(1, &semaphore));
if (kOpenGL_GrBackend == ctxInfo.backend()) {
GrGLGpu* gpu = static_cast<GrGLGpu*>(ctx->getGpu());