| 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 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 explicit BackRenderbuffer( | 400 explicit BackRenderbuffer( |
| 401 RenderbufferManager* renderbuffer_manager, | 401 RenderbufferManager* renderbuffer_manager, |
| 402 MemoryTracker* memory_tracker, | 402 MemoryTracker* memory_tracker, |
| 403 ContextState* state); | 403 ContextState* state); |
| 404 ~BackRenderbuffer(); | 404 ~BackRenderbuffer(); |
| 405 | 405 |
| 406 // Create a new render buffer. | 406 // Create a new render buffer. |
| 407 void Create(); | 407 void Create(); |
| 408 | 408 |
| 409 // Set the initial size and format of a render buffer or resize it. | 409 // Set the initial size and format of a render buffer or resize it. |
| 410 bool AllocateStorage(const gfx::Size& size, GLenum format, GLsizei samples); | 410 bool AllocateStorage(GLES2DecoderImpl* decoder, |
| 411 const gfx::Size& size, |
| 412 GLenum format, |
| 413 GLsizei samples); |
| 411 | 414 |
| 412 // Destroy the render buffer. This must be explicitly called before destroying | 415 // Destroy the render buffer. This must be explicitly called before destroying |
| 413 // this object. | 416 // this object. |
| 414 void Destroy(); | 417 void Destroy(); |
| 415 | 418 |
| 416 // Invalidate the render buffer. This can be used when a context is lost and | 419 // Invalidate the render buffer. This can be used when a context is lost and |
| 417 // it is not possible to make it current in order to free the resource. | 420 // it is not possible to make it current in order to free the resource. |
| 418 void Invalidate(); | 421 void Invalidate(); |
| 419 | 422 |
| 420 GLuint id() const { | 423 GLuint id() const { |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 bool BoundFramebufferHasColorAttachmentWithAlpha(bool all_draw_buffers); | 638 bool BoundFramebufferHasColorAttachmentWithAlpha(bool all_draw_buffers); |
| 636 bool BoundFramebufferHasDepthAttachment(); | 639 bool BoundFramebufferHasDepthAttachment(); |
| 637 bool BoundFramebufferHasStencilAttachment(); | 640 bool BoundFramebufferHasStencilAttachment(); |
| 638 | 641 |
| 639 virtual error::ContextLostReason GetContextLostReason() OVERRIDE; | 642 virtual error::ContextLostReason GetContextLostReason() OVERRIDE; |
| 640 | 643 |
| 641 // Overridden from FramebufferManager::TextureDetachObserver: | 644 // Overridden from FramebufferManager::TextureDetachObserver: |
| 642 virtual void OnTextureRefDetachedFromFramebuffer( | 645 virtual void OnTextureRefDetachedFromFramebuffer( |
| 643 TextureRef* texture) OVERRIDE; | 646 TextureRef* texture) OVERRIDE; |
| 644 | 647 |
| 648 // Helpers to facilitate calling into compatible extensions. |
| 649 void RenderbufferStorageMultisampleHelper(GLenum target, |
| 650 GLsizei samples, |
| 651 GLenum internal_format, |
| 652 GLsizei width, |
| 653 GLsizei height); |
| 654 void BlitFramebufferHelper(GLint srcX0, |
| 655 GLint srcY0, |
| 656 GLint srcX1, |
| 657 GLint srcY1, |
| 658 GLint dstX0, |
| 659 GLint dstY0, |
| 660 GLint dstX1, |
| 661 GLint dstY1, |
| 662 GLbitfield mask, |
| 663 GLenum filter); |
| 664 |
| 645 private: | 665 private: |
| 646 friend class ScopedFrameBufferBinder; | 666 friend class ScopedFrameBufferBinder; |
| 647 friend class ScopedResolvedFrameBufferBinder; | 667 friend class ScopedResolvedFrameBufferBinder; |
| 648 friend class BackFramebuffer; | 668 friend class BackFramebuffer; |
| 649 | 669 |
| 650 // Initialize or re-initialize the shader translator. | 670 // Initialize or re-initialize the shader translator. |
| 651 bool InitializeShaderTranslator(); | 671 bool InitializeShaderTranslator(); |
| 652 | 672 |
| 653 void UpdateCapabilities(); | 673 void UpdateCapabilities(); |
| 654 | 674 |
| (...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1810 } | 1830 } |
| 1811 } | 1831 } |
| 1812 targetid = decoder_->offscreen_resolved_frame_buffer_->id(); | 1832 targetid = decoder_->offscreen_resolved_frame_buffer_->id(); |
| 1813 } else { | 1833 } else { |
| 1814 targetid = decoder_->offscreen_saved_frame_buffer_->id(); | 1834 targetid = decoder_->offscreen_saved_frame_buffer_->id(); |
| 1815 } | 1835 } |
| 1816 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, targetid); | 1836 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, targetid); |
| 1817 const int width = decoder_->offscreen_size_.width(); | 1837 const int width = decoder_->offscreen_size_.width(); |
| 1818 const int height = decoder_->offscreen_size_.height(); | 1838 const int height = decoder_->offscreen_size_.height(); |
| 1819 glDisable(GL_SCISSOR_TEST); | 1839 glDisable(GL_SCISSOR_TEST); |
| 1820 if (GLES2Decoder::IsAngle()) { | 1840 decoder->BlitFramebufferHelper(0, |
| 1821 glBlitFramebufferANGLE(0, 0, width, height, 0, 0, width, height, | 1841 0, |
| 1822 GL_COLOR_BUFFER_BIT, GL_NEAREST); | 1842 width, |
| 1823 } else { | 1843 height, |
| 1824 glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, | 1844 0, |
| 1825 GL_COLOR_BUFFER_BIT, GL_NEAREST); | 1845 0, |
| 1826 } | 1846 width, |
| 1847 height, |
| 1848 GL_COLOR_BUFFER_BIT, |
| 1849 GL_NEAREST); |
| 1827 glBindFramebufferEXT(GL_FRAMEBUFFER, targetid); | 1850 glBindFramebufferEXT(GL_FRAMEBUFFER, targetid); |
| 1828 } | 1851 } |
| 1829 | 1852 |
| 1830 ScopedResolvedFrameBufferBinder::~ScopedResolvedFrameBufferBinder() { | 1853 ScopedResolvedFrameBufferBinder::~ScopedResolvedFrameBufferBinder() { |
| 1831 if (!resolve_and_bind_) | 1854 if (!resolve_and_bind_) |
| 1832 return; | 1855 return; |
| 1833 | 1856 |
| 1834 ScopedGLErrorSuppressor suppressor( | 1857 ScopedGLErrorSuppressor suppressor( |
| 1835 "ScopedResolvedFrameBufferBinder::dtor", decoder_->GetErrorState()); | 1858 "ScopedResolvedFrameBufferBinder::dtor", decoder_->GetErrorState()); |
| 1836 decoder_->RestoreCurrentFramebufferBindings(); | 1859 decoder_->RestoreCurrentFramebufferBindings(); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1968 DCHECK_EQ(id_, 0u); | 1991 DCHECK_EQ(id_, 0u); |
| 1969 } | 1992 } |
| 1970 | 1993 |
| 1971 void BackRenderbuffer::Create() { | 1994 void BackRenderbuffer::Create() { |
| 1972 ScopedGLErrorSuppressor suppressor("BackRenderbuffer::Create", | 1995 ScopedGLErrorSuppressor suppressor("BackRenderbuffer::Create", |
| 1973 state_->GetErrorState()); | 1996 state_->GetErrorState()); |
| 1974 Destroy(); | 1997 Destroy(); |
| 1975 glGenRenderbuffersEXT(1, &id_); | 1998 glGenRenderbuffersEXT(1, &id_); |
| 1976 } | 1999 } |
| 1977 | 2000 |
| 1978 bool BackRenderbuffer::AllocateStorage(const gfx::Size& size, GLenum format, | 2001 bool BackRenderbuffer::AllocateStorage(GLES2DecoderImpl* decoder, |
| 2002 const gfx::Size& size, |
| 2003 GLenum format, |
| 1979 GLsizei samples) { | 2004 GLsizei samples) { |
| 1980 ScopedGLErrorSuppressor suppressor( | 2005 ScopedGLErrorSuppressor suppressor( |
| 1981 "BackRenderbuffer::AllocateStorage", state_->GetErrorState()); | 2006 "BackRenderbuffer::AllocateStorage", state_->GetErrorState()); |
| 1982 ScopedRenderBufferBinder binder(state_, id_); | 2007 ScopedRenderBufferBinder binder(state_, id_); |
| 1983 | 2008 |
| 1984 uint32 estimated_size = 0; | 2009 uint32 estimated_size = 0; |
| 1985 if (!renderbuffer_manager_->ComputeEstimatedRenderbufferSize( | 2010 if (!renderbuffer_manager_->ComputeEstimatedRenderbufferSize( |
| 1986 size.width(), size.height(), samples, format, &estimated_size)) { | 2011 size.width(), size.height(), samples, format, &estimated_size)) { |
| 1987 return false; | 2012 return false; |
| 1988 } | 2013 } |
| 1989 | 2014 |
| 1990 if (!memory_tracker_.EnsureGPUMemoryAvailable(estimated_size)) { | 2015 if (!memory_tracker_.EnsureGPUMemoryAvailable(estimated_size)) { |
| 1991 return false; | 2016 return false; |
| 1992 } | 2017 } |
| 1993 | 2018 |
| 1994 if (samples <= 1) { | 2019 if (samples <= 1) { |
| 1995 glRenderbufferStorageEXT(GL_RENDERBUFFER, | 2020 glRenderbufferStorageEXT(GL_RENDERBUFFER, |
| 1996 format, | 2021 format, |
| 1997 size.width(), | 2022 size.width(), |
| 1998 size.height()); | 2023 size.height()); |
| 1999 } else { | 2024 } else { |
| 2000 if (GLES2Decoder::IsAngle()) { | 2025 decoder->RenderbufferStorageMultisampleHelper( |
| 2001 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, | 2026 GL_RENDERBUFFER, samples, format, size.width(), size.height()); |
| 2002 samples, | |
| 2003 format, | |
| 2004 size.width(), | |
| 2005 size.height()); | |
| 2006 } else { | |
| 2007 glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, | |
| 2008 samples, | |
| 2009 format, | |
| 2010 size.width(), | |
| 2011 size.height()); | |
| 2012 } | |
| 2013 } | 2027 } |
| 2014 bool success = glGetError() == GL_NO_ERROR; | 2028 bool success = glGetError() == GL_NO_ERROR; |
| 2015 if (success) { | 2029 if (success) { |
| 2016 // Mark the previously allocated bytes as free. | 2030 // Mark the previously allocated bytes as free. |
| 2017 memory_tracker_.TrackMemFree(bytes_allocated_); | 2031 memory_tracker_.TrackMemFree(bytes_allocated_); |
| 2018 bytes_allocated_ = estimated_size; | 2032 bytes_allocated_ = estimated_size; |
| 2019 // Track the newly allocated bytes. | 2033 // Track the newly allocated bytes. |
| 2020 memory_tracker_.TrackMemAlloc(bytes_allocated_); | 2034 memory_tracker_.TrackMemAlloc(bytes_allocated_); |
| 2021 } | 2035 } |
| 2022 return success; | 2036 return success; |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2303 GL_RGBA8 : GL_RGB8; | 2317 GL_RGBA8 : GL_RGB8; |
| 2304 } else { | 2318 } else { |
| 2305 offscreen_target_samples_ = 1; | 2319 offscreen_target_samples_ = 1; |
| 2306 offscreen_target_color_format_ = attrib_parser.alpha_size_ > 0 ? | 2320 offscreen_target_color_format_ = attrib_parser.alpha_size_ > 0 ? |
| 2307 GL_RGBA : GL_RGB; | 2321 GL_RGBA : GL_RGB; |
| 2308 } | 2322 } |
| 2309 | 2323 |
| 2310 // ANGLE only supports packed depth/stencil formats, so use it if it is | 2324 // ANGLE only supports packed depth/stencil formats, so use it if it is |
| 2311 // available. | 2325 // available. |
| 2312 const bool depth24_stencil8_supported = | 2326 const bool depth24_stencil8_supported = |
| 2313 context_->HasExtension("GL_OES_packed_depth_stencil"); | 2327 feature_info_->feature_flags().packed_depth24_stencil8; |
| 2314 VLOG(1) << "GL_OES_packed_depth_stencil " | 2328 VLOG(1) << "GL_OES_packed_depth_stencil " |
| 2315 << (depth24_stencil8_supported ? "" : "not ") << "supported."; | 2329 << (depth24_stencil8_supported ? "" : "not ") << "supported."; |
| 2316 if ((attrib_parser.depth_size_ > 0 || attrib_parser.stencil_size_ > 0) && | 2330 if ((attrib_parser.depth_size_ > 0 || attrib_parser.stencil_size_ > 0) && |
| 2317 depth24_stencil8_supported) { | 2331 depth24_stencil8_supported) { |
| 2318 offscreen_target_depth_format_ = GL_DEPTH24_STENCIL8; | 2332 offscreen_target_depth_format_ = GL_DEPTH24_STENCIL8; |
| 2319 offscreen_target_stencil_format_ = 0; | 2333 offscreen_target_stencil_format_ = 0; |
| 2320 } else { | 2334 } else { |
| 2321 // It may be the case that this depth/stencil combination is not | 2335 // It may be the case that this depth/stencil combination is not |
| 2322 // supported, but this will be checked later by CheckFramebufferStatus. | 2336 // supported, but this will be checked later by CheckFramebufferStatus. |
| 2323 offscreen_target_depth_format_ = attrib_parser.depth_size_ > 0 ? | 2337 offscreen_target_depth_format_ = attrib_parser.depth_size_ > 0 ? |
| 2324 GL_DEPTH_COMPONENT16 : 0; | 2338 GL_DEPTH_COMPONENT16 : 0; |
| 2325 offscreen_target_stencil_format_ = attrib_parser.stencil_size_ > 0 ? | 2339 offscreen_target_stencil_format_ = attrib_parser.stencil_size_ > 0 ? |
| 2326 GL_STENCIL_INDEX8 : 0; | 2340 GL_STENCIL_INDEX8 : 0; |
| 2327 } | 2341 } |
| 2328 } else { | 2342 } else { |
| 2329 offscreen_target_color_format_ = attrib_parser.alpha_size_ > 0 ? | 2343 offscreen_target_color_format_ = attrib_parser.alpha_size_ > 0 ? |
| 2330 GL_RGBA : GL_RGB; | 2344 GL_RGBA : GL_RGB; |
| 2331 | 2345 |
| 2332 // If depth is requested at all, use the packed depth stencil format if | 2346 // If depth is requested at all, use the packed depth stencil format if |
| 2333 // it's available, as some desktop GL drivers don't support any non-packed | 2347 // it's available, as some desktop GL drivers don't support any non-packed |
| 2334 // formats for depth attachments. | 2348 // formats for depth attachments. |
| 2335 const bool depth24_stencil8_supported = | 2349 const bool depth24_stencil8_supported = |
| 2336 context_->HasExtension("GL_EXT_packed_depth_stencil"); | 2350 feature_info_->feature_flags().packed_depth24_stencil8; |
| 2337 VLOG(1) << "GL_EXT_packed_depth_stencil " | 2351 VLOG(1) << "GL_EXT_packed_depth_stencil " |
| 2338 << (depth24_stencil8_supported ? "" : "not ") << "supported."; | 2352 << (depth24_stencil8_supported ? "" : "not ") << "supported."; |
| 2339 | 2353 |
| 2340 if ((attrib_parser.depth_size_ > 0 || attrib_parser.stencil_size_ > 0) && | 2354 if ((attrib_parser.depth_size_ > 0 || attrib_parser.stencil_size_ > 0) && |
| 2341 depth24_stencil8_supported) { | 2355 depth24_stencil8_supported) { |
| 2342 offscreen_target_depth_format_ = GL_DEPTH24_STENCIL8; | 2356 offscreen_target_depth_format_ = GL_DEPTH24_STENCIL8; |
| 2343 offscreen_target_stencil_format_ = 0; | 2357 offscreen_target_stencil_format_ = 0; |
| 2344 } else { | 2358 } else { |
| 2345 offscreen_target_depth_format_ = attrib_parser.depth_size_ > 0 ? | 2359 offscreen_target_depth_format_ = attrib_parser.depth_size_ > 0 ? |
| 2346 GL_DEPTH_COMPONENT : 0; | 2360 GL_DEPTH_COMPONENT : 0; |
| (...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3321 if (w < 0 || h < 0 || h >= (INT_MAX / 4) / (w ? w : 1)) { | 3335 if (w < 0 || h < 0 || h >= (INT_MAX / 4) / (w ? w : 1)) { |
| 3322 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " | 3336 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " |
| 3323 << "to allocate storage due to excessive dimensions."; | 3337 << "to allocate storage due to excessive dimensions."; |
| 3324 return false; | 3338 return false; |
| 3325 } | 3339 } |
| 3326 | 3340 |
| 3327 // Reallocate the offscreen target buffers. | 3341 // Reallocate the offscreen target buffers. |
| 3328 DCHECK(offscreen_target_color_format_); | 3342 DCHECK(offscreen_target_color_format_); |
| 3329 if (IsOffscreenBufferMultisampled()) { | 3343 if (IsOffscreenBufferMultisampled()) { |
| 3330 if (!offscreen_target_color_render_buffer_->AllocateStorage( | 3344 if (!offscreen_target_color_render_buffer_->AllocateStorage( |
| 3331 offscreen_size_, offscreen_target_color_format_, | 3345 this, offscreen_size_, offscreen_target_color_format_, |
| 3332 offscreen_target_samples_)) { | 3346 offscreen_target_samples_)) { |
| 3333 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " | 3347 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " |
| 3334 << "to allocate storage for offscreen target color buffer."; | 3348 << "to allocate storage for offscreen target color buffer."; |
| 3335 return false; | 3349 return false; |
| 3336 } | 3350 } |
| 3337 } else { | 3351 } else { |
| 3338 if (!offscreen_target_color_texture_->AllocateStorage( | 3352 if (!offscreen_target_color_texture_->AllocateStorage( |
| 3339 offscreen_size_, offscreen_target_color_format_, false)) { | 3353 offscreen_size_, offscreen_target_color_format_, false)) { |
| 3340 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " | 3354 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " |
| 3341 << "to allocate storage for offscreen target color texture."; | 3355 << "to allocate storage for offscreen target color texture."; |
| 3342 return false; | 3356 return false; |
| 3343 } | 3357 } |
| 3344 } | 3358 } |
| 3345 if (offscreen_target_depth_format_ && | 3359 if (offscreen_target_depth_format_ && |
| 3346 !offscreen_target_depth_render_buffer_->AllocateStorage( | 3360 !offscreen_target_depth_render_buffer_->AllocateStorage( |
| 3347 offscreen_size_, offscreen_target_depth_format_, | 3361 this, offscreen_size_, offscreen_target_depth_format_, |
| 3348 offscreen_target_samples_)) { | 3362 offscreen_target_samples_)) { |
| 3349 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " | 3363 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " |
| 3350 << "to allocate storage for offscreen target depth buffer."; | 3364 << "to allocate storage for offscreen target depth buffer."; |
| 3351 return false; | 3365 return false; |
| 3352 } | 3366 } |
| 3353 if (offscreen_target_stencil_format_ && | 3367 if (offscreen_target_stencil_format_ && |
| 3354 !offscreen_target_stencil_render_buffer_->AllocateStorage( | 3368 !offscreen_target_stencil_render_buffer_->AllocateStorage( |
| 3355 offscreen_size_, offscreen_target_stencil_format_, | 3369 this, offscreen_size_, offscreen_target_stencil_format_, |
| 3356 offscreen_target_samples_)) { | 3370 offscreen_target_samples_)) { |
| 3357 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " | 3371 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed " |
| 3358 << "to allocate storage for offscreen target stencil buffer."; | 3372 << "to allocate storage for offscreen target stencil buffer."; |
| 3359 return false; | 3373 return false; |
| 3360 } | 3374 } |
| 3361 | 3375 |
| 3362 // Attach the offscreen target buffers to the target frame buffer. | 3376 // Attach the offscreen target buffers to the target frame buffer. |
| 3363 if (IsOffscreenBufferMultisampled()) { | 3377 if (IsOffscreenBufferMultisampled()) { |
| 3364 offscreen_target_frame_buffer_->AttachRenderBuffer( | 3378 offscreen_target_frame_buffer_->AttachRenderBuffer( |
| 3365 GL_COLOR_ATTACHMENT0, | 3379 GL_COLOR_ATTACHMENT0, |
| (...skipping 1631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4997 GL_INVALID_OPERATION, | 5011 GL_INVALID_OPERATION, |
| 4998 "glBlitFramebufferCHROMIUM", "function not available"); | 5012 "glBlitFramebufferCHROMIUM", "function not available"); |
| 4999 return; | 5013 return; |
| 5000 } | 5014 } |
| 5001 | 5015 |
| 5002 if (!CheckBoundFramebuffersValid("glBlitFramebufferCHROMIUM")) { | 5016 if (!CheckBoundFramebuffersValid("glBlitFramebufferCHROMIUM")) { |
| 5003 return; | 5017 return; |
| 5004 } | 5018 } |
| 5005 | 5019 |
| 5006 glDisable(GL_SCISSOR_TEST); | 5020 glDisable(GL_SCISSOR_TEST); |
| 5021 BlitFramebufferHelper( |
| 5022 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); |
| 5023 EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); |
| 5024 } |
| 5025 |
| 5026 void GLES2DecoderImpl::RenderbufferStorageMultisampleHelper( |
| 5027 GLenum target, |
| 5028 GLsizei samples, |
| 5029 GLenum internal_format, |
| 5030 GLsizei width, |
| 5031 GLsizei height) { |
| 5032 // TODO(sievers): This could be resolved at the GL binding level, but the |
| 5033 // binding process is currently a bit too 'brute force'. |
| 5034 if (IsAngle()) { |
| 5035 glRenderbufferStorageMultisampleANGLE( |
| 5036 target, samples, internal_format, width, height); |
| 5037 } else if (feature_info_->feature_flags().core_framebuffer_multisample) { |
| 5038 glRenderbufferStorageMultisample( |
| 5039 target, samples, internal_format, width, height); |
| 5040 } else { |
| 5041 glRenderbufferStorageMultisampleEXT( |
| 5042 target, samples, internal_format, width, height); |
| 5043 } |
| 5044 } |
| 5045 |
| 5046 void GLES2DecoderImpl::BlitFramebufferHelper(GLint srcX0, |
| 5047 GLint srcY0, |
| 5048 GLint srcX1, |
| 5049 GLint srcY1, |
| 5050 GLint dstX0, |
| 5051 GLint dstY0, |
| 5052 GLint dstX1, |
| 5053 GLint dstY1, |
| 5054 GLbitfield mask, |
| 5055 GLenum filter) { |
| 5056 // TODO(sievers): This could be resolved at the GL binding level, but the |
| 5057 // binding process is currently a bit too 'brute force'. |
| 5007 if (IsAngle()) { | 5058 if (IsAngle()) { |
| 5008 glBlitFramebufferANGLE( | 5059 glBlitFramebufferANGLE( |
| 5009 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); | 5060 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); |
| 5061 } else if (feature_info_->feature_flags().core_framebuffer_multisample) { |
| 5062 glBlitFramebuffer( |
| 5063 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); |
| 5010 } else { | 5064 } else { |
| 5011 glBlitFramebufferEXT( | 5065 glBlitFramebufferEXT( |
| 5012 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); | 5066 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); |
| 5013 } | 5067 } |
| 5014 EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); | |
| 5015 } | 5068 } |
| 5016 | 5069 |
| 5017 bool GLES2DecoderImpl::ValidateRenderbufferStorageMultisample( | 5070 bool GLES2DecoderImpl::ValidateRenderbufferStorageMultisample( |
| 5018 GLsizei samples, | 5071 GLsizei samples, |
| 5019 GLenum internalformat, | 5072 GLenum internalformat, |
| 5020 GLsizei width, | 5073 GLsizei width, |
| 5021 GLsizei height) { | 5074 GLsizei height) { |
| 5022 if (samples > renderbuffer_manager()->max_samples()) { | 5075 if (samples > renderbuffer_manager()->max_samples()) { |
| 5023 LOCAL_SET_GL_ERROR( | 5076 LOCAL_SET_GL_ERROR( |
| 5024 GL_INVALID_VALUE, | 5077 GL_INVALID_VALUE, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5074 if (!ValidateRenderbufferStorageMultisample( | 5127 if (!ValidateRenderbufferStorageMultisample( |
| 5075 samples, internalformat, width, height)) { | 5128 samples, internalformat, width, height)) { |
| 5076 return; | 5129 return; |
| 5077 } | 5130 } |
| 5078 | 5131 |
| 5079 GLenum impl_format = | 5132 GLenum impl_format = |
| 5080 renderbuffer_manager()->InternalRenderbufferFormatToImplFormat( | 5133 renderbuffer_manager()->InternalRenderbufferFormatToImplFormat( |
| 5081 internalformat); | 5134 internalformat); |
| 5082 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER( | 5135 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER( |
| 5083 "glRenderbufferStorageMultisampleCHROMIUM"); | 5136 "glRenderbufferStorageMultisampleCHROMIUM"); |
| 5084 if (IsAngle()) { | 5137 RenderbufferStorageMultisampleHelper( |
| 5085 glRenderbufferStorageMultisampleANGLE( | 5138 target, samples, impl_format, width, height); |
| 5086 target, samples, impl_format, width, height); | |
| 5087 } else { | |
| 5088 glRenderbufferStorageMultisampleEXT( | |
| 5089 target, samples, impl_format, width, height); | |
| 5090 } | |
| 5091 GLenum error = | 5139 GLenum error = |
| 5092 LOCAL_PEEK_GL_ERROR("glRenderbufferStorageMultisampleCHROMIUM"); | 5140 LOCAL_PEEK_GL_ERROR("glRenderbufferStorageMultisampleCHROMIUM"); |
| 5093 if (error == GL_NO_ERROR) { | 5141 if (error == GL_NO_ERROR) { |
| 5094 | 5142 |
| 5095 if (workarounds().validate_multisample_buffer_allocation) { | 5143 if (workarounds().validate_multisample_buffer_allocation) { |
| 5096 if (!VerifyMultisampleRenderbufferIntegrity( | 5144 if (!VerifyMultisampleRenderbufferIntegrity( |
| 5097 renderbuffer->service_id(), impl_format)) { | 5145 renderbuffer->service_id(), impl_format)) { |
| 5098 LOCAL_SET_GL_ERROR( | 5146 LOCAL_SET_GL_ERROR( |
| 5099 GL_OUT_OF_MEMORY, | 5147 GL_OUT_OF_MEMORY, |
| 5100 "glRenderbufferStorageMultisampleCHROMIUM", "out of memory"); | 5148 "glRenderbufferStorageMultisampleCHROMIUM", "out of memory"); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5220 glGetFloatv(GL_COLOR_CLEAR_VALUE, clear_color); | 5268 glGetFloatv(GL_COLOR_CLEAR_VALUE, clear_color); |
| 5221 glClearColor(1.0f, 0.0f, 1.0f, 1.0f); | 5269 glClearColor(1.0f, 0.0f, 1.0f, 1.0f); |
| 5222 | 5270 |
| 5223 // Clear the buffer to the desired key color. | 5271 // Clear the buffer to the desired key color. |
| 5224 glClear(GL_COLOR_BUFFER_BIT); | 5272 glClear(GL_COLOR_BUFFER_BIT); |
| 5225 | 5273 |
| 5226 // Blit from the multisample buffer to a standard texture. | 5274 // Blit from the multisample buffer to a standard texture. |
| 5227 glBindFramebufferEXT(GL_READ_FRAMEBUFFER, validation_fbo_multisample_); | 5275 glBindFramebufferEXT(GL_READ_FRAMEBUFFER, validation_fbo_multisample_); |
| 5228 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, validation_fbo_); | 5276 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, validation_fbo_); |
| 5229 | 5277 |
| 5230 glBlitFramebufferEXT(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST); | 5278 BlitFramebufferHelper( |
| 5279 0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST); |
| 5231 | 5280 |
| 5232 // Read a pixel from the buffer. | 5281 // Read a pixel from the buffer. |
| 5233 glBindFramebufferEXT(GL_FRAMEBUFFER, validation_fbo_); | 5282 glBindFramebufferEXT(GL_FRAMEBUFFER, validation_fbo_); |
| 5234 | 5283 |
| 5235 unsigned char pixel[3] = {0, 0, 0}; | 5284 unsigned char pixel[3] = {0, 0, 0}; |
| 5236 glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel); | 5285 glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel); |
| 5237 | 5286 |
| 5238 // Detach the renderbuffer. | 5287 // Detach the renderbuffer. |
| 5239 glBindFramebufferEXT(GL_FRAMEBUFFER, validation_fbo_multisample_); | 5288 glBindFramebufferEXT(GL_FRAMEBUFFER, validation_fbo_multisample_); |
| 5240 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | 5289 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, |
| (...skipping 5229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10470 DoDidUseTexImageIfNeeded(texture, texture->target()); | 10519 DoDidUseTexImageIfNeeded(texture, texture->target()); |
| 10471 } | 10520 } |
| 10472 | 10521 |
| 10473 // Include the auto-generated part of this file. We split this because it means | 10522 // Include the auto-generated part of this file. We split this because it means |
| 10474 // we can easily edit the non-auto generated parts right here in this file | 10523 // we can easily edit the non-auto generated parts right here in this file |
| 10475 // instead of having to edit some template or the code generator. | 10524 // instead of having to edit some template or the code generator. |
| 10476 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10525 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 10477 | 10526 |
| 10478 } // namespace gles2 | 10527 } // namespace gles2 |
| 10479 } // namespace gpu | 10528 } // namespace gpu |
| OLD | NEW |