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(); |
} |