blob: cf1b1a41aacd432d637bb098e438ad2cb3478f92 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef AcceleratedStaticBitmapImage_h
#define AcceleratedStaticBitmapImage_h
#include "base/threading/thread_checker.h"
#include "platform/geometry/IntSize.h"
#include "platform/graphics/StaticBitmapImage.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include <memory>
class GrContext;
namespace cc {
class SingleReleaseCallback;
}
namespace blink {
class WebThread;
class PLATFORM_EXPORT AcceleratedStaticBitmapImage final : public StaticBitmapImage {
public:
// SkImage with a texture backing that is assumed to be from the shared context of the current thread.
static PassRefPtr<AcceleratedStaticBitmapImage> createFromSharedContextImage(sk_sp<SkImage>);
// Can specify the GrContext that created the texture backing the for the given SkImage. Ideally all callers would use this option.
// The |mailbox| is a name for the texture backing the SkImage, allowing other contexts to use the same backing.
static PassRefPtr<AcceleratedStaticBitmapImage> createFromWebGLContextImage(sk_sp<SkImage>, const gpu::Mailbox&, const gpu::SyncToken&);
~AcceleratedStaticBitmapImage() override;
// StaticBitmapImage overrides.
sk_sp<SkImage> imageForCurrentFrame() override;
void copyToTexture(WebGraphicsContext3DProvider*, GLuint destTextureId, GLenum destInternalFormat, GLenum destType, bool flipY) override;
// Image overrides.
void draw(SkCanvas*, const SkPaint&, const FloatRect& dstRect, const FloatRect& srcRect, RespectImageOrientationEnum, ImageClampingMode) override;
// To be called on sender thread before performing a transfer
void transfer() final;
void ensureMailbox() final;
gpu::Mailbox getMailbox() final { return m_mailbox; }
gpu::SyncToken getSyncToken() final { return m_syncToken; }
private:
AcceleratedStaticBitmapImage(sk_sp<SkImage>);
AcceleratedStaticBitmapImage(sk_sp<SkImage>, const gpu::Mailbox&, const gpu::SyncToken&);
void createImageFromMailboxIfNeeded();
void checkThread();
void waitSyncTokenIfNeeded();
bool isValid();
void releaseImageThreadSafe();
bool imageBelongsToSharedContext();
// Id of the shared context where m_image was created
unsigned m_sharedContextId;
// True when the below mailbox and sync token are valid for getting at the texture backing the object's SkImage.
bool m_hasMailbox = false;
// A mailbox referring to the texture id backing the SkImage. The mailbox is valid as long as the SkImage is held alive.
gpu::Mailbox m_mailbox;
// This token must be waited for before using the mailbox.
gpu::SyncToken m_syncToken;
// Thread that m_image belongs to. Set to null when m_image belong to the same thread
// as this AcceleratedStaticBitmapImage. Should only be non-null after a transfer.
WebThread* m_imageThread = nullptr;
base::ThreadChecker m_threadChecker;
bool m_detachThreadAtNextCheck = false;
};
} // namespace blink
#endif