Move Ganesh flush calls from drawLayersInternal to flushAndSubmit
While calling skgpu::ganesh::Flush won't cause any harm in Graphite, it
doesn't make sense to call it from the shared SkiaRenderEngine.
Additionally, making flushAndSubmit accept a destination SkSurface to
support this move will also be required for GraphiteVkRenderEngine.
GaneshVkRenderEngine could probably get away with just one flush call,
but this approach keeps functional parity (and keeps traces equivalent
FWIW).
Unfortunately, drawLayersInternal still needs to call
skgpu::ganesh::Flush when kGaneshFlushAfterEveryLayer is locally
enabled. This could be moved to some abstraction on either
SkiaGpuContext, or the child implementation of SkiaRenderEngine.
However, I'd like to minimize the number of abstracted functions that
*look* load bearing, but actually no-op in Graphite. Since I believe
this is only used for locally investigating shader priming stuff, I
would rather just leave it in a weird (but documented) state until it's
removed.
While moving the call to flushAndSubmit, I also changed it to the
equivalent non-static variant that is called directly on a context,
instead of finding the context from the surface. I feel this might help
differentiate the intent of "maybe flush" in drawLayersInternal vs.
"definitely flush on this context" in flushAndSubmit.
Test: manual validation (GL+VK) & existing tests (refactor)
Bug: b/293371537
Change-Id: Ia78cd8457aa47d6bb80ad5e81eb9d79b7eed5e79
diff --git a/libs/renderengine/skia/SkiaRenderEngine.cpp b/libs/renderengine/skia/SkiaRenderEngine.cpp
index 9e8fe68..5d38e07 100644
--- a/libs/renderengine/skia/SkiaRenderEngine.cpp
+++ b/libs/renderengine/skia/SkiaRenderEngine.cpp
@@ -90,7 +90,7 @@
// Debugging settings
static const bool kPrintLayerSettings = false;
-static const bool kFlushAfterEveryLayer = kPrintLayerSettings;
+static const bool kGaneshFlushAfterEveryLayer = kPrintLayerSettings;
static constexpr bool kEnableLayerBrightening = true;
} // namespace
@@ -1122,8 +1122,12 @@
} else {
canvas->drawRect(bounds.rect(), paint);
}
- if (kFlushAfterEveryLayer) {
+ if (kGaneshFlushAfterEveryLayer) {
ATRACE_NAME("flush surface");
+ // No-op in Graphite. If "flushing" Skia's drawing commands after each layer is desired
+ // in Graphite, then a graphite::Recording would need to be snapped and tracked for each
+ // layer, which is likely possible but adds non-trivial complexity (in both bookkeeping
+ // and refactoring).
skgpu::ganesh::Flush(activeSurface);
}
}
@@ -1149,13 +1153,9 @@
surfaceAutoSaveRestore.restore();
mCapture->endCapture();
- {
- ATRACE_NAME("flush surface");
- LOG_ALWAYS_FATAL_IF(activeSurface != dstSurface);
- skgpu::ganesh::Flush(activeSurface);
- }
- auto drawFence = sp<Fence>::make(flushAndSubmit(context));
+ LOG_ALWAYS_FATAL_IF(activeSurface != dstSurface);
+ auto drawFence = sp<Fence>::make(flushAndSubmit(context, dstSurface));
if (ATRACE_ENABLED()) {
static gui::FenceMonitor sMonitor("RE Completion");