Combine GPU flush with semaphore API
Bug: skia:
Change-Id: I5f388760d43b19755b2767d95d32065f6d0f926e
Reviewed-on: https://skia-review.googlesource.com/14646
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
index 523add5..e1b611f 100644
--- a/src/gpu/GrGpu.h
+++ b/src/gpu/GrGpu.h
@@ -385,13 +385,9 @@
virtual void deleteFence(GrFence) const = 0;
virtual sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore() = 0;
- virtual void insertSemaphore(sk_sp<GrSemaphore> semaphore) = 0;
+ virtual void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush = false) = 0;
virtual void waitSemaphore(sk_sp<GrSemaphore> semaphore) = 0;
- // Ensures that all queued up driver-level commands have been sent to the GPU. For example, on
- // OpenGL, this calls glFlush.
- virtual void flush() = 0;
-
///////////////////////////////////////////////////////////////////////////
// Debugging and Stats
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index da3ec49..8a44766 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -4492,12 +4492,16 @@
return GrGLSemaphore::Make(this);
}
-void GrGLGpu::insertSemaphore(sk_sp<GrSemaphore> semaphore) {
+void GrGLGpu::insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush) {
GrGLSemaphore* glSem = static_cast<GrGLSemaphore*>(semaphore.get());
GrGLsync sync;
GL_CALL_RET(sync, FenceSync(GR_GL_SYNC_GPU_COMMANDS_COMPLETE, 0));
glSem->setSync(sync);
+
+ if (flush) {
+ GL_CALL(Flush());
+ }
}
void GrGLGpu::waitSemaphore(sk_sp<GrSemaphore> semaphore) {
@@ -4509,7 +4513,3 @@
void GrGLGpu::deleteSync(GrGLsync sync) const {
GL_CALL(DeleteSync(sync));
}
-
-void GrGLGpu::flush() {
- GL_CALL(Flush());
-}
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
index f7e75cc..c352efe 100644
--- a/src/gpu/gl/GrGLGpu.h
+++ b/src/gpu/gl/GrGLGpu.h
@@ -147,13 +147,11 @@
void deleteFence(GrFence) const override;
sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore() override;
- void insertSemaphore(sk_sp<GrSemaphore> semaphore) override;
+ void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush) override;
void waitSemaphore(sk_sp<GrSemaphore> semaphore) override;
void deleteSync(GrGLsync) const;
- void flush() override;
-
private:
GrGLGpu(GrGLContext* ctx, GrContext* context);
diff --git a/src/gpu/gl/GrGLTexture.cpp b/src/gpu/gl/GrGLTexture.cpp
index fdbcf62..d722f38 100644
--- a/src/gpu/gl/GrGLTexture.cpp
+++ b/src/gpu/gl/GrGLTexture.cpp
@@ -122,8 +122,7 @@
// Set up a semaphore to be signaled once the data is ready, and flush GL
sk_sp<GrSemaphore> semaphore = this->getContext()->resourceProvider()->makeSemaphore();
- this->getGpu()->insertSemaphore(semaphore);
- this->getGpu()->flush();
+ this->getGpu()->insertSemaphore(semaphore, true);
// Make a copy of our GL-specific information
auto data = skstd::make_unique<GrGLExternalTextureData>(fInfo, std::move(semaphore),
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 66dbf42..a107ee2 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -1924,9 +1924,10 @@
return GrVkSemaphore::Make(this);
}
-void GrVkGpu::insertSemaphore(sk_sp<GrSemaphore> semaphore) {
+void GrVkGpu::insertSemaphore(sk_sp<GrSemaphore> semaphore, bool /*flush*/) {
GrVkSemaphore* vkSem = static_cast<GrVkSemaphore*>(semaphore.get());
+ // We *always* flush, so ignore that parameter
this->submitCommandBuffer(kSkip_SyncQueue, vkSem->getResource());
}
@@ -1937,7 +1938,3 @@
resource->ref();
fSemaphoresToWaitOn.push_back(resource);
}
-
-void GrVkGpu::flush() {
- // We submit the command buffer to the queue whenever Ganesh is flushed, so nothing is needed
-}
diff --git a/src/gpu/vk/GrVkGpu.h b/src/gpu/vk/GrVkGpu.h
index d3e1555..b7a68dc 100644
--- a/src/gpu/vk/GrVkGpu.h
+++ b/src/gpu/vk/GrVkGpu.h
@@ -133,11 +133,9 @@
void deleteFence(GrFence) const override;
sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore() override;
- void insertSemaphore(sk_sp<GrSemaphore> semaphore) override;
+ void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush) override;
void waitSemaphore(sk_sp<GrSemaphore> semaphore) override;
- void flush() override;
-
void generateMipmap(GrVkTexture* tex);
bool updateBuffer(GrVkBuffer* buffer, const void* src, VkDeviceSize offset, VkDeviceSize size);