diff options
-rw-r--r-- | gpu/command_buffer/service/context_state.cc | 19 | ||||
-rw-r--r-- | gpu/command_buffer/service/context_state.h | 6 | ||||
-rw-r--r-- | gpu/command_buffer/service/gl_context_virtual.cc | 4 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 1 | ||||
-rw-r--r-- | ui/gl/gl_context.cc | 5 | ||||
-rw-r--r-- | ui/gl/gl_context.h | 6 | ||||
-rw-r--r-- | ui/gl/gl_gl_api_implementation.cc | 42 | ||||
-rw-r--r-- | ui/gl/gl_gl_api_implementation.h | 5 |
8 files changed, 69 insertions, 19 deletions
diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc index a0e2c8c..9942e9d 100644 --- a/gpu/command_buffer/service/context_state.cc +++ b/gpu/command_buffer/service/context_state.cc @@ -30,13 +30,14 @@ TextureUnit::TextureUnit() TextureUnit::~TextureUnit() { } -ContextState::ContextState() +ContextState::ContextState(FeatureInfo* feature_info) : pack_alignment(4), unpack_alignment(4), active_texture_unit(0), hint_generate_mipmap(GL_DONT_CARE), hint_fragment_shader_derivative(GL_DONT_CARE), - pack_reverse_row_order(false) { + pack_reverse_row_order(false), + feature_info_(feature_info) { Initialize(); } @@ -64,8 +65,18 @@ void ContextState::RestoreState() const { service_id = texture_unit.bound_texture_cube_map ? texture_unit.bound_texture_cube_map->service_id() : 0; glBindTexture(GL_TEXTURE_CUBE_MAP, service_id); - // TODO: Restore bindings for GL_TEXTURE_RECTANGLE_ARB and - // GL_TEXTURE_EXTERNAL_OES. + + if (feature_info_->feature_flags().oes_egl_image_external) { + service_id = texture_unit.bound_texture_external_oes ? + texture_unit.bound_texture_external_oes->service_id() : 0; + glBindTexture(GL_TEXTURE_EXTERNAL_OES, service_id); + } + + if (feature_info_->feature_flags().arb_texture_rectangle) { + service_id = texture_unit.bound_texture_rectangle_arb ? + texture_unit.bound_texture_rectangle_arb->service_id() : 0; + glBindTexture(GL_TEXTURE_RECTANGLE_ARB, service_id); + } } glActiveTexture(GL_TEXTURE0 + active_texture_unit); diff --git a/gpu/command_buffer/service/context_state.h b/gpu/command_buffer/service/context_state.h index d2f428b..18e8a36 100644 --- a/gpu/command_buffer/service/context_state.h +++ b/gpu/command_buffer/service/context_state.h @@ -23,6 +23,8 @@ namespace gpu { namespace gles2 { +class FeatureInfo; + // State associated with each texture unit. struct GPU_EXPORT TextureUnit { TextureUnit(); @@ -88,7 +90,7 @@ struct Vec4 { }; struct GPU_EXPORT ContextState { - ContextState(); + explicit ContextState(FeatureInfo* feature_info); ~ContextState(); void Initialize(); @@ -148,6 +150,8 @@ struct GPU_EXPORT ContextState { GLenum hint_fragment_shader_derivative; bool pack_reverse_row_order; + + FeatureInfo* feature_info_; }; } // namespace gles2 diff --git a/gpu/command_buffer/service/gl_context_virtual.cc b/gpu/command_buffer/service/gl_context_virtual.cc index ff5fd20..4632650 100644 --- a/gpu/command_buffer/service/gl_context_virtual.cc +++ b/gpu/command_buffer/service/gl_context_virtual.cc @@ -18,7 +18,6 @@ GLContextVirtual::GLContextVirtual( display_(NULL), state_restorer_(new GLStateRestorerImpl(decoder)), decoder_(decoder) { - shared_context_->SetupForVirtualization(); } gfx::Display* GLContextVirtual::display() { @@ -32,11 +31,14 @@ bool GLContextVirtual::Initialize( if (!shared_context_->MakeCurrent(compatible_surface)) return false; + shared_context_->SetupForVirtualization(); + shared_context_->ReleaseCurrent(compatible_surface); return true; } void GLContextVirtual::Destroy() { + shared_context_->OnDestroyVirtualContext(this); shared_context_ = NULL; display_ = NULL; } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 06dea03..b1292f0 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -1933,6 +1933,7 @@ GLES2Decoder* GLES2Decoder::Create(ContextGroup* group) { GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group) : GLES2Decoder(), group_(group), + state_(group_->feature_info()), error_bits_(0), unpack_flip_y_(false), unpack_premultiply_alpha_(false), diff --git a/ui/gl/gl_context.cc b/ui/gl/gl_context.cc index a0433a6..a6e67da 100644 --- a/ui/gl/gl_context.cc +++ b/ui/gl/gl_context.cc @@ -120,6 +120,11 @@ bool GLContext::MakeVirtuallyCurrent( return virtual_gl_api_->MakeCurrent(virtual_context, surface); } +void GLContext::OnDestroyVirtualContext(GLContext* virtual_context) { + DCHECK(virtual_gl_api_); + virtual_gl_api_->OnDestroyVirtualContext(virtual_context); +} + void GLContext::SetRealGLApi() { SetGLToRealGLApi(); } diff --git a/ui/gl/gl_context.h b/ui/gl/gl_context.h index 3648ba1..76cbd35 100644 --- a/ui/gl/gl_context.h +++ b/ui/gl/gl_context.h @@ -85,7 +85,11 @@ class GL_EXPORT GLContext : public base::RefCounted<GLContext> { void SetupForVirtualization(); // Make this context current when used for context virtualization. - bool MakeVirtuallyCurrent(GLContext* virutal_context, GLSurface* surface); + bool MakeVirtuallyCurrent(GLContext* virtual_context, GLSurface* surface); + + // Notify this context that |virtual_context|, that was using us, is + // being destroyed. + void OnDestroyVirtualContext(GLContext* virtual_context); protected: virtual ~GLContext(); diff --git a/ui/gl/gl_gl_api_implementation.cc b/ui/gl/gl_gl_api_implementation.cc index 96b9341..e7f65f6 100644 --- a/ui/gl/gl_gl_api_implementation.cc +++ b/ui/gl/gl_gl_api_implementation.cc @@ -4,6 +4,10 @@ #include "ui/gl/gl_gl_api_implementation.h" +#include <algorithm> +#include <vector> + +#include "base/string_util.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_state_restorer.h" #include "ui/gl/gl_surface.h" @@ -78,6 +82,22 @@ VirtualGLApi::~VirtualGLApi() { void VirtualGLApi::Initialize(DriverGL* driver, GLContext* real_context) { driver_ = driver; real_context_ = real_context; + + DCHECK(real_context->IsCurrent(NULL)); + std::string ext_string( + reinterpret_cast<const char*>(driver_->fn.glGetStringFn(GL_EXTENSIONS))); + std::vector<std::string> ext; + Tokenize(ext_string, " ", &ext); + + std::vector<std::string>::iterator it; + // We can't support GL_EXT_occlusion_query_boolean which is + // based on GL_ARB_occlusion_query without a lot of work virtualizing + // queries. + it = std::find(ext.begin(), ext.end(), "GL_EXT_occlusion_query_boolean"); + if (it != ext.end()) + ext.erase(it); + + extensions_ = JoinString(ext, " "); } bool VirtualGLApi::MakeCurrent(GLContext* virtual_context, GLSurface* surface) { @@ -103,6 +123,10 @@ bool VirtualGLApi::MakeCurrent(GLContext* virtual_context, GLSurface* surface) { DCHECK(virtual_context->IsCurrent(surface)); if (switched_contexts || virtual_context != current_context_) { + // There should be no errors from the previous context leaking into the + // new context. + DCHECK_EQ(glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR)); + current_context_ = virtual_context; // Set all state that is different from the real state // NOTE: !!! This is a temporary implementation that just restores all @@ -118,6 +142,11 @@ bool VirtualGLApi::MakeCurrent(GLContext* virtual_context, GLSurface* surface) { return true; } +void VirtualGLApi::OnDestroyVirtualContext(GLContext* virtual_context) { + if (current_context_ == virtual_context) + current_context_ = NULL; +} + void VirtualGLApi::glActiveTextureFn(GLenum texture) { driver_->fn.glActiveTextureFn(texture); } @@ -582,18 +611,7 @@ void VirtualGLApi::glGetShaderSourceFn( const GLubyte* VirtualGLApi::glGetStringFn(GLenum name) { switch (name) { case GL_EXTENSIONS: - // For now return no extensions. - // - // Specificially we can't support GL_EXT_occlusion_query_boolean which is - // based on GL_ARB_occlusion_query without a lot of work virtualizing - // queries. - // - // Also we don't support multisample yet, nor vertex array objects, - // etc.. - // - // We can turn on other extensions on an as needed basis. For now, if you - // need the extensions, don't make a virtual context. - return reinterpret_cast<const GLubyte*>(""); + return reinterpret_cast<const GLubyte*>(extensions_.c_str()); default: return driver_->fn.glGetStringFn(name); } diff --git a/ui/gl/gl_gl_api_implementation.h b/ui/gl/gl_gl_api_implementation.h index 1bc477f..4842194 100644 --- a/ui/gl/gl_gl_api_implementation.h +++ b/ui/gl/gl_gl_api_implementation.h @@ -59,6 +59,8 @@ class GL_EXPORT VirtualGLApi : public GLApi { // Sets the current virutal context. bool MakeCurrent(GLContext* virtual_context, GLSurface* surface); + void OnDestroyVirtualContext(GLContext* virtual_context); + private: DriverGL* driver_; @@ -67,6 +69,9 @@ class GL_EXPORT VirtualGLApi : public GLApi { // The current virtual context. GLContext* current_context_; + + // The supported extensions being advertised for this virtual context. + std::string extensions_; }; } // namespace gfx |