Merge change 2292 into donut

* changes:
  split boot animation out of SurfaceFlinger
This commit is contained in:
Android (Google) Code Review
2009-05-21 19:33:59 -07:00
10 changed files with 127 additions and 39 deletions

View File

@@ -0,0 +1,30 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
bootanimation_main.cpp \
BootAnimation.cpp
# need "-lrt" on Linux simulator to pick up clock_gettime
ifeq ($(TARGET_SIMULATOR),true)
ifeq ($(HOST_OS),linux)
LOCAL_LDLIBS += -lrt
endif
endif
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libui \
libcorecg \
libsgl \
libEGL \
libGLESv1_CM
LOCAL_C_INCLUDES := \
$(call include-path-for, corecg graphics)
LOCAL_MODULE:= bootanimation
include $(BUILD_EXECUTABLE)

View File

@@ -22,6 +22,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <utils/misc.h> #include <utils/misc.h>
#include <utils/IPCThreadState.h>
#include <utils/threads.h> #include <utils/threads.h>
#include <utils/Atomic.h> #include <utils/Atomic.h>
#include <utils/Errors.h> #include <utils/Errors.h>
@@ -49,10 +50,9 @@ namespace android {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
BootAnimation::BootAnimation(const sp<ISurfaceComposer>& composer) : BootAnimation::BootAnimation() : Thread(false)
Thread(false) { {
mSession = SurfaceComposerClient::clientForConnection( mSession = new SurfaceComposerClient();
composer->createConnection()->asBinder());
} }
BootAnimation::~BootAnimation() { BootAnimation::~BootAnimation() {
@@ -131,7 +131,7 @@ status_t BootAnimation::readyToRun() {
// create the native surface // create the native surface
sp<Surface> s = session()->createSurface(getpid(), 0, dinfo.w, dinfo.h, sp<Surface> s = session()->createSurface(getpid(), 0, dinfo.w, dinfo.h,
PIXEL_FORMAT_RGB_565); PIXEL_FORMAT_RGB_565, ISurfaceComposer::eGPU);
session()->openTransaction(); session()->openTransaction();
s->setLayer(0x40000000); s->setLayer(0x40000000);
session()->closeTransaction(); session()->closeTransaction();
@@ -144,7 +144,10 @@ status_t BootAnimation::readyToRun() {
EGLConfig config; EGLConfig config;
EGLSurface surface; EGLSurface surface;
EGLContext context; EGLContext context;
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(display, 0, 0);
eglChooseConfig(display, attribs, &config, 1, &numConfigs); eglChooseConfig(display, attribs, &config, 1, &numConfigs);
mNativeWindowSurface = new EGLNativeWindowSurface(s); mNativeWindowSurface = new EGLNativeWindowSurface(s);
@@ -170,17 +173,15 @@ status_t BootAnimation::readyToRun() {
return NO_ERROR; return NO_ERROR;
} }
void BootAnimation::requestExit() {
mBarrier.open();
Thread::requestExit();
}
bool BootAnimation::threadLoop() { bool BootAnimation::threadLoop() {
bool r = android(); bool r = android();
eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(mDisplay, mContext); eglDestroyContext(mDisplay, mContext);
eglDestroySurface(mDisplay, mSurface); eglDestroySurface(mDisplay, mSurface);
mNativeWindowSurface.clear(); mNativeWindowSurface.clear();
mFlingerSurface.clear();
eglTerminate(mDisplay);
IPCThreadState::self()->stopProcess();
return r; return r;
} }
@@ -227,8 +228,10 @@ bool BootAnimation::android() {
glBindTexture(GL_TEXTURE_2D, mAndroid[0].name); glBindTexture(GL_TEXTURE_2D, mAndroid[0].name);
glDrawTexiOES(xc, yc, 0, mAndroid[0].w, mAndroid[0].h); glDrawTexiOES(xc, yc, 0, mAndroid[0].w, mAndroid[0].h);
eglSwapBuffers(mDisplay, mSurface); EGLBoolean res = eglSwapBuffers(mDisplay, mSurface);
if (res == EGL_FALSE)
break;
// 12fps: don't animate too fast to preserve CPU // 12fps: don't animate too fast to preserve CPU
const nsecs_t sleepTime = 83333 - ns2us(systemTime() - now); const nsecs_t sleepTime = 83333 - ns2us(systemTime() - now);
if (sleepTime > 0) if (sleepTime > 0)

View File

@@ -29,8 +29,6 @@
#include <EGL/egl.h> #include <EGL/egl.h>
#include <GLES/gl.h> #include <GLES/gl.h>
#include "Barrier.h"
class SkBitmap; class SkBitmap;
namespace android { namespace android {
@@ -43,11 +41,10 @@ class EGLNativeWindowSurface;
class BootAnimation : public Thread class BootAnimation : public Thread
{ {
public: public:
BootAnimation(const sp<ISurfaceComposer>& composer); BootAnimation();
virtual ~BootAnimation(); virtual ~BootAnimation();
const sp<SurfaceComposerClient>& session() const; const sp<SurfaceComposerClient>& session() const;
virtual void requestExit();
private: private:
virtual bool threadLoop(); virtual bool threadLoop();
@@ -73,7 +70,6 @@ private:
EGLDisplay mSurface; EGLDisplay mSurface;
sp<Surface> mFlingerSurface; sp<Surface> mFlingerSurface;
sp<EGLNativeWindowSurface> mNativeWindowSurface; sp<EGLNativeWindowSurface> mNativeWindowSurface;
Barrier mBarrier;
}; };
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2007 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.
*/
#define LOG_TAG "BootAnimation"
#include <utils/IPCThreadState.h>
#include <utils/ProcessState.h>
#include <utils/IServiceManager.h>
#include <utils/Log.h>
#include <utils/threads.h>
#include <ui/ISurfaceComposer.h>
#if defined(HAVE_PTHREADS)
# include <pthread.h>
# include <sys/resource.h>
#endif
#include "BootAnimation.h"
using namespace android;
// ---------------------------------------------------------------------------
int main(int argc, char** argv)
{
#if defined(HAVE_PTHREADS)
setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);
#endif
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
// create the boot animation object
sp<BootAnimation> boot = new BootAnimation();
IPCThreadState::self()->joinThreadPool();
return 0;
}

View File

@@ -138,6 +138,8 @@
<assign-permission name="android.permission.ACCESS_DRM" uid="media" /> <assign-permission name="android.permission.ACCESS_DRM" uid="media" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="media" /> <assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="media" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="graphics" />
<!-- This is a list of all the libraries available for application <!-- This is a list of all the libraries available for application
code to link against. --> code to link against. -->

View File

@@ -6,7 +6,6 @@ LOCAL_SRC_FILES:= \
DisplayHardware/DisplayHardware.cpp \ DisplayHardware/DisplayHardware.cpp \
DisplayHardware/DisplayHardwareBase.cpp \ DisplayHardware/DisplayHardwareBase.cpp \
GPUHardware/GPUHardware.cpp \ GPUHardware/GPUHardware.cpp \
BootAnimation.cpp \
BlurFilter.cpp.arm \ BlurFilter.cpp.arm \
CPUGauge.cpp \ CPUGauge.cpp \
Layer.cpp \ Layer.cpp \

View File

@@ -61,6 +61,13 @@
#include "GPUHardware/GPUHardware.h" #include "GPUHardware/GPUHardware.h"
/* ideally AID_GRAPHICS would be in a semi-public header
* or there would be a way to map a user/group name to its id
*/
#ifndef AID_GRAPHICS
#define AID_GRAPHICS 1003
#endif
#define DISPLAY_COUNT 1 #define DISPLAY_COUNT 1
namespace android { namespace android {
@@ -184,7 +191,6 @@ SurfaceFlinger::SurfaceFlinger()
mDebugCpu(0), mDebugCpu(0),
mDebugFps(0), mDebugFps(0),
mDebugBackground(0), mDebugBackground(0),
mDebugNoBootAnimation(0),
mSyncObject(), mSyncObject(),
mDeplayedTransactionPending(0), mDeplayedTransactionPending(0),
mConsoleSignals(0), mConsoleSignals(0),
@@ -207,14 +213,11 @@ void SurfaceFlinger::init()
mDebugBackground = atoi(value); mDebugBackground = atoi(value);
property_get("debug.sf.showfps", value, "0"); property_get("debug.sf.showfps", value, "0");
mDebugFps = atoi(value); mDebugFps = atoi(value);
property_get("debug.sf.nobootanimation", value, "0");
mDebugNoBootAnimation = atoi(value);
LOGI_IF(mDebugRegion, "showupdates enabled"); LOGI_IF(mDebugRegion, "showupdates enabled");
LOGI_IF(mDebugCpu, "showcpu enabled"); LOGI_IF(mDebugCpu, "showcpu enabled");
LOGI_IF(mDebugBackground, "showbackground enabled"); LOGI_IF(mDebugBackground, "showbackground enabled");
LOGI_IF(mDebugFps, "showfps enabled"); LOGI_IF(mDebugFps, "showfps enabled");
LOGI_IF(mDebugNoBootAnimation, "boot animation disabled");
} }
SurfaceFlinger::~SurfaceFlinger() SurfaceFlinger::~SurfaceFlinger()
@@ -324,11 +327,8 @@ void SurfaceFlinger::bootFinished()
{ {
const nsecs_t now = systemTime(); const nsecs_t now = systemTime();
const nsecs_t duration = now - mBootTime; const nsecs_t duration = now - mBootTime;
LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) ); LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
if (mBootAnimation != 0) { property_set("ctl.stop", "bootanim");
mBootAnimation->requestExit();
mBootAnimation.clear();
}
} }
void SurfaceFlinger::onFirstRef() void SurfaceFlinger::onFirstRef()
@@ -456,10 +456,10 @@ status_t SurfaceFlinger::readyToRun()
if (mDebugCpu) if (mDebugCpu)
mCpuGauge = new CPUGauge(this, ms2ns(500)); mCpuGauge = new CPUGauge(this, ms2ns(500));
// the boot animation!
if (mDebugNoBootAnimation == false) // start boot animation
mBootAnimation = new BootAnimation(this); property_set("ctl.start", "bootanim");
return NO_ERROR; return NO_ERROR;
} }
@@ -1543,13 +1543,13 @@ status_t SurfaceFlinger::onTransact(
// codes that require permission check // codes that require permission check
IPCThreadState* ipc = IPCThreadState::self(); IPCThreadState* ipc = IPCThreadState::self();
const int pid = ipc->getCallingPid(); const int pid = ipc->getCallingPid();
const int uid = ipc->getCallingUid();
const int self_pid = getpid(); const int self_pid = getpid();
if (UNLIKELY(pid != self_pid)) { if (UNLIKELY(pid != self_pid && uid != AID_GRAPHICS)) {
// we're called from a different process, do the real check // we're called from a different process, do the real check
if (!checkCallingPermission( if (!checkCallingPermission(
String16("android.permission.ACCESS_SURFACE_FLINGER"))) String16("android.permission.ACCESS_SURFACE_FLINGER")))
{ {
const int uid = ipc->getCallingUid();
LOGE("Permission Denial: " LOGE("Permission Denial: "
"can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED; return PERMISSION_DENIED;

View File

@@ -36,7 +36,6 @@
#include <private/ui/SurfaceFlingerSynchro.h> #include <private/ui/SurfaceFlingerSynchro.h>
#include "Barrier.h" #include "Barrier.h"
#include "BootAnimation.h"
#include "CPUGauge.h" #include "CPUGauge.h"
#include "Layer.h" #include "Layer.h"
#include "Tokenizer.h" #include "Tokenizer.h"
@@ -347,7 +346,6 @@ private:
sp<SurfaceHeapManager> mSurfaceHeapManager; sp<SurfaceHeapManager> mSurfaceHeapManager;
sp<GPUHardwareInterface> mGPU; sp<GPUHardwareInterface> mGPU;
GLuint mWormholeTexName; GLuint mWormholeTexName;
sp<BootAnimation> mBootAnimation;
nsecs_t mBootTime; nsecs_t mBootTime;
// Can only accessed from the main thread, these members // Can only accessed from the main thread, these members
@@ -374,7 +372,6 @@ private:
int mDebugCpu; int mDebugCpu;
int mDebugFps; int mDebugFps;
int mDebugBackground; int mDebugBackground;
int mDebugNoBootAnimation;
// these are thread safe // these are thread safe
mutable Barrier mReadyToRunBarrier; mutable Barrier mReadyToRunBarrier;

View File

@@ -35,6 +35,8 @@
#include <utils/MemoryHeapPmem.h> #include <utils/MemoryHeapPmem.h>
#include <utils/MemoryHeapBase.h> #include <utils/MemoryHeapBase.h>
#include <EGL/eglnatives.h>
#include "GPUHardware/GPUHardware.h" #include "GPUHardware/GPUHardware.h"
#include "SurfaceFlinger.h" #include "SurfaceFlinger.h"
#include "VRamHeap.h" #include "VRamHeap.h"

View File

@@ -35,6 +35,13 @@
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/* ideally AID_GRAPHICS would be in a semi-public header
* or there would be a way to map a user/group name to its id
*/
#ifndef AID_GRAPHICS
#define AID_GRAPHICS 1003
#endif
#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) #define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) #define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
@@ -136,13 +143,13 @@ status_t BnSurfaceFlingerClient::onTransact(
IPCThreadState* ipc = IPCThreadState::self(); IPCThreadState* ipc = IPCThreadState::self();
const int pid = ipc->getCallingPid(); const int pid = ipc->getCallingPid();
const int self_pid = getpid(); const int uid = ipc->getCallingUid();
if (UNLIKELY(pid != self_pid)) { const int self_pid = getpid();
if (UNLIKELY(pid != self_pid && uid != AID_GRAPHICS)) {
// we're called from a different process, do the real check // we're called from a different process, do the real check
if (!checkCallingPermission( if (!checkCallingPermission(
String16("android.permission.ACCESS_SURFACE_FLINGER"))) String16("android.permission.ACCESS_SURFACE_FLINGER")))
{ {
const int uid = ipc->getCallingUid();
LOGE("Permission Denial: " LOGE("Permission Denial: "
"can't openGlobalTransaction pid=%d, uid=%d", pid, uid); "can't openGlobalTransaction pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED; return PERMISSION_DENIED;