summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/HardwareRenderer.java12
-rw-r--r--core/java/android/view/Surface.java31
-rw-r--r--include/surfaceflinger/ISurfaceComposer.h1
-rw-r--r--services/java/com/android/server/WindowManagerService.java8
-rw-r--r--services/surfaceflinger/Layer.cpp3
5 files changed, 38 insertions, 17 deletions
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 69bdef0..0247f6a 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -216,9 +216,11 @@ public abstract class HardwareRenderer {
/**
* Return a string for the EGL error code, or the hex representation
- * if an unknown error.
- * @param error EGL error.
- * @return Error string.
+ * if the error is unknown.
+ *
+ * @param error The EGL error to convert into a String.
+ *
+ * @return An error string correponding to the EGL error code.
*/
static String getEGLErrorString(int error) {
switch (error) {
@@ -446,11 +448,9 @@ public abstract class HardwareRenderer {
}
/**
- * Defines the EGL configuration for this renderer. The default configuration
- * is RGBX, no depth, no stencil.
+ * Defines the EGL configuration for this renderer.
*
* @return An {@link android.view.HardwareRenderer.GlRenderer.EglConfigChooser}.
- * @param glVersion
*/
EglConfigChooser getConfigChooser(int glVersion) {
return new ComponentSizeChooser(glVersion, 8, 8, 8, 8, 0, 0);
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index cd0ae3b..d596a7f 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -86,6 +86,15 @@ public class Surface implements Parcelable {
* play back.
*/
public static final int PUSH_BUFFERS = 0x00000200;
+ /**
+ * Indicates that the surface must be considered opaque, even if its
+ * pixel format is set to translucent. This can be useful if an
+ * application needs full RGBA 8888 support for instance but will
+ * still draw every pixel opaque.
+ *
+ * @hide
+ */
+ public static final int OPAQUE = 0x00000400;
/** Creates a normal surface. This is the default */
public static final int FX_SURFACE_NORMAL = 0x00000000;
@@ -269,7 +278,7 @@ public class Surface implements Parcelable {
}
mOrigMatrix.set(m);
}
- };
+ }
/**
* Sets the display metrics used to provide canva's width/height in compatibility mode.
@@ -422,16 +431,20 @@ public class Surface implements Parcelable {
/* no user serviceable parts here ... */
@Override
protected void finalize() throws Throwable {
- if (mNativeSurface != 0 || mSurfaceControl != 0) {
- if (DEBUG_RELEASE) {
- Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
- + mNativeSurface + ", " + mSurfaceControl + ")", mCreationStack);
- } else {
- Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
- + mNativeSurface + ", " + mSurfaceControl + ")");
+ try {
+ super.finalize();
+ } finally {
+ if (mNativeSurface != 0 || mSurfaceControl != 0) {
+ if (DEBUG_RELEASE) {
+ Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
+ + mNativeSurface + ", " + mSurfaceControl + ")", mCreationStack);
+ } else {
+ Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
+ + mNativeSurface + ", " + mSurfaceControl + ")");
+ }
}
+ release();
}
- release();
}
private native void init(SurfaceSession s,
diff --git a/include/surfaceflinger/ISurfaceComposer.h b/include/surfaceflinger/ISurfaceComposer.h
index 6533600..b181781 100644
--- a/include/surfaceflinger/ISurfaceComposer.h
+++ b/include/surfaceflinger/ISurfaceComposer.h
@@ -43,6 +43,7 @@ public:
eSecure = 0x00000080,
eNonPremultiplied = 0x00000100,
ePushBuffers = 0x00000200,
+ eOpaque = 0x00000400,
eFXSurfaceNormal = 0x00000000,
eFXSurfaceBlur = 0x00010000,
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 8be980f..92c5cc8 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -6832,10 +6832,16 @@ public class WindowManagerService extends IWindowManager.Stub
mSurfaceW = w;
mSurfaceH = h;
try {
+ final boolean isHwAccelerated = (mAttrs.flags &
+ WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;
+ final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : mAttrs.format;
+ if (isHwAccelerated && mAttrs.format == PixelFormat.OPAQUE) {
+ flags |= Surface.OPAQUE;
+ }
mSurface = new Surface(
mSession.mSurfaceSession, mSession.mPid,
mAttrs.getTitle().toString(),
- 0, w, h, mAttrs.format, flags);
+ 0, w, h, format, flags);
if (SHOW_TRANSACTIONS) Slog.i(TAG, " CREATE SURFACE "
+ mSurface + " IN SESSION "
+ mSession.mSurfaceSession
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index fb76720..1b06843 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -171,7 +171,8 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h,
mReqHeight = h;
mSecure = (flags & ISurfaceComposer::eSecure) ? true : false;
- mNeedsBlending = (info.h_alpha - info.l_alpha) > 0;
+ mNeedsBlending = (info.h_alpha - info.l_alpha) > 0 &&
+ (flags & ISurfaceComposer::eOpaque) == 0;
// we use the red index
int displayRedSize = displayInfo.getSize(PixelFormatInfo::INDEX_RED);