Loading services/surfaceflinger/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ LOCAL_SRC_FILES:= \ clz.cpp.arm \ DisplayHardware/DisplayHardware.cpp \ DisplayHardware/DisplayHardwareBase.cpp \ DisplayHardware/HWComposer.cpp \ BlurFilter.cpp.arm \ GLExtensions.cpp \ Layer.cpp \ Loading services/surfaceflinger/DisplayHardware/DisplayHardware.cpp +19 −3 Original line number Diff line number Diff line Loading @@ -36,11 +36,11 @@ #include "DisplayHardware/DisplayHardware.h" #include <hardware/copybit.h> #include <hardware/overlay.h> #include <hardware/gralloc.h> #include "GLExtensions.h" #include "HWComposer.h" using namespace android; Loading Loading @@ -76,7 +76,7 @@ DisplayHardware::DisplayHardware( const sp<SurfaceFlinger>& flinger, uint32_t dpy) : DisplayHardwareBase(flinger, dpy), mFlags(0) mFlags(0), mHwc(0) { init(dpy); } Loading Loading @@ -262,6 +262,17 @@ void DisplayHardware::init(uint32_t dpy) // Unbind the context from this thread eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); // initialize the H/W composer mHwc = new HWComposer(); if (mHwc->initCheck() == NO_ERROR) { mHwc->setFrameBuffer(mDisplay, mSurface); } } HWComposer& DisplayHardware::getHwComposer() const { return *mHwc; } /* Loading Loading @@ -317,7 +328,12 @@ void DisplayHardware::flip(const Region& dirty) const } mPageFlipCount++; if (mHwc->initCheck() == NO_ERROR) { mHwc->commit(); } else { eglSwapBuffers(dpy, surface); } checkEGLErrors("eglSwapBuffers"); // for debugging Loading services/surfaceflinger/DisplayHardware/DisplayHardware.h +6 −2 Original line number Diff line number Diff line Loading @@ -34,12 +34,11 @@ #include "DisplayHardware/DisplayHardwareBase.h" struct overlay_control_device_t; struct framebuffer_device_t; struct copybit_image_t; namespace android { class FramebufferNativeWindow; class HWComposer; class DisplayHardware : public DisplayHardwareBase { Loading Loading @@ -81,6 +80,9 @@ public: EGLDisplay getEGLDisplay() const { return mDisplay; } overlay_control_device_t* getOverlayEngine() const { return mOverlayEngine; } // Hardware Composer HWComposer& getHwComposer() const; status_t compositionComplete() const; Rect bounds() const { Loading @@ -107,6 +109,8 @@ private: GLint mMaxViewportDims; GLint mMaxTextureSize; HWComposer* mHwc; sp<FramebufferNativeWindow> mNativeWindow; overlay_control_device_t* mOverlayEngine; }; Loading services/surfaceflinger/DisplayHardware/HWComposer.cpp 0 → 100644 +93 −0 Original line number Diff line number Diff line /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <stdint.h> #include <sys/types.h> #include <utils/Errors.h> #include <hardware/hardware.h> #include <cutils/log.h> #include <EGL/egl.h> #include "HWComposer.h" namespace android { // --------------------------------------------------------------------------- HWComposer::HWComposer() : mModule(0), mHwc(0), mList(0), mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE) { int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule); LOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID); if (err == 0) { err = hwc_open(mModule, &mHwc); LOGE_IF(err, "%s device failed to initialize (%s)", HWC_HARDWARE_COMPOSER, strerror(-err)); } } HWComposer::~HWComposer() { free(mList); if (mHwc) { hwc_close(mHwc); } } status_t HWComposer::initCheck() const { return mHwc ? NO_ERROR : NO_INIT; } void HWComposer::setFrameBuffer(EGLDisplay dpy, EGLSurface sur) { mDpy = (hwc_display_t)dpy; mSur = (hwc_surface_t)sur; } status_t HWComposer::createWorkList(size_t numLayers) { if (mHwc && (!mList || mList->numHwLayers < numLayers)) { free(mList); size_t size = sizeof(hwc_layer_list) + numLayers*sizeof(hwc_layer_t); mList = (hwc_layer_list_t*)malloc(size); mList->flags = HWC_GEOMETRY_CHANGED; mList->numHwLayers = numLayers; } return NO_ERROR; } status_t HWComposer::prepare() const { int err = mHwc->prepare(mHwc, mList); return (status_t)err; } status_t HWComposer::commit() const { int err = mHwc->set(mHwc, mDpy, mSur, mList); mList->flags &= ~HWC_GEOMETRY_CHANGED; return (status_t)err; } HWComposer::iterator HWComposer::begin() { return mList ? &(mList->hwLayers[0]) : NULL; } HWComposer::iterator HWComposer::end() { return mList ? &(mList->hwLayers[mList->numHwLayers]) : NULL; } // --------------------------------------------------------------------------- }; // namespace android services/surfaceflinger/DisplayHardware/HWComposer.h 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_SF_HWCOMPOSER_H #define ANDROID_SF_HWCOMPOSER_H #include <stdint.h> #include <sys/types.h> #include <EGL/egl.h> #include <hardware/hwcomposer.h> namespace android { // --------------------------------------------------------------------------- class HWComposer { public: HWComposer(); ~HWComposer(); status_t initCheck() const; // tells the HAL what the framebuffer is void setFrameBuffer(EGLDisplay dpy, EGLSurface sur); // create a work list for numLayers layer status_t createWorkList(size_t numLayers); // Asks the HAL what it can do status_t prepare() const; // commits the list status_t commit() const; typedef hwc_layer_t const * const_iterator; typedef hwc_layer_t* iterator; iterator begin(); iterator end(); private: hw_module_t const* mModule; hwc_composer_device_t* mHwc; hwc_layer_list_t* mList; hwc_display_t mDpy; hwc_surface_t mSur; }; // --------------------------------------------------------------------------- }; // namespace android #endif // ANDROID_SF_HWCOMPOSER_H Loading
services/surfaceflinger/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ LOCAL_SRC_FILES:= \ clz.cpp.arm \ DisplayHardware/DisplayHardware.cpp \ DisplayHardware/DisplayHardwareBase.cpp \ DisplayHardware/HWComposer.cpp \ BlurFilter.cpp.arm \ GLExtensions.cpp \ Layer.cpp \ Loading
services/surfaceflinger/DisplayHardware/DisplayHardware.cpp +19 −3 Original line number Diff line number Diff line Loading @@ -36,11 +36,11 @@ #include "DisplayHardware/DisplayHardware.h" #include <hardware/copybit.h> #include <hardware/overlay.h> #include <hardware/gralloc.h> #include "GLExtensions.h" #include "HWComposer.h" using namespace android; Loading Loading @@ -76,7 +76,7 @@ DisplayHardware::DisplayHardware( const sp<SurfaceFlinger>& flinger, uint32_t dpy) : DisplayHardwareBase(flinger, dpy), mFlags(0) mFlags(0), mHwc(0) { init(dpy); } Loading Loading @@ -262,6 +262,17 @@ void DisplayHardware::init(uint32_t dpy) // Unbind the context from this thread eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); // initialize the H/W composer mHwc = new HWComposer(); if (mHwc->initCheck() == NO_ERROR) { mHwc->setFrameBuffer(mDisplay, mSurface); } } HWComposer& DisplayHardware::getHwComposer() const { return *mHwc; } /* Loading Loading @@ -317,7 +328,12 @@ void DisplayHardware::flip(const Region& dirty) const } mPageFlipCount++; if (mHwc->initCheck() == NO_ERROR) { mHwc->commit(); } else { eglSwapBuffers(dpy, surface); } checkEGLErrors("eglSwapBuffers"); // for debugging Loading
services/surfaceflinger/DisplayHardware/DisplayHardware.h +6 −2 Original line number Diff line number Diff line Loading @@ -34,12 +34,11 @@ #include "DisplayHardware/DisplayHardwareBase.h" struct overlay_control_device_t; struct framebuffer_device_t; struct copybit_image_t; namespace android { class FramebufferNativeWindow; class HWComposer; class DisplayHardware : public DisplayHardwareBase { Loading Loading @@ -81,6 +80,9 @@ public: EGLDisplay getEGLDisplay() const { return mDisplay; } overlay_control_device_t* getOverlayEngine() const { return mOverlayEngine; } // Hardware Composer HWComposer& getHwComposer() const; status_t compositionComplete() const; Rect bounds() const { Loading @@ -107,6 +109,8 @@ private: GLint mMaxViewportDims; GLint mMaxTextureSize; HWComposer* mHwc; sp<FramebufferNativeWindow> mNativeWindow; overlay_control_device_t* mOverlayEngine; }; Loading
services/surfaceflinger/DisplayHardware/HWComposer.cpp 0 → 100644 +93 −0 Original line number Diff line number Diff line /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <stdint.h> #include <sys/types.h> #include <utils/Errors.h> #include <hardware/hardware.h> #include <cutils/log.h> #include <EGL/egl.h> #include "HWComposer.h" namespace android { // --------------------------------------------------------------------------- HWComposer::HWComposer() : mModule(0), mHwc(0), mList(0), mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE) { int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule); LOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID); if (err == 0) { err = hwc_open(mModule, &mHwc); LOGE_IF(err, "%s device failed to initialize (%s)", HWC_HARDWARE_COMPOSER, strerror(-err)); } } HWComposer::~HWComposer() { free(mList); if (mHwc) { hwc_close(mHwc); } } status_t HWComposer::initCheck() const { return mHwc ? NO_ERROR : NO_INIT; } void HWComposer::setFrameBuffer(EGLDisplay dpy, EGLSurface sur) { mDpy = (hwc_display_t)dpy; mSur = (hwc_surface_t)sur; } status_t HWComposer::createWorkList(size_t numLayers) { if (mHwc && (!mList || mList->numHwLayers < numLayers)) { free(mList); size_t size = sizeof(hwc_layer_list) + numLayers*sizeof(hwc_layer_t); mList = (hwc_layer_list_t*)malloc(size); mList->flags = HWC_GEOMETRY_CHANGED; mList->numHwLayers = numLayers; } return NO_ERROR; } status_t HWComposer::prepare() const { int err = mHwc->prepare(mHwc, mList); return (status_t)err; } status_t HWComposer::commit() const { int err = mHwc->set(mHwc, mDpy, mSur, mList); mList->flags &= ~HWC_GEOMETRY_CHANGED; return (status_t)err; } HWComposer::iterator HWComposer::begin() { return mList ? &(mList->hwLayers[0]) : NULL; } HWComposer::iterator HWComposer::end() { return mList ? &(mList->hwLayers[mList->numHwLayers]) : NULL; } // --------------------------------------------------------------------------- }; // namespace android
services/surfaceflinger/DisplayHardware/HWComposer.h 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_SF_HWCOMPOSER_H #define ANDROID_SF_HWCOMPOSER_H #include <stdint.h> #include <sys/types.h> #include <EGL/egl.h> #include <hardware/hwcomposer.h> namespace android { // --------------------------------------------------------------------------- class HWComposer { public: HWComposer(); ~HWComposer(); status_t initCheck() const; // tells the HAL what the framebuffer is void setFrameBuffer(EGLDisplay dpy, EGLSurface sur); // create a work list for numLayers layer status_t createWorkList(size_t numLayers); // Asks the HAL what it can do status_t prepare() const; // commits the list status_t commit() const; typedef hwc_layer_t const * const_iterator; typedef hwc_layer_t* iterator; iterator begin(); iterator end(); private: hw_module_t const* mModule; hwc_composer_device_t* mHwc; hwc_layer_list_t* mList; hwc_display_t mDpy; hwc_surface_t mSur; }; // --------------------------------------------------------------------------- }; // namespace android #endif // ANDROID_SF_HWCOMPOSER_H