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 <utils/misc.h>
|
||||
|
||||
#include <utils/IPCThreadState.h>
|
||||
#include <utils/threads.h>
|
||||
#include <utils/Atomic.h>
|
||||
#include <utils/Errors.h>
|
||||
@@ -49,10 +50,9 @@ namespace android {
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
BootAnimation::BootAnimation(const sp<ISurfaceComposer>& composer) :
|
||||
Thread(false) {
|
||||
mSession = SurfaceComposerClient::clientForConnection(
|
||||
composer->createConnection()->asBinder());
|
||||
BootAnimation::BootAnimation() : Thread(false)
|
||||
{
|
||||
mSession = new SurfaceComposerClient();
|
||||
}
|
||||
|
||||
BootAnimation::~BootAnimation() {
|
||||
@@ -131,7 +131,7 @@ status_t BootAnimation::readyToRun() {
|
||||
|
||||
// create the native surface
|
||||
sp<Surface> s = session()->createSurface(getpid(), 0, dinfo.w, dinfo.h,
|
||||
PIXEL_FORMAT_RGB_565);
|
||||
PIXEL_FORMAT_RGB_565, ISurfaceComposer::eGPU);
|
||||
session()->openTransaction();
|
||||
s->setLayer(0x40000000);
|
||||
session()->closeTransaction();
|
||||
@@ -144,7 +144,10 @@ status_t BootAnimation::readyToRun() {
|
||||
EGLConfig config;
|
||||
EGLSurface surface;
|
||||
EGLContext context;
|
||||
|
||||
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||
|
||||
eglInitialize(display, 0, 0);
|
||||
eglChooseConfig(display, attribs, &config, 1, &numConfigs);
|
||||
|
||||
mNativeWindowSurface = new EGLNativeWindowSurface(s);
|
||||
@@ -170,17 +173,15 @@ status_t BootAnimation::readyToRun() {
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
void BootAnimation::requestExit() {
|
||||
mBarrier.open();
|
||||
Thread::requestExit();
|
||||
}
|
||||
|
||||
bool BootAnimation::threadLoop() {
|
||||
bool r = android();
|
||||
eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
eglDestroyContext(mDisplay, mContext);
|
||||
eglDestroySurface(mDisplay, mSurface);
|
||||
mNativeWindowSurface.clear();
|
||||
mFlingerSurface.clear();
|
||||
eglTerminate(mDisplay);
|
||||
IPCThreadState::self()->stopProcess();
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -227,8 +228,10 @@ bool BootAnimation::android() {
|
||||
glBindTexture(GL_TEXTURE_2D, mAndroid[0].name);
|
||||
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
|
||||
const nsecs_t sleepTime = 83333 - ns2us(systemTime() - now);
|
||||
if (sleepTime > 0)
|
||||
@@ -29,8 +29,6 @@
|
||||
#include <EGL/egl.h>
|
||||
#include <GLES/gl.h>
|
||||
|
||||
#include "Barrier.h"
|
||||
|
||||
class SkBitmap;
|
||||
|
||||
namespace android {
|
||||
@@ -43,11 +41,10 @@ class EGLNativeWindowSurface;
|
||||
class BootAnimation : public Thread
|
||||
{
|
||||
public:
|
||||
BootAnimation(const sp<ISurfaceComposer>& composer);
|
||||
BootAnimation();
|
||||
virtual ~BootAnimation();
|
||||
|
||||
const sp<SurfaceComposerClient>& session() const;
|
||||
virtual void requestExit();
|
||||
|
||||
private:
|
||||
virtual bool threadLoop();
|
||||
@@ -73,7 +70,6 @@ private:
|
||||
EGLDisplay mSurface;
|
||||
sp<Surface> mFlingerSurface;
|
||||
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_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
|
||||
code to link against. -->
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ LOCAL_SRC_FILES:= \
|
||||
DisplayHardware/DisplayHardware.cpp \
|
||||
DisplayHardware/DisplayHardwareBase.cpp \
|
||||
GPUHardware/GPUHardware.cpp \
|
||||
BootAnimation.cpp \
|
||||
BlurFilter.cpp.arm \
|
||||
CPUGauge.cpp \
|
||||
Layer.cpp \
|
||||
|
||||
@@ -61,6 +61,13 @@
|
||||
#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
|
||||
|
||||
namespace android {
|
||||
@@ -184,7 +191,6 @@ SurfaceFlinger::SurfaceFlinger()
|
||||
mDebugCpu(0),
|
||||
mDebugFps(0),
|
||||
mDebugBackground(0),
|
||||
mDebugNoBootAnimation(0),
|
||||
mSyncObject(),
|
||||
mDeplayedTransactionPending(0),
|
||||
mConsoleSignals(0),
|
||||
@@ -207,14 +213,11 @@ void SurfaceFlinger::init()
|
||||
mDebugBackground = atoi(value);
|
||||
property_get("debug.sf.showfps", value, "0");
|
||||
mDebugFps = atoi(value);
|
||||
property_get("debug.sf.nobootanimation", value, "0");
|
||||
mDebugNoBootAnimation = atoi(value);
|
||||
|
||||
LOGI_IF(mDebugRegion, "showupdates enabled");
|
||||
LOGI_IF(mDebugCpu, "showcpu enabled");
|
||||
LOGI_IF(mDebugBackground, "showbackground enabled");
|
||||
LOGI_IF(mDebugFps, "showfps enabled");
|
||||
LOGI_IF(mDebugNoBootAnimation, "boot animation disabled");
|
||||
}
|
||||
|
||||
SurfaceFlinger::~SurfaceFlinger()
|
||||
@@ -324,11 +327,8 @@ void SurfaceFlinger::bootFinished()
|
||||
{
|
||||
const nsecs_t now = systemTime();
|
||||
const nsecs_t duration = now - mBootTime;
|
||||
LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
|
||||
if (mBootAnimation != 0) {
|
||||
mBootAnimation->requestExit();
|
||||
mBootAnimation.clear();
|
||||
}
|
||||
LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
|
||||
property_set("ctl.stop", "bootanim");
|
||||
}
|
||||
|
||||
void SurfaceFlinger::onFirstRef()
|
||||
@@ -456,10 +456,10 @@ status_t SurfaceFlinger::readyToRun()
|
||||
if (mDebugCpu)
|
||||
mCpuGauge = new CPUGauge(this, ms2ns(500));
|
||||
|
||||
// the boot animation!
|
||||
if (mDebugNoBootAnimation == false)
|
||||
mBootAnimation = new BootAnimation(this);
|
||||
|
||||
|
||||
// start boot animation
|
||||
property_set("ctl.start", "bootanim");
|
||||
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
@@ -1543,13 +1543,13 @@ status_t SurfaceFlinger::onTransact(
|
||||
// codes that require permission check
|
||||
IPCThreadState* ipc = IPCThreadState::self();
|
||||
const int pid = ipc->getCallingPid();
|
||||
const int uid = ipc->getCallingUid();
|
||||
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
|
||||
if (!checkCallingPermission(
|
||||
String16("android.permission.ACCESS_SURFACE_FLINGER")))
|
||||
{
|
||||
const int uid = ipc->getCallingUid();
|
||||
LOGE("Permission Denial: "
|
||||
"can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
|
||||
return PERMISSION_DENIED;
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
#include <private/ui/SurfaceFlingerSynchro.h>
|
||||
|
||||
#include "Barrier.h"
|
||||
#include "BootAnimation.h"
|
||||
#include "CPUGauge.h"
|
||||
#include "Layer.h"
|
||||
#include "Tokenizer.h"
|
||||
@@ -347,7 +346,6 @@ private:
|
||||
sp<SurfaceHeapManager> mSurfaceHeapManager;
|
||||
sp<GPUHardwareInterface> mGPU;
|
||||
GLuint mWormholeTexName;
|
||||
sp<BootAnimation> mBootAnimation;
|
||||
nsecs_t mBootTime;
|
||||
|
||||
// Can only accessed from the main thread, these members
|
||||
@@ -374,7 +372,6 @@ private:
|
||||
int mDebugCpu;
|
||||
int mDebugFps;
|
||||
int mDebugBackground;
|
||||
int mDebugNoBootAnimation;
|
||||
|
||||
// these are thread safe
|
||||
mutable Barrier mReadyToRunBarrier;
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
#include <utils/MemoryHeapPmem.h>
|
||||
#include <utils/MemoryHeapBase.h>
|
||||
|
||||
#include <EGL/eglnatives.h>
|
||||
|
||||
#include "GPUHardware/GPUHardware.h"
|
||||
#include "SurfaceFlinger.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 UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
|
||||
|
||||
@@ -136,13 +143,13 @@ status_t BnSurfaceFlingerClient::onTransact(
|
||||
|
||||
IPCThreadState* ipc = IPCThreadState::self();
|
||||
const int pid = ipc->getCallingPid();
|
||||
const int self_pid = getpid();
|
||||
if (UNLIKELY(pid != self_pid)) {
|
||||
const int uid = ipc->getCallingUid();
|
||||
const int self_pid = getpid();
|
||||
if (UNLIKELY(pid != self_pid && uid != AID_GRAPHICS)) {
|
||||
// we're called from a different process, do the real check
|
||||
if (!checkCallingPermission(
|
||||
String16("android.permission.ACCESS_SURFACE_FLINGER")))
|
||||
{
|
||||
const int uid = ipc->getCallingUid();
|
||||
LOGE("Permission Denial: "
|
||||
"can't openGlobalTransaction pid=%d, uid=%d", pid, uid);
|
||||
return PERMISSION_DENIED;
|
||||
|
||||
Reference in New Issue
Block a user