Index: content/renderer/gpu/renderer_gl_context.cc |
=================================================================== |
--- content/renderer/gpu/renderer_gl_context.cc (revision 95161) |
+++ content/renderer/gpu/renderer_gl_context.cc (working copy) |
@@ -83,6 +83,7 @@ |
RendererGLContext* RendererGLContext::CreateViewContext( |
GpuChannelHost* channel, |
int render_view_id, |
+ RendererGLContext* share_group, |
const char* allowed_extensions, |
const int32* attrib_list, |
const GURL& active_url) { |
@@ -92,6 +93,7 @@ |
true, |
render_view_id, |
gfx::Size(), |
+ share_group, |
allowed_extensions, |
attrib_list, |
active_url)) |
@@ -114,6 +116,7 @@ |
RendererGLContext* RendererGLContext::CreateOffscreenContext( |
GpuChannelHost* channel, |
const gfx::Size& size, |
+ RendererGLContext* share_group, |
const char* allowed_extensions, |
const int32* attrib_list, |
const GURL& active_url) { |
@@ -123,6 +126,7 @@ |
false, |
0, |
size, |
+ share_group, |
allowed_extensions, |
attrib_list, |
active_url)) |
@@ -195,45 +199,14 @@ |
} |
uint32 RendererGLContext::CreateParentTexture(const gfx::Size& size) { |
- // Allocate a texture ID with respect to the parent. |
- if (parent_.get()) { |
- if (!MakeCurrent(parent_.get())) |
- return 0; |
- uint32 texture_id = parent_->gles2_implementation_->MakeTextureId(); |
- parent_->gles2_implementation_->BindTexture(GL_TEXTURE_2D, texture_id); |
- parent_->gles2_implementation_->TexParameteri( |
- GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
- parent_->gles2_implementation_->TexParameteri( |
- GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
- parent_->gles2_implementation_->TexParameteri( |
- GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
- parent_->gles2_implementation_->TexParameteri( |
- GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
- |
- parent_->gles2_implementation_->TexImage2D(GL_TEXTURE_2D, |
- 0, // mip level |
- GL_RGBA, |
- size.width(), |
- size.height(), |
- 0, // border |
- GL_RGBA, |
- GL_UNSIGNED_BYTE, |
- NULL); |
- // Make sure that the parent texture's storage is allocated before we let |
- // the caller attempt to use it. |
- int32 token = parent_->gles2_helper_->InsertToken(); |
- parent_->gles2_helper_->WaitForToken(token); |
- return texture_id; |
- } |
- return 0; |
+ uint32 texture_id = 0; |
+ gles2_implementation_->GenTextures(1, &texture_id); |
+ parent_->gles2_implementation_->Flush(); |
jamesr
2011/08/03 21:51:20
why is this doing a flush on the parent? shouldn't
|
+ return texture_id; |
} |
void RendererGLContext::DeleteParentTexture(uint32 texture) { |
- if (parent_.get()) { |
- if (!MakeCurrent(parent_.get())) |
- return; |
- parent_->gles2_implementation_->DeleteTextures(1, &texture); |
- } |
+ gles2_implementation_->DeleteTextures(1, &texture); |
} |
void RendererGLContext::SetSwapBuffersCallback(Callback0::Type* callback) { |
@@ -330,6 +303,7 @@ |
bool RendererGLContext::Initialize(bool onscreen, |
int render_view_id, |
const gfx::Size& size, |
+ RendererGLContext* share_group, |
const char* allowed_extensions, |
const int32* attrib_list, |
const GURL& active_url) { |
@@ -377,12 +351,14 @@ |
"RendererGLContext::Initialize::CreateViewCommandBuffer"); |
command_buffer_ = channel_->CreateViewCommandBuffer( |
render_view_id, |
+ share_group ? share_group->command_buffer_ : NULL, |
allowed_extensions, |
attribs, |
active_url); |
} else { |
command_buffer_ = channel_->CreateOffscreenCommandBuffer( |
size, |
+ share_group ? share_group->command_buffer_ : NULL, |
allowed_extensions, |
attribs, |
active_url); |
@@ -441,7 +417,7 @@ |
transfer_buffer.size, |
transfer_buffer.ptr, |
transfer_buffer_id_, |
- false); |
+ true); |
size_ = size; |
@@ -452,9 +428,18 @@ |
TRACE_EVENT0("gpu", "RendererGLContext::Destroy"); |
SetParent(NULL); |
- delete gles2_implementation_; |
- gles2_implementation_ = NULL; |
+ if (gles2_implementation_) { |
+ // First flush the context to ensure that any pending frees of resources |
+ // are completed. Otherwise, if this context is part of a share group, |
+ // those resources might leak. Also, any remaining side effects of commands |
+ // issued on this context might not be visible to other contexts in the |
+ // share group. |
+ gles2_implementation_->Flush(); |
+ delete gles2_implementation_; |
+ gles2_implementation_ = NULL; |
+ } |
+ |
// Do not destroy this transfer buffer here, because commands are still |
// in flight on the GPU process that may access them. When the command buffer |
// is destroyed, the associated shared memory will be cleaned up. |