OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 const gfx::Size& size, | 500 const gfx::Size& size, |
501 const DisallowedFeatures& disallowed_features, | 501 const DisallowedFeatures& disallowed_features, |
502 const char* allowed_extensions, | 502 const char* allowed_extensions, |
503 const std::vector<int32>& attribs); | 503 const std::vector<int32>& attribs); |
504 virtual void Destroy(); | 504 virtual void Destroy(); |
505 virtual bool SetParent(GLES2Decoder* parent_decoder, | 505 virtual bool SetParent(GLES2Decoder* parent_decoder, |
506 uint32 parent_texture_id); | 506 uint32 parent_texture_id); |
507 virtual bool ResizeOffscreenFrameBuffer(const gfx::Size& size); | 507 virtual bool ResizeOffscreenFrameBuffer(const gfx::Size& size); |
508 void UpdateParentTextureInfo(); | 508 void UpdateParentTextureInfo(); |
509 virtual bool MakeCurrent(); | 509 virtual bool MakeCurrent(); |
| 510 virtual void ReleaseCurrent(); |
510 virtual GLES2Util* GetGLES2Util() { return &util_; } | 511 virtual GLES2Util* GetGLES2Util() { return &util_; } |
511 virtual gfx::GLContext* GetGLContext() { return context_.get(); } | 512 virtual gfx::GLContext* GetGLContext() { return context_.get(); } |
512 virtual gfx::GLSurface* GetGLSurface() { return surface_.get(); } | 513 virtual gfx::GLSurface* GetGLSurface() { return surface_.get(); } |
513 virtual ContextGroup* GetContextGroup() { return group_.get(); } | 514 virtual ContextGroup* GetContextGroup() { return group_.get(); } |
514 | 515 |
515 virtual void SetResizeCallback(Callback1<gfx::Size>::Type* callback); | 516 virtual void SetResizeCallback(Callback1<gfx::Size>::Type* callback); |
516 | 517 |
517 #if defined(OS_MACOSX) | |
518 virtual void SetSwapBuffersCallback(Callback0::Type* callback); | 518 virtual void SetSwapBuffersCallback(Callback0::Type* callback); |
519 #endif | |
520 | 519 |
521 virtual void SetStreamTextureManager(StreamTextureManager* manager); | 520 virtual void SetStreamTextureManager(StreamTextureManager* manager); |
522 virtual bool GetServiceTextureId(uint32 client_texture_id, | 521 virtual bool GetServiceTextureId(uint32 client_texture_id, |
523 uint32* service_texture_id); | 522 uint32* service_texture_id); |
524 | 523 |
525 // Restores the current state to the user's settings. | 524 // Restores the current state to the user's settings. |
526 void RestoreCurrentFramebufferBindings(); | 525 void RestoreCurrentFramebufferBindings(); |
527 void RestoreCurrentRenderbufferBindings(); | 526 void RestoreCurrentRenderbufferBindings(); |
528 void RestoreCurrentTexture2DBindings(); | 527 void RestoreCurrentTexture2DBindings(); |
529 | 528 |
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1317 scoped_ptr<FrameBuffer> offscreen_saved_frame_buffer_; | 1316 scoped_ptr<FrameBuffer> offscreen_saved_frame_buffer_; |
1318 scoped_ptr<Texture> offscreen_saved_color_texture_; | 1317 scoped_ptr<Texture> offscreen_saved_color_texture_; |
1319 | 1318 |
1320 // The copy that is used as the destination for multi-sample resolves. | 1319 // The copy that is used as the destination for multi-sample resolves. |
1321 scoped_ptr<FrameBuffer> offscreen_resolved_frame_buffer_; | 1320 scoped_ptr<FrameBuffer> offscreen_resolved_frame_buffer_; |
1322 scoped_ptr<Texture> offscreen_resolved_color_texture_; | 1321 scoped_ptr<Texture> offscreen_resolved_color_texture_; |
1323 GLenum offscreen_saved_color_format_; | 1322 GLenum offscreen_saved_color_format_; |
1324 | 1323 |
1325 scoped_ptr<Callback1<gfx::Size>::Type> resize_callback_; | 1324 scoped_ptr<Callback1<gfx::Size>::Type> resize_callback_; |
1326 | 1325 |
1327 #if defined(OS_MACOSX) | |
1328 scoped_ptr<Callback0::Type> swap_buffers_callback_; | 1326 scoped_ptr<Callback0::Type> swap_buffers_callback_; |
1329 #endif | |
1330 | 1327 |
1331 StreamTextureManager* stream_texture_manager_; | 1328 StreamTextureManager* stream_texture_manager_; |
1332 | 1329 |
1333 // The format of the back buffer_ | 1330 // The format of the back buffer_ |
1334 GLenum back_buffer_color_format_; | 1331 GLenum back_buffer_color_format_; |
1335 bool back_buffer_has_depth_; | 1332 bool back_buffer_has_depth_; |
1336 bool back_buffer_has_stencil_; | 1333 bool back_buffer_has_stencil_; |
1337 | 1334 |
1338 bool teximage2d_faster_than_texsubimage2d_; | 1335 bool teximage2d_faster_than_texsubimage2d_; |
1339 bool bufferdata_faster_than_buffersubdata_; | 1336 bool bufferdata_faster_than_buffersubdata_; |
(...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2216 bool GLES2DecoderImpl::MakeCurrent() { | 2213 bool GLES2DecoderImpl::MakeCurrent() { |
2217 bool result = context_.get() ? context_->MakeCurrent(surface_.get()) : false; | 2214 bool result = context_.get() ? context_->MakeCurrent(surface_.get()) : false; |
2218 if (result && WasContextLost()) { | 2215 if (result && WasContextLost()) { |
2219 LOG(ERROR) << " GLES2DecoderImpl: Context lost during MakeCurrent."; | 2216 LOG(ERROR) << " GLES2DecoderImpl: Context lost during MakeCurrent."; |
2220 result = false; | 2217 result = false; |
2221 } | 2218 } |
2222 | 2219 |
2223 return result; | 2220 return result; |
2224 } | 2221 } |
2225 | 2222 |
| 2223 void GLES2DecoderImpl::ReleaseCurrent() { |
| 2224 if (context_.get()) |
| 2225 context_->ReleaseCurrent(surface_.get()); |
| 2226 } |
| 2227 |
2226 void GLES2DecoderImpl::RestoreCurrentRenderbufferBindings() { | 2228 void GLES2DecoderImpl::RestoreCurrentRenderbufferBindings() { |
2227 glBindRenderbufferEXT( | 2229 glBindRenderbufferEXT( |
2228 GL_RENDERBUFFER, | 2230 GL_RENDERBUFFER, |
2229 bound_renderbuffer_ ? bound_renderbuffer_->service_id() : 0); | 2231 bound_renderbuffer_ ? bound_renderbuffer_->service_id() : 0); |
2230 } | 2232 } |
2231 | 2233 |
2232 static void RebindCurrentFramebuffer( | 2234 static void RebindCurrentFramebuffer( |
2233 GLenum target, | 2235 GLenum target, |
2234 FramebufferManager::FramebufferInfo* info, | 2236 FramebufferManager::FramebufferInfo* info, |
2235 FrameBuffer* offscreen_frame_buffer) { | 2237 FrameBuffer* offscreen_frame_buffer) { |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2364 GL_TEXTURE_WRAP_T, | 2366 GL_TEXTURE_WRAP_T, |
2365 GL_CLAMP_TO_EDGE); | 2367 GL_CLAMP_TO_EDGE); |
2366 } | 2368 } |
2367 } | 2369 } |
2368 | 2370 |
2369 void GLES2DecoderImpl::SetResizeCallback( | 2371 void GLES2DecoderImpl::SetResizeCallback( |
2370 Callback1<gfx::Size>::Type* callback) { | 2372 Callback1<gfx::Size>::Type* callback) { |
2371 resize_callback_.reset(callback); | 2373 resize_callback_.reset(callback); |
2372 } | 2374 } |
2373 | 2375 |
2374 #if defined(OS_MACOSX) | |
2375 void GLES2DecoderImpl::SetSwapBuffersCallback(Callback0::Type* callback) { | 2376 void GLES2DecoderImpl::SetSwapBuffersCallback(Callback0::Type* callback) { |
2376 swap_buffers_callback_.reset(callback); | 2377 swap_buffers_callback_.reset(callback); |
2377 } | 2378 } |
2378 #endif | |
2379 | 2379 |
2380 void GLES2DecoderImpl::SetStreamTextureManager(StreamTextureManager* manager) { | 2380 void GLES2DecoderImpl::SetStreamTextureManager(StreamTextureManager* manager) { |
2381 stream_texture_manager_ = manager; | 2381 stream_texture_manager_ = manager; |
2382 } | 2382 } |
2383 | 2383 |
2384 bool GLES2DecoderImpl::GetServiceTextureId(uint32 client_texture_id, | 2384 bool GLES2DecoderImpl::GetServiceTextureId(uint32 client_texture_id, |
2385 uint32* service_texture_id) { | 2385 uint32* service_texture_id) { |
2386 TextureManager::TextureInfo* texture = | 2386 TextureManager::TextureInfo* texture = |
2387 texture_manager()->GetTextureInfo(client_texture_id); | 2387 texture_manager()->GetTextureInfo(client_texture_id); |
2388 if (texture) { | 2388 if (texture) { |
(...skipping 4455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6844 | 6844 |
6845 UpdateParentTextureInfo(); | 6845 UpdateParentTextureInfo(); |
6846 } | 6846 } |
6847 | 6847 |
6848 ScopedGLErrorSuppressor suppressor(this); | 6848 ScopedGLErrorSuppressor suppressor(this); |
6849 | 6849 |
6850 if (IsOffscreenBufferMultisampled()) { | 6850 if (IsOffscreenBufferMultisampled()) { |
6851 // For multisampled buffers, bind the resolved frame buffer so that | 6851 // For multisampled buffers, bind the resolved frame buffer so that |
6852 // callbacks can call ReadPixels or CopyTexImage2D. | 6852 // callbacks can call ReadPixels or CopyTexImage2D. |
6853 ScopedResolvedFrameBufferBinder binder(this, true, false); | 6853 ScopedResolvedFrameBufferBinder binder(this, true, false); |
6854 #if defined(OS_MACOSX) | |
6855 if (swap_buffers_callback_.get()) { | 6854 if (swap_buffers_callback_.get()) { |
6856 swap_buffers_callback_->Run(); | 6855 swap_buffers_callback_->Run(); |
6857 } | 6856 } |
6858 #endif | 6857 |
6859 return error::kNoError; | 6858 return error::kNoError; |
6860 } else { | 6859 } else { |
6861 ScopedFrameBufferBinder binder(this, | 6860 ScopedFrameBufferBinder binder(this, |
6862 offscreen_target_frame_buffer_->id()); | 6861 offscreen_target_frame_buffer_->id()); |
6863 | 6862 |
6864 if (surface_->IsOffscreen()) { | 6863 if (surface_->IsOffscreen()) { |
6865 // Copy the target frame buffer to the saved offscreen texture. | 6864 // Copy the target frame buffer to the saved offscreen texture. |
6866 offscreen_saved_color_texture_->Copy( | 6865 offscreen_saved_color_texture_->Copy( |
6867 offscreen_saved_color_texture_->size(), | 6866 offscreen_saved_color_texture_->size(), |
6868 offscreen_saved_color_format_); | 6867 offscreen_saved_color_format_); |
6869 | 6868 |
6870 // Ensure the side effects of the copy are visible to the parent | 6869 // Ensure the side effects of the copy are visible to the parent |
6871 // context. There is no need to do this for ANGLE because it uses a | 6870 // context. There is no need to do this for ANGLE because it uses a |
6872 // single D3D device for all contexts. | 6871 // single D3D device for all contexts. |
6873 if (!IsAngle()) | 6872 if (!IsAngle()) |
6874 glFlush(); | 6873 glFlush(); |
6875 } | 6874 } |
6876 | 6875 |
6877 // Run the callback with |binder| in scope, so that the callback can call | 6876 // Run the callback with |binder| in scope, so that the callback can call |
6878 // ReadPixels or CopyTexImage2D. | 6877 // ReadPixels or CopyTexImage2D. |
6879 #if defined(OS_MACOSX) | |
6880 if (swap_buffers_callback_.get()) { | 6878 if (swap_buffers_callback_.get()) { |
6881 swap_buffers_callback_->Run(); | 6879 swap_buffers_callback_->Run(); |
6882 } | 6880 } |
6883 #endif | 6881 |
6884 return error::kNoError; | 6882 return error::kNoError; |
6885 } | 6883 } |
6886 } else { | 6884 } else { |
6887 TRACE_EVENT1("gpu", "GLContext::SwapBuffers", "frame", this_frame_number); | 6885 TRACE_EVENT1("gpu", "GLContext::SwapBuffers", "frame", this_frame_number); |
6888 if (!surface_->SwapBuffers()) { | 6886 if (!surface_->SwapBuffers()) { |
6889 LOG(ERROR) << "Context lost because SwapBuffers failed."; | 6887 LOG(ERROR) << "Context lost because SwapBuffers failed."; |
6890 return error::kLostContext; | 6888 return error::kLostContext; |
6891 } | 6889 } |
6892 } | 6890 } |
6893 | 6891 |
6894 #if defined(OS_MACOSX) | |
6895 if (swap_buffers_callback_.get()) { | 6892 if (swap_buffers_callback_.get()) { |
6896 swap_buffers_callback_->Run(); | 6893 swap_buffers_callback_->Run(); |
6897 } | 6894 } |
6898 #endif | |
6899 | 6895 |
6900 return error::kNoError; | 6896 return error::kNoError; |
6901 } | 6897 } |
6902 | 6898 |
6903 error::Error GLES2DecoderImpl::HandleEnableFeatureCHROMIUM( | 6899 error::Error GLES2DecoderImpl::HandleEnableFeatureCHROMIUM( |
6904 uint32 immediate_data_size, const gles2::EnableFeatureCHROMIUM& c) { | 6900 uint32 immediate_data_size, const gles2::EnableFeatureCHROMIUM& c) { |
6905 Bucket* bucket = GetBucket(c.bucket_id); | 6901 Bucket* bucket = GetBucket(c.bucket_id); |
6906 if (!bucket || bucket->size() == 0) { | 6902 if (!bucket || bucket->size() == 0) { |
6907 return error::kInvalidArguments; | 6903 return error::kInvalidArguments; |
6908 } | 6904 } |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7202 return error::kNoError; | 7198 return error::kNoError; |
7203 } | 7199 } |
7204 | 7200 |
7205 // Include the auto-generated part of this file. We split this because it means | 7201 // Include the auto-generated part of this file. We split this because it means |
7206 // we can easily edit the non-auto generated parts right here in this file | 7202 // we can easily edit the non-auto generated parts right here in this file |
7207 // instead of having to edit some template or the code generator. | 7203 // instead of having to edit some template or the code generator. |
7208 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 7204 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
7209 | 7205 |
7210 } // namespace gles2 | 7206 } // namespace gles2 |
7211 } // namespace gpu | 7207 } // namespace gpu |
OLD | NEW |