Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index f2db39fce59d224f5c1faeabb9306f7eec10f827..607db13959ac09d66e940321a1338136a213dfe0 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -868,6 +868,10 @@ class GLES2DecoderImpl : public GLES2Decoder, |
return true; |
} |
+ bool IsWebGLContext() const { |
+ return webgl_version_ == 1 || webgl_version_ == 2; |
+ } |
+ |
bool IsOffscreenBufferMultisampled() const { |
return offscreen_target_samples_ > 1; |
} |
@@ -1972,12 +1976,17 @@ class GLES2DecoderImpl : public GLES2Decoder, |
bool reset_by_robustness_extension_; |
bool supports_post_sub_buffer_; |
+ // Indicates whether this is a context for WebGL1, WebGL2, or others. |
+ // 0: other types |
+ // 1: WebGL 1 |
+ // 2: WebGL 2 |
+ unsigned webgl_version_; |
+ |
// These flags are used to override the state of the shared feature_info_ |
// member. Because the same FeatureInfo instance may be shared among many |
// contexts, the assumptions on the availablity of extensions in WebGL |
// contexts may be broken. These flags override the shared state to preserve |
// WebGL semantics. |
- bool force_webgl_glsl_validation_; |
bool derivatives_explicitly_enabled_; |
bool frag_depth_explicitly_enabled_; |
bool draw_buffers_explicitly_enabled_; |
@@ -2516,7 +2525,7 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group) |
context_was_lost_(false), |
reset_by_robustness_extension_(false), |
supports_post_sub_buffer_(false), |
- force_webgl_glsl_validation_(false), |
+ webgl_version_(0), |
derivatives_explicitly_enabled_(false), |
frag_depth_explicitly_enabled_(false), |
draw_buffers_explicitly_enabled_(false), |
@@ -2573,6 +2582,7 @@ bool GLES2DecoderImpl::Initialize( |
ContextCreationAttribHelper attrib_parser; |
if (!attrib_parser.Parse(attribs)) |
return false; |
+ webgl_version_ = attrib_parser.webgl_version; |
surfaceless_ = surface->IsSurfaceless() && !offscreen; |
@@ -2614,23 +2624,30 @@ bool GLES2DecoderImpl::Initialize( |
return false; |
} |
- if (!group_->Initialize(this, disallowed_features)) { |
- LOG(ERROR) << "GpuScheduler::InitializeCommon failed because group " |
- << "failed to initialize."; |
+ disallowed_features_ = disallowed_features; |
+ if (webgl_version_ == 1) { |
+ disallowed_features_.npot_support = true; |
+ } |
+ |
+ if (!group_->Initialize(this, |
+ ContextGroup::GetContextType(webgl_version_), |
+ disallowed_features_)) { |
group_ = NULL; // Must not destroy ContextGroup if it is not initialized. |
Destroy(true); |
return false; |
} |
CHECK_GL_ERROR(); |
- if (attrib_parser.es3_context_required && |
- feature_info_->IsES3Capable()) { |
+ if (webgl_version_ == 2) { |
+ if (!feature_info_->IsES3Capable()) { |
+ LOG(ERROR) << "Underlying driver does not support ES3."; |
+ Destroy(true); |
+ return false; |
+ } |
feature_info_->EnableES3Validators(); |
set_unsafe_es3_apis_enabled(true); |
} |
- disallowed_features_ = disallowed_features; |
- |
state_.attrib_values.resize(group_->max_vertex_attribs()); |
vertex_array_manager_.reset(new VertexArrayManager()); |
@@ -3157,7 +3174,7 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() { |
resources.FragmentPrecisionHigh = |
PrecisionMeetsSpecForHighpFloat(range[0], range[1], precision); |
- if (force_webgl_glsl_validation_) { |
+ if (IsWebGLContext()) { |
resources.OES_standard_derivatives = derivatives_explicitly_enabled_; |
resources.EXT_frag_depth = frag_depth_explicitly_enabled_; |
resources.EXT_draw_buffers = draw_buffers_explicitly_enabled_; |
@@ -3184,8 +3201,8 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() { |
} |
ShShaderSpec shader_spec; |
- if (force_webgl_glsl_validation_) { |
- shader_spec = unsafe_es3_apis_enabled() ? SH_WEBGL2_SPEC : SH_WEBGL_SPEC; |
+ if (IsWebGLContext()) { |
+ shader_spec = webgl_version_ == 2 ? SH_WEBGL2_SPEC : SH_WEBGL_SPEC; |
} else { |
shader_spec = unsafe_es3_apis_enabled() ? SH_GLES3_SPEC : SH_GLES2_SPEC; |
} |
@@ -8804,16 +8821,22 @@ error::Error GLES2DecoderImpl::HandleGetString(uint32 immediate_data_size, |
std::string extensions; |
switch (name) { |
case GL_VERSION: |
- str = "OpenGL ES 2.0 Chromium"; |
+ if (unsafe_es3_apis_enabled()) |
+ str = "OpenGL ES 3.0 Chromium"; |
+ else |
+ str = "OpenGL ES 2.0 Chromium"; |
break; |
case GL_SHADING_LANGUAGE_VERSION: |
- str = "OpenGL ES GLSL ES 1.0 Chromium"; |
+ if (unsafe_es3_apis_enabled()) |
+ str = "OpenGL ES GLSL ES 3.0 Chromium"; |
+ else |
+ str = "OpenGL ES GLSL ES 1.0 Chromium"; |
break; |
case GL_RENDERER: |
case GL_VENDOR: |
// Return the unmasked VENDOR/RENDERER string for WebGL contexts. |
// They are used by WEBGL_debug_renderer_info. |
- if (!force_webgl_glsl_validation_) |
+ if (!IsWebGLContext()) |
str = "Chromium"; |
else |
str = reinterpret_cast<const char*>(glGetString(name)); |
@@ -8822,7 +8845,7 @@ error::Error GLES2DecoderImpl::HandleGetString(uint32 immediate_data_size, |
{ |
// For WebGL contexts, strip out the OES derivatives and |
// EXT frag depth extensions if they have not been enabled. |
- if (force_webgl_glsl_validation_) { |
+ if (IsWebGLContext()) { |
extensions = feature_info_->extensions(); |
if (!derivatives_explicitly_enabled_) { |
size_t offset = extensions.find(kOESDerivativeExtension); |
@@ -11131,9 +11154,6 @@ error::Error GLES2DecoderImpl::HandleEnableFeatureCHROMIUM( |
// needs to be done it seems like refactoring for one to one of those |
// methods is a very low priority. |
const_cast<Validators*>(validators_)->vertex_attrib_type.AddValue(GL_FIXED); |
- } else if (feature_str.compare("webgl_enable_glsl_webgl_validation") == 0) { |
- force_webgl_glsl_validation_ = true; |
- InitializeShaderTranslator(); |
} else { |
return error::kNoError; |
} |
@@ -11169,13 +11189,11 @@ error::Error GLES2DecoderImpl::HandleRequestExtensionCHROMIUM( |
return error::kInvalidArguments; |
} |
- bool desire_webgl_glsl_validation = |
- feature_str.find("GL_CHROMIUM_webglsl") != std::string::npos; |
bool desire_standard_derivatives = false; |
bool desire_frag_depth = false; |
bool desire_draw_buffers = false; |
bool desire_shader_texture_lod = false; |
- if (force_webgl_glsl_validation_) { |
+ if (IsWebGLContext()) { |
desire_standard_derivatives = |
feature_str.find("GL_OES_standard_derivatives") != std::string::npos; |
desire_frag_depth = |
@@ -11186,11 +11204,10 @@ error::Error GLES2DecoderImpl::HandleRequestExtensionCHROMIUM( |
feature_str.find("GL_EXT_shader_texture_lod") != std::string::npos; |
} |
- if (desire_webgl_glsl_validation != force_webgl_glsl_validation_ || |
- desire_standard_derivatives != derivatives_explicitly_enabled_ || |
+ if (desire_standard_derivatives != derivatives_explicitly_enabled_ || |
desire_frag_depth != frag_depth_explicitly_enabled_ || |
- desire_draw_buffers != draw_buffers_explicitly_enabled_) { |
- force_webgl_glsl_validation_ |= desire_webgl_glsl_validation; |
+ desire_draw_buffers != draw_buffers_explicitly_enabled_ || |
+ desire_shader_texture_lod != shader_texture_lod_explicitly_enabled_) { |
derivatives_explicitly_enabled_ |= desire_standard_derivatives; |
frag_depth_explicitly_enabled_ |= desire_frag_depth; |
draw_buffers_explicitly_enabled_ |= desire_draw_buffers; |