Merge change 2292 into donut
* changes: split boot animation out of SurfaceFlinger
This commit is contained in:
30
cmds/bootanimation/Android.mk
Normal file
30
cmds/bootanimation/Android.mk
Normal 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)
|
||||||
@@ -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)
|
||||||
@@ -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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
52
cmds/bootanimation/bootanimation_main.cpp
Normal file
52
cmds/bootanimation/bootanimation_main.cpp
Normal 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;
|
||||||
|
}
|
||||||
@@ -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. -->
|
||||||
|
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user