diff options
Diffstat (limited to 'libs/surfaceflinger/LayerBase.cpp')
| -rw-r--r-- | libs/surfaceflinger/LayerBase.cpp | 57 | 
1 files changed, 57 insertions, 0 deletions
diff --git a/libs/surfaceflinger/LayerBase.cpp b/libs/surfaceflinger/LayerBase.cpp index ecc78946bb..8003d22daa 100644 --- a/libs/surfaceflinger/LayerBase.cpp +++ b/libs/surfaceflinger/LayerBase.cpp @@ -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;  |