Loading include/ui/GraphicBuffer.h +12 −2 Original line number Original line Diff line number Diff line Loading @@ -66,7 +66,11 @@ public: GraphicBuffer(); GraphicBuffer(); // creates w * h buffer // creates w * h buffer GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t ssage); GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t usage); // create a buffer from an existing handle GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t usage, uint32_t stride, native_handle_t* handle, bool keepOwnership); // return status // return status status_t initCheck() const; status_t initCheck() const; Loading Loading @@ -94,9 +98,15 @@ protected: GraphicBuffer(const Parcel& reply); GraphicBuffer(const Parcel& reply); virtual ~GraphicBuffer(); virtual ~GraphicBuffer(); enum { ownNone = 0, ownHandle = 1, ownData = 2, }; inline const GraphicBufferMapper& getBufferMapper() const { return mBufferMapper; } inline const GraphicBufferMapper& getBufferMapper() const { return mBufferMapper; } inline GraphicBufferMapper& getBufferMapper() { return mBufferMapper; } inline GraphicBufferMapper& getBufferMapper() { return mBufferMapper; } bool mOwner; uint8_t mOwner; private: private: friend class Surface; friend class Surface; Loading libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp +4 −0 Original line number Original line Diff line number Diff line Loading @@ -256,12 +256,16 @@ void DisplayHardware::init(uint32_t dpy) if (strstr(gl_extensions, "GL_OES_draw_texture")) { if (strstr(gl_extensions, "GL_OES_draw_texture")) { mFlags |= DRAW_TEXTURE_EXTENSION; mFlags |= DRAW_TEXTURE_EXTENSION; } } #ifdef EGL_ANDROID_image_native_buffer if (strstr( gl_extensions, "GL_OES_EGL_image") && if (strstr( gl_extensions, "GL_OES_EGL_image") && (strstr(egl_extensions, "EGL_KHR_image_base") || (strstr(egl_extensions, "EGL_KHR_image_base") || strstr(egl_extensions, "EGL_KHR_image")) && strstr(egl_extensions, "EGL_KHR_image")) && strstr(egl_extensions, "EGL_ANDROID_image_native_buffer")) { strstr(egl_extensions, "EGL_ANDROID_image_native_buffer")) { mFlags |= DIRECT_TEXTURE; mFlags |= DIRECT_TEXTURE; } } #else #warning "EGL_ANDROID_image_native_buffer not supported" #endif // Unbind the context from this thread // Unbind the context from this thread eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); Loading libs/surfaceflinger/Layer.cpp +6 −59 Original line number Original line Diff line number Diff line Loading @@ -130,62 +130,6 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h, return NO_ERROR; return NO_ERROR; } } status_t Layer::initializeEglImageLocked( const sp<GraphicBuffer>& buffer, Texture* texture) { status_t err = NO_ERROR; // we need to recreate the texture EGLDisplay dpy(mFlinger->graphicPlane(0).getEGLDisplay()); // free the previous image if (texture->image != EGL_NO_IMAGE_KHR) { eglDestroyImageKHR(dpy, texture->image); texture->image = EGL_NO_IMAGE_KHR; } // construct an EGL_NATIVE_BUFFER_ANDROID android_native_buffer_t* clientBuf = buffer->getNativeBuffer(); // create the new EGLImageKHR const EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE, EGL_NONE }; texture->image = eglCreateImageKHR( dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, (EGLClientBuffer)clientBuf, attrs); LOGE_IF(texture->image == EGL_NO_IMAGE_KHR, "eglCreateImageKHR() failed. err=0x%4x", eglGetError()); if (texture->image != EGL_NO_IMAGE_KHR) { glBindTexture(GL_TEXTURE_2D, texture->name); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)texture->image); GLint error = glGetError(); if (UNLIKELY(error != GL_NO_ERROR)) { // this failed, for instance, because we don't support NPOT. // FIXME: do something! LOGE("layer=%p, glEGLImageTargetTexture2DOES(%p) " "failed err=0x%04x", this, texture->image, error); mFlags &= ~DisplayHardware::DIRECT_TEXTURE; err = INVALID_OPERATION; } else { // Everything went okay! texture->NPOTAdjust = false; texture->dirty = false; texture->width = clientBuf->width; texture->height = clientBuf->height; } } else { err = INVALID_OPERATION; } return err; } void Layer::reloadTexture(const Region& dirty) void Layer::reloadTexture(const Region& dirty) { { Mutex::Autolock _l(mLock); Mutex::Autolock _l(mLock); Loading @@ -199,10 +143,11 @@ void Layer::reloadTexture(const Region& dirty) mTextures[index].height = 0; mTextures[index].height = 0; } } #ifdef EGL_ANDROID_image_native_buffer if (mFlags & DisplayHardware::DIRECT_TEXTURE) { if (mFlags & DisplayHardware::DIRECT_TEXTURE) { if (buffer->usage & GraphicBuffer::USAGE_HW_TEXTURE) { if (buffer->usage & GraphicBuffer::USAGE_HW_TEXTURE) { if (mTextures[index].dirty) { if (mTextures[index].dirty) { initializeEglImageLocked(buffer, &mTextures[index]); initializeEglImage(buffer, &mTextures[index]); } } } else { } else { if (mHybridBuffer==0 || (mHybridBuffer->width != buffer->width || if (mHybridBuffer==0 || (mHybridBuffer->width != buffer->width || Loading @@ -212,7 +157,7 @@ void Layer::reloadTexture(const Region& dirty) buffer->width, buffer->height, buffer->format, buffer->width, buffer->height, buffer->format, GraphicBuffer::USAGE_SW_WRITE_OFTEN | GraphicBuffer::USAGE_SW_WRITE_OFTEN | GraphicBuffer::USAGE_HW_TEXTURE); GraphicBuffer::USAGE_HW_TEXTURE); initializeEglImageLocked( initializeEglImage( mHybridBuffer, &mTextures[0]); mHybridBuffer, &mTextures[0]); } } Loading Loading @@ -279,7 +224,9 @@ void Layer::reloadTexture(const Region& dirty) buffer->unlock(); buffer->unlock(); } } } } } else { } else #endif { for (size_t i=0 ; i<NUM_BUFFERS ; i++) { for (size_t i=0 ; i<NUM_BUFFERS ; i++) { mTextures[i].image = EGL_NO_IMAGE_KHR; mTextures[i].image = EGL_NO_IMAGE_KHR; } } Loading libs/surfaceflinger/Layer.h +0 −2 Original line number Original line Diff line number Diff line Loading @@ -85,8 +85,6 @@ private: } } void reloadTexture(const Region& dirty); void reloadTexture(const Region& dirty); status_t initializeEglImageLocked( const sp<GraphicBuffer>& buffer, Texture* texture); uint32_t getEffectiveUsage(uint32_t usage) const; uint32_t getEffectiveUsage(uint32_t usage) const; Loading libs/surfaceflinger/LayerBase.cpp +57 −0 Original line number Original line Diff line number Diff line Loading @@ -617,6 +617,63 @@ void LayerBase::loadTexture(Texture* texture, } } } } status_t LayerBase::initializeEglImage( const sp<GraphicBuffer>& buffer, Texture* texture) { status_t err = NO_ERROR; // we need to recreate the texture EGLDisplay dpy(mFlinger->graphicPlane(0).getEGLDisplay()); // free the previous image if (texture->image != EGL_NO_IMAGE_KHR) { eglDestroyImageKHR(dpy, texture->image); texture->image = EGL_NO_IMAGE_KHR; } // construct an EGL_NATIVE_BUFFER_ANDROID android_native_buffer_t* clientBuf = buffer->getNativeBuffer(); // create the new EGLImageKHR const EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE, EGL_NONE }; texture->image = eglCreateImageKHR( dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, (EGLClientBuffer)clientBuf, attrs); LOGE_IF(texture->image == EGL_NO_IMAGE_KHR, "eglCreateImageKHR() failed. err=0x%4x", eglGetError()); if (texture->image != EGL_NO_IMAGE_KHR) { glBindTexture(GL_TEXTURE_2D, texture->name); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)texture->image); GLint error = glGetError(); if (UNLIKELY(error != GL_NO_ERROR)) { // this failed, for instance, because we don't support NPOT. // FIXME: do something! LOGE("layer=%p, glEGLImageTargetTexture2DOES(%p) " "failed err=0x%04x", this, texture->image, error); mFlags &= ~DisplayHardware::DIRECT_TEXTURE; err = INVALID_OPERATION; } else { // Everything went okay! texture->NPOTAdjust = false; texture->dirty = false; texture->width = clientBuf->width; texture->height = clientBuf->height; } } else { err = INVALID_OPERATION; } return err; } // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- int32_t LayerBaseClient::sIdentity = 0; int32_t LayerBaseClient::sIdentity = 0; Loading Loading
include/ui/GraphicBuffer.h +12 −2 Original line number Original line Diff line number Diff line Loading @@ -66,7 +66,11 @@ public: GraphicBuffer(); GraphicBuffer(); // creates w * h buffer // creates w * h buffer GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t ssage); GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t usage); // create a buffer from an existing handle GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t usage, uint32_t stride, native_handle_t* handle, bool keepOwnership); // return status // return status status_t initCheck() const; status_t initCheck() const; Loading Loading @@ -94,9 +98,15 @@ protected: GraphicBuffer(const Parcel& reply); GraphicBuffer(const Parcel& reply); virtual ~GraphicBuffer(); virtual ~GraphicBuffer(); enum { ownNone = 0, ownHandle = 1, ownData = 2, }; inline const GraphicBufferMapper& getBufferMapper() const { return mBufferMapper; } inline const GraphicBufferMapper& getBufferMapper() const { return mBufferMapper; } inline GraphicBufferMapper& getBufferMapper() { return mBufferMapper; } inline GraphicBufferMapper& getBufferMapper() { return mBufferMapper; } bool mOwner; uint8_t mOwner; private: private: friend class Surface; friend class Surface; Loading
libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp +4 −0 Original line number Original line Diff line number Diff line Loading @@ -256,12 +256,16 @@ void DisplayHardware::init(uint32_t dpy) if (strstr(gl_extensions, "GL_OES_draw_texture")) { if (strstr(gl_extensions, "GL_OES_draw_texture")) { mFlags |= DRAW_TEXTURE_EXTENSION; mFlags |= DRAW_TEXTURE_EXTENSION; } } #ifdef EGL_ANDROID_image_native_buffer if (strstr( gl_extensions, "GL_OES_EGL_image") && if (strstr( gl_extensions, "GL_OES_EGL_image") && (strstr(egl_extensions, "EGL_KHR_image_base") || (strstr(egl_extensions, "EGL_KHR_image_base") || strstr(egl_extensions, "EGL_KHR_image")) && strstr(egl_extensions, "EGL_KHR_image")) && strstr(egl_extensions, "EGL_ANDROID_image_native_buffer")) { strstr(egl_extensions, "EGL_ANDROID_image_native_buffer")) { mFlags |= DIRECT_TEXTURE; mFlags |= DIRECT_TEXTURE; } } #else #warning "EGL_ANDROID_image_native_buffer not supported" #endif // Unbind the context from this thread // Unbind the context from this thread eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); Loading
libs/surfaceflinger/Layer.cpp +6 −59 Original line number Original line Diff line number Diff line Loading @@ -130,62 +130,6 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h, return NO_ERROR; return NO_ERROR; } } status_t Layer::initializeEglImageLocked( const sp<GraphicBuffer>& buffer, Texture* texture) { status_t err = NO_ERROR; // we need to recreate the texture EGLDisplay dpy(mFlinger->graphicPlane(0).getEGLDisplay()); // free the previous image if (texture->image != EGL_NO_IMAGE_KHR) { eglDestroyImageKHR(dpy, texture->image); texture->image = EGL_NO_IMAGE_KHR; } // construct an EGL_NATIVE_BUFFER_ANDROID android_native_buffer_t* clientBuf = buffer->getNativeBuffer(); // create the new EGLImageKHR const EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE, EGL_NONE }; texture->image = eglCreateImageKHR( dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, (EGLClientBuffer)clientBuf, attrs); LOGE_IF(texture->image == EGL_NO_IMAGE_KHR, "eglCreateImageKHR() failed. err=0x%4x", eglGetError()); if (texture->image != EGL_NO_IMAGE_KHR) { glBindTexture(GL_TEXTURE_2D, texture->name); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)texture->image); GLint error = glGetError(); if (UNLIKELY(error != GL_NO_ERROR)) { // this failed, for instance, because we don't support NPOT. // FIXME: do something! LOGE("layer=%p, glEGLImageTargetTexture2DOES(%p) " "failed err=0x%04x", this, texture->image, error); mFlags &= ~DisplayHardware::DIRECT_TEXTURE; err = INVALID_OPERATION; } else { // Everything went okay! texture->NPOTAdjust = false; texture->dirty = false; texture->width = clientBuf->width; texture->height = clientBuf->height; } } else { err = INVALID_OPERATION; } return err; } void Layer::reloadTexture(const Region& dirty) void Layer::reloadTexture(const Region& dirty) { { Mutex::Autolock _l(mLock); Mutex::Autolock _l(mLock); Loading @@ -199,10 +143,11 @@ void Layer::reloadTexture(const Region& dirty) mTextures[index].height = 0; mTextures[index].height = 0; } } #ifdef EGL_ANDROID_image_native_buffer if (mFlags & DisplayHardware::DIRECT_TEXTURE) { if (mFlags & DisplayHardware::DIRECT_TEXTURE) { if (buffer->usage & GraphicBuffer::USAGE_HW_TEXTURE) { if (buffer->usage & GraphicBuffer::USAGE_HW_TEXTURE) { if (mTextures[index].dirty) { if (mTextures[index].dirty) { initializeEglImageLocked(buffer, &mTextures[index]); initializeEglImage(buffer, &mTextures[index]); } } } else { } else { if (mHybridBuffer==0 || (mHybridBuffer->width != buffer->width || if (mHybridBuffer==0 || (mHybridBuffer->width != buffer->width || Loading @@ -212,7 +157,7 @@ void Layer::reloadTexture(const Region& dirty) buffer->width, buffer->height, buffer->format, buffer->width, buffer->height, buffer->format, GraphicBuffer::USAGE_SW_WRITE_OFTEN | GraphicBuffer::USAGE_SW_WRITE_OFTEN | GraphicBuffer::USAGE_HW_TEXTURE); GraphicBuffer::USAGE_HW_TEXTURE); initializeEglImageLocked( initializeEglImage( mHybridBuffer, &mTextures[0]); mHybridBuffer, &mTextures[0]); } } Loading Loading @@ -279,7 +224,9 @@ void Layer::reloadTexture(const Region& dirty) buffer->unlock(); buffer->unlock(); } } } } } else { } else #endif { for (size_t i=0 ; i<NUM_BUFFERS ; i++) { for (size_t i=0 ; i<NUM_BUFFERS ; i++) { mTextures[i].image = EGL_NO_IMAGE_KHR; mTextures[i].image = EGL_NO_IMAGE_KHR; } } Loading
libs/surfaceflinger/Layer.h +0 −2 Original line number Original line Diff line number Diff line Loading @@ -85,8 +85,6 @@ private: } } void reloadTexture(const Region& dirty); void reloadTexture(const Region& dirty); status_t initializeEglImageLocked( const sp<GraphicBuffer>& buffer, Texture* texture); uint32_t getEffectiveUsage(uint32_t usage) const; uint32_t getEffectiveUsage(uint32_t usage) const; Loading
libs/surfaceflinger/LayerBase.cpp +57 −0 Original line number Original line Diff line number Diff line Loading @@ -617,6 +617,63 @@ void LayerBase::loadTexture(Texture* texture, } } } } status_t LayerBase::initializeEglImage( const sp<GraphicBuffer>& buffer, Texture* texture) { status_t err = NO_ERROR; // we need to recreate the texture EGLDisplay dpy(mFlinger->graphicPlane(0).getEGLDisplay()); // free the previous image if (texture->image != EGL_NO_IMAGE_KHR) { eglDestroyImageKHR(dpy, texture->image); texture->image = EGL_NO_IMAGE_KHR; } // construct an EGL_NATIVE_BUFFER_ANDROID android_native_buffer_t* clientBuf = buffer->getNativeBuffer(); // create the new EGLImageKHR const EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE, EGL_NONE }; texture->image = eglCreateImageKHR( dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, (EGLClientBuffer)clientBuf, attrs); LOGE_IF(texture->image == EGL_NO_IMAGE_KHR, "eglCreateImageKHR() failed. err=0x%4x", eglGetError()); if (texture->image != EGL_NO_IMAGE_KHR) { glBindTexture(GL_TEXTURE_2D, texture->name); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)texture->image); GLint error = glGetError(); if (UNLIKELY(error != GL_NO_ERROR)) { // this failed, for instance, because we don't support NPOT. // FIXME: do something! LOGE("layer=%p, glEGLImageTargetTexture2DOES(%p) " "failed err=0x%04x", this, texture->image, error); mFlags &= ~DisplayHardware::DIRECT_TEXTURE; err = INVALID_OPERATION; } else { // Everything went okay! texture->NPOTAdjust = false; texture->dirty = false; texture->width = clientBuf->width; texture->height = clientBuf->height; } } else { err = INVALID_OPERATION; } return err; } // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- int32_t LayerBaseClient::sIdentity = 0; int32_t LayerBaseClient::sIdentity = 0; Loading