diff options
Diffstat (limited to 'libs/surfaceflinger/LayerBase.cpp')
| -rw-r--r-- | libs/surfaceflinger/LayerBase.cpp | 37 | 
1 files changed, 22 insertions, 15 deletions
| diff --git a/libs/surfaceflinger/LayerBase.cpp b/libs/surfaceflinger/LayerBase.cpp index 17c9f42ac5..af353e2fb4 100644 --- a/libs/surfaceflinger/LayerBase.cpp +++ b/libs/surfaceflinger/LayerBase.cpp @@ -30,7 +30,7 @@  #include "DisplayHardware/DisplayHardware.h" -// We don't honor the premultipliad alpha flags, which means that +// We don't honor the premultiplied alpha flags, which means that  // premultiplied surface may be composed using a non-premultiplied  // equation. We do this because it may be a lot faster on some hardware  // The correct value is HONOR_PREMULTIPLIED_ALPHA = 1 @@ -256,7 +256,7 @@ void LayerBase::validateVisibility(const Transform& planeTransform)      // see if we can/should use 2D h/w with the new configuration      mCanUseCopyBit = false; -    copybit_t* copybit = mFlinger->getBlitEngine(); +    copybit_device_t* copybit = mFlinger->getBlitEngine();      if (copybit) {           const int step = copybit->get(copybit, COPYBIT_ROTATION_STEP_DEG);          const int scaleBits = copybit->get(copybit, COPYBIT_SCALING_FRAC_BITS); @@ -413,7 +413,7 @@ void LayerBase::drawWithOpenGL(const Region& clip,          // premultiplied alpha.          // If the texture doesn't have an alpha channel we can -        // use REPLACE and switch to non premultiplied-alpha +        // use REPLACE and switch to non premultiplied alpha          // blending (SRCA/ONE_MINUS_SRCA).          GLenum env, src; @@ -431,11 +431,11 @@ void LayerBase::drawWithOpenGL(const Region& clip,          glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env);      } else {          glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +        glColor4x(0x10000, 0x10000, 0x10000, 0x10000);          if (needsBlending()) {              GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;              glEnable(GL_BLEND);              glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); -            glColor4x(0x10000, 0x10000, 0x10000, 0x10000);          } else {              glDisable(GL_BLEND);          } @@ -463,7 +463,7 @@ void LayerBase::drawWithOpenGL(const Region& clip,              glMatrixMode(GL_TEXTURE);              glLoadIdentity();              if (!(mFlags & DisplayHardware::NPOT_EXTENSION)) { -                // find the smalest power-of-two that will accomodate our surface +                // find the smallest power-of-two that will accommodate our surface                  GLuint tw = 1 << (31 - clz(t.width));                  GLuint th = 1 << (31 - clz(t.height));                  if (tw < t.width)  tw <<= 1; @@ -556,7 +556,7 @@ void LayerBase::loadTexture(const Region& dirty,      GLuint texture_w = tw;      GLuint texture_h = th;      if (!(flags & DisplayHardware::NPOT_EXTENSION)) { -        // find the smalest power-of-two that will accomodate our surface +        // find the smallest power-of-two that will accommodate our surface          texture_w = 1 << (31 - clz(t.width));          texture_h = 1 << (31 - clz(t.height));          if (texture_w < t.width)  texture_w <<= 1; @@ -582,6 +582,8 @@ void LayerBase::loadTexture(const Region& dirty,              glTexImage2D(GL_DIRECT_TEXTURE_2D_QUALCOMM, 0,                      GL_RGBA, tw, th, 0,                      GL_RGBA, GL_UNSIGNED_BYTE, t.data); +        } else if (t.format == GGL_PIXEL_FORMAT_BGRA_8888) { +            // TODO: add GL_BGRA extension          } else {              // oops, we don't handle this format, try the regular path              goto regular; @@ -592,7 +594,7 @@ void LayerBase::loadTexture(const Region& dirty,  regular:          Rect bounds(dirty.bounds());          GLvoid* data = 0; -        if (texture_w!=textureWidth || texture_w!=textureHeight) { +        if (texture_w!=textureWidth || texture_h!=textureHeight) {              // texture size changed, we need to create a new one              if (!textureWidth || !textureHeight) { @@ -606,31 +608,36 @@ regular:                      bounds.set(Rect(tw, th));                  }              } - +                          if (t.format == GGL_PIXEL_FORMAT_RGB_565) {                  glTexImage2D(GL_TEXTURE_2D, 0, -                        GL_RGB, tw, th, 0, +                        GL_RGB, texture_w, texture_h, 0,                          GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data);              } else if (t.format == GGL_PIXEL_FORMAT_RGBA_4444) {                  glTexImage2D(GL_TEXTURE_2D, 0, -                        GL_RGBA, tw, th, 0, +                        GL_RGBA, texture_w, texture_h, 0,                          GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, data);              } else if (t.format == GGL_PIXEL_FORMAT_RGBA_8888) {                  glTexImage2D(GL_TEXTURE_2D, 0, -                        GL_RGBA, tw, th, 0, +                        GL_RGBA, texture_w, texture_h, 0,                          GL_RGBA, GL_UNSIGNED_BYTE, data);              } else if ( t.format == GGL_PIXEL_FORMAT_YCbCr_422_SP ||                          t.format == GGL_PIXEL_FORMAT_YCbCr_420_SP) {                  // just show the Y plane of YUV buffers                  data = t.data;                  glTexImage2D(GL_TEXTURE_2D, 0, -                        GL_LUMINANCE, tw, th, 0, +                        GL_LUMINANCE, texture_w, texture_h, 0,                          GL_LUMINANCE, GL_UNSIGNED_BYTE, data); +            } else { +                // oops, we don't handle this format! +                LOGE("layer %p, texture=%d, using format %d, which is not " +                     "supported by the GL", this, textureName, t.format); +                textureName = -1;              } -            textureWidth = tw; -            textureHeight = th; +            textureWidth = texture_w; +            textureHeight = texture_h;          } -        if (!data) { +        if (!data && textureName>=0) {              if (t.format == GGL_PIXEL_FORMAT_RGB_565) {                  glTexSubImage2D(GL_TEXTURE_2D, 0,                          0, bounds.top, t.width, bounds.height(), |