[Nexus One Android Development] rapmv78:
Here is the source patch.

diff --git a/frameworks/base/libs/gui/SurfaceTexture.cpp b/frameworks/base/libs/gui/SurfaceTexture.cpp

index c72a45b..9e425e3 100644

--- a/libs/gui/SurfaceTexture.cpp

+++ b/libs/gui/SurfaceTexture.cpp

@@ -246,6 +246,8 @@ status_t SurfaceTexture::requestBuffer(int slot, sp<GraphicBuffer>* buf) {

return NO_ERROR;

}

+#define MAX_SLEEPTIMEOUTS (5)

+

status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,

uint32_t format, uint32_t usage) {

ST_LOGV("SurfaceTexture::dequeueBuffer");

@@ -262,6 +264,9 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,

int found, foundSync;

int dequeuedCount = 0;

bool tryAgain = true;

+ int sleepTimeouts = 0;

+ bool eglWorkAround = true;

+

while (tryAgain) {

if (mAbandoned) {

ST_LOGE("dequeueBuffer: SurfaceTexture has been abandoned!");

@@ -342,6 +347,21 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,

// clients are not allowed to dequeue more than one buffer

// if they didn't set a buffer count.

if (!mClientBufferCount && dequeuedCount) {

+ LOGV("SurfaceTexture::dequeue: Not allowed to dequeue more than a "

+ "buffer\n");

+ if (eglWorkAround) {

+ if (sleepTimeouts++ < MAX_SLEEPTIMEOUTS) {

+ LOGD("SurfaceTexture::dequeue: Not allowed to dequeue more "

+ "than a buffer SLEEPING\n");

+ usleep(100000);

+ } else {

+ mClientBufferCount = mServerBufferCount;

+ LOGD("SurfaceTexture::dequeue: Not allowed to dequeue more "

+ "than a buffer RETRY mBufferCount:%d mServerBufferCount:%d\n",

+ mBufferCount, mServerBufferCount);

+ }

+ continue;

+ }

return -EINVAL;

}

@@ -353,6 +373,13 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,

// than allowed.

const int avail = mBufferCount - (dequeuedCount+1);

if (avail < (MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode))) {

+ if (eglWorkAround && mClientBufferCount != 0) {

+ mBufferCount++;

+ mClientBufferCount = mServerBufferCount = mBufferCount;

+ LOGD("SurfaceTexture::dequeuebuffer: MIN EXCEEDED "

+ "mBuffer:%d bumped\n", mBufferCount);

+ continue;

+ }

ST_LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded "

"(dequeued=%d)",

MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode),

@@ -700,8 +727,8 @@ status_t SurfaceTexture::updateTexImage() {

ST_LOGW("updateTexImage: clearing GL error: %#04x", error);

}

- glBindTexture(mTexTarget, mTexName);

- glEGLImageTargetTexture2DOES(mTexTarget, (GLeglImageOES)image);

+ glBindTexture(getCurrentTextureTarget(), mTexName);

+ glEGLImageTargetTexture2DOES(getCurrentTextureTarget(), (GLeglImageOES)image);

bool failed = false;

while ((error = glGetError()) != GL_NO_ERROR) {

@@ -736,7 +763,7 @@ status_t SurfaceTexture::updateTexImage() {

mDequeueCondition.signal();

} else {

// We always bind the texture even if we don't update its contents.

- glBindTexture(mTexTarget, mTexName);

+ glBindTexture(getCurrentTextureTarget(), mTexName);

}

return OK;

@@ -762,6 +789,9 @@ bool SurfaceTexture::isExternalFormat(uint32_t format)

}

GLenum SurfaceTexture::getCurrentTextureTarget() const {

+ if (mTexTarget == GL_TEXTURE_EXTERNAL_OES) {

+ return GL_TEXTURE_2D;

+ }

return mTexTarget;

}

diff --git a/frameworks/base/services/surfaceflinger/Layer.cpp b/frameworks/base/services/surfaceflinger/Layer.cpp

index 317cc3b..9e92e81 100644

--- a/services/surfaceflinger/Layer.cpp

+++ b/services/surfaceflinger/Layer.cpp

@@ -40,6 +40,8 @@

#include "SurfaceTextureLayer.h"

#define DEBUG_RESIZE 0

+#define GL_TEXTURE_EXTERNAL_OES GL_TEXTURE_2D

+

namespace android {

diff --git a/device/htc/passion-common/BoardConfigCommon.mk b/device/htc/passion-common/BoardConfigCommon.mk

index b86c580..e17da36 100644

--- a/BoardConfigCommon.mk

+++ b/BoardConfigCommon.mk

@@ -73,7 +73,7 @@ BOARD_VENDOR_USE_AKMD := akm8973

## Hardware rendering

## doesn't actually work until we have hwcomposer

-USE_OPENGL_RENDERER := true

+USE_OPENGL_RENDERER := false

BOARD_EGL_CFG := device/htc/passion-common/egl.cfg

## for rmcc egl hack

COMMON_GLOBAL_CFLAGS += \

On Media fire:

http://www.mediafire.com/?dxzyyfzzp9m6fu8

It works with OPENGL_RENDERER := true as well, but is quite slow and crashes often, with OPENGL_RENDERER := false things are much more stable and usable as is the ROM posted above.

Thanks.