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 20 matching lines...) Expand all Loading... |
31 #include "gpu/command_buffer/service/gl_utils.h" | 31 #include "gpu/command_buffer/service/gl_utils.h" |
32 #include "gpu/command_buffer/service/gles2_cmd_validation.h" | 32 #include "gpu/command_buffer/service/gles2_cmd_validation.h" |
33 #include "gpu/command_buffer/service/program_manager.h" | 33 #include "gpu/command_buffer/service/program_manager.h" |
34 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 34 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
35 #include "gpu/command_buffer/service/shader_manager.h" | 35 #include "gpu/command_buffer/service/shader_manager.h" |
36 #include "gpu/command_buffer/service/shader_translator.h" | 36 #include "gpu/command_buffer/service/shader_translator.h" |
37 #include "gpu/command_buffer/service/texture_manager.h" | 37 #include "gpu/command_buffer/service/texture_manager.h" |
38 #include "gpu/GLES2/gles2_command_buffer.h" | 38 #include "gpu/GLES2/gles2_command_buffer.h" |
39 #include "ui/gfx/gl/gl_context.h" | 39 #include "ui/gfx/gl/gl_context.h" |
40 #include "ui/gfx/gl/gl_implementation.h" | 40 #include "ui/gfx/gl/gl_implementation.h" |
| 41 #include "ui/gfx/gl/gl_surface.h" |
41 | 42 |
42 #if !defined(GL_DEPTH24_STENCIL8) | 43 #if !defined(GL_DEPTH24_STENCIL8) |
43 #define GL_DEPTH24_STENCIL8 0x88F0 | 44 #define GL_DEPTH24_STENCIL8 0x88F0 |
44 #endif | 45 #endif |
45 | 46 |
46 namespace gpu { | 47 namespace gpu { |
47 namespace gles2 { | 48 namespace gles2 { |
48 | 49 |
49 class GLES2DecoderImpl; | 50 class GLES2DecoderImpl; |
50 | 51 |
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 | 665 |
665 // Overridden from AsyncAPIInterface. | 666 // Overridden from AsyncAPIInterface. |
666 virtual Error DoCommand(unsigned int command, | 667 virtual Error DoCommand(unsigned int command, |
667 unsigned int arg_count, | 668 unsigned int arg_count, |
668 const void* args); | 669 const void* args); |
669 | 670 |
670 // Overridden from AsyncAPIInterface. | 671 // Overridden from AsyncAPIInterface. |
671 virtual const char* GetCommandName(unsigned int command_id) const; | 672 virtual const char* GetCommandName(unsigned int command_id) const; |
672 | 673 |
673 // Overridden from GLES2Decoder. | 674 // Overridden from GLES2Decoder. |
674 virtual bool Initialize(gfx::GLContext* context, | 675 virtual bool Initialize(gfx::GLSurface* surface, |
| 676 gfx::GLContext* context, |
675 const gfx::Size& size, | 677 const gfx::Size& size, |
676 const DisallowedExtensions& disallowed_extensions, | 678 const DisallowedExtensions& disallowed_extensions, |
677 const char* allowed_extensions, | 679 const char* allowed_extensions, |
678 const std::vector<int32>& attribs, | 680 const std::vector<int32>& attribs, |
679 GLES2Decoder* parent, | 681 GLES2Decoder* parent, |
680 uint32 parent_client_texture_id); | 682 uint32 parent_client_texture_id); |
681 virtual void Destroy(); | 683 virtual void Destroy(); |
682 virtual void ResizeOffscreenFrameBuffer(const gfx::Size& size); | 684 virtual void ResizeOffscreenFrameBuffer(const gfx::Size& size); |
683 virtual bool UpdateOffscreenFrameBufferSize(); | 685 virtual bool UpdateOffscreenFrameBufferSize(); |
684 virtual bool MakeCurrent(); | 686 virtual bool MakeCurrent(); |
685 virtual GLES2Util* GetGLES2Util() { return &util_; } | 687 virtual GLES2Util* GetGLES2Util() { return &util_; } |
686 virtual gfx::GLContext* GetGLContext() { return context_.get(); } | 688 virtual gfx::GLContext* GetGLContext() { return context_.get(); } |
| 689 virtual gfx::GLSurface* GetGLSurface() { return surface_.get(); } |
687 virtual ContextGroup* GetContextGroup() { return group_.get(); } | 690 virtual ContextGroup* GetContextGroup() { return group_.get(); } |
688 | 691 |
689 virtual void SetResizeCallback(Callback1<gfx::Size>::Type* callback); | 692 virtual void SetResizeCallback(Callback1<gfx::Size>::Type* callback); |
690 virtual void SetSwapBuffersCallback(Callback0::Type* callback); | 693 virtual void SetSwapBuffersCallback(Callback0::Type* callback); |
691 virtual void SetLatchCallback(const base::Callback<void(bool)>& callback);; | 694 virtual void SetLatchCallback(const base::Callback<void(bool)>& callback);; |
692 virtual bool GetServiceTextureId(uint32 client_texture_id, | 695 virtual bool GetServiceTextureId(uint32 client_texture_id, |
693 uint32* service_texture_id); | 696 uint32* service_texture_id); |
694 | 697 |
695 // Restores the current state to the user's settings. | 698 // Restores the current state to the user's settings. |
696 void RestoreCurrentFramebufferBindings(); | 699 void RestoreCurrentFramebufferBindings(); |
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1330 #define GLES2_CMD_OP(name) \ | 1333 #define GLES2_CMD_OP(name) \ |
1331 Error Handle ## name( \ | 1334 Error Handle ## name( \ |
1332 uint32 immediate_data_size, \ | 1335 uint32 immediate_data_size, \ |
1333 const gles2::name& args); \ | 1336 const gles2::name& args); \ |
1334 | 1337 |
1335 GLES2_COMMAND_LIST(GLES2_CMD_OP) | 1338 GLES2_COMMAND_LIST(GLES2_CMD_OP) |
1336 | 1339 |
1337 #undef GLES2_CMD_OP | 1340 #undef GLES2_CMD_OP |
1338 | 1341 |
1339 // The GL context this decoder renders to on behalf of the client. | 1342 // The GL context this decoder renders to on behalf of the client. |
| 1343 scoped_ptr<gfx::GLSurface> surface_; |
1340 scoped_ptr<gfx::GLContext> context_; | 1344 scoped_ptr<gfx::GLContext> context_; |
1341 | 1345 |
1342 // The ContextGroup for this decoder uses to track resources. | 1346 // The ContextGroup for this decoder uses to track resources. |
1343 ContextGroup::Ref group_; | 1347 ContextGroup::Ref group_; |
1344 | 1348 |
1345 // A parent decoder can access this decoders saved offscreen frame buffer. | 1349 // A parent decoder can access this decoders saved offscreen frame buffer. |
1346 // The parent pointer is reset if the parent is destroyed. | 1350 // The parent pointer is reset if the parent is destroyed. |
1347 base::WeakPtr<GLES2DecoderImpl> parent_; | 1351 base::WeakPtr<GLES2DecoderImpl> parent_; |
1348 | 1352 |
1349 // Width and height to which an offscreen frame buffer should be resized on | 1353 // Width and height to which an offscreen frame buffer should be resized on |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1820 // empty string to CompileShader and this is not a valid shader. | 1824 // empty string to CompileShader and this is not a valid shader. |
1821 // TODO(apatrick): fix this test. | 1825 // TODO(apatrick): fix this test. |
1822 if ((gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && | 1826 if ((gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && |
1823 !feature_info_->feature_flags().chromium_webglsl) || | 1827 !feature_info_->feature_flags().chromium_webglsl) || |
1824 gfx::GetGLImplementation() == gfx::kGLImplementationMockGL) { | 1828 gfx::GetGLImplementation() == gfx::kGLImplementationMockGL) { |
1825 use_shader_translator_ = false; | 1829 use_shader_translator_ = false; |
1826 } | 1830 } |
1827 } | 1831 } |
1828 | 1832 |
1829 bool GLES2DecoderImpl::Initialize( | 1833 bool GLES2DecoderImpl::Initialize( |
| 1834 gfx::GLSurface* surface, |
1830 gfx::GLContext* context, | 1835 gfx::GLContext* context, |
1831 const gfx::Size& size, | 1836 const gfx::Size& size, |
1832 const DisallowedExtensions& disallowed_extensions, | 1837 const DisallowedExtensions& disallowed_extensions, |
1833 const char* allowed_extensions, | 1838 const char* allowed_extensions, |
1834 const std::vector<int32>& attribs, | 1839 const std::vector<int32>& attribs, |
1835 GLES2Decoder* parent, | 1840 GLES2Decoder* parent, |
1836 uint32 parent_client_texture_id) { | 1841 uint32 parent_client_texture_id) { |
1837 DCHECK(context); | 1842 DCHECK(context); |
1838 DCHECK(!context_.get()); | 1843 DCHECK(!context_.get()); |
1839 | 1844 |
| 1845 // Take ownership of the GLSurface. TODO(apatrick): the decoder should not |
| 1846 // own the surface. It should be possible to freely switch the surface the |
| 1847 // context renders to. |
| 1848 surface_.reset(surface); |
| 1849 |
1840 // Take ownership of the GLContext. | 1850 // Take ownership of the GLContext. |
1841 context_.reset(context); | 1851 context_.reset(context); |
1842 | 1852 |
1843 // Keep only a weak pointer to the parent so we don't unmap its client | 1853 // Keep only a weak pointer to the parent so we don't unmap its client |
1844 // frame buffer after it has been destroyed. | 1854 // frame buffer after it has been destroyed. |
1845 if (parent) | 1855 if (parent) |
1846 parent_ = static_cast<GLES2DecoderImpl*>(parent)->AsWeakPtr(); | 1856 parent_ = static_cast<GLES2DecoderImpl*>(parent)->AsWeakPtr(); |
1847 | 1857 |
1848 if (!MakeCurrent()) { | 1858 if (!MakeCurrent()) { |
1849 LOG(ERROR) << "GLES2DecoderImpl::Initialize failed because " | 1859 LOG(ERROR) << "GLES2DecoderImpl::Initialize failed because " |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1888 texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); | 1898 texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); |
1889 texture_units_[tt].bound_texture_cube_map = info; | 1899 texture_units_[tt].bound_texture_cube_map = info; |
1890 glBindTexture(GL_TEXTURE_CUBE_MAP, info->service_id()); | 1900 glBindTexture(GL_TEXTURE_CUBE_MAP, info->service_id()); |
1891 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); | 1901 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); |
1892 texture_units_[tt].bound_texture_2d = info; | 1902 texture_units_[tt].bound_texture_2d = info; |
1893 glBindTexture(GL_TEXTURE_2D, info->service_id()); | 1903 glBindTexture(GL_TEXTURE_2D, info->service_id()); |
1894 } | 1904 } |
1895 glActiveTexture(GL_TEXTURE0); | 1905 glActiveTexture(GL_TEXTURE0); |
1896 CHECK_GL_ERROR(); | 1906 CHECK_GL_ERROR(); |
1897 | 1907 |
1898 if (context_->IsOffscreen()) { | 1908 if (surface_->IsOffscreen()) { |
1899 ContextCreationAttribParser attrib_parser; | 1909 ContextCreationAttribParser attrib_parser; |
1900 if (!attrib_parser.Parse(attribs)) | 1910 if (!attrib_parser.Parse(attribs)) |
1901 return false; | 1911 return false; |
1902 | 1912 |
1903 if (attrib_parser.samples_ > 0 && attrib_parser.sample_buffers_ > 0 && | 1913 if (attrib_parser.samples_ > 0 && attrib_parser.sample_buffers_ > 0 && |
1904 (context_->HasExtension("GL_EXT_framebuffer_multisample") || | 1914 (context_->HasExtension("GL_EXT_framebuffer_multisample") || |
1905 context_->HasExtension("GL_ANGLE_framebuffer_multisample"))) { | 1915 context_->HasExtension("GL_ANGLE_framebuffer_multisample"))) { |
1906 // Per ext_framebuffer_multisample spec, need max bound on sample count. | 1916 // Per ext_framebuffer_multisample spec, need max bound on sample count. |
1907 // max_sample_count must be initialized to a sane value. If | 1917 // max_sample_count must be initialized to a sane value. If |
1908 // glGetIntegerv() throws a GL error, it leaves its argument unchanged. | 1918 // glGetIntegerv() throws a GL error, it leaves its argument unchanged. |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2196 GLuint service_id = info->service_id(); | 2206 GLuint service_id = info->service_id(); |
2197 glDeleteTextures(1, &service_id); | 2207 glDeleteTextures(1, &service_id); |
2198 RemoveTextureInfo(client_ids[ii]); | 2208 RemoveTextureInfo(client_ids[ii]); |
2199 } | 2209 } |
2200 } | 2210 } |
2201 } | 2211 } |
2202 | 2212 |
2203 // } // anonymous namespace | 2213 // } // anonymous namespace |
2204 | 2214 |
2205 bool GLES2DecoderImpl::MakeCurrent() { | 2215 bool GLES2DecoderImpl::MakeCurrent() { |
2206 return context_.get() ? context_->MakeCurrent() : false; | 2216 return context_.get() ? context_->MakeCurrent(surface_.get()) : false; |
2207 } | 2217 } |
2208 | 2218 |
2209 void GLES2DecoderImpl::RestoreCurrentRenderbufferBindings() { | 2219 void GLES2DecoderImpl::RestoreCurrentRenderbufferBindings() { |
2210 glBindRenderbufferEXT( | 2220 glBindRenderbufferEXT( |
2211 GL_RENDERBUFFER, | 2221 GL_RENDERBUFFER, |
2212 bound_renderbuffer_ ? bound_renderbuffer_->service_id() : 0); | 2222 bound_renderbuffer_ ? bound_renderbuffer_->service_id() : 0); |
2213 } | 2223 } |
2214 | 2224 |
2215 static void RebindCurrentFramebuffer( | 2225 static void RebindCurrentFramebuffer( |
2216 GLenum target, | 2226 GLenum target, |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2267 if (bound_read_framebuffer_ != 0) { | 2277 if (bound_read_framebuffer_ != 0) { |
2268 const FramebufferManager::FramebufferInfo::Attachment* attachment = | 2278 const FramebufferManager::FramebufferInfo::Attachment* attachment = |
2269 bound_read_framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0); | 2279 bound_read_framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0); |
2270 if (attachment) { | 2280 if (attachment) { |
2271 return gfx::Size(attachment->width(), attachment->height()); | 2281 return gfx::Size(attachment->width(), attachment->height()); |
2272 } | 2282 } |
2273 return gfx::Size(0, 0); | 2283 return gfx::Size(0, 0); |
2274 } else if (offscreen_target_frame_buffer_.get()) { | 2284 } else if (offscreen_target_frame_buffer_.get()) { |
2275 return offscreen_size_; | 2285 return offscreen_size_; |
2276 } else { | 2286 } else { |
2277 return context_->GetSize(); | 2287 return surface_->GetSize(); |
2278 } | 2288 } |
2279 } | 2289 } |
2280 | 2290 |
2281 GLenum GLES2DecoderImpl::GetBoundReadFrameBufferInternalFormat() { | 2291 GLenum GLES2DecoderImpl::GetBoundReadFrameBufferInternalFormat() { |
2282 if (bound_read_framebuffer_ != 0) { | 2292 if (bound_read_framebuffer_ != 0) { |
2283 const FramebufferManager::FramebufferInfo::Attachment* attachment = | 2293 const FramebufferManager::FramebufferInfo::Attachment* attachment = |
2284 bound_read_framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0); | 2294 bound_read_framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0); |
2285 if (attachment) { | 2295 if (attachment) { |
2286 return attachment->internal_format(); | 2296 return attachment->internal_format(); |
2287 } | 2297 } |
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2761 CreateFramebufferInfo(client_id, service_id); | 2771 CreateFramebufferInfo(client_id, service_id); |
2762 info = GetFramebufferInfo(client_id); | 2772 info = GetFramebufferInfo(client_id); |
2763 IdAllocator* id_allocator = | 2773 IdAllocator* id_allocator = |
2764 group_->GetIdAllocator(id_namespaces::kFramebuffers); | 2774 group_->GetIdAllocator(id_namespaces::kFramebuffers); |
2765 id_allocator->MarkAsUsed(client_id); | 2775 id_allocator->MarkAsUsed(client_id); |
2766 } else { | 2776 } else { |
2767 service_id = info->service_id(); | 2777 service_id = info->service_id(); |
2768 } | 2778 } |
2769 info->MarkAsValid(); | 2779 info->MarkAsValid(); |
2770 } else { | 2780 } else { |
2771 service_id = context_->GetBackingFrameBufferObject(); | 2781 service_id = 0; |
2772 } | 2782 } |
2773 | 2783 |
2774 if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER_EXT) { | 2784 if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER_EXT) { |
2775 bound_draw_framebuffer_ = info; | 2785 bound_draw_framebuffer_ = info; |
2776 } | 2786 } |
2777 if (target == GL_FRAMEBUFFER || target == GL_READ_FRAMEBUFFER_EXT) { | 2787 if (target == GL_FRAMEBUFFER || target == GL_READ_FRAMEBUFFER_EXT) { |
2778 bound_read_framebuffer_ = info; | 2788 bound_read_framebuffer_ = info; |
2779 } | 2789 } |
2780 | 2790 |
2781 // When rendering to an offscreen frame buffer, instead of unbinding from | 2791 // When rendering to an offscreen frame buffer, instead of unbinding from |
(...skipping 3595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6377 | 6387 |
6378 // Run the callback with |binder| in scope, so that the callback can call | 6388 // Run the callback with |binder| in scope, so that the callback can call |
6379 // ReadPixels or CopyTexImage2D. | 6389 // ReadPixels or CopyTexImage2D. |
6380 if (swap_buffers_callback_.get()) { | 6390 if (swap_buffers_callback_.get()) { |
6381 swap_buffers_callback_->Run(); | 6391 swap_buffers_callback_->Run(); |
6382 } | 6392 } |
6383 return error::kNoError; | 6393 return error::kNoError; |
6384 } | 6394 } |
6385 } else { | 6395 } else { |
6386 TRACE_EVENT1("gpu", "GLContext::SwapBuffers", "frame", this_frame_number); | 6396 TRACE_EVENT1("gpu", "GLContext::SwapBuffers", "frame", this_frame_number); |
6387 if (!context_->SwapBuffers()) { | 6397 if (!surface_->SwapBuffers()) { |
6388 LOG(ERROR) << "Context lost because SwapBuffers failed."; | 6398 LOG(ERROR) << "Context lost because SwapBuffers failed."; |
6389 return error::kLostContext; | 6399 return error::kLostContext; |
6390 } | 6400 } |
6391 } | 6401 } |
6392 | 6402 |
6393 if (swap_buffers_callback_.get()) { | 6403 if (swap_buffers_callback_.get()) { |
6394 swap_buffers_callback_->Run(); | 6404 swap_buffers_callback_->Run(); |
6395 } | 6405 } |
6396 | 6406 |
6397 return error::kNoError; | 6407 return error::kNoError; |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6531 return error::kNoError; | 6541 return error::kNoError; |
6532 } | 6542 } |
6533 | 6543 |
6534 // Include the auto-generated part of this file. We split this because it means | 6544 // Include the auto-generated part of this file. We split this because it means |
6535 // we can easily edit the non-auto generated parts right here in this file | 6545 // we can easily edit the non-auto generated parts right here in this file |
6536 // instead of having to edit some template or the code generator. | 6546 // instead of having to edit some template or the code generator. |
6537 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 6547 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
6538 | 6548 |
6539 } // namespace gles2 | 6549 } // namespace gles2 |
6540 } // namespace gpu | 6550 } // namespace gpu |
OLD | NEW |