| Index: cc/output/texture_copier.cc
|
| diff --git a/cc/output/texture_copier.cc b/cc/output/texture_copier.cc
|
| index a32fb65e58f905ce25089f64ea22f7fa2756662b..1ad0ef0d19e068ed0ed02350620bc7cab828f1cb 100644
|
| --- a/cc/output/texture_copier.cc
|
| +++ b/cc/output/texture_copier.cc
|
| @@ -14,8 +14,11 @@ namespace cc {
|
|
|
| AcceleratedTextureCopier::AcceleratedTextureCopier(
|
| WebKit::WebGraphicsContext3D* context,
|
| - bool using_bind_uniforms)
|
| - : context_(context), using_bind_uniforms_(using_bind_uniforms) {
|
| + bool using_bind_uniforms,
|
| + int highp_threshold_min)
|
| + : context_(context)
|
| + , using_bind_uniforms_(using_bind_uniforms)
|
| + , highp_threshold_min_(highp_threshold_min) {
|
| DCHECK(context_);
|
| GLC(context_, fbo_ = context_->createFramebuffer());
|
| GLC(context_, position_buffer_ = context_->createBuffer());
|
| @@ -29,12 +32,15 @@ AcceleratedTextureCopier::AcceleratedTextureCopier(
|
| GL_ARRAY_BUFFER, sizeof(kPositions), kPositions, GL_STATIC_DRAW));
|
| GLC(context_, context_->bindBuffer(GL_ARRAY_BUFFER, 0));
|
|
|
| - blit_program_.reset(new BlitProgram(context_));
|
| + blit_program_.reset(new BlitProgram(context_, TexCoordPrecisionMedium));
|
| + blit_program_highp_.reset(new BlitProgram(context_, TexCoordPrecisionHigh));
|
| }
|
|
|
| AcceleratedTextureCopier::~AcceleratedTextureCopier() {
|
| if (blit_program_)
|
| blit_program_->Cleanup(context_);
|
| + if (blit_program_highp_)
|
| + blit_program_highp_->Cleanup(context_);
|
| if (position_buffer_)
|
| GLC(context_, context_->deleteBuffer(position_buffer_));
|
| if (fbo_)
|
| @@ -72,11 +78,21 @@ void AcceleratedTextureCopier::CopyTexture(Parameters parameters) {
|
| context_->texParameteri(
|
| GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
|
|
|
| - if (!blit_program_->initialized())
|
| - blit_program_->Initialize(context_, using_bind_uniforms_);
|
| -
|
| - // TODO(danakj): Use EXT_framebuffer_blit if available.
|
| - GLC(context_, context_->useProgram(blit_program_->program()));
|
| + TexCoordPrecision texCoordPrecision = TexCoordPrecisionRequired(
|
| + context_, highp_threshold_min_, parameters.size);
|
| + if (texCoordPrecision == TexCoordPrecisionHigh) {
|
| + if (!blit_program_highp_->initialized())
|
| + blit_program_highp_->Initialize(context_, using_bind_uniforms_);
|
| +
|
| + // TODO(danakj): Use EXT_framebuffer_blit if available.
|
| + GLC(context_, context_->useProgram(blit_program_highp_->program()));
|
| + } else {
|
| + if (!blit_program_->initialized())
|
| + blit_program_->Initialize(context_, using_bind_uniforms_);
|
| +
|
| + // TODO(danakj: Use EXT_framebuffer_blit if available.
|
| + GLC(context_, context_->useProgram(blit_program_->program()));
|
| + }
|
|
|
| const int kPositionAttribute = 0;
|
| GLC(context_, context_->bindBuffer(GL_ARRAY_BUFFER, position_buffer_));
|
|
|