Chromium Code Reviews
|
| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "webkit/plugins/ppapi/ppb_context_3d_impl.h" | |
| 6 | |
| 7 #include "gpu/command_buffer/common/command_buffer.h" | |
| 8 #include "ppapi/c/dev/ppb_graphics_3d_dev.h" | |
| 9 #include "webkit/plugins/ppapi/common.h" | |
| 10 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | |
| 11 | |
| 12 namespace webkit { | |
| 13 namespace ppapi { | |
| 14 | |
| 15 namespace { | |
| 16 | |
| 17 // Size of the transfer buffer. | |
| 18 enum { kTransferBufferSize = 512 * 1024 }; | |
| 19 | |
| 20 PP_Resource Create(PP_Instance instance_id, | |
| 21 PP_Config3D_Dev config, | |
| 22 PP_Resource share_context, | |
| 23 const int32_t* attrib_list) { | |
| 24 // TODO(alokp): Support shared context. | |
| 25 DCHECK_EQ(0, share_context); | |
| 26 if (share_context != 0) | |
| 27 return 0; | |
| 28 | |
| 29 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); | |
| 30 if (!instance) | |
| 31 return 0; | |
| 32 | |
| 33 scoped_refptr<PPB_Context3D_Impl> context( | |
| 34 new PPB_Context3D_Impl(instance->module())); | |
| 35 if (!context->Init(instance, config, share_context, attrib_list)) { | |
|
brettw
2010/12/22 22:56:21
Remove {} for consistency.
alokp
2010/12/22 23:04:49
Done.
| |
| 36 return 0; | |
| 37 } | |
| 38 | |
| 39 return context->GetReference(); | |
| 40 } | |
| 41 | |
| 42 PP_Bool IsContext3D(PP_Resource resource) { | |
| 43 return BoolToPPBool(!!Resource::GetAs<PPB_Context3D_Impl>(resource)); | |
| 44 } | |
| 45 | |
| 46 int32_t GetAttrib(PP_Resource context, | |
| 47 int32_t attribute, | |
| 48 int32_t* value) { | |
| 49 // TODO(alokp): Implement me. | |
| 50 return 0; | |
| 51 } | |
| 52 | |
| 53 int32_t BindSurfaces(PP_Resource context, | |
| 54 PP_Resource draw, | |
| 55 PP_Resource read) { | |
| 56 // TODO(alokp): Implement me. | |
| 57 return 0; | |
| 58 } | |
| 59 | |
| 60 int32_t GetBoundSurfaces(PP_Resource context, | |
| 61 PP_Resource* draw, | |
| 62 PP_Resource* read) { | |
| 63 // TODO(alokp): Implement me. | |
| 64 return 0; | |
| 65 } | |
| 66 | |
| 67 int32_t SwapBuffers(PP_Resource context_id, | |
| 68 PP_CompletionCallback callback) { | |
| 69 scoped_refptr<PPB_Context3D_Impl> context( | |
| 70 Resource::GetAs<PPB_Context3D_Impl>(context_id)); | |
| 71 return context->SwapBuffers(); | |
| 72 } | |
| 73 | |
| 74 const PPB_Context3D_Dev ppb_context3d = { | |
| 75 &Create, | |
| 76 &IsContext3D, | |
| 77 &GetAttrib, | |
| 78 &BindSurfaces, | |
| 79 &GetBoundSurfaces, | |
| 80 &SwapBuffers | |
| 81 }; | |
| 82 | |
| 83 } // namespace | |
| 84 | |
| 85 PPB_Context3D_Impl::PPB_Context3D_Impl(PluginModule* module) | |
| 86 : Resource(module), | |
| 87 bound_instance_(NULL), | |
| 88 gles2_impl_(NULL) { | |
| 89 } | |
| 90 | |
| 91 PPB_Context3D_Impl::~PPB_Context3D_Impl() { | |
| 92 Destroy(); | |
| 93 } | |
| 94 | |
| 95 const PPB_Context3D_Dev* PPB_Context3D_Impl::GetInterface() { | |
| 96 return &ppb_context3d; | |
| 97 } | |
| 98 | |
| 99 PPB_Context3D_Impl* PPB_Context3D_Impl::AsPPB_Context3D_Impl() { | |
| 100 return this; | |
| 101 } | |
| 102 | |
| 103 bool PPB_Context3D_Impl::Init(PluginInstance* instance, | |
| 104 PP_Config3D_Dev config, | |
| 105 PP_Resource share_context, | |
| 106 const int32_t* attrib_list) { | |
| 107 DCHECK(instance); | |
| 108 // Create and initialize the objects required to issue GLES2 calls. | |
| 109 platform_context_.reset(instance->delegate()->CreateContext3D()); | |
| 110 if (!platform_context_.get()) { | |
| 111 Destroy(); | |
| 112 return false; | |
| 113 } | |
| 114 if (!platform_context_->Init()) { | |
| 115 Destroy(); | |
| 116 return false; | |
| 117 } | |
| 118 | |
| 119 gles2_impl_ = platform_context_->GetGLES2Implementation(); | |
| 120 DCHECK(gles2_impl_); | |
| 121 | |
| 122 return true; | |
| 123 } | |
| 124 | |
| 125 bool PPB_Context3D_Impl::BindToInstance(PluginInstance* new_instance) { | |
| 126 if (bound_instance_ == new_instance) | |
|
brettw
2010/12/22 22:56:21
Is there a way we can ensure that the instance tha
alokp
2010/12/22 23:04:49
I will actually move this function to PPB_Surface3
| |
| 127 return true; // Rebinding the same device, nothing to do. | |
| 128 if (bound_instance_ && new_instance) | |
| 129 return false; // Can't change a bound device. | |
| 130 | |
| 131 if (new_instance) { | |
| 132 // Resize the backing texture to the size of the instance when it is bound. | |
| 133 platform_context_->ResizeBackingTexture(new_instance->position().size()); | |
| 134 | |
| 135 // This is a temporary hack. The SwapBuffers is issued to force the resize | |
| 136 // to take place before any subsequent rendering. This might lead to a | |
| 137 // partially rendered frame being displayed. It is also not thread safe | |
| 138 // since the SwapBuffers is written to the command buffer and that command | |
| 139 // buffer might be written to by another thread. | |
| 140 // TODO(apatrick): Figure out the semantics of binding and resizing. | |
| 141 platform_context_->SwapBuffers(); | |
| 142 } | |
| 143 | |
| 144 bound_instance_ = new_instance; | |
| 145 return true; | |
| 146 } | |
| 147 | |
| 148 bool PPB_Context3D_Impl::SwapBuffers() { | |
| 149 if (!platform_context_.get()) | |
| 150 return false; | |
| 151 | |
| 152 return platform_context_->SwapBuffers(); | |
| 153 } | |
| 154 | |
| 155 void PPB_Context3D_Impl::SetSwapBuffersCallback(Callback0::Type* callback) { | |
| 156 if (!platform_context_.get()) | |
| 157 return; | |
| 158 | |
| 159 platform_context_->SetSwapBuffersCallback(callback); | |
| 160 } | |
| 161 | |
| 162 unsigned int PPB_Context3D_Impl::GetBackingTextureId() { | |
| 163 if (!platform_context_.get()) | |
| 164 return 0; | |
| 165 | |
| 166 return platform_context_->GetBackingTextureId(); | |
| 167 } | |
| 168 | |
| 169 void PPB_Context3D_Impl::ResizeBackingTexture(const gfx::Size& size) { | |
| 170 if (!platform_context_.get()) | |
| 171 return; | |
| 172 | |
| 173 platform_context_->ResizeBackingTexture(size); | |
| 174 } | |
| 175 | |
| 176 void PPB_Context3D_Impl::Destroy() { | |
| 177 gles2_impl_ = NULL; | |
| 178 platform_context_.reset(); | |
| 179 } | |
| 180 | |
| 181 } // namespace ppapi | |
| 182 } // namespace webkit | |
| 183 | |
| OLD | NEW |