Chromium Code Reviews| Index: cc/gl_renderer.cc |
| diff --git a/cc/gl_renderer.cc b/cc/gl_renderer.cc |
| index 384e443ef2d7b64282fdcf0d635691c6ed12b842..551f9314157bb4eab24b5b4af4c8999b9e227a31 100644 |
| --- a/cc/gl_renderer.cc |
| +++ b/cc/gl_renderer.cc |
| @@ -494,7 +494,7 @@ scoped_ptr<ScopedResource> GLRenderer::drawBackgroundFilters( |
| // Copy the readback pixels from device to the background texture for the surface. |
| gfx::Transform deviceToFramebufferTransform; |
| deviceToFramebufferTransform.Translate(quad->rect.width() / 2.0, quad->rect.height() / 2.0); |
| - deviceToFramebufferTransform.Scale3d(quad->rect.width(), quad->rect.height(), 1); |
| + deviceToFramebufferTransform.Scale(quad->rect.width(), quad->rect.height()); |
| deviceToFramebufferTransform.PreconcatTransform(contentsDeviceTransformInverse); |
| copyTextureToFramebuffer(frame, filteredDeviceBackgroundTextureId, deviceRect, deviceToFramebufferTransform); |
| } |
| @@ -583,6 +583,9 @@ void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua |
| int shaderMaskTexCoordOffsetLocation = -1; |
| int shaderMatrixLocation = -1; |
| int shaderAlphaLocation = -1; |
| + int shaderTexTransformLocation = -1; |
| + int shaderTexScaleLocation = -1; |
| + |
| if (useAA && maskTextureId) { |
| const RenderPassMaskProgramAA* program = renderPassMaskProgramAA(); |
| setUseProgram(program->program()); |
| @@ -595,6 +598,7 @@ void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua |
| shaderMaskTexCoordOffsetLocation = program->fragmentShader().maskTexCoordOffsetLocation(); |
| shaderMatrixLocation = program->vertexShader().matrixLocation(); |
| shaderAlphaLocation = program->fragmentShader().alphaLocation(); |
| + shaderTexScaleLocation = program->vertexShader().texScaleLocation(); |
| } else if (!useAA && maskTextureId) { |
| const RenderPassMaskProgram* program = renderPassMaskProgram(); |
| setUseProgram(program->program()); |
| @@ -605,6 +609,7 @@ void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua |
| shaderMaskTexCoordOffsetLocation = program->fragmentShader().maskTexCoordOffsetLocation(); |
| shaderMatrixLocation = program->vertexShader().matrixLocation(); |
| shaderAlphaLocation = program->fragmentShader().alphaLocation(); |
| + shaderTexTransformLocation = program->vertexShader().texTransformLocation(); |
| } else if (useAA && !maskTextureId) { |
| const RenderPassProgramAA* program = renderPassProgramAA(); |
| setUseProgram(program->program()); |
| @@ -614,6 +619,7 @@ void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua |
| shaderEdgeLocation = program->fragmentShader().edgeLocation(); |
| shaderMatrixLocation = program->vertexShader().matrixLocation(); |
| shaderAlphaLocation = program->fragmentShader().alphaLocation(); |
| + shaderTexScaleLocation = program->vertexShader().texScaleLocation(); |
| } else { |
| const RenderPassProgram* program = renderPassProgram(); |
| setUseProgram(program->program()); |
| @@ -621,6 +627,23 @@ void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua |
| shaderMatrixLocation = program->vertexShader().matrixLocation(); |
| shaderAlphaLocation = program->fragmentShader().alphaLocation(); |
| + shaderTexTransformLocation = program->vertexShader().texTransformLocation(); |
| + } |
| + |
| + float tex_scale_x = quad->rect.width() / static_cast<float>(contentsTexture->size().width()); |
| + float tex_scale_y = quad->rect.height() / static_cast<float>(contentsTexture->size().height()); |
| + DCHECK_LE(tex_scale_x, 1.0f); |
| + DCHECK_LE(tex_scale_y, 1.0f); |
| + |
| + if (shaderTexTransformLocation != -1) { |
| + GLC(context(), context()->uniform4f(shaderTexTransformLocation, |
| + 0.0f, 0.0f, |
| + tex_scale_x, tex_scale_y)); |
| + } else if (shaderTexScaleLocation != -1) { |
| + GLC(context(), context()->uniform2f(shaderTexScaleLocation, |
| + tex_scale_x, tex_scale_y)); |
| + } else { |
| + NOTREACHED(); |
| } |
| if (shaderMaskSamplerLocation != -1) { |
| @@ -628,8 +651,10 @@ void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua |
| DCHECK(shaderMaskTexCoordOffsetLocation != 1); |
| GLC(context(), context()->activeTexture(GL_TEXTURE1)); |
| GLC(context(), context()->uniform1i(shaderMaskSamplerLocation, 1)); |
| - GLC(context(), context()->uniform2f(shaderMaskTexCoordOffsetLocation, quad->mask_uv_rect.x(), quad->mask_uv_rect.y())); |
| - GLC(context(), context()->uniform2f(shaderMaskTexCoordScaleLocation, quad->mask_uv_rect.width(), quad->mask_uv_rect.height())); |
| + GLC(context(), context()->uniform2f(shaderMaskTexCoordOffsetLocation, |
| + quad->mask_uv_rect.x(), quad->mask_uv_rect.y())); |
| + GLC(context(), context()->uniform2f(shaderMaskTexCoordScaleLocation, |
| + quad->mask_uv_rect.width() / tex_scale_x, quad->mask_uv_rect.height() / tex_scale_y)); |
| m_resourceProvider->bindForSampling(quad->mask_resource_id, GL_TEXTURE_2D, GL_LINEAR); |
| GLC(context(), context()->activeTexture(GL_TEXTURE0)); |
| } |
| @@ -641,6 +666,7 @@ void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua |
| GLC(context(), context()->uniform3fv(shaderEdgeLocation, 8, edge)); |
| } |
| + |
|
danakj
2012/12/13 20:39:50
extra \n
|
| // Map device space quad to surface space. contentsDeviceTransform has no 3d component since it was generated with to2dTransform() so we don't need to project. |
| gfx::QuadF surfaceQuad = MathUtil::mapQuad(contentsDeviceTransformInverse, deviceLayerEdges.ToQuadF(), clipped); |
| DCHECK(!clipped); |
| @@ -1228,6 +1254,8 @@ void GLRenderer::copyTextureToFramebuffer(const DrawingFrame& frame, int texture |
| setUseProgram(program->program()); |
| GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocation(), 0)); |
| + GLC(context(), context()->uniform4f(program->vertexShader().texTransformLocation(), |
| + 0.0f, 0.0f, 1.0f, 1.0f)); |
| setShaderOpacity(1, program->fragmentShader().alphaLocation()); |
| drawQuadGeometry(frame, drawMatrix, rect, program->vertexShader().matrixLocation()); |
| } |