Merge "Have HWUI validate the WebViewFunctors at registration" into sc-dev
This commit is contained in:
@@ -221,8 +221,30 @@ WebViewFunctorManager& WebViewFunctorManager::instance() {
|
||||
return sInstance;
|
||||
}
|
||||
|
||||
static void validateCallbacks(const WebViewFunctorCallbacks& callbacks) {
|
||||
// TODO: Should we do a stack peek to see if this is really webview?
|
||||
LOG_ALWAYS_FATAL_IF(callbacks.onSync == nullptr, "onSync is null");
|
||||
LOG_ALWAYS_FATAL_IF(callbacks.onContextDestroyed == nullptr, "onContextDestroyed is null");
|
||||
LOG_ALWAYS_FATAL_IF(callbacks.onDestroyed == nullptr, "onDestroyed is null");
|
||||
LOG_ALWAYS_FATAL_IF(callbacks.removeOverlays == nullptr, "removeOverlays is null");
|
||||
switch (auto mode = WebViewFunctor_queryPlatformRenderMode()) {
|
||||
case RenderMode::OpenGL_ES:
|
||||
LOG_ALWAYS_FATAL_IF(callbacks.gles.draw == nullptr, "gles.draw is null");
|
||||
break;
|
||||
case RenderMode::Vulkan:
|
||||
LOG_ALWAYS_FATAL_IF(callbacks.vk.initialize == nullptr, "vk.initialize is null");
|
||||
LOG_ALWAYS_FATAL_IF(callbacks.vk.draw == nullptr, "vk.draw is null");
|
||||
LOG_ALWAYS_FATAL_IF(callbacks.vk.postDraw == nullptr, "vk.postDraw is null");
|
||||
break;
|
||||
default:
|
||||
LOG_ALWAYS_FATAL("unknown platform mode? %d", (int)mode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int WebViewFunctorManager::createFunctor(void* data, const WebViewFunctorCallbacks& callbacks,
|
||||
RenderMode functorMode) {
|
||||
validateCallbacks(callbacks);
|
||||
auto object = std::make_unique<WebViewFunctor>(data, callbacks, functorMode);
|
||||
int id = object->id();
|
||||
auto handle = object->createHandle();
|
||||
|
||||
@@ -287,6 +287,7 @@ public:
|
||||
int sync = 0;
|
||||
int contextDestroyed = 0;
|
||||
int destroyed = 0;
|
||||
int removeOverlays = 0;
|
||||
int glesDraw = 0;
|
||||
};
|
||||
|
||||
@@ -311,6 +312,12 @@ public:
|
||||
expectOnRenderThread("onDestroyed");
|
||||
sMockFunctorCounts[functor].destroyed++;
|
||||
},
|
||||
.removeOverlays =
|
||||
[](int functor, void* data,
|
||||
void (*mergeTransaction)(ASurfaceTransaction*)) {
|
||||
expectOnRenderThread("removeOverlays");
|
||||
sMockFunctorCounts[functor].removeOverlays++;
|
||||
},
|
||||
};
|
||||
switch (mode) {
|
||||
case RenderMode::OpenGL_ES:
|
||||
|
||||
@@ -62,8 +62,10 @@ int main(int argc, char* argv[]) {
|
||||
gSigChain.insert(pair<int, struct sigaction>(sig, old_sa));
|
||||
}
|
||||
|
||||
// Replace the default GLES driver
|
||||
// Avoid talking to SF
|
||||
Properties::isolatedProcess = true;
|
||||
// Default to GLES (Vulkan-aware tests will override this)
|
||||
Properties::overrideRenderPipelineType(RenderPipelineType::SkiaGL);
|
||||
|
||||
// Run the tests
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
@@ -192,44 +192,43 @@ void postDrawVk(int functor, void* data) {
|
||||
|
||||
int CreateFunctor_v3(void* data, int version,
|
||||
AwDrawFnFunctorCallbacks* functor_callbacks) {
|
||||
static bool callbacks_initialized = false;
|
||||
static uirenderer::WebViewFunctorCallbacks webview_functor_callbacks = {
|
||||
.onSync = &onSync,
|
||||
.onContextDestroyed = &onContextDestroyed,
|
||||
.onDestroyed = &onDestroyed,
|
||||
.removeOverlays = &removeOverlays,
|
||||
};
|
||||
if (!callbacks_initialized) {
|
||||
switch (uirenderer::WebViewFunctor_queryPlatformRenderMode()) {
|
||||
case uirenderer::RenderMode::OpenGL_ES:
|
||||
webview_functor_callbacks.gles.draw = &draw_gl;
|
||||
break;
|
||||
case uirenderer::RenderMode::Vulkan:
|
||||
webview_functor_callbacks.vk.initialize = &initializeVk;
|
||||
webview_functor_callbacks.vk.draw = &drawVk;
|
||||
webview_functor_callbacks.vk.postDraw = &postDrawVk;
|
||||
break;
|
||||
static uirenderer::WebViewFunctorCallbacks webview_functor_callbacks = [] {
|
||||
uirenderer::WebViewFunctorCallbacks ret = {
|
||||
.onSync = &onSync,
|
||||
.onContextDestroyed = &onContextDestroyed,
|
||||
.onDestroyed = &onDestroyed,
|
||||
.removeOverlays = &removeOverlays,
|
||||
};
|
||||
switch (uirenderer::WebViewFunctor_queryPlatformRenderMode()) {
|
||||
case uirenderer::RenderMode::OpenGL_ES:
|
||||
ret.gles.draw = &draw_gl;
|
||||
break;
|
||||
case uirenderer::RenderMode::Vulkan:
|
||||
ret.vk.initialize = &initializeVk;
|
||||
ret.vk.draw = &drawVk;
|
||||
ret.vk.postDraw = &postDrawVk;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}();
|
||||
SupportData* support = new SupportData{
|
||||
.data = data,
|
||||
};
|
||||
|
||||
// These callbacks are available on all versions.
|
||||
support->callbacks = {
|
||||
.on_sync = functor_callbacks->on_sync,
|
||||
.on_context_destroyed = functor_callbacks->on_context_destroyed,
|
||||
.on_destroyed = functor_callbacks->on_destroyed,
|
||||
.draw_gl = functor_callbacks->draw_gl,
|
||||
.init_vk = functor_callbacks->init_vk,
|
||||
.draw_vk = functor_callbacks->draw_vk,
|
||||
.post_draw_vk = functor_callbacks->post_draw_vk,
|
||||
};
|
||||
|
||||
if (version >= 3) {
|
||||
support->callbacks.remove_overlays = functor_callbacks->remove_overlays;
|
||||
}
|
||||
callbacks_initialized = true;
|
||||
}
|
||||
SupportData* support = new SupportData{
|
||||
.data = data,
|
||||
};
|
||||
|
||||
// These callbacks are available on all versions.
|
||||
support->callbacks = {
|
||||
.on_sync = functor_callbacks->on_sync,
|
||||
.on_context_destroyed = functor_callbacks->on_context_destroyed,
|
||||
.on_destroyed = functor_callbacks->on_destroyed,
|
||||
.draw_gl = functor_callbacks->draw_gl,
|
||||
.init_vk = functor_callbacks->init_vk,
|
||||
.draw_vk = functor_callbacks->draw_vk,
|
||||
.post_draw_vk = functor_callbacks->post_draw_vk,
|
||||
};
|
||||
|
||||
if (version >= 3) {
|
||||
support->callbacks.remove_overlays = functor_callbacks->remove_overlays;
|
||||
}
|
||||
|
||||
int functor = uirenderer::WebViewFunctor_create(
|
||||
support, webview_functor_callbacks,
|
||||
|
||||
Reference in New Issue
Block a user