am ac66d4a8: Merge "Use new surface flinger API." into jb-mr1-dev

* commit 'ac66d4a8d653331a03c27d5444467fd943503c9b':
  Use new surface flinger API.
This commit is contained in:
Jeff Brown
2012-08-27 17:17:42 -07:00
committed by Android Git Automerger
7 changed files with 95 additions and 56 deletions

View File

@@ -38,6 +38,7 @@
#include <ui/DisplayInfo.h>
#include <ui/FramebufferNativeWindow.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
@@ -216,14 +217,16 @@ status_t BootAnimation::initTexture(void* buffer, size_t len)
status_t BootAnimation::readyToRun() {
mAssets.addDefaultAssets();
sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(
ISurfaceComposer::eDisplayIdMain));
DisplayInfo dinfo;
status_t status = SurfaceComposerClient::getDisplayInfo(0, &dinfo);
status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
if (status)
return -1;
// create the native surface
sp<SurfaceControl> control = session()->createSurface(
0, dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"),
dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
SurfaceComposerClient::openGlobalTransaction();
control->setLayer(0x40000000);

View File

@@ -25,6 +25,7 @@
#include <binder/IMemory.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/ISurfaceComposer.h>
#include <SkImageEncoder.h>
#include <SkBitmap.h>
@@ -33,15 +34,18 @@
using namespace android;
static uint32_t DEFAULT_DISPLAY_ID = ISurfaceComposer::eDisplayIdMain;
static void usage(const char* pname)
{
fprintf(stderr,
"usage: %s [-hp] [FILENAME]\n"
"usage: %s [-hp] [-d display-id] [FILENAME]\n"
" -h: this message\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 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];
bool png = false;
int32_t displayId = DEFAULT_DISPLAY_ID;
int c;
while ((c = getopt(argc, argv, "ph")) != -1) {
while ((c = getopt(argc, argv, "phd:")) != -1) {
switch (c) {
case 'p':
png = true;
break;
case 'd':
displayId = atoi(optarg);
break;
case '?':
case 'h':
usage(pname);
@@ -131,7 +139,8 @@ int main(int argc, char** argv)
size_t size = 0;
ScreenshotClient screenshot;
if (screenshot.update() == NO_ERROR) {
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId);
if (display != NULL && screenshot.update(display) == NO_ERROR) {
base = screenshot.getPixels();
w = screenshot.getWidth();
h = screenshot.getHeight();

View File

@@ -17,9 +17,15 @@
package android.view;
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.Parcel;
import android.os.Process;
import android.os.SystemProperties;
import android.util.Log;
@@ -250,13 +256,20 @@ public class Surface implements Parcelable {
public Surface(SurfaceSession s,
int pid, String name, int layerStack, int w, int h, int format, int flags)
throws OutOfResourcesException {
// FIXME: remove pid and layerstack arguments
checkHeadless();
if (DEBUG_RELEASE) {
mCreationStack = new Exception();
}
if (name == null) {
name = "<pid " + Process.myPid() + ">";
}
mCanvas = new CompatibleCanvas();
init(s, pid, name, layerStack, w, h, format, flags);
init(s, name, w, h, format, flags);
setLayerStack(layerStack);
mName = name;
}
@@ -496,8 +509,8 @@ public class Surface implements Parcelable {
}
}
private native void init(SurfaceSession s,
int pid, String name, int layerStack, int w, int h, int format, int flags)
private native void init(SurfaceSession s, String name,
int w, int h, int format, int flags)
throws OutOfResourcesException;
private native void init(Parcel source) throws OutOfResourcesException;

View File

@@ -24,26 +24,34 @@ package android.view;
* {@hide}
*/
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. */
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 ... */
@Override
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;
}

View File

@@ -23,6 +23,7 @@
#include <binder/IMemory.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.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;
client->incStrong(clazz);
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*)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*)env->GetIntField(clazz, sso.client);
@@ -221,7 +222,7 @@ void setSurface(JNIEnv* env, jobject clazz, const sp<Surface>& surface)
static void Surface_init(
JNIEnv* env, jobject clazz,
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) {
doThrowNPE(env);
@@ -231,15 +232,10 @@ static void Surface_init(
SurfaceComposerClient* client =
(SurfaceComposerClient*)env->GetIntField(session, sso.client);
sp<SurfaceControl> surface;
if (jname == NULL) {
surface = client->createSurface(layerStack, w, h, format, flags);
} else {
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);
}
const jchar* str = env->GetStringCritical(jname, 0);
const String8 name(str, env->GetStringLength(jname));
env->ReleaseStringCritical(jname, str);
sp<SurfaceControl> surface = client->createSurface(name, w, h, format, flags);
if (surface == 0) {
jniThrowException(env, OutOfResourcesException, NULL);
@@ -473,12 +469,11 @@ static void Surface_closeTransaction(
}
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);
if (err < 0) {
doThrowIAE(env);
}
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(
ISurfaceComposer::eDisplayIdMain);
SurfaceComposerClient::setDisplayOrientation(display, orientation);
}
class ScreenshotPixelRef : public SkPixelRef {
@@ -492,12 +487,13 @@ public:
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)
? (allLayers
? mScreenshot.update(width, height)
: mScreenshot.update(width, height, minLayer, maxLayer))
: mScreenshot.update();
? mScreenshot.update(display, width, height)
: mScreenshot.update(display, width, height, minLayer, maxLayer))
: mScreenshot.update(display);
if (res != NO_ERROR) {
return res;
}
@@ -538,11 +534,15 @@ private:
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)
{
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(
ISurfaceComposer::eDisplayIdMain);
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;
return 0;
}
@@ -721,8 +721,10 @@ static void Surface_setLayerStack(JNIEnv* env, jobject thiz, jint layerStack)
{
const sp<SurfaceControl>& surface(getSurfaceControl(env, thiz));
if (surface == 0) return;
// TODO(mathias): Everything.
status_t err = surface->setLayerStack(layerStack);
if (err<0 && err!=NO_INIT) {
doThrowIAE(env);
}
}
// ----------------------------------------------------------------------------
@@ -826,14 +828,14 @@ static void Surface_writeToParcel(
static void nativeClassInit(JNIEnv* env, jclass clazz);
static JNINativeMethod gSurfaceSessionMethods[] = {
{"init", "()V", (void*)SurfaceSession_init },
{"destroy", "()V", (void*)SurfaceSession_destroy },
{"kill", "()V", (void*)SurfaceSession_kill },
{"nativeInit", "()V", (void*)SurfaceSession_nativeInit },
{"nativeDestroy", "()V", (void*)SurfaceSession_nativeDestroy },
{"nativeKill", "()V", (void*)SurfaceSession_nativeKill },
};
static JNINativeMethod gSurfaceMethods[] = {
{"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 },
{"initFromSurfaceTexture", "(Landroid/graphics/SurfaceTexture;)V", (void*)Surface_initFromSurfaceTexture },
{"getIdentity", "()I", (void*)Surface_getIdentity },

View File

@@ -369,7 +369,7 @@ sp<SurfaceControl> SpriteController::obtainSurface(int32_t width, int32_t height
ensureSurfaceComposerClient();
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()
|| !surfaceControl->getSurface()->isValid()) {
ALOGE("Error creating sprite surface.");

View File

@@ -20,6 +20,7 @@
#include "jni.h"
#include <android_runtime/AndroidRuntime.h>
#include <gui/ISurfaceComposer.h>
#include <gui/SurfaceComposerClient.h>
#include <ui/DisplayInfo.h>
@@ -38,8 +39,11 @@ static struct {
static void nativeGetDefaultDisplayDeviceInfo(JNIEnv* env, jclass clazz, jobject infoObj) {
sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay(
ISurfaceComposer::eDisplayIdMain));
DisplayInfo info;
status_t err = SurfaceComposerClient::getDisplayInfo(0, &info);
status_t err = SurfaceComposerClient::getDisplayInfo(display, &info);
if (err < 0) {
jniThrowExceptionFmt(env, "java/lang/RuntimeException",
"Could not get display info. err=%d", err);