diff options
-rw-r--r-- | include/core/SkSurface.h | 14 | ||||
-rw-r--r-- | include/gpu/GrBackendSemaphore.h | 7 | ||||
-rw-r--r-- | include/gpu/GrContext.h | 30 | ||||
-rw-r--r-- | src/gpu/GrContext.cpp | 11 | ||||
-rw-r--r-- | src/gpu/GrDrawingManager.cpp | 25 | ||||
-rw-r--r-- | src/gpu/GrDrawingManager.h | 18 | ||||
-rw-r--r-- | src/gpu/GrGpu.cpp | 25 | ||||
-rw-r--r-- | src/gpu/GrGpu.h | 10 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetContext.cpp | 38 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetContext.h | 3 | ||||
-rw-r--r-- | src/gpu/GrSemaphore.h | 1 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 4 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.h | 3 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 8 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.h | 2 | ||||
-rw-r--r-- | src/gpu/mock/GrMockGpu.h | 2 | ||||
-rw-r--r-- | src/gpu/mtl/GrMtlGpu.h | 2 | ||||
-rw-r--r-- | src/gpu/vk/GrVkCopyManager.cpp | 2 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.cpp | 5 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.h | 4 | ||||
-rw-r--r-- | src/image/SkSurface.cpp | 3 | ||||
-rw-r--r-- | src/image/SkSurface_Base.h | 5 | ||||
-rw-r--r-- | src/image/SkSurface_Gpu.cpp | 3 | ||||
-rw-r--r-- | src/image/SkSurface_Gpu.h | 3 | ||||
-rw-r--r-- | tests/SurfaceSemaphoreTest.cpp | 58 |
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()); |