diff options
| -rw-r--r-- | include/surfaceflinger/ISurfaceComposer.h | 2 | ||||
| -rw-r--r-- | include/ui/GraphicBuffer.h | 6 | ||||
| -rwxr-xr-x | include/ui/KeycodeLabels.h | 16 | ||||
| -rw-r--r-- | libs/gui/SurfaceTexture.cpp | 12 | ||||
| -rw-r--r-- | opengl/libs/EGL/egl.cpp | 7 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 8 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 6 | ||||
| -rw-r--r-- | services/surfaceflinger/LayerBase.h | 12 | ||||
| -rw-r--r-- | services/surfaceflinger/LayerDim.h | 6 | 
9 files changed, 64 insertions, 11 deletions
| diff --git a/include/surfaceflinger/ISurfaceComposer.h b/include/surfaceflinger/ISurfaceComposer.h index 56ed3a4cf8..361e7dc28d 100644 --- a/include/surfaceflinger/ISurfaceComposer.h +++ b/include/surfaceflinger/ISurfaceComposer.h @@ -44,6 +44,8 @@ public:          eSecure             = 0x00000080,          eNonPremultiplied   = 0x00000100,          eOpaque             = 0x00000400, +        eProtectedByApp     = 0x00000800, +        eProtectedByDRM     = 0x00001000,          eFXSurfaceNormal    = 0x00000000,          eFXSurfaceBlur      = 0x00010000, diff --git a/include/ui/GraphicBuffer.h b/include/ui/GraphicBuffer.h index 8b256f4265..02d6f8ffd2 100644 --- a/include/ui/GraphicBuffer.h +++ b/include/ui/GraphicBuffer.h @@ -54,9 +54,11 @@ public:          USAGE_SW_WRITE_RARELY   = GRALLOC_USAGE_SW_WRITE_RARELY,          USAGE_SW_WRITE_OFTEN    = GRALLOC_USAGE_SW_WRITE_OFTEN,          USAGE_SW_WRITE_MASK     = GRALLOC_USAGE_SW_WRITE_MASK, -         +          USAGE_SOFTWARE_MASK     = USAGE_SW_READ_MASK|USAGE_SW_WRITE_MASK, -         + +        USAGE_PROTECTED         = GRALLOC_USAGE_PROTECTED, +          USAGE_HW_TEXTURE        = GRALLOC_USAGE_HW_TEXTURE,          USAGE_HW_RENDER         = GRALLOC_USAGE_HW_RENDER,          USAGE_HW_2D             = GRALLOC_USAGE_HW_2D, diff --git a/include/ui/KeycodeLabels.h b/include/ui/KeycodeLabels.h index 9b1a8975e4..dbccf29b11 100755 --- a/include/ui/KeycodeLabels.h +++ b/include/ui/KeycodeLabels.h @@ -212,6 +212,22 @@ static const KeycodeLabel KEYCODES[] = {      { "PROG_YELLOW", 185 },      { "PROG_BLUE", 186 },      { "APP_SWITCH", 187 }, +    { "BUTTON_1", 188 }, +    { "BUTTON_2", 189 }, +    { "BUTTON_3", 190 }, +    { "BUTTON_4", 191 }, +    { "BUTTON_5", 192 }, +    { "BUTTON_6", 193 }, +    { "BUTTON_7", 194 }, +    { "BUTTON_8", 195 }, +    { "BUTTON_9", 196 }, +    { "BUTTON_10", 197 }, +    { "BUTTON_11", 198 }, +    { "BUTTON_12", 199 }, +    { "BUTTON_13", 200 }, +    { "BUTTON_14", 201 }, +    { "BUTTON_15", 202 }, +    { "BUTTON_16", 203 },      // NOTE: If you add a new keycode here you must also add it to several other files.      //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index d6cc8ce034..223cf091e7 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -220,11 +220,19 @@ status_t SurfaceTexture::updateTexImage() {              mSlots[mLastQueued].mEglImage = image;              mSlots[mLastQueued].mEglDisplay = dpy;          } + +        GLint error; +        while ((error = glGetError()) != GL_NO_ERROR) { +            LOGE("GL error cleared before updating SurfaceTexture: %#04x", error); +        }          glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, (GLeglImageOES)image); -        GLint error = glGetError(); -        if (error != GL_NO_ERROR) { +        bool failed = false; +        while ((error = glGetError()) != GL_NO_ERROR) {              LOGE("error binding external texture image %p (slot %d): %#04x",                      image, mLastQueued, error); +            failed = true; +        } +        if (failed) {              return -EINVAL;          } diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp index 8977fbf5ec..3dc8c03fab 100644 --- a/opengl/libs/EGL/egl.cpp +++ b/opengl/libs/EGL/egl.cpp @@ -389,10 +389,9 @@ static tls_t* getTLS()  }  static inline void clearError() { -    if (gEGLThreadLocalStorageKey != -1) { -        tls_t* tls = getTLS(); -        tls->error = EGL_SUCCESS; -    } +    // This must clear the error from all the underlying EGL implementations as +    // well as the EGL wrapper layer. +    eglGetError();  }  template<typename T> diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index f64fd7b59b..fde8e677df 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -56,6 +56,8 @@ Layer::Layer(SurfaceFlinger* flinger,          mNeedsBlending(true),          mNeedsDithering(false),          mSecure(false), +        mProtectedByApp(false), +        mProtectedByDRM(false),          mTextureManager(),          mBufferManager(mTextureManager),          mWidth(0), mHeight(0), mNeedsScaling(false), mFixedSize(false) @@ -190,6 +192,8 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h,      mReqHeight = h;      mSecure = (flags & ISurfaceComposer::eSecure) ? true : false; +    mProtectedByApp = (flags & ISurfaceComposer::eProtectedByApp) ? true : false; +    mProtectedByDRM = (flags & ISurfaceComposer::eProtectedByDRM) ? true : false;      mNeedsBlending = (info.h_alpha - info.l_alpha) > 0 &&              (flags & ISurfaceComposer::eOpaque) == 0; @@ -475,6 +479,10 @@ uint32_t Layer::getEffectiveUsage(uint32_t usage) const          // request EGLImage for all buffers          usage |= GraphicBuffer::USAGE_HW_TEXTURE;      } +    if (mProtectedByApp || mProtectedByDRM) { +        // need a hardware-protected path to external video sink +        usage |= GraphicBuffer::USAGE_PROTECTED; +    }      return usage;  } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 290811982e..d9a8be334f 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -79,6 +79,8 @@ public:      virtual bool needsDithering() const     { return mNeedsDithering; }      virtual bool needsFiltering() const;      virtual bool isSecure() const           { return mSecure; } +    virtual bool isProtectedByApp() const   { return mProtectedByApp; } +    virtual bool isProtectedByDRM() const   { return mProtectedByDRM; }      virtual sp<Surface> createSurface() const;      virtual status_t ditch();      virtual void onRemoved(); @@ -218,7 +220,9 @@ private:      bool mNeedsDithering;      // page-flip thread (currently main thread) -    bool mSecure; +    bool mSecure;         // no screenshots +    bool mProtectedByApp; // application requires protected path to external sink +    bool mProtectedByDRM; // DRM agent requires protected path to external sink      Region mPostedDirtyRegion;      // page-flip thread and transaction thread (currently main thread) diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h index 8ed474972b..184edd779c 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -196,6 +196,18 @@ public:       */      virtual bool isSecure() const       { return false; } +    /** +     * isProtectedByApp - true if application says this surface is protected, that +     * is if it requires a hardware-protected data path to an external sink. +     */ +    virtual bool isProtectedByApp() const   { return false; } + +    /** +     * isProtectedByDRM - true if DRM agent says this surface is protected, that +     * is if it requires a hardware-protected data path to an external sink. +     */ +    virtual bool isProtectedByDRM() const   { return false; } +      /** Called from the main thread, when the surface is removed from the       * draw list */      virtual status_t ditch() { return NO_ERROR; } diff --git a/services/surfaceflinger/LayerDim.h b/services/surfaceflinger/LayerDim.h index 5631c0a417..75f9a89282 100644 --- a/services/surfaceflinger/LayerDim.h +++ b/services/surfaceflinger/LayerDim.h @@ -37,8 +37,10 @@ public:          virtual ~LayerDim();      virtual void onDraw(const Region& clip) const; -    virtual bool needsBlending() const  { return true; } -    virtual bool isSecure() const       { return false; } +    virtual bool needsBlending() const    { return true; } +    virtual bool isSecure() const         { return false; } +    virtual bool isProtectedByApp() const { return false; } +    virtual bool isProtectedByDRM() const { return false; }      virtual const char* getTypeId() const { return "LayerDim"; }  }; |