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

Side by Side Diff: ui/accelerated_widget_mac/io_surface_texture.mm

Issue 1161853006: Mac: Add partial swap support to NSOpenGLContext path (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporate review feedback Created 5 years, 6 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
« no previous file with comments | « ui/accelerated_widget_mac/io_surface_texture.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/accelerated_widget_mac/io_surface_texture.h" 5 #include "ui/accelerated_widget_mac/io_surface_texture.h"
6 6
7 #include <OpenGL/CGLIOSurface.h> 7 #include <OpenGL/CGLIOSurface.h>
8 #include <OpenGL/CGLRenderers.h> 8 #include <OpenGL/CGLRenderers.h>
9 #include <OpenGL/gl.h> 9 #include <OpenGL/gl.h>
10 #include <OpenGL/OpenGL.h> 10 #include <OpenGL/OpenGL.h>
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 needs_gl_finish_workaround_(needs_gl_finish_workaround) { 56 needs_gl_finish_workaround_(needs_gl_finish_workaround) {
57 } 57 }
58 58
59 IOSurfaceTexture::~IOSurfaceTexture() { 59 IOSurfaceTexture::~IOSurfaceTexture() {
60 ReleaseIOSurfaceAndTexture(); 60 ReleaseIOSurfaceAndTexture();
61 offscreen_context_ = NULL; 61 offscreen_context_ = NULL;
62 DCHECK(eviction_queue_iterator_ == eviction_queue_.Get().end()); 62 DCHECK(eviction_queue_iterator_ == eviction_queue_.Get().end());
63 } 63 }
64 64
65 bool IOSurfaceTexture::DrawIOSurface() { 65 bool IOSurfaceTexture::DrawIOSurface() {
66 TRACE_EVENT0("browser", "IOSurfaceTexture::DrawIOSurface"); 66 return DrawIOSurfaceInternal(gfx::Rect(pixel_size_), true);
67 }
68
69 bool IOSurfaceTexture::DrawIOSurfaceWithDamageRect(gfx::Rect damage_rect) {
70 return DrawIOSurfaceInternal(damage_rect, false);
71 }
72
73 bool IOSurfaceTexture::DrawIOSurfaceInternal(
74 gfx::Rect damage_rect, bool draw_boundary) {
75 TRACE_EVENT0("browser", "IOSurfaceTexture::DrawIOSurfaceInternal");
67 DCHECK(CGLGetCurrentContext()); 76 DCHECK(CGLGetCurrentContext());
68 77
69 // If we have release the IOSurface, clear the screen to light grey and 78 // If we have release the IOSurface, clear the screen to light grey and
70 // early-out. 79 // early-out.
71 if (!io_surface_) { 80 if (!io_surface_) {
72 glClearColor(0.9, 0.9, 0.9, 1); 81 glClearColor(0.9, 0.9, 0.9, 1);
73 glClear(GL_COLOR_BUFFER_BIT); 82 glClear(GL_COLOR_BUFFER_BIT);
74 return false; 83 return false;
75 } 84 }
76 85
(...skipping 10 matching lines...) Expand all
87 pixel_size_.height() - viewport_rect.height(), pixel_size_.height(), 96 pixel_size_.height() - viewport_rect.height(), pixel_size_.height(),
88 -1, 1); 97 -1, 1);
89 glMatrixMode(GL_MODELVIEW); 98 glMatrixMode(GL_MODELVIEW);
90 glLoadIdentity(); 99 glLoadIdentity();
91 100
92 // Draw a quad the size of the IOSurface. This should cover the full viewport. 101 // Draw a quad the size of the IOSurface. This should cover the full viewport.
93 glColor4f(1, 1, 1, 1); 102 glColor4f(1, 1, 1, 1);
94 glEnable(GL_TEXTURE_RECTANGLE_ARB); 103 glEnable(GL_TEXTURE_RECTANGLE_ARB);
95 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_); 104 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_);
96 glBegin(GL_QUADS); 105 glBegin(GL_QUADS);
97 glTexCoord2f(0, 0); 106 glTexCoord2f(damage_rect.x(), damage_rect.y());
98 glVertex2f(0, 0); 107 glVertex2f(damage_rect.x(), damage_rect.y());
99 glTexCoord2f(pixel_size_.width(), 0); 108 glTexCoord2f(damage_rect.right(), damage_rect.y());
100 glVertex2f(pixel_size_.width(), 0); 109 glVertex2f(damage_rect.right(), damage_rect.y());
101 glTexCoord2f(pixel_size_.width(), pixel_size_.height()); 110 glTexCoord2f(damage_rect.right(), damage_rect.bottom());
102 glVertex2f(pixel_size_.width(), pixel_size_.height()); 111 glVertex2f(damage_rect.right(), damage_rect.bottom());
103 glTexCoord2f(0, pixel_size_.height()); 112 glTexCoord2f(damage_rect.x(), damage_rect.bottom());
104 glVertex2f(0, pixel_size_.height()); 113 glVertex2f(damage_rect.x(), damage_rect.bottom());
105 glEnd(); 114 glEnd();
106 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); 115 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
107 glDisable(GL_TEXTURE_RECTANGLE_ARB); 116 glDisable(GL_TEXTURE_RECTANGLE_ARB);
108 117
109 // Workaround for issue 158469. Issue a dummy draw call with texture_ not 118 // Workaround for issue 158469. Issue a dummy draw call with texture_ not
110 // bound to a texture, in order to shake all references to the IOSurface out 119 // bound to a texture, in order to shake all references to the IOSurface out
111 // of the driver. 120 // of the driver.
112 glBegin(GL_TRIANGLES); 121 glBegin(GL_TRIANGLES);
113 glEnd(); 122 glEnd();
114 123
124 // If the viewport is larger than the texture, clear out the overflow to
125 // white.
126 if (draw_boundary) {
127 if (pixel_size_.width() < viewport_rect.width()) {
128 glBegin(GL_QUADS);
129 glVertex2f(pixel_size_.width(), 0);
130 glVertex2f(pixel_size_.width(), viewport_rect.height());
131 glVertex2f(viewport_rect.width(), viewport_rect.height());
132 glVertex2f(viewport_rect.width(), 0);
133 glEnd();
134 }
135 if (pixel_size_.height() < viewport_rect.height()) {
136 int non_surface_height = viewport_rect.height() - pixel_size_.height();
137 glBegin(GL_QUADS);
138 glVertex2f(0, 0);
139 glVertex2f(0, non_surface_height);
140 glVertex2f(pixel_size_.width(), non_surface_height);
141 glVertex2f(pixel_size_.width(), 0);
142 glEnd();
143 }
144 }
145
115 if (needs_gl_finish_workaround_) { 146 if (needs_gl_finish_workaround_) {
116 TRACE_EVENT0("gpu", "glFinish"); 147 TRACE_EVENT0("gpu", "glFinish");
117 glFinish(); 148 glFinish();
118 } 149 }
119 150
120 // Check if any of the drawing calls result in an error. 151 // Check if any of the drawing calls result in an error.
121 GetAndSaveGLError(); 152 GetAndSaveGLError();
122 bool result = true; 153 bool result = true;
123 if (gl_error_ != GL_NO_ERROR) { 154 if (gl_error_ != GL_NO_ERROR) {
124 LOG(ERROR) << "GL error in DrawIOSurface: " << gl_error_; 155 LOG(ERROR) << "GL error in DrawIOSurface: " << gl_error_;
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 } 336 }
306 337
307 // static 338 // static
308 base::LazyInstance<IOSurfaceTexture::EvictionQueue> 339 base::LazyInstance<IOSurfaceTexture::EvictionQueue>
309 IOSurfaceTexture::eviction_queue_; 340 IOSurfaceTexture::eviction_queue_;
310 341
311 // static 342 // static
312 bool IOSurfaceTexture::eviction_scheduled_ = false; 343 bool IOSurfaceTexture::eviction_scheduled_ = false;
313 344
314 } // namespace ui 345 } // namespace ui
OLDNEW
« no previous file with comments | « ui/accelerated_widget_mac/io_surface_texture.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698