Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / gpu / command_buffer / service / feature_info.cc
index e853d9b..b06292a 100644 (file)
@@ -132,6 +132,7 @@ FeatureInfo::FeatureFlags::FeatureFlags()
       enable_shader_name_hashing(false),
       enable_samplers(false),
       ext_draw_buffers(false),
+      nv_draw_buffers(false),
       ext_frag_depth(false),
       ext_shader_texture_lod(false),
       use_async_readpixels(false),
@@ -142,7 +143,9 @@ FeatureInfo::FeatureFlags::FeatureFlags()
       is_swiftshader(false),
       angle_texture_usage(false),
       ext_texture_storage(false),
-      chromium_path_rendering(false) {
+      chromium_path_rendering(false),
+      blend_equation_advanced(false),
+      blend_equation_advanced_coherent(false) {
 }
 
 FeatureInfo::Workarounds::Workarounds() :
@@ -391,6 +394,20 @@ void FeatureInfo::InitializeFeatures() {
     validators_.index_type.AddValue(GL_UNSIGNED_INT);
   }
 
+  if (is_es3 || extensions.Contains("GL_EXT_sRGB") ||
+      gfx::HasDesktopGLFeatures()) {
+    AddExtensionString("GL_EXT_sRGB");
+    texture_format_validators_[GL_SRGB_EXT].AddValue(GL_UNSIGNED_BYTE);
+    texture_format_validators_[GL_SRGB_ALPHA_EXT].AddValue(GL_UNSIGNED_BYTE);
+    validators_.texture_internal_format.AddValue(GL_SRGB_EXT);
+    validators_.texture_internal_format.AddValue(GL_SRGB_ALPHA_EXT);
+    validators_.texture_format.AddValue(GL_SRGB_EXT);
+    validators_.texture_format.AddValue(GL_SRGB_ALPHA_EXT);
+    validators_.render_buffer_format.AddValue(GL_SRGB8_ALPHA8_EXT);
+    validators_.frame_buffer_parameter.AddValue(
+        GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT);
+  }
+
   bool enable_texture_format_bgra8888 = false;
   bool enable_read_format_bgra = false;
   bool enable_render_buffer_bgra = false;
@@ -760,12 +777,25 @@ void FeatureInfo::InitializeFeatures() {
     validators_.vertex_attribute.AddValue(GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
   }
 
+  bool vendor_agnostic_draw_buffers =
+      extensions.Contains("GL_ARB_draw_buffers") ||
+      extensions.Contains("GL_EXT_draw_buffers");
   if (!workarounds_.disable_ext_draw_buffers &&
-      (extensions.Contains("GL_ARB_draw_buffers") ||
-       extensions.Contains("GL_EXT_draw_buffers"))) {
+      (vendor_agnostic_draw_buffers ||
+       (extensions.Contains("GL_NV_draw_buffers") && is_es3))) {
     AddExtensionString("GL_EXT_draw_buffers");
     feature_flags_.ext_draw_buffers = true;
 
+    // This flag is set to enable emulation of EXT_draw_buffers when we're
+    // running on GLES 3.0+, NV_draw_buffers extension is supported and
+    // glDrawBuffers from GLES 3.0 core has been bound. It toggles using the
+    // NV_draw_buffers extension directive instead of EXT_draw_buffers extension
+    // directive in ESSL 100 shaders translated by ANGLE, enabling them to write
+    // into multiple gl_FragData values, which is not by default possible in
+    // ESSL 100 with core GLES 3.0. For more information, see the
+    // NV_draw_buffers specification.
+    feature_flags_.nv_draw_buffers = !vendor_agnostic_draw_buffers;
+
     GLint max_color_attachments = 0;
     glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &max_color_attachments);
     for (GLenum i = GL_COLOR_ATTACHMENT1_EXT;
@@ -812,6 +842,9 @@ void FeatureInfo::InitializeFeatures() {
   if (workarounds_.disable_egl_khr_fence_sync) {
     gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync = false;
   }
+  if (workarounds_.disable_egl_khr_wait_sync) {
+    gfx::g_driver_egl.ext.b_EGL_KHR_wait_sync = false;
+  }
 #endif
   if (workarounds_.disable_arb_sync)
     gfx::g_driver_gl.ext.b_GL_ARB_sync = false;
@@ -850,6 +883,40 @@ void FeatureInfo::InitializeFeatures() {
     feature_flags_.chromium_sync_query = true;
   }
 
+  bool blend_equation_advanced_coherent =
+    extensions.Contains("GL_NV_blend_equation_advanced_coherent") ||
+    extensions.Contains("GL_KHR_blend_equation_advanced_coherent");
+
+  if (blend_equation_advanced_coherent ||
+      extensions.Contains("GL_NV_blend_equation_advanced") ||
+      extensions.Contains("GL_KHR_blend_equation_advanced")) {
+    const GLenum equations[] = {GL_MULTIPLY_KHR,
+                                GL_SCREEN_KHR,
+                                GL_OVERLAY_KHR,
+                                GL_DARKEN_KHR,
+                                GL_LIGHTEN_KHR,
+                                GL_COLORDODGE_KHR,
+                                GL_COLORBURN_KHR,
+                                GL_HARDLIGHT_KHR,
+                                GL_SOFTLIGHT_KHR,
+                                GL_DIFFERENCE_KHR,
+                                GL_EXCLUSION_KHR,
+                                GL_HSL_HUE_KHR,
+                                GL_HSL_SATURATION_KHR,
+                                GL_HSL_COLOR_KHR,
+                                GL_HSL_LUMINOSITY_KHR};
+
+    for (GLenum equation : equations)
+      validators_.equation.AddValue(equation);
+    if (blend_equation_advanced_coherent)
+      AddExtensionString("GL_KHR_blend_equation_advanced_coherent");
+
+    AddExtensionString("GL_KHR_blend_equation_advanced");
+    feature_flags_.blend_equation_advanced = true;
+    feature_flags_.blend_equation_advanced_coherent =
+      blend_equation_advanced_coherent;
+  }
+
   if (extensions.Contains("GL_NV_path_rendering")) {
     if (extensions.Contains("GL_EXT_direct_state_access") || is_es3) {
       AddExtensionString("GL_CHROMIUM_path_rendering");