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

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

Issue 1807103002: Move simple methods [A-E] from WebGraphicsContext3D to GLES2Interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@work
Patch Set: bindFoo: ALLthetests Created 4 years, 9 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
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 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 bool Canvas2DLayerBridge::prepareIOSurfaceMailboxFromImage(SkImage* image, WebEx ternalTextureMailbox* outMailbox) 210 bool Canvas2DLayerBridge::prepareIOSurfaceMailboxFromImage(SkImage* image, WebEx ternalTextureMailbox* outMailbox)
211 { 211 {
212 // Need to flush skia's internal queue because texture is about to be access ed directly 212 // Need to flush skia's internal queue because texture is about to be access ed directly
213 GrContext* grContext = m_contextProvider->grContext(); 213 GrContext* grContext = m_contextProvider->grContext();
214 grContext->flush(); 214 grContext->flush();
215 215
216 ImageInfo imageInfo = createIOSurfaceBackedTexture(); 216 ImageInfo imageInfo = createIOSurfaceBackedTexture();
217 if (imageInfo.empty()) 217 if (imageInfo.empty())
218 return false; 218 return false;
219 219
220 gpu::gles2::GLES2Interface* gl = contextGL();
220 GLuint imageTexture = skia::GrBackendObjectToGrGLTextureInfo(image->getTextu reHandle(true))->fID; 221 GLuint imageTexture = skia::GrBackendObjectToGrGLTextureInfo(image->getTextu reHandle(true))->fID;
221 context()->copySubTextureCHROMIUM(imageTexture, imageInfo.m_textureId, 0, 0, 0, 0, m_size.width(), m_size.height(), GL_FALSE, GL_FALSE, GL_FALSE); 222 context()->copySubTextureCHROMIUM(imageTexture, imageInfo.m_textureId, 0, 0, 0, 0, m_size.width(), m_size.height(), GL_FALSE, GL_FALSE, GL_FALSE);
222 223
223 MailboxInfo& info = m_mailboxes.first(); 224 MailboxInfo& info = m_mailboxes.first();
224 info.m_mailbox.textureTarget = GC3D_TEXTURE_RECTANGLE_ARB; 225 info.m_mailbox.textureTarget = GC3D_TEXTURE_RECTANGLE_ARB;
225 context()->genMailboxCHROMIUM(info.m_mailbox.name); 226 context()->genMailboxCHROMIUM(info.m_mailbox.name);
226 context()->produceTextureDirectCHROMIUM(imageInfo.m_textureId, info.m_mailbo x.textureTarget, info.m_mailbox.name); 227 context()->produceTextureDirectCHROMIUM(imageInfo.m_textureId, info.m_mailbo x.textureTarget, info.m_mailbox.name);
227 info.m_mailbox.allowOverlay = true; 228 info.m_mailbox.allowOverlay = true;
228 229
229 const WGC3Duint64 fenceSync = context()->insertFenceSyncCHROMIUM(); 230 const WGC3Duint64 fenceSync = gl->InsertFenceSyncCHROMIUM();
230 context()->flush(); 231 context()->flush();
231 info.m_mailbox.validSyncToken = context()->genSyncTokenCHROMIUM(fenceSync, i nfo.m_mailbox.syncToken); 232 info.m_mailbox.validSyncToken = context()->genSyncTokenCHROMIUM(fenceSync, i nfo.m_mailbox.syncToken);
232 233
233 info.m_imageInfo = imageInfo; 234 info.m_imageInfo = imageInfo;
234 *outMailbox = info.m_mailbox; 235 *outMailbox = info.m_mailbox;
235 236
236 context()->bindTexture(GC3D_TEXTURE_RECTANGLE_ARB, 0); 237 gl->BindTexture(GC3D_TEXTURE_RECTANGLE_ARB, 0);
237 238
238 // Because we are changing the texture binding without going through skia, 239 // Because we are changing the texture binding without going through skia,
239 // we must dirty the context. 240 // we must dirty the context.
240 grContext->resetContext(kTextureBinding_GrGLBackendState); 241 grContext->resetContext(kTextureBinding_GrGLBackendState);
241 242
242 return true; 243 return true;
243 } 244 }
244 245
245 Canvas2DLayerBridge::ImageInfo Canvas2DLayerBridge::createIOSurfaceBackedTexture () 246 Canvas2DLayerBridge::ImageInfo Canvas2DLayerBridge::createIOSurfaceBackedTexture ()
246 { 247 {
247 if (!m_imageInfoCache.isEmpty()) { 248 if (!m_imageInfoCache.isEmpty()) {
248 Canvas2DLayerBridge::ImageInfo info = m_imageInfoCache.last(); 249 Canvas2DLayerBridge::ImageInfo info = m_imageInfoCache.last();
249 m_imageInfoCache.removeLast(); 250 m_imageInfoCache.removeLast();
250 return info; 251 return info;
251 } 252 }
252 253
253 WebGraphicsContext3D* webContext = context(); 254 WebGraphicsContext3D* webContext = context();
255 gpu::gles2::GLES2Interface* gl = contextGL();
254 GLuint imageId = webContext->createGpuMemoryBufferImageCHROMIUM(m_size.width (), m_size.height(), GL_BGRA_EXT, GC3D_SCANOUT_CHROMIUM); 256 GLuint imageId = webContext->createGpuMemoryBufferImageCHROMIUM(m_size.width (), m_size.height(), GL_BGRA_EXT, GC3D_SCANOUT_CHROMIUM);
255 if (!imageId) 257 if (!imageId)
256 return Canvas2DLayerBridge::ImageInfo(); 258 return Canvas2DLayerBridge::ImageInfo();
257 259
258 GLuint textureId= webContext->createTexture(); 260 GLuint textureId= webContext->createTexture();
259 if (!textureId) { 261 if (!textureId) {
260 webContext->destroyImageCHROMIUM(imageId); 262 webContext->destroyImageCHROMIUM(imageId);
261 return Canvas2DLayerBridge::ImageInfo(); 263 return Canvas2DLayerBridge::ImageInfo();
262 } 264 }
263 265
264 GLenum target = GC3D_TEXTURE_RECTANGLE_ARB; 266 GLenum target = GC3D_TEXTURE_RECTANGLE_ARB;
265 webContext->bindTexture(target, textureId); 267 gl->BindTexture(target, textureId);
266 webContext->texParameteri(target, GL_TEXTURE_MAG_FILTER, getGLFilter()); 268 webContext->texParameteri(target, GL_TEXTURE_MAG_FILTER, getGLFilter());
267 webContext->texParameteri(target, GL_TEXTURE_MIN_FILTER, getGLFilter()); 269 webContext->texParameteri(target, GL_TEXTURE_MIN_FILTER, getGLFilter());
268 webContext->texParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 270 webContext->texParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
269 webContext->texParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 271 webContext->texParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
270 webContext->bindTexImage2DCHROMIUM(target, imageId); 272 webContext->bindTexImage2DCHROMIUM(target, imageId);
271 273
272 return Canvas2DLayerBridge::ImageInfo(imageId, textureId); 274 return Canvas2DLayerBridge::ImageInfo(imageId, textureId);
273 } 275 }
274 276
275 void Canvas2DLayerBridge::deleteCHROMIUMImage(ImageInfo info) 277 void Canvas2DLayerBridge::deleteCHROMIUMImage(ImageInfo info)
276 { 278 {
277 if (m_contextProvider->contextGL()->GetGraphicsResetStatusKHR() != GL_NO_ERR OR) 279 WebGraphicsContext3D* webContext = context();
280 gpu::gles2::GLES2Interface* gl = contextGL();
281 if (gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR)
278 return; 282 return;
279 283
280 GLenum target = GC3D_TEXTURE_RECTANGLE_ARB; 284 GLenum target = GC3D_TEXTURE_RECTANGLE_ARB;
281 WebGraphicsContext3D* webContext = context(); 285 gl->BindTexture(target, info.m_textureId);
282 webContext->bindTexture(target, info.m_textureId);
283 webContext->releaseTexImage2DCHROMIUM(target, info.m_imageId); 286 webContext->releaseTexImage2DCHROMIUM(target, info.m_imageId);
284 webContext->destroyImageCHROMIUM(info.m_imageId); 287 webContext->destroyImageCHROMIUM(info.m_imageId);
285 webContext->deleteTexture(info.m_textureId); 288 webContext->deleteTexture(info.m_textureId);
286 webContext->bindTexture(target, 0); 289 gl->BindTexture(target, 0);
287 290
288 resetSkiaTextureBinding(); 291 resetSkiaTextureBinding();
289 } 292 }
290 293
291 void Canvas2DLayerBridge::clearCHROMIUMImageCache() 294 void Canvas2DLayerBridge::clearCHROMIUMImageCache()
292 { 295 {
293 for (const auto& it : m_imageInfoCache) { 296 for (const auto& it : m_imageInfoCache) {
294 deleteCHROMIUMImage(it); 297 deleteCHROMIUMImage(it);
295 } 298 }
296 m_imageInfoCache.clear(); 299 m_imageInfoCache.clear();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 // Need to flush skia's internal queue because texture is about to be access ed directly 337 // Need to flush skia's internal queue because texture is about to be access ed directly
335 grContext->flush(); 338 grContext->flush();
336 339
337 // Because of texture sharing with the compositor, we must invalidate 340 // Because of texture sharing with the compositor, we must invalidate
338 // the state cached in skia so that the deferred copy on write 341 // the state cached in skia so that the deferred copy on write
339 // in SkSurface_Gpu does not make any false assumptions. 342 // in SkSurface_Gpu does not make any false assumptions.
340 mailboxInfo.m_image->getTexture()->textureParamsModified(); 343 mailboxInfo.m_image->getTexture()->textureParamsModified();
341 mailboxInfo.m_mailbox.textureTarget = GL_TEXTURE_2D; 344 mailboxInfo.m_mailbox.textureTarget = GL_TEXTURE_2D;
342 345
343 WebGraphicsContext3D* webContext = context(); 346 WebGraphicsContext3D* webContext = context();
347 gpu::gles2::GLES2Interface* gl = contextGL();
344 GLuint textureID = skia::GrBackendObjectToGrGLTextureInfo(mailboxInfo.m_imag e->getTextureHandle(true))->fID; 348 GLuint textureID = skia::GrBackendObjectToGrGLTextureInfo(mailboxInfo.m_imag e->getTextureHandle(true))->fID;
345 webContext->bindTexture(GL_TEXTURE_2D, textureID); 349 gl->BindTexture(GL_TEXTURE_2D, textureID);
346 webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, getGLFilter( )); 350 webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, getGLFilter( ));
347 webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, getGLFilter( )); 351 webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, getGLFilter( ));
348 webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); 352 webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
349 webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); 353 webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
350 354
351 // Re-use the texture's existing mailbox, if there is one. 355 // Re-use the texture's existing mailbox, if there is one.
352 if (mailboxInfo.m_image->getTexture()->getCustomData()) { 356 if (mailboxInfo.m_image->getTexture()->getCustomData()) {
353 ASSERT(mailboxInfo.m_image->getTexture()->getCustomData()->size() == siz eof(mailboxInfo.m_mailbox.name)); 357 ASSERT(mailboxInfo.m_image->getTexture()->getCustomData()->size() == siz eof(mailboxInfo.m_mailbox.name));
354 memcpy(&mailboxInfo.m_mailbox.name[0], mailboxInfo.m_image->getTexture() ->getCustomData()->data(), sizeof(mailboxInfo.m_mailbox.name)); 358 memcpy(&mailboxInfo.m_mailbox.name[0], mailboxInfo.m_image->getTexture() ->getCustomData()->data(), sizeof(mailboxInfo.m_mailbox.name));
355 } else { 359 } else {
356 context()->genMailboxCHROMIUM(mailboxInfo.m_mailbox.name); 360 context()->genMailboxCHROMIUM(mailboxInfo.m_mailbox.name);
357 RefPtr<SkData> mailboxNameData = adoptRef(SkData::NewWithCopy(&mailboxIn fo.m_mailbox.name[0], sizeof(mailboxInfo.m_mailbox.name))); 361 RefPtr<SkData> mailboxNameData = adoptRef(SkData::NewWithCopy(&mailboxIn fo.m_mailbox.name[0], sizeof(mailboxInfo.m_mailbox.name)));
358 mailboxInfo.m_image->getTexture()->setCustomData(mailboxNameData.get()); 362 mailboxInfo.m_image->getTexture()->setCustomData(mailboxNameData.get());
359 webContext->produceTextureCHROMIUM(GL_TEXTURE_2D, mailboxInfo.m_mailbox. name); 363 webContext->produceTextureCHROMIUM(GL_TEXTURE_2D, mailboxInfo.m_mailbox. name);
360 } 364 }
361 365
362 if (isHidden()) { 366 if (isHidden()) {
363 // With hidden canvases, we release the SkImage immediately because 367 // With hidden canvases, we release the SkImage immediately because
364 // there is no need for animations to be double buffered. 368 // there is no need for animations to be double buffered.
365 mailboxInfo.m_image.clear(); 369 mailboxInfo.m_image.clear();
366 } else { 370 } else {
367 // FIXME: We'd rather insert a syncpoint than perform a flush here, 371 // FIXME: We'd rather insert a syncpoint than perform a flush here,
368 // but currently the canvas will flicker if we don't flush here. 372 // but currently the canvas will flicker if we don't flush here.
369 const WGC3Duint64 fenceSync = webContext->insertFenceSyncCHROMIUM(); 373 const GLuint64 fenceSync = gl->InsertFenceSyncCHROMIUM();
370 webContext->flush(); 374 webContext->flush();
371 mailboxInfo.m_mailbox.validSyncToken = webContext->genSyncTokenCHROMIUM( fenceSync, mailboxInfo.m_mailbox.syncToken); 375 mailboxInfo.m_mailbox.validSyncToken = webContext->genSyncTokenCHROMIUM( fenceSync, mailboxInfo.m_mailbox.syncToken);
372 } 376 }
373 webContext->bindTexture(GL_TEXTURE_2D, 0); 377 gl->BindTexture(GL_TEXTURE_2D, 0);
374 // Because we are changing the texture binding without going through skia, 378 // Because we are changing the texture binding without going through skia,
375 // we must dirty the context. 379 // we must dirty the context.
376 grContext->resetContext(kTextureBinding_GrGLBackendState); 380 grContext->resetContext(kTextureBinding_GrGLBackendState);
377 381
378 *outMailbox = mailboxInfo.m_mailbox; 382 *outMailbox = mailboxInfo.m_mailbox;
379 return true; 383 return true;
380 } 384 }
381 385
382 void Canvas2DLayerBridge::resetSkiaTextureBinding() 386 void Canvas2DLayerBridge::resetSkiaTextureBinding()
383 { 387 {
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 715
712 WebGraphicsContext3D* Canvas2DLayerBridge::context() 716 WebGraphicsContext3D* Canvas2DLayerBridge::context()
713 { 717 {
714 // Check on m_layer is necessary because context() may be called during 718 // Check on m_layer is necessary because context() may be called during
715 // the destruction of m_layer 719 // the destruction of m_layer
716 if (m_layer && !m_destructionInProgress) 720 if (m_layer && !m_destructionInProgress)
717 checkSurfaceValid(); // To ensure rate limiter is disabled if context is lost. 721 checkSurfaceValid(); // To ensure rate limiter is disabled if context is lost.
718 return m_contextProvider ? m_contextProvider->context3d() : 0; 722 return m_contextProvider ? m_contextProvider->context3d() : 0;
719 } 723 }
720 724
725 gpu::gles2::GLES2Interface* Canvas2DLayerBridge::contextGL()
726 {
727 // Check on m_layer is necessary because contextGL() may be called during
728 // the destruction of m_layer
729 if (m_layer && !m_destructionInProgress) {
730 // Ensure rate limiter is disabled if context is lost.
731 checkSurfaceValid();
732 }
733 return m_contextProvider ? m_contextProvider->contextGL() : nullptr;
734 }
735
721 bool Canvas2DLayerBridge::checkSurfaceValid() 736 bool Canvas2DLayerBridge::checkSurfaceValid()
722 { 737 {
723 ASSERT(!m_destructionInProgress); 738 ASSERT(!m_destructionInProgress);
724 if (m_destructionInProgress) 739 if (m_destructionInProgress)
725 return false; 740 return false;
726 if (isHibernating()) 741 if (isHibernating())
727 return true; 742 return true;
728 if (!m_layer) 743 if (!m_layer)
729 return true; 744 return true;
730 if (!m_surface) 745 if (!m_surface)
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 ASSERT(releasedMailboxInfo != firstMailbox); 852 ASSERT(releasedMailboxInfo != firstMailbox);
838 } 853 }
839 854
840 if (!contextLost) { 855 if (!contextLost) {
841 // Invalidate texture state in case the compositor altered it since the copy-on-write. 856 // Invalidate texture state in case the compositor altered it since the copy-on-write.
842 if (releasedMailboxInfo->m_image) { 857 if (releasedMailboxInfo->m_image) {
843 #if USE_IOSURFACE_FOR_2D_CANVAS 858 #if USE_IOSURFACE_FOR_2D_CANVAS
844 ASSERT(releasedMailboxInfo->m_imageInfo.empty()); 859 ASSERT(releasedMailboxInfo->m_imageInfo.empty());
845 #endif // USE_IOSURFACE_FOR_2D_CANVAS 860 #endif // USE_IOSURFACE_FOR_2D_CANVAS
846 if (mailbox.validSyncToken) { 861 if (mailbox.validSyncToken) {
847 context()->waitSyncTokenCHROMIUM(mailbox.syncToken); 862 contextGL()->WaitSyncTokenCHROMIUM(mailbox.syncToken);
848 } 863 }
849 GrTexture* texture = releasedMailboxInfo->m_image->getTexture(); 864 GrTexture* texture = releasedMailboxInfo->m_image->getTexture();
850 if (texture) { 865 if (texture) {
851 if (lostResource) { 866 if (lostResource) {
852 texture->abandon(); 867 texture->abandon();
853 } else { 868 } else {
854 texture->textureParamsModified(); 869 texture->textureParamsModified();
855 } 870 }
856 } 871 }
857 } 872 }
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
991 #endif // USE_IOSURFACE_FOR_2D_CANVAS 1006 #endif // USE_IOSURFACE_FOR_2D_CANVAS
992 } 1007 }
993 1008
994 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event) 1009 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event)
995 { 1010 {
996 DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram, ("Canvas.Hib ernationEvents", HibernationEventCount)); 1011 DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram, ("Canvas.Hib ernationEvents", HibernationEventCount));
997 hibernationHistogram.count(event); 1012 hibernationHistogram.count(event);
998 } 1013 }
999 1014
1000 } // namespace blink 1015 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698