Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index c525908a1f14913df300d49dfcacb0073f1bd710..4b8083478b215cb40aec7f1146e66e1ea52f4375 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -876,6 +876,9 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
bool PrepForSetUniformByLocation( |
GLint location, const char* function_name, GLenum* type, GLsizei* count); |
+ // Gets the service id for any simulated backbuffer fbo. |
+ GLuint GetBackbufferServiceId(); |
+ |
// Helper for glGetBooleanv, glGetFloatv and glGetIntegerv |
bool GetHelper(GLenum pname, GLint* params, GLsizei* num_written); |
@@ -2164,6 +2167,9 @@ void GLES2DecoderImpl::DeleteBuffersHelper( |
void GLES2DecoderImpl::DeleteFramebuffersHelper( |
GLsizei n, const GLuint* client_ids) { |
+ bool supports_seperate_framebuffer_binds = |
+ feature_info_->feature_flags().chromium_framebuffer_multisample; |
+ |
for (GLsizei ii = 0; ii < n; ++ii) { |
FramebufferManager::FramebufferInfo* info = |
GetFramebufferInfo(client_ids[ii]); |
@@ -2171,6 +2177,15 @@ void GLES2DecoderImpl::DeleteFramebuffersHelper( |
if (info == bound_draw_framebuffer_) { |
bound_draw_framebuffer_ = NULL; |
state_dirty_ = true; |
+ GLenum target = supports_seperate_framebuffer_binds ? |
alokp
2011/10/31 21:00:54
It seems in cases where (bound_draw_framebuffer_ =
|
+ GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER; |
+ glBindFramebufferEXT(target, GetBackbufferServiceId()); |
+ } |
+ if (info == bound_read_framebuffer_) { |
+ bound_read_framebuffer_ = NULL; |
+ GLenum target = supports_seperate_framebuffer_binds ? |
+ GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER; |
+ glBindFramebufferEXT(target, GetBackbufferServiceId()); |
} |
GLuint service_id = info->service_id(); |
glDeleteFramebuffersEXT(1, &service_id); |
@@ -2839,6 +2854,12 @@ void GLES2DecoderImpl::ApplyDirtyState() { |
} |
} |
+GLuint GLES2DecoderImpl::GetBackbufferServiceId() { |
+ return (offscreen_target_frame_buffer_.get()) ? |
+ offscreen_target_frame_buffer_->id() : |
+ surface_->GetBackingFrameBufferObject(); |
+} |
+ |
void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { |
FramebufferManager::FramebufferInfo* info = NULL; |
GLuint service_id = 0; |
@@ -2862,8 +2883,6 @@ void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { |
service_id = info->service_id(); |
} |
info->MarkAsValid(); |
- } else { |
- service_id = surface_->GetBackingFrameBufferObject(); |
} |
if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER_EXT) { |
@@ -2875,10 +2894,10 @@ void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { |
state_dirty_ = true; |
- // When rendering to an offscreen frame buffer, instead of unbinding from |
- // the current frame buffer, bind to the offscreen target frame buffer. |
- if (info == NULL && offscreen_target_frame_buffer_.get()) { |
- service_id = offscreen_target_frame_buffer_->id(); |
+ // If we are rendering to the backbuffer get the FBO id for any simulated |
+ // backbuffer. |
+ if (info == NULL) { |
+ service_id = GetBackbufferServiceId(); |
} |
glBindFramebufferEXT(target, service_id); |