Chromium Code Reviews| 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/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cmath> | 10 #include <cmath> |
| (...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 834 } | 834 } |
| 835 | 835 |
| 836 bool EnsureGPUMemoryAvailable(size_t estimated_size) { | 836 bool EnsureGPUMemoryAvailable(size_t estimated_size) { |
| 837 MemoryTracker* tracker = memory_tracker(); | 837 MemoryTracker* tracker = memory_tracker(); |
| 838 if (tracker) { | 838 if (tracker) { |
| 839 return tracker->EnsureGPUMemoryAvailable(estimated_size); | 839 return tracker->EnsureGPUMemoryAvailable(estimated_size); |
| 840 } | 840 } |
| 841 return true; | 841 return true; |
| 842 } | 842 } |
| 843 | 843 |
| 844 bool IsWebGLContext() const { | |
| 845 return webgl_version_ == 1 || webgl_version_ == 2; | |
| 846 } | |
| 847 | |
| 844 bool IsOffscreenBufferMultisampled() const { | 848 bool IsOffscreenBufferMultisampled() const { |
| 845 return offscreen_target_samples_ > 1; | 849 return offscreen_target_samples_ > 1; |
| 846 } | 850 } |
| 847 | 851 |
| 848 // Creates a Texture for the given texture. | 852 // Creates a Texture for the given texture. |
| 849 TextureRef* CreateTexture( | 853 TextureRef* CreateTexture( |
| 850 GLuint client_id, GLuint service_id) { | 854 GLuint client_id, GLuint service_id) { |
| 851 return texture_manager()->CreateTexture(client_id, service_id); | 855 return texture_manager()->CreateTexture(client_id, service_id); |
| 852 } | 856 } |
| 853 | 857 |
| (...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1938 | 1942 |
| 1939 // Number of commands remaining to be processed in DoCommands(). | 1943 // Number of commands remaining to be processed in DoCommands(). |
| 1940 int commands_to_process_; | 1944 int commands_to_process_; |
| 1941 | 1945 |
| 1942 bool has_robustness_extension_; | 1946 bool has_robustness_extension_; |
| 1943 error::ContextLostReason context_lost_reason_; | 1947 error::ContextLostReason context_lost_reason_; |
| 1944 bool context_was_lost_; | 1948 bool context_was_lost_; |
| 1945 bool reset_by_robustness_extension_; | 1949 bool reset_by_robustness_extension_; |
| 1946 bool supports_post_sub_buffer_; | 1950 bool supports_post_sub_buffer_; |
| 1947 | 1951 |
| 1952 // Indicates whether this is a context for WebGL1, WebGL2, or others. | |
| 1953 // 0: other types | |
| 1954 // 1: WebGL 1 | |
| 1955 // 2: WebGL 2 | |
| 1956 unsigned webgl_version_; | |
| 1957 | |
| 1948 // These flags are used to override the state of the shared feature_info_ | 1958 // These flags are used to override the state of the shared feature_info_ |
| 1949 // member. Because the same FeatureInfo instance may be shared among many | 1959 // member. Because the same FeatureInfo instance may be shared among many |
| 1950 // contexts, the assumptions on the availablity of extensions in WebGL | 1960 // contexts, the assumptions on the availablity of extensions in WebGL |
| 1951 // contexts may be broken. These flags override the shared state to preserve | 1961 // contexts may be broken. These flags override the shared state to preserve |
| 1952 // WebGL semantics. | 1962 // WebGL semantics. |
| 1953 bool force_webgl_glsl_validation_; | |
| 1954 bool derivatives_explicitly_enabled_; | 1963 bool derivatives_explicitly_enabled_; |
| 1955 bool frag_depth_explicitly_enabled_; | 1964 bool frag_depth_explicitly_enabled_; |
| 1956 bool draw_buffers_explicitly_enabled_; | 1965 bool draw_buffers_explicitly_enabled_; |
| 1957 bool shader_texture_lod_explicitly_enabled_; | 1966 bool shader_texture_lod_explicitly_enabled_; |
| 1958 | 1967 |
| 1959 bool compile_shader_always_succeeds_; | 1968 bool compile_shader_always_succeeds_; |
| 1960 | 1969 |
| 1961 // An optional behaviour to lose the context and group when OOM. | 1970 // An optional behaviour to lose the context and group when OOM. |
| 1962 bool lose_context_when_out_of_memory_; | 1971 bool lose_context_when_out_of_memory_; |
| 1963 | 1972 |
| (...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2482 current_decoder_error_(error::kNoError), | 2491 current_decoder_error_(error::kNoError), |
| 2483 use_shader_translator_(true), | 2492 use_shader_translator_(true), |
| 2484 validators_(group_->feature_info()->validators()), | 2493 validators_(group_->feature_info()->validators()), |
| 2485 feature_info_(group_->feature_info()), | 2494 feature_info_(group_->feature_info()), |
| 2486 frame_number_(0), | 2495 frame_number_(0), |
| 2487 has_robustness_extension_(false), | 2496 has_robustness_extension_(false), |
| 2488 context_lost_reason_(error::kUnknown), | 2497 context_lost_reason_(error::kUnknown), |
| 2489 context_was_lost_(false), | 2498 context_was_lost_(false), |
| 2490 reset_by_robustness_extension_(false), | 2499 reset_by_robustness_extension_(false), |
| 2491 supports_post_sub_buffer_(false), | 2500 supports_post_sub_buffer_(false), |
| 2492 force_webgl_glsl_validation_(false), | 2501 webgl_version_(0), |
| 2493 derivatives_explicitly_enabled_(false), | 2502 derivatives_explicitly_enabled_(false), |
| 2494 frag_depth_explicitly_enabled_(false), | 2503 frag_depth_explicitly_enabled_(false), |
| 2495 draw_buffers_explicitly_enabled_(false), | 2504 draw_buffers_explicitly_enabled_(false), |
| 2496 shader_texture_lod_explicitly_enabled_(false), | 2505 shader_texture_lod_explicitly_enabled_(false), |
| 2497 compile_shader_always_succeeds_(false), | 2506 compile_shader_always_succeeds_(false), |
| 2498 lose_context_when_out_of_memory_(false), | 2507 lose_context_when_out_of_memory_(false), |
| 2499 service_logging_(base::CommandLine::ForCurrentProcess()->HasSwitch( | 2508 service_logging_(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 2500 switches::kEnableGPUServiceLoggingGPU)), | 2509 switches::kEnableGPUServiceLoggingGPU)), |
| 2501 viewport_max_width_(0), | 2510 viewport_max_width_(0), |
| 2502 viewport_max_height_(0), | 2511 viewport_max_height_(0), |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2539 const DisallowedFeatures& disallowed_features, | 2548 const DisallowedFeatures& disallowed_features, |
| 2540 const std::vector<int32>& attribs) { | 2549 const std::vector<int32>& attribs) { |
| 2541 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); | 2550 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); |
| 2542 DCHECK(context->IsCurrent(surface.get())); | 2551 DCHECK(context->IsCurrent(surface.get())); |
| 2543 DCHECK(!context_.get()); | 2552 DCHECK(!context_.get()); |
| 2544 DCHECK(!offscreen || !offscreen_size.IsEmpty()); | 2553 DCHECK(!offscreen || !offscreen_size.IsEmpty()); |
| 2545 | 2554 |
| 2546 ContextCreationAttribHelper attrib_parser; | 2555 ContextCreationAttribHelper attrib_parser; |
| 2547 if (!attrib_parser.Parse(attribs)) | 2556 if (!attrib_parser.Parse(attribs)) |
| 2548 return false; | 2557 return false; |
| 2558 webgl_version_ = attrib_parser.webgl_version; | |
| 2549 | 2559 |
| 2550 surfaceless_ = surface->IsSurfaceless() && !offscreen; | 2560 surfaceless_ = surface->IsSurfaceless() && !offscreen; |
| 2551 | 2561 |
| 2552 set_initialized(); | 2562 set_initialized(); |
| 2553 gpu_state_tracer_ = GPUStateTracer::Create(&state_); | 2563 gpu_state_tracer_ = GPUStateTracer::Create(&state_); |
| 2554 | 2564 |
| 2555 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 2565 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 2556 switches::kEnableGPUDebugging)) { | 2566 switches::kEnableGPUDebugging)) { |
| 2557 set_debug(true); | 2567 set_debug(true); |
| 2558 } | 2568 } |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 2580 | 2590 |
| 2581 // If the failIfMajorPerformanceCaveat context creation attribute was true | 2591 // If the failIfMajorPerformanceCaveat context creation attribute was true |
| 2582 // and we are using a software renderer, fail. | 2592 // and we are using a software renderer, fail. |
| 2583 if (attrib_parser.fail_if_major_perf_caveat && | 2593 if (attrib_parser.fail_if_major_perf_caveat && |
| 2584 feature_info_->feature_flags().is_swiftshader) { | 2594 feature_info_->feature_flags().is_swiftshader) { |
| 2585 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. | 2595 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. |
| 2586 Destroy(true); | 2596 Destroy(true); |
| 2587 return false; | 2597 return false; |
| 2588 } | 2598 } |
| 2589 | 2599 |
| 2590 if (!group_->Initialize(this, disallowed_features)) { | 2600 disallowed_features_ = disallowed_features; |
| 2601 if (webgl_version_ == 1) { | |
| 2602 disallowed_features_.npot_support = true; | |
| 2603 } | |
| 2604 | |
| 2605 if (!group_->Initialize(this, disallowed_features_)) { | |
| 2591 LOG(ERROR) << "GpuScheduler::InitializeCommon failed because group " | 2606 LOG(ERROR) << "GpuScheduler::InitializeCommon failed because group " |
| 2592 << "failed to initialize."; | 2607 << "failed to initialize."; |
| 2593 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. | 2608 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. |
| 2594 Destroy(true); | 2609 Destroy(true); |
| 2595 return false; | 2610 return false; |
| 2596 } | 2611 } |
| 2597 CHECK_GL_ERROR(); | 2612 CHECK_GL_ERROR(); |
| 2598 | 2613 |
| 2599 if (attrib_parser.es3_context_required && | 2614 if (feature_info_->IsES3Capable()) { |
|
piman
2015/06/08 21:40:21
Don't we want to keep this? I assume we don't want
Zhenyao Mo
2015/06/08 22:23:22
I am OK with only exposing ES3 for WebGL 2 for now
| |
| 2600 feature_info_->IsES3Capable()) { | |
| 2601 feature_info_->EnableES3Validators(); | 2615 feature_info_->EnableES3Validators(); |
| 2602 set_unsafe_es3_apis_enabled(true); | 2616 set_unsafe_es3_apis_enabled(true); |
| 2603 } | 2617 } |
| 2604 | 2618 |
| 2605 disallowed_features_ = disallowed_features; | |
| 2606 | |
| 2607 state_.attrib_values.resize(group_->max_vertex_attribs()); | 2619 state_.attrib_values.resize(group_->max_vertex_attribs()); |
| 2608 vertex_array_manager_.reset(new VertexArrayManager()); | 2620 vertex_array_manager_.reset(new VertexArrayManager()); |
| 2609 | 2621 |
| 2610 GLuint default_vertex_attrib_service_id = 0; | 2622 GLuint default_vertex_attrib_service_id = 0; |
| 2611 if (features().native_vertex_array_object) { | 2623 if (features().native_vertex_array_object) { |
| 2612 glGenVertexArraysOES(1, &default_vertex_attrib_service_id); | 2624 glGenVertexArraysOES(1, &default_vertex_attrib_service_id); |
| 2613 glBindVertexArrayOES(default_vertex_attrib_service_id); | 2625 glBindVertexArrayOES(default_vertex_attrib_service_id); |
| 2614 } | 2626 } |
| 2615 | 2627 |
| 2616 state_.default_vertex_attrib_manager = | 2628 state_.default_vertex_attrib_manager = |
| (...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3123 resources.MaxExpressionComplexity = 256; | 3135 resources.MaxExpressionComplexity = 256; |
| 3124 resources.MaxCallStackDepth = 256; | 3136 resources.MaxCallStackDepth = 256; |
| 3125 | 3137 |
| 3126 GLint range[2] = { 0, 0 }; | 3138 GLint range[2] = { 0, 0 }; |
| 3127 GLint precision = 0; | 3139 GLint precision = 0; |
| 3128 GetShaderPrecisionFormatImpl(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, | 3140 GetShaderPrecisionFormatImpl(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, |
| 3129 range, &precision); | 3141 range, &precision); |
| 3130 resources.FragmentPrecisionHigh = | 3142 resources.FragmentPrecisionHigh = |
| 3131 PrecisionMeetsSpecForHighpFloat(range[0], range[1], precision); | 3143 PrecisionMeetsSpecForHighpFloat(range[0], range[1], precision); |
| 3132 | 3144 |
| 3133 if (force_webgl_glsl_validation_) { | 3145 if (IsWebGLContext()) { |
| 3134 resources.OES_standard_derivatives = derivatives_explicitly_enabled_; | 3146 resources.OES_standard_derivatives = derivatives_explicitly_enabled_; |
| 3135 resources.EXT_frag_depth = frag_depth_explicitly_enabled_; | 3147 resources.EXT_frag_depth = frag_depth_explicitly_enabled_; |
| 3136 resources.EXT_draw_buffers = draw_buffers_explicitly_enabled_; | 3148 resources.EXT_draw_buffers = draw_buffers_explicitly_enabled_; |
| 3137 if (!draw_buffers_explicitly_enabled_) | 3149 if (!draw_buffers_explicitly_enabled_) |
| 3138 resources.MaxDrawBuffers = 1; | 3150 resources.MaxDrawBuffers = 1; |
| 3139 resources.EXT_shader_texture_lod = shader_texture_lod_explicitly_enabled_; | 3151 resources.EXT_shader_texture_lod = shader_texture_lod_explicitly_enabled_; |
| 3140 resources.NV_draw_buffers = | 3152 resources.NV_draw_buffers = |
| 3141 draw_buffers_explicitly_enabled_ && features().nv_draw_buffers; | 3153 draw_buffers_explicitly_enabled_ && features().nv_draw_buffers; |
| 3142 } else { | 3154 } else { |
| 3143 resources.OES_standard_derivatives = | 3155 resources.OES_standard_derivatives = |
| 3144 features().oes_standard_derivatives ? 1 : 0; | 3156 features().oes_standard_derivatives ? 1 : 0; |
| 3145 resources.ARB_texture_rectangle = | 3157 resources.ARB_texture_rectangle = |
| 3146 features().arb_texture_rectangle ? 1 : 0; | 3158 features().arb_texture_rectangle ? 1 : 0; |
| 3147 resources.OES_EGL_image_external = | 3159 resources.OES_EGL_image_external = |
| 3148 features().oes_egl_image_external ? 1 : 0; | 3160 features().oes_egl_image_external ? 1 : 0; |
| 3149 resources.EXT_draw_buffers = | 3161 resources.EXT_draw_buffers = |
| 3150 features().ext_draw_buffers ? 1 : 0; | 3162 features().ext_draw_buffers ? 1 : 0; |
| 3151 resources.EXT_frag_depth = | 3163 resources.EXT_frag_depth = |
| 3152 features().ext_frag_depth ? 1 : 0; | 3164 features().ext_frag_depth ? 1 : 0; |
| 3153 resources.EXT_shader_texture_lod = | 3165 resources.EXT_shader_texture_lod = |
| 3154 features().ext_shader_texture_lod ? 1 : 0; | 3166 features().ext_shader_texture_lod ? 1 : 0; |
| 3155 resources.NV_draw_buffers = | 3167 resources.NV_draw_buffers = |
| 3156 features().nv_draw_buffers ? 1 : 0; | 3168 features().nv_draw_buffers ? 1 : 0; |
| 3157 } | 3169 } |
| 3158 | 3170 |
| 3159 ShShaderSpec shader_spec; | 3171 ShShaderSpec shader_spec; |
| 3160 if (force_webgl_glsl_validation_) { | 3172 if (IsWebGLContext()) { |
| 3161 shader_spec = unsafe_es3_apis_enabled() ? SH_WEBGL2_SPEC : SH_WEBGL_SPEC; | 3173 shader_spec = webgl_version_ == 2 ? SH_WEBGL2_SPEC : SH_WEBGL_SPEC; |
| 3162 } else { | 3174 } else { |
| 3163 shader_spec = unsafe_es3_apis_enabled() ? SH_GLES3_SPEC : SH_GLES2_SPEC; | 3175 shader_spec = unsafe_es3_apis_enabled() ? SH_GLES3_SPEC : SH_GLES2_SPEC; |
| 3164 } | 3176 } |
| 3165 | 3177 |
| 3166 if ((shader_spec == SH_WEBGL_SPEC || shader_spec == SH_WEBGL2_SPEC) && | 3178 if ((shader_spec == SH_WEBGL_SPEC || shader_spec == SH_WEBGL2_SPEC) && |
| 3167 features().enable_shader_name_hashing) | 3179 features().enable_shader_name_hashing) |
| 3168 resources.HashFunction = &CityHash64; | 3180 resources.HashFunction = &CityHash64; |
| 3169 else | 3181 else |
| 3170 resources.HashFunction = NULL; | 3182 resources.HashFunction = NULL; |
| 3171 ShaderTranslatorInterface::GlslImplementationType implementation_type = | 3183 ShaderTranslatorInterface::GlslImplementationType implementation_type = |
| (...skipping 5603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8775 GLenum name = static_cast<GLenum>(c.name); | 8787 GLenum name = static_cast<GLenum>(c.name); |
| 8776 if (!validators_->string_type.IsValid(name)) { | 8788 if (!validators_->string_type.IsValid(name)) { |
| 8777 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetString", name, "name"); | 8789 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetString", name, "name"); |
| 8778 return error::kNoError; | 8790 return error::kNoError; |
| 8779 } | 8791 } |
| 8780 | 8792 |
| 8781 const char* str = nullptr; | 8793 const char* str = nullptr; |
| 8782 std::string extensions; | 8794 std::string extensions; |
| 8783 switch (name) { | 8795 switch (name) { |
| 8784 case GL_VERSION: | 8796 case GL_VERSION: |
| 8785 str = "OpenGL ES 2.0 Chromium"; | 8797 if (unsafe_es3_apis_enabled()) |
| 8798 str = "OpenGL ES 3.0 Chromium"; | |
| 8799 else | |
| 8800 str = "OpenGL ES 2.0 Chromium"; | |
| 8786 break; | 8801 break; |
| 8787 case GL_SHADING_LANGUAGE_VERSION: | 8802 case GL_SHADING_LANGUAGE_VERSION: |
| 8788 str = "OpenGL ES GLSL ES 1.0 Chromium"; | 8803 if (unsafe_es3_apis_enabled()) |
| 8804 str = "OpenGL ES GLSL ES 3.0 Chromium"; | |
| 8805 else | |
| 8806 str = "OpenGL ES GLSL ES 1.0 Chromium"; | |
| 8789 break; | 8807 break; |
| 8790 case GL_RENDERER: | 8808 case GL_RENDERER: |
| 8791 case GL_VENDOR: | 8809 case GL_VENDOR: |
| 8792 // Return the unmasked VENDOR/RENDERER string for WebGL contexts. | 8810 // Return the unmasked VENDOR/RENDERER string for WebGL contexts. |
| 8793 // They are used by WEBGL_debug_renderer_info. | 8811 // They are used by WEBGL_debug_renderer_info. |
| 8794 if (!force_webgl_glsl_validation_) | 8812 if (!IsWebGLContext()) |
| 8795 str = "Chromium"; | 8813 str = "Chromium"; |
| 8796 else | 8814 else |
| 8797 str = reinterpret_cast<const char*>(glGetString(name)); | 8815 str = reinterpret_cast<const char*>(glGetString(name)); |
| 8798 break; | 8816 break; |
| 8799 case GL_EXTENSIONS: | 8817 case GL_EXTENSIONS: |
| 8800 { | 8818 { |
| 8801 // For WebGL contexts, strip out the OES derivatives and | 8819 // For WebGL contexts, strip out the OES derivatives and |
| 8802 // EXT frag depth extensions if they have not been enabled. | 8820 // EXT frag depth extensions if they have not been enabled. |
| 8803 if (force_webgl_glsl_validation_) { | 8821 if (IsWebGLContext()) { |
| 8804 extensions = feature_info_->extensions(); | 8822 extensions = feature_info_->extensions(); |
| 8805 if (!derivatives_explicitly_enabled_) { | 8823 if (!derivatives_explicitly_enabled_) { |
| 8806 size_t offset = extensions.find(kOESDerivativeExtension); | 8824 size_t offset = extensions.find(kOESDerivativeExtension); |
| 8807 if (std::string::npos != offset) { | 8825 if (std::string::npos != offset) { |
| 8808 extensions.replace(offset, arraysize(kOESDerivativeExtension), | 8826 extensions.replace(offset, arraysize(kOESDerivativeExtension), |
| 8809 std::string()); | 8827 std::string()); |
| 8810 } | 8828 } |
| 8811 } | 8829 } |
| 8812 if (!frag_depth_explicitly_enabled_) { | 8830 if (!frag_depth_explicitly_enabled_) { |
| 8813 size_t offset = extensions.find(kEXTFragDepthExtension); | 8831 size_t offset = extensions.find(kEXTFragDepthExtension); |
| (...skipping 2265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11079 // TODO(gman): decide how to remove the need for this const_cast. | 11097 // TODO(gman): decide how to remove the need for this const_cast. |
| 11080 // I could make validators_ non const but that seems bad as this is the only | 11098 // I could make validators_ non const but that seems bad as this is the only |
| 11081 // place it is needed. I could make some special friend class of validators | 11099 // place it is needed. I could make some special friend class of validators |
| 11082 // just to allow this to set them. That seems silly. I could refactor this | 11100 // just to allow this to set them. That seems silly. I could refactor this |
| 11083 // code to use the extension mechanism or the initialization attributes to | 11101 // code to use the extension mechanism or the initialization attributes to |
| 11084 // turn this feature on. Given that the only real point of this is to make | 11102 // turn this feature on. Given that the only real point of this is to make |
| 11085 // the conformance tests pass and given that there is lots of real work that | 11103 // the conformance tests pass and given that there is lots of real work that |
| 11086 // needs to be done it seems like refactoring for one to one of those | 11104 // needs to be done it seems like refactoring for one to one of those |
| 11087 // methods is a very low priority. | 11105 // methods is a very low priority. |
| 11088 const_cast<Validators*>(validators_)->vertex_attrib_type.AddValue(GL_FIXED); | 11106 const_cast<Validators*>(validators_)->vertex_attrib_type.AddValue(GL_FIXED); |
| 11089 } else if (feature_str.compare("webgl_enable_glsl_webgl_validation") == 0) { | |
| 11090 force_webgl_glsl_validation_ = true; | |
| 11091 InitializeShaderTranslator(); | |
|
Zhenyao Mo
2015/06/07 18:35:07
This second InitializeShaderTranslator() call per
| |
| 11092 } else { | 11107 } else { |
| 11093 return error::kNoError; | 11108 return error::kNoError; |
| 11094 } | 11109 } |
| 11095 | 11110 |
| 11096 *result = 1; // true. | 11111 *result = 1; // true. |
| 11097 return error::kNoError; | 11112 return error::kNoError; |
| 11098 } | 11113 } |
| 11099 | 11114 |
| 11100 error::Error GLES2DecoderImpl::HandleGetRequestableExtensionsCHROMIUM( | 11115 error::Error GLES2DecoderImpl::HandleGetRequestableExtensionsCHROMIUM( |
| 11101 uint32 immediate_data_size, | 11116 uint32 immediate_data_size, |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 11117 *static_cast<const gles2::cmds::RequestExtensionCHROMIUM*>(cmd_data); | 11132 *static_cast<const gles2::cmds::RequestExtensionCHROMIUM*>(cmd_data); |
| 11118 Bucket* bucket = GetBucket(c.bucket_id); | 11133 Bucket* bucket = GetBucket(c.bucket_id); |
| 11119 if (!bucket || bucket->size() == 0) { | 11134 if (!bucket || bucket->size() == 0) { |
| 11120 return error::kInvalidArguments; | 11135 return error::kInvalidArguments; |
| 11121 } | 11136 } |
| 11122 std::string feature_str; | 11137 std::string feature_str; |
| 11123 if (!bucket->GetAsString(&feature_str)) { | 11138 if (!bucket->GetAsString(&feature_str)) { |
| 11124 return error::kInvalidArguments; | 11139 return error::kInvalidArguments; |
| 11125 } | 11140 } |
| 11126 | 11141 |
| 11127 bool desire_webgl_glsl_validation = | |
| 11128 feature_str.find("GL_CHROMIUM_webglsl") != std::string::npos; | |
|
Zhenyao Mo
2015/06/07 18:35:07
"GL_CHROMIUM_webglsl" was not the correct feature
| |
| 11129 bool desire_standard_derivatives = false; | 11142 bool desire_standard_derivatives = false; |
| 11130 bool desire_frag_depth = false; | 11143 bool desire_frag_depth = false; |
| 11131 bool desire_draw_buffers = false; | 11144 bool desire_draw_buffers = false; |
| 11132 bool desire_shader_texture_lod = false; | 11145 bool desire_shader_texture_lod = false; |
| 11133 if (force_webgl_glsl_validation_) { | 11146 if (IsWebGLContext()) { |
| 11134 desire_standard_derivatives = | 11147 desire_standard_derivatives = |
| 11135 feature_str.find("GL_OES_standard_derivatives") != std::string::npos; | 11148 feature_str.find("GL_OES_standard_derivatives") != std::string::npos; |
| 11136 desire_frag_depth = | 11149 desire_frag_depth = |
| 11137 feature_str.find("GL_EXT_frag_depth") != std::string::npos; | 11150 feature_str.find("GL_EXT_frag_depth") != std::string::npos; |
| 11138 desire_draw_buffers = | 11151 desire_draw_buffers = |
| 11139 feature_str.find("GL_EXT_draw_buffers") != std::string::npos; | 11152 feature_str.find("GL_EXT_draw_buffers") != std::string::npos; |
| 11140 desire_shader_texture_lod = | 11153 desire_shader_texture_lod = |
| 11141 feature_str.find("GL_EXT_shader_texture_lod") != std::string::npos; | 11154 feature_str.find("GL_EXT_shader_texture_lod") != std::string::npos; |
| 11142 } | 11155 } |
| 11143 | 11156 |
| 11144 if (desire_webgl_glsl_validation != force_webgl_glsl_validation_ || | 11157 if (desire_standard_derivatives != derivatives_explicitly_enabled_ || |
| 11145 desire_standard_derivatives != derivatives_explicitly_enabled_ || | |
| 11146 desire_frag_depth != frag_depth_explicitly_enabled_ || | 11158 desire_frag_depth != frag_depth_explicitly_enabled_ || |
| 11147 desire_draw_buffers != draw_buffers_explicitly_enabled_) { | 11159 desire_draw_buffers != draw_buffers_explicitly_enabled_ || |
| 11148 force_webgl_glsl_validation_ |= desire_webgl_glsl_validation; | 11160 desire_shader_texture_lod != shader_texture_lod_explicitly_enabled_) { |
|
Zhenyao Mo
2015/06/07 18:35:07
This is apparently a bug, see above the reasoning.
| |
| 11149 derivatives_explicitly_enabled_ |= desire_standard_derivatives; | 11161 derivatives_explicitly_enabled_ |= desire_standard_derivatives; |
| 11150 frag_depth_explicitly_enabled_ |= desire_frag_depth; | 11162 frag_depth_explicitly_enabled_ |= desire_frag_depth; |
| 11151 draw_buffers_explicitly_enabled_ |= desire_draw_buffers; | 11163 draw_buffers_explicitly_enabled_ |= desire_draw_buffers; |
| 11152 shader_texture_lod_explicitly_enabled_ |= desire_shader_texture_lod; | 11164 shader_texture_lod_explicitly_enabled_ |= desire_shader_texture_lod; |
| 11153 InitializeShaderTranslator(); | 11165 InitializeShaderTranslator(); |
| 11154 } | 11166 } |
| 11155 | 11167 |
| 11156 UpdateCapabilities(); | 11168 UpdateCapabilities(); |
| 11157 | 11169 |
| 11158 return error::kNoError; | 11170 return error::kNoError; |
| (...skipping 2213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13372 } | 13384 } |
| 13373 } | 13385 } |
| 13374 | 13386 |
| 13375 // Include the auto-generated part of this file. We split this because it means | 13387 // Include the auto-generated part of this file. We split this because it means |
| 13376 // we can easily edit the non-auto generated parts right here in this file | 13388 // we can easily edit the non-auto generated parts right here in this file |
| 13377 // instead of having to edit some template or the code generator. | 13389 // instead of having to edit some template or the code generator. |
| 13378 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 13390 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 13379 | 13391 |
| 13380 } // namespace gles2 | 13392 } // namespace gles2 |
| 13381 } // namespace gpu | 13393 } // namespace gpu |
| OLD | NEW |