OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "webkit/glue/plugins/pepper_graphics_3d.h" | 5 #include "webkit/plugins/ppapi/ppb_graphics_3d_impl.h" |
6 | 6 |
7 #include "gpu/command_buffer/common/command_buffer.h" | 7 #include "gpu/command_buffer/common/command_buffer.h" |
8 #include "base/singleton.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/thread_local.h" | 9 #include "base/thread_local.h" |
10 #include "ppapi/c/dev/ppb_graphics_3d_dev.h" | 10 #include "ppapi/c/dev/ppb_graphics_3d_dev.h" |
11 #include "webkit/glue/plugins/pepper_common.h" | 11 #include "webkit/plugins/ppapi/common.h" |
12 #include "webkit/glue/plugins/pepper_plugin_instance.h" | 12 #include "webkit/plugins/ppapi/plugin_instance.h" |
13 | 13 |
14 namespace pepper { | 14 namespace webkit { |
| 15 namespace plugins { |
| 16 namespace ppapi { |
15 | 17 |
16 namespace { | 18 namespace { |
17 | 19 |
18 struct CurrentContextTag {}; | 20 static base::LazyInstance<base::ThreadLocalPointer<PPB_Graphics3D_Impl> > |
19 typedef Singleton<base::ThreadLocalPointer<Graphics3D>, | 21 g_current_context_key(base::LINKER_INITIALIZED); |
20 DefaultSingletonTraits<base::ThreadLocalPointer<Graphics3D> >, | |
21 CurrentContextTag> CurrentContextKey; | |
22 | 22 |
23 // Size of the transfer buffer. | 23 // Size of the transfer buffer. |
24 enum { kTransferBufferSize = 512 * 1024 }; | 24 enum { kTransferBufferSize = 512 * 1024 }; |
25 | 25 |
26 PP_Bool IsGraphics3D(PP_Resource resource) { | 26 PP_Bool IsGraphics3D(PP_Resource resource) { |
27 return BoolToPPBool(!!Resource::GetAs<Graphics3D>(resource)); | 27 return BoolToPPBool(!!Resource::GetAs<PPB_Graphics3D_Impl>(resource)); |
28 } | 28 } |
29 | 29 |
30 PP_Bool GetConfigs(int32_t* configs, int32_t config_size, int32_t* num_config) { | 30 PP_Bool GetConfigs(int32_t* configs, int32_t config_size, int32_t* num_config) { |
31 // TODO(neb): Implement me! | 31 // TODO(neb): Implement me! |
32 return PP_FALSE; | 32 return PP_FALSE; |
33 } | 33 } |
34 | 34 |
35 PP_Bool ChooseConfig(const int32_t* attrib_list, int32_t* configs, | 35 PP_Bool ChooseConfig(const int32_t* attrib_list, int32_t* configs, |
36 int32_t config_size, int32_t* num_config) { | 36 int32_t config_size, int32_t* num_config) { |
37 // TODO(neb): Implement me! | 37 // TODO(neb): Implement me! |
(...skipping 23 matching lines...) Expand all Loading... |
61 PP_Resource CreateContext(PP_Instance instance_id, int32_t config, | 61 PP_Resource CreateContext(PP_Instance instance_id, int32_t config, |
62 int32_t share_context, | 62 int32_t share_context, |
63 const int32_t* attrib_list) { | 63 const int32_t* attrib_list) { |
64 DCHECK_EQ(0, share_context); | 64 DCHECK_EQ(0, share_context); |
65 | 65 |
66 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); | 66 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
67 if (!instance) { | 67 if (!instance) { |
68 return 0; | 68 return 0; |
69 } | 69 } |
70 | 70 |
71 scoped_refptr<Graphics3D> context(new Graphics3D(instance->module())); | 71 scoped_refptr<PPB_Graphics3D_Impl> context( |
| 72 new PPB_Graphics3D_Impl(instance->module())); |
72 if (!context->Init(instance_id, config, attrib_list)) { | 73 if (!context->Init(instance_id, config, attrib_list)) { |
73 return 0; | 74 return 0; |
74 } | 75 } |
75 | 76 |
76 return context->GetReference(); | 77 return context->GetReference(); |
77 } | 78 } |
78 | 79 |
79 void* GetProcAddress(const char* name) { | 80 void* GetProcAddress(const char* name) { |
80 // TODO(neb): Implement me! | 81 // TODO(neb): Implement me! |
81 return NULL; | 82 return NULL; |
82 } | 83 } |
83 | 84 |
84 PP_Bool MakeCurrent(PP_Resource graphics3d) { | 85 PP_Bool MakeCurrent(PP_Resource graphics3d) { |
85 if (!graphics3d) { | 86 if (!graphics3d) { |
86 Graphics3D::ResetCurrent(); | 87 PPB_Graphics3D_Impl::ResetCurrent(); |
87 return PP_TRUE; | 88 return PP_TRUE; |
88 } else { | 89 } else { |
89 scoped_refptr<Graphics3D> context(Resource::GetAs<Graphics3D>(graphics3d)); | 90 scoped_refptr<PPB_Graphics3D_Impl> context( |
| 91 Resource::GetAs<PPB_Graphics3D_Impl>(graphics3d)); |
90 return BoolToPPBool(context.get() && context->MakeCurrent()); | 92 return BoolToPPBool(context.get() && context->MakeCurrent()); |
91 } | 93 } |
92 } | 94 } |
93 | 95 |
94 PP_Resource GetCurrentContext() { | 96 PP_Resource GetCurrentContext() { |
95 Graphics3D* current_context = Graphics3D::GetCurrent(); | 97 PPB_Graphics3D_Impl* current_context = PPB_Graphics3D_Impl::GetCurrent(); |
96 return current_context ? current_context->GetReference() : 0; | 98 return current_context ? current_context->GetReference() : 0; |
97 } | 99 } |
98 | 100 |
99 PP_Bool SwapBuffers(PP_Resource graphics3d) { | 101 PP_Bool SwapBuffers(PP_Resource graphics3d) { |
100 scoped_refptr<Graphics3D> context(Resource::GetAs<Graphics3D>(graphics3d)); | 102 scoped_refptr<PPB_Graphics3D_Impl> context( |
| 103 Resource::GetAs<PPB_Graphics3D_Impl>(graphics3d)); |
101 return BoolToPPBool(context && context->SwapBuffers()); | 104 return BoolToPPBool(context && context->SwapBuffers()); |
102 } | 105 } |
103 | 106 |
104 uint32_t GetError() { | 107 uint32_t GetError() { |
105 // Technically, this should return the last error that occurred on the current | 108 // Technically, this should return the last error that occurred on the current |
106 // thread, rather than an error associated with a particular context. | 109 // thread, rather than an error associated with a particular context. |
107 // TODO(apatrick): Fix this. | 110 // TODO(apatrick): Fix this. |
108 Graphics3D* current_context = Graphics3D::GetCurrent(); | 111 PPB_Graphics3D_Impl* current_context = PPB_Graphics3D_Impl::GetCurrent(); |
109 if (!current_context) | 112 if (!current_context) |
110 return 0; | 113 return 0; |
111 | 114 |
112 return current_context->GetError(); | 115 return current_context->GetError(); |
113 } | 116 } |
114 | 117 |
115 const PPB_Graphics3D_Dev ppb_graphics3d = { | 118 const PPB_Graphics3D_Dev ppb_graphics3d = { |
116 &IsGraphics3D, | 119 &IsGraphics3D, |
117 &GetConfigs, | 120 &GetConfigs, |
118 &ChooseConfig, | 121 &ChooseConfig, |
119 &GetConfigAttrib, | 122 &GetConfigAttrib, |
120 &QueryString, | 123 &QueryString, |
121 &CreateContext, | 124 &CreateContext, |
122 &GetProcAddress, | 125 &GetProcAddress, |
123 &MakeCurrent, | 126 &MakeCurrent, |
124 &GetCurrentContext, | 127 &GetCurrentContext, |
125 &SwapBuffers, | 128 &SwapBuffers, |
126 &GetError | 129 &GetError |
127 }; | 130 }; |
128 | 131 |
129 } // namespace | 132 } // namespace |
130 | 133 |
131 Graphics3D::Graphics3D(PluginModule* module) | 134 PPB_Graphics3D_Impl::PPB_Graphics3D_Impl(PluginModule* module) |
132 : Resource(module), | 135 : Resource(module), |
133 bound_instance_(NULL) { | 136 bound_instance_(NULL) { |
134 } | 137 } |
135 | 138 |
136 const PPB_Graphics3D_Dev* Graphics3D::GetInterface() { | 139 const PPB_Graphics3D_Dev* PPB_Graphics3D_Impl::GetInterface() { |
137 return &ppb_graphics3d; | 140 return &ppb_graphics3d; |
138 } | 141 } |
139 | 142 |
140 Graphics3D* Graphics3D::GetCurrent() { | 143 PPB_Graphics3D_Impl* PPB_Graphics3D_Impl::GetCurrent() { |
141 return CurrentContextKey::get()->Get(); | 144 return g_current_context_key.Get().Get(); |
142 } | 145 } |
143 | 146 |
144 void Graphics3D::ResetCurrent() { | 147 void PPB_Graphics3D_Impl::ResetCurrent() { |
145 CurrentContextKey::get()->Set(NULL); | 148 g_current_context_key.Get().Set(NULL); |
146 } | 149 } |
147 | 150 |
148 Graphics3D::~Graphics3D() { | 151 PPB_Graphics3D_Impl::~PPB_Graphics3D_Impl() { |
149 Destroy(); | 152 Destroy(); |
150 } | 153 } |
151 | 154 |
152 bool Graphics3D::Init(PP_Instance instance_id, int32_t config, | 155 PPB_Graphics3D_Impl* PPB_Graphics3D_Impl::AsGraphics3D() { |
153 const int32_t* attrib_list) { | 156 return this; |
| 157 } |
| 158 |
| 159 bool PPB_Graphics3D_Impl::Init(PP_Instance instance_id, int32_t config, |
| 160 const int32_t* attrib_list) { |
154 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); | 161 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
155 if (!instance) { | 162 if (!instance) { |
156 return false; | 163 return false; |
157 } | 164 } |
158 | 165 |
159 // Create and initialize the objects required to issue GLES2 calls. | 166 // Create and initialize the objects required to issue GLES2 calls. |
160 platform_context_.reset(instance->delegate()->CreateContext3D()); | 167 platform_context_.reset(instance->delegate()->CreateContext3D()); |
161 if (!platform_context_.get()) { | 168 if (!platform_context_.get()) { |
162 Destroy(); | 169 Destroy(); |
163 return false; | 170 return false; |
164 } | 171 } |
165 | 172 |
166 if (!platform_context_->Init()) { | 173 if (!platform_context_->Init()) { |
167 Destroy(); | 174 Destroy(); |
168 return false; | 175 return false; |
169 } | 176 } |
170 | 177 |
171 gles2_implementation_ = platform_context_->GetGLES2Implementation(); | 178 gles2_implementation_ = platform_context_->GetGLES2Implementation(); |
172 DCHECK(gles2_implementation_); | 179 DCHECK(gles2_implementation_); |
173 | 180 |
174 return true; | 181 return true; |
175 } | 182 } |
176 | 183 |
177 bool Graphics3D::BindToInstance(PluginInstance* new_instance) { | 184 bool PPB_Graphics3D_Impl::BindToInstance(PluginInstance* new_instance) { |
178 if (bound_instance_ == new_instance) | 185 if (bound_instance_ == new_instance) |
179 return true; // Rebinding the same device, nothing to do. | 186 return true; // Rebinding the same device, nothing to do. |
180 if (bound_instance_ && new_instance) | 187 if (bound_instance_ && new_instance) |
181 return false; // Can't change a bound device. | 188 return false; // Can't change a bound device. |
182 | 189 |
183 if (new_instance) { | 190 if (new_instance) { |
184 // Resize the backing texture to the size of the instance when it is bound. | 191 // Resize the backing texture to the size of the instance when it is bound. |
185 platform_context_->ResizeBackingTexture(new_instance->position().size()); | 192 platform_context_->ResizeBackingTexture(new_instance->position().size()); |
186 | 193 |
187 // This is a temporary hack. The SwapBuffers is issued to force the resize | 194 // This is a temporary hack. The SwapBuffers is issued to force the resize |
188 // to take place before any subsequent rendering. This might lead to a | 195 // to take place before any subsequent rendering. This might lead to a |
189 // partially rendered frame being displayed. It is also not thread safe | 196 // partially rendered frame being displayed. It is also not thread safe |
190 // since the SwapBuffers is written to the command buffer and that command | 197 // since the SwapBuffers is written to the command buffer and that command |
191 // buffer might be written to by another thread. | 198 // buffer might be written to by another thread. |
192 // TODO(apatrick): Figure out the semantics of binding and resizing. | 199 // TODO(apatrick): Figure out the semantics of binding and resizing. |
193 platform_context_->SwapBuffers(); | 200 platform_context_->SwapBuffers(); |
194 } | 201 } |
195 | 202 |
196 bound_instance_ = new_instance; | 203 bound_instance_ = new_instance; |
197 return true; | 204 return true; |
198 } | 205 } |
199 | 206 |
200 bool Graphics3D::MakeCurrent() { | 207 bool PPB_Graphics3D_Impl::MakeCurrent() { |
201 if (!platform_context_.get()) | 208 if (!platform_context_.get()) |
202 return false; | 209 return false; |
203 | 210 |
204 CurrentContextKey::get()->Set(this); | 211 g_current_context_key.Get().Set(this); |
205 | 212 |
206 // TODO(apatrick): Return false on context lost. | 213 // TODO(apatrick): Return false on context lost. |
207 return true; | 214 return true; |
208 } | 215 } |
209 | 216 |
210 bool Graphics3D::SwapBuffers() { | 217 bool PPB_Graphics3D_Impl::SwapBuffers() { |
211 if (!platform_context_.get()) | 218 if (!platform_context_.get()) |
212 return false; | 219 return false; |
213 | 220 |
214 return platform_context_->SwapBuffers(); | 221 return platform_context_->SwapBuffers(); |
215 } | 222 } |
216 | 223 |
217 unsigned Graphics3D::GetError() { | 224 unsigned PPB_Graphics3D_Impl::GetError() { |
218 if (!platform_context_.get()) | 225 if (!platform_context_.get()) |
219 return 0; | 226 return 0; |
220 | 227 |
221 return platform_context_->GetError(); | 228 return platform_context_->GetError(); |
222 } | 229 } |
223 | 230 |
224 void Graphics3D::ResizeBackingTexture(const gfx::Size& size) { | 231 void PPB_Graphics3D_Impl::ResizeBackingTexture(const gfx::Size& size) { |
225 if (!platform_context_.get()) | 232 if (!platform_context_.get()) |
226 return; | 233 return; |
227 | 234 |
228 platform_context_->ResizeBackingTexture(size); | 235 platform_context_->ResizeBackingTexture(size); |
229 } | 236 } |
230 | 237 |
231 void Graphics3D::SetSwapBuffersCallback(Callback0::Type* callback) { | 238 void PPB_Graphics3D_Impl::SetSwapBuffersCallback(Callback0::Type* callback) { |
232 if (!platform_context_.get()) | 239 if (!platform_context_.get()) |
233 return; | 240 return; |
234 | 241 |
235 platform_context_->SetSwapBuffersCallback(callback); | 242 platform_context_->SetSwapBuffersCallback(callback); |
236 } | 243 } |
237 | 244 |
238 unsigned Graphics3D::GetBackingTextureId() { | 245 unsigned PPB_Graphics3D_Impl::GetBackingTextureId() { |
239 if (!platform_context_.get()) | 246 if (!platform_context_.get()) |
240 return 0; | 247 return 0; |
241 | 248 |
242 return platform_context_->GetBackingTextureId(); | 249 return platform_context_->GetBackingTextureId(); |
243 } | 250 } |
244 | 251 |
245 void Graphics3D::Destroy() { | 252 void PPB_Graphics3D_Impl::Destroy() { |
246 if (GetCurrent() == this) { | 253 if (GetCurrent() == this) { |
247 ResetCurrent(); | 254 ResetCurrent(); |
248 } | 255 } |
249 | 256 |
250 gles2_implementation_ = NULL; | 257 gles2_implementation_ = NULL; |
251 | 258 |
252 platform_context_.reset(); | 259 platform_context_.reset(); |
253 } | 260 } |
254 | 261 |
255 } // namespace pepper | 262 } // namespace ppapi |
| 263 } // namespace plugins |
| 264 } // namespace webkit |
256 | 265 |
OLD | NEW |