am f5f7d389: am fae5cb2b: optimize Surface.readFromParcel()
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 838ef22..06fa84b 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#define LOG_TAG "Surface"
+
#include <stdio.h>
#include "android_util_Binder.h"
@@ -226,8 +228,9 @@
doThrow(env, "java/lang/NullPointerException", NULL);
return;
}
- sp<Surface> rhs = new Surface(*parcel);
- setSurface(env, clazz, rhs);
+
+ sp<Surface> sur(Surface::readFromParcel(*parcel, 0));
+ setSurface(env, clazz, sur);
}
static jint Surface_getIdentity(JNIEnv* env, jobject clazz)
@@ -586,7 +589,7 @@
* a Surface and is necessary for returning the Surface reference to
* the caller. At this point, we should only have a SurfaceControl.
*/
-
+
const sp<SurfaceControl>& surface = getSurfaceControl(env, clazz);
const sp<SurfaceControl>& rhs = getSurfaceControl(env, other);
if (!SurfaceControl::isSameSurface(surface, rhs)) {
@@ -605,13 +608,9 @@
return;
}
- const sp<Surface>& control(getSurface(env, clazz));
- sp<Surface> rhs = new Surface(*parcel);
- if (!Surface::isSameSurface(control, rhs)) {
- // we reassign the surface only if it's a different one
- // otherwise we would loose our client-side state.
- setSurface(env, clazz, rhs);
- }
+ const sp<Surface>& curr(getSurface(env, clazz));
+ sp<Surface> sur(Surface::readFromParcel(*parcel, curr));
+ setSurface(env, clazz, sur);
}
static void Surface_writeToParcel(
diff --git a/include/surfaceflinger/Surface.h b/include/surfaceflinger/Surface.h
index 67dc693..ac01ce5 100644
--- a/include/surfaceflinger/Surface.h
+++ b/include/surfaceflinger/Surface.h
@@ -145,15 +145,13 @@
uint32_t reserved[2];
};
- Surface(const Parcel& data);
+ static sp<Surface> readFromParcel(
+ const Parcel& data, const sp<Surface>& other);
static bool isValid(const sp<Surface>& surface) {
return (surface != 0) && surface->isValid();
}
- static bool isSameSurface(
- const sp<Surface>& lhs, const sp<Surface>& rhs);
-
bool isValid();
SurfaceID ID() const { return mToken; }
uint32_t getFlags() const { return mFlags; }
@@ -191,6 +189,7 @@
Surface(const Surface& rhs);
Surface(const sp<SurfaceControl>& control);
+ Surface(const Parcel& data, const sp<IBinder>& ref);
~Surface();
diff --git a/libs/surfaceflinger_client/Surface.cpp b/libs/surfaceflinger_client/Surface.cpp
index 01420fe..6fe4c4a 100644
--- a/libs/surfaceflinger_client/Surface.cpp
+++ b/libs/surfaceflinger_client/Surface.cpp
@@ -334,13 +334,13 @@
init();
}
-Surface::Surface(const Parcel& parcel)
+Surface::Surface(const Parcel& parcel, const sp<IBinder>& ref)
: mBufferMapper(GraphicBufferMapper::get()),
mClient(SurfaceClient::getInstance()),
mSharedBufferClient(NULL),
mInitCheck(NO_INIT)
{
- mSurface = interface_cast<ISurface>(parcel.readStrongBinder());
+ mSurface = interface_cast<ISurface>(ref);
mIdentity = parcel.readInt32();
mWidth = parcel.readInt32();
mHeight = parcel.readInt32();
@@ -349,6 +349,17 @@
init();
}
+sp<Surface> Surface::readFromParcel(
+ const Parcel& data, const sp<Surface>& other)
+{
+ sp<Surface> result(other);
+ sp<IBinder> binder(data.readStrongBinder());
+ if (other==0 || binder != other->mSurface->asBinder()) {
+ result = new Surface(data, binder);
+ }
+ return result;
+}
+
void Surface::init()
{
android_native_window_t::setSwapInterval = setSwapInterval;
@@ -443,12 +454,6 @@
return NO_ERROR;
}
-bool Surface::isSameSurface(const sp<Surface>& lhs, const sp<Surface>& rhs) {
- if (lhs == 0 || rhs == 0)
- return false;
- return lhs->mSurface->asBinder() == rhs->mSurface->asBinder();
-}
-
sp<ISurface> Surface::getISurface() const {
return mSurface;
}