Index: cc/gl_renderer.cc |
diff --git a/cc/gl_renderer.cc b/cc/gl_renderer.cc |
index 6a4413d1383695ea849c3a213d54711011dc55f9..4ae0753105a66452e69c33cfe7aa63b7b6e214ff 100644 |
--- a/cc/gl_renderer.cc |
+++ b/cc/gl_renderer.cc |
@@ -284,8 +284,7 @@ void GLRenderer::drawQuad(DrawingFrame& frame, const DrawQuad* quad) |
{ |
DCHECK(quad->rect.Contains(quad->visible_rect)); |
if (quad->material != DrawQuad::TEXTURE_CONTENT) { |
- flushTextureQuadCache(); |
- setBlendEnabled(quad->ShouldDrawWithBlending()); |
+ flushTextureQuadCache(); |
} |
switch (quad->material) { |
@@ -324,6 +323,8 @@ void GLRenderer::drawQuad(DrawingFrame& frame, const DrawQuad* quad) |
void GLRenderer::drawCheckerboardQuad(const DrawingFrame& frame, const CheckerboardDrawQuad* quad) |
{ |
+ setBlendEnabled(quad->ShouldDrawWithBlending()); |
+ |
const TileCheckerboardProgram* program = tileCheckerboardProgram(); |
DCHECK(program && (program->initialized() || isContextLost())); |
setUseProgram(program->program()); |
@@ -349,6 +350,8 @@ void GLRenderer::drawCheckerboardQuad(const DrawingFrame& frame, const Checkerbo |
void GLRenderer::drawDebugBorderQuad(const DrawingFrame& frame, const DebugBorderDrawQuad* quad) |
{ |
+ setBlendEnabled(quad->ShouldDrawWithBlending()); |
+ |
static float glMatrix[16]; |
const SolidColorProgram* program = solidColorProgram(); |
DCHECK(program && (program->initialized() || isContextLost())); |
@@ -552,6 +555,8 @@ scoped_ptr<ScopedResource> GLRenderer::drawBackgroundFilters( |
void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQuad* quad) |
{ |
+ setBlendEnabled(quad->ShouldDrawWithBlending()); |
+ |
CachedResource* contentsTexture = m_renderPassTextures.get(quad->render_pass_id); |
if (!contentsTexture || !contentsTexture->id()) |
return; |
@@ -721,6 +726,8 @@ void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua |
void GLRenderer::drawSolidColorQuad(const DrawingFrame& frame, const SolidColorDrawQuad* quad) |
{ |
+ setBlendEnabled(quad->ShouldDrawWithBlending()); |
+ |
const SolidColorProgram* program = solidColorProgram(); |
setUseProgram(program->program()); |
@@ -808,7 +815,6 @@ void GLRenderer::drawTileQuad(const DrawingFrame& frame, const TileDrawQuad* qua |
float fragmentTexScaleX = clampTexRect.width() / textureSize.width(); |
float fragmentTexScaleY = clampTexRect.height() / textureSize.height(); |
- |
gfx::QuadF localQuad; |
gfx::Transform deviceTransform = frame.windowMatrix * frame.projectionMatrix * quad->quadTransform(); |
deviceTransform.FlattenTo2d(); |
@@ -819,10 +825,14 @@ void GLRenderer::drawTileQuad(const DrawingFrame& frame, const TileDrawQuad* qua |
gfx::QuadF deviceLayerQuad = MathUtil::mapQuad(deviceTransform, gfx::QuadF(quad->visibleContentRect()), clipped); |
DCHECK(!clipped); |
+ // TODO(reveman): Axis-aligned is not enough to avoid anti-aliasing. |
+ // Bounding rectangle for quad also needs to be expressible as |
+ // an integer rectangle. crbug.com/169374 |
+ bool isAxisAlignedInTarget = deviceLayerQuad.IsRectilinear(); |
+ bool useAA = !clipped && !isAxisAlignedInTarget && quad->IsEdge(); |
+ |
TileProgramUniforms uniforms; |
- // For now, we simply skip anti-aliasing with the quad is clipped. This only happens |
- // on perspective transformed layers that go partially behind the camera. |
- if (quad->IsAntialiased() && !clipped) { |
+ if (useAA) { |
if (quad->swizzle_contents) |
tileUniformLocation(tileProgramSwizzleAA(), uniforms); |
else |
@@ -844,10 +854,9 @@ void GLRenderer::drawTileQuad(const DrawingFrame& frame, const TileDrawQuad* qua |
setUseProgram(uniforms.program); |
GLC(context(), context()->uniform1i(uniforms.samplerLocation, 0)); |
bool scaled = (texToGeomScaleX != 1 || texToGeomScaleY != 1); |
- GLenum filter = (quad->IsAntialiased() || scaled || !quad->quadTransform().IsIdentityOrIntegerTranslation()) ? GL_LINEAR : GL_NEAREST; |
+ GLenum filter = (useAA || scaled || !quad->quadTransform().IsIdentityOrIntegerTranslation()) ? GL_LINEAR : GL_NEAREST; |
ResourceProvider::ScopedSamplerGL quadResourceLock(m_resourceProvider, quad->resource_id, GL_TEXTURE_2D, filter); |
- bool useAA = !clipped && quad->IsAntialiased(); |
if (useAA) { |
LayerQuad deviceLayerBounds = LayerQuad(gfx::QuadF(deviceLayerQuad.BoundingBox())); |
deviceLayerBounds.inflateAntiAliasingDistance(); |
@@ -884,13 +893,13 @@ void GLRenderer::drawTileQuad(const DrawingFrame& frame, const TileDrawQuad* qua |
LayerQuad::Edge rightEdge(topRight, bottomRight); |
// Only apply anti-aliasing to edges not clipped by culling or scissoring. |
- if (quad->top_edge_aa && tileRect.y() == quad->rect.y()) |
+ if (quad->IsTopEdge() && tileRect.y() == quad->rect.y()) |
topEdge = deviceLayerEdges.top(); |
- if (quad->left_edge_aa && tileRect.x() == quad->rect.x()) |
+ if (quad->IsLeftEdge() && tileRect.x() == quad->rect.x()) |
leftEdge = deviceLayerEdges.left(); |
- if (quad->right_edge_aa && tileRect.right() == quad->rect.right()) |
+ if (quad->IsRightEdge() && tileRect.right() == quad->rect.right()) |
rightEdge = deviceLayerEdges.right(); |
- if (quad->bottom_edge_aa && tileRect.bottom() == quad->rect.bottom()) |
+ if (quad->IsBottomEdge() && tileRect.bottom() == quad->rect.bottom()) |
bottomEdge = deviceLayerEdges.bottom(); |
float sign = gfx::QuadF(tileRect).IsCounterClockwise() ? -1 : 1; |
@@ -928,6 +937,10 @@ void GLRenderer::drawTileQuad(const DrawingFrame& frame, const TileDrawQuad* qua |
localQuad = gfx::RectF(tileRect); |
} |
+ // Enable blending when the quad properties require it or if we decided |
+ // to use antialiasing. |
+ setBlendEnabled(quad->ShouldDrawWithBlending() || useAA); |
+ |
// Normalize to tileRect. |
localQuad.Scale(1.0f / tileRect.width(), 1.0f / tileRect.height()); |
@@ -945,6 +958,8 @@ void GLRenderer::drawTileQuad(const DrawingFrame& frame, const TileDrawQuad* qua |
void GLRenderer::drawYUVVideoQuad(const DrawingFrame& frame, const YUVVideoDrawQuad* quad) |
{ |
+ setBlendEnabled(quad->ShouldDrawWithBlending()); |
+ |
const VideoYUVProgram* program = videoYUVProgram(); |
DCHECK(program && (program->initialized() || isContextLost())); |
@@ -997,6 +1012,8 @@ void GLRenderer::drawYUVVideoQuad(const DrawingFrame& frame, const YUVVideoDrawQ |
void GLRenderer::drawStreamVideoQuad(const DrawingFrame& frame, const StreamVideoDrawQuad* quad) |
{ |
+ setBlendEnabled(quad->ShouldDrawWithBlending()); |
+ |
static float glMatrix[16]; |
DCHECK(m_capabilities.usingEglImage); |
@@ -1185,6 +1202,8 @@ void GLRenderer::drawTextureQuad(const DrawingFrame& frame, const TextureDrawQua |
void GLRenderer::drawIOSurfaceQuad(const DrawingFrame& frame, const IOSurfaceDrawQuad* quad) |
{ |
+ setBlendEnabled(quad->ShouldDrawWithBlending()); |
+ |
TexTransformTextureProgramBinding binding; |
binding.set(textureIOSurfaceProgram(), context()); |