diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-26 21:02:45 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-26 21:02:45 +0000 |
commit | 6f5fac9d1b4c8bfc924ed555f46c3e67a8a8f962 (patch) | |
tree | 867db68f1f7fa9c5e0f41910240e406286754e40 | |
parent | c9b218291fd46c0ceb4b1a3100b182ad26cbb1b8 (diff) | |
download | chromium_src-6f5fac9d1b4c8bfc924ed555f46c3e67a8a8f962.zip chromium_src-6f5fac9d1b4c8bfc924ed555f46c3e67a8a8f962.tar.gz chromium_src-6f5fac9d1b4c8bfc924ed555f46c3e67a8a8f962.tar.bz2 |
Aura: Fix partial swaps in the UI
Extensions were being cached per context group. Recently we started creating an offscreen context before any onscreen contexts, which meant that our onscreen specific extensions were never being reported. This CL keeps the cacheing for the context specific extensions and adds in the surface specific extensions.
TEST=use chrome://tracing to verify that HandlePostSubBuffer is being called in the GPU process on a CrOS device
BUG=none
Review URL: https://chromiumcodereview.appspot.com/10673002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@144271 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | gpu/command_buffer/service/feature_info.cc | 21 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 9 | ||||
-rw-r--r-- | ui/gl/gl_context.cc | 16 | ||||
-rw-r--r-- | ui/gl/gl_surface.cc | 13 | ||||
-rw-r--r-- | ui/gl/gl_surface.h | 4 | ||||
-rw-r--r-- | webkit/gpu/webgraphicscontext3d_in_process_impl.cc | 12 |
6 files changed, 34 insertions, 41 deletions
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index 85d044d..77baf1b 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc @@ -9,7 +9,6 @@ #include "base/string_number_conversions.h" #include "base/string_util.h" #include "gpu/command_buffer/service/gl_utils.h" -#include "ui/gl/gl_context.h" #include "ui/gl/gl_implementation.h" #if defined(OS_MACOSX) #include "ui/surface/io_surface_support_mac.h" @@ -21,9 +20,9 @@ namespace gles2 { namespace { struct FormatInfo { - GLenum format; - const GLenum* types; - size_t count; + GLenum format; + const GLenum* types; + size_t count; }; } // anonymous namespace. @@ -143,11 +142,7 @@ bool FeatureInfo::Initialize(const DisallowedFeatures& disallowed_features, void FeatureInfo::AddFeatures(const char* desired_features) { // Figure out what extensions to turn on. ExtensionHelper ext( - // Some unittests execute without a context made current - // so fall back to glGetString - gfx::GLContext::GetCurrent() ? - gfx::GLContext::GetCurrent()->GetExtensions().c_str() : - reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)), + reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)), desired_features); // NOTE: We need to check both GL_VENDOR and GL_RENDERER because for example @@ -491,14 +486,6 @@ void FeatureInfo::AddFeatures(const char* desired_features) { enable_texture_half_float_linear; feature_flags_.npot_ok |= npot_ok; - if (ext.HaveAndDesire("GL_CHROMIUM_post_sub_buffer")) { - AddExtensionString("GL_CHROMIUM_post_sub_buffer"); - } - - if (ext.HaveAndDesire("GL_CHROMIUM_front_buffer_cached")) { - AddExtensionString("GL_CHROMIUM_front_buffer_cached"); - } - if (ext.Desire("GL_ANGLE_pack_reverse_row_order") && ext.Have("GL_ANGLE_pack_reverse_row_order")) { AddExtensionString("GL_ANGLE_pack_reverse_row_order"); diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 35941ea..61fa0b8 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -6535,7 +6535,7 @@ error::Error GLES2DecoderImpl::HandlePixelStorei( error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( uint32 immediate_data_size, const gles2::PostSubBufferCHROMIUM& c) { TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandlePostSubBufferCHROMIUM"); - if (!context_->HasExtension("GL_CHROMIUM_post_sub_buffer")) { + if (!surface_->HasExtension("GL_CHROMIUM_post_sub_buffer")) { SetGLError(GL_INVALID_OPERATION, "glPostSubBufferCHROMIUM", "command not supported by surface"); return error::kNoError; @@ -6726,10 +6726,13 @@ error::Error GLES2DecoderImpl::HandleGetString( offset + arraysize(kOESDerivativeExtension), std::string()); } - str = extensions.c_str(); } else { - str = feature_info_->extensions().c_str(); + extensions = feature_info_->extensions().c_str(); } + std::string surface_extensions = surface_->GetExtensions(); + if (!surface_extensions.empty()) + extensions += " " + surface_extensions; + str = extensions.c_str(); } break; default: diff --git a/ui/gl/gl_context.cc b/ui/gl/gl_context.cc index 8652e25..48ef5fb 100644 --- a/ui/gl/gl_context.cc +++ b/ui/gl/gl_context.cc @@ -37,20 +37,8 @@ GLContext::~GLContext() { std::string GLContext::GetExtensions() { DCHECK(IsCurrent(NULL)); - - std::string extensions; - if (GLSurface::GetCurrent()) { - extensions = GLSurface::GetCurrent()->GetExtensions(); - } - - const char* gl_ext = reinterpret_cast<const char*>( - glGetString(GL_EXTENSIONS)); - if (gl_ext) { - extensions += (!extensions.empty() && gl_ext[0]) ? " " : ""; - extensions += gl_ext; - } - - return extensions; + const char* ext = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); + return std::string(ext ? ext : ""); } bool GLContext::HasExtension(const char* name) { diff --git a/ui/gl/gl_surface.cc b/ui/gl/gl_surface.cc index e7efc12..b9040ec 100644 --- a/ui/gl/gl_surface.cc +++ b/ui/gl/gl_surface.cc @@ -75,8 +75,7 @@ bool GLSurface::InitializeOneOff() { GLSurface::GLSurface() {} -bool GLSurface::Initialize() -{ +bool GLSurface::Initialize() { return true; } @@ -92,6 +91,16 @@ std::string GLSurface::GetExtensions() { return std::string(""); } +bool GLSurface::HasExtension(const char* name) { + std::string extensions = GetExtensions(); + extensions += " "; + + std::string delimited_name(name); + delimited_name += " "; + + return extensions.find(delimited_name) != std::string::npos; +} + unsigned int GLSurface::GetBackingFrameBufferObject() { return 0; } diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h index a2483c4..5872ed0 100644 --- a/ui/gl/gl_surface.h +++ b/ui/gl/gl_surface.h @@ -6,6 +6,8 @@ #define UI_GL_GL_SURFACE_H_ #pragma once +#include <string> + #include "base/memory/ref_counted.h" #include "build/build_config.h" #include "ui/gfx/native_widget_types.h" @@ -58,6 +60,8 @@ class GL_EXPORT GLSurface : public base::RefCounted<GLSurface> { // The surface must be current. virtual std::string GetExtensions(); + bool HasExtension(const char* name); + // Returns the internal frame buffer object name if the surface is backed by // FBO. Otherwise returns 0. virtual unsigned int GetBackingFrameBufferObject(); diff --git a/webkit/gpu/webgraphicscontext3d_in_process_impl.cc b/webkit/gpu/webgraphicscontext3d_in_process_impl.cc index f37cd363..6539487 100644 --- a/webkit/gpu/webgraphicscontext3d_in_process_impl.cc +++ b/webkit/gpu/webgraphicscontext3d_in_process_impl.cc @@ -8,6 +8,7 @@ #include <algorithm> #include <string> +#include <vector> #include "base/lazy_instance.h" #include "base/logging.h" @@ -347,7 +348,7 @@ void WebGraphicsContext3DInProcessImpl::prepareTexture() { void WebGraphicsContext3DInProcessImpl::postSubBufferCHROMIUM( int x, int y, int width, int height) { - DCHECK(gl_context_->HasExtension("GL_CHROMIUM_post_sub_buffer")); + DCHECK(gl_surface_->HasExtension("GL_CHROMIUM_post_sub_buffer")); gl_surface_->PostSubBuffer(x, y, width, height); } @@ -1294,6 +1295,9 @@ WebString WebGraphicsContext3DInProcessImpl::getString(WGC3Denum name) { result += " GL_EXT_texture_format_BGRA8888 GL_EXT_read_format_bgra"; } } + std::string surface_extensions = gl_surface_->GetExtensions(); + if (!surface_extensions.empty()) + result += " " + surface_extensions; } else { result = reinterpret_cast<const char*>(glGetString(name)); } @@ -1650,16 +1654,14 @@ void WebGraphicsContext3DInProcessImpl::texImageIOSurface2DCHROMIUM( DELEGATE_TO_GL_5(texStorage2DEXT, TexStorage2DEXT, WGC3Denum, WGC3Dint, WGC3Duint, WGC3Dint, WGC3Dint) -WebGLId WebGraphicsContext3DInProcessImpl::createQueryEXT() -{ +WebGLId WebGraphicsContext3DInProcessImpl::createQueryEXT() { makeContextCurrent(); GLuint o = 0; glGenQueriesARB(1, &o); return o; } -void WebGraphicsContext3DInProcessImpl::deleteQueryEXT(WebGLId query) -{ +void WebGraphicsContext3DInProcessImpl::deleteQueryEXT(WebGLId query) { makeContextCurrent(); glDeleteQueriesARB(1, &query); } |