From dc8ac1db6f8a14dbac0eb104ecfc18292f6e9a03 Mon Sep 17 00:00:00 2001 From: Nicolas Roard Date: Fri, 11 Feb 2011 11:38:49 -0800 Subject: [PATCH] DO NOT MERGE Fix GL_BLEND problem. glBindAttribLocation() will only work after a shader has been linked; This was working previously due to the way the nvidia driver work when using blending (it generates another shader). Change-Id: Ie5d28ba451e7b37fd9c6a76c14fc3e4e525d9bf0 --- .../platform/graphics/android/ShaderProgram.cpp | 23 +++++++++++----------- WebCore/platform/graphics/android/ShaderProgram.h | 4 ++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/WebCore/platform/graphics/android/ShaderProgram.cpp b/WebCore/platform/graphics/android/ShaderProgram.cpp index 8da685546..c4129f165 100644 --- a/WebCore/platform/graphics/android/ShaderProgram.cpp +++ b/WebCore/platform/graphics/android/ShaderProgram.cpp @@ -140,8 +140,6 @@ GLuint ShaderProgram::createProgram(const char* pVertexSource, const char* pFrag } glDeleteProgram(program); program = -1; - } else { - XLOG("couldn't link the shader!"); } } return program; @@ -156,15 +154,21 @@ void ShaderProgram::init() { m_program = createProgram(gVertexShader, gFragmentShader); m_videoProgram = createProgram(gVideoVertexShader, gVideoFragmentShader); + if (m_program == -1 || m_videoProgram == -1) + return; m_hProjectionMatrix = glGetUniformLocation(m_program, "projectionMatrix"); m_hAlpha = glGetUniformLocation(m_program, "alpha"); m_hTexSampler = glGetUniformLocation(m_program, "s_texture"); + m_hPosition = glGetAttribLocation(m_program, "vPosition"); + m_hVideoProjectionMatrix = glGetUniformLocation(m_videoProgram, "projectionMatrix"); m_hVideoTextureMatrix = glGetUniformLocation(m_videoProgram, "textureMatrix"); m_hVideoTexSampler = glGetUniformLocation(m_videoProgram, "s_yuvTexture"); + m_hVideoPosition = glGetAttribLocation(m_program, "vPosition"); + const GLfloat coord[] = { 0.0f, 0.0f, // C 1.0f, 0.0f, // D @@ -214,9 +218,8 @@ void ShaderProgram::drawQuad(SkRect& geometry, int textureId, float opacity) glBindTexture(GL_TEXTURE_2D, textureId); glBindBuffer(GL_ARRAY_BUFFER, m_textureBuffer[0]); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0); - glBindAttribLocation(program(), 1, "vPosition"); + glEnableVertexAttribArray(m_hPosition); + glVertexAttribPointer(m_hPosition, 2, GL_FLOAT, GL_FALSE, 0, 0); glUniform1f(alpha(), opacity); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -290,9 +293,8 @@ void ShaderProgram::drawLayerQuad(const TransformationMatrix& drawMatrix, glBindTexture(GL_TEXTURE_2D, textureId); glBindBuffer(GL_ARRAY_BUFFER, m_textureBuffer[0]); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0); - glBindAttribLocation(program(), 1, "vPosition"); + glEnableVertexAttribArray(m_hPosition); + glVertexAttribPointer(m_hPosition, 2, GL_FLOAT, GL_FALSE, 0, 0); glUniform1f(alpha(), opacity); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -318,9 +320,8 @@ void ShaderProgram::drawVideoLayerQuad(const TransformationMatrix& drawMatrix, glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId); glBindBuffer(GL_ARRAY_BUFFER, m_textureBuffer[0]); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0); - glBindAttribLocation(m_videoProgram, 1, "vPosition"); + glEnableVertexAttribArray(m_hVideoPosition); + glVertexAttribPointer(m_hVideoPosition, 2, GL_FLOAT, GL_FALSE, 0, 0); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); diff --git a/WebCore/platform/graphics/android/ShaderProgram.h b/WebCore/platform/graphics/android/ShaderProgram.h index 1f942906a..5e2045cb3 100644 --- a/WebCore/platform/graphics/android/ShaderProgram.h +++ b/WebCore/platform/graphics/android/ShaderProgram.h @@ -72,6 +72,10 @@ class ShaderProgram { int m_hVideoProjectionMatrix; int m_hVideoTextureMatrix; int m_hVideoTexSampler; + + // attribs + GLint m_hPosition; + GLint m_hVideoPosition; }; } // namespace WebCore -- 2.11.0