| 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/compositor/io_surface_texture_mac.h" | 5 #include "content/browser/compositor/io_surface_texture_mac.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/OpenGL.h> | 9 #include <OpenGL/OpenGL.h> |
| 10 #include <OpenGL/gl.h> | 10 #include <OpenGL/gl.h> |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "content/browser/renderer_host/render_widget_host_view_mac.h" | 22 #include "content/browser/renderer_host/render_widget_host_view_mac.h" |
| 23 #include "content/common/content_constants_internal.h" | 23 #include "content/common/content_constants_internal.h" |
| 24 #include "gpu/config/gpu_driver_bug_workaround_type.h" | 24 #include "gpu/config/gpu_driver_bug_workaround_type.h" |
| 25 #include "media/base/video_util.h" | 25 #include "media/base/video_util.h" |
| 26 #include "third_party/skia/include/core/SkBitmap.h" | 26 #include "third_party/skia/include/core/SkBitmap.h" |
| 27 #include "ui/gfx/rect.h" | 27 #include "ui/gfx/rect.h" |
| 28 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" | 28 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
| 29 #include "ui/gfx/size_conversions.h" | 29 #include "ui/gfx/size_conversions.h" |
| 30 #include "ui/gl/gl_context.h" | 30 #include "ui/gl/gl_context.h" |
| 31 | 31 |
| 32 #ifdef NDEBUG | |
| 33 #define CHECK_GL_ERROR() | |
| 34 #define CHECK_AND_SAVE_GL_ERROR() | |
| 35 #else | |
| 36 #define CHECK_GL_ERROR() do { \ | |
| 37 GLenum gl_error = glGetError(); \ | |
| 38 LOG_IF(ERROR, gl_error != GL_NO_ERROR) << "GL Error: " << gl_error; \ | |
| 39 } while (0) | |
| 40 #define CHECK_AND_SAVE_GL_ERROR() do { \ | |
| 41 GLenum gl_error = GetAndSaveGLError(); \ | |
| 42 LOG_IF(ERROR, gl_error != GL_NO_ERROR) << "GL Error: " << gl_error; \ | |
| 43 } while (0) | |
| 44 #endif | |
| 45 | |
| 46 namespace content { | 32 namespace content { |
| 47 | 33 |
| 48 // static | 34 // static |
| 49 scoped_refptr<IOSurfaceTexture> IOSurfaceTexture::Create() { | 35 scoped_refptr<IOSurfaceTexture> IOSurfaceTexture::Create() { |
| 50 scoped_refptr<IOSurfaceContext> offscreen_context = | 36 scoped_refptr<IOSurfaceContext> offscreen_context = |
| 51 IOSurfaceContext::Get( | 37 IOSurfaceContext::Get( |
| 52 IOSurfaceContext::kOffscreenContext); | 38 IOSurfaceContext::kOffscreenContext); |
| 53 if (!offscreen_context.get()) { | 39 if (!offscreen_context.get()) { |
| 54 LOG(ERROR) << "Failed to create context for offscreen operations"; | 40 LOG(ERROR) << "Failed to create context for offscreen operations"; |
| 55 return NULL; | 41 return NULL; |
| 56 } | 42 } |
| 57 | 43 |
| 58 return new IOSurfaceTexture(offscreen_context); | 44 return new IOSurfaceTexture(offscreen_context); |
| 59 } | 45 } |
| 60 | 46 |
| 61 IOSurfaceTexture::IOSurfaceTexture( | 47 IOSurfaceTexture::IOSurfaceTexture( |
| 62 const scoped_refptr<IOSurfaceContext>& offscreen_context) | 48 const scoped_refptr<IOSurfaceContext>& offscreen_context) |
| 63 : offscreen_context_(offscreen_context), | 49 : offscreen_context_(offscreen_context), |
| 64 io_surface_handle_(0), | |
| 65 scale_factor_(1.f), | |
| 66 texture_(0), | 50 texture_(0), |
| 67 gl_error_(GL_NO_ERROR), | 51 gl_error_(GL_NO_ERROR), |
| 68 eviction_queue_iterator_(eviction_queue_.Get().end()), | 52 eviction_queue_iterator_(eviction_queue_.Get().end()), |
| 69 eviction_has_been_drawn_since_updated_(false) { | 53 eviction_has_been_drawn_since_updated_(false) { |
| 70 CHECK(offscreen_context_.get()); | 54 CHECK(offscreen_context_.get()); |
| 71 } | 55 } |
| 72 | 56 |
| 73 IOSurfaceTexture::~IOSurfaceTexture() { | 57 IOSurfaceTexture::~IOSurfaceTexture() { |
| 74 { | 58 { |
| 75 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( | 59 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
| 76 offscreen_context_->cgl_context()); | 60 offscreen_context_->cgl_context()); |
| 77 UnrefIOSurfaceWithContextCurrent(); | 61 UnrefIOSurfaceWithContextCurrent(); |
| 78 } | 62 } |
| 79 offscreen_context_ = NULL; | 63 offscreen_context_ = NULL; |
| 80 DCHECK(eviction_queue_iterator_ == eviction_queue_.Get().end()); | 64 DCHECK(eviction_queue_iterator_ == eviction_queue_.Get().end()); |
| 81 } | 65 } |
| 82 | 66 |
| 83 bool IOSurfaceTexture::SetIOSurfaceWithContextCurrent( | |
| 84 scoped_refptr<IOSurfaceContext> current_context, | |
| 85 IOSurfaceID io_surface_handle, | |
| 86 const gfx::Size& size, | |
| 87 float scale_factor) { | |
| 88 bool result = MapIOSurfaceToTextureWithContextCurrent( | |
| 89 current_context, size, scale_factor, io_surface_handle); | |
| 90 EvictionMarkUpdated(); | |
| 91 return result; | |
| 92 } | |
| 93 | |
| 94 int IOSurfaceTexture::GetRendererID() { | 67 int IOSurfaceTexture::GetRendererID() { |
| 95 GLint current_renderer_id = -1; | 68 GLint current_renderer_id = -1; |
| 96 if (CGLGetParameter(offscreen_context_->cgl_context(), | 69 if (CGLGetParameter(offscreen_context_->cgl_context(), |
| 97 kCGLCPCurrentRendererID, | 70 kCGLCPCurrentRendererID, |
| 98 ¤t_renderer_id) == kCGLNoError) | 71 ¤t_renderer_id) == kCGLNoError) |
| 99 return current_renderer_id & kCGLRendererIDMatchingMask; | 72 return current_renderer_id & kCGLRendererIDMatchingMask; |
| 100 return -1; | 73 return -1; |
| 101 } | 74 } |
| 102 | 75 |
| 103 bool IOSurfaceTexture::DrawIOSurface( | 76 bool IOSurfaceTexture::DrawIOSurface() { |
| 104 scoped_refptr<IOSurfaceContext> drawing_context, | 77 TRACE_EVENT0("browser", "IOSurfaceTexture::DrawIOSurface"); |
| 105 const gfx::Rect& window_rect, | 78 DCHECK(HasIOSurface()); |
| 106 float window_scale_factor) { | |
| 107 DCHECK_EQ(CGLGetCurrentContext(), drawing_context->cgl_context()); | |
| 108 | 79 |
| 109 bool has_io_surface = HasIOSurface(); | 80 // The viewport is the size of the CALayer, which should always match the |
| 110 TRACE_EVENT1("browser", "IOSurfaceTexture::DrawIOSurface", | 81 // IOSurface pixel size. |
| 111 "has_io_surface", has_io_surface); | 82 GLint viewport[4]; |
| 83 glGetIntegerv(GL_VIEWPORT, viewport); |
| 84 gfx::Rect viewport_rect(viewport[0], viewport[1], viewport[2], viewport[3]); |
| 85 DCHECK_EQ(pixel_size_.ToString(), viewport_rect.size().ToString()); |
| 112 | 86 |
| 113 gfx::Rect pixel_window_rect = | 87 // Set the projection matrix to match 1 unit to 1 pixel. |
| 114 ToNearestRect(gfx::ScaleRect(window_rect, window_scale_factor)); | |
| 115 glViewport( | |
| 116 pixel_window_rect.x(), pixel_window_rect.y(), | |
| 117 pixel_window_rect.width(), pixel_window_rect.height()); | |
| 118 | |
| 119 SurfaceQuad quad; | |
| 120 quad.set_size(dip_io_surface_size_, pixel_io_surface_size_); | |
| 121 | |
| 122 glMatrixMode(GL_PROJECTION); | 88 glMatrixMode(GL_PROJECTION); |
| 123 glLoadIdentity(); | 89 glLoadIdentity(); |
| 124 | 90 glOrtho(0, viewport_rect.width(), 0, viewport_rect.height(), -1, 1); |
| 125 // Note that the projection keeps things in view units, so the use of | |
| 126 // window_rect / dip_io_surface_size_ (as opposed to the pixel_ variants) | |
| 127 // below is correct. | |
| 128 glOrtho(0, window_rect.width(), window_rect.height(), 0, -1, 1); | |
| 129 glMatrixMode(GL_MODELVIEW); | 91 glMatrixMode(GL_MODELVIEW); |
| 130 glLoadIdentity(); | 92 glLoadIdentity(); |
| 131 | 93 |
| 132 glDisable(GL_DEPTH_TEST); | 94 // Draw a quad the size of the IOSurface. This should cover the full viewport. |
| 133 glDisable(GL_BLEND); | 95 glColor4f(1, 1, 1, 1); |
| 96 glEnable(GL_TEXTURE_RECTANGLE_ARB); |
| 97 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_); |
| 98 glBegin(GL_QUADS); |
| 99 glTexCoord2f(0, 0); |
| 100 glVertex2f(0, 0); |
| 101 glTexCoord2f(pixel_size_.width(), 0); |
| 102 glVertex2f(pixel_size_.width(), 0); |
| 103 glTexCoord2f(pixel_size_.width(), pixel_size_.height()); |
| 104 glVertex2f(pixel_size_.width(), pixel_size_.height()); |
| 105 glTexCoord2f(0, pixel_size_.height()); |
| 106 glVertex2f(0, pixel_size_.height()); |
| 107 glEnd(); |
| 108 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); |
| 109 glDisable(GL_TEXTURE_RECTANGLE_ARB); |
| 134 | 110 |
| 135 glColor4f(1, 1, 1, 1); | 111 // Workaround for issue 158469. Issue a dummy draw call with texture_ not |
| 136 if (has_io_surface) { | 112 // bound to a texture, in order to shake all references to the IOSurface out |
| 137 glEnable(GL_TEXTURE_RECTANGLE_ARB); | 113 // of the driver. |
| 138 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_); | 114 glBegin(GL_TRIANGLES); |
| 139 DrawQuad(quad); | 115 glEnd(); |
| 140 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); | |
| 141 glDisable(GL_TEXTURE_RECTANGLE_ARB); | |
| 142 CHECK_AND_SAVE_GL_ERROR(); | |
| 143 | |
| 144 // Fill the resize gutters with white. | |
| 145 if (window_rect.width() > dip_io_surface_size_.width() || | |
| 146 window_rect.height() > dip_io_surface_size_.height()) { | |
| 147 SurfaceQuad filler_quad; | |
| 148 if (window_rect.width() > dip_io_surface_size_.width()) { | |
| 149 // Draw right-side gutter down to the bottom of the window. | |
| 150 filler_quad.set_rect(dip_io_surface_size_.width(), 0.0f, | |
| 151 window_rect.width(), window_rect.height()); | |
| 152 DrawQuad(filler_quad); | |
| 153 } | |
| 154 if (window_rect.height() > dip_io_surface_size_.height()) { | |
| 155 // Draw bottom gutter to the width of the IOSurfaceTexture. | |
| 156 filler_quad.set_rect( | |
| 157 0.0f, dip_io_surface_size_.height(), | |
| 158 dip_io_surface_size_.width(), window_rect.height()); | |
| 159 DrawQuad(filler_quad); | |
| 160 } | |
| 161 } | |
| 162 | |
| 163 // Workaround for issue 158469. Issue a dummy draw call with texture_ not | |
| 164 // bound to a texture, in order to shake all references to the IOSurface out | |
| 165 // of the driver. | |
| 166 glBegin(GL_TRIANGLES); | |
| 167 glEnd(); | |
| 168 CHECK_AND_SAVE_GL_ERROR(); | |
| 169 } else { | |
| 170 // Should match the clear color of RenderWidgetHostViewMac. | |
| 171 glClearColor(1.0f, 1.0f, 1.0f, 1.0f); | |
| 172 glClear(GL_COLOR_BUFFER_BIT); | |
| 173 } | |
| 174 | 116 |
| 175 bool workaround_needed = | 117 bool workaround_needed = |
| 176 GpuDataManagerImpl::GetInstance()->IsDriverBugWorkaroundActive( | 118 GpuDataManagerImpl::GetInstance()->IsDriverBugWorkaroundActive( |
| 177 gpu::FORCE_GL_FINISH_AFTER_COMPOSITING); | 119 gpu::FORCE_GL_FINISH_AFTER_COMPOSITING); |
| 178 if (workaround_needed) { | 120 if (workaround_needed) { |
| 179 TRACE_EVENT0("gpu", "glFinish"); | 121 TRACE_EVENT0("gpu", "glFinish"); |
| 180 glFinish(); | 122 glFinish(); |
| 181 } | 123 } |
| 182 | 124 |
| 183 // Check if any of the drawing calls result in an error. | 125 // Check if any of the drawing calls result in an error. |
| 184 GetAndSaveGLError(); | 126 GetAndSaveGLError(); |
| 185 bool result = true; | 127 bool result = true; |
| 186 if (gl_error_ != GL_NO_ERROR) { | 128 if (gl_error_ != GL_NO_ERROR) { |
| 187 LOG(ERROR) << "GL error in DrawIOSurface: " << gl_error_; | 129 LOG(ERROR) << "GL error in DrawIOSurface: " << gl_error_; |
| 188 result = false; | 130 result = false; |
| 189 // If there was an error, clear the screen to a light grey to avoid | 131 // If there was an error, clear the screen to a light grey to avoid |
| 190 // rendering artifacts. If we're in a really bad way, this too may | 132 // rendering artifacts. |
| 191 // generate an error. Clear the GL error afterwards just in case. | |
| 192 glClearColor(0.8, 0.8, 0.8, 1.0); | 133 glClearColor(0.8, 0.8, 0.8, 1.0); |
| 193 glClear(GL_COLOR_BUFFER_BIT); | 134 glClear(GL_COLOR_BUFFER_BIT); |
| 194 glGetError(); | |
| 195 } | 135 } |
| 196 | 136 |
| 197 eviction_has_been_drawn_since_updated_ = true; | 137 eviction_has_been_drawn_since_updated_ = true; |
| 198 return result; | 138 return result; |
| 199 } | 139 } |
| 200 | 140 |
| 201 bool IOSurfaceTexture::MapIOSurfaceToTextureWithContextCurrent( | 141 bool IOSurfaceTexture::SetIOSurface( |
| 202 const scoped_refptr<IOSurfaceContext>& current_context, | 142 scoped_refptr<IOSurfaceContext> context, |
| 203 const gfx::Size pixel_size, | 143 IOSurfaceID io_surface_id, |
| 204 float scale_factor, | 144 const gfx::Size& pixel_size) { |
| 205 IOSurfaceID io_surface_handle) { | |
| 206 TRACE_EVENT0("browser", "IOSurfaceTexture::MapIOSurfaceToTexture"); | 145 TRACE_EVENT0("browser", "IOSurfaceTexture::MapIOSurfaceToTexture"); |
| 207 | 146 |
| 208 if (!io_surface_ || io_surface_handle != io_surface_handle_) | 147 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
| 148 context->cgl_context()); |
| 149 |
| 150 // Destroy the old IOSurface and texture if it is no longer needed. |
| 151 bool needs_new_iosurface = |
| 152 !io_surface_ || io_surface_id != IOSurfaceGetID(io_surface_); |
| 153 if (needs_new_iosurface) |
| 209 UnrefIOSurfaceWithContextCurrent(); | 154 UnrefIOSurfaceWithContextCurrent(); |
| 210 | 155 |
| 211 pixel_io_surface_size_ = pixel_size; | 156 // Note that because IOSurface sizes are rounded, the same IOSurface may have |
| 212 scale_factor_ = scale_factor; | 157 // two different sizes associated with it, so update the sizes before the |
| 213 dip_io_surface_size_ = gfx::ToFlooredSize( | 158 // early-out. |
| 214 gfx::ScaleSize(pixel_io_surface_size_, 1.0 / scale_factor_)); | 159 pixel_size_ = pixel_size; |
| 215 | 160 |
| 216 // Early-out if the IOSurface has not changed. Note that because IOSurface | 161 // Early-out if the IOSurface has not changed. |
| 217 // sizes are rounded, the same IOSurface may have two different sizes | 162 if (!needs_new_iosurface) |
| 218 // associated with it. | |
| 219 if (io_surface_ && io_surface_handle == io_surface_handle_) | |
| 220 return true; | 163 return true; |
| 221 | 164 |
| 222 io_surface_.reset(IOSurfaceLookup(io_surface_handle)); | 165 // Open the IOSurface handle. |
| 223 // Can fail if IOSurface with that ID was already released by the gpu | 166 io_surface_.reset(IOSurfaceLookup(io_surface_id)); |
| 224 // process. | |
| 225 if (!io_surface_) { | 167 if (!io_surface_) { |
| 226 UnrefIOSurfaceWithContextCurrent(); | 168 UnrefIOSurfaceWithContextCurrent(); |
| 227 return false; | 169 return false; |
| 228 } | 170 } |
| 229 | 171 |
| 230 io_surface_handle_ = io_surface_handle; | |
| 231 | |
| 232 // Actual IOSurface size is rounded up to reduce reallocations during window | 172 // Actual IOSurface size is rounded up to reduce reallocations during window |
| 233 // resize. Get the actual size to properly map the texture. | 173 // resize. Get the actual size to properly map the texture. |
| 234 gfx::Size rounded_size(IOSurfaceGetWidth(io_surface_), | 174 gfx::Size rounded_size(IOSurfaceGetWidth(io_surface_), |
| 235 IOSurfaceGetHeight(io_surface_)); | 175 IOSurfaceGetHeight(io_surface_)); |
| 236 | 176 |
| 177 // Create the GL texture and set it to be backed by the IOSurface. |
| 237 glGenTextures(1, &texture_); | 178 glGenTextures(1, &texture_); |
| 238 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_); | 179 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_); |
| 239 glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 180 glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 240 glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 181 glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 241 CHECK_AND_SAVE_GL_ERROR(); | |
| 242 GLuint plane = 0; | 182 GLuint plane = 0; |
| 243 CGLError cgl_error = CGLTexImageIOSurface2D( | 183 CGLError cgl_error = CGLTexImageIOSurface2D( |
| 244 current_context->cgl_context(), | 184 context->cgl_context(), |
| 245 GL_TEXTURE_RECTANGLE_ARB, | 185 GL_TEXTURE_RECTANGLE_ARB, |
| 246 GL_RGBA, | 186 GL_RGBA, |
| 247 rounded_size.width(), | 187 rounded_size.width(), |
| 248 rounded_size.height(), | 188 rounded_size.height(), |
| 249 GL_BGRA, | 189 GL_BGRA, |
| 250 GL_UNSIGNED_INT_8_8_8_8_REV, | 190 GL_UNSIGNED_INT_8_8_8_8_REV, |
| 251 io_surface_.get(), | 191 io_surface_.get(), |
| 252 plane); | 192 plane); |
| 253 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); | 193 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); |
| 194 GetAndSaveGLError(); |
| 195 |
| 196 // Return failure if an error was encountered by CGL or GL. |
| 254 if (cgl_error != kCGLNoError) { | 197 if (cgl_error != kCGLNoError) { |
| 255 LOG(ERROR) << "CGLTexImageIOSurface2D: " << cgl_error; | 198 LOG(ERROR) << "CGLTexImageIOSurface2D failed with CGL error: " << cgl_error; |
| 256 UnrefIOSurfaceWithContextCurrent(); | 199 UnrefIOSurfaceWithContextCurrent(); |
| 257 return false; | 200 return false; |
| 258 } | 201 } |
| 259 GetAndSaveGLError(); | |
| 260 if (gl_error_ != GL_NO_ERROR) { | 202 if (gl_error_ != GL_NO_ERROR) { |
| 261 LOG(ERROR) << "GL error in MapIOSurfaceToTexture: " << gl_error_; | 203 LOG(ERROR) << "Hit GL error in SetIOSurface: " << gl_error_; |
| 262 UnrefIOSurfaceWithContextCurrent(); | 204 UnrefIOSurfaceWithContextCurrent(); |
| 263 return false; | 205 return false; |
| 264 } | 206 } |
| 207 |
| 265 return true; | 208 return true; |
| 266 } | 209 } |
| 267 | 210 |
| 268 void IOSurfaceTexture::UnrefIOSurface() { | 211 void IOSurfaceTexture::UnrefIOSurface() { |
| 269 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( | 212 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
| 270 offscreen_context_->cgl_context()); | 213 offscreen_context_->cgl_context()); |
| 271 UnrefIOSurfaceWithContextCurrent(); | 214 UnrefIOSurfaceWithContextCurrent(); |
| 272 } | 215 } |
| 273 | 216 |
| 274 void IOSurfaceTexture::DrawQuad(const SurfaceQuad& quad) { | |
| 275 TRACE_EVENT0("gpu", "IOSurfaceTexture::DrawQuad"); | |
| 276 | |
| 277 glEnableClientState(GL_VERTEX_ARRAY); CHECK_AND_SAVE_GL_ERROR(); | |
| 278 glEnableClientState(GL_TEXTURE_COORD_ARRAY); CHECK_AND_SAVE_GL_ERROR(); | |
| 279 | |
| 280 glVertexPointer(2, GL_FLOAT, sizeof(SurfaceVertex), &quad.verts_[0].x_); | |
| 281 glTexCoordPointer(2, GL_FLOAT, sizeof(SurfaceVertex), &quad.verts_[0].tx_); | |
| 282 glDrawArrays(GL_QUADS, 0, 4); CHECK_AND_SAVE_GL_ERROR(); | |
| 283 | |
| 284 glDisableClientState(GL_VERTEX_ARRAY); | |
| 285 glDisableClientState(GL_TEXTURE_COORD_ARRAY); | |
| 286 } | |
| 287 | |
| 288 void IOSurfaceTexture::UnrefIOSurfaceWithContextCurrent() { | 217 void IOSurfaceTexture::UnrefIOSurfaceWithContextCurrent() { |
| 289 if (texture_) { | 218 if (texture_) { |
| 290 glDeleteTextures(1, &texture_); | 219 glDeleteTextures(1, &texture_); |
| 291 texture_ = 0; | 220 texture_ = 0; |
| 292 } | 221 } |
| 293 pixel_io_surface_size_ = gfx::Size(); | 222 pixel_size_ = gfx::Size(); |
| 294 scale_factor_ = 1; | |
| 295 dip_io_surface_size_ = gfx::Size(); | |
| 296 io_surface_.reset(); | 223 io_surface_.reset(); |
| 297 | 224 |
| 298 // Forget the ID, because even if it is still around when we want to use it | |
| 299 // again, OSX may have reused the same ID for a new tab and we don't want to | |
| 300 // blit random tab contents. | |
| 301 io_surface_handle_ = 0; | |
| 302 | |
| 303 EvictionMarkEvicted(); | 225 EvictionMarkEvicted(); |
| 304 } | 226 } |
| 305 | 227 |
| 306 bool IOSurfaceTexture::HasBeenPoisoned() const { | 228 bool IOSurfaceTexture::HasBeenPoisoned() const { |
| 307 return offscreen_context_->HasBeenPoisoned(); | 229 return offscreen_context_->HasBeenPoisoned(); |
| 308 } | 230 } |
| 309 | 231 |
| 310 GLenum IOSurfaceTexture::GetAndSaveGLError() { | 232 GLenum IOSurfaceTexture::GetAndSaveGLError() { |
| 311 GLenum gl_error = glGetError(); | 233 GLenum gl_error = glGetError(); |
| 312 if (gl_error_ == GL_NO_ERROR) | 234 if (gl_error_ == GL_NO_ERROR) |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 } | 290 } |
| 369 | 291 |
| 370 // static | 292 // static |
| 371 base::LazyInstance<IOSurfaceTexture::EvictionQueue> | 293 base::LazyInstance<IOSurfaceTexture::EvictionQueue> |
| 372 IOSurfaceTexture::eviction_queue_; | 294 IOSurfaceTexture::eviction_queue_; |
| 373 | 295 |
| 374 // static | 296 // static |
| 375 bool IOSurfaceTexture::eviction_scheduled_ = false; | 297 bool IOSurfaceTexture::eviction_scheduled_ = false; |
| 376 | 298 |
| 377 } // namespace content | 299 } // namespace content |
| OLD | NEW |