1 // Copyright 2018 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 // 5 //****************************************************************************** 6 // This is a copy of the coresponding android_webview/public/browser header. 7 // Any changes to the interface should be made there as well. 8 //****************************************************************************** 9 10 #ifndef ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_FN_H_ 11 #define ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_FN_H_ 12 13 #include <android/surface_control.h> 14 #include <vulkan/vulkan.h> 15 16 #ifdef __cplusplus 17 extern "C" { 18 #endif 19 20 // In order to make small changes backwards compatible, all structs passed from 21 // android to chromium are versioned. 22 // 23 // 1 is Android Q. This matches kAwDrawGLInfoVersion version 3. 24 // 2 Adds transfer_function_* and color_space_toXYZD50 to AwDrawFn_DrawGLParams. 25 // 3 Adds SurfaceControl related functions. 26 static const int kAwDrawFnVersion = 3; 27 28 // Returns parent ASurfaceControl for WebView overlays. It will be have same 29 // geometry as the surface we draw into and positioned below it (underlay). 30 // This does not pass ownership to webview, but guaranteed to be alive until 31 // transaction from next removeOverlays call or functor destruction will be 32 // finished. 33 typedef ASurfaceControl* AwDrawFn_GetSurfaceControl(); 34 35 // Merges WebView transaction to be applied synchronously with current draw. 36 // This doesn't pass ownership of the transaction, changes will be copied and 37 // webview can free transaction right after the call. 38 typedef void AwDrawFn_MergeTransaction(ASurfaceTransaction* transaction); 39 40 enum AwDrawFnOverlaysMode { 41 // Indicated that webview should not promote anything to overlays this draw 42 // and remove all visible overlays. 43 // Added in version 3. 44 AW_DRAW_FN_OVERLAYS_MODE_DISABLED = 0, 45 46 // Indicates that webview can use overlays. 47 // Added in version 3. 48 AW_DRAW_FN_OVERLAYS_MODE_ENABLED = 1, 49 }; 50 51 struct AwDrawFn_OnSyncParams { 52 int version; 53 54 bool apply_force_dark; 55 }; 56 57 struct AwDrawFn_DrawGLParams { 58 int version; 59 60 // Input: current clip rect in surface coordinates. Reflects the current state 61 // of the OpenGL scissor rect. Both the OpenGL scissor rect and viewport are 62 // set by the caller of the draw function and updated during View animations. 63 int clip_left; 64 int clip_top; 65 int clip_right; 66 int clip_bottom; 67 68 // Input: current width/height of destination surface. 69 int width; 70 int height; 71 72 // Used to be is_layer. 73 bool deprecated_0; 74 75 // Input: current transformation matrix in surface pixels. 76 // Uses the column-based OpenGL matrix format. 77 float transform[16]; 78 79 // Input: Color space parameters. 80 float transfer_function_g; 81 float transfer_function_a; 82 float transfer_function_b; 83 float transfer_function_c; 84 float transfer_function_d; 85 float transfer_function_e; 86 float transfer_function_f; 87 float color_space_toXYZD50[9]; 88 89 // Input: Indicates how webview should use overlays for this draw. 90 // Added in version 3. 91 AwDrawFnOverlaysMode overlays_mode; 92 93 // Input: WebView can call it to obtain parent surface control for overlays. 94 // Added in version 3. 95 AwDrawFn_GetSurfaceControl* get_surface_control; 96 97 // Input: WebView call this to apply ASurfaceTransaction synchronously with 98 // the draw. 99 // Added in version 3. 100 AwDrawFn_MergeTransaction* merge_transaction; 101 }; 102 103 struct AwDrawFn_InitVkParams { 104 int version; 105 VkInstance instance; 106 VkPhysicalDevice physical_device; 107 VkDevice device; 108 VkQueue queue; 109 uint32_t graphics_queue_index; 110 uint32_t api_version; 111 const char* const* enabled_instance_extension_names; 112 uint32_t enabled_instance_extension_names_length; 113 const char* const* enabled_device_extension_names; 114 uint32_t enabled_device_extension_names_length; 115 // Only one of device_features and device_features_2 should be non-null. 116 // If both are null then no features are enabled. 117 VkPhysicalDeviceFeatures* device_features; 118 VkPhysicalDeviceFeatures2* device_features_2; 119 }; 120 121 struct AwDrawFn_DrawVkParams { 122 int version; 123 124 // Input: current width/height of destination surface. 125 int width; 126 int height; 127 128 bool deprecated_0; 129 130 // Input: current transform matrix 131 float transform[16]; 132 133 // Input WebView should do its main compositing draws into this. It cannot do 134 // anything that would require stopping the render pass. 135 VkCommandBuffer secondary_command_buffer; 136 137 // Input: The main color attachment index where secondary_command_buffer will 138 // eventually be submitted. 139 uint32_t color_attachment_index; 140 141 // Input: A render pass which will be compatible to the one which the 142 // secondary_command_buffer will be submitted into. 143 VkRenderPass compatible_render_pass; 144 145 // Input: Format of the destination surface. 146 VkFormat format; 147 148 // Input: Color space parameters. 149 float transfer_function_g; 150 float transfer_function_a; 151 float transfer_function_b; 152 float transfer_function_c; 153 float transfer_function_d; 154 float transfer_function_e; 155 float transfer_function_f; 156 float color_space_toXYZD50[9]; 157 158 // Input: current clip rect 159 int clip_left; 160 int clip_top; 161 int clip_right; 162 int clip_bottom; 163 164 // Input: Indicates how webview should use overlays for this draw. 165 // Added in version 3. 166 AwDrawFnOverlaysMode overlays_mode; 167 168 // Input: WebView can call it to obtain parent surface control for overlays. 169 // Added in version 3. 170 AwDrawFn_GetSurfaceControl* get_surface_control; 171 172 // Input: WebView call this to apply ASurfaceTransaction synchronously with 173 // the draw. 174 // Added in version 3. 175 AwDrawFn_MergeTransaction* merge_transaction; 176 }; 177 178 struct AwDrawFn_PostDrawVkParams { 179 int version; 180 }; 181 182 struct AwDrawFn_RemoveOverlaysParams { 183 int version; 184 // Input: WebView call this to apply ASurfaceTransaction synchronously with 185 // the draw. 186 // Added in version 3. 187 AwDrawFn_MergeTransaction* merge_transaction; 188 }; 189 190 // Called on render thread while UI thread is blocked. Called for both GL and 191 // VK. 192 typedef void AwDrawFn_OnSync(int functor, 193 void* data, 194 AwDrawFn_OnSyncParams* params); 195 196 // Called on render thread when either the context is destroyed _or_ when the 197 // functor's last reference goes away. Will always be called with an active 198 // context. Called for both GL and VK. 199 typedef void AwDrawFn_OnContextDestroyed(int functor, void* data); 200 201 // Called on render thread when the last reference to the handle goes away and 202 // the handle is considered irrevocably destroyed. Will always be preceded by 203 // a call to OnContextDestroyed if this functor had ever been drawn. Called for 204 // both GL and VK. 205 typedef void AwDrawFn_OnDestroyed(int functor, void* data); 206 207 // Only called for GL. 208 typedef void AwDrawFn_DrawGL(int functor, 209 void* data, 210 AwDrawFn_DrawGLParams* params); 211 212 // Initialize vulkan state. Needs to be called again after any 213 // OnContextDestroyed. Only called for Vulkan. 214 typedef void AwDrawFn_InitVk(int functor, 215 void* data, 216 AwDrawFn_InitVkParams* params); 217 218 // Only called for Vulkan. 219 typedef void AwDrawFn_DrawVk(int functor, 220 void* data, 221 AwDrawFn_DrawVkParams* params); 222 223 // Only called for Vulkan. 224 typedef void AwDrawFn_PostDrawVk(int functor, 225 void* data, 226 AwDrawFn_PostDrawVkParams* params); 227 228 // Can be called to make webview hide all overlays and stop updating them until 229 // next draw. WebView must obtain new ASurfaceControl after this call to use as 230 // parent for the overlays on next draw. 231 typedef void AwDrawFn_RemoveOverlays(int functor, 232 void* data, 233 AwDrawFn_RemoveOverlaysParams* params); 234 235 struct AwDrawFnFunctorCallbacks { 236 // version is passed in CreateFunctor call. 237 AwDrawFn_OnSync* on_sync; 238 AwDrawFn_OnContextDestroyed* on_context_destroyed; 239 AwDrawFn_OnDestroyed* on_destroyed; 240 AwDrawFn_DrawGL* draw_gl; 241 AwDrawFn_InitVk* init_vk; 242 AwDrawFn_DrawVk* draw_vk; 243 AwDrawFn_PostDrawVk* post_draw_vk; 244 // Added in version 3. 245 AwDrawFn_RemoveOverlays* remove_overlays; 246 }; 247 248 enum AwDrawFnRenderMode { 249 AW_DRAW_FN_RENDER_MODE_OPENGL_ES = 0, 250 AW_DRAW_FN_RENDER_MODE_VULKAN = 1, 251 }; 252 253 // Get the render mode. Result is static for the process. 254 typedef AwDrawFnRenderMode AwDrawFn_QueryRenderMode(void); 255 256 // This available up to version 3, use the one below. 257 typedef int AwDrawFn_CreateFunctor(void* data, 258 AwDrawFnFunctorCallbacks* functor_callbacks); 259 260 // Create a functor. |functor_callbacks| should be valid until OnDestroyed. 261 typedef int AwDrawFn_CreateFunctor_v3( 262 void* data, 263 int version, 264 AwDrawFnFunctorCallbacks* functor_callbacks); 265 266 // May be called on any thread to signal that the functor should be destroyed. 267 // The functor will receive an onDestroyed when the last usage of it is 268 // released, and it should be considered alive & active until that point. 269 typedef void AwDrawFn_ReleaseFunctor(int functor); 270 271 struct AwDrawFnFunctionTable { 272 int version; 273 AwDrawFn_QueryRenderMode* query_render_mode; 274 // Available up to version 3. 275 AwDrawFn_CreateFunctor* create_functor; 276 AwDrawFn_ReleaseFunctor* release_functor; 277 // Added in version 3. 278 AwDrawFn_CreateFunctor_v3* create_functor_v3; 279 }; 280 281 #ifdef __cplusplus 282 } // extern "C" 283 #endif 284 285 #endif // ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_FN_H_ 286