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 "content/browser/renderer_host/compositing_iosurface_mac.h" | 5 #include "content/browser/renderer_host/compositing_iosurface_mac.h" |
6 | 6 |
7 #include <OpenGL/CGLRenderers.h> | 7 #include <OpenGL/CGLRenderers.h> |
8 #include <OpenGL/OpenGL.h> | 8 #include <OpenGL/OpenGL.h> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
328 // Having two NSOpenGLContexts bound to an NSView concurrently will cause | 328 // Having two NSOpenGLContexts bound to an NSView concurrently will cause |
329 // artifacts and crashes. If |context_| is bound to |view|, then unbind | 329 // artifacts and crashes. If |context_| is bound to |view|, then unbind |
330 // |context_| before |new_context| gets bound to |view|. | 330 // |context_| before |new_context| gets bound to |view|. |
331 // http://crbug.com/230883 | 331 // http://crbug.com/230883 |
332 if ([context_->nsgl_context() view] == view) | 332 if ([context_->nsgl_context() view] == view) |
333 [context_->nsgl_context() clearDrawable]; | 333 [context_->nsgl_context() clearDrawable]; |
334 | 334 |
335 context_ = new_context; | 335 context_ = new_context; |
336 } | 336 } |
337 | 337 |
338 void CompositingIOSurfaceMac::SetDeviceScaleFactor(float scale_factor) { | |
339 // TODO: After a resolution change, the DPI-ness of the view and the | |
340 // IOSurface might not be in sync. | |
341 io_surface_size_ = gfx::ToFlooredSize( | |
342 gfx::ScaleSize(pixel_io_surface_size_, 1.0 / scale_factor)); | |
343 } | |
344 | |
345 bool CompositingIOSurfaceMac::is_vsync_disabled() const { | 338 bool CompositingIOSurfaceMac::is_vsync_disabled() const { |
346 return context_->is_vsync_disabled(); | 339 return context_->is_vsync_disabled(); |
347 } | 340 } |
348 | 341 |
349 void CompositingIOSurfaceMac::GetVSyncParameters(base::TimeTicks* timebase, | 342 void CompositingIOSurfaceMac::GetVSyncParameters(base::TimeTicks* timebase, |
350 uint32* interval_numerator, | 343 uint32* interval_numerator, |
351 uint32* interval_denominator) { | 344 uint32* interval_denominator) { |
352 base::AutoLock lock(lock_); | 345 base::AutoLock lock(lock_); |
353 *timebase = vsync_timebase_; | 346 *timebase = vsync_timebase_; |
354 *interval_numerator = vsync_interval_numerator_; | 347 *interval_numerator = vsync_interval_numerator_; |
355 *interval_denominator = vsync_interval_denominator_; | 348 *interval_denominator = vsync_interval_denominator_; |
356 } | 349 } |
357 | 350 |
358 CompositingIOSurfaceMac::~CompositingIOSurfaceMac() { | 351 CompositingIOSurfaceMac::~CompositingIOSurfaceMac() { |
359 FailAllCopies(); | 352 FailAllCopies(); |
360 CVDisplayLinkRelease(display_link_); | 353 CVDisplayLinkRelease(display_link_); |
361 CGLSetCurrentContext(context_->cgl_context()); | 354 CGLSetCurrentContext(context_->cgl_context()); |
362 DestroyAllCopyContextsWithinContext(); | 355 DestroyAllCopyContextsWithinContext(); |
363 UnrefIOSurfaceWithContextCurrent(); | 356 UnrefIOSurfaceWithContextCurrent(); |
364 CGLSetCurrentContext(0); | 357 CGLSetCurrentContext(0); |
365 context_ = nil; | 358 context_ = nil; |
366 } | 359 } |
367 | 360 |
368 void CompositingIOSurfaceMac::SetIOSurface(uint64 io_surface_handle, | 361 void CompositingIOSurfaceMac::SetIOSurface(uint64 io_surface_handle, |
369 const gfx::Size& size) { | 362 const gfx::Size& size, |
363 float scale_factor) { | |
370 pixel_io_surface_size_ = size; | 364 pixel_io_surface_size_ = size; |
365 io_surface_size_ = gfx::ToFlooredSize( | |
366 gfx::ScaleSize(pixel_io_surface_size_, 1.0 / scale_factor)); | |
Nico
2013/05/22 15:33:22
Does this still have to be a member variable, or c
ccameron
2013/05/22 20:50:12
It's also used when checking HasAcceleratedSurface
| |
371 CGLSetCurrentContext(context_->cgl_context()); | 367 CGLSetCurrentContext(context_->cgl_context()); |
372 MapIOSurfaceToTexture(io_surface_handle); | 368 MapIOSurfaceToTexture(io_surface_handle); |
373 CGLSetCurrentContext(0); | 369 CGLSetCurrentContext(0); |
374 } | 370 } |
375 | 371 |
376 int CompositingIOSurfaceMac::GetRendererID() { | 372 int CompositingIOSurfaceMac::GetRendererID() { |
377 GLint current_renderer_id = -1; | 373 GLint current_renderer_id = -1; |
378 if (CGLGetParameter(context_->cgl_context(), | 374 if (CGLGetParameter(context_->cgl_context(), |
379 kCGLCPCurrentRendererID, | 375 kCGLCPCurrentRendererID, |
380 ¤t_renderer_id) == kCGLNoError) | 376 ¤t_renderer_id) == kCGLNoError) |
(...skipping 19 matching lines...) Expand all Loading... | |
400 | 396 |
401 TRACE_EVENT1("browser", "CompositingIOSurfaceMac::DrawIOSurface", | 397 TRACE_EVENT1("browser", "CompositingIOSurfaceMac::DrawIOSurface", |
402 "has_io_surface", has_io_surface); | 398 "has_io_surface", has_io_surface); |
403 | 399 |
404 [context_->nsgl_context() setView:view]; | 400 [context_->nsgl_context() setView:view]; |
405 gfx::Size window_size(NSSizeToCGSize([view frame].size)); | 401 gfx::Size window_size(NSSizeToCGSize([view frame].size)); |
406 gfx::Size pixel_window_size = gfx::ToFlooredSize( | 402 gfx::Size pixel_window_size = gfx::ToFlooredSize( |
407 gfx::ScaleSize(window_size, scale_factor)); | 403 gfx::ScaleSize(window_size, scale_factor)); |
408 glViewport(0, 0, pixel_window_size.width(), pixel_window_size.height()); | 404 glViewport(0, 0, pixel_window_size.width(), pixel_window_size.height()); |
409 | 405 |
410 SetDeviceScaleFactor(scale_factor); | |
411 | |
412 SurfaceQuad quad; | 406 SurfaceQuad quad; |
413 quad.set_size(io_surface_size_, pixel_io_surface_size_); | 407 quad.set_size(io_surface_size_, pixel_io_surface_size_); |
414 | 408 |
415 glMatrixMode(GL_PROJECTION); | 409 glMatrixMode(GL_PROJECTION); |
416 glLoadIdentity(); | 410 glLoadIdentity(); |
417 | 411 |
418 // Note that the projection keeps things in view units, so the use of | 412 // Note that the projection keeps things in view units, so the use of |
419 // window_size / io_surface_size_ (as opposed to the pixel_ variants) below is | 413 // window_size / io_surface_size_ (as opposed to the pixel_ variants) below is |
420 // correct. | 414 // correct. |
421 glOrtho(0, window_size.width(), window_size.height(), 0, -1, 1); | 415 glOrtho(0, window_size.width(), window_size.height(), 0, -1, 1); |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
610 } | 604 } |
611 | 605 |
612 io_surface_handle_ = io_surface_handle; | 606 io_surface_handle_ = io_surface_handle; |
613 | 607 |
614 // Actual IOSurface size is rounded up to reduce reallocations during window | 608 // Actual IOSurface size is rounded up to reduce reallocations during window |
615 // resize. Get the actual size to properly map the texture. | 609 // resize. Get the actual size to properly map the texture. |
616 gfx::Size rounded_size( | 610 gfx::Size rounded_size( |
617 io_surface_support_->IOSurfaceGetWidth(io_surface_), | 611 io_surface_support_->IOSurfaceGetWidth(io_surface_), |
618 io_surface_support_->IOSurfaceGetHeight(io_surface_)); | 612 io_surface_support_->IOSurfaceGetHeight(io_surface_)); |
619 | 613 |
620 // TODO(thakis): Keep track of the view size over IPC. At the moment, | |
621 // the correct view units are computed on first paint. | |
622 io_surface_size_ = pixel_io_surface_size_; | |
Nico
2013/05/22 15:33:22
\o/
| |
623 | |
624 GLenum target = GL_TEXTURE_RECTANGLE_ARB; | 614 GLenum target = GL_TEXTURE_RECTANGLE_ARB; |
625 glGenTextures(1, &texture_); | 615 glGenTextures(1, &texture_); |
626 glBindTexture(target, texture_); | 616 glBindTexture(target, texture_); |
627 glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 617 glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
628 glTexParameterf(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); CHECK_GL_ERROR(); | 618 glTexParameterf(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); CHECK_GL_ERROR(); |
629 GLuint plane = 0; | 619 GLuint plane = 0; |
630 CGLError cglerror = io_surface_support_->CGLTexImageIOSurface2D( | 620 CGLError cglerror = io_surface_support_->CGLTexImageIOSurface2D( |
631 context_->cgl_context(), | 621 context_->cgl_context(), |
632 target, | 622 target, |
633 GL_RGBA, | 623 GL_RGBA, |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1074 } | 1064 } |
1075 | 1065 |
1076 gfx::Rect CompositingIOSurfaceMac::IntersectWithIOSurface( | 1066 gfx::Rect CompositingIOSurfaceMac::IntersectWithIOSurface( |
1077 const gfx::Rect& rect, float scale_factor) const { | 1067 const gfx::Rect& rect, float scale_factor) const { |
1078 return gfx::IntersectRects(rect, | 1068 return gfx::IntersectRects(rect, |
1079 gfx::ToEnclosingRect(gfx::ScaleRect(gfx::Rect(io_surface_size_), | 1069 gfx::ToEnclosingRect(gfx::ScaleRect(gfx::Rect(io_surface_size_), |
1080 scale_factor))); | 1070 scale_factor))); |
1081 } | 1071 } |
1082 | 1072 |
1083 } // namespace content | 1073 } // namespace content |
OLD | NEW |