Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index fe9c5d8160678b2bfb02fad747fb4d8dbe7c3b21..90b177bd1aedb15478ee3001c2dc5e3fd6d4e913 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -81,6 +81,20 @@ Float4 UVTransform(const TextureDrawQuad* quad) { |
return xform; |
} |
+Float4 UVClampRect(gfx::RectF uv_clamp_rect, |
+ const gfx::Size& texture_size, |
+ SamplerType sampler) { |
+ gfx::SizeF half_texel(0.5f, 0.5f); |
+ if (sampler != SAMPLER_TYPE_2D_RECT) { |
+ half_texel.Scale(1.f / texture_size.width(), 1.f / texture_size.height()); |
+ } else { |
+ uv_clamp_rect.Scale(texture_size.width(), texture_size.height()); |
+ } |
+ uv_clamp_rect.Inset(half_texel.width(), half_texel.height()); |
+ return {{uv_clamp_rect.x(), uv_clamp_rect.y(), uv_clamp_rect.right(), |
+ uv_clamp_rect.bottom()}}; |
+} |
+ |
Float4 PremultipliedColor(SkColor color) { |
const float factor = 1.0f / 255.0f; |
const float alpha = SkColorGetA(color) * factor; |
@@ -2485,8 +2499,15 @@ void GLRenderer::DrawStreamVideoQuad(const DrawingFrame* frame, |
gl_->Uniform1i(program->fragment_shader().sampler_location(), 0); |
- SetShaderOpacity(quad->shared_quad_state->opacity, |
- program->fragment_shader().alpha_location()); |
+ gfx::Size texture_size = lock.size(); |
+ gfx::Vector2dF uv = quad->matrix.Scale2d(); |
+ gfx::RectF uv_clamp_rect(0, 0, uv.x(), uv.y()); |
+ const SamplerType sampler = SamplerTypeFromTextureTarget(lock.target()); |
+ Float4 tex_clamp_rect = UVClampRect(uv_clamp_rect, texture_size, sampler); |
+ gl_->Uniform4f(program->fragment_shader().tex_clamp_rect_location(), |
+ tex_clamp_rect.data[0], tex_clamp_rect.data[1], |
+ tex_clamp_rect.data[2], tex_clamp_rect.data[3]); |
+ |
if (!clip_region) { |
DrawQuadGeometry(frame->projection_matrix, |
quad->shared_quad_state->quad_to_target_transform, |
@@ -2529,9 +2550,12 @@ struct TexTransformTextureProgramBinding : TextureProgramBinding { |
tex_transform_location = program->vertex_shader().tex_transform_location(); |
vertex_opacity_location = |
program->vertex_shader().vertex_opacity_location(); |
+ tex_clamp_rect_location = |
+ program->fragment_shader().tex_clamp_rect_location(); |
} |
int tex_transform_location; |
int vertex_opacity_location; |
+ int tex_clamp_rect_location; |
}; |
void GLRenderer::FlushTextureQuadCache(BoundGeometry flush_binding) { |
@@ -2572,6 +2596,11 @@ void GLRenderer::FlushTextureQuadCache(BoundGeometry flush_binding) { |
static_cast<int>(draw_cache_.uv_xform_data.size()), |
reinterpret_cast<float*>(&draw_cache_.uv_xform_data.front())); |
+ gl_->Uniform4fv( |
+ draw_cache_.tex_clamp_rect_location, |
+ static_cast<int>(draw_cache_.tex_clamp_rect_data.size()), |
+ reinterpret_cast<float*>(&draw_cache_.tex_clamp_rect_data.front())); |
+ |
if (draw_cache_.background_color != SK_ColorTRANSPARENT) { |
Float4 background_color = PremultipliedColor(draw_cache_.background_color); |
gl_->Uniform4fv(draw_cache_.background_color_location, 1, |
@@ -2615,6 +2644,7 @@ void GLRenderer::FlushTextureQuadCache(BoundGeometry flush_binding) { |
// Clear the cache. |
draw_cache_.program_id = -1; |
draw_cache_.uv_xform_data.resize(0); |
+ draw_cache_.tex_clamp_rect_data.resize(0); |
draw_cache_.vertex_opacity_data.resize(0); |
draw_cache_.matrix_data.resize(0); |
@@ -2679,6 +2709,7 @@ void GLRenderer::EnqueueTextureQuad(const DrawingFrame* frame, |
draw_cache_.background_color = quad->background_color; |
draw_cache_.uv_xform_location = binding.tex_transform_location; |
+ draw_cache_.tex_clamp_rect_location = binding.tex_clamp_rect_location; |
draw_cache_.background_color_location = binding.background_color_location; |
draw_cache_.vertex_opacity_location = binding.vertex_opacity_location; |
draw_cache_.matrix_location = binding.matrix_location; |
@@ -2699,6 +2730,23 @@ void GLRenderer::EnqueueTextureQuad(const DrawingFrame* frame, |
} |
draw_cache_.uv_xform_data.push_back(uv_transform); |
+ if (draw_cache_.tex_clamp_rect_location != -1) { |
+ // VideoLayerImpl always set background color to transparent. |
+ DCHECK(quad->background_color == SK_ColorTRANSPARENT); |
+ gfx::Size texture_size = lock.size(); |
+ if (texture_size.IsEmpty()) { |
+ // TODO(dshwang): correct all code coming to here. crbug.com/615325 |
+ texture_size = quad->rect.size(); |
+ } |
+ gfx::RectF uv_clamp_rect(quad->uv_top_left.x(), quad->uv_top_left.y(), |
+ quad->uv_bottom_right.x() - quad->uv_top_left.x(), |
+ quad->uv_bottom_right.y() - quad->uv_top_left.y()); |
+ Float4 tex_clamp_rect = UVClampRect(uv_clamp_rect, texture_size, sampler); |
+ draw_cache_.tex_clamp_rect_data.push_back(tex_clamp_rect); |
+ DCHECK_EQ(draw_cache_.uv_xform_data.size(), |
+ draw_cache_.tex_clamp_rect_data.size()); |
+ } |
+ |
// Generate the vertex opacity |
const float opacity = quad->shared_quad_state->opacity; |
draw_cache_.vertex_opacity_data.push_back(quad->vertex_opacity[0] * opacity); |