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