1e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Copyright 2012 The Chromium Authors. All rights reserved.
2e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Use of this source code is governed by a BSD-style license that can be
3e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// found in the LICENSE file.
4e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba//
5e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba//******************************************************************************
6e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// This is a copy of the coresponding android_webview/public/browser header.
7e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Any changes to the interface should be made there.
8e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba//
9e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// The purpose of having the copy is twofold:
10e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba//  - it removes the need to have Chromium sources present in the tree in order
11e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba//    to build the plat_support library,
12e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba//  - it captures API that the corresponding Android release supports.
13e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba//******************************************************************************
14e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
15e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba#ifndef ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_GL_H_
16e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba#define ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_GL_H_
17e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
18e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba#ifdef __cplusplus
19e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibaextern "C" {
20e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba#endif
21e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
229ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik
239ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik// 1 is L/L MR1
249ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik//
259ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik// 2 starts at M, and added an imperfect workaround for complex clipping by
269ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik// elevating the WebView into an FBO layer. If any transform, clip, or outline
279ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik// clip occurs that would either likely use the stencil buffer for clipping, or
289ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik// require shader based clipping in HWUI, the WebView is drawn into an FBO (if
299ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik// it fits).
309ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik// This is a temporary workaround for a lack of WebView support for stencil/
319ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik// shader based round rect clipping, and should be removed when webview is
329ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craik// capable of supporting these clips internally when drawing.
339ac94b56b31c90a50edb5f643f8afa4fd40e52d8Chris Craikstatic const int kAwDrawGLInfoVersion = 2;
34e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
35e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Holds the information required to trigger an OpenGL drawing operation.
36e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibastruct AwDrawGLInfo {
37e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  int version;  // The AwDrawGLInfo this struct was built with.
38e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
39e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Input: tells the draw function what action to perform.
40e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  enum Mode {
41e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba    kModeDraw = 0,
42e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba    kModeProcess,
43e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba    kModeProcessNoContext,
44e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba    kModeSync,
45e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  } mode;
46e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
47e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Input: current clip rect in surface coordinates. Reflects the current state
48e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // of the OpenGL scissor rect. Both the OpenGL scissor rect and viewport are
49e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // set by the caller of the draw function and updated during View animations.
50e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  int clip_left;
51e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  int clip_top;
52e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  int clip_right;
53e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  int clip_bottom;
54e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
55e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Input: current width/height of destination surface.
56e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  int width;
57e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  int height;
58e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
59e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Input: is the View rendered into an independent layer.
60e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // If false, the surface is likely to hold to the full screen contents, with
61e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // the scissor box set by the caller to the actual View location and size.
62e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Also the transformation matrix will contain at least a translation to the
63e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // position of the View to render, plus any other transformations required as
64e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // part of any ongoing View animation. View translucency (alpha) is ignored,
65e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // although the framework will set is_layer to true for non-opaque cases.
66e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Can be requested via the View.setLayerType(View.LAYER_TYPE_NONE, ...)
67e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Android API method.
68e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  //
69e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // If true, the surface is dedicated to the View and should have its size.
70e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // The viewport and scissor box are set by the caller to the whole surface.
71e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Animation transformations are handled by the caller and not reflected in
72e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // the provided transformation matrix. Translucency works normally.
73e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Can be requested via the View.setLayerType(View.LAYER_TYPE_HARDWARE, ...)
74e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Android API method.
75e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  bool is_layer;
76e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
77e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Input: current transformation matrix in surface pixels.
78e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  // Uses the column-based OpenGL matrix format.
79e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  float transform[16];
80e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba};
81e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
82e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Function to invoke a direct GL draw into the client's pre-configured
83e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// GL context. Obtained via AwContents.getDrawGLFunction() (static).
84e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// |view_context| is an opaque identifier that was returned by the corresponding
85e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// call to AwContents.getAwDrawGLViewContext().
86e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// |draw_info| carries the in and out parameters for this draw.
87e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// |spare| ignored; pass NULL.
88e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibatypedef void (AwDrawGLFunction)(long view_context,
89e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba                                AwDrawGLInfo* draw_info,
90e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba                                void* spare);
91e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibaenum AwMapMode {
92e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  MAP_READ_ONLY,
93e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  MAP_WRITE_ONLY,
94e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  MAP_READ_WRITE,
95e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba};
96e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
97e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Called to create a GraphicBuffer
98e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibatypedef long AwCreateGraphicBufferFunction(int w, int h);
99e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Called to release a GraphicBuffer
100e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibatypedef void AwReleaseGraphicBufferFunction(long buffer_id);
101e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Called to map a GraphicBuffer in |mode|.
102e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibatypedef int AwMapFunction(long buffer_id, AwMapMode mode, void** vaddr);
103e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Called to unmap a GraphicBuffer
104e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibatypedef int AwUnmapFunction(long buffer_id);
105e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Called to get a native buffer pointer
106e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibatypedef void* AwGetNativeBufferFunction(long buffer_id);
107e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Called to get the stride of the buffer
108e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibatypedef unsigned int AwGetStrideFunction(long buffer_id);
109e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
110e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibastatic const int kAwDrawGLFunctionTableVersion = 1;
111e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
112e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba// Set of functions used in rendering in hardware mode
113e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosibastruct AwDrawGLFunctionTable {
114e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  int version;
115e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  AwCreateGraphicBufferFunction* create_graphic_buffer;
116e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  AwReleaseGraphicBufferFunction* release_graphic_buffer;
117e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  AwMapFunction* map;
118e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  AwUnmapFunction* unmap;
119e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  AwGetNativeBufferFunction* get_native_buffer;
120e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba  AwGetStrideFunction* get_stride;
121e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba};
122e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
123e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba#ifdef __cplusplus
124e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba}  // extern "C"
125e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba#endif
126e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba
127e4be25a7c5d547be06ed43166d82237cb08ad38aMarcin Kosiba#endif  // ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_GL_H_
128