diff options
author | Bo Liu <boliu@google.com> | 2019-01-08 20:17:55 -0800 |
---|---|---|
committer | Bo Liu <boliu@google.com> | 2019-01-15 15:25:04 -0800 |
commit | 7b8c1eb302109ea77a173663a6cf14b6d80ab0f7 (patch) | |
tree | a34428e9a0e8cba1beb38112c5e3d9323443d327 /native | |
parent | d231ab271c04d8742e1c7f4b40f5d4bf89710a47 (diff) |
VkFunctorDrawable implementation
Bug: 115613038
Test: Turning on vulkan with appropriate webview apk does not crash and
sort of works.
Change-Id: If1504da7a35e4bd74a994ab2c2a351e6bc415a18
Diffstat (limited to 'native')
-rw-r--r-- | native/webview/plat_support/draw_fn.h | 31 | ||||
-rw-r--r-- | native/webview/plat_support/draw_functor.cpp | 89 |
2 files changed, 106 insertions, 14 deletions
diff --git a/native/webview/plat_support/draw_fn.h b/native/webview/plat_support/draw_fn.h index bb2ee9b5da04..0490e650a7a4 100644 --- a/native/webview/plat_support/draw_fn.h +++ b/native/webview/plat_support/draw_fn.h @@ -74,7 +74,10 @@ struct AwDrawFn_InitVkParams { VkQueue queue; uint32_t graphics_queue_index; uint32_t instance_version; - const char* const* enabled_extension_names; + const char* const* enabled_instance_extension_names; + uint32_t enabled_instance_extension_names_length; + const char* const* enabled_device_extension_names; + uint32_t enabled_device_extension_names_length; // Only one of device_features and device_features_2 should be non-null. // If both are null then no features are enabled. VkPhysicalDeviceFeatures* device_features; @@ -128,15 +131,13 @@ struct AwDrawFn_DrawVkParams { struct AwDrawFn_PostDrawVkParams { int version; - - // Input: Fence for the composite command buffer to signal it has finished its - // work on the GPU. - int fd; }; // Called on render thread while UI thread is blocked. Called for both GL and // VK. -typedef void AwDrawFn_OnSync(int functor, void* data, AwDrawFn_OnSyncParams* params); +typedef void AwDrawFn_OnSync(int functor, + void* data, + AwDrawFn_OnSyncParams* params); // Called on render thread when either the context is destroyed _or_ when the // functor's last reference goes away. Will always be called with an active @@ -150,17 +151,24 @@ typedef void AwDrawFn_OnContextDestroyed(int functor, void* data); typedef void AwDrawFn_OnDestroyed(int functor, void* data); // Only called for GL. -typedef void AwDrawFn_DrawGL(int functor, void* data, AwDrawFn_DrawGLParams* params); +typedef void AwDrawFn_DrawGL(int functor, + void* data, + AwDrawFn_DrawGLParams* params); // Initialize vulkan state. Needs to be called again after any // OnContextDestroyed. Only called for Vulkan. -typedef void AwDrawFn_InitVk(int functor, void* data, AwDrawFn_InitVkParams* params); +typedef void AwDrawFn_InitVk(int functor, + void* data, + AwDrawFn_InitVkParams* params); // Only called for Vulkan. -typedef void AwDrawFn_DrawVk(int functor, void* data, AwDrawFn_DrawVkParams* params); +typedef void AwDrawFn_DrawVk(int functor, + void* data, + AwDrawFn_DrawVkParams* params); // Only called for Vulkan. -typedef void AwDrawFn_PostDrawVk(int functor, void* data, +typedef void AwDrawFn_PostDrawVk(int functor, + void* data, AwDrawFn_PostDrawVkParams* params); struct AwDrawFnFunctorCallbacks { @@ -183,7 +191,8 @@ enum AwDrawFnRenderMode { typedef AwDrawFnRenderMode AwDrawFn_QueryRenderMode(void); // Create a functor. |functor_callbacks| should be valid until OnDestroyed. -typedef int AwDrawFn_CreateFunctor(void* data, AwDrawFnFunctorCallbacks* functor_callbacks); +typedef int AwDrawFn_CreateFunctor(void* data, + AwDrawFnFunctorCallbacks* functor_callbacks); // May be called on any thread to signal that the functor should be destroyed. // The functor will receive an onDestroyed when the last usage of it is diff --git a/native/webview/plat_support/draw_functor.cpp b/native/webview/plat_support/draw_functor.cpp index 6c1ceaba4d46..b97bbc311624 100644 --- a/native/webview/plat_support/draw_functor.cpp +++ b/native/webview/plat_support/draw_functor.cpp @@ -74,6 +74,79 @@ void draw_gl(int functor, void* data, support->callbacks.draw_gl(functor, support->data, ¶ms); } +void initializeVk(int functor, void* data, + const uirenderer::VkFunctorInitParams& init_vk_params) { + SupportData* support = static_cast<SupportData*>(data); + VkPhysicalDeviceFeatures2 device_features_2; + if (init_vk_params.device_features_2) + device_features_2 = *init_vk_params.device_features_2; + + AwDrawFn_InitVkParams params{ + .version = kAwDrawFnVersion, + .instance = init_vk_params.instance, + .physical_device = init_vk_params.physical_device, + .device = init_vk_params.device, + .queue = init_vk_params.queue, + .graphics_queue_index = init_vk_params.graphics_queue_index, + .instance_version = init_vk_params.instance_version, + .enabled_instance_extension_names = + init_vk_params.enabled_instance_extension_names, + .enabled_instance_extension_names_length = + init_vk_params.enabled_instance_extension_names_length, + .enabled_device_extension_names = + init_vk_params.enabled_device_extension_names, + .enabled_device_extension_names_length = + init_vk_params.enabled_device_extension_names_length, + .device_features = nullptr, + .device_features_2 = + init_vk_params.device_features_2 ? &device_features_2 : nullptr, + }; + support->callbacks.init_vk(functor, support->data, ¶ms); +} + +void drawVk(int functor, void* data, const uirenderer::VkFunctorDrawParams& draw_vk_params) { + SupportData* support = static_cast<SupportData*>(data); + float gabcdef[7]; + draw_vk_params.color_space_ptr->transferFn(gabcdef); + AwDrawFn_DrawVkParams params{ + .version = kAwDrawFnVersion, + .width = draw_vk_params.width, + .height = draw_vk_params.height, + .is_layer = draw_vk_params.is_layer, + .secondary_command_buffer = draw_vk_params.secondary_command_buffer, + .color_attachment_index = draw_vk_params.color_attachment_index, + .compatible_render_pass = draw_vk_params.compatible_render_pass, + .format = draw_vk_params.format, + .transfer_function_g = gabcdef[0], + .transfer_function_a = gabcdef[1], + .transfer_function_b = gabcdef[2], + .transfer_function_c = gabcdef[3], + .transfer_function_d = gabcdef[4], + .transfer_function_e = gabcdef[5], + .transfer_function_f = gabcdef[6], + .clip_left = draw_vk_params.clip_left, + .clip_top = draw_vk_params.clip_top, + .clip_right = draw_vk_params.clip_right, + .clip_bottom = draw_vk_params.clip_bottom, + }; + COMPILE_ASSERT(sizeof(params.color_space_toXYZD50) == sizeof(skcms_Matrix3x3), + gamut_transform_size_mismatch); + draw_vk_params.color_space_ptr->toXYZD50( + reinterpret_cast<skcms_Matrix3x3*>(¶ms.color_space_toXYZD50)); + COMPILE_ASSERT(NELEM(params.transform) == NELEM(draw_vk_params.transform), + mismatched_transform_matrix_sizes); + for (int i = 0; i < NELEM(params.transform); ++i) { + params.transform[i] = draw_vk_params.transform[i]; + } + support->callbacks.draw_vk(functor, support->data, ¶ms); +} + +void postDrawVk(int functor, void* data) { + SupportData* support = static_cast<SupportData*>(data); + AwDrawFn_PostDrawVkParams params{.version = kAwDrawFnVersion}; + support->callbacks.post_draw_vk(functor, support->data, ¶ms); +} + int CreateFunctor(void* data, AwDrawFnFunctorCallbacks* functor_callbacks) { static bool callbacks_initialized = false; static uirenderer::WebViewFunctorCallbacks webview_functor_callbacks = { @@ -82,9 +155,19 @@ int CreateFunctor(void* data, AwDrawFnFunctorCallbacks* functor_callbacks) { .onDestroyed = &onDestroyed, }; if (!callbacks_initialized) { - // Under uirenderer::RenderMode::Vulkan, whether gles or vk union should - // be populated should match whether the vk-gl interop is used. - webview_functor_callbacks.gles.draw = &draw_gl; + 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; + // TODO(boliu): Remove this once SkiaRecordingCanvas::drawWebViewFunctor + // no longer uses GL interop. + webview_functor_callbacks.gles.draw = &draw_gl; + break; + } callbacks_initialized = true; } SupportData* support = new SupportData{ |