Handle vulkan windowing directly in SkiaVulkanPipeline
Test: manual testing in skiavk mode
Change-Id: I2fab80bae2787bfdacbc70d0402e98450e59406d
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
index ba13ca58..ca394b2 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
@@ -23,37 +23,43 @@
#include "SkiaPipeline.h"
#include "SkiaProfileRenderer.h"
+#include <SkSurface.h>
#include <SkTypes.h>
-#include <WindowContextFactory_android.h>
-#include <VulkanWindowContext.h>
+
+#include <GrContext.h>
+#include <GrTypes.h>
+#include <vk/GrVkTypes.h>
#include <android/native_window.h>
#include <cutils/properties.h>
#include <strings.h>
using namespace android::uirenderer::renderthread;
-using namespace sk_app;
namespace android {
namespace uirenderer {
namespace skiapipeline {
+SkiaVulkanPipeline::SkiaVulkanPipeline(renderthread::RenderThread& thread)
+ : SkiaPipeline(thread)
+ , mVkManager(thread.vulkanManager()) {}
+
MakeCurrentResult SkiaVulkanPipeline::makeCurrent() {
- return (mWindowContext != nullptr) ?
- MakeCurrentResult::AlreadyCurrent : MakeCurrentResult::Failed;
+ return MakeCurrentResult::AlreadyCurrent;
}
Frame SkiaVulkanPipeline::getFrame() {
- LOG_ALWAYS_FATAL_IF(mWindowContext == nullptr, "Tried to draw into null vulkan context!");
- mBackbuffer = mWindowContext->getBackbufferSurface();
- if (mBackbuffer.get() == nullptr) {
- // try recreating the context?
+ LOG_ALWAYS_FATAL_IF(mVkSurface == nullptr,
+ "drawRenderNode called on a context with no surface!");
+
+ SkSurface* backBuffer = mVkManager.getBackbufferSurface(mVkSurface);
+ if (backBuffer == nullptr) {
SkDebugf("failed to get backbuffer");
return Frame(-1, -1, 0);
}
// TODO: support buffer age if Vulkan API can do it
- Frame frame(mBackbuffer->width(), mBackbuffer->height(), 0);
+ Frame frame(backBuffer->width(), backBuffer->height(), 0);
return frame;
}
@@ -66,16 +72,18 @@
const std::vector<sp<RenderNode>>& renderNodes,
FrameInfoVisualizer* profiler) {
- if (mBackbuffer.get() == nullptr) {
+ sk_sp<SkSurface> backBuffer = mVkSurface->getBackBufferSurface();
+ if (backBuffer.get() == nullptr) {
return false;
}
- renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, mBackbuffer);
+ SkiaPipeline::updateLighting(lightGeometry, lightInfo);
+ renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, backBuffer);
layerUpdateQueue->clear();
// Draw visual debugging features
if (CC_UNLIKELY(Properties::showDirtyRegions
|| ProfileType::None != Properties::getProfileType())) {
- SkCanvas* profileCanvas = mBackbuffer->getCanvas();
+ SkCanvas* profileCanvas = backBuffer->getCanvas();
SkiaProfileRenderer profileRenderer(profileCanvas);
profiler->draw(profileRenderer);
profileCanvas->flush();
@@ -99,11 +107,9 @@
currentFrameInfo->markSwapBuffers();
if (*requireSwap) {
- mWindowContext->swapBuffers();
+ mVkManager.swapBuffers(mVkSurface);
}
- mBackbuffer.reset();
-
return *requireSwap;
}
@@ -113,6 +119,7 @@
}
DeferredLayerUpdater* SkiaVulkanPipeline::createTextureLayer() {
+ mVkManager.initialize();
Layer* layer = new Layer(mRenderThread.renderState(), 0, 0);
return new DeferredLayerUpdater(layer);
}
@@ -121,33 +128,24 @@
}
bool SkiaVulkanPipeline::setSurface(Surface* surface, SwapBehavior swapBehavior) {
-
- if (mWindowContext) {
- delete mWindowContext;
- mWindowContext = nullptr;
+ if (mVkSurface) {
+ mVkManager.destroySurface(mVkSurface);
+ mVkSurface = nullptr;
}
if (surface) {
- DisplayParams displayParams;
- mWindowContext = window_context_factory::NewVulkanForAndroid(surface, displayParams);
- if (mWindowContext) {
- DeviceInfo::initialize(mWindowContext->getGrContext()->caps()->maxRenderTargetSize());
- }
+ mVkSurface = mVkManager.createSurface(surface);
}
-
- // this doesn't work for if there is more than one CanvasContext available at one time!
- mRenderThread.setGrContext(mWindowContext ? mWindowContext->getGrContext() : nullptr);
-
- return mWindowContext != nullptr;
+ return mVkSurface != nullptr;
}
bool SkiaVulkanPipeline::isSurfaceReady() {
- return CC_LIKELY(mWindowContext != nullptr) && mWindowContext->isValid();
+ return CC_UNLIKELY(mVkSurface != nullptr);
}
bool SkiaVulkanPipeline::isContextReady() {
- return CC_LIKELY(mWindowContext != nullptr);
+ return CC_LIKELY(mVkManager.hasVkContext());
}
void SkiaVulkanPipeline::invokeFunctor(const RenderThread& thread, Functor* functor) {