| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/feature_info.h" | 5 #include "gpu/command_buffer/service/feature_info.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <set> | 9 #include <set> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 // etc. | 208 // etc. |
| 209 // The flag here is for testing only. | 209 // The flag here is for testing only. |
| 210 disable_shader_translator_ = | 210 disable_shader_translator_ = |
| 211 command_line->HasSwitch(switches::kDisableGLSLTranslator); | 211 command_line->HasSwitch(switches::kDisableGLSLTranslator); |
| 212 | 212 |
| 213 unsafe_es3_apis_enabled_ = false; | 213 unsafe_es3_apis_enabled_ = false; |
| 214 | 214 |
| 215 // Default context_type_ to a GLES2 Context. | 215 // Default context_type_ to a GLES2 Context. |
| 216 context_type_ = CONTEXT_TYPE_OPENGLES2; | 216 context_type_ = CONTEXT_TYPE_OPENGLES2; |
| 217 | 217 |
| 218 chromium_color_buffer_float_rgba_available_ = false; | |
| 219 chromium_color_buffer_float_rgb_available_ = false; | |
| 220 ext_color_buffer_float_available_ = false; | 218 ext_color_buffer_float_available_ = false; |
| 221 oes_texture_float_linear_available_ = false; | 219 oes_texture_float_linear_available_ = false; |
| 222 oes_texture_half_float_linear_available_ = false; | 220 oes_texture_half_float_linear_available_ = false; |
| 223 } | 221 } |
| 224 | 222 |
| 225 bool FeatureInfo::Initialize(ContextType context_type, | 223 bool FeatureInfo::Initialize(ContextType context_type, |
| 226 const DisallowedFeatures& disallowed_features) { | 224 const DisallowedFeatures& disallowed_features) { |
| 227 disallowed_features_ = disallowed_features; | 225 disallowed_features_ = disallowed_features; |
| 228 context_type_ = context_type; | 226 context_type_ = context_type; |
| 229 InitializeFeatures(); | 227 InitializeFeatures(); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 GL_RGBA16F); | 291 GL_RGBA16F); |
| 294 validators_.texture_sized_color_renderable_internal_format.AddValue(GL_R32F); | 292 validators_.texture_sized_color_renderable_internal_format.AddValue(GL_R32F); |
| 295 validators_.texture_sized_color_renderable_internal_format.AddValue(GL_RG32F); | 293 validators_.texture_sized_color_renderable_internal_format.AddValue(GL_RG32F); |
| 296 validators_.texture_sized_color_renderable_internal_format.AddValue( | 294 validators_.texture_sized_color_renderable_internal_format.AddValue( |
| 297 GL_RGBA32F); | 295 GL_RGBA32F); |
| 298 validators_.texture_sized_color_renderable_internal_format.AddValue( | 296 validators_.texture_sized_color_renderable_internal_format.AddValue( |
| 299 GL_R11F_G11F_B10F); | 297 GL_R11F_G11F_B10F); |
| 300 } | 298 } |
| 301 | 299 |
| 302 void FeatureInfo::EnableCHROMIUMColorBufferFloatRGBA() { | 300 void FeatureInfo::EnableCHROMIUMColorBufferFloatRGBA() { |
| 303 if (!chromium_color_buffer_float_rgba_available_) | 301 if (!feature_flags_.chromium_color_buffer_float_rgba) |
| 304 return; | 302 return; |
| 305 validators_.texture_internal_format.AddValue(GL_RGBA32F); | 303 validators_.texture_internal_format.AddValue(GL_RGBA32F); |
| 306 validators_.texture_sized_color_renderable_internal_format.AddValue( | 304 validators_.texture_sized_color_renderable_internal_format.AddValue( |
| 307 GL_RGBA32F); | 305 GL_RGBA32F); |
| 308 AddExtensionString("GL_CHROMIUM_color_buffer_float_rgba"); | 306 AddExtensionString("GL_CHROMIUM_color_buffer_float_rgba"); |
| 309 } | 307 } |
| 310 | 308 |
| 311 void FeatureInfo::EnableCHROMIUMColorBufferFloatRGB() { | 309 void FeatureInfo::EnableCHROMIUMColorBufferFloatRGB() { |
| 312 if (!chromium_color_buffer_float_rgb_available_) | 310 if (!feature_flags_.chromium_color_buffer_float_rgb) |
| 313 return; | 311 return; |
| 314 validators_.texture_internal_format.AddValue(GL_RGB32F); | 312 validators_.texture_internal_format.AddValue(GL_RGB32F); |
| 315 validators_.texture_sized_color_renderable_internal_format.AddValue( | 313 validators_.texture_sized_color_renderable_internal_format.AddValue( |
| 316 GL_RGB32F); | 314 GL_RGB32F); |
| 317 AddExtensionString("GL_CHROMIUM_color_buffer_float_rgb"); | 315 AddExtensionString("GL_CHROMIUM_color_buffer_float_rgb"); |
| 318 } | 316 } |
| 319 | 317 |
| 320 void FeatureInfo::EnableOESTextureFloatLinear() { | 318 void FeatureInfo::EnableOESTextureFloatLinear() { |
| 321 if (!oes_texture_float_linear_available_) | 319 if (!oes_texture_float_linear_available_) |
| 322 return; | 320 return; |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 // that compatibility. So if EXT_texture_format_BGRA8888 (but not | 642 // that compatibility. So if EXT_texture_format_BGRA8888 (but not |
| 645 // APPLE_texture_format_BGRA8888) is present on an underlying ES3 context, we | 643 // APPLE_texture_format_BGRA8888) is present on an underlying ES3 context, we |
| 646 // have to choose which one of BGRA vs texture storage we expose. | 644 // have to choose which one of BGRA vs texture storage we expose. |
| 647 // When creating ES2 contexts, we prefer support BGRA to texture storage, so | 645 // When creating ES2 contexts, we prefer support BGRA to texture storage, so |
| 648 // we disable texture storage if only EXT_texture_format_BGRA8888 is present. | 646 // we disable texture storage if only EXT_texture_format_BGRA8888 is present. |
| 649 // If neither is present, we expose texture storage. | 647 // If neither is present, we expose texture storage. |
| 650 // When creating ES3 contexts, we do need to expose texture storage, so we | 648 // When creating ES3 contexts, we do need to expose texture storage, so we |
| 651 // disable BGRA if we have to. | 649 // disable BGRA if we have to. |
| 652 bool has_apple_bgra = extensions.Contains("GL_APPLE_texture_format_BGRA8888"); | 650 bool has_apple_bgra = extensions.Contains("GL_APPLE_texture_format_BGRA8888"); |
| 653 bool has_ext_bgra = extensions.Contains("GL_EXT_texture_format_BGRA8888"); | 651 bool has_ext_bgra = extensions.Contains("GL_EXT_texture_format_BGRA8888"); |
| 654 bool has_bgra = has_ext_bgra || has_apple_bgra || !gl_version_info_->is_es; | 652 bool enable_texture_format_bgra8888 = |
| 653 has_ext_bgra || has_apple_bgra || !gl_version_info_->is_es; |
| 655 | 654 |
| 656 bool has_ext_texture_storage = extensions.Contains("GL_EXT_texture_storage"); | 655 bool has_ext_texture_storage = extensions.Contains("GL_EXT_texture_storage"); |
| 657 bool has_arb_texture_storage = extensions.Contains("GL_ARB_texture_storage"); | 656 bool has_arb_texture_storage = extensions.Contains("GL_ARB_texture_storage"); |
| 658 bool has_texture_storage = | 657 bool has_texture_storage = |
| 659 !workarounds_.disable_texture_storage && | 658 !workarounds_.disable_texture_storage && |
| 660 (has_ext_texture_storage || has_arb_texture_storage || | 659 (has_ext_texture_storage || has_arb_texture_storage || |
| 661 gl_version_info_->is_es3 || gl_version_info_->IsAtLeastGL(4, 2)); | 660 gl_version_info_->is_es3 || gl_version_info_->IsAtLeastGL(4, 2)); |
| 662 | 661 |
| 663 bool enable_texture_format_bgra8888 = has_bgra; | |
| 664 bool enable_texture_storage = has_texture_storage; | 662 bool enable_texture_storage = has_texture_storage; |
| 665 | 663 |
| 666 bool texture_storage_incompatible_with_bgra = | 664 bool texture_storage_incompatible_with_bgra = |
| 667 gl_version_info_->is_es3 && !has_ext_texture_storage && !has_apple_bgra; | 665 gl_version_info_->is_es3 && !has_ext_texture_storage && !has_apple_bgra; |
| 668 if (texture_storage_incompatible_with_bgra && | 666 if (texture_storage_incompatible_with_bgra && |
| 669 enable_texture_format_bgra8888 && enable_texture_storage) { | 667 enable_texture_format_bgra8888 && enable_texture_storage) { |
| 670 switch (context_type_) { | 668 switch (context_type_) { |
| 671 case CONTEXT_TYPE_OPENGLES2: | 669 case CONTEXT_TYPE_OPENGLES2: |
| 672 case CONTEXT_TYPE_WEBGL1: | 670 case CONTEXT_TYPE_WEBGL1: |
| 673 enable_texture_storage = false; | 671 enable_texture_storage = false; |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 | 886 |
| 889 glDeleteFramebuffersEXT(1, &fb_id); | 887 glDeleteFramebuffersEXT(1, &fb_id); |
| 890 glDeleteTextures(1, &tex_id); | 888 glDeleteTextures(1, &tex_id); |
| 891 | 889 |
| 892 glBindFramebufferEXT(GL_FRAMEBUFFER, static_cast<GLuint>(fb_binding)); | 890 glBindFramebufferEXT(GL_FRAMEBUFFER, static_cast<GLuint>(fb_binding)); |
| 893 glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(tex_binding)); | 891 glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(tex_binding)); |
| 894 | 892 |
| 895 DCHECK(glGetError() == GL_NO_ERROR); | 893 DCHECK(glGetError() == GL_NO_ERROR); |
| 896 | 894 |
| 897 if (status_rgba == GL_FRAMEBUFFER_COMPLETE) { | 895 if (status_rgba == GL_FRAMEBUFFER_COMPLETE) { |
| 898 chromium_color_buffer_float_rgba_available_ = true; | 896 feature_flags_.chromium_color_buffer_float_rgba = true; |
| 899 if (!disallowed_features_.chromium_color_buffer_float_rgba) | 897 if (!disallowed_features_.chromium_color_buffer_float_rgba) |
| 900 EnableCHROMIUMColorBufferFloatRGBA(); | 898 EnableCHROMIUMColorBufferFloatRGBA(); |
| 901 } | 899 } |
| 902 if (status_rgb == GL_FRAMEBUFFER_COMPLETE) { | 900 if (status_rgb == GL_FRAMEBUFFER_COMPLETE) { |
| 903 chromium_color_buffer_float_rgb_available_ = true; | 901 feature_flags_.chromium_color_buffer_float_rgb = true; |
| 904 if (!disallowed_features_.chromium_color_buffer_float_rgb) | 902 if (!disallowed_features_.chromium_color_buffer_float_rgb) |
| 905 EnableCHROMIUMColorBufferFloatRGB(); | 903 EnableCHROMIUMColorBufferFloatRGB(); |
| 906 } | 904 } |
| 907 } | 905 } |
| 908 | 906 |
| 909 // Enable the GL_EXT_color_buffer_float extension for WebGL 2.0 | 907 // Enable the GL_EXT_color_buffer_float extension for WebGL 2.0 |
| 910 if (enable_ext_color_buffer_float && IsES3Capable()) { | 908 if (enable_ext_color_buffer_float && IsES3Capable()) { |
| 911 ext_color_buffer_float_available_ = true; | 909 ext_color_buffer_float_available_ = true; |
| 912 if (!disallowed_features_.ext_color_buffer_float) | 910 if (!disallowed_features_.ext_color_buffer_float) |
| 913 EnableEXTColorBufferFloat(); | 911 EnableEXTColorBufferFloat(); |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1097 if (extensions.Contains("GL_ANGLE_texture_usage")) { | 1095 if (extensions.Contains("GL_ANGLE_texture_usage")) { |
| 1098 feature_flags_.angle_texture_usage = true; | 1096 feature_flags_.angle_texture_usage = true; |
| 1099 AddExtensionString("GL_ANGLE_texture_usage"); | 1097 AddExtensionString("GL_ANGLE_texture_usage"); |
| 1100 validators_.texture_parameter.AddValue(GL_TEXTURE_USAGE_ANGLE); | 1098 validators_.texture_parameter.AddValue(GL_TEXTURE_USAGE_ANGLE); |
| 1101 } | 1099 } |
| 1102 | 1100 |
| 1103 if (enable_texture_storage) { | 1101 if (enable_texture_storage) { |
| 1104 feature_flags_.ext_texture_storage = true; | 1102 feature_flags_.ext_texture_storage = true; |
| 1105 AddExtensionString("GL_EXT_texture_storage"); | 1103 AddExtensionString("GL_EXT_texture_storage"); |
| 1106 validators_.texture_parameter.AddValue(GL_TEXTURE_IMMUTABLE_FORMAT_EXT); | 1104 validators_.texture_parameter.AddValue(GL_TEXTURE_IMMUTABLE_FORMAT_EXT); |
| 1107 if (enable_texture_format_bgra8888) | 1105 if (enable_texture_format_bgra8888) { |
| 1108 validators_.texture_internal_format_storage.AddValue(GL_BGRA8_EXT); | 1106 validators_.texture_internal_format_storage.AddValue(GL_BGRA8_EXT); |
| 1107 validators_.texture_sized_color_renderable_internal_format.AddValue( |
| 1108 GL_BGRA8_EXT); |
| 1109 validators_.texture_sized_texture_filterable_internal_format.AddValue( |
| 1110 GL_BGRA8_EXT); |
| 1111 } |
| 1109 if (enable_texture_float) { | 1112 if (enable_texture_float) { |
| 1110 validators_.texture_internal_format_storage.AddValue(GL_RGBA32F_EXT); | 1113 validators_.texture_internal_format_storage.AddValue(GL_RGBA32F_EXT); |
| 1111 validators_.texture_internal_format_storage.AddValue(GL_RGB32F_EXT); | 1114 validators_.texture_internal_format_storage.AddValue(GL_RGB32F_EXT); |
| 1112 validators_.texture_internal_format_storage.AddValue(GL_ALPHA32F_EXT); | 1115 validators_.texture_internal_format_storage.AddValue(GL_ALPHA32F_EXT); |
| 1113 validators_.texture_internal_format_storage.AddValue( | 1116 validators_.texture_internal_format_storage.AddValue( |
| 1114 GL_LUMINANCE32F_EXT); | 1117 GL_LUMINANCE32F_EXT); |
| 1115 validators_.texture_internal_format_storage.AddValue( | 1118 validators_.texture_internal_format_storage.AddValue( |
| 1116 GL_LUMINANCE_ALPHA32F_EXT); | 1119 GL_LUMINANCE_ALPHA32F_EXT); |
| 1117 } | 1120 } |
| 1118 if (enable_texture_half_float) { | 1121 if (enable_texture_half_float) { |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1470 GL_DRAW_BUFFER13, | 1473 GL_DRAW_BUFFER13, |
| 1471 GL_DRAW_BUFFER14, | 1474 GL_DRAW_BUFFER14, |
| 1472 GL_DRAW_BUFFER15, | 1475 GL_DRAW_BUFFER15, |
| 1473 }; | 1476 }; |
| 1474 if (max_draw_buffers < kTotalDrawBufferEnums) { | 1477 if (max_draw_buffers < kTotalDrawBufferEnums) { |
| 1475 validators_.g_l_state.RemoveValues( | 1478 validators_.g_l_state.RemoveValues( |
| 1476 kDrawBuffers + max_draw_buffers, | 1479 kDrawBuffers + max_draw_buffers, |
| 1477 kTotalDrawBufferEnums - max_draw_buffers); | 1480 kTotalDrawBufferEnums - max_draw_buffers); |
| 1478 } | 1481 } |
| 1479 | 1482 |
| 1483 if (feature_flags_.ext_texture_format_bgra8888) { |
| 1484 validators_.texture_internal_format.AddValue(GL_BGRA8_EXT); |
| 1485 validators_.texture_sized_color_renderable_internal_format.AddValue( |
| 1486 GL_BGRA8_EXT); |
| 1487 validators_.texture_sized_texture_filterable_internal_format.AddValue( |
| 1488 GL_BGRA8_EXT); |
| 1489 } |
| 1490 |
| 1480 unsafe_es3_apis_enabled_ = true; | 1491 unsafe_es3_apis_enabled_ = true; |
| 1481 } | 1492 } |
| 1482 | 1493 |
| 1483 bool FeatureInfo::IsWebGLContext() const { | 1494 bool FeatureInfo::IsWebGLContext() const { |
| 1484 // Switch statement to cause a compile-time error if we miss a case. | 1495 // Switch statement to cause a compile-time error if we miss a case. |
| 1485 switch (context_type_) { | 1496 switch (context_type_) { |
| 1486 case CONTEXT_TYPE_WEBGL1: | 1497 case CONTEXT_TYPE_WEBGL1: |
| 1487 case CONTEXT_TYPE_WEBGL2: | 1498 case CONTEXT_TYPE_WEBGL2: |
| 1488 return true; | 1499 return true; |
| 1489 case CONTEXT_TYPE_OPENGLES2: | 1500 case CONTEXT_TYPE_OPENGLES2: |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1537 if (pos == std::string::npos) { | 1548 if (pos == std::string::npos) { |
| 1538 extensions_ += (extensions_.empty() ? "" : " ") + str; | 1549 extensions_ += (extensions_.empty() ? "" : " ") + str; |
| 1539 } | 1550 } |
| 1540 } | 1551 } |
| 1541 | 1552 |
| 1542 FeatureInfo::~FeatureInfo() { | 1553 FeatureInfo::~FeatureInfo() { |
| 1543 } | 1554 } |
| 1544 | 1555 |
| 1545 } // namespace gles2 | 1556 } // namespace gles2 |
| 1546 } // namespace gpu | 1557 } // namespace gpu |
| OLD | NEW |