Created
December 16, 2011 09:19
-
-
Save drewis/1485274 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 one " | |
+ "buffer\n"); | |
+ if (eglWorkAround) { | |
+ if (sleepTimeouts++ < MAX_SLEEPTIMEOUTS) { | |
+ LOGD("SurfaceTexture::dequeue: Not allowed to dequeue more " | |
+ "than one buffer SLEEPING\n"); | |
+ usleep(100000); | |
+ } else { | |
+ mClientBufferCount = mServerBufferCount; | |
+ LOGD("SurfaceTexture::dequeue: Not allowed to dequeue more " | |
+ "than one 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 += \ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment