Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(846)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 1325433003: command_buffer: Add support for creating non-WebGL ES 3 contexts (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
834 834
835 bool EnsureGPUMemoryAvailable(size_t estimated_size) { 835 bool EnsureGPUMemoryAvailable(size_t estimated_size) {
836 MemoryTracker* tracker = memory_tracker(); 836 MemoryTracker* tracker = memory_tracker();
837 if (tracker) { 837 if (tracker) {
838 return tracker->EnsureGPUMemoryAvailable(estimated_size); 838 return tracker->EnsureGPUMemoryAvailable(estimated_size);
839 } 839 }
840 return true; 840 return true;
841 } 841 }
842 842
843 bool IsWebGLContext() const { 843 bool IsWebGLContext() const {
844 return webgl_version_ == 1 || webgl_version_ == 2; 844 return context_type_ == CONTEXT_TYPE_WEBGL1 ||
845 context_type_ == CONTEXT_TYPE_WEBGL2;
845 } 846 }
846 847
847 bool IsOffscreenBufferMultisampled() const { 848 bool IsOffscreenBufferMultisampled() const {
848 return offscreen_target_samples_ > 1; 849 return offscreen_target_samples_ > 1;
849 } 850 }
850 851
851 // Creates a Texture for the given texture. 852 // Creates a Texture for the given texture.
852 TextureRef* CreateTexture( 853 TextureRef* CreateTexture(
853 GLuint client_id, GLuint service_id) { 854 GLuint client_id, GLuint service_id) {
854 return texture_manager()->CreateTexture(client_id, service_id); 855 return texture_manager()->CreateTexture(client_id, service_id);
(...skipping 1144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1999 2000
2000 // Number of commands remaining to be processed in DoCommands(). 2001 // Number of commands remaining to be processed in DoCommands().
2001 int commands_to_process_; 2002 int commands_to_process_;
2002 2003
2003 bool has_robustness_extension_; 2004 bool has_robustness_extension_;
2004 error::ContextLostReason context_lost_reason_; 2005 error::ContextLostReason context_lost_reason_;
2005 bool context_was_lost_; 2006 bool context_was_lost_;
2006 bool reset_by_robustness_extension_; 2007 bool reset_by_robustness_extension_;
2007 bool supports_post_sub_buffer_; 2008 bool supports_post_sub_buffer_;
2008 2009
2009 // Indicates whether this is a context for WebGL1, WebGL2, or others. 2010 ContextType context_type_;
2010 // 0: other types
2011 // 1: WebGL 1
2012 // 2: WebGL 2
2013 unsigned webgl_version_;
2014 2011
2015 // These flags are used to override the state of the shared feature_info_ 2012 // These flags are used to override the state of the shared feature_info_
2016 // member. Because the same FeatureInfo instance may be shared among many 2013 // member. Because the same FeatureInfo instance may be shared among many
2017 // contexts, the assumptions on the availablity of extensions in WebGL 2014 // contexts, the assumptions on the availablity of extensions in WebGL
2018 // contexts may be broken. These flags override the shared state to preserve 2015 // contexts may be broken. These flags override the shared state to preserve
2019 // WebGL semantics. 2016 // WebGL semantics.
2020 bool derivatives_explicitly_enabled_; 2017 bool derivatives_explicitly_enabled_;
2021 bool frag_depth_explicitly_enabled_; 2018 bool frag_depth_explicitly_enabled_;
2022 bool draw_buffers_explicitly_enabled_; 2019 bool draw_buffers_explicitly_enabled_;
2023 bool shader_texture_lod_explicitly_enabled_; 2020 bool shader_texture_lod_explicitly_enabled_;
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after
2544 backbuffer_needs_clear_bits_(0), 2541 backbuffer_needs_clear_bits_(0),
2545 current_decoder_error_(error::kNoError), 2542 current_decoder_error_(error::kNoError),
2546 validators_(group_->feature_info()->validators()), 2543 validators_(group_->feature_info()->validators()),
2547 feature_info_(group_->feature_info()), 2544 feature_info_(group_->feature_info()),
2548 frame_number_(0), 2545 frame_number_(0),
2549 has_robustness_extension_(false), 2546 has_robustness_extension_(false),
2550 context_lost_reason_(error::kUnknown), 2547 context_lost_reason_(error::kUnknown),
2551 context_was_lost_(false), 2548 context_was_lost_(false),
2552 reset_by_robustness_extension_(false), 2549 reset_by_robustness_extension_(false),
2553 supports_post_sub_buffer_(false), 2550 supports_post_sub_buffer_(false),
2554 webgl_version_(0), 2551 context_type_(CONTEXT_TYPE_OPENGLES2),
2555 derivatives_explicitly_enabled_(false), 2552 derivatives_explicitly_enabled_(false),
2556 frag_depth_explicitly_enabled_(false), 2553 frag_depth_explicitly_enabled_(false),
2557 draw_buffers_explicitly_enabled_(false), 2554 draw_buffers_explicitly_enabled_(false),
2558 shader_texture_lod_explicitly_enabled_(false), 2555 shader_texture_lod_explicitly_enabled_(false),
2559 compile_shader_always_succeeds_(false), 2556 compile_shader_always_succeeds_(false),
2560 lose_context_when_out_of_memory_(false), 2557 lose_context_when_out_of_memory_(false),
2561 service_logging_(base::CommandLine::InitializedForCurrentProcess() 2558 service_logging_(base::CommandLine::InitializedForCurrentProcess()
2562 ? base::CommandLine::ForCurrentProcess()->HasSwitch( 2559 ? base::CommandLine::ForCurrentProcess()->HasSwitch(
2563 switches::kEnableGPUServiceLoggingGPU) 2560 switches::kEnableGPUServiceLoggingGPU)
2564 : false), 2561 : false),
(...skipping 24 matching lines...) Expand all
2589 const DisallowedFeatures& disallowed_features, 2586 const DisallowedFeatures& disallowed_features,
2590 const std::vector<int32>& attribs) { 2587 const std::vector<int32>& attribs) {
2591 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); 2588 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize");
2592 DCHECK(context->IsCurrent(surface.get())); 2589 DCHECK(context->IsCurrent(surface.get()));
2593 DCHECK(!context_.get()); 2590 DCHECK(!context_.get());
2594 DCHECK(!offscreen || !offscreen_size.IsEmpty()); 2591 DCHECK(!offscreen || !offscreen_size.IsEmpty());
2595 2592
2596 ContextCreationAttribHelper attrib_parser; 2593 ContextCreationAttribHelper attrib_parser;
2597 if (!attrib_parser.Parse(attribs)) 2594 if (!attrib_parser.Parse(attribs))
2598 return false; 2595 return false;
2599 webgl_version_ = attrib_parser.webgl_version; 2596
2597 context_type_ = attrib_parser.context_type;
2600 2598
2601 surfaceless_ = surface->IsSurfaceless() && !offscreen; 2599 surfaceless_ = surface->IsSurfaceless() && !offscreen;
2602 2600
2603 set_initialized(); 2601 set_initialized();
2604 gpu_state_tracer_ = GPUStateTracer::Create(&state_); 2602 gpu_state_tracer_ = GPUStateTracer::Create(&state_);
2605 2603
2606 if (base::CommandLine::InitializedForCurrentProcess()) { 2604 if (base::CommandLine::InitializedForCurrentProcess()) {
2607 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 2605 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
2608 switches::kEnableGPUDebugging)) { 2606 switches::kEnableGPUDebugging)) {
2609 set_debug(true); 2607 set_debug(true);
(...skipping 30 matching lines...) Expand all
2640 // If the failIfMajorPerformanceCaveat context creation attribute was true 2638 // If the failIfMajorPerformanceCaveat context creation attribute was true
2641 // and we are using a software renderer, fail. 2639 // and we are using a software renderer, fail.
2642 if (attrib_parser.fail_if_major_perf_caveat && 2640 if (attrib_parser.fail_if_major_perf_caveat &&
2643 feature_info_->feature_flags().is_swiftshader) { 2641 feature_info_->feature_flags().is_swiftshader) {
2644 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. 2642 group_ = NULL; // Must not destroy ContextGroup if it is not initialized.
2645 Destroy(true); 2643 Destroy(true);
2646 return false; 2644 return false;
2647 } 2645 }
2648 2646
2649 disallowed_features_ = disallowed_features; 2647 disallowed_features_ = disallowed_features;
2650 if (webgl_version_ == 1) { 2648 if (context_type_ == CONTEXT_TYPE_WEBGL1) {
2651 disallowed_features_.npot_support = true; 2649 disallowed_features_.npot_support = true;
2652 } 2650 }
2653 2651
2654 if (!group_->Initialize(this, 2652 if (!group_->Initialize(this, context_type_, disallowed_features_)) {
2655 ContextGroup::GetContextType(webgl_version_),
2656 disallowed_features_)) {
2657 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. 2653 group_ = NULL; // Must not destroy ContextGroup if it is not initialized.
2658 Destroy(true); 2654 Destroy(true);
2659 return false; 2655 return false;
2660 } 2656 }
2661 CHECK_GL_ERROR(); 2657 CHECK_GL_ERROR();
2662 2658 if (context_type_ == CONTEXT_TYPE_WEBGL2 ||
2663 if (webgl_version_ == 2) { 2659 context_type_ == CONTEXT_TYPE_OPENGLES3) {
2664 if (!feature_info_->IsES3Capable()) { 2660 if (!feature_info_->IsES3Capable()) {
2665 LOG(ERROR) << "Underlying driver does not support ES3."; 2661 LOG(ERROR) << "Underlying driver does not support ES3.";
2666 Destroy(true); 2662 Destroy(true);
2667 return false; 2663 return false;
2668 } 2664 }
2669 feature_info_->EnableES3Validators(); 2665 feature_info_->EnableES3Validators();
2670 set_unsafe_es3_apis_enabled(true); 2666 set_unsafe_es3_apis_enabled(true);
2671 2667
2672 frag_depth_explicitly_enabled_ = true; 2668 frag_depth_explicitly_enabled_ = true;
2673 draw_buffers_explicitly_enabled_ = true; 2669 draw_buffers_explicitly_enabled_ = true;
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
3228 features().ext_draw_buffers ? 1 : 0; 3224 features().ext_draw_buffers ? 1 : 0;
3229 resources.EXT_frag_depth = 3225 resources.EXT_frag_depth =
3230 features().ext_frag_depth ? 1 : 0; 3226 features().ext_frag_depth ? 1 : 0;
3231 resources.EXT_shader_texture_lod = 3227 resources.EXT_shader_texture_lod =
3232 features().ext_shader_texture_lod ? 1 : 0; 3228 features().ext_shader_texture_lod ? 1 : 0;
3233 resources.NV_draw_buffers = 3229 resources.NV_draw_buffers =
3234 features().nv_draw_buffers ? 1 : 0; 3230 features().nv_draw_buffers ? 1 : 0;
3235 } 3231 }
3236 3232
3237 ShShaderSpec shader_spec; 3233 ShShaderSpec shader_spec;
3238 if (IsWebGLContext()) { 3234 switch (context_type_) {
3239 shader_spec = webgl_version_ == 2 ? SH_WEBGL2_SPEC : SH_WEBGL_SPEC; 3235 case CONTEXT_TYPE_WEBGL1:
3240 } else { 3236 shader_spec = SH_WEBGL_SPEC;
3241 shader_spec = unsafe_es3_apis_enabled() ? SH_GLES3_SPEC : SH_GLES2_SPEC; 3237 break;
3238 case CONTEXT_TYPE_WEBGL2:
3239 shader_spec = SH_WEBGL2_SPEC;
3240 break;
3241 case CONTEXT_TYPE_OPENGLES2:
3242 shader_spec = SH_GLES2_SPEC;
3243 break;
3244 case CONTEXT_TYPE_OPENGLES3:
3245 shader_spec = SH_GLES3_SPEC;
3246 break;
3247 default:
3248 NOTREACHED();
3249 shader_spec = SH_GLES2_SPEC;
3250 break;
3242 } 3251 }
3243 3252
3244 if ((shader_spec == SH_WEBGL_SPEC || shader_spec == SH_WEBGL2_SPEC) && 3253 if ((shader_spec == SH_WEBGL_SPEC || shader_spec == SH_WEBGL2_SPEC) &&
3245 features().enable_shader_name_hashing) 3254 features().enable_shader_name_hashing)
3246 resources.HashFunction = &CityHash64; 3255 resources.HashFunction = &CityHash64;
3247 else 3256 else
3248 resources.HashFunction = NULL; 3257 resources.HashFunction = NULL;
3249 3258
3250 int driver_bug_workarounds = 0; 3259 int driver_bug_workarounds = 0;
3251 if (workarounds().needs_glsl_built_in_function_emulation) 3260 if (workarounds().needs_glsl_built_in_function_emulation)
(...skipping 11529 matching lines...) Expand 10 before | Expand all | Expand 10 after
14781 return error::kNoError; 14790 return error::kNoError;
14782 } 14791 }
14783 14792
14784 // Include the auto-generated part of this file. We split this because it means 14793 // Include the auto-generated part of this file. We split this because it means
14785 // we can easily edit the non-auto generated parts right here in this file 14794 // we can easily edit the non-auto generated parts right here in this file
14786 // instead of having to edit some template or the code generator. 14795 // instead of having to edit some template or the code generator.
14787 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 14796 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
14788 14797
14789 } // namespace gles2 14798 } // namespace gles2
14790 } // namespace gpu 14799 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698