summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/gles2_cmd_decoder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer/service/gles2_cmd_decoder.cc')
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc21
1 files changed, 12 insertions, 9 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 42f9a2b..65b2e56 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -173,11 +173,12 @@ class ScopedFrameBufferBinder {
};
// Temporarily changes a decoder's bound frame buffer to a resolved version of
-// the multisampled offscreen render buffer if and only if that buffer is
-// currently bound and is multisampled.
+// the multisampled offscreen render buffer if that buffer is multisampled, and,
+// if it is bound or enforce_internal_framebuffer is true.
class ScopedResolvedFrameBufferBinder {
public:
- explicit ScopedResolvedFrameBufferBinder(GLES2DecoderImpl* decoder);
+ explicit ScopedResolvedFrameBufferBinder(GLES2DecoderImpl* decoder,
+ bool enforce_internal_framebuffer);
~ScopedResolvedFrameBufferBinder();
private:
@@ -1527,10 +1528,12 @@ ScopedFrameBufferBinder::~ScopedFrameBufferBinder() {
}
ScopedResolvedFrameBufferBinder::ScopedResolvedFrameBufferBinder(
- GLES2DecoderImpl* decoder) : decoder_(decoder) {
+ GLES2DecoderImpl* decoder, bool enforce_internal_framebuffer)
+ : decoder_(decoder) {
resolve_and_bind_ = (decoder_->offscreen_target_frame_buffer_.get() &&
decoder_->IsOffscreenBufferMultisampled() &&
- !decoder_->bound_read_framebuffer_.get());
+ (!decoder_->bound_read_framebuffer_.get() ||
+ enforce_internal_framebuffer));
if (!resolve_and_bind_)
return;
@@ -4961,7 +4964,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels(
CopyRealGLErrorsToWrapper();
- ScopedResolvedFrameBufferBinder binder(this);
+ ScopedResolvedFrameBufferBinder binder(this, false);
// Get the size of the current fbo or backbuffer.
gfx::Size max_size = GetBoundReadFrameBufferSize();
@@ -5731,7 +5734,7 @@ void GLES2DecoderImpl::DoCopyTexImage2D(
}
CopyRealGLErrorsToWrapper();
- ScopedResolvedFrameBufferBinder binder(this);
+ ScopedResolvedFrameBufferBinder binder(this, false);
gfx::Size size = GetBoundReadFrameBufferSize();
// Clip to size to source dimensions
@@ -5815,7 +5818,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D(
return;
}
- ScopedResolvedFrameBufferBinder binder(this);
+ ScopedResolvedFrameBufferBinder binder(this, false);
gfx::Size size = GetBoundReadFrameBufferSize();
GLint copyX = 0;
GLint copyY = 0;
@@ -6337,7 +6340,7 @@ error::Error GLES2DecoderImpl::HandleSwapBuffers(
if (IsOffscreenBufferMultisampled()) {
// For multisampled buffers, bind the resolved frame buffer so that
// callbacks can call ReadPixels or CopyTexImage2D.
- ScopedResolvedFrameBufferBinder binder(this);
+ ScopedResolvedFrameBufferBinder binder(this, true);
if (swap_buffers_callback_.get()) {
swap_buffers_callback_->Run();
}