| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/gl/gl_surface_wgl.h" | 5 #include "ui/gl/gl_surface_wgl.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "ui/gl/gl_bindings.h" | 10 #include "ui/gl/gl_bindings.h" |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 initialized = true; | 169 initialized = true; |
| 170 return true; | 170 return true; |
| 171 } | 171 } |
| 172 | 172 |
| 173 HDC GLSurfaceWGL::GetDisplayDC() { | 173 HDC GLSurfaceWGL::GetDisplayDC() { |
| 174 return g_display->device_context(); | 174 return g_display->device_context(); |
| 175 } | 175 } |
| 176 | 176 |
| 177 NativeViewGLSurfaceWGL::NativeViewGLSurfaceWGL(gfx::AcceleratedWidget window) | 177 NativeViewGLSurfaceWGL::NativeViewGLSurfaceWGL(gfx::AcceleratedWidget window) |
| 178 : window_(window), | 178 : window_(window), |
| 179 child_window_(NULL), | |
| 180 device_context_(NULL) { | 179 device_context_(NULL) { |
| 181 DCHECK(window); | 180 DCHECK(window); |
| 182 } | 181 } |
| 183 | 182 |
| 184 NativeViewGLSurfaceWGL::~NativeViewGLSurfaceWGL() { | 183 NativeViewGLSurfaceWGL::~NativeViewGLSurfaceWGL() { |
| 185 Destroy(); | 184 Destroy(); |
| 186 } | 185 } |
| 187 | 186 |
| 188 bool NativeViewGLSurfaceWGL::Initialize() { | 187 bool NativeViewGLSurfaceWGL::Initialize() { |
| 189 DCHECK(!device_context_); | 188 DCHECK(!device_context_); |
| 190 | 189 |
| 191 RECT rect; | 190 DWORD process_id; |
| 192 if (!GetClientRect(window_, &rect)) { | 191 GetWindowThreadProcessId(window_, &process_id); |
| 193 LOG(ERROR) << "GetClientRect failed.\n"; | 192 if (process_id != GetCurrentProcessId()) { |
| 193 LOG(ERROR) << "Can't use window created in " << process_id |
| 194 << " with wgl in " << GetCurrentProcessId(); |
| 194 Destroy(); | 195 Destroy(); |
| 195 return false; | 196 return false; |
| 196 } | 197 } |
| 197 | 198 |
| 198 // Create a child window. WGL has problems using a window handle owned by | 199 device_context_ = GetDC(window_); |
| 199 // another process. | |
| 200 child_window_ = CreateWindow( | |
| 201 reinterpret_cast<wchar_t*>(g_display->window_class()), | |
| 202 L"", | |
| 203 WS_CHILDWINDOW | WS_DISABLED | WS_VISIBLE, | |
| 204 0, 0, | |
| 205 rect.right - rect.left, | |
| 206 rect.bottom - rect.top, | |
| 207 window_, | |
| 208 NULL, | |
| 209 NULL, | |
| 210 NULL); | |
| 211 if (!child_window_) { | |
| 212 LOG(ERROR) << "CreateWindow failed.\n"; | |
| 213 Destroy(); | |
| 214 return false; | |
| 215 } | |
| 216 | |
| 217 // The GL context will render to this window. | |
| 218 device_context_ = GetDC(child_window_); | |
| 219 if (!device_context_) { | 200 if (!device_context_) { |
| 220 LOG(ERROR) << "Unable to get device context for window."; | 201 LOG(ERROR) << "Unable to get device context for window."; |
| 221 Destroy(); | 202 Destroy(); |
| 222 return false; | 203 return false; |
| 223 } | 204 } |
| 224 | 205 |
| 225 if (!SetPixelFormat(device_context_, | 206 if (!SetPixelFormat(device_context_, |
| 226 g_display->pixel_format(), | 207 g_display->pixel_format(), |
| 227 &kPixelFormatDescriptor)) { | 208 &kPixelFormatDescriptor)) { |
| 228 LOG(ERROR) << "Unable to set the pixel format for GL context."; | 209 LOG(ERROR) << "Unable to set the pixel format for GL context."; |
| 229 Destroy(); | 210 Destroy(); |
| 230 return false; | 211 return false; |
| 231 } | 212 } |
| 232 | 213 |
| 233 return true; | 214 return true; |
| 234 } | 215 } |
| 235 | 216 |
| 236 void NativeViewGLSurfaceWGL::Destroy() { | 217 void NativeViewGLSurfaceWGL::Destroy() { |
| 237 if (child_window_ && device_context_) | 218 if (window_ && device_context_) |
| 238 ReleaseDC(child_window_, device_context_); | 219 ReleaseDC(window_, device_context_); |
| 239 | 220 |
| 240 if (child_window_) | |
| 241 DestroyWindow(child_window_); | |
| 242 | |
| 243 child_window_ = NULL; | |
| 244 device_context_ = NULL; | 221 device_context_ = NULL; |
| 245 } | 222 } |
| 246 | 223 |
| 247 bool NativeViewGLSurfaceWGL::IsOffscreen() { | 224 bool NativeViewGLSurfaceWGL::IsOffscreen() { |
| 248 return false; | 225 return false; |
| 249 } | 226 } |
| 250 | 227 |
| 251 bool NativeViewGLSurfaceWGL::SwapBuffers() { | 228 bool NativeViewGLSurfaceWGL::SwapBuffers() { |
| 252 TRACE_EVENT2("gpu", "NativeViewGLSurfaceWGL:RealSwapBuffers", | 229 TRACE_EVENT2("gpu", "NativeViewGLSurfaceWGL:RealSwapBuffers", |
| 253 "width", GetSize().width(), | 230 "width", GetSize().width(), |
| 254 "height", GetSize().height()); | 231 "height", GetSize().height()); |
| 255 | 232 |
| 256 // Resize the child window to match the parent before swapping. Do not repaint | |
| 257 // it as it moves. | |
| 258 RECT rect; | |
| 259 if (!GetClientRect(window_, &rect)) | |
| 260 return false; | |
| 261 if (!MoveWindow(child_window_, | |
| 262 0, 0, | |
| 263 rect.right - rect.left, | |
| 264 rect.bottom - rect.top, | |
| 265 FALSE)) { | |
| 266 return false; | |
| 267 } | |
| 268 | |
| 269 DCHECK(device_context_); | 233 DCHECK(device_context_); |
| 270 return ::SwapBuffers(device_context_) == TRUE; | 234 return ::SwapBuffers(device_context_) == TRUE; |
| 271 } | 235 } |
| 272 | 236 |
| 273 gfx::Size NativeViewGLSurfaceWGL::GetSize() { | 237 gfx::Size NativeViewGLSurfaceWGL::GetSize() { |
| 274 RECT rect; | 238 RECT rect; |
| 275 BOOL result = GetClientRect(child_window_, &rect); | 239 BOOL result = GetClientRect(window_, &rect); |
| 276 DCHECK(result); | 240 DCHECK(result); |
| 277 return gfx::Size(rect.right - rect.left, rect.bottom - rect.top); | 241 return gfx::Size(rect.right - rect.left, rect.bottom - rect.top); |
| 278 } | 242 } |
| 279 | 243 |
| 280 void* NativeViewGLSurfaceWGL::GetHandle() { | 244 void* NativeViewGLSurfaceWGL::GetHandle() { |
| 281 return device_context_; | 245 return device_context_; |
| 282 } | 246 } |
| 283 | 247 |
| 284 PbufferGLSurfaceWGL::PbufferGLSurfaceWGL(const gfx::Size& size) | 248 PbufferGLSurfaceWGL::PbufferGLSurfaceWGL(const gfx::Size& size) |
| 285 : size_(size), | 249 : size_(size), |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 | 313 |
| 350 gfx::Size PbufferGLSurfaceWGL::GetSize() { | 314 gfx::Size PbufferGLSurfaceWGL::GetSize() { |
| 351 return size_; | 315 return size_; |
| 352 } | 316 } |
| 353 | 317 |
| 354 void* PbufferGLSurfaceWGL::GetHandle() { | 318 void* PbufferGLSurfaceWGL::GetHandle() { |
| 355 return device_context_; | 319 return device_context_; |
| 356 } | 320 } |
| 357 | 321 |
| 358 } // namespace gfx | 322 } // namespace gfx |
| OLD | NEW |