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