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

Side by Side Diff: ppapi/proxy/ppb_surface_3d_proxy.cc

Issue 6400007: Implement proxy for 3d-related interfaces (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: separate ParamTraits<gpu::CommandBuffer::State> into own library Created 9 years, 10 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
(Empty)
1 // Copyright (c) 2011 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 "ppapi/proxy/ppb_surface_3d_proxy.h"
6
7 #include "gpu/command_buffer/client/gles2_implementation.h"
8 #include "ppapi/c/pp_errors.h"
9 #include "ppapi/c/pp_resource.h"
10 #include "ppapi/c/dev/ppb_surface_3d_dev.h"
11 #include "ppapi/proxy/plugin_dispatcher.h"
12 #include "ppapi/proxy/plugin_resource.h"
13 #include "ppapi/proxy/ppapi_messages.h"
14 #include "ppapi/proxy/ppb_context_3d_proxy.h"
15
16 namespace pp {
17 namespace proxy {
18
19 namespace {
20
21 PP_Resource Create(PP_Instance instance,
22 PP_Config3D_Dev config,
23 const int32_t* attrib_list) {
24 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
25 if (!dispatcher)
26 return PP_ERROR_BADARGUMENT;
27
28 std::vector<int32_t> attribs;
29 if (attrib_list) {
30 for (const int32_t* attr = attrib_list; attr; ++attr)
31 attribs.push_back(*attr);
32 } else {
33 attribs.push_back(0);
34 }
35
36 HostResource result;
37 dispatcher->Send(new PpapiHostMsg_PPBSurface3D_Create(
38 INTERFACE_ID_PPB_SURFACE_3D, instance, config, attribs, &result));
39
40 if (result.is_null())
41 return 0;
42 linked_ptr<Surface3D> surface_3d(new Surface3D(result));
43 PP_Resource resource =
44 PluginResourceTracker::GetInstance()->AddResource(surface_3d);
45 surface_3d->set_resource(resource);
46 return resource;
47 }
48
49 PP_Bool IsSurface3D(PP_Resource resource) {
50 Surface3D* object = PluginResource::GetAs<Surface3D>(resource);
51 return BoolToPPBool(!!object);
52 }
53
54 int32_t SetAttrib(PP_Resource surface_id,
55 int32_t attribute,
56 int32_t value) {
57 // TODO(alokp): Implement me.
58 return 0;
59 }
60
61 int32_t GetAttrib(PP_Resource surface_id,
62 int32_t attribute,
63 int32_t* value) {
64 // TODO(alokp): Implement me.
65 return 0;
66 }
67
68 int32_t SwapBuffers(PP_Resource surface_id,
69 PP_CompletionCallback callback) {
70 Surface3D* object = PluginResource::GetAs<Surface3D>(surface_id);
71 if (!object)
72 return PP_ERROR_BADRESOURCE;
73 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
74 object->instance());
75 if (!dispatcher)
76 return PP_ERROR_FAILED;
77
78 // For now, disallow blocking calls. We'll need to add support for other
79 // threads to this later.
80 if (!callback.func)
81 return PP_ERROR_BADARGUMENT;
82
83 if (object->is_flush_pending())
84 return PP_ERROR_INPROGRESS; // Can't have >1 flush pending.
85
86 if (!object->context())
87 return PP_ERROR_FAILED;
88
89 object->context()->gles2_impl()->SwapBuffers();
90
91 object->set_current_flush_callback(callback);
92
93 IPC::Message* msg = new PpapiHostMsg_PPBSurface3D_SwapBuffers(
94 INTERFACE_ID_PPB_SURFACE_3D, object->host_resource());
95 msg->set_unblock(true);
96 dispatcher->Send(msg);
97 return PP_ERROR_WOULDBLOCK;
98 }
99
100 const PPB_Surface3D_Dev ppb_surface_3d = {
101 &Create,
102 &IsSurface3D,
103 &SetAttrib,
104 &GetAttrib,
105 &SwapBuffers
106 };
107
108 } // namespace
109
110 PPB_Surface3D_Proxy::PPB_Surface3D_Proxy(Dispatcher* dispatcher,
111 const void* target_interface)
112 : InterfaceProxy(dispatcher, target_interface),
113 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
114 }
115
116 PPB_Surface3D_Proxy::~PPB_Surface3D_Proxy() {
117 }
118
119 const void* PPB_Surface3D_Proxy::GetSourceInterface() const {
120 return &ppb_surface_3d;
121 }
122
123 InterfaceID PPB_Surface3D_Proxy::GetInterfaceId() const {
124 return INTERFACE_ID_PPB_SURFACE_3D;
125 }
126
127 bool PPB_Surface3D_Proxy::OnMessageReceived(const IPC::Message& msg) {
128 bool handled = true;
129 IPC_BEGIN_MESSAGE_MAP(PPB_Surface3D_Proxy, msg)
130 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBSurface3D_Create,
131 OnMsgCreate)
132 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBSurface3D_SwapBuffers,
133 OnMsgSwapBuffers)
134
135 IPC_MESSAGE_HANDLER(PpapiMsg_PPBSurface3D_SwapBuffersACK,
136 OnMsgSwapBuffersACK)
137 IPC_MESSAGE_UNHANDLED(handled = false)
138 IPC_END_MESSAGE_MAP()
139 // FIXME(brettw) handle bad messages!
140 return handled;
141 }
142
143 void PPB_Surface3D_Proxy::OnMsgCreate(PP_Instance instance,
144 PP_Config3D_Dev config,
145 std::vector<int32_t> attribs,
146 HostResource* result) {
147 DCHECK(attribs.back() == 0);
148 PP_Resource resource =
149 ppb_surface_3d_target()->Create(instance, config, &attribs.front());
150 result->SetHostResource(instance, resource);
151 }
152
153 void PPB_Surface3D_Proxy::OnMsgSwapBuffers(const HostResource& surface_3d) {
154 CompletionCallback callback = callback_factory_.NewCallback(
155 &PPB_Surface3D_Proxy::SendSwapBuffersACKToPlugin, surface_3d);
156 int32_t result = ppb_surface_3d_target()->SwapBuffers(
157 surface_3d.host_resource(), callback.pp_completion_callback());
158 if (result != PP_ERROR_WOULDBLOCK) {
159 // There was some error, so we won't get a flush callback. We need to now
160 // issue the ACK to the plugin hears about the error. This will also clean
161 // up the data associated with the callback.
162 callback.Run(result);
163 }
164 }
165
166 void PPB_Surface3D_Proxy::OnMsgSwapBuffersACK(const HostResource& resource,
167 int32_t pp_error) {
168 PP_Resource plugin_resource =
169 PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
170 resource);
171 if (!plugin_resource)
172 return;
173 Surface3D* object = PluginResource::GetAs<Surface3D>(plugin_resource);
174 if (!object) {
175 // The plugin has released the Surface3D object so don't issue the
176 // callback.
177 return;
178 }
179
180 // Be careful to make the callback NULL again before issuing the callback
181 // since the plugin might want to flush from within the callback.
182 PP_CompletionCallback callback = object->current_flush_callback();
183 object->set_current_flush_callback(PP_BlockUntilComplete());
184 PP_RunCompletionCallback(&callback, pp_error);
185 }
186
187 void PPB_Surface3D_Proxy::SendSwapBuffersACKToPlugin(
188 int32_t result,
189 const HostResource& surface_3d) {
190 dispatcher()->Send(new PpapiMsg_PPBSurface3D_SwapBuffersACK(
191 INTERFACE_ID_PPB_SURFACE_3D, surface_3d, result));
192 }
193
194 } // namespace proxy
195 } // namespace pp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698