Chromium Code Reviews| 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 3651a90c5494e794652439e1b2b18b4e8a79b058..97fd9722247b309681e21978dce20c4869f3370c 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| @@ -569,6 +569,9 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
| void RestoreAllAttributes() const override; |
| QueryManager* GetQueryManager() override { return query_manager_.get(); } |
| + FramebufferManager* GetFramebufferManager() override { |
| + return framebuffer_manager_.get(); |
| + } |
| TransformFeedbackManager* GetTransformFeedbackManager() override { |
| return transform_feedback_manager_.get(); |
| } |
| @@ -723,7 +726,7 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
| } |
| FramebufferManager* framebuffer_manager() { |
| - return group_->framebuffer_manager(); |
| + return framebuffer_manager_.get(); |
| } |
| ProgramManager* program_manager() { |
| @@ -2322,6 +2325,8 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
| // Whether the client requested an offscreen buffer with an alpha channel. |
| bool offscreen_buffer_should_have_alpha_; |
| + std::unique_ptr<FramebufferManager> framebuffer_manager_; |
| + |
| std::unique_ptr<QueryManager> query_manager_; |
| std::unique_ptr<VertexArrayManager> vertex_array_manager_; |
| @@ -3250,6 +3255,12 @@ bool GLES2DecoderImpl::Initialize( |
| // vertex_attrib_manager is set to default_vertex_attrib_manager by this call |
| DoBindVertexArrayOES(0); |
| + framebuffer_manager_.reset(new FramebufferManager( |
| + group_->max_draw_buffers(), group_->max_color_attachments(), |
| + group_->framebuffer_completeness_cache())); |
| + group_->texture_manager()->set_framebuffer_manager( |
| + framebuffer_manager_.get()); |
|
Zhenyao Mo
2017/05/16 18:53:40
This is problematic. Now creating a new context c
Chandan
2017/05/17 13:08:08
Done.
|
| + |
| query_manager_.reset(new QueryManager(this, feature_info_.get())); |
| image_manager_.reset(new ImageManager); |
| @@ -4856,6 +4867,13 @@ void GLES2DecoderImpl::Destroy(bool have_context) { |
| srgb_converter_.reset(); |
| clear_framebuffer_blit_.reset(); |
| + if (framebuffer_manager_.get()) { |
| + framebuffer_manager_->Destroy(have_context); |
| + if (group_->texture_manager()) |
| + group_->texture_manager()->set_framebuffer_manager(nullptr); |
| + framebuffer_manager_.reset(); |
| + } |
| + |
| if (query_manager_.get()) { |
| query_manager_->Destroy(have_context); |
| query_manager_.reset(); |
| @@ -5724,22 +5742,15 @@ void GLES2DecoderImpl::OnUseFramebuffer() const { |
| } |
| void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { |
| - Framebuffer* framebuffer = NULL; |
| + Framebuffer* framebuffer = nullptr; |
| GLuint service_id = 0; |
| if (client_id != 0) { |
| framebuffer = GetFramebuffer(client_id); |
| if (!framebuffer) { |
| - if (!group_->bind_generates_resource()) { |
|
Zhenyao Mo
2017/05/16 18:53:40
This is still needed.
Chandan
2017/05/17 13:08:08
Done.
|
| LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| "glBindFramebuffer", |
| "id not generated by glGenFramebuffers"); |
| return; |
| - } |
| - |
| - // It's a new id so make a framebuffer framebuffer for it. |
| - glGenFramebuffersEXT(1, &service_id); |
| - CreateFramebuffer(client_id, service_id); |
| - framebuffer = GetFramebuffer(client_id); |
| } else { |
| service_id = framebuffer->service_id(); |
| } |
| @@ -5760,7 +5771,7 @@ void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { |
| // If we are rendering to the backbuffer get the FBO id for any simulated |
| // backbuffer. |
| - if (framebuffer == NULL) { |
| + if (!framebuffer) { |
| service_id = GetBackbufferServiceId(); |
| } |