| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 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 <GLES2/gl2.h> | 5 #include <GLES2/gl2.h> |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "content/renderer/gpu/transport_texture_host.h" | 9 #include "content/renderer/gpu/transport_texture_host.h" |
| 10 | 10 |
| 11 // On Mac gl2.h clashes with gpu_messages.h and this problem hasn't been | 11 // On Mac gl2.h clashes with gpu_messages.h and this problem hasn't been |
| 12 // solved yet so exclude building on Mac. | 12 // solved yet so exclude building on Mac. |
| 13 #if !defined(OS_MACOSX) | 13 #if !defined(OS_MACOSX) |
| 14 | 14 |
| 15 #include "base/bind.h" |
| 15 #include "base/message_loop.h" | 16 #include "base/message_loop.h" |
| 16 #include "content/common/gpu/gpu_messages.h" | 17 #include "content/common/gpu/gpu_messages.h" |
| 17 #include "content/renderer/gpu/renderer_gl_context.h" | 18 #include "content/renderer/gpu/renderer_gl_context.h" |
| 18 #include "content/renderer/gpu/transport_texture_service.h" | 19 #include "content/renderer/gpu/transport_texture_service.h" |
| 19 | 20 |
| 20 TransportTextureHost::TransportTextureHost(MessageLoop* io_message_loop, | 21 TransportTextureHost::TransportTextureHost(MessageLoop* io_message_loop, |
| 21 MessageLoop* render_message_loop, | 22 MessageLoop* render_message_loop, |
| 22 TransportTextureService* service, | 23 TransportTextureService* service, |
| 23 IPC::Message::Sender* sender, | 24 IPC::Message::Sender* sender, |
| 24 RendererGLContext* context, | 25 RendererGLContext* context, |
| 25 int32 context_route_id, | 26 int32 context_route_id, |
| 26 int32 host_id) | 27 int32 host_id) |
| 27 : io_message_loop_(io_message_loop), | 28 : io_message_loop_(io_message_loop), |
| 28 render_message_loop_(render_message_loop), | 29 render_message_loop_(render_message_loop), |
| 29 service_(service), | 30 service_(service), |
| 30 sender_(sender), | 31 sender_(sender), |
| 31 context_(context), | 32 context_(context), |
| 32 context_route_id_(context_route_id), | 33 context_route_id_(context_route_id), |
| 33 host_id_(host_id), | 34 host_id_(host_id), |
| 34 peer_id_(0) { | 35 peer_id_(0) { |
| 35 } | 36 } |
| 36 | 37 |
| 37 TransportTextureHost::~TransportTextureHost() { | 38 TransportTextureHost::~TransportTextureHost() { |
| 38 } | 39 } |
| 39 | 40 |
| 40 void TransportTextureHost::Init(Task* done_task) { | 41 void TransportTextureHost::Init(Task* done_task) { |
| 41 if (MessageLoop::current() != io_message_loop_) { | 42 if (MessageLoop::current() != io_message_loop_) { |
| 42 io_message_loop_->PostTask( | 43 io_message_loop_->PostTask( |
| 43 FROM_HERE, | 44 FROM_HERE, |
| 44 NewRunnableMethod(this, &TransportTextureHost::Init, done_task)); | 45 base::Bind(&TransportTextureHost::Init, this, done_task)); |
| 45 return; | 46 return; |
| 46 } | 47 } |
| 47 | 48 |
| 48 init_task_.reset(done_task); | 49 init_task_.reset(done_task); |
| 49 | 50 |
| 50 // Send the message. | 51 // Send the message. |
| 51 bool ret = sender_->Send( | 52 bool ret = sender_->Send( |
| 52 new GpuChannelMsg_CreateTransportTexture(context_route_id_, host_id_)); | 53 new GpuChannelMsg_CreateTransportTexture(context_route_id_, host_id_)); |
| 53 if (!ret) { | 54 if (!ret) { |
| 54 LOG(ERROR) << "GpuChannelMsg_CreateTransportTexture failed"; | 55 LOG(ERROR) << "GpuChannelMsg_CreateTransportTexture failed"; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 IPC_MESSAGE_UNHANDLED(handled = false) | 96 IPC_MESSAGE_UNHANDLED(handled = false) |
| 96 IPC_END_MESSAGE_MAP() | 97 IPC_END_MESSAGE_MAP() |
| 97 DCHECK(handled); | 98 DCHECK(handled); |
| 98 return handled; | 99 return handled; |
| 99 } | 100 } |
| 100 | 101 |
| 101 void TransportTextureHost::ReleaseTexturesInternal() { | 102 void TransportTextureHost::ReleaseTexturesInternal() { |
| 102 if (MessageLoop::current() != render_message_loop_) { | 103 if (MessageLoop::current() != render_message_loop_) { |
| 103 render_message_loop_->PostTask( | 104 render_message_loop_->PostTask( |
| 104 FROM_HERE, | 105 FROM_HERE, |
| 105 NewRunnableMethod(this, | 106 base::Bind(&TransportTextureHost::ReleaseTexturesInternal, this)); |
| 106 &TransportTextureHost::ReleaseTexturesInternal)); | |
| 107 return; | 107 return; |
| 108 } | 108 } |
| 109 | 109 |
| 110 scoped_array<GLuint> textures(new GLuint[textures_.size()]); | 110 scoped_array<GLuint> textures(new GLuint[textures_.size()]); |
| 111 for (size_t i = 0; i < textures_.size(); ++i) | 111 for (size_t i = 0; i < textures_.size(); ++i) |
| 112 textures[i] = textures_[i]; | 112 textures[i] = textures_[i]; |
| 113 glDeleteTextures(textures_.size(), textures.get()); | 113 glDeleteTextures(textures_.size(), textures.get()); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void TransportTextureHost::SendTexturesInternal( | 116 void TransportTextureHost::SendTexturesInternal( |
| 117 const std::vector<int>& textures) { | 117 const std::vector<int>& textures) { |
| 118 if (MessageLoop::current() != io_message_loop_) { | 118 if (MessageLoop::current() != io_message_loop_) { |
| 119 io_message_loop_->PostTask( | 119 io_message_loop_->PostTask( |
| 120 FROM_HERE, | 120 FROM_HERE, |
| 121 NewRunnableMethod(this, &TransportTextureHost::SendTexturesInternal, | 121 base::Bind(&TransportTextureHost::SendTexturesInternal, this, |
| 122 textures)); | 122 textures)); |
| 123 return; | 123 return; |
| 124 } | 124 } |
| 125 | 125 |
| 126 bool ret = sender_->Send( | 126 bool ret = sender_->Send( |
| 127 new GpuTransportTextureMsg_TexturesCreated(peer_id_, textures)); | 127 new GpuTransportTextureMsg_TexturesCreated(peer_id_, textures)); |
| 128 if (!ret) { | 128 if (!ret) { |
| 129 LOG(ERROR) << "GpuTransportTextureMsg_TexturesCreated failed"; | 129 LOG(ERROR) << "GpuTransportTextureMsg_TexturesCreated failed"; |
| 130 } | 130 } |
| 131 } | 131 } |
| 132 | 132 |
| 133 void TransportTextureHost::SendDestroyInternal() { | 133 void TransportTextureHost::SendDestroyInternal() { |
| 134 if (MessageLoop::current() != io_message_loop_) { | 134 if (MessageLoop::current() != io_message_loop_) { |
| 135 io_message_loop_->PostTask( | 135 io_message_loop_->PostTask( |
| 136 FROM_HERE, | 136 FROM_HERE, |
| 137 NewRunnableMethod(this, &TransportTextureHost::SendDestroyInternal)); | 137 base::Bind(&TransportTextureHost::SendDestroyInternal, this)); |
| 138 return; | 138 return; |
| 139 } | 139 } |
| 140 | 140 |
| 141 bool ret = sender_->Send(new GpuTransportTextureMsg_Destroy(peer_id_)); | 141 bool ret = sender_->Send(new GpuTransportTextureMsg_Destroy(peer_id_)); |
| 142 if (!ret) { | 142 if (!ret) { |
| 143 LOG(ERROR) << "GpuTransportTextureMsg_Destroy failed"; | 143 LOG(ERROR) << "GpuTransportTextureMsg_Destroy failed"; |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 | 146 |
| 147 void TransportTextureHost::OnTransportTextureCreated(int32 peer_id) { | 147 void TransportTextureHost::OnTransportTextureCreated(int32 peer_id) { |
| 148 DCHECK_EQ(io_message_loop_, MessageLoop::current()); | 148 DCHECK_EQ(io_message_loop_, MessageLoop::current()); |
| 149 | 149 |
| 150 peer_id_ = peer_id; | 150 peer_id_ = peer_id; |
| 151 init_task_->Run(); | 151 init_task_->Run(); |
| 152 init_task_.reset(); | 152 init_task_.reset(); |
| 153 } | 153 } |
| 154 | 154 |
| 155 void TransportTextureHost::OnCreateTextures(int32 n, uint32 width, | 155 void TransportTextureHost::OnCreateTextures(int32 n, uint32 width, |
| 156 uint32 height, int32 format) { | 156 uint32 height, int32 format) { |
| 157 if (MessageLoop::current() != render_message_loop_) { | 157 if (MessageLoop::current() != render_message_loop_) { |
| 158 render_message_loop_->PostTask( | 158 render_message_loop_->PostTask( |
| 159 FROM_HERE, | 159 FROM_HERE, |
| 160 NewRunnableMethod(this, &TransportTextureHost::OnCreateTextures, | 160 base::Bind(&TransportTextureHost::OnCreateTextures, this, n, width, |
| 161 n, width, height, format)); | 161 height, format)); |
| 162 return; | 162 return; |
| 163 } | 163 } |
| 164 | 164 |
| 165 // In this method we need to make the ggl context current and then generate | 165 // In this method we need to make the ggl context current and then generate |
| 166 // textures for each video frame. We also need to allocate memory for each | 166 // textures for each video frame. We also need to allocate memory for each |
| 167 // texture generated. | 167 // texture generated. |
| 168 bool ret = RendererGLContext::MakeCurrent(context_); | 168 bool ret = RendererGLContext::MakeCurrent(context_); |
| 169 CHECK(ret) << "Failed to switch context"; | 169 CHECK(ret) << "Failed to switch context"; |
| 170 | 170 |
| 171 // TODO(hclam): Should do this through TextureManager instead of generating | 171 // TODO(hclam): Should do this through TextureManager instead of generating |
| (...skipping 13 matching lines...) Expand all Loading... |
| 185 // This method will switch thread properly so just call it directly. | 185 // This method will switch thread properly so just call it directly. |
| 186 ReleaseTexturesInternal(); | 186 ReleaseTexturesInternal(); |
| 187 } | 187 } |
| 188 | 188 |
| 189 void TransportTextureHost::OnTextureUpdated(int texture_id) { | 189 void TransportTextureHost::OnTextureUpdated(int texture_id) { |
| 190 if (update_callback_.get()) | 190 if (update_callback_.get()) |
| 191 update_callback_->Run(texture_id); | 191 update_callback_->Run(texture_id); |
| 192 } | 192 } |
| 193 | 193 |
| 194 #endif | 194 #endif |
| OLD | NEW |