summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gpu/command_buffer/service/context_state.cc19
-rw-r--r--gpu/command_buffer/service/context_state.h6
-rw-r--r--gpu/command_buffer/service/gl_context_virtual.cc4
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc1
-rw-r--r--ui/gl/gl_context.cc5
-rw-r--r--ui/gl/gl_context.h6
-rw-r--r--ui/gl/gl_gl_api_implementation.cc42
-rw-r--r--ui/gl/gl_gl_api_implementation.h5
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