HWComposer.cpp revision 31d2843b45ebdb69ec3355111b7567363fd2a6b7
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <stdint.h> 18#include <stdio.h> 19#include <stdlib.h> 20#include <string.h> 21#include <sys/types.h> 22 23#include <utils/Errors.h> 24#include <utils/String8.h> 25#include <utils/Vector.h> 26 27#include <hardware/hardware.h> 28 29#include <cutils/log.h> 30 31#include <EGL/egl.h> 32 33#include "LayerBase.h" 34#include "HWComposer.h" 35#include "SurfaceFlinger.h" 36 37namespace android { 38// --------------------------------------------------------------------------- 39 40HWComposer::HWComposer(const sp<SurfaceFlinger>& flinger) 41 : mFlinger(flinger), 42 mModule(0), mHwc(0), mList(0), mCapacity(0), 43 mNumOVLayers(0), mNumFBLayers(0), 44 mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE) 45{ 46 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule); 47 ALOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID); 48 if (err == 0) { 49 err = hwc_open(mModule, &mHwc); 50 ALOGE_IF(err, "%s device failed to initialize (%s)", 51 HWC_HARDWARE_COMPOSER, strerror(-err)); 52 if (err == 0) { 53 if (mHwc->registerProcs) { 54 mCBContext.hwc = this; 55 mCBContext.procs.invalidate = &hook_invalidate; 56 mCBContext.procs.vsync = &hook_vsync; 57 mHwc->registerProcs(mHwc, &mCBContext.procs); 58 memset(mCBContext.procs.zero, 0, sizeof(mCBContext.procs.zero)); 59 } 60 } 61 } 62} 63 64HWComposer::~HWComposer() { 65 free(mList); 66 if (mHwc) { 67 hwc_close(mHwc); 68 } 69} 70 71status_t HWComposer::initCheck() const { 72 return mHwc ? NO_ERROR : NO_INIT; 73} 74 75void HWComposer::hook_invalidate(struct hwc_procs* procs) { 76 reinterpret_cast<cb_context *>(procs)->hwc->invalidate(); 77} 78 79void HWComposer::hook_vsync(struct hwc_procs* procs, int dpy, int64_t timestamp) { 80 reinterpret_cast<cb_context *>(procs)->hwc->vsync(dpy, timestamp); 81} 82 83void HWComposer::invalidate() { 84 mFlinger->repaintEverything(); 85} 86 87void HWComposer::vsync(int dpy, int64_t timestamp) { 88} 89 90void HWComposer::setFrameBuffer(EGLDisplay dpy, EGLSurface sur) { 91 mDpy = (hwc_display_t)dpy; 92 mSur = (hwc_surface_t)sur; 93} 94 95status_t HWComposer::createWorkList(size_t numLayers) { 96 if (mHwc) { 97 if (!mList || mCapacity < numLayers) { 98 free(mList); 99 size_t size = sizeof(hwc_layer_list) + numLayers*sizeof(hwc_layer_t); 100 mList = (hwc_layer_list_t*)malloc(size); 101 mCapacity = numLayers; 102 } 103 mList->flags = HWC_GEOMETRY_CHANGED; 104 mList->numHwLayers = numLayers; 105 } 106 return NO_ERROR; 107} 108 109status_t HWComposer::prepare() const { 110 int err = mHwc->prepare(mHwc, mList); 111 if (err == NO_ERROR) { 112 size_t numOVLayers = 0; 113 size_t numFBLayers = 0; 114 size_t count = mList->numHwLayers; 115 for (size_t i=0 ; i<count ; i++) { 116 hwc_layer& l(mList->hwLayers[i]); 117 if (l.flags & HWC_SKIP_LAYER) { 118 l.compositionType = HWC_FRAMEBUFFER; 119 } 120 switch (l.compositionType) { 121 case HWC_OVERLAY: 122 numOVLayers++; 123 break; 124 case HWC_FRAMEBUFFER: 125 numFBLayers++; 126 break; 127 } 128 } 129 mNumOVLayers = numOVLayers; 130 mNumFBLayers = numFBLayers; 131 } 132 return (status_t)err; 133} 134 135size_t HWComposer::getLayerCount(int type) const { 136 switch (type) { 137 case HWC_OVERLAY: 138 return mNumOVLayers; 139 case HWC_FRAMEBUFFER: 140 return mNumFBLayers; 141 } 142 return 0; 143} 144 145status_t HWComposer::commit() const { 146 int err = mHwc->set(mHwc, mDpy, mSur, mList); 147 if (mList) { 148 mList->flags &= ~HWC_GEOMETRY_CHANGED; 149 } 150 return (status_t)err; 151} 152 153status_t HWComposer::release() const { 154 if (mHwc) { 155 int err = mHwc->set(mHwc, NULL, NULL, NULL); 156 return (status_t)err; 157 } 158 return NO_ERROR; 159} 160 161status_t HWComposer::disable() { 162 if (mHwc) { 163 free(mList); 164 mList = NULL; 165 int err = mHwc->prepare(mHwc, NULL); 166 return (status_t)err; 167 } 168 return NO_ERROR; 169} 170 171size_t HWComposer::getNumLayers() const { 172 return mList ? mList->numHwLayers : 0; 173} 174 175hwc_layer_t* HWComposer::getLayers() const { 176 return mList ? mList->hwLayers : 0; 177} 178 179void HWComposer::dump(String8& result, char* buffer, size_t SIZE, 180 const Vector< sp<LayerBase> >& visibleLayersSortedByZ) const { 181 if (mHwc && mList) { 182 result.append("Hardware Composer state:\n"); 183 184 snprintf(buffer, SIZE, " numHwLayers=%u, flags=%08x\n", 185 mList->numHwLayers, mList->flags); 186 result.append(buffer); 187 result.append( 188 " type | handle | hints | flags | tr | blend | format | source crop | frame name \n" 189 "----------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------\n"); 190 // " ________ | ________ | ________ | ________ | __ | _____ | ________ | [_____,_____,_____,_____] | [_____,_____,_____,_____] 191 for (size_t i=0 ; i<mList->numHwLayers ; i++) { 192 const hwc_layer_t& l(mList->hwLayers[i]); 193 const sp<LayerBase> layer(visibleLayersSortedByZ[i]); 194 int32_t format = -1; 195 if (layer->getLayer() != NULL) { 196 const sp<GraphicBuffer>& buffer(layer->getLayer()->getActiveBuffer()); 197 if (buffer != NULL) { 198 format = buffer->getPixelFormat(); 199 } 200 } 201 snprintf(buffer, SIZE, 202 " %8s | %08x | %08x | %08x | %02x | %05x | %08x | [%5d,%5d,%5d,%5d] | [%5d,%5d,%5d,%5d] %s\n", 203 l.compositionType ? "OVERLAY" : "FB", 204 intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, format, 205 l.sourceCrop.left, l.sourceCrop.top, l.sourceCrop.right, l.sourceCrop.bottom, 206 l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom, 207 layer->getName().string()); 208 result.append(buffer); 209 } 210 } 211 if (mHwc && mHwc->common.version >= 1 && mHwc->dump) { 212 mHwc->dump(mHwc, buffer, SIZE); 213 result.append(buffer); 214 } 215} 216 217// --------------------------------------------------------------------------- 218}; // namespace android 219