diff options
author | Derek Sollenberger <djsollen@google.com> | 2011-02-16 12:48:46 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-02-16 12:48:46 -0800 |
commit | 5ad675d34069bcdf6bcd983ae4941c0531216354 (patch) | |
tree | f04ba87adf01e537b817dff8e177e62bad0e495b /WebCore/platform/graphics/android | |
parent | e9d5f570f22c46f9adaa4181c3fa1b715f15ccb3 (diff) | |
parent | 87a12aa24a87540251e0d2d0a223e761ceb31da2 (diff) | |
download | external_webkit-5ad675d34069bcdf6bcd983ae4941c0531216354.zip external_webkit-5ad675d34069bcdf6bcd983ae4941c0531216354.tar.gz external_webkit-5ad675d34069bcdf6bcd983ae4941c0531216354.tar.bz2 |
Merge "Selectively enable and disable GL_BLEND for better performance."
Diffstat (limited to 'WebCore/platform/graphics/android')
5 files changed, 56 insertions, 15 deletions
diff --git a/WebCore/platform/graphics/android/BaseLayerAndroid.cpp b/WebCore/platform/graphics/android/BaseLayerAndroid.cpp index 35c3b36..d2c41dc 100644 --- a/WebCore/platform/graphics/android/BaseLayerAndroid.cpp +++ b/WebCore/platform/graphics/android/BaseLayerAndroid.cpp @@ -267,8 +267,6 @@ bool BaseLayerAndroid::drawGL(IntRect& viewRect, SkRect& visibleRect, (float)m_color.green() / 255.0, (float)m_color.blue() / 255.0, 1); glClear(GL_COLOR_BUFFER_BIT); - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glViewport(left, top, width, height); ShaderProgram* shader = TilesManager::instance()->shader(); @@ -280,6 +278,7 @@ bool BaseLayerAndroid::drawGL(IntRect& viewRect, SkRect& visibleRect, glUniform1i(shader->textureSampler(), 0); shader->setViewRect(viewRect); shader->setViewport(visibleRect); + shader->resetBlending(); double currentTime = WTF::currentTime(); ret = drawBasePictureInGL(visibleRect, scale, currentTime); diff --git a/WebCore/platform/graphics/android/LayerAndroid.cpp b/WebCore/platform/graphics/android/LayerAndroid.cpp index 7375cba..e000ab1 100644 --- a/WebCore/platform/graphics/android/LayerAndroid.cpp +++ b/WebCore/platform/graphics/android/LayerAndroid.cpp @@ -868,9 +868,10 @@ bool LayerAndroid::drawGL(SkMatrix& matrix) uniqueId(), this, getWidth(), getHeight(), m_drawingTexture, textureRect.x(), textureRect.y(), textureRect.width(), textureRect.height()); + //TODO determine when drawing if the alpha value is used. TilesManager::instance()->shader()->drawLayerQuad(m, bounds, textureInfo->m_textureId, - m_drawOpacity); + m_drawOpacity, true); } m_drawingTexture->consumerRelease(); } diff --git a/WebCore/platform/graphics/android/MediaLayer.cpp b/WebCore/platform/graphics/android/MediaLayer.cpp index 7a4c02d..ad4fc76 100644 --- a/WebCore/platform/graphics/android/MediaLayer.cpp +++ b/WebCore/platform/graphics/android/MediaLayer.cpp @@ -84,19 +84,26 @@ bool MediaLayer::drawGL(SkMatrix& matrix) if (m_bufferedTexture) { TextureInfo* textureInfo = m_bufferedTexture->consumerLock(); if (textureInfo) { - // the layer's shader draws the content inverted so we must undo - // that change in the transformation matrix - TransformationMatrix m = drawTransform(); - if (!m_isContentInverted) { - m.flipY(); - m.translate(0, -getSize().height()); - } SkRect rect; rect.set(0, 0, getSize().width(), getSize().height()); - TilesManager::instance()->shader()->drawLayerQuad(m, rect, - textureInfo->m_textureId, - 1.0f); //TODO fix this m_drawOpacity + + if (textureInfo->m_width != 0 && textureInfo->m_height != 0) { + // the layer's shader draws the content inverted so we must undo + // that change in the transformation matrix + TransformationMatrix m = drawTransform(); + if (!m_isContentInverted) { + m.flipY(); + m.translate(0, -getSize().height()); + } + + bool forceBlending = textureInfo->m_internalFormat == GL_RGBA || + textureInfo->m_internalFormat == GL_ALPHA; + TilesManager::instance()->shader()->drawLayerQuad(m, rect, + textureInfo->m_textureId, + 1.0f, forceBlending); + } + if (!rect.isEmpty()) needsInval = false; } diff --git a/WebCore/platform/graphics/android/ShaderProgram.cpp b/WebCore/platform/graphics/android/ShaderProgram.cpp index c4129f1..828cc37 100644 --- a/WebCore/platform/graphics/android/ShaderProgram.cpp +++ b/WebCore/platform/graphics/android/ShaderProgram.cpp @@ -146,6 +146,7 @@ GLuint ShaderProgram::createProgram(const char* pVertexSource, const char* pFrag } ShaderProgram::ShaderProgram() + : m_blendingEnabled(false) { init(); } @@ -181,6 +182,27 @@ void ShaderProgram::init() glBufferData(GL_ARRAY_BUFFER, 2 * 4 * sizeof(GLfloat), coord, GL_STATIC_DRAW); } +void ShaderProgram::resetBlending() +{ + glDisable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + m_blendingEnabled = false; +} + +void ShaderProgram::setBlendingState(bool enableBlending) +{ + if (enableBlending == m_blendingEnabled) + return; + + if (enableBlending) + glEnable(GL_BLEND); + else + glDisable(GL_BLEND); + + m_blendingEnabled = enableBlending; +} + ///////////////////////////////////////////////////////////////////////////////////////// // Drawing ///////////////////////////////////////////////////////////////////////////////////////// @@ -222,6 +244,7 @@ void ShaderProgram::drawQuad(SkRect& geometry, int textureId, float opacity) glVertexAttribPointer(m_hPosition, 2, GL_FLOAT, GL_FALSE, 0, 0); glUniform1f(alpha(), opacity); + setBlendingState(opacity < 1.0); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); GLUtils::checkGlError("drawQuad"); @@ -278,7 +301,8 @@ IntRect ShaderProgram::clippedRectWithViewport(const IntRect& rect, int margin) } void ShaderProgram::drawLayerQuad(const TransformationMatrix& drawMatrix, - SkRect& geometry, int textureId, float opacity) + SkRect& geometry, int textureId, float opacity, + bool forceBlending) { TransformationMatrix renderMatrix = drawMatrix; @@ -297,6 +321,7 @@ void ShaderProgram::drawLayerQuad(const TransformationMatrix& drawMatrix, glVertexAttribPointer(m_hPosition, 2, GL_FLOAT, GL_FALSE, 0, 0); glUniform1f(alpha(), opacity); + setBlendingState(forceBlending || opacity < 1.0); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @@ -317,12 +342,14 @@ void ShaderProgram::drawVideoLayerQuad(const TransformationMatrix& drawMatrix, glUniformMatrix4fv(m_hVideoProjectionMatrix, 1, GL_FALSE, projectionMatrix); glUniformMatrix4fv(m_hVideoTextureMatrix, 1, GL_FALSE, textureMatrix); + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId); glBindBuffer(GL_ARRAY_BUFFER, m_textureBuffer[0]); glEnableVertexAttribArray(m_hVideoPosition); glVertexAttribPointer(m_hVideoPosition, 2, GL_FLOAT, GL_FALSE, 0, 0); + setBlendingState(false); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // switch back to our normal rendering program diff --git a/WebCore/platform/graphics/android/ShaderProgram.h b/WebCore/platform/graphics/android/ShaderProgram.h index 5e2045c..9419511 100644 --- a/WebCore/platform/graphics/android/ShaderProgram.h +++ b/WebCore/platform/graphics/android/ShaderProgram.h @@ -40,7 +40,8 @@ class ShaderProgram { void setViewport(SkRect& viewport); void drawQuad(SkRect& geometry, int textureId, float opacity); void drawLayerQuad(const TransformationMatrix& drawMatrix, - SkRect& geometry, int textureId, float opacity); + SkRect& geometry, int textureId, float opacity, + bool forceBlending = false); void drawVideoLayerQuad(const TransformationMatrix& drawMatrix, float* textureMatrix, SkRect& geometry, int textureId); void setViewRect(const IntRect& viewRect); @@ -49,11 +50,17 @@ class ShaderProgram { void clip(const FloatRect& rect); IntRect clippedRectWithViewport(const IntRect& rect, int margin = 0); + void resetBlending(); + private: GLuint loadShader(GLenum shaderType, const char* pSource); GLuint createProgram(const char* vertexSource, const char* fragmentSource); void setProjectionMatrix(SkRect& geometry); + void setBlendingState(bool enableBlending); + + bool m_blendingEnabled; + int m_program; int m_videoProgram; |