Merge "SurfaceTexture: parameterize the texture target"
This commit is contained in:
commit
e3963a97ec
@ -20,6 +20,7 @@
|
||||
#include <EGL/egl.h>
|
||||
#include <EGL/eglext.h>
|
||||
#include <GLES2/gl2.h>
|
||||
#include <GLES2/gl2ext.h>
|
||||
|
||||
#include <gui/ISurfaceTexture.h>
|
||||
|
||||
@ -61,7 +62,8 @@ public:
|
||||
|
||||
// tex indicates the name OpenGL texture to which images are to be streamed.
|
||||
// This texture name cannot be changed once the SurfaceTexture is created.
|
||||
SurfaceTexture(GLuint tex, bool allowSynchronousMode = true);
|
||||
SurfaceTexture(GLuint tex, bool allowSynchronousMode = true,
|
||||
GLenum texTarget = GL_TEXTURE_EXTERNAL_OES);
|
||||
|
||||
virtual ~SurfaceTexture();
|
||||
|
||||
@ -458,6 +460,14 @@ private:
|
||||
// member variables are accessed.
|
||||
mutable Mutex mMutex;
|
||||
|
||||
// mTexTarget is the GL texture target with which the GL texture object is
|
||||
// associated. It is set in the constructor and never changed. It is
|
||||
// almost always GL_TEXTURE_EXTERNAL_OES except for one use case in Android
|
||||
// Browser. In that case it is set to GL_TEXTURE_2D to allow
|
||||
// glCopyTexSubImage to read from the texture. This is a hack to work
|
||||
// around a GL driver limitation on the number of FBO attachments, which the
|
||||
// browser's tile cache exceeds.
|
||||
const GLenum mTexTarget;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -94,7 +94,8 @@ static int32_t createProcessUniqueId() {
|
||||
return android_atomic_inc(&globalCounter);
|
||||
}
|
||||
|
||||
SurfaceTexture::SurfaceTexture(GLuint tex, bool allowSynchronousMode) :
|
||||
SurfaceTexture::SurfaceTexture(GLuint tex, bool allowSynchronousMode,
|
||||
GLenum texTarget) :
|
||||
mDefaultWidth(1),
|
||||
mDefaultHeight(1),
|
||||
mPixelFormat(PIXEL_FORMAT_RGBA_8888),
|
||||
@ -110,7 +111,8 @@ SurfaceTexture::SurfaceTexture(GLuint tex, bool allowSynchronousMode) :
|
||||
mSynchronousMode(false),
|
||||
mAllowSynchronousMode(allowSynchronousMode),
|
||||
mConnectedApi(NO_CONNECTED_API),
|
||||
mAbandoned(false) {
|
||||
mAbandoned(false),
|
||||
mTexTarget(texTarget) {
|
||||
// Choose a name using the PID and a process-unique ID.
|
||||
mName = String8::format("unnamed-%d-%d", getpid(), createProcessUniqueId());
|
||||
|
||||
@ -698,9 +700,8 @@ status_t SurfaceTexture::updateTexImage() {
|
||||
ST_LOGW("updateTexImage: clearing GL error: %#04x", error);
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTexName);
|
||||
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES,
|
||||
(GLeglImageOES)image);
|
||||
glBindTexture(mTexTarget, mTexName);
|
||||
glEGLImageTargetTexture2DOES(mTexTarget, (GLeglImageOES)image);
|
||||
|
||||
bool failed = false;
|
||||
while ((error = glGetError()) != GL_NO_ERROR) {
|
||||
@ -735,7 +736,7 @@ status_t SurfaceTexture::updateTexImage() {
|
||||
mDequeueCondition.signal();
|
||||
} else {
|
||||
// We always bind the texture even if we don't update its contents.
|
||||
glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTexName);
|
||||
glBindTexture(mTexTarget, mTexName);
|
||||
}
|
||||
|
||||
return OK;
|
||||
@ -761,7 +762,7 @@ bool SurfaceTexture::isExternalFormat(uint32_t format)
|
||||
}
|
||||
|
||||
GLenum SurfaceTexture::getCurrentTextureTarget() const {
|
||||
return GL_TEXTURE_EXTERNAL_OES;
|
||||
return mTexTarget;
|
||||
}
|
||||
|
||||
void SurfaceTexture::getTransformMatrix(float mtx[16]) {
|
||||
|
Loading…
Reference in New Issue
Block a user