summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkbr <kbr@chromium.org>2015-04-03 00:43:31 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-03 07:44:30 +0000
commit0b17446f9591af9377d18c9ccfe50471651d6bc7 (patch)
tree2cea28b415a5c4808a2eb4197a866544520ce3d4
parent937275d070c819e92c6cd9f40a9e33532494ded1 (diff)
downloadchromium_src-0b17446f9591af9377d18c9ccfe50471651d6bc7.zip
chromium_src-0b17446f9591af9377d18c9ccfe50471651d6bc7.tar.gz
chromium_src-0b17446f9591af9377d18c9ccfe50471651d6bc7.tar.bz2
Use the desktop GL core profile on Linux when ES3 support is requested.
Request an OpenGL 4.2 context (the minimum version Chromium's WebGL 2.0 prototype currently requires) on Linux when --enable-unsafe-es3-apis is specified on the command line. Clean up the shader translator's selection of the GLSL output format. BUG=471960 Review URL: https://codereview.chromium.org/1052153002 Cr-Commit-Position: refs/heads/master@{#323658}
-rw-r--r--gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc1
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc33
-rw-r--r--gpu/command_buffer/service/shader_translator.cc25
-rw-r--r--gpu/command_buffer/service/shader_translator.h1
-rw-r--r--gpu/config/gpu_info_collector.cc2
-rw-r--r--ui/gl/gl_context_glx.cc12
-rw-r--r--ui/gl/gl_context_x11.cc3
-rw-r--r--ui/gl/gl_implementation_x11.cc13
-rw-r--r--ui/gl/gl_surface_x11.cc7
9 files changed, 65 insertions, 32 deletions
diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc
index b0cc463..4afe77c1 100644
--- a/gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc
+++ b/gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc
@@ -27,6 +27,7 @@ AsyncPixelTransferManager* AsyncPixelTransferManager::Create(
switch (gfx::GetGLImplementation()) {
case gfx::kGLImplementationOSMesaGL:
case gfx::kGLImplementationDesktopGL:
+ case gfx::kGLImplementationDesktopGLCoreProfile:
case gfx::kGLImplementationEGLGLES2:
return new AsyncPixelTransferManagerIdle(true);
case gfx::kGLImplementationMockGL:
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index d402c93..d1d1d9c 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1690,6 +1690,10 @@ class GLES2DecoderImpl : public GLES2Decoder,
return feature_info_->workarounds();
}
+ const gfx::GLVersionInfo& gl_version() const {
+ return feature_info_->gl_version_info();
+ }
+
bool ShouldDeferDraws() {
return !offscreen_target_frame_buffer_.get() &&
framebuffer_state_.bound_draw_framebuffer.get() == NULL &&
@@ -2739,7 +2743,7 @@ bool GLES2DecoderImpl::Initialize(
bool default_fb = (GetBackbufferServiceId() == 0);
- if (feature_info_->gl_version_info().is_desktop_core_profile) {
+ if (gl_version().is_desktop_core_profile) {
glGetFramebufferAttachmentParameterivEXT(
GL_FRAMEBUFFER,
default_fb ? GL_BACK_LEFT : GL_COLOR_ATTACHMENT0,
@@ -2778,7 +2782,7 @@ bool GLES2DecoderImpl::Initialize(
// mailing list archives. It also implicitly enables the desktop GL
// capability GL_POINT_SPRITE to provide access to the gl_PointCoord
// variable in fragment shaders.
- if (!feature_info_->gl_version_info().BehavesLikeGLES()) {
+ if (!gl_version().BehavesLikeGLES()) {
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
glEnable(GL_POINT_SPRITE);
}
@@ -3016,8 +3020,11 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() {
else
resources.HashFunction = NULL;
ShaderTranslatorInterface::GlslImplementationType implementation_type =
- gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 ?
- ShaderTranslatorInterface::kGlslES : ShaderTranslatorInterface::kGlsl;
+ ShaderTranslatorInterface::kGlsl;
+ if (gl_version().is_es)
+ implementation_type = ShaderTranslatorInterface::kGlslES;
+ else if (gl_version().is_desktop_core_profile)
+ implementation_type = ShaderTranslatorInterface::kGlslCoreProfile;
int driver_bug_workarounds = 0;
if (workarounds().needs_glsl_built_in_function_emulation)
driver_bug_workarounds |= SH_EMULATE_BUILT_IN_FUNCTIONS;
@@ -4589,7 +4596,7 @@ void GLES2DecoderImpl::DoDiscardFramebufferEXT(GLenum target,
}
ScopedRenderTo do_render(framebuffer);
- if (feature_info_->gl_version_info().is_es3) {
+ if (gl_version().is_es3) {
glInvalidateFramebuffer(
target, numAttachments, translated_attachments.get());
} else {
@@ -4771,7 +4778,7 @@ bool GLES2DecoderImpl::GetHelper(
*num_written = 1;
if (params) {
GLint v = 0;
- if (feature_info_->gl_version_info().is_desktop_core_profile) {
+ if (gl_version().is_desktop_core_profile) {
Framebuffer* framebuffer =
GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT);
if (framebuffer) {
@@ -4792,7 +4799,7 @@ bool GLES2DecoderImpl::GetHelper(
*num_written = 1;
if (params) {
GLint v = 0;
- if (feature_info_->gl_version_info().is_desktop_core_profile) {
+ if (gl_version().is_desktop_core_profile) {
Framebuffer* framebuffer =
GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT);
if (framebuffer) {
@@ -4814,7 +4821,7 @@ bool GLES2DecoderImpl::GetHelper(
*num_written = 1;
if (params) {
GLint v = 0;
- if (feature_info_->gl_version_info().is_desktop_core_profile) {
+ if (gl_version().is_desktop_core_profile) {
Framebuffer* framebuffer =
GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT);
if (framebuffer) {
@@ -4845,7 +4852,7 @@ bool GLES2DecoderImpl::GetHelper(
*num_written = 1;
if (params) {
GLint v = 0;
- if (feature_info_->gl_version_info().is_desktop_core_profile) {
+ if (gl_version().is_desktop_core_profile) {
Framebuffer* framebuffer =
GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT);
if (framebuffer) {
@@ -5689,7 +5696,7 @@ void GLES2DecoderImpl::BlitFramebufferHelper(GLint srcX0,
GLenum filter) {
// TODO(sievers): This could be resolved at the GL binding level, but the
// binding process is currently a bit too 'brute force'.
- if (feature_info_->gl_version_info().is_angle) {
+ if (gl_version().is_angle) {
glBlitFramebufferANGLE(
srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
} else if (feature_info_->feature_flags().use_core_framebuffer_multisample) {
@@ -6704,7 +6711,7 @@ bool GLES2DecoderImpl::SimulateAttrib0(
DCHECK(simulated);
*simulated = false;
- if (feature_info_->gl_version_info().BehavesLikeGLES())
+ if (gl_version().BehavesLikeGLES())
return true;
const VertexAttrib* attrib =
@@ -8061,7 +8068,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels(uint32 immediate_data_size,
glGenBuffersARB(1, &buffer);
glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer);
// For ANGLE client version 2, GL_STREAM_READ is not available.
- const GLenum usage_hint = feature_info_->gl_version_info().is_angle ?
+ const GLenum usage_hint = gl_version().is_angle ?
GL_STATIC_DRAW : GL_STREAM_READ;
glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, usage_hint);
GLenum error = glGetError();
@@ -10293,7 +10300,7 @@ void GLES2DecoderImpl::DoSwapBuffers() {
// Ensure the side effects of the copy are visible to the parent
// context. There is no need to do this for ANGLE because it uses a
// single D3D device for all contexts.
- if (!feature_info_->gl_version_info().is_angle)
+ if (!gl_version().is_angle)
glFlush();
}
} else {
diff --git a/gpu/command_buffer/service/shader_translator.cc b/gpu/command_buffer/service/shader_translator.cc
index b4a94fc..bc8b1fa 100644
--- a/gpu/command_buffer/service/shader_translator.cc
+++ b/gpu/command_buffer/service/shader_translator.cc
@@ -117,19 +117,20 @@ bool ShaderTranslator::Init(
g_translator_initializer.Get();
- ShShaderOutput shader_output;
- if (glsl_implementation_type == kGlslES) {
- shader_output = SH_ESSL_OUTPUT;
- } else {
- // TODO(kbr): clean up the tests of shader_spec and
- // gfx::GetGLImplementation(). crbug.com/471960
- if (shader_spec == SH_WEBGL2_SPEC ||
- gfx::GetGLImplementation() ==
- gfx::kGLImplementationDesktopGLCoreProfile) {
- shader_output = SH_GLSL_CORE_OUTPUT;
- } else {
+ ShShaderOutput shader_output = SH_ESSL_OUTPUT;
+ switch (glsl_implementation_type) {
+ case kGlsl:
shader_output = SH_GLSL_COMPATIBILITY_OUTPUT;
- }
+ break;
+ case kGlslCoreProfile:
+ shader_output = SH_GLSL_CORE_OUTPUT;
+ break;
+ case kGlslES:
+ // Handled in initialization above.
+ break;
+ default:
+ NOTREACHED();
+ break;
}
{
diff --git a/gpu/command_buffer/service/shader_translator.h b/gpu/command_buffer/service/shader_translator.h
index 818be5d..68aa1d9 100644
--- a/gpu/command_buffer/service/shader_translator.h
+++ b/gpu/command_buffer/service/shader_translator.h
@@ -33,6 +33,7 @@ class ShaderTranslatorInterface
ShaderTranslatorInterface() {}
enum GlslImplementationType {
kGlsl,
+ kGlslCoreProfile,
kGlslES
};
diff --git a/gpu/config/gpu_info_collector.cc b/gpu/config/gpu_info_collector.cc
index 521f2cd..e9d60b1 100644
--- a/gpu/config/gpu_info_collector.cc
+++ b/gpu/config/gpu_info_collector.cc
@@ -98,7 +98,7 @@ CollectInfoResult CollectGraphicsInfoGL(GPUInfo* gpu_info) {
gpu_info->gl_renderer = GetGLString(GL_RENDERER);
gpu_info->gl_vendor = GetGLString(GL_VENDOR);
- gpu_info->gl_extensions = GetGLString(GL_EXTENSIONS);
+ gpu_info->gl_extensions = context->GetExtensions();
gpu_info->gl_version = GetGLString(GL_VERSION);
std::string glsl_version_string = GetGLString(GL_SHADING_LANGUAGE_VERSION);
diff --git a/ui/gl/gl_context_glx.cc b/ui/gl/gl_context_glx.cc
index e5b1cc1..b7d7e21 100644
--- a/ui/gl/gl_context_glx.cc
+++ b/ui/gl/gl_context_glx.cc
@@ -38,6 +38,18 @@ bool GLContextGLX::Initialize(
if (GLSurfaceGLX::IsCreateContextSupported()) {
DVLOG(1) << "GLX_ARB_create_context supported.";
std::vector<int> attribs;
+ if (gfx::GetGLImplementation() ==
+ gfx::kGLImplementationDesktopGLCoreProfile) {
+ // TODO(kbr): NVIDIA's driver doesn't return a later context
+ // version if any version later than 3.1 is requested. We
+ // explicitly want to request a 3.2+ context with no support for
+ // the compatibility profile. WebGL 2.0 support currently
+ // requires a 4.2 context. crbug.com/473427
+ attribs.push_back(GLX_CONTEXT_MAJOR_VERSION_ARB);
+ attribs.push_back(4);
+ attribs.push_back(GLX_CONTEXT_MINOR_VERSION_ARB);
+ attribs.push_back(2);
+ }
if (GLSurfaceGLX::IsCreateContextRobustnessSupported()) {
DVLOG(1) << "GLX_ARB_create_context_robustness supported.";
attribs.push_back(GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB);
diff --git a/ui/gl/gl_context_x11.cc b/ui/gl/gl_context_x11.cc
index b17364d..dd5e3b8 100644
--- a/ui/gl/gl_context_x11.cc
+++ b/ui/gl/gl_context_x11.cc
@@ -35,7 +35,8 @@ scoped_refptr<GLContext> GLContext::CreateGLContext(
return context;
}
- case kGLImplementationDesktopGL: {
+ case kGLImplementationDesktopGL:
+ case kGLImplementationDesktopGLCoreProfile: {
scoped_refptr<GLContext> context(new GLContextGLX(share_group));
if (!context->Initialize(compatible_surface, gpu_preference))
return NULL;
diff --git a/ui/gl/gl_implementation_x11.cc b/ui/gl/gl_implementation_x11.cc
index b8a7246..32fd369 100644
--- a/ui/gl/gl_implementation_x11.cc
+++ b/ui/gl/gl_implementation_x11.cc
@@ -43,6 +43,10 @@ const char kEGLLibraryName[] = "libEGL.so.1";
} // namespace
void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) {
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableUnsafeES3APIs)) {
+ impls->push_back(kGLImplementationDesktopGLCoreProfile);
+ }
impls->push_back(kGLImplementationDesktopGL);
impls->push_back(kGLImplementationEGLGLES2);
impls->push_back(kGLImplementationOSMesaGL);
@@ -63,7 +67,8 @@ bool InitializeStaticGLBindings(GLImplementation implementation) {
switch (implementation) {
case kGLImplementationOSMesaGL:
return InitializeStaticGLBindingsOSMesaGL();
- case kGLImplementationDesktopGL: {
+ case kGLImplementationDesktopGL:
+ case kGLImplementationDesktopGLCoreProfile: {
base::NativeLibrary library = NULL;
const base::CommandLine* command_line =
base::CommandLine::ForCurrentProcess();
@@ -91,7 +96,7 @@ bool InitializeStaticGLBindings(GLImplementation implementation) {
SetGLGetProcAddressProc(get_proc_address);
AddGLNativeLibrary(library);
- SetGLImplementation(kGLImplementationDesktopGL);
+ SetGLImplementation(implementation);
InitializeStaticGLBindingsGL();
InitializeStaticGLBindingsGLX();
@@ -151,7 +156,8 @@ bool InitializeDynamicGLBindings(GLImplementation implementation,
GLContext* context) {
switch (implementation) {
case kGLImplementationOSMesaGL:
- case kGLImplementationDesktopGL:
+ case kGLImplementationDesktopGL:
+ case kGLImplementationDesktopGLCoreProfile:
case kGLImplementationEGLGLES2:
InitializeDynamicGLBindingsGL(context);
break;
@@ -191,6 +197,7 @@ void ClearGLBindings() {
bool GetGLWindowSystemBindingInfo(GLWindowSystemBindingInfo* info) {
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
+ case kGLImplementationDesktopGLCoreProfile:
return GetGLWindowSystemBindingInfoGLX(info);
case kGLImplementationEGLGLES2:
return GetGLWindowSystemBindingInfoEGL(info);
diff --git a/ui/gl/gl_surface_x11.cc b/ui/gl/gl_surface_x11.cc
index a384147..63b0e96 100644
--- a/ui/gl/gl_surface_x11.cc
+++ b/ui/gl/gl_surface_x11.cc
@@ -52,6 +52,7 @@ class NativeViewGLSurfaceOSMesa : public GLSurfaceOSMesa {
bool GLSurface::InitializeOneOffInternal() {
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
+ case kGLImplementationDesktopGLCoreProfile:
if (!GLSurfaceGLX::InitializeOneOff()) {
LOG(ERROR) << "GLSurfaceGLX::InitializeOneOff failed.";
return false;
@@ -283,7 +284,8 @@ scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface(
return surface;
}
- case kGLImplementationDesktopGL: {
+ case kGLImplementationDesktopGL:
+ case kGLImplementationDesktopGLCoreProfile: {
scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceGLX(window));
if (!surface->Initialize())
return NULL;
@@ -318,7 +320,8 @@ scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface(
return surface;
}
- case kGLImplementationDesktopGL: {
+ case kGLImplementationDesktopGL:
+ case kGLImplementationDesktopGLCoreProfile: {
scoped_refptr<GLSurface> surface(new PbufferGLSurfaceGLX(size));
if (!surface->Initialize())
return NULL;