| OLD | NEW | 
|     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 201 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   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     gpu::gles2::GLES2Interface* gl = contextGL(); | 
|   221     GLuint imageTexture = skia::GrBackendObjectToGrGLTextureInfo(image->getTextu
      reHandle(true))->fID; |   221     GLuint imageTexture = skia::GrBackendObjectToGrGLTextureInfo(image->getTextu
      reHandle(true))->fID; | 
|   222     context()->copySubTextureCHROMIUM(imageTexture, imageInfo.m_textureId, 0, 0,
       0, 0, m_size.width(), m_size.height(), GL_FALSE, GL_FALSE, GL_FALSE); |   222     gl->CopySubTextureCHROMIUM(imageTexture, imageInfo.m_textureId, 0, 0, 0, 0, 
      m_size.width(), m_size.height(), GL_FALSE, GL_FALSE, GL_FALSE); | 
|   223  |   223  | 
|   224     MailboxInfo& info = m_mailboxes.first(); |   224     MailboxInfo& info = m_mailboxes.first(); | 
|   225     info.m_mailbox.textureTarget = GC3D_TEXTURE_RECTANGLE_ARB; |   225     info.m_mailbox.textureTarget = GC3D_TEXTURE_RECTANGLE_ARB; | 
|   226     context()->genMailboxCHROMIUM(info.m_mailbox.name); |   226     gl->GenMailboxCHROMIUM(info.m_mailbox.name); | 
|   227     context()->produceTextureDirectCHROMIUM(imageInfo.m_textureId, info.m_mailbo
      x.textureTarget, info.m_mailbox.name); |   227     gl->ProduceTextureDirectCHROMIUM(imageInfo.m_textureId, info.m_mailbox.textu
      reTarget, info.m_mailbox.name); | 
|   228     info.m_mailbox.allowOverlay = true; |   228     info.m_mailbox.allowOverlay = true; | 
|   229  |   229  | 
|   230     const WGC3Duint64 fenceSync = gl->InsertFenceSyncCHROMIUM(); |   230     const WGC3Duint64 fenceSync = gl->InsertFenceSyncCHROMIUM(); | 
|   231     context()->flush(); |   231     context()->flush(); | 
|   232     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); | 
|   233  |   233  | 
|   234     info.m_imageInfo = imageInfo; |   234     info.m_imageInfo = imageInfo; | 
|   235     *outMailbox = info.m_mailbox; |   235     *outMailbox = info.m_mailbox; | 
|   236  |   236  | 
|   237     gl->BindTexture(GC3D_TEXTURE_RECTANGLE_ARB, 0); |   237     gl->BindTexture(GC3D_TEXTURE_RECTANGLE_ARB, 0); | 
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   350     webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, getGLFilter(
      )); |   350     webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, getGLFilter(
      )); | 
|   351     webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, getGLFilter(
      )); |   351     webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, getGLFilter(
      )); | 
|   352     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
      ); | 
|   353     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
      ); | 
|   354  |   354  | 
|   355     // Re-use the texture's existing mailbox, if there is one. |   355     // Re-use the texture's existing mailbox, if there is one. | 
|   356     if (mailboxInfo.m_image->getTexture()->getCustomData()) { |   356     if (mailboxInfo.m_image->getTexture()->getCustomData()) { | 
|   357         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)); | 
|   358         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)); | 
|   359     } else { |   359     } else { | 
|   360         context()->genMailboxCHROMIUM(mailboxInfo.m_mailbox.name); |   360         gl->GenMailboxCHROMIUM(mailboxInfo.m_mailbox.name); | 
|   361         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))); | 
|   362         mailboxInfo.m_image->getTexture()->setCustomData(mailboxNameData.get()); |   362         mailboxInfo.m_image->getTexture()->setCustomData(mailboxNameData.get()); | 
|   363         webContext->produceTextureCHROMIUM(GL_TEXTURE_2D, mailboxInfo.m_mailbox.
      name); |   363         gl->ProduceTextureCHROMIUM(GL_TEXTURE_2D, mailboxInfo.m_mailbox.name); | 
|   364     } |   364     } | 
|   365  |   365  | 
|   366     if (isHidden()) { |   366     if (isHidden()) { | 
|   367         // With hidden canvases, we release the SkImage immediately because |   367         // With hidden canvases, we release the SkImage immediately because | 
|   368         // there is no need for animations to be double buffered. |   368         // there is no need for animations to be double buffered. | 
|   369         mailboxInfo.m_image.clear(); |   369         mailboxInfo.m_image.clear(); | 
|   370     } else { |   370     } else { | 
|   371         // 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, | 
|   372         // 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. | 
|   373         const GLuint64 fenceSync = gl->InsertFenceSyncCHROMIUM(); |   373         const GLuint64 fenceSync = gl->InsertFenceSyncCHROMIUM(); | 
|   374         webContext->flush(); |   374         gl->Flush(); | 
|   375         mailboxInfo.m_mailbox.validSyncToken = webContext->genSyncTokenCHROMIUM(
      fenceSync, mailboxInfo.m_mailbox.syncToken); |   375         mailboxInfo.m_mailbox.validSyncToken = webContext->genSyncTokenCHROMIUM(
      fenceSync, mailboxInfo.m_mailbox.syncToken); | 
|   376     } |   376     } | 
|   377     gl->BindTexture(GL_TEXTURE_2D, 0); |   377     gl->BindTexture(GL_TEXTURE_2D, 0); | 
|   378     // Because we are changing the texture binding without going through skia, |   378     // Because we are changing the texture binding without going through skia, | 
|   379     // we must dirty the context. |   379     // we must dirty the context. | 
|   380     grContext->resetContext(kTextureBinding_GrGLBackendState); |   380     grContext->resetContext(kTextureBinding_GrGLBackendState); | 
|   381  |   381  | 
|   382     *outMailbox = mailboxInfo.m_mailbox; |   382     *outMailbox = mailboxInfo.m_mailbox; | 
|   383     return true; |   383     return true; | 
|   384 } |   384 } | 
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   700         return; |   700         return; | 
|   701     TRACE_EVENT0("cc", "Canvas2DLayerBridge::flush"); |   701     TRACE_EVENT0("cc", "Canvas2DLayerBridge::flush"); | 
|   702     flushRecordingOnly(); |   702     flushRecordingOnly(); | 
|   703     getOrCreateSurface()->getCanvas()->flush(); |   703     getOrCreateSurface()->getCanvas()->flush(); | 
|   704 } |   704 } | 
|   705  |   705  | 
|   706 void Canvas2DLayerBridge::flushGpu() |   706 void Canvas2DLayerBridge::flushGpu() | 
|   707 { |   707 { | 
|   708     TRACE_EVENT0("cc", "Canvas2DLayerBridge::flushGpu"); |   708     TRACE_EVENT0("cc", "Canvas2DLayerBridge::flushGpu"); | 
|   709     flush(); |   709     flush(); | 
|   710     WebGraphicsContext3D* webContext = context(); |   710     gpu::gles2::GLES2Interface* gl = contextGL(); | 
|   711     if (isAccelerated() && webContext) |   711     if (isAccelerated() && gl) | 
|   712         webContext->flush(); |   712         gl->Flush(); | 
|   713 } |   713 } | 
|   714  |   714  | 
|   715  |   715  | 
|   716 WebGraphicsContext3D* Canvas2DLayerBridge::context() |   716 WebGraphicsContext3D* Canvas2DLayerBridge::context() | 
|   717 { |   717 { | 
|   718     // 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 | 
|   719     // the destruction of m_layer |   719     // the destruction of m_layer | 
|   720     if (m_layer && !m_destructionInProgress) |   720     if (m_layer && !m_destructionInProgress) | 
|   721         checkSurfaceValid(); // To ensure rate limiter is disabled if context is
       lost. |   721         checkSurfaceValid(); // To ensure rate limiter is disabled if context is
       lost. | 
|   722     return m_contextProvider ? m_contextProvider->context3d() : 0; |   722     return m_contextProvider ? m_contextProvider->context3d() : 0; | 
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1006 #endif // USE_IOSURFACE_FOR_2D_CANVAS |  1006 #endif // USE_IOSURFACE_FOR_2D_CANVAS | 
|  1007 } |  1007 } | 
|  1008  |  1008  | 
|  1009 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event) |  1009 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event) | 
|  1010 { |  1010 { | 
|  1011     DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram, ("Canvas.Hib
      ernationEvents", HibernationEventCount)); |  1011     DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram, ("Canvas.Hib
      ernationEvents", HibernationEventCount)); | 
|  1012     hibernationHistogram.count(event); |  1012     hibernationHistogram.count(event); | 
|  1013 } |  1013 } | 
|  1014  |  1014  | 
|  1015 } // namespace blink |  1015 } // namespace blink | 
| OLD | NEW |