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

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

Issue 199443004: gpu: Raise GL_OUT_OF_MEMORY when BeginQueryEXT fails to allocate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: checkmem: Created 6 years, 9 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 | Annotate | Revision Log
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 <list> 10 #include <list>
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 GLES2Decoder::~GLES2Decoder() { 534 GLES2Decoder::~GLES2Decoder() {
535 } 535 }
536 536
537 void GLES2Decoder::BeginDecoding() {} 537 void GLES2Decoder::BeginDecoding() {}
538 538
539 void GLES2Decoder::EndDecoding() {} 539 void GLES2Decoder::EndDecoding() {}
540 540
541 // This class implements GLES2Decoder so we don't have to expose all the GLES2 541 // This class implements GLES2Decoder so we don't have to expose all the GLES2
542 // cmd stuff to outside this class. 542 // cmd stuff to outside this class.
543 class GLES2DecoderImpl : public GLES2Decoder, 543 class GLES2DecoderImpl : public GLES2Decoder,
544 public FramebufferManager::TextureDetachObserver { 544 public FramebufferManager::TextureDetachObserver,
545 public ErrorStateClient {
545 public: 546 public:
546 explicit GLES2DecoderImpl(ContextGroup* group); 547 explicit GLES2DecoderImpl(ContextGroup* group);
547 virtual ~GLES2DecoderImpl(); 548 virtual ~GLES2DecoderImpl();
548 549
549 // Overridden from AsyncAPIInterface. 550 // Overridden from AsyncAPIInterface.
550 virtual Error DoCommand(unsigned int command, 551 virtual Error DoCommand(unsigned int command,
551 unsigned int arg_count, 552 unsigned int arg_count,
552 const void* args) OVERRIDE; 553 const void* args) OVERRIDE;
553 554
554 // Overridden from AsyncAPIInterface. 555 // Overridden from AsyncAPIInterface.
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 bool BoundFramebufferHasColorAttachmentWithAlpha(bool all_draw_buffers); 659 bool BoundFramebufferHasColorAttachmentWithAlpha(bool all_draw_buffers);
659 bool BoundFramebufferHasDepthAttachment(); 660 bool BoundFramebufferHasDepthAttachment();
660 bool BoundFramebufferHasStencilAttachment(); 661 bool BoundFramebufferHasStencilAttachment();
661 662
662 virtual error::ContextLostReason GetContextLostReason() OVERRIDE; 663 virtual error::ContextLostReason GetContextLostReason() OVERRIDE;
663 664
664 // Overridden from FramebufferManager::TextureDetachObserver: 665 // Overridden from FramebufferManager::TextureDetachObserver:
665 virtual void OnTextureRefDetachedFromFramebuffer( 666 virtual void OnTextureRefDetachedFromFramebuffer(
666 TextureRef* texture) OVERRIDE; 667 TextureRef* texture) OVERRIDE;
667 668
669 // Overriden from ErrorStateClient.
670 virtual void OnOutOfMemoryError() OVERRIDE;
671
668 // Helpers to facilitate calling into compatible extensions. 672 // Helpers to facilitate calling into compatible extensions.
669 static void RenderbufferStorageMultisampleHelper( 673 static void RenderbufferStorageMultisampleHelper(
670 const FeatureInfo* feature_info, 674 const FeatureInfo* feature_info,
671 GLenum target, 675 GLenum target,
672 GLsizei samples, 676 GLsizei samples,
673 GLenum internal_format, 677 GLenum internal_format,
674 GLsizei width, 678 GLsizei width,
675 GLsizei height); 679 GLsizei height);
676 680
677 void BlitFramebufferHelper(GLint srcX0, 681 void BlitFramebufferHelper(GLint srcX0,
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after
1708 // contexts, the assumptions on the availablity of extensions in WebGL 1712 // contexts, the assumptions on the availablity of extensions in WebGL
1709 // contexts may be broken. These flags override the shared state to preserve 1713 // contexts may be broken. These flags override the shared state to preserve
1710 // WebGL semantics. 1714 // WebGL semantics.
1711 bool force_webgl_glsl_validation_; 1715 bool force_webgl_glsl_validation_;
1712 bool derivatives_explicitly_enabled_; 1716 bool derivatives_explicitly_enabled_;
1713 bool frag_depth_explicitly_enabled_; 1717 bool frag_depth_explicitly_enabled_;
1714 bool draw_buffers_explicitly_enabled_; 1718 bool draw_buffers_explicitly_enabled_;
1715 1719
1716 bool compile_shader_always_succeeds_; 1720 bool compile_shader_always_succeeds_;
1717 1721
1722 // An optional behaviour to lose the context and group when OOM.
1723 bool lose_context_when_out_of_memory_;
1724
1718 // Log extra info. 1725 // Log extra info.
1719 bool service_logging_; 1726 bool service_logging_;
1720 1727
1721 #if defined(OS_MACOSX) 1728 #if defined(OS_MACOSX)
1722 typedef std::map<GLuint, CFTypeRef> TextureToIOSurfaceMap; 1729 typedef std::map<GLuint, CFTypeRef> TextureToIOSurfaceMap;
1723 TextureToIOSurfaceMap texture_to_io_surface_map_; 1730 TextureToIOSurfaceMap texture_to_io_surface_map_;
1724 #endif 1731 #endif
1725 1732
1726 scoped_ptr<CopyTextureCHROMIUMResourceManager> copy_texture_CHROMIUM_; 1733 scoped_ptr<CopyTextureCHROMIUMResourceManager> copy_texture_CHROMIUM_;
1727 1734
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
2173 } 2180 }
2174 2181
2175 GLES2Decoder* GLES2Decoder::Create(ContextGroup* group) { 2182 GLES2Decoder* GLES2Decoder::Create(ContextGroup* group) {
2176 return new GLES2DecoderImpl(group); 2183 return new GLES2DecoderImpl(group);
2177 } 2184 }
2178 2185
2179 GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group) 2186 GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
2180 : GLES2Decoder(), 2187 : GLES2Decoder(),
2181 group_(group), 2188 group_(group),
2182 logger_(&debug_marker_manager_), 2189 logger_(&debug_marker_manager_),
2183 state_(group_->feature_info(), &logger_), 2190 state_(group_->feature_info(), this, &logger_),
2184 unpack_flip_y_(false), 2191 unpack_flip_y_(false),
2185 unpack_premultiply_alpha_(false), 2192 unpack_premultiply_alpha_(false),
2186 unpack_unpremultiply_alpha_(false), 2193 unpack_unpremultiply_alpha_(false),
2187 attrib_0_buffer_id_(0), 2194 attrib_0_buffer_id_(0),
2188 attrib_0_buffer_matches_value_(true), 2195 attrib_0_buffer_matches_value_(true),
2189 attrib_0_size_(0), 2196 attrib_0_size_(0),
2190 fixed_attrib_buffer_id_(0), 2197 fixed_attrib_buffer_id_(0),
2191 fixed_attrib_buffer_size_(0), 2198 fixed_attrib_buffer_size_(0),
2192 offscreen_target_color_format_(0), 2199 offscreen_target_color_format_(0),
2193 offscreen_target_depth_format_(0), 2200 offscreen_target_depth_format_(0),
(...skipping 11 matching lines...) Expand all
2205 feature_info_(group_->feature_info()), 2212 feature_info_(group_->feature_info()),
2206 frame_number_(0), 2213 frame_number_(0),
2207 has_robustness_extension_(false), 2214 has_robustness_extension_(false),
2208 reset_status_(GL_NO_ERROR), 2215 reset_status_(GL_NO_ERROR),
2209 reset_by_robustness_extension_(false), 2216 reset_by_robustness_extension_(false),
2210 force_webgl_glsl_validation_(false), 2217 force_webgl_glsl_validation_(false),
2211 derivatives_explicitly_enabled_(false), 2218 derivatives_explicitly_enabled_(false),
2212 frag_depth_explicitly_enabled_(false), 2219 frag_depth_explicitly_enabled_(false),
2213 draw_buffers_explicitly_enabled_(false), 2220 draw_buffers_explicitly_enabled_(false),
2214 compile_shader_always_succeeds_(false), 2221 compile_shader_always_succeeds_(false),
2222 lose_context_when_out_of_memory_(false),
2215 service_logging_(CommandLine::ForCurrentProcess()->HasSwitch( 2223 service_logging_(CommandLine::ForCurrentProcess()->HasSwitch(
2216 switches::kEnableGPUServiceLoggingGPU)), 2224 switches::kEnableGPUServiceLoggingGPU)),
2217 viewport_max_width_(0), 2225 viewport_max_width_(0),
2218 viewport_max_height_(0), 2226 viewport_max_height_(0),
2219 texture_state_(group_->feature_info() 2227 texture_state_(group_->feature_info()
2220 ->workarounds() 2228 ->workarounds()
2221 .texsubimage2d_faster_than_teximage2d), 2229 .texsubimage2d_faster_than_teximage2d),
2222 validation_texture_(0), 2230 validation_texture_(0),
2223 validation_fbo_multisample_(0), 2231 validation_fbo_multisample_(0),
2224 validation_fbo_(0) { 2232 validation_fbo_(0) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2278 2286
2279 // Take ownership of the context and surface. The surface can be replaced with 2287 // Take ownership of the context and surface. The surface can be replaced with
2280 // SetSurface. 2288 // SetSurface.
2281 context_ = context; 2289 context_ = context;
2282 surface_ = surface; 2290 surface_ = surface;
2283 2291
2284 ContextCreationAttribHelper attrib_parser; 2292 ContextCreationAttribHelper attrib_parser;
2285 if (!attrib_parser.Parse(attribs)) 2293 if (!attrib_parser.Parse(attribs))
2286 return false; 2294 return false;
2287 2295
2296 // Save the loseContextWhenOutOfMemory context creation attribute.
2297 lose_context_when_out_of_memory_ =
2298 attrib_parser.lose_context_when_out_of_memory_ > 0;
2299
2288 // If the failIfMajorPerformanceCaveat context creation attribute was true 2300 // If the failIfMajorPerformanceCaveat context creation attribute was true
2289 // and we are using a software renderer, fail. 2301 // and we are using a software renderer, fail.
2290 if (attrib_parser.fail_if_major_perf_caveat_ && 2302 if (attrib_parser.fail_if_major_perf_caveat_ &&
2291 feature_info_->feature_flags().is_swiftshader) { 2303 feature_info_->feature_flags().is_swiftshader) {
2292 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. 2304 group_ = NULL; // Must not destroy ContextGroup if it is not initialized.
2293 Destroy(true); 2305 Destroy(true);
2294 return false; 2306 return false;
2295 } 2307 }
2296 2308
2297 if (!group_->Initialize(this, disallowed_features)) { 2309 if (!group_->Initialize(this, disallowed_features)) {
(...skipping 8248 matching lines...) Expand 10 before | Expand all | Expand 10 after
10546 ProcessFinishedAsyncTransfers(); 10558 ProcessFinishedAsyncTransfers();
10547 return error::kNoError; 10559 return error::kNoError;
10548 } 10560 }
10549 10561
10550 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( 10562 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer(
10551 TextureRef* texture_ref) { 10563 TextureRef* texture_ref) {
10552 Texture* texture = texture_ref->texture(); 10564 Texture* texture = texture_ref->texture();
10553 DoDidUseTexImageIfNeeded(texture, texture->target()); 10565 DoDidUseTexImageIfNeeded(texture, texture->target());
10554 } 10566 }
10555 10567
10568 void GLES2DecoderImpl::OnOutOfMemoryError() {
10569 if (lose_context_when_out_of_memory_) {
10570 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB);
10571 LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB);
piman 2014/03/21 21:34:48 nit: we're guilty.
danakj 2014/03/21 22:53:50 Done.
10572 }
10573 }
10574
10556 // Include the auto-generated part of this file. We split this because it means 10575 // Include the auto-generated part of this file. We split this because it means
10557 // we can easily edit the non-auto generated parts right here in this file 10576 // we can easily edit the non-auto generated parts right here in this file
10558 // instead of having to edit some template or the code generator. 10577 // instead of having to edit some template or the code generator.
10559 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 10578 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
10560 10579
10561 } // namespace gles2 10580 } // namespace gles2
10562 } // namespace gpu 10581 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698