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

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

Issue 1328001: Added command buffer implementation of WebGL which runs in the sandbox.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 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) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 <vector> 10 #include <vector>
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 GLuint bound_renderbuffer_; 872 GLuint bound_renderbuffer_;
873 873
874 #if defined(UNIT_TEST) 874 #if defined(UNIT_TEST)
875 #elif defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2) 875 #elif defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2)
876 #elif defined(OS_WIN) 876 #elif defined(OS_WIN)
877 static int pixel_format_; 877 static int pixel_format_;
878 HDC gl_device_context_; 878 HDC gl_device_context_;
879 HGLRC gl_context_; 879 HGLRC gl_context_;
880 HPBUFFERARB pbuffer_; 880 HPBUFFERARB pbuffer_;
881 #elif defined(OS_MACOSX) 881 #elif defined(OS_MACOSX)
882 CGLContextObj gl_context_;
883 CGLPBufferObj pbuffer_;
882 AcceleratedSurface surface_; 884 AcceleratedSurface surface_;
883 #endif 885 #endif
884 886
885 bool anti_aliased_; 887 bool anti_aliased_;
886 888
887 // The offscreen frame buffer that the client renders to. 889 // The offscreen frame buffer that the client renders to.
888 scoped_ptr<FrameBuffer> offscreen_target_frame_buffer_; 890 scoped_ptr<FrameBuffer> offscreen_target_frame_buffer_;
889 scoped_ptr<Texture> offscreen_target_color_texture_; 891 scoped_ptr<Texture> offscreen_target_color_texture_;
890 scoped_ptr<RenderBuffer> offscreen_target_depth_stencil_render_buffer_; 892 scoped_ptr<RenderBuffer> offscreen_target_depth_stencil_render_buffer_;
891 893
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1150 black_2d_texture_id_(0), 1152 black_2d_texture_id_(0),
1151 black_cube_texture_id_(0), 1153 black_cube_texture_id_(0),
1152 bound_framebuffer_(0), 1154 bound_framebuffer_(0),
1153 bound_renderbuffer_(0), 1155 bound_renderbuffer_(0),
1154 #if defined(UNIT_TEST) 1156 #if defined(UNIT_TEST)
1155 #elif defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2) 1157 #elif defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2)
1156 #elif defined(OS_WIN) 1158 #elif defined(OS_WIN)
1157 gl_device_context_(NULL), 1159 gl_device_context_(NULL),
1158 gl_context_(NULL), 1160 gl_context_(NULL),
1159 pbuffer_(NULL), 1161 pbuffer_(NULL),
1162 #elif defined(OS_MAC)
1163 gl_context_(NULL),
1164 pbuffer_(NULL),
1160 #endif 1165 #endif
1161 anti_aliased_(false) { 1166 anti_aliased_(false) {
1162 } 1167 }
1163 1168
1164 bool GLES2DecoderImpl::Initialize(GLES2Decoder* parent, 1169 bool GLES2DecoderImpl::Initialize(GLES2Decoder* parent,
1165 const gfx::Size& size, 1170 const gfx::Size& size,
1166 uint32 parent_client_texture_id) { 1171 uint32 parent_client_texture_id) {
1167 // Keep only a weak pointer to the parent so we don't unmap its client 1172 // Keep only a weak pointer to the parent so we don't unmap its client
1168 // frame buffer is after it has been destroyed. 1173 // frame buffer is after it has been destroyed.
1169 if (parent) 1174 if (parent)
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 if (::wglGetCurrentDC() == gl_device_context_ && 1535 if (::wglGetCurrentDC() == gl_device_context_ &&
1531 ::wglGetCurrentContext() == gl_context_) { 1536 ::wglGetCurrentContext() == gl_context_) {
1532 return true; 1537 return true;
1533 } 1538 }
1534 if (!::wglMakeCurrent(gl_device_context_, gl_context_)) { 1539 if (!::wglMakeCurrent(gl_device_context_, gl_context_)) {
1535 DLOG(ERROR) << "Unable to make gl context current."; 1540 DLOG(ERROR) << "Unable to make gl context current.";
1536 return false; 1541 return false;
1537 } 1542 }
1538 return true; 1543 return true;
1539 #elif defined(OS_LINUX) 1544 #elif defined(OS_LINUX)
1545 // TODO(apatrick): offscreen rendering not yet supported on this platform.
1540 return window()->MakeCurrent(); 1546 return window()->MakeCurrent();
1541 #elif defined(OS_MACOSX) 1547 #elif defined(OS_MACOSX)
1542 return surface_.MakeCurrent(); 1548 if (gl_context_) {
1549 if (CGLGetCurrentContext() != gl_context_) {
1550 if (CGLSetCurrentContext(gl_context_) != kCGLNoError) {
1551 DLOG(ERROR) << "Unable to make gl context current.";
1552 return false;
1553 }
1554 }
1555 return true;
1556 } else {
1557 return surface_.MakeCurrent();
1558 }
1543 #else 1559 #else
1544 NOTREACHED(); 1560 NOTREACHED();
1545 return false; 1561 return false;
1546 #endif 1562 #endif
1547 } 1563 }
1548 1564
1549 uint32 GLES2DecoderImpl::GetServiceIdForTesting(uint32 client_id) { 1565 uint32 GLES2DecoderImpl::GetServiceIdForTesting(uint32 client_id) {
1550 #if defined(UNIT_TEST) 1566 #if defined(UNIT_TEST)
1551 GLuint service_id; 1567 GLuint service_id;
1552 bool result = id_manager()->GetServiceId(client_id, &service_id); 1568 bool result = id_manager()->GetServiceId(client_id, &service_id);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1657 // TODO(apatrick): offscreen rendering not yet supported on this platform. 1673 // TODO(apatrick): offscreen rendering not yet supported on this platform.
1658 DCHECK(!offscreen); 1674 DCHECK(!offscreen);
1659 1675
1660 // TODO(apatrick): parent contexts not yet supported on this platform. 1676 // TODO(apatrick): parent contexts not yet supported on this platform.
1661 DCHECK(!parent_); 1677 DCHECK(!parent_);
1662 1678
1663 DCHECK(window()); 1679 DCHECK(window());
1664 if (!window()->Initialize()) 1680 if (!window()->Initialize())
1665 return false; 1681 return false;
1666 #elif defined(OS_MACOSX) 1682 #elif defined(OS_MACOSX)
1667 // TODO(apatrick): offscreen rendering not yet supported on this platform.
1668 DCHECK(!offscreen);
1669
1670 // TODO(apatrick): parent contexts not yet supported on this platform. 1683 // TODO(apatrick): parent contexts not yet supported on this platform.
1671 DCHECK(!parent_); 1684 DCHECK(!parent_);
1672 1685
1673 return surface_.Initialize(); 1686 if (offscreen) {
1687 // Create a 1x1 pbuffer and associated context to bootstrap things
1688 static const CGLPixelFormatAttribute attribs[] = {
1689 (CGLPixelFormatAttribute) kCGLPFAPBuffer,
1690 (CGLPixelFormatAttribute) 0
1691 };
1692 CGLPixelFormatObj pixel_format;
1693 GLint num_pixel_formats;
1694 if (CGLChoosePixelFormat(attribs,
1695 &pixel_format,
1696 &num_pixel_formats) != kCGLNoError) {
1697 DLOG(ERROR) << "Error choosing pixel format.";
1698 DestroyPlatformSpecific();
1699 return false;
1700 }
1701 if (!pixel_format) {
1702 return false;
1703 }
1704 CGLError res = CGLCreateContext(pixel_format, 0, &gl_context_);
1705 CGLDestroyPixelFormat(pixel_format);
1706 if (res != kCGLNoError) {
1707 DLOG(ERROR) << "Error creating context.";
1708 DestroyPlatformSpecific();
1709 return false;
1710 }
1711 if (CGLCreatePBuffer(1, 1,
1712 GL_TEXTURE_2D, GL_RGBA,
1713 0, &pbuffer_) != kCGLNoError) {
1714 DLOG(ERROR) << "Error creating pbuffer.";
1715 DestroyPlatformSpecific();
1716 return false;
1717 }
1718 if (CGLSetPBuffer(gl_context_, pbuffer_, 0, 0, 0) != kCGLNoError) {
1719 DLOG(ERROR) << "Error attaching pbuffer to context.";
1720 DestroyPlatformSpecific();
1721 return false;
1722 }
1723 return true;
1724 } else {
1725 return surface_.Initialize();
1726 }
1674 #endif 1727 #endif
1675 1728
1676 return true; 1729 return true;
1677 } 1730 }
1678 1731
1679 bool GLES2DecoderImpl::InitGlew() { 1732 bool GLES2DecoderImpl::InitGlew() {
1680 #if !defined(UNIT_TEST) && !defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2) 1733 #if !defined(UNIT_TEST) && !defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2)
1681 DLOG(INFO) << "Initializing GL and GLEW for GLES2Decoder."; 1734 DLOG(INFO) << "Initializing GL and GLEW for GLES2Decoder.";
1682 1735
1683 GLenum glew_error = glewInit(); 1736 GLenum glew_error = glewInit();
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1746 else 1799 else
1747 ::wglReleasePbufferDCARB(pbuffer_, gl_device_context_); 1800 ::wglReleasePbufferDCARB(pbuffer_, gl_device_context_);
1748 1801
1749 gl_device_context_ = NULL; 1802 gl_device_context_ = NULL;
1750 } 1803 }
1751 1804
1752 if (pbuffer_) { 1805 if (pbuffer_) {
1753 ::wglDestroyPbufferARB(pbuffer_); 1806 ::wglDestroyPbufferARB(pbuffer_);
1754 pbuffer_ = NULL; 1807 pbuffer_ = NULL;
1755 } 1808 }
1809 #elif defined(OS_MAC)
1810 if (gl_context_) {
1811 CGLDestroyContext(gl_context_);
1812 gl_context_ = NULL;
1813 }
1814
1815 if (pbuffer_) {
1816 CGLDestroyPBuffer(pbuffer_);
1817 pbuffer_ = NULL;
1818 }
1756 #endif 1819 #endif
1757 } 1820 }
1758 1821
1759 bool GLES2DecoderImpl::UpdateOffscreenFrameBufferSize() { 1822 bool GLES2DecoderImpl::UpdateOffscreenFrameBufferSize() {
1760 if (current_size_ != pending_size_) 1823 if (current_size_ != pending_size_)
1761 return true; 1824 return true;
1762 1825
1763 // Reallocate the offscreen target buffers. 1826 // Reallocate the offscreen target buffers.
1764 if (!offscreen_target_color_texture_->AllocateStorage(pending_size_)) { 1827 if (!offscreen_target_color_texture_->AllocateStorage(pending_size_)) {
1765 return false; 1828 return false;
(...skipping 1860 matching lines...) Expand 10 before | Expand all | Expand 10 after
3626 return error::kNoError; 3689 return error::kNoError;
3627 } 3690 }
3628 3691
3629 // Include the auto-generated part of this file. We split this because it means 3692 // Include the auto-generated part of this file. We split this because it means
3630 // we can easily edit the non-auto generated parts right here in this file 3693 // we can easily edit the non-auto generated parts right here in this file
3631 // instead of having to edit some template or the code generator. 3694 // instead of having to edit some template or the code generator.
3632 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 3695 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
3633 3696
3634 } // namespace gles2 3697 } // namespace gles2
3635 } // namespace gpu 3698 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698