DisplayDevice.cpp revision 1d12d8a8e61163b35cf42c51c558a67138014e82
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/SurfaceTextureClient.h> 311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/FramebufferSurface.h" 391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 41da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h" 420f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h" 44c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 45921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h" 461f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 47a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 49a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors() 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian do { 55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // there could be more than one error flag 56cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian GLenum error = glGetError(); 57cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian if (error == GL_NO_ERROR) 58cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian break; 59e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("GL error 0x%04x", int(error)); 60cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } while(true); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 64a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 700f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 723ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian DisplayType type, const wp<IBinder>& displayToken, 731a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<ANativeWindow>& nativeWindow, 741a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<FramebufferSurface>& framebufferSurface, 75a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 7692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mFlinger(flinger), 773ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mType(type), mHwcDisplayId(-1), 781a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mNativeWindow(nativeWindow), 791a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mFramebufferSurface(framebufferSurface), 8092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 8192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 8292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mContext(EGL_NO_CONTEXT), 8392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 8492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 8592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSecureLayerVisible(false), 8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mScreenAcquired(false), 88da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mLayerStack(0), 89da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation() 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 91a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian init(config); 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 940f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() { 9592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian if (mSurface != EGL_NO_SURFACE) { 9692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian eglDestroySurface(mDisplay, mSurface); 9792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface = EGL_NO_SURFACE; 9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian} 10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const { 10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian return mFlinger != NULL; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1050f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const { 106a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayWidth; 1076163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian} 1086163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1090f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const { 110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayHeight; 111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 112a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const { 114a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFormat; 115a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 116a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const { 118a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mSurface; 119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 1206163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1210f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config) 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 124a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1256163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 1266163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 127b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 128a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 130b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 131385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 1321f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 133a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 1361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 1371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1391f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1401f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 141a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 1421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 143da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 144da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1451f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 1465f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian // external displays are always considered enabled 1473ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mScreenAcquired = (mType >= DisplayDevice::NUM_DISPLAY_TYPES); 1483ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian 1493ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian // get an h/w composer ID 1503ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mHwcDisplayId = mFlinger->allocateHwcDisplayId(mType); 1515f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1528dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1538dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1548dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1558dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1568dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1578dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1588dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1598dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1608dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1618dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1628dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1638dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1648dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1658dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 16698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 16700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 168a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 169a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 1700f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 171076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1740f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 175a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface == NULL) { 176a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 177a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFramebufferSurface->compositionComplete(); 17974faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1810f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1885e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 189df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 190b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 191b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 192df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 193df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1955e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 196d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian 197076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 200da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 201da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() != NO_ERROR) { 202da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian // no HWC, we call eglSwapBuffers() 203da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian eglSwapBuffers(mDisplay, mSurface); 204da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } else { 205d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // We have a valid HWC, but not all displays can use it, in particular 206d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // the virtual displays are on their own. 207d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // TODO: HWC 1.2 will allow virtual displays 208d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian if (mType >= DisplayDevice::DISPLAY_VIRTUAL) { 209d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // always call eglSwapBuffers() for virtual displays 210d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian eglSwapBuffers(mDisplay, mSurface); 211d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian } else if (hwc.supportsFramebufferTarget()) { 212d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // as of hwc 1.1 we always call eglSwapBuffers if we have some 213d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // GLES layers 214d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian if (hwc.hasGlesComposition(mType)) { 215da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian eglSwapBuffers(mDisplay, mSurface); 216da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 217d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian } else { 218d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // HWC doesn't have the framebuffer target, we don't call 219d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // eglSwapBuffers(), since this is handled by HWComposer::commit(). 220da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 221da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 222da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 223da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 224da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const { 225da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() == NO_ERROR) { 226da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.supportsFramebufferTarget()) { 227da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian int fd = hwc.getAndResetReleaseFenceFd(mType); 228da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian mFramebufferSurface->setReleaseFenceFd(fd); 229da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 230da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 231da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 232da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2330f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 238da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, 239da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const sp<const DisplayDevice>& hw, EGLContext ctx) { 240da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 24152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 2424297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (sur != hw->mSurface) { 243da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian result = eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx); 244da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 245da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian GLsizei w = hw->mDisplayWidth; 246da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian GLsizei h = hw->mDisplayHeight; 247da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian glViewport(0, 0, w, h); 248da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian glMatrixMode(GL_PROJECTION); 249da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian glLoadIdentity(); 250da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // put the origin in the left-bottom corner 251da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h 252da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 25352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 254da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 25552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 25652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 2571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 2590f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) { 2603b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 261ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian mSecureLayerVisible = false; 2623b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 2633b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 2643b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if (layers[i]->isSecure()) { 2653b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 2663b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2673b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2683b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2693b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2703ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopianconst Vector< sp<LayerBase> >& DisplayDevice::getVisibleLayersSortedByZ() const { 2713b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 2723b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2733b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2740f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 2753b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 2763b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2773b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 278cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 279cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 280cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 281cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 282cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 283da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 284cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 285cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 286cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 287cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 288cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 289cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 2903b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 291d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 292d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const { 293d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 294d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 295d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 296d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const { 297d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = false; 298d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 299d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 300d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const { 301d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = true; 302d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 303d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 304d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const { 305d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 306d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 307d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 308d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3093b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 31028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 31128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 31228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 31328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 31428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 31528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 31628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 3170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3191b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3223165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3231b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3253165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3271b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3283165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3313165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3321b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3331b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 34100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 34200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& viewport, const Rect& frame) { 343da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation = orientation; 34400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian mViewport = viewport; 34500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian mFrame = frame; 346da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian updateGeometryTransform(); 347da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian} 348da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 349da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopianvoid DisplayDevice::updateGeometryTransform() { 35098a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int w = mDisplayWidth; 35198a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int h = mDisplayHeight; 3526e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown Transform TL, TP, R, S; 353da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (DisplayDevice::orientationToTransfrom( 354da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation, w, h, &R) == NO_ERROR) { 355da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian dirtyRegion.set(bounds()); 356da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 357da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian Rect viewport(mViewport); 358da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian Rect frame(mFrame); 359da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 360da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (!frame.isValid()) { 361da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // the destination frame can be invalid if it has never been set, 362da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // in that case we assume the whole display frame. 363da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian frame = Rect(w, h); 364da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 365da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 366da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (viewport.isEmpty()) { 367da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // viewport can be invalid if it has never been set, in that case 368da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // we assume the whole display size. 369da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // it's also invalid to have an empty viewport, so we handle that 370da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // case in the same way. 371da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian viewport = Rect(w, h); 372da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (R.getOrientation() & Transform::ROT_90) { 373da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // viewport is always specified in the logical orientation 374da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // of the display (ie: post-rotation). 375da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian swap(viewport.right, viewport.bottom); 376da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 377da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 3781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 379da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_width = viewport.width(); 380da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_height = viewport.height(); 381da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_width = frame.width(); 382da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_height = frame.height(); 3836360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall if (src_width != dst_width || src_height != dst_height) { 384da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float sx = dst_width / src_width; 385da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float sy = dst_height / src_height; 386da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian S.set(sx, 0, 0, sy); 387da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 3886360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 389da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_x = viewport.left; 390da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_y = viewport.top; 391da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_x = frame.left; 392da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_y = frame.top; 3936e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown TL.set(-src_x, -src_y); 3946e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown TP.set(dst_x, dst_y); 3956e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown 3966e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown // The viewport and frame are both in the logical orientation. 3976e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown // Apply the logical translation, scale to physical size, apply the 3986e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown // physical translation and finally rotate to the physical orientation. 3996e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown mGlobalTransform = R * TP * S * TL; 4001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 4011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4021d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 4031d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopianvoid DisplayDevice::dump(String8& result, char* buffer, size_t SIZE) const { 4041d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 4051d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian snprintf(buffer, SIZE, 4061d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "+ DisplayDevice: %s\n" 4071d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian " type=%x, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), " 4081d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "flips=%u, secure=%d, acquired=%d, numLayers=%u\n" 4091d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian " v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], " 4101d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 4111d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mType, mDisplayName.string(), 4121d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(), 4131d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mOrientation, tr.getType(), getPageFlipCount(), 4141d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mSecureLayerVisible, mScreenAcquired, mVisibleLayersSortedByZ.size(), 4151d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 4161d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, 4171d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][0], tr[1][0], tr[2][0], 4181d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][1], tr[1][1], tr[2][1], 4191d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][2], tr[1][2], tr[2][2]); 4201d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 4211d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian result.append(buffer); 4221d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 4231d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian String8 fbtargetDump; 4241d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian if (mFramebufferSurface != NULL) { 4251d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFramebufferSurface->dump(fbtargetDump); 4261d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian result.append(fbtargetDump); 4271d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian } 4281d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 429