am ac66d4a8: Merge "Use new surface flinger API." into jb-mr1-dev
* commit 'ac66d4a8d653331a03c27d5444467fd943503c9b': Use new surface flinger API.
This commit is contained in:
@@ -38,6 +38,7 @@
|
|||||||
#include <ui/DisplayInfo.h>
|
#include <ui/DisplayInfo.h>
|
||||||
#include <ui/FramebufferNativeWindow.h>
|
#include <ui/FramebufferNativeWindow.h>
|
||||||
|
|
||||||
|
#include <gui/ISurfaceComposer.h>
|
||||||
#include <gui/Surface.h>
|
#include <gui/Surface.h>
|
||||||
#include <gui/SurfaceComposerClient.h>
|
#include <gui/SurfaceComposerClient.h>
|
||||||
|
|
||||||
@@ -216,14 +217,16 @@ status_t BootAnimation::initTexture(void* buffer, size_t len)
|
|||||||
status_t BootAnimation::readyToRun() {
|
status_t BootAnimation::readyToRun() {
|
||||||
mAssets.addDefaultAssets();
|
mAssets.addDefaultAssets();
|
||||||
|
|
||||||
|
sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(
|
||||||
|
ISurfaceComposer::eDisplayIdMain));
|
||||||
DisplayInfo dinfo;
|
DisplayInfo dinfo;
|
||||||
status_t status = SurfaceComposerClient::getDisplayInfo(0, &dinfo);
|
status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
|
||||||
if (status)
|
if (status)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// create the native surface
|
// create the native surface
|
||||||
sp<SurfaceControl> control = session()->createSurface(
|
sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"),
|
||||||
0, dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
|
dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
|
||||||
|
|
||||||
SurfaceComposerClient::openGlobalTransaction();
|
SurfaceComposerClient::openGlobalTransaction();
|
||||||
control->setLayer(0x40000000);
|
control->setLayer(0x40000000);
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include <binder/IMemory.h>
|
#include <binder/IMemory.h>
|
||||||
#include <gui/SurfaceComposerClient.h>
|
#include <gui/SurfaceComposerClient.h>
|
||||||
|
#include <gui/ISurfaceComposer.h>
|
||||||
|
|
||||||
#include <SkImageEncoder.h>
|
#include <SkImageEncoder.h>
|
||||||
#include <SkBitmap.h>
|
#include <SkBitmap.h>
|
||||||
@@ -33,15 +34,18 @@
|
|||||||
|
|
||||||
using namespace android;
|
using namespace android;
|
||||||
|
|
||||||
|
static uint32_t DEFAULT_DISPLAY_ID = ISurfaceComposer::eDisplayIdMain;
|
||||||
|
|
||||||
static void usage(const char* pname)
|
static void usage(const char* pname)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"usage: %s [-hp] [FILENAME]\n"
|
"usage: %s [-hp] [-d display-id] [FILENAME]\n"
|
||||||
" -h: this message\n"
|
" -h: this message\n"
|
||||||
" -p: save the file as a png.\n"
|
" -p: save the file as a png.\n"
|
||||||
|
" -d: specify the display id to capture, default %d.\n"
|
||||||
"If FILENAME ends with .png it will be saved as a png.\n"
|
"If FILENAME ends with .png it will be saved as a png.\n"
|
||||||
"If FILENAME is not given, the results will be printed to stdout.\n",
|
"If FILENAME is not given, the results will be printed to stdout.\n",
|
||||||
pname
|
pname, DEFAULT_DISPLAY_ID
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,12 +91,16 @@ int main(int argc, char** argv)
|
|||||||
{
|
{
|
||||||
const char* pname = argv[0];
|
const char* pname = argv[0];
|
||||||
bool png = false;
|
bool png = false;
|
||||||
|
int32_t displayId = DEFAULT_DISPLAY_ID;
|
||||||
int c;
|
int c;
|
||||||
while ((c = getopt(argc, argv, "ph")) != -1) {
|
while ((c = getopt(argc, argv, "phd:")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'p':
|
case 'p':
|
||||||
png = true;
|
png = true;
|
||||||
break;
|
break;
|
||||||
|
case 'd':
|
||||||
|
displayId = atoi(optarg);
|
||||||
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(pname);
|
usage(pname);
|
||||||
@@ -131,7 +139,8 @@ int main(int argc, char** argv)
|
|||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
|
|
||||||
ScreenshotClient screenshot;
|
ScreenshotClient screenshot;
|
||||||
if (screenshot.update() == NO_ERROR) {
|
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId);
|
||||||
|
if (display != NULL && screenshot.update(display) == NO_ERROR) {
|
||||||
base = screenshot.getPixels();
|
base = screenshot.getPixels();
|
||||||
w = screenshot.getWidth();
|
w = screenshot.getWidth();
|
||||||
h = screenshot.getHeight();
|
h = screenshot.getHeight();
|
||||||
|
|||||||
@@ -17,9 +17,15 @@
|
|||||||
package android.view;
|
package android.view;
|
||||||
|
|
||||||
import android.content.res.CompatibilityInfo.Translator;
|
import android.content.res.CompatibilityInfo.Translator;
|
||||||
import android.graphics.*;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Matrix;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.graphics.Region;
|
||||||
|
import android.graphics.SurfaceTexture;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
|
import android.os.Process;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
@@ -250,13 +256,20 @@ public class Surface implements Parcelable {
|
|||||||
public Surface(SurfaceSession s,
|
public Surface(SurfaceSession s,
|
||||||
int pid, String name, int layerStack, int w, int h, int format, int flags)
|
int pid, String name, int layerStack, int w, int h, int format, int flags)
|
||||||
throws OutOfResourcesException {
|
throws OutOfResourcesException {
|
||||||
|
// FIXME: remove pid and layerstack arguments
|
||||||
checkHeadless();
|
checkHeadless();
|
||||||
|
|
||||||
if (DEBUG_RELEASE) {
|
if (DEBUG_RELEASE) {
|
||||||
mCreationStack = new Exception();
|
mCreationStack = new Exception();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (name == null) {
|
||||||
|
name = "<pid " + Process.myPid() + ">";
|
||||||
|
}
|
||||||
|
|
||||||
mCanvas = new CompatibleCanvas();
|
mCanvas = new CompatibleCanvas();
|
||||||
init(s, pid, name, layerStack, w, h, format, flags);
|
init(s, name, w, h, format, flags);
|
||||||
|
setLayerStack(layerStack);
|
||||||
mName = name;
|
mName = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -496,8 +509,8 @@ public class Surface implements Parcelable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private native void init(SurfaceSession s,
|
private native void init(SurfaceSession s, String name,
|
||||||
int pid, String name, int layerStack, int w, int h, int format, int flags)
|
int w, int h, int format, int flags)
|
||||||
throws OutOfResourcesException;
|
throws OutOfResourcesException;
|
||||||
|
|
||||||
private native void init(Parcel source) throws OutOfResourcesException;
|
private native void init(Parcel source) throws OutOfResourcesException;
|
||||||
|
|||||||
@@ -24,26 +24,34 @@ package android.view;
|
|||||||
* {@hide}
|
* {@hide}
|
||||||
*/
|
*/
|
||||||
public class SurfaceSession {
|
public class SurfaceSession {
|
||||||
|
private int mClient;
|
||||||
|
|
||||||
|
private native void nativeInit();
|
||||||
|
private native void nativeDestroy();
|
||||||
|
private native void nativeKill();
|
||||||
|
|
||||||
/** Create a new connection with the surface flinger. */
|
/** Create a new connection with the surface flinger. */
|
||||||
public SurfaceSession() {
|
public SurfaceSession() {
|
||||||
init();
|
nativeInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Forcibly detach native resources associated with this object.
|
|
||||||
* Unlike destroy(), after this call any surfaces that were created
|
|
||||||
* from the session will no longer work. The session itself is destroyed.
|
|
||||||
*/
|
|
||||||
public native void kill();
|
|
||||||
|
|
||||||
/* no user serviceable parts here ... */
|
/* no user serviceable parts here ... */
|
||||||
@Override
|
@Override
|
||||||
protected void finalize() throws Throwable {
|
protected void finalize() throws Throwable {
|
||||||
destroy();
|
try {
|
||||||
|
nativeDestroy();
|
||||||
|
} finally {
|
||||||
|
super.finalize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forcibly detach native resources associated with this object.
|
||||||
|
* Unlike destroy(), after this call any surfaces that were created
|
||||||
|
* from the session will no longer work. The session itself is destroyed.
|
||||||
|
*/
|
||||||
|
public void kill() {
|
||||||
|
nativeKill();
|
||||||
}
|
}
|
||||||
|
|
||||||
private native void init();
|
|
||||||
private native void destroy();
|
|
||||||
|
|
||||||
private int mClient;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include <binder/IMemory.h>
|
#include <binder/IMemory.h>
|
||||||
|
|
||||||
|
#include <gui/ISurfaceComposer.h>
|
||||||
#include <gui/Surface.h>
|
#include <gui/Surface.h>
|
||||||
#include <gui/SurfaceComposerClient.h>
|
#include <gui/SurfaceComposerClient.h>
|
||||||
#include <gui/SurfaceTexture.h>
|
#include <gui/SurfaceTexture.h>
|
||||||
@@ -107,14 +108,14 @@ static no_t no;
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
static void SurfaceSession_init(JNIEnv* env, jobject clazz)
|
static void SurfaceSession_nativeInit(JNIEnv* env, jobject clazz)
|
||||||
{
|
{
|
||||||
sp<SurfaceComposerClient> client = new SurfaceComposerClient;
|
sp<SurfaceComposerClient> client = new SurfaceComposerClient;
|
||||||
client->incStrong(clazz);
|
client->incStrong(clazz);
|
||||||
env->SetIntField(clazz, sso.client, (int)client.get());
|
env->SetIntField(clazz, sso.client, (int)client.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SurfaceSession_destroy(JNIEnv* env, jobject clazz)
|
static void SurfaceSession_nativeDestroy(JNIEnv* env, jobject clazz)
|
||||||
{
|
{
|
||||||
SurfaceComposerClient* client =
|
SurfaceComposerClient* client =
|
||||||
(SurfaceComposerClient*)env->GetIntField(clazz, sso.client);
|
(SurfaceComposerClient*)env->GetIntField(clazz, sso.client);
|
||||||
@@ -124,7 +125,7 @@ static void SurfaceSession_destroy(JNIEnv* env, jobject clazz)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SurfaceSession_kill(JNIEnv* env, jobject clazz)
|
static void SurfaceSession_nativeKill(JNIEnv* env, jobject clazz)
|
||||||
{
|
{
|
||||||
SurfaceComposerClient* client =
|
SurfaceComposerClient* client =
|
||||||
(SurfaceComposerClient*)env->GetIntField(clazz, sso.client);
|
(SurfaceComposerClient*)env->GetIntField(clazz, sso.client);
|
||||||
@@ -221,7 +222,7 @@ void setSurface(JNIEnv* env, jobject clazz, const sp<Surface>& surface)
|
|||||||
static void Surface_init(
|
static void Surface_init(
|
||||||
JNIEnv* env, jobject clazz,
|
JNIEnv* env, jobject clazz,
|
||||||
jobject session,
|
jobject session,
|
||||||
jint, jstring jname, jint layerStack, jint w, jint h, jint format, jint flags)
|
jstring jname, jint w, jint h, jint format, jint flags)
|
||||||
{
|
{
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
doThrowNPE(env);
|
doThrowNPE(env);
|
||||||
@@ -231,15 +232,10 @@ static void Surface_init(
|
|||||||
SurfaceComposerClient* client =
|
SurfaceComposerClient* client =
|
||||||
(SurfaceComposerClient*)env->GetIntField(session, sso.client);
|
(SurfaceComposerClient*)env->GetIntField(session, sso.client);
|
||||||
|
|
||||||
sp<SurfaceControl> surface;
|
const jchar* str = env->GetStringCritical(jname, 0);
|
||||||
if (jname == NULL) {
|
const String8 name(str, env->GetStringLength(jname));
|
||||||
surface = client->createSurface(layerStack, w, h, format, flags);
|
env->ReleaseStringCritical(jname, str);
|
||||||
} else {
|
sp<SurfaceControl> surface = client->createSurface(name, w, h, format, flags);
|
||||||
const jchar* str = env->GetStringCritical(jname, 0);
|
|
||||||
const String8 name(str, env->GetStringLength(jname));
|
|
||||||
env->ReleaseStringCritical(jname, str);
|
|
||||||
surface = client->createSurface(name, layerStack, w, h, format, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (surface == 0) {
|
if (surface == 0) {
|
||||||
jniThrowException(env, OutOfResourcesException, NULL);
|
jniThrowException(env, OutOfResourcesException, NULL);
|
||||||
@@ -473,12 +469,11 @@ static void Surface_closeTransaction(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void Surface_setOrientation(
|
static void Surface_setOrientation(
|
||||||
JNIEnv* env, jobject clazz, jint display, jint orientation)
|
JNIEnv* env, jobject clazz, jint, jint orientation)
|
||||||
{
|
{
|
||||||
int err = SurfaceComposerClient::setOrientation(display, orientation, 0);
|
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(
|
||||||
if (err < 0) {
|
ISurfaceComposer::eDisplayIdMain);
|
||||||
doThrowIAE(env);
|
SurfaceComposerClient::setDisplayOrientation(display, orientation);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ScreenshotPixelRef : public SkPixelRef {
|
class ScreenshotPixelRef : public SkPixelRef {
|
||||||
@@ -492,12 +487,13 @@ public:
|
|||||||
SkSafeUnref(fCTable);
|
SkSafeUnref(fCTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t update(int width, int height, int minLayer, int maxLayer, bool allLayers) {
|
status_t update(const sp<IBinder>& display, int width, int height,
|
||||||
|
int minLayer, int maxLayer, bool allLayers) {
|
||||||
status_t res = (width > 0 && height > 0)
|
status_t res = (width > 0 && height > 0)
|
||||||
? (allLayers
|
? (allLayers
|
||||||
? mScreenshot.update(width, height)
|
? mScreenshot.update(display, width, height)
|
||||||
: mScreenshot.update(width, height, minLayer, maxLayer))
|
: mScreenshot.update(display, width, height, minLayer, maxLayer))
|
||||||
: mScreenshot.update();
|
: mScreenshot.update(display);
|
||||||
if (res != NO_ERROR) {
|
if (res != NO_ERROR) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -538,11 +534,15 @@ private:
|
|||||||
typedef SkPixelRef INHERITED;
|
typedef SkPixelRef INHERITED;
|
||||||
};
|
};
|
||||||
|
|
||||||
static jobject doScreenshot(JNIEnv* env, jobject clazz, jint width, jint height,
|
static jobject doScreenshot(JNIEnv* env, jobject clazz,
|
||||||
|
jint width, jint height,
|
||||||
jint minLayer, jint maxLayer, bool allLayers)
|
jint minLayer, jint maxLayer, bool allLayers)
|
||||||
{
|
{
|
||||||
|
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(
|
||||||
|
ISurfaceComposer::eDisplayIdMain);
|
||||||
ScreenshotPixelRef* pixels = new ScreenshotPixelRef(NULL);
|
ScreenshotPixelRef* pixels = new ScreenshotPixelRef(NULL);
|
||||||
if (pixels->update(width, height, minLayer, maxLayer, allLayers) != NO_ERROR) {
|
if (pixels->update(display, width, height,
|
||||||
|
minLayer, maxLayer, allLayers) != NO_ERROR) {
|
||||||
delete pixels;
|
delete pixels;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -721,8 +721,10 @@ static void Surface_setLayerStack(JNIEnv* env, jobject thiz, jint layerStack)
|
|||||||
{
|
{
|
||||||
const sp<SurfaceControl>& surface(getSurfaceControl(env, thiz));
|
const sp<SurfaceControl>& surface(getSurfaceControl(env, thiz));
|
||||||
if (surface == 0) return;
|
if (surface == 0) return;
|
||||||
|
status_t err = surface->setLayerStack(layerStack);
|
||||||
// TODO(mathias): Everything.
|
if (err<0 && err!=NO_INIT) {
|
||||||
|
doThrowIAE(env);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -826,14 +828,14 @@ static void Surface_writeToParcel(
|
|||||||
static void nativeClassInit(JNIEnv* env, jclass clazz);
|
static void nativeClassInit(JNIEnv* env, jclass clazz);
|
||||||
|
|
||||||
static JNINativeMethod gSurfaceSessionMethods[] = {
|
static JNINativeMethod gSurfaceSessionMethods[] = {
|
||||||
{"init", "()V", (void*)SurfaceSession_init },
|
{"nativeInit", "()V", (void*)SurfaceSession_nativeInit },
|
||||||
{"destroy", "()V", (void*)SurfaceSession_destroy },
|
{"nativeDestroy", "()V", (void*)SurfaceSession_nativeDestroy },
|
||||||
{"kill", "()V", (void*)SurfaceSession_kill },
|
{"nativeKill", "()V", (void*)SurfaceSession_nativeKill },
|
||||||
};
|
};
|
||||||
|
|
||||||
static JNINativeMethod gSurfaceMethods[] = {
|
static JNINativeMethod gSurfaceMethods[] = {
|
||||||
{"nativeClassInit", "()V", (void*)nativeClassInit },
|
{"nativeClassInit", "()V", (void*)nativeClassInit },
|
||||||
{"init", "(Landroid/view/SurfaceSession;ILjava/lang/String;IIIII)V", (void*)Surface_init },
|
{"init", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIII)V", (void*)Surface_init },
|
||||||
{"init", "(Landroid/os/Parcel;)V", (void*)Surface_initParcel },
|
{"init", "(Landroid/os/Parcel;)V", (void*)Surface_initParcel },
|
||||||
{"initFromSurfaceTexture", "(Landroid/graphics/SurfaceTexture;)V", (void*)Surface_initFromSurfaceTexture },
|
{"initFromSurfaceTexture", "(Landroid/graphics/SurfaceTexture;)V", (void*)Surface_initFromSurfaceTexture },
|
||||||
{"getIdentity", "()I", (void*)Surface_getIdentity },
|
{"getIdentity", "()I", (void*)Surface_getIdentity },
|
||||||
|
|||||||
@@ -369,7 +369,7 @@ sp<SurfaceControl> SpriteController::obtainSurface(int32_t width, int32_t height
|
|||||||
ensureSurfaceComposerClient();
|
ensureSurfaceComposerClient();
|
||||||
|
|
||||||
sp<SurfaceControl> surfaceControl = mSurfaceComposerClient->createSurface(
|
sp<SurfaceControl> surfaceControl = mSurfaceComposerClient->createSurface(
|
||||||
String8("Sprite"), 0, width, height, PIXEL_FORMAT_RGBA_8888);
|
String8("Sprite"), width, height, PIXEL_FORMAT_RGBA_8888);
|
||||||
if (surfaceControl == NULL || !surfaceControl->isValid()
|
if (surfaceControl == NULL || !surfaceControl->isValid()
|
||||||
|| !surfaceControl->getSurface()->isValid()) {
|
|| !surfaceControl->getSurface()->isValid()) {
|
||||||
ALOGE("Error creating sprite surface.");
|
ALOGE("Error creating sprite surface.");
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "jni.h"
|
#include "jni.h"
|
||||||
#include <android_runtime/AndroidRuntime.h>
|
#include <android_runtime/AndroidRuntime.h>
|
||||||
|
|
||||||
|
#include <gui/ISurfaceComposer.h>
|
||||||
#include <gui/SurfaceComposerClient.h>
|
#include <gui/SurfaceComposerClient.h>
|
||||||
#include <ui/DisplayInfo.h>
|
#include <ui/DisplayInfo.h>
|
||||||
|
|
||||||
@@ -38,8 +39,11 @@ static struct {
|
|||||||
|
|
||||||
|
|
||||||
static void nativeGetDefaultDisplayDeviceInfo(JNIEnv* env, jclass clazz, jobject infoObj) {
|
static void nativeGetDefaultDisplayDeviceInfo(JNIEnv* env, jclass clazz, jobject infoObj) {
|
||||||
|
sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay(
|
||||||
|
ISurfaceComposer::eDisplayIdMain));
|
||||||
|
|
||||||
DisplayInfo info;
|
DisplayInfo info;
|
||||||
status_t err = SurfaceComposerClient::getDisplayInfo(0, &info);
|
status_t err = SurfaceComposerClient::getDisplayInfo(display, &info);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
jniThrowExceptionFmt(env, "java/lang/RuntimeException",
|
jniThrowExceptionFmt(env, "java/lang/RuntimeException",
|
||||||
"Could not get display info. err=%d", err);
|
"Could not get display info. err=%d", err);
|
||||||
|
|||||||
Reference in New Issue
Block a user