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 1730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1741 | 1741 |
1742 ShaderCacheCallback shader_cache_callback_; | 1742 ShaderCacheCallback shader_cache_callback_; |
1743 | 1743 |
1744 scoped_ptr<AsyncPixelTransferManager> async_pixel_transfer_manager_; | 1744 scoped_ptr<AsyncPixelTransferManager> async_pixel_transfer_manager_; |
1745 | 1745 |
1746 // The format of the back buffer_ | 1746 // The format of the back buffer_ |
1747 GLenum back_buffer_color_format_; | 1747 GLenum back_buffer_color_format_; |
1748 bool back_buffer_has_depth_; | 1748 bool back_buffer_has_depth_; |
1749 bool back_buffer_has_stencil_; | 1749 bool back_buffer_has_stencil_; |
1750 | 1750 |
| 1751 bool surfaceless_; |
| 1752 |
1751 // Backbuffer attachments that are currently undefined. | 1753 // Backbuffer attachments that are currently undefined. |
1752 uint32 backbuffer_needs_clear_bits_; | 1754 uint32 backbuffer_needs_clear_bits_; |
1753 | 1755 |
1754 // The current decoder error communicates the decoder error through command | 1756 // The current decoder error communicates the decoder error through command |
1755 // processing functions that do not return the error value. Should be set only | 1757 // processing functions that do not return the error value. Should be set only |
1756 // if not returning an error. | 1758 // if not returning an error. |
1757 error::Error current_decoder_error_; | 1759 error::Error current_decoder_error_; |
1758 | 1760 |
1759 bool use_shader_translator_; | 1761 bool use_shader_translator_; |
1760 scoped_refptr<ShaderTranslator> vertex_translator_; | 1762 scoped_refptr<ShaderTranslator> vertex_translator_; |
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2297 fixed_attrib_buffer_size_(0), | 2299 fixed_attrib_buffer_size_(0), |
2298 offscreen_target_color_format_(0), | 2300 offscreen_target_color_format_(0), |
2299 offscreen_target_depth_format_(0), | 2301 offscreen_target_depth_format_(0), |
2300 offscreen_target_stencil_format_(0), | 2302 offscreen_target_stencil_format_(0), |
2301 offscreen_target_samples_(0), | 2303 offscreen_target_samples_(0), |
2302 offscreen_target_buffer_preserved_(true), | 2304 offscreen_target_buffer_preserved_(true), |
2303 offscreen_saved_color_format_(0), | 2305 offscreen_saved_color_format_(0), |
2304 back_buffer_color_format_(0), | 2306 back_buffer_color_format_(0), |
2305 back_buffer_has_depth_(false), | 2307 back_buffer_has_depth_(false), |
2306 back_buffer_has_stencil_(false), | 2308 back_buffer_has_stencil_(false), |
| 2309 surfaceless_(false), |
2307 backbuffer_needs_clear_bits_(0), | 2310 backbuffer_needs_clear_bits_(0), |
2308 current_decoder_error_(error::kNoError), | 2311 current_decoder_error_(error::kNoError), |
2309 use_shader_translator_(true), | 2312 use_shader_translator_(true), |
2310 validators_(group_->feature_info()->validators()), | 2313 validators_(group_->feature_info()->validators()), |
2311 feature_info_(group_->feature_info()), | 2314 feature_info_(group_->feature_info()), |
2312 frame_number_(0), | 2315 frame_number_(0), |
2313 has_robustness_extension_(false), | 2316 has_robustness_extension_(false), |
2314 reset_status_(GL_NO_ERROR), | 2317 reset_status_(GL_NO_ERROR), |
2315 reset_by_robustness_extension_(false), | 2318 reset_by_robustness_extension_(false), |
2316 supports_post_sub_buffer_(false), | 2319 supports_post_sub_buffer_(false), |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2362 const scoped_refptr<gfx::GLSurface>& surface, | 2365 const scoped_refptr<gfx::GLSurface>& surface, |
2363 const scoped_refptr<gfx::GLContext>& context, | 2366 const scoped_refptr<gfx::GLContext>& context, |
2364 bool offscreen, | 2367 bool offscreen, |
2365 const gfx::Size& size, | 2368 const gfx::Size& size, |
2366 const DisallowedFeatures& disallowed_features, | 2369 const DisallowedFeatures& disallowed_features, |
2367 const std::vector<int32>& attribs) { | 2370 const std::vector<int32>& attribs) { |
2368 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); | 2371 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); |
2369 DCHECK(context->IsCurrent(surface.get())); | 2372 DCHECK(context->IsCurrent(surface.get())); |
2370 DCHECK(!context_.get()); | 2373 DCHECK(!context_.get()); |
2371 | 2374 |
| 2375 surfaceless_ = surface->IsSurfaceless(); |
| 2376 |
2372 set_initialized(); | 2377 set_initialized(); |
2373 gpu_tracer_.reset(new GPUTracer(this)); | 2378 gpu_tracer_.reset(new GPUTracer(this)); |
2374 gpu_state_tracer_ = GPUStateTracer::Create(&state_); | 2379 gpu_state_tracer_ = GPUStateTracer::Create(&state_); |
2375 | 2380 |
2376 if (CommandLine::ForCurrentProcess()->HasSwitch( | 2381 if (CommandLine::ForCurrentProcess()->HasSwitch( |
2377 switches::kEnableGPUDebugging)) { | 2382 switches::kEnableGPUDebugging)) { |
2378 set_debug(true); | 2383 set_debug(true); |
2379 } | 2384 } |
2380 | 2385 |
2381 if (CommandLine::ForCurrentProcess()->HasSwitch( | 2386 if (CommandLine::ForCurrentProcess()->HasSwitch( |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2619 DoBindFramebuffer(GL_FRAMEBUFFER, 0); | 2624 DoBindFramebuffer(GL_FRAMEBUFFER, 0); |
2620 } else { | 2625 } else { |
2621 glBindFramebufferEXT(GL_FRAMEBUFFER, GetBackbufferServiceId()); | 2626 glBindFramebufferEXT(GL_FRAMEBUFFER, GetBackbufferServiceId()); |
2622 // These are NOT if the back buffer has these proprorties. They are | 2627 // These are NOT if the back buffer has these proprorties. They are |
2623 // if we want the command buffer to enforce them regardless of what | 2628 // if we want the command buffer to enforce them regardless of what |
2624 // the real backbuffer is assuming the real back buffer gives us more than | 2629 // the real backbuffer is assuming the real back buffer gives us more than |
2625 // we ask for. In other words, if we ask for RGB and we get RGBA then we'll | 2630 // we ask for. In other words, if we ask for RGB and we get RGBA then we'll |
2626 // make it appear RGB. If on the other hand we ask for RGBA nd get RGB we | 2631 // make it appear RGB. If on the other hand we ask for RGBA nd get RGB we |
2627 // can't do anything about that. | 2632 // can't do anything about that. |
2628 | 2633 |
2629 GLint v = 0; | 2634 if (!surfaceless_) { |
2630 glGetIntegerv(GL_ALPHA_BITS, &v); | 2635 GLint v = 0; |
2631 // This checks if the user requested RGBA and we have RGBA then RGBA. If the | 2636 glGetIntegerv(GL_ALPHA_BITS, &v); |
2632 // user requested RGB then RGB. If the user did not specify a preference | 2637 // This checks if the user requested RGBA and we have RGBA then RGBA. If |
2633 // than use whatever we were given. Same for DEPTH and STENCIL. | 2638 // the user requested RGB then RGB. If the user did not specify a |
2634 back_buffer_color_format_ = | 2639 // preference than use whatever we were given. Same for DEPTH and STENCIL. |
2635 (attrib_parser.alpha_size != 0 && v > 0) ? GL_RGBA : GL_RGB; | 2640 back_buffer_color_format_ = |
2636 glGetIntegerv(GL_DEPTH_BITS, &v); | 2641 (attrib_parser.alpha_size != 0 && v > 0) ? GL_RGBA : GL_RGB; |
2637 back_buffer_has_depth_ = attrib_parser.depth_size != 0 && v > 0; | 2642 glGetIntegerv(GL_DEPTH_BITS, &v); |
2638 glGetIntegerv(GL_STENCIL_BITS, &v); | 2643 back_buffer_has_depth_ = attrib_parser.depth_size != 0 && v > 0; |
2639 back_buffer_has_stencil_ = attrib_parser.stencil_size != 0 && v > 0; | 2644 glGetIntegerv(GL_STENCIL_BITS, &v); |
| 2645 back_buffer_has_stencil_ = attrib_parser.stencil_size != 0 && v > 0; |
| 2646 } |
2640 } | 2647 } |
2641 | 2648 |
2642 // OpenGL ES 2.0 implicitly enables the desktop GL capability | 2649 // OpenGL ES 2.0 implicitly enables the desktop GL capability |
2643 // VERTEX_PROGRAM_POINT_SIZE and doesn't expose this enum. This fact | 2650 // VERTEX_PROGRAM_POINT_SIZE and doesn't expose this enum. This fact |
2644 // isn't well documented; it was discovered in the Khronos OpenGL ES | 2651 // isn't well documented; it was discovered in the Khronos OpenGL ES |
2645 // mailing list archives. It also implicitly enables the desktop GL | 2652 // mailing list archives. It also implicitly enables the desktop GL |
2646 // capability GL_POINT_SPRITE to provide access to the gl_PointCoord | 2653 // capability GL_POINT_SPRITE to provide access to the gl_PointCoord |
2647 // variable in fragment shaders. | 2654 // variable in fragment shaders. |
2648 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { | 2655 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { |
2649 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); | 2656 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); |
(...skipping 22 matching lines...) Expand all Loading... |
2672 // Set all the default state because some GL drivers get it wrong. | 2679 // Set all the default state because some GL drivers get it wrong. |
2673 state_.InitCapabilities(NULL); | 2680 state_.InitCapabilities(NULL); |
2674 state_.InitState(NULL); | 2681 state_.InitState(NULL); |
2675 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); | 2682 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); |
2676 | 2683 |
2677 DoBindBuffer(GL_ARRAY_BUFFER, 0); | 2684 DoBindBuffer(GL_ARRAY_BUFFER, 0); |
2678 DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); | 2685 DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); |
2679 DoBindFramebuffer(GL_FRAMEBUFFER, 0); | 2686 DoBindFramebuffer(GL_FRAMEBUFFER, 0); |
2680 DoBindRenderbuffer(GL_RENDERBUFFER, 0); | 2687 DoBindRenderbuffer(GL_RENDERBUFFER, 0); |
2681 | 2688 |
2682 bool call_gl_clear = true; | 2689 bool call_gl_clear = !surfaceless_; |
2683 #if defined(OS_ANDROID) | 2690 #if defined(OS_ANDROID) |
2684 // Temporary workaround for Android WebView because this clear ignores the | 2691 // Temporary workaround for Android WebView because this clear ignores the |
2685 // clip and corrupts that external UI of the App. Not calling glClear is ok | 2692 // clip and corrupts that external UI of the App. Not calling glClear is ok |
2686 // because the system already clears the buffer before each draw. Proper | 2693 // because the system already clears the buffer before each draw. Proper |
2687 // fix might be setting the scissor clip properly before initialize. See | 2694 // fix might be setting the scissor clip properly before initialize. See |
2688 // crbug.com/259023 for details. | 2695 // crbug.com/259023 for details. |
2689 call_gl_clear = surface_->GetHandle(); | 2696 call_gl_clear = surface_->GetHandle(); |
2690 #endif | 2697 #endif |
2691 if (call_gl_clear) { | 2698 if (call_gl_clear) { |
2692 // Clear the backbuffer. | 2699 // Clear the backbuffer. |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3116 framebuffer_state_.bound_draw_framebuffer.get(), | 3123 framebuffer_state_.bound_draw_framebuffer.get(), |
3117 GetBackbufferServiceId()); | 3124 GetBackbufferServiceId()); |
3118 } | 3125 } |
3119 OnFboChanged(); | 3126 OnFboChanged(); |
3120 } | 3127 } |
3121 | 3128 |
3122 bool GLES2DecoderImpl::CheckFramebufferValid( | 3129 bool GLES2DecoderImpl::CheckFramebufferValid( |
3123 Framebuffer* framebuffer, | 3130 Framebuffer* framebuffer, |
3124 GLenum target, const char* func_name) { | 3131 GLenum target, const char* func_name) { |
3125 if (!framebuffer) { | 3132 if (!framebuffer) { |
| 3133 if (surfaceless_) |
| 3134 return false; |
3126 if (backbuffer_needs_clear_bits_) { | 3135 if (backbuffer_needs_clear_bits_) { |
3127 glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat( | 3136 glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat( |
3128 offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1); | 3137 offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1); |
3129 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | 3138 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); |
3130 glClearStencil(0); | 3139 glClearStencil(0); |
3131 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); | 3140 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); |
3132 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); | 3141 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); |
3133 glClearDepth(1.0f); | 3142 glClearDepth(1.0f); |
3134 state_.SetDeviceDepthMask(GL_TRUE); | 3143 state_.SetDeviceDepthMask(GL_TRUE); |
3135 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); | 3144 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); |
(...skipping 8139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11275 } | 11284 } |
11276 } | 11285 } |
11277 | 11286 |
11278 // Include the auto-generated part of this file. We split this because it means | 11287 // Include the auto-generated part of this file. We split this because it means |
11279 // we can easily edit the non-auto generated parts right here in this file | 11288 // we can easily edit the non-auto generated parts right here in this file |
11280 // instead of having to edit some template or the code generator. | 11289 // instead of having to edit some template or the code generator. |
11281 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 11290 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
11282 | 11291 |
11283 } // namespace gles2 | 11292 } // namespace gles2 |
11284 } // namespace gpu | 11293 } // namespace gpu |
OLD | NEW |