| 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/plugins/ppapi/ppb_graphics_3d_impl.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/lazy_instance.h" | |
| 9 #include "base/thread_local.h" | |
| 10 #include "ppapi/c/dev/ppb_graphics_3d_dev.h" | 8 #include "ppapi/c/dev/ppb_graphics_3d_dev.h" |
| 11 #include "webkit/plugins/ppapi/common.h" | 9 #include "webkit/plugins/ppapi/common.h" |
| 12 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 10 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
| 13 | 11 |
| 14 namespace webkit { | 12 namespace webkit { |
| 15 namespace ppapi { | 13 namespace ppapi { |
| 16 | 14 |
| 17 namespace { | 15 namespace { |
| 18 | 16 |
| 19 static base::LazyInstance<base::ThreadLocalPointer<PPB_Graphics3D_Impl> > | |
| 20 g_current_context_key(base::LINKER_INITIALIZED); | |
| 21 | |
| 22 // Size of the transfer buffer. | 17 // Size of the transfer buffer. |
| 23 enum { kTransferBufferSize = 512 * 1024 }; | 18 enum { kTransferBufferSize = 512 * 1024 }; |
| 24 | 19 |
| 25 PP_Bool IsGraphics3D(PP_Resource resource) { | 20 PP_Bool IsGraphics3D(PP_Resource resource) { |
| 26 return BoolToPPBool(!!Resource::GetAs<PPB_Graphics3D_Impl>(resource)); | 21 return BoolToPPBool(!!Resource::GetAs<PPB_Graphics3D_Impl>(resource)); |
| 27 } | 22 } |
| 28 | 23 |
| 29 PP_Bool GetConfigs(int32_t* configs, int32_t config_size, int32_t* num_config) { | 24 PP_Bool GetConfigs(int32_t* configs, int32_t config_size, int32_t* num_config) { |
| 30 // TODO(neb): Implement me! | 25 // TODO(neb): Implement me! |
| 31 return PP_FALSE; | 26 return PP_FALSE; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 } | 69 } |
| 75 | 70 |
| 76 return context->GetReference(); | 71 return context->GetReference(); |
| 77 } | 72 } |
| 78 | 73 |
| 79 void* GetProcAddress(const char* name) { | 74 void* GetProcAddress(const char* name) { |
| 80 // TODO(neb): Implement me! | 75 // TODO(neb): Implement me! |
| 81 return NULL; | 76 return NULL; |
| 82 } | 77 } |
| 83 | 78 |
| 84 PP_Bool MakeCurrent(PP_Resource graphics3d) { | |
| 85 if (!graphics3d) { | |
| 86 PPB_Graphics3D_Impl::ResetCurrent(); | |
| 87 return PP_TRUE; | |
| 88 } else { | |
| 89 scoped_refptr<PPB_Graphics3D_Impl> context( | |
| 90 Resource::GetAs<PPB_Graphics3D_Impl>(graphics3d)); | |
| 91 return BoolToPPBool(context.get() && context->MakeCurrent()); | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 PP_Resource GetCurrentContext() { | |
| 96 PPB_Graphics3D_Impl* current_context = PPB_Graphics3D_Impl::GetCurrent(); | |
| 97 return current_context ? current_context->GetReference() : 0; | |
| 98 } | |
| 99 | |
| 100 PP_Bool SwapBuffers(PP_Resource graphics3d) { | 79 PP_Bool SwapBuffers(PP_Resource graphics3d) { |
| 101 scoped_refptr<PPB_Graphics3D_Impl> context( | 80 scoped_refptr<PPB_Graphics3D_Impl> context( |
| 102 Resource::GetAs<PPB_Graphics3D_Impl>(graphics3d)); | 81 Resource::GetAs<PPB_Graphics3D_Impl>(graphics3d)); |
| 103 return BoolToPPBool(context && context->SwapBuffers()); | 82 return BoolToPPBool(context && context->SwapBuffers()); |
| 104 } | 83 } |
| 105 | 84 |
| 106 uint32_t GetError() { | 85 uint32_t GetError() { |
| 107 // Technically, this should return the last error that occurred on the current | 86 // TODO(alokp): Fix this. |
| 108 // thread, rather than an error associated with a particular context. | 87 return 0; |
| 109 // TODO(apatrick): Fix this. | |
| 110 PPB_Graphics3D_Impl* current_context = PPB_Graphics3D_Impl::GetCurrent(); | |
| 111 if (!current_context) | |
| 112 return 0; | |
| 113 | |
| 114 return current_context->GetError(); | |
| 115 } | 88 } |
| 116 | 89 |
| 117 const PPB_Graphics3D_Dev ppb_graphics3d = { | 90 const PPB_Graphics3D_Dev ppb_graphics3d = { |
| 118 &IsGraphics3D, | 91 &IsGraphics3D, |
| 119 &GetConfigs, | 92 &GetConfigs, |
| 120 &ChooseConfig, | 93 &ChooseConfig, |
| 121 &GetConfigAttrib, | 94 &GetConfigAttrib, |
| 122 &QueryString, | 95 &QueryString, |
| 123 &CreateContext, | 96 &CreateContext, |
| 124 &GetProcAddress, | 97 &GetProcAddress, |
| 125 &MakeCurrent, | |
| 126 &GetCurrentContext, | |
| 127 &SwapBuffers, | 98 &SwapBuffers, |
| 128 &GetError | 99 &GetError |
| 129 }; | 100 }; |
| 130 | 101 |
| 131 } // namespace | 102 } // namespace |
| 132 | 103 |
| 133 PPB_Graphics3D_Impl::PPB_Graphics3D_Impl(PluginModule* module) | 104 PPB_Graphics3D_Impl::PPB_Graphics3D_Impl(PluginModule* module) |
| 134 : Resource(module), | 105 : Resource(module), |
| 135 bound_instance_(NULL) { | 106 bound_instance_(NULL) { |
| 136 } | 107 } |
| 137 | 108 |
| 138 const PPB_Graphics3D_Dev* PPB_Graphics3D_Impl::GetInterface() { | 109 const PPB_Graphics3D_Dev* PPB_Graphics3D_Impl::GetInterface() { |
| 139 return &ppb_graphics3d; | 110 return &ppb_graphics3d; |
| 140 } | 111 } |
| 141 | 112 |
| 142 PPB_Graphics3D_Impl* PPB_Graphics3D_Impl::GetCurrent() { | |
| 143 return g_current_context_key.Get().Get(); | |
| 144 } | |
| 145 | |
| 146 void PPB_Graphics3D_Impl::ResetCurrent() { | |
| 147 g_current_context_key.Get().Set(NULL); | |
| 148 } | |
| 149 | |
| 150 PPB_Graphics3D_Impl::~PPB_Graphics3D_Impl() { | 113 PPB_Graphics3D_Impl::~PPB_Graphics3D_Impl() { |
| 151 Destroy(); | 114 Destroy(); |
| 152 } | 115 } |
| 153 | 116 |
| 154 PPB_Graphics3D_Impl* PPB_Graphics3D_Impl::AsPPB_Graphics3D_Impl() { | 117 PPB_Graphics3D_Impl* PPB_Graphics3D_Impl::AsPPB_Graphics3D_Impl() { |
| 155 return this; | 118 return this; |
| 156 } | 119 } |
| 157 | 120 |
| 158 bool PPB_Graphics3D_Impl::Init(PP_Instance instance_id, int32_t config, | 121 bool PPB_Graphics3D_Impl::Init(PP_Instance instance_id, int32_t config, |
| 159 const int32_t* attrib_list) { | 122 const int32_t* attrib_list) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 // since the SwapBuffers is written to the command buffer and that command | 159 // since the SwapBuffers is written to the command buffer and that command |
| 197 // buffer might be written to by another thread. | 160 // buffer might be written to by another thread. |
| 198 // TODO(apatrick): Figure out the semantics of binding and resizing. | 161 // TODO(apatrick): Figure out the semantics of binding and resizing. |
| 199 platform_context_->SwapBuffers(); | 162 platform_context_->SwapBuffers(); |
| 200 } | 163 } |
| 201 | 164 |
| 202 bound_instance_ = new_instance; | 165 bound_instance_ = new_instance; |
| 203 return true; | 166 return true; |
| 204 } | 167 } |
| 205 | 168 |
| 206 bool PPB_Graphics3D_Impl::MakeCurrent() { | |
| 207 if (!platform_context_.get()) | |
| 208 return false; | |
| 209 | |
| 210 g_current_context_key.Get().Set(this); | |
| 211 | |
| 212 // TODO(apatrick): Return false on context lost. | |
| 213 return true; | |
| 214 } | |
| 215 | |
| 216 bool PPB_Graphics3D_Impl::SwapBuffers() { | 169 bool PPB_Graphics3D_Impl::SwapBuffers() { |
| 217 if (!platform_context_.get()) | 170 if (!platform_context_.get()) |
| 218 return false; | 171 return false; |
| 219 | 172 |
| 220 return platform_context_->SwapBuffers(); | 173 return platform_context_->SwapBuffers(); |
| 221 } | 174 } |
| 222 | 175 |
| 223 unsigned PPB_Graphics3D_Impl::GetError() { | 176 unsigned PPB_Graphics3D_Impl::GetError() { |
| 224 if (!platform_context_.get()) | 177 if (!platform_context_.get()) |
| 225 return 0; | 178 return 0; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 242 } | 195 } |
| 243 | 196 |
| 244 unsigned PPB_Graphics3D_Impl::GetBackingTextureId() { | 197 unsigned PPB_Graphics3D_Impl::GetBackingTextureId() { |
| 245 if (!platform_context_.get()) | 198 if (!platform_context_.get()) |
| 246 return 0; | 199 return 0; |
| 247 | 200 |
| 248 return platform_context_->GetBackingTextureId(); | 201 return platform_context_->GetBackingTextureId(); |
| 249 } | 202 } |
| 250 | 203 |
| 251 void PPB_Graphics3D_Impl::Destroy() { | 204 void PPB_Graphics3D_Impl::Destroy() { |
| 252 if (GetCurrent() == this) { | |
| 253 ResetCurrent(); | |
| 254 } | |
| 255 | |
| 256 gles2_implementation_ = NULL; | 205 gles2_implementation_ = NULL; |
| 257 | |
| 258 platform_context_.reset(); | 206 platform_context_.reset(); |
| 259 } | 207 } |
| 260 | 208 |
| 261 } // namespace ppapi | 209 } // namespace ppapi |
| 262 } // namespace webkit | 210 } // namespace webkit |
| 263 | 211 |
| OLD | NEW |