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 <list> | 10 #include <list> |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 | 573 |
574 // Overridden from AsyncAPIInterface. | 574 // Overridden from AsyncAPIInterface. |
575 virtual Error DoCommand(unsigned int command, | 575 virtual Error DoCommand(unsigned int command, |
576 unsigned int arg_count, | 576 unsigned int arg_count, |
577 const void* args) OVERRIDE; | 577 const void* args) OVERRIDE; |
578 | 578 |
579 // Overridden from AsyncAPIInterface. | 579 // Overridden from AsyncAPIInterface. |
580 virtual const char* GetCommandName(unsigned int command_id) const OVERRIDE; | 580 virtual const char* GetCommandName(unsigned int command_id) const OVERRIDE; |
581 | 581 |
582 // Overridden from GLES2Decoder. | 582 // Overridden from GLES2Decoder. |
583 virtual bool Initialize(const scoped_refptr<gfx::GLSurface>& surface, | 583 virtual bool Initialize( |
584 const scoped_refptr<gfx::GLContext>& context, | 584 const scoped_refptr<gfx::GLSurface>& surface, |
585 bool offscreen, | 585 const scoped_refptr<gfx::GLContext>& context, |
586 const gfx::Size& size, | 586 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, |
587 const DisallowedFeatures& disallowed_features, | 587 bool offscreen, |
588 const std::vector<int32>& attribs) OVERRIDE; | 588 const gfx::Size& size, |
| 589 const DisallowedFeatures& disallowed_features, |
| 590 const std::vector<int32>& attribs) OVERRIDE; |
589 virtual void Destroy(bool have_context) OVERRIDE; | 591 virtual void Destroy(bool have_context) OVERRIDE; |
590 virtual void SetSurface( | 592 virtual void SetSurface( |
591 const scoped_refptr<gfx::GLSurface>& surface) OVERRIDE; | 593 const scoped_refptr<gfx::GLSurface>& surface) OVERRIDE; |
592 virtual void ProduceFrontBuffer(const Mailbox& mailbox) OVERRIDE; | 594 virtual void ProduceFrontBuffer(const Mailbox& mailbox) OVERRIDE; |
593 virtual bool ResizeOffscreenFrameBuffer(const gfx::Size& size) OVERRIDE; | 595 virtual bool ResizeOffscreenFrameBuffer(const gfx::Size& size) OVERRIDE; |
594 void UpdateParentTextureInfo(); | 596 void UpdateParentTextureInfo(); |
595 virtual bool MakeCurrent() OVERRIDE; | 597 virtual bool MakeCurrent() OVERRIDE; |
596 virtual GLES2Util* GetGLES2Util() OVERRIDE { return &util_; } | 598 virtual GLES2Util* GetGLES2Util() OVERRIDE { return &util_; } |
597 virtual gfx::GLContext* GetGLContext() OVERRIDE { return context_.get(); } | 599 virtual gfx::GLContext* GetGLContext() OVERRIDE { return context_.get(); } |
598 virtual ContextGroup* GetContextGroup() OVERRIDE { return group_.get(); } | 600 virtual ContextGroup* GetContextGroup() OVERRIDE { return group_.get(); } |
(...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1717 bool back_buffer_has_depth_; | 1719 bool back_buffer_has_depth_; |
1718 bool back_buffer_has_stencil_; | 1720 bool back_buffer_has_stencil_; |
1719 | 1721 |
1720 // Backbuffer attachments that are currently undefined. | 1722 // Backbuffer attachments that are currently undefined. |
1721 uint32 backbuffer_needs_clear_bits_; | 1723 uint32 backbuffer_needs_clear_bits_; |
1722 | 1724 |
1723 // The current decoder error. | 1725 // The current decoder error. |
1724 error::Error current_decoder_error_; | 1726 error::Error current_decoder_error_; |
1725 | 1727 |
1726 bool use_shader_translator_; | 1728 bool use_shader_translator_; |
| 1729 scoped_refptr<ShaderTranslatorCache> shader_translator_cache_; |
1727 scoped_refptr<ShaderTranslator> vertex_translator_; | 1730 scoped_refptr<ShaderTranslator> vertex_translator_; |
1728 scoped_refptr<ShaderTranslator> fragment_translator_; | 1731 scoped_refptr<ShaderTranslator> fragment_translator_; |
1729 | 1732 |
1730 DisallowedFeatures disallowed_features_; | 1733 DisallowedFeatures disallowed_features_; |
1731 | 1734 |
1732 // Cached from ContextGroup | 1735 // Cached from ContextGroup |
1733 const Validators* validators_; | 1736 const Validators* validators_; |
1734 scoped_refptr<FeatureInfo> feature_info_; | 1737 scoped_refptr<FeatureInfo> feature_info_; |
1735 | 1738 |
1736 int frame_number_; | 1739 int frame_number_; |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2278 use_shader_translator_ = false; | 2281 use_shader_translator_ = false; |
2279 } | 2282 } |
2280 } | 2283 } |
2281 | 2284 |
2282 GLES2DecoderImpl::~GLES2DecoderImpl() { | 2285 GLES2DecoderImpl::~GLES2DecoderImpl() { |
2283 } | 2286 } |
2284 | 2287 |
2285 bool GLES2DecoderImpl::Initialize( | 2288 bool GLES2DecoderImpl::Initialize( |
2286 const scoped_refptr<gfx::GLSurface>& surface, | 2289 const scoped_refptr<gfx::GLSurface>& surface, |
2287 const scoped_refptr<gfx::GLContext>& context, | 2290 const scoped_refptr<gfx::GLContext>& context, |
| 2291 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, |
2288 bool offscreen, | 2292 bool offscreen, |
2289 const gfx::Size& size, | 2293 const gfx::Size& size, |
2290 const DisallowedFeatures& disallowed_features, | 2294 const DisallowedFeatures& disallowed_features, |
2291 const std::vector<int32>& attribs) { | 2295 const std::vector<int32>& attribs) { |
2292 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); | 2296 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); |
2293 DCHECK(context->IsCurrent(surface.get())); | 2297 DCHECK(context->IsCurrent(surface.get())); |
2294 DCHECK(!context_.get()); | 2298 DCHECK(!context_.get()); |
2295 | 2299 |
2296 set_initialized(); | 2300 set_initialized(); |
2297 gpu_tracer_ = GPUTracer::Create(this); | 2301 gpu_tracer_ = GPUTracer::Create(this); |
(...skipping 14 matching lines...) Expand all Loading... |
2312 | 2316 |
2313 compile_shader_always_succeeds_ = CommandLine::ForCurrentProcess()->HasSwitch( | 2317 compile_shader_always_succeeds_ = CommandLine::ForCurrentProcess()->HasSwitch( |
2314 switches::kCompileShaderAlwaysSucceeds); | 2318 switches::kCompileShaderAlwaysSucceeds); |
2315 | 2319 |
2316 | 2320 |
2317 // Take ownership of the context and surface. The surface can be replaced with | 2321 // Take ownership of the context and surface. The surface can be replaced with |
2318 // SetSurface. | 2322 // SetSurface. |
2319 context_ = context; | 2323 context_ = context; |
2320 surface_ = surface; | 2324 surface_ = surface; |
2321 | 2325 |
| 2326 shader_translator_cache_ = shader_translator_cache; |
| 2327 |
2322 ContextCreationAttribHelper attrib_parser; | 2328 ContextCreationAttribHelper attrib_parser; |
2323 if (!attrib_parser.Parse(attribs)) | 2329 if (!attrib_parser.Parse(attribs)) |
2324 return false; | 2330 return false; |
2325 | 2331 |
2326 // If the failIfMajorPerformanceCaveat context creation attribute was true | 2332 // If the failIfMajorPerformanceCaveat context creation attribute was true |
2327 // and we are using a software renderer, fail. | 2333 // and we are using a software renderer, fail. |
2328 if (attrib_parser.fail_if_major_perf_caveat_ && | 2334 if (attrib_parser.fail_if_major_perf_caveat_ && |
2329 feature_info_->feature_flags().is_swiftshader) { | 2335 feature_info_->feature_flags().is_swiftshader) { |
2330 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. | 2336 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. |
2331 Destroy(true); | 2337 Destroy(true); |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2743 driver_bug_workarounds |= SH_EMULATE_BUILT_IN_FUNCTIONS; | 2749 driver_bug_workarounds |= SH_EMULATE_BUILT_IN_FUNCTIONS; |
2744 if (workarounds().init_gl_position_in_vertex_shader) | 2750 if (workarounds().init_gl_position_in_vertex_shader) |
2745 driver_bug_workarounds |= SH_INIT_GL_POSITION; | 2751 driver_bug_workarounds |= SH_INIT_GL_POSITION; |
2746 if (workarounds().unfold_short_circuit_as_ternary_operation) | 2752 if (workarounds().unfold_short_circuit_as_ternary_operation) |
2747 driver_bug_workarounds |= SH_UNFOLD_SHORT_CIRCUIT; | 2753 driver_bug_workarounds |= SH_UNFOLD_SHORT_CIRCUIT; |
2748 if (workarounds().init_varyings_without_static_use) | 2754 if (workarounds().init_varyings_without_static_use) |
2749 driver_bug_workarounds |= SH_INIT_VARYINGS_WITHOUT_STATIC_USE; | 2755 driver_bug_workarounds |= SH_INIT_VARYINGS_WITHOUT_STATIC_USE; |
2750 if (workarounds().unroll_for_loop_with_sampler_array_index) | 2756 if (workarounds().unroll_for_loop_with_sampler_array_index) |
2751 driver_bug_workarounds |= SH_UNROLL_FOR_LOOP_WITH_SAMPLER_ARRAY_INDEX; | 2757 driver_bug_workarounds |= SH_UNROLL_FOR_LOOP_WITH_SAMPLER_ARRAY_INDEX; |
2752 | 2758 |
2753 ShaderTranslatorCache* cache = ShaderTranslatorCache::GetInstance(); | 2759 vertex_translator_ = shader_translator_cache_->GetTranslator( |
2754 vertex_translator_ = cache->GetTranslator( | |
2755 SH_VERTEX_SHADER, shader_spec, &resources, | 2760 SH_VERTEX_SHADER, shader_spec, &resources, |
2756 implementation_type, | 2761 implementation_type, |
2757 static_cast<ShCompileOptions>(driver_bug_workarounds)); | 2762 static_cast<ShCompileOptions>(driver_bug_workarounds)); |
2758 if (!vertex_translator_.get()) { | 2763 if (!vertex_translator_.get()) { |
2759 LOG(ERROR) << "Could not initialize vertex shader translator."; | 2764 LOG(ERROR) << "Could not initialize vertex shader translator."; |
2760 Destroy(true); | 2765 Destroy(true); |
2761 return false; | 2766 return false; |
2762 } | 2767 } |
2763 | 2768 |
2764 fragment_translator_ = cache->GetTranslator( | 2769 fragment_translator_ = shader_translator_cache_->GetTranslator( |
2765 SH_FRAGMENT_SHADER, shader_spec, &resources, | 2770 SH_FRAGMENT_SHADER, shader_spec, &resources, |
2766 implementation_type, | 2771 implementation_type, |
2767 static_cast<ShCompileOptions>(driver_bug_workarounds)); | 2772 static_cast<ShCompileOptions>(driver_bug_workarounds)); |
2768 if (!fragment_translator_.get()) { | 2773 if (!fragment_translator_.get()) { |
2769 LOG(ERROR) << "Could not initialize fragment shader translator."; | 2774 LOG(ERROR) << "Could not initialize fragment shader translator."; |
2770 Destroy(true); | 2775 Destroy(true); |
2771 return false; | 2776 return false; |
2772 } | 2777 } |
2773 return true; | 2778 return true; |
2774 } | 2779 } |
(...skipping 7884 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10659 DoDidUseTexImageIfNeeded(texture, texture->target()); | 10664 DoDidUseTexImageIfNeeded(texture, texture->target()); |
10660 } | 10665 } |
10661 | 10666 |
10662 // Include the auto-generated part of this file. We split this because it means | 10667 // Include the auto-generated part of this file. We split this because it means |
10663 // we can easily edit the non-auto generated parts right here in this file | 10668 // we can easily edit the non-auto generated parts right here in this file |
10664 // instead of having to edit some template or the code generator. | 10669 // instead of having to edit some template or the code generator. |
10665 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10670 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
10666 | 10671 |
10667 } // namespace gles2 | 10672 } // namespace gles2 |
10668 } // namespace gpu | 10673 } // namespace gpu |
OLD | NEW |