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 "content/renderer/pepper/pepper_platform_context_3d.h" | 5 #include "content/renderer/pepper/pepper_platform_context_3d.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "content/common/gpu/client/context_provider_command_buffer.h" | 8 #include "content/common/gpu/client/context_provider_command_buffer.h" |
9 #include "content/common/gpu/client/gpu_channel_host.h" | 9 #include "content/common/gpu/client/gpu_channel_host.h" |
10 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" | 10 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" |
11 #include "content/renderer/render_thread_impl.h" | 11 #include "content/renderer/render_thread_impl.h" |
12 #include "gpu/command_buffer/client/gles2_cmd_helper.h" | 12 #include "gpu/command_buffer/client/gles2_cmd_helper.h" |
13 #include "gpu/command_buffer/client/gles2_implementation.h" | 13 #include "gpu/command_buffer/client/gles2_implementation.h" |
14 #include "ppapi/c/pp_graphics_3d.h" | 14 #include "ppapi/c/pp_graphics_3d.h" |
15 #include "ui/gl/gpu_preference.h" | 15 #include "ui/gl/gpu_preference.h" |
16 #include "url/gurl.h" | 16 #include "url/gurl.h" |
17 | 17 |
18 namespace content { | 18 namespace content { |
19 | 19 |
20 PlatformContext3D::PlatformContext3D() | 20 PlatformContext3D::PlatformContext3D() |
21 : has_alpha_(false), | 21 : has_alpha_(false), command_buffer_(NULL), weak_ptr_factory_(this) {} |
22 command_buffer_(NULL), | |
23 weak_ptr_factory_(this) { | |
24 } | |
25 | 22 |
26 PlatformContext3D::~PlatformContext3D() { | 23 PlatformContext3D::~PlatformContext3D() { |
27 if (command_buffer_) { | 24 if (command_buffer_) { |
28 DCHECK(channel_.get()); | 25 DCHECK(channel_.get()); |
29 channel_->DestroyCommandBuffer(command_buffer_); | 26 channel_->DestroyCommandBuffer(command_buffer_); |
30 command_buffer_ = NULL; | 27 command_buffer_ = NULL; |
31 } | 28 } |
32 | 29 |
33 channel_ = NULL; | 30 channel_ = NULL; |
34 } | 31 } |
(...skipping 14 matching lines...) Expand all Loading... |
49 CAUSE_FOR_GPU_LAUNCH_PEPPERPLATFORMCONTEXT3DIMPL_INITIALIZE); | 46 CAUSE_FOR_GPU_LAUNCH_PEPPERPLATFORMCONTEXT3DIMPL_INITIALIZE); |
50 if (!channel_.get()) | 47 if (!channel_.get()) |
51 return false; | 48 return false; |
52 | 49 |
53 gfx::Size surface_size; | 50 gfx::Size surface_size; |
54 std::vector<int32> attribs; | 51 std::vector<int32> attribs; |
55 // TODO(alokp): Change GpuChannelHost::CreateOffscreenCommandBuffer() | 52 // TODO(alokp): Change GpuChannelHost::CreateOffscreenCommandBuffer() |
56 // interface to accept width and height in the attrib_list so that | 53 // interface to accept width and height in the attrib_list so that |
57 // we do not need to filter for width and height here. | 54 // we do not need to filter for width and height here. |
58 if (attrib_list) { | 55 if (attrib_list) { |
59 for (const int32_t* attr = attrib_list; | 56 for (const int32_t* attr = attrib_list; attr[0] != PP_GRAPHICS3DATTRIB_NONE; |
60 attr[0] != PP_GRAPHICS3DATTRIB_NONE; | |
61 attr += 2) { | 57 attr += 2) { |
62 switch (attr[0]) { | 58 switch (attr[0]) { |
63 case PP_GRAPHICS3DATTRIB_WIDTH: | 59 case PP_GRAPHICS3DATTRIB_WIDTH: |
64 surface_size.set_width(attr[1]); | 60 surface_size.set_width(attr[1]); |
65 break; | 61 break; |
66 case PP_GRAPHICS3DATTRIB_HEIGHT: | 62 case PP_GRAPHICS3DATTRIB_HEIGHT: |
67 surface_size.set_height(attr[1]); | 63 surface_size.set_height(attr[1]); |
68 break; | 64 break; |
69 case PP_GRAPHICS3DATTRIB_GPU_PREFERENCE: | 65 case PP_GRAPHICS3DATTRIB_GPU_PREFERENCE: |
70 gpu_preference = | 66 gpu_preference = |
71 (attr[1] == PP_GRAPHICS3DATTRIB_GPU_PREFERENCE_LOW_POWER) ? | 67 (attr[1] == PP_GRAPHICS3DATTRIB_GPU_PREFERENCE_LOW_POWER) |
72 gfx::PreferIntegratedGpu : gfx::PreferDiscreteGpu; | 68 ? gfx::PreferIntegratedGpu |
| 69 : gfx::PreferDiscreteGpu; |
73 break; | 70 break; |
74 case PP_GRAPHICS3DATTRIB_ALPHA_SIZE: | 71 case PP_GRAPHICS3DATTRIB_ALPHA_SIZE: |
75 has_alpha_ = attr[1] > 0; | 72 has_alpha_ = attr[1] > 0; |
76 // fall-through | 73 // fall-through |
77 default: | 74 default: |
78 attribs.push_back(attr[0]); | 75 attribs.push_back(attr[0]); |
79 attribs.push_back(attr[1]); | 76 attribs.push_back(attr[1]); |
80 break; | 77 break; |
81 } | 78 } |
82 } | 79 } |
83 attribs.push_back(PP_GRAPHICS3DATTRIB_NONE); | 80 attribs.push_back(PP_GRAPHICS3DATTRIB_NONE); |
84 } | 81 } |
85 | 82 |
86 CommandBufferProxyImpl* share_buffer = NULL; | 83 CommandBufferProxyImpl* share_buffer = NULL; |
87 if (share_context) { | 84 if (share_context) { |
88 PlatformContext3D* share_impl = | 85 PlatformContext3D* share_impl = |
89 static_cast<PlatformContext3D*>(share_context); | 86 static_cast<PlatformContext3D*>(share_context); |
90 share_buffer = share_impl->command_buffer_; | 87 share_buffer = share_impl->command_buffer_; |
91 } | 88 } |
92 | 89 |
93 command_buffer_ = channel_->CreateOffscreenCommandBuffer( | 90 command_buffer_ = channel_->CreateOffscreenCommandBuffer( |
94 surface_size, | 91 surface_size, share_buffer, attribs, GURL::EmptyGURL(), gpu_preference); |
95 share_buffer, | |
96 attribs, | |
97 GURL::EmptyGURL(), | |
98 gpu_preference); | |
99 if (!command_buffer_) | 92 if (!command_buffer_) |
100 return false; | 93 return false; |
101 if (!command_buffer_->Initialize()) | 94 if (!command_buffer_->Initialize()) |
102 return false; | 95 return false; |
103 gpu::Mailbox mailbox = gpu::Mailbox::Generate(); | 96 gpu::Mailbox mailbox = gpu::Mailbox::Generate(); |
104 if (!command_buffer_->ProduceFrontBuffer(mailbox)) | 97 if (!command_buffer_->ProduceFrontBuffer(mailbox)) |
105 return false; | 98 return false; |
106 mailbox_ = mailbox; | 99 mailbox_ = mailbox; |
107 sync_point_ = command_buffer_->InsertSyncPoint(); | 100 sync_point_ = command_buffer_->InsertSyncPoint(); |
108 | 101 |
109 command_buffer_->SetChannelErrorCallback( | 102 command_buffer_->SetChannelErrorCallback(base::Bind( |
110 base::Bind(&PlatformContext3D::OnContextLost, | 103 &PlatformContext3D::OnContextLost, weak_ptr_factory_.GetWeakPtr())); |
111 weak_ptr_factory_.GetWeakPtr())); | 104 command_buffer_->SetOnConsoleMessageCallback(base::Bind( |
112 command_buffer_->SetOnConsoleMessageCallback( | 105 &PlatformContext3D::OnConsoleMessage, weak_ptr_factory_.GetWeakPtr())); |
113 base::Bind(&PlatformContext3D::OnConsoleMessage, | |
114 weak_ptr_factory_.GetWeakPtr())); | |
115 | 106 |
116 return true; | 107 return true; |
117 } | 108 } |
118 | 109 |
119 void PlatformContext3D::GetBackingMailbox(gpu::Mailbox* mailbox, | 110 void PlatformContext3D::GetBackingMailbox(gpu::Mailbox* mailbox, |
120 uint32* sync_point) { | 111 uint32* sync_point) { |
121 *mailbox = mailbox_; | 112 *mailbox = mailbox_; |
122 *sync_point = sync_point_; | 113 *sync_point = sync_point_; |
123 } | 114 } |
124 | 115 |
125 void PlatformContext3D::InsertSyncPointForBackingMailbox() { | 116 void PlatformContext3D::InsertSyncPointForBackingMailbox() { |
126 DCHECK(command_buffer_); | 117 DCHECK(command_buffer_); |
127 sync_point_ = command_buffer_->InsertSyncPoint(); | 118 sync_point_ = command_buffer_->InsertSyncPoint(); |
128 } | 119 } |
129 | 120 |
130 bool PlatformContext3D::IsOpaque() { | 121 bool PlatformContext3D::IsOpaque() { |
131 DCHECK(command_buffer_); | 122 DCHECK(command_buffer_); |
132 return !has_alpha_; | 123 return !has_alpha_; |
133 } | 124 } |
134 | 125 |
135 gpu::CommandBuffer* PlatformContext3D::GetCommandBuffer() { | 126 gpu::CommandBuffer* PlatformContext3D::GetCommandBuffer() { |
136 return command_buffer_; | 127 return command_buffer_; |
137 } | 128 } |
138 | 129 |
139 gpu::GpuControl* PlatformContext3D::GetGpuControl() { | 130 gpu::GpuControl* PlatformContext3D::GetGpuControl() { return command_buffer_; } |
140 return command_buffer_; | |
141 } | |
142 | 131 |
143 int PlatformContext3D::GetCommandBufferRouteId() { | 132 int PlatformContext3D::GetCommandBufferRouteId() { |
144 DCHECK(command_buffer_); | 133 DCHECK(command_buffer_); |
145 return command_buffer_->GetRouteID(); | 134 return command_buffer_->GetRouteID(); |
146 } | 135 } |
147 | 136 |
148 void PlatformContext3D::SetContextLostCallback(const base::Closure& task) { | 137 void PlatformContext3D::SetContextLostCallback(const base::Closure& task) { |
149 context_lost_callback_ = task; | 138 context_lost_callback_ = task; |
150 } | 139 } |
151 | 140 |
(...skipping 14 matching lines...) Expand all Loading... |
166 } | 155 } |
167 | 156 |
168 void PlatformContext3D::OnConsoleMessage(const std::string& msg, int id) { | 157 void PlatformContext3D::OnConsoleMessage(const std::string& msg, int id) { |
169 DCHECK(command_buffer_); | 158 DCHECK(command_buffer_); |
170 | 159 |
171 if (!console_message_callback_.is_null()) | 160 if (!console_message_callback_.is_null()) |
172 console_message_callback_.Run(msg, id); | 161 console_message_callback_.Run(msg, id); |
173 } | 162 } |
174 | 163 |
175 } // namespace content | 164 } // namespace content |
OLD | NEW |