21e7e2d9b1
The purpose of this is to be able to use the native graphics code from the Android platform directly in Android Studio (running on desktop) to do layout rendering. This creates a host library that is a subset of libandroid_runtime including only the JNI files relevant to Android graphics. It also includes LayoutlibLoader.cpp which is used to load the JNI when using it as part of layoutlib (the graphics library for Android Studio). This also creates libhwui-host, a host library that is a subset of libhwui. Bug: 117921091 Test: lunch sdk && m libandroid_runtime Change-Id: I3850020d2d4c13c85e377476bc463d3eb6a01c6d
111 lines
3.1 KiB
C++
111 lines
3.1 KiB
C++
/*
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <private/hwui/WebViewFunctor.h>
|
|
#ifdef __ANDROID__ // Layoutlib does not support render thread
|
|
#include <renderthread/RenderProxy.h>
|
|
#else
|
|
#include <utils/Log.h>
|
|
#endif
|
|
|
|
#include <utils/LightRefBase.h>
|
|
#include <mutex>
|
|
#include <vector>
|
|
|
|
namespace android::uirenderer {
|
|
|
|
class WebViewFunctorManager;
|
|
|
|
class WebViewFunctor {
|
|
public:
|
|
WebViewFunctor(void* data, const WebViewFunctorCallbacks& callbacks, RenderMode functorMode);
|
|
~WebViewFunctor();
|
|
|
|
class Handle : public LightRefBase<Handle> {
|
|
public:
|
|
~Handle() {
|
|
#ifdef __ANDROID__ // Layoutlib does not support render thread
|
|
renderthread::RenderProxy::destroyFunctor(id());
|
|
#endif
|
|
}
|
|
|
|
int id() const { return mReference.id(); }
|
|
|
|
void sync(const WebViewSyncData& syncData) const { mReference.sync(syncData); }
|
|
|
|
void drawGl(const DrawGlInfo& drawInfo) const { mReference.drawGl(drawInfo); }
|
|
|
|
void initVk(const VkFunctorInitParams& params) { mReference.initVk(params); }
|
|
|
|
void drawVk(const VkFunctorDrawParams& params) { mReference.drawVk(params); }
|
|
|
|
void postDrawVk() { mReference.postDrawVk(); }
|
|
|
|
private:
|
|
friend class WebViewFunctor;
|
|
|
|
Handle(WebViewFunctor& ref) : mReference(ref) {}
|
|
|
|
WebViewFunctor& mReference;
|
|
};
|
|
|
|
int id() const { return mFunctor; }
|
|
void sync(const WebViewSyncData& syncData) const;
|
|
void drawGl(const DrawGlInfo& drawInfo);
|
|
void initVk(const VkFunctorInitParams& params);
|
|
void drawVk(const VkFunctorDrawParams& params);
|
|
void postDrawVk();
|
|
void destroyContext();
|
|
|
|
sp<Handle> createHandle() {
|
|
LOG_ALWAYS_FATAL_IF(mCreatedHandle);
|
|
mCreatedHandle = true;
|
|
return sp<Handle>{new Handle(*this)};
|
|
}
|
|
|
|
private:
|
|
WebViewFunctorCallbacks mCallbacks;
|
|
void* const mData;
|
|
int mFunctor;
|
|
RenderMode mMode;
|
|
bool mHasContext = false;
|
|
bool mCreatedHandle = false;
|
|
};
|
|
|
|
class WebViewFunctorManager {
|
|
public:
|
|
static WebViewFunctorManager& instance();
|
|
|
|
int createFunctor(void* data, const WebViewFunctorCallbacks& callbacks, RenderMode functorMode);
|
|
void releaseFunctor(int functor);
|
|
void onContextDestroyed();
|
|
void destroyFunctor(int functor);
|
|
|
|
sp<WebViewFunctor::Handle> handleFor(int functor);
|
|
|
|
private:
|
|
WebViewFunctorManager() = default;
|
|
~WebViewFunctorManager() = default;
|
|
|
|
std::mutex mLock;
|
|
std::vector<std::unique_ptr<WebViewFunctor>> mFunctors;
|
|
std::vector<sp<WebViewFunctor::Handle>> mActiveFunctors;
|
|
};
|
|
|
|
} // namespace android::uirenderer
|