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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp

Issue 1934363002: Improve robustness of lost context checks in Canvas2DLayerBridge (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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 | « no previous file | 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 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 { 194 {
195 // Need to flush skia's internal queue because texture is about to be access ed directly 195 // Need to flush skia's internal queue because texture is about to be access ed directly
196 GrContext* grContext = m_contextProvider->grContext(); 196 GrContext* grContext = m_contextProvider->grContext();
197 grContext->flush(); 197 grContext->flush();
198 198
199 ImageInfo imageInfo = createIOSurfaceBackedTexture(); 199 ImageInfo imageInfo = createIOSurfaceBackedTexture();
200 if (imageInfo.empty()) 200 if (imageInfo.empty())
201 return false; 201 return false;
202 202
203 gpu::gles2::GLES2Interface* gl = contextGL(); 203 gpu::gles2::GLES2Interface* gl = contextGL();
204 if (!gl)
205 return false;
206
204 GLuint imageTexture = skia::GrBackendObjectToGrGLTextureInfo(image->getTextu reHandle(true))->fID; 207 GLuint imageTexture = skia::GrBackendObjectToGrGLTextureInfo(image->getTextu reHandle(true))->fID;
205 gl->CopySubTextureCHROMIUM(imageTexture, imageInfo.m_textureId, 0, 0, 0, 0, m_size.width(), m_size.height(), GL_FALSE, GL_FALSE, GL_FALSE); 208 gl->CopySubTextureCHROMIUM(imageTexture, imageInfo.m_textureId, 0, 0, 0, 0, m_size.width(), m_size.height(), GL_FALSE, GL_FALSE, GL_FALSE);
206 209
207 MailboxInfo& info = m_mailboxes.first(); 210 MailboxInfo& info = m_mailboxes.first();
208 info.m_mailbox.textureTarget = GC3D_TEXTURE_RECTANGLE_ARB; 211 info.m_mailbox.textureTarget = GC3D_TEXTURE_RECTANGLE_ARB;
209 gl->GenMailboxCHROMIUM(info.m_mailbox.name); 212 gl->GenMailboxCHROMIUM(info.m_mailbox.name);
210 gl->ProduceTextureDirectCHROMIUM(imageInfo.m_textureId, info.m_mailbox.textu reTarget, info.m_mailbox.name); 213 gl->ProduceTextureDirectCHROMIUM(imageInfo.m_textureId, info.m_mailbox.textu reTarget, info.m_mailbox.name);
211 info.m_mailbox.allowOverlay = true; 214 info.m_mailbox.allowOverlay = true;
212 215
213 const GLuint64 fenceSync = gl->InsertFenceSyncCHROMIUM(); 216 const GLuint64 fenceSync = gl->InsertFenceSyncCHROMIUM();
(...skipping 15 matching lines...) Expand all
229 232
230 Canvas2DLayerBridge::ImageInfo Canvas2DLayerBridge::createIOSurfaceBackedTexture () 233 Canvas2DLayerBridge::ImageInfo Canvas2DLayerBridge::createIOSurfaceBackedTexture ()
231 { 234 {
232 if (!m_imageInfoCache.isEmpty()) { 235 if (!m_imageInfoCache.isEmpty()) {
233 Canvas2DLayerBridge::ImageInfo info = m_imageInfoCache.last(); 236 Canvas2DLayerBridge::ImageInfo info = m_imageInfoCache.last();
234 m_imageInfoCache.removeLast(); 237 m_imageInfoCache.removeLast();
235 return info; 238 return info;
236 } 239 }
237 240
238 gpu::gles2::GLES2Interface* gl = contextGL(); 241 gpu::gles2::GLES2Interface* gl = contextGL();
242 if (!gl)
243 return Canvas2DLayerBridge::ImageInfo();
244
239 GLuint imageId = gl->CreateGpuMemoryBufferImageCHROMIUM(m_size.width(), m_si ze.height(), GL_RGBA, GC3D_SCANOUT_CHROMIUM); 245 GLuint imageId = gl->CreateGpuMemoryBufferImageCHROMIUM(m_size.width(), m_si ze.height(), GL_RGBA, GC3D_SCANOUT_CHROMIUM);
240 if (!imageId) 246 if (!imageId)
241 return Canvas2DLayerBridge::ImageInfo(); 247 return Canvas2DLayerBridge::ImageInfo();
242 248
243 GLuint textureId; 249 GLuint textureId;
244 gl->GenTextures(1, &textureId); 250 gl->GenTextures(1, &textureId);
245 GLenum target = GC3D_TEXTURE_RECTANGLE_ARB; 251 GLenum target = GC3D_TEXTURE_RECTANGLE_ARB;
246 gl->BindTexture(target, textureId); 252 gl->BindTexture(target, textureId);
247 gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, getGLFilter()); 253 gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, getGLFilter());
248 gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, getGLFilter()); 254 gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, getGLFilter());
249 gl->TexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 255 gl->TexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
250 gl->TexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 256 gl->TexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
251 gl->BindTexImage2DCHROMIUM(target, imageId); 257 gl->BindTexImage2DCHROMIUM(target, imageId);
252 258
253 return Canvas2DLayerBridge::ImageInfo(imageId, textureId); 259 return Canvas2DLayerBridge::ImageInfo(imageId, textureId);
254 } 260 }
255 261
256 void Canvas2DLayerBridge::deleteCHROMIUMImage(ImageInfo info) 262 void Canvas2DLayerBridge::deleteCHROMIUMImage(ImageInfo info)
257 { 263 {
258 gpu::gles2::GLES2Interface* gl = contextGL(); 264 gpu::gles2::GLES2Interface* gl = contextGL();
259 if (gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR) 265 if (!gl)
260 return; 266 return;
261 267
262 GLenum target = GC3D_TEXTURE_RECTANGLE_ARB; 268 GLenum target = GC3D_TEXTURE_RECTANGLE_ARB;
263 gl->BindTexture(target, info.m_textureId); 269 gl->BindTexture(target, info.m_textureId);
264 gl->ReleaseTexImage2DCHROMIUM(target, info.m_imageId); 270 gl->ReleaseTexImage2DCHROMIUM(target, info.m_imageId);
265 gl->DestroyImageCHROMIUM(info.m_imageId); 271 gl->DestroyImageCHROMIUM(info.m_imageId);
266 gl->DeleteTextures(1, &info.m_textureId); 272 gl->DeleteTextures(1, &info.m_textureId);
267 gl->BindTexture(target, 0); 273 gl->BindTexture(target, 0);
268 274
269 resetSkiaTextureBinding(); 275 resetSkiaTextureBinding();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 // Need to flush skia's internal queue because texture is about to be access ed directly 321 // Need to flush skia's internal queue because texture is about to be access ed directly
316 grContext->flush(); 322 grContext->flush();
317 323
318 // Because of texture sharing with the compositor, we must invalidate 324 // Because of texture sharing with the compositor, we must invalidate
319 // the state cached in skia so that the deferred copy on write 325 // the state cached in skia so that the deferred copy on write
320 // in SkSurface_Gpu does not make any false assumptions. 326 // in SkSurface_Gpu does not make any false assumptions.
321 mailboxInfo.m_image->getTexture()->textureParamsModified(); 327 mailboxInfo.m_image->getTexture()->textureParamsModified();
322 mailboxInfo.m_mailbox.textureTarget = GL_TEXTURE_2D; 328 mailboxInfo.m_mailbox.textureTarget = GL_TEXTURE_2D;
323 329
324 gpu::gles2::GLES2Interface* gl = contextGL(); 330 gpu::gles2::GLES2Interface* gl = contextGL();
331 if (!gl)
332 return false;
333
325 GLuint textureID = skia::GrBackendObjectToGrGLTextureInfo(mailboxInfo.m_imag e->getTextureHandle(true))->fID; 334 GLuint textureID = skia::GrBackendObjectToGrGLTextureInfo(mailboxInfo.m_imag e->getTextureHandle(true))->fID;
326 gl->BindTexture(GL_TEXTURE_2D, textureID); 335 gl->BindTexture(GL_TEXTURE_2D, textureID);
327 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, getGLFilter()); 336 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, getGLFilter());
328 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, getGLFilter()); 337 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, getGLFilter());
329 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 338 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
330 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 339 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
331 340
332 // Re-use the texture's existing mailbox, if there is one. 341 // Re-use the texture's existing mailbox, if there is one.
333 if (mailboxInfo.m_image->getTexture()->getCustomData()) { 342 if (mailboxInfo.m_image->getTexture()->getCustomData()) {
334 ASSERT(mailboxInfo.m_image->getTexture()->getCustomData()->size() == siz eof(mailboxInfo.m_mailbox.name)); 343 ASSERT(mailboxInfo.m_image->getTexture()->getCustomData()->size() == siz eof(mailboxInfo.m_mailbox.name));
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 if (isAccelerated() && gl) 696 if (isAccelerated() && gl)
688 gl->Flush(); 697 gl->Flush();
689 } 698 }
690 699
691 700
692 gpu::gles2::GLES2Interface* Canvas2DLayerBridge::contextGL() 701 gpu::gles2::GLES2Interface* Canvas2DLayerBridge::contextGL()
693 { 702 {
694 // Check on m_layer is necessary because contextGL() may be called during 703 // Check on m_layer is necessary because contextGL() may be called during
695 // the destruction of m_layer 704 // the destruction of m_layer
696 if (m_layer && !m_destructionInProgress) { 705 if (m_layer && !m_destructionInProgress) {
697 // Ensure rate limiter is disabled if context is lost. 706 // Call checkSurfaceValid to ensure rate limiter is disabled if context is lost.
698 checkSurfaceValid(); 707 if (!checkSurfaceValid())
708 return nullptr;
699 } 709 }
700 return m_contextProvider ? m_contextProvider->contextGL() : nullptr; 710 return m_contextProvider ? m_contextProvider->contextGL() : nullptr;
701 } 711 }
702 712
703 bool Canvas2DLayerBridge::checkSurfaceValid() 713 bool Canvas2DLayerBridge::checkSurfaceValid()
704 { 714 {
705 ASSERT(!m_destructionInProgress); 715 ASSERT(!m_destructionInProgress);
706 if (m_destructionInProgress) 716 if (m_destructionInProgress)
707 return false; 717 return false;
708 if (isHibernating()) 718 if (isHibernating())
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 #endif // USE_IOSURFACE_FOR_2D_CANVAS 983 #endif // USE_IOSURFACE_FOR_2D_CANVAS
974 } 984 }
975 985
976 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event) 986 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event)
977 { 987 {
978 DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram, ("Canvas.Hib ernationEvents", HibernationEventCount)); 988 DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram, ("Canvas.Hib ernationEvents", HibernationEventCount));
979 hibernationHistogram.count(event); 989 hibernationHistogram.count(event);
980 } 990 }
981 991
982 } // namespace blink 992 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698