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

Unified Diff: third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp

Issue 2455983005: Refactor AcceleratedStaticBitmapImage (Closed)
Patch Set: Keep a unique_ptr<WebGraphicsContext3DProvider>, otherwise crashes Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp b/third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp
index d556600eee076ab2162cc61a77e3210d83ea6f9b..0b34859663144a5450d66ec483b86d6a726c227c 100644
--- a/third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp
+++ b/third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp
@@ -6,16 +6,13 @@
#include "gpu/command_buffer/client/gles2_interface.h"
#include "gpu/command_buffer/common/sync_token.h"
-#include "platform/CrossThreadFunctional.h"
-#include "platform/WebTaskRunner.h"
-#include "platform/graphics/StaticBitmapImage.h"
+#include "platform/graphics/MailboxTextureHolder.h"
+#include "platform/graphics/SkiaTextureHolder.h"
#include "platform/graphics/gpu/SharedGpuContext.h"
#include "platform/graphics/skia/SkiaUtils.h"
#include "public/platform/Platform.h"
#include "public/platform/WebGraphicsContext3DProvider.h"
-#include "skia/ext/texture_handle.h"
#include "third_party/skia/include/core/SkImage.h"
-#include "third_party/skia/include/gpu/GrContext.h"
#include "wtf/PtrUtil.h"
#include <memory>
@@ -31,41 +28,40 @@ AcceleratedStaticBitmapImage::createFromSharedContextImage(
PassRefPtr<AcceleratedStaticBitmapImage>
AcceleratedStaticBitmapImage::createFromWebGLContextImage(
- sk_sp<SkImage> image,
const gpu::Mailbox& mailbox,
- const gpu::SyncToken& syncToken) {
- return adoptRef(
- new AcceleratedStaticBitmapImage(std::move(image), mailbox, syncToken));
+ const gpu::SyncToken& syncToken,
+ unsigned textureId,
+ WeakPtr<WebGraphicsContext3DProviderWrapper> contextProvider,
+ IntSize mailboxSize) {
+ return adoptRef(new AcceleratedStaticBitmapImage(
+ mailbox, syncToken, textureId, contextProvider, mailboxSize));
}
-AcceleratedStaticBitmapImage::AcceleratedStaticBitmapImage(sk_sp<SkImage> image)
- : StaticBitmapImage(std::move(image)),
- m_sharedContextId(SharedGpuContext::contextId()) {
+AcceleratedStaticBitmapImage::AcceleratedStaticBitmapImage(
+ sk_sp<SkImage> image) {
+ m_textureHolder = wrapUnique(new SkiaTextureHolder(std::move(image)));
m_threadChecker.DetachFromThread();
}
AcceleratedStaticBitmapImage::AcceleratedStaticBitmapImage(
- sk_sp<SkImage> image,
const gpu::Mailbox& mailbox,
- const gpu::SyncToken& syncToken)
- : StaticBitmapImage(std::move(image)),
- m_sharedContextId(SharedGpuContext::kNoSharedContext),
- m_hasMailbox(true),
- m_mailbox(mailbox),
- m_syncToken(syncToken) {
+ const gpu::SyncToken& syncToken,
+ unsigned textureId,
+ WeakPtr<WebGraphicsContext3DProviderWrapper> contextProvider,
+ IntSize mailboxSize) {
+ m_textureHolder = wrapUnique(new MailboxTextureHolder(
+ mailbox, syncToken, textureId, contextProvider, mailboxSize));
m_threadChecker.DetachFromThread();
+}
- // Note: In this case, m_image is not usable directly because it is not in the
- // shared context. It is just used to hold a reference to the texture object
- // in the origin context until the mailbox can be consumed.
+AcceleratedStaticBitmapImage::~AcceleratedStaticBitmapImage() {}
+
+IntSize AcceleratedStaticBitmapImage::size() const {
+ return m_textureHolder->size();
}
-AcceleratedStaticBitmapImage::~AcceleratedStaticBitmapImage() {
- // Avoid leaking mailboxes in cases where the texture gets recycled by skia.
- if (m_hasMailbox && SharedGpuContext::isValid())
- SharedGpuContext::gl()->ProduceTextureDirectCHROMIUM(0, GL_TEXTURE_2D,
- m_mailbox.name);
- releaseImageThreadSafe();
+void AcceleratedStaticBitmapImage::updateSyncToken(gpu::SyncToken syncToken) {
+ m_textureHolder->updateSyncToken(syncToken);
}
void AcceleratedStaticBitmapImage::copyToTexture(
@@ -83,9 +79,9 @@ void AcceleratedStaticBitmapImage::copyToTexture(
// Get a texture id that |destProvider| knows about and copy from it.
gpu::gles2::GLES2Interface* destGL = destProvider->contextGL();
- destGL->WaitSyncTokenCHROMIUM(m_syncToken.GetData());
- GLuint sourceTextureId =
- destGL->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, m_mailbox.name);
+ destGL->WaitSyncTokenCHROMIUM(m_textureHolder->syncToken().GetData());
+ GLuint sourceTextureId = destGL->CreateAndConsumeTextureCHROMIUM(
+ GL_TEXTURE_2D, m_textureHolder->mailbox().name);
destGL->CopyTextureCHROMIUM(sourceTextureId, destTextureId, internalFormat,
destType, flipY, false, false);
// This drops the |destGL| context's reference on our |m_mailbox|, but it's
@@ -98,116 +94,77 @@ sk_sp<SkImage> AcceleratedStaticBitmapImage::imageForCurrentFrame() {
if (!isValid())
return nullptr;
createImageFromMailboxIfNeeded();
- return m_image;
+ return m_textureHolder->skImage();
}
-void AcceleratedStaticBitmapImage::draw(
- SkCanvas* canvas,
- const SkPaint& paint,
- const FloatRect& dstRect,
- const FloatRect& srcRect,
- RespectImageOrientationEnum respectImageOrientation,
- ImageClampingMode imageClampingMode) {
+void AcceleratedStaticBitmapImage::draw(SkCanvas* canvas,
+ const SkPaint& paint,
+ const FloatRect& dstRect,
+ const FloatRect& srcRect,
+ RespectImageOrientationEnum,
+ ImageClampingMode imageClampingMode) {
checkThread();
if (!isValid())
return;
createImageFromMailboxIfNeeded();
- StaticBitmapImage::draw(canvas, paint, dstRect, srcRect,
- respectImageOrientation, imageClampingMode);
+ sk_sp<SkImage> image = m_textureHolder->skImage();
+ StaticBitmapImage::drawHelper(canvas, paint, dstRect, srcRect,
+ imageClampingMode, image);
}
bool AcceleratedStaticBitmapImage::isValid() {
- if (!m_image)
+ if (!m_textureHolder)
return false;
if (!SharedGpuContext::isValid())
return false; // Gpu context was lost
- if (imageBelongsToSharedContext() &&
- m_sharedContextId != SharedGpuContext::contextId()) {
+ unsigned sharedContextId = m_textureHolder->sharedContextId();
+ if (sharedContextId != SharedGpuContext::kNoSharedContext &&
+ sharedContextId != SharedGpuContext::contextId()) {
// Gpu context was lost and restored since the resource was created.
return false;
}
return true;
}
-bool AcceleratedStaticBitmapImage::imageBelongsToSharedContext() {
- return m_sharedContextId != SharedGpuContext::kNoSharedContext;
-}
-
void AcceleratedStaticBitmapImage::createImageFromMailboxIfNeeded() {
- if (imageBelongsToSharedContext())
+ if (m_textureHolder->sharedContextId() != SharedGpuContext::kNoSharedContext)
+ return;
+ if (m_textureHolder->isSkiaTextureHolder())
return;
- DCHECK(m_hasMailbox);
- gpu::gles2::GLES2Interface* sharedGL = SharedGpuContext::gl();
- GrContext* sharedGrContext = SharedGpuContext::gr();
- DCHECK(sharedGL &&
- sharedGrContext); // context isValid already checked in callers
-
- sharedGL->WaitSyncTokenCHROMIUM(m_syncToken.GetData());
- GLuint sharedContextTextureId =
- sharedGL->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, m_mailbox.name);
- GrGLTextureInfo textureInfo;
- textureInfo.fTarget = GL_TEXTURE_2D;
- textureInfo.fID = sharedContextTextureId;
- GrBackendTextureDesc backendTexture;
- backendTexture.fOrigin = kBottomLeft_GrSurfaceOrigin;
- backendTexture.fWidth = size().width();
- backendTexture.fHeight = size().height();
- backendTexture.fConfig = kSkia8888_GrPixelConfig;
- backendTexture.fTextureHandle =
- skia::GrGLTextureInfoToGrBackendObject(textureInfo);
-
- sk_sp<SkImage> newImage =
- SkImage::MakeFromAdoptedTexture(sharedGrContext, backendTexture);
- releaseImageThreadSafe();
- m_image = newImage;
-
- m_sharedContextId = SharedGpuContext::contextId();
+ m_textureHolder =
+ wrapUnique(new SkiaTextureHolder(std::move(m_textureHolder)));
}
void AcceleratedStaticBitmapImage::ensureMailbox() {
- if (m_hasMailbox)
+ if (m_textureHolder->isMailboxTextureHolder())
return;
- DCHECK(m_image);
-
- gpu::gles2::GLES2Interface* sharedGL = SharedGpuContext::gl();
- GrContext* sharedGrContext = SharedGpuContext::gr();
- if (!sharedGrContext) {
- // Can happen if the context is lost. The SkImage won't be any good now
- // anyway.
- return;
- }
- GLuint imageTextureId =
- skia::GrBackendObjectToGrGLTextureInfo(m_image->getTextureHandle(true))
- ->fID;
- sharedGL->BindTexture(GL_TEXTURE_2D, imageTextureId);
-
- sharedGL->GenMailboxCHROMIUM(m_mailbox.name);
- sharedGL->ProduceTextureCHROMIUM(GL_TEXTURE_2D, m_mailbox.name);
- const GLuint64 fenceSync = sharedGL->InsertFenceSyncCHROMIUM();
- sharedGL->Flush();
- sharedGL->GenSyncTokenCHROMIUM(fenceSync, m_syncToken.GetData());
-
- sharedGL->BindTexture(GL_TEXTURE_2D, 0);
- // We changed bound textures in this function, so reset the GrContext.
- sharedGrContext->resetContext(kTextureBinding_GrGLBackendState);
-
- m_hasMailbox = true;
+ m_textureHolder =
+ wrapUnique(new MailboxTextureHolder(std::move(m_textureHolder)));
}
void AcceleratedStaticBitmapImage::transfer() {
checkThread();
ensureMailbox();
- m_sharedContextId = SharedGpuContext::kNoSharedContext;
- // If |m_imageThread| is set, it means that the image has been consumed on the
- // current thread, which may happen when we have chained transfers. When that
- // is the case, we must not reset |m_imageThread|, so we ensure that
- // releaseImage() is called on the right thread.
- if (!m_imageThread)
- m_imageThread = Platform::current()->currentThread();
+ // If |m_textureThreadTaskRunner| in TextureHolder is set, it means that
+ // the |m_texture| in this class has been consumed on the current thread,
+ // which may happen when we have chained transfers. When that is the case,
+ // we must not reset |m_imageThreadTaskRunner|, so we ensure that
+ // releaseImage() or releaseTexture() is called on the right thread.
+ if (!m_textureHolder->wasTransferred()) {
+ WebThread* currentThread = Platform::current()->currentThread();
+ m_textureHolder->setWasTransferred(true);
+ m_textureHolder->setTextureThreadTaskRunner(
+ currentThread->getWebTaskRunner()->clone());
+ }
m_detachThreadAtNextCheck = true;
}
+bool AcceleratedStaticBitmapImage::currentFrameKnownToBeOpaque(
+ MetadataMode metadataMode) {
+ return m_textureHolder->currentFrameKnownToBeOpaque(metadataMode);
+}
+
void AcceleratedStaticBitmapImage::checkThread() {
if (m_detachThreadAtNextCheck) {
m_threadChecker.DetachFromThread();
@@ -216,31 +173,4 @@ void AcceleratedStaticBitmapImage::checkThread() {
CHECK(m_threadChecker.CalledOnValidThread());
}
-void releaseImage(sk_sp<SkImage>&& image,
- std::unique_ptr<gpu::SyncToken>&& syncToken) {
- if (SharedGpuContext::isValid() && syncToken->HasData())
- SharedGpuContext::gl()->WaitSyncTokenCHROMIUM(syncToken->GetData());
- image.reset();
-}
-
-void AcceleratedStaticBitmapImage::releaseImageThreadSafe() {
- // If m_image belongs to a GrContext that is on another thread, it
- // must be released on that thread.
- if (m_imageThread && m_image &&
- m_imageThread != Platform::current()->currentThread() &&
- SharedGpuContext::isValid()) {
- gpu::gles2::GLES2Interface* sharedGL = SharedGpuContext::gl();
- std::unique_ptr<gpu::SyncToken> releaseSyncToken(new gpu::SyncToken);
- const GLuint64 fenceSync = sharedGL->InsertFenceSyncCHROMIUM();
- sharedGL->Flush();
- sharedGL->GenSyncTokenCHROMIUM(fenceSync, releaseSyncToken->GetData());
- m_imageThread->getWebTaskRunner()->postTask(
- BLINK_FROM_HERE,
- crossThreadBind(&releaseImage, passed(std::move(m_image)),
- passed(std::move(releaseSyncToken))));
- }
- m_image = nullptr;
- m_imageThread = nullptr;
-}
-
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698