blob: 7bb5f01425b635a2944c82d447c66a8df8cdb6a2 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_SHARED_IMAGE_REPRESENTATION_H_
#define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_SHARED_IMAGE_REPRESENTATION_H_
#include <dawn/dawn_proc_table.h>
#include <dawn/webgpu.h>
#include <memory>
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/types/pass_key.h"
#include "build/build_config.h"
#include "gpu/command_buffer/service/shared_image/shared_image_backing.h"
#include "gpu/command_buffer/service/shared_image/shared_image_manager.h"
#include "gpu/gpu_gles2_export.h"
#include "third_party/skia/include/core/SkImage.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/gpu_fence.h"
#if BUILDFLAG(IS_WIN)
#include "ui/gl/dc_layer_overlay_image.h"
#endif
#if BUILDFLAG(IS_MAC)
#include "ui/gfx/mac/io_surface.h"
#endif
#if BUILDFLAG(IS_ANDROID)
#include "base/android/scoped_hardware_buffer_fence_sync.h"
extern "C" typedef struct AHardwareBuffer AHardwareBuffer;
#endif
#if BUILDFLAG(IS_WIN)
#include <d3d11.h>
#include <wrl/client.h>
#endif
typedef unsigned int GLenum;
class GrBackendSurfaceMutableState;
class SkPromiseImageTexture;
namespace cc {
class PaintOpBuffer;
} // namespace cc
namespace gfx {
class NativePixmap;
} // namespace gfx
namespace media {
class VASurface;
} // namespace media
namespace gpu {
class TextureBase;
namespace gles2 {
class Texture;
class TexturePassthrough;
} // namespace gles2
enum class RepresentationAccessMode {
kNone,
kRead,
kWrite,
};
// A representation of a SharedImageBacking for use with a specific use case /
// api.
class GPU_GLES2_EXPORT SharedImageRepresentation {
public:
using AccessMode = RepresentationAccessMode;
// Used by derived classes.
enum class AllowUnclearedAccess { kYes, kNo };
SharedImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker);
virtual ~SharedImageRepresentation();
viz::SharedImageFormat format() const { return backing_->format(); }
const gfx::Size& size() const { return backing_->size(); }
const gfx::ColorSpace& color_space() const { return backing_->color_space(); }
GrSurfaceOrigin surface_origin() const { return backing_->surface_origin(); }
SkAlphaType alpha_type() const { return backing_->alpha_type(); }
uint32_t usage() const { return backing_->usage(); }
const gpu::Mailbox& mailbox() const { return backing_->mailbox(); }
MemoryTypeTracker* tracker() { return tracker_; }
bool IsCleared() const { return backing_->IsCleared(); }
void SetCleared() { backing_->SetCleared(); }
gfx::Rect ClearedRect() const { return backing_->ClearedRect(); }
void SetClearedRect(const gfx::Rect& cleared_rect) {
backing_->SetClearedRect(cleared_rect);
}
// Indicates that the underlying graphics context has been lost, and the
// backing should be treated as destroyed.
void OnContextLost() {
has_context_ = false;
backing_->OnContextLost();
}
// Returns the number of image planes expected based on the backing format.
size_t NumPlanesExpected() const;
protected:
SharedImageManager* manager() const { return manager_; }
SharedImageBacking* backing() const { return backing_; }
bool has_context() const { return has_context_; }
// Helper class for derived classes' Scoped*Access objects. Has tracking to
// ensure a Scoped*Access does not outlive the representation it's associated
// with.
template <typename RepresentationClass>
class ScopedAccessBase {
public:
ScopedAccessBase(RepresentationClass* representation)
: representation_(representation) {
DCHECK(!representation_->has_scoped_access_);
representation_->has_scoped_access_ = true;
}
ScopedAccessBase(const ScopedAccessBase&) = delete;
ScopedAccessBase& operator=(const ScopedAccessBase&) = delete;
~ScopedAccessBase() {
DCHECK(representation_->has_scoped_access_);
representation_->has_scoped_access_ = false;
}
RepresentationClass* representation() { return representation_; }
const RepresentationClass* representation() const {
return representation_;
}
private:
const raw_ptr<RepresentationClass> representation_;
};
private:
const raw_ptr<SharedImageManager, DanglingUntriaged> manager_;
raw_ptr<SharedImageBacking> backing_;
const raw_ptr<MemoryTypeTracker> tracker_;
bool has_context_ = true;
bool has_scoped_access_ = false;
};
class SharedImageRepresentationFactoryRef : public SharedImageRepresentation {
public:
SharedImageRepresentationFactoryRef(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: SharedImageRepresentation(manager, backing, tracker) {}
~SharedImageRepresentationFactoryRef() override;
const Mailbox& mailbox() const { return backing()->mailbox(); }
void Update(std::unique_ptr<gfx::GpuFence> in_fence) {
backing()->Update(std::move(in_fence));
backing()->OnWriteSucceeded();
}
bool CopyToGpuMemoryBuffer() { return backing()->CopyToGpuMemoryBuffer(); }
bool PresentSwapChain() { return backing()->PresentSwapChain(); }
void RegisterImageFactory(SharedImageFactory* factory) {
backing()->RegisterImageFactory(factory);
}
};
class GPU_GLES2_EXPORT GLTextureImageRepresentationBase
: public SharedImageRepresentation {
public:
static constexpr GLenum kReadAccessMode = 0x8AF6;
class ScopedAccess
: public ScopedAccessBase<GLTextureImageRepresentationBase> {
public:
ScopedAccess(base::PassKey<GLTextureImageRepresentationBase> pass_key,
GLTextureImageRepresentationBase* representation)
: ScopedAccessBase(representation) {}
~ScopedAccess() {
representation()->UpdateClearedStateOnEndAccess();
representation()->EndAccess();
}
};
GLTextureImageRepresentationBase(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: SharedImageRepresentation(manager, backing, tracker) {}
std::unique_ptr<ScopedAccess> BeginScopedAccess(
GLenum mode,
AllowUnclearedAccess allow_uncleared);
// Gets the texture associated with the `plane_index` for SharedImageFormat.
virtual gpu::TextureBase* GetTextureBase(int plane_index) = 0;
// Calls GetTextureBase with `plane_index` = 0 for single planar formats eg.
// RGB.
gpu::TextureBase* GetTextureBase();
protected:
friend class SkiaGLImageRepresentation;
friend class DawnEGLImageRepresentation;
friend class GLTextureGLCommonRepresentation;
// Can be overridden to handle clear state tracking when GL access begins or
// ends.
virtual void UpdateClearedStateOnBeginAccess() {}
virtual void UpdateClearedStateOnEndAccess() {}
// TODO(ericrk): Make these pure virtual and ensure real implementations
// exist.
virtual bool BeginAccess(GLenum mode);
virtual void EndAccess() {}
virtual bool SupportsMultipleConcurrentReadAccess();
};
class GPU_GLES2_EXPORT GLTextureImageRepresentation
: public GLTextureImageRepresentationBase {
public:
GLTextureImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: GLTextureImageRepresentationBase(manager, backing, tracker) {}
// TODO(ericrk): Move this to the ScopedAccess object. crbug.com/1003686
// Gets the texture associated with the `plane_index` for SharedImageFormat.
virtual gles2::Texture* GetTexture(int plane_index) = 0;
// Calls GetTexture with `plane_index` = 0 for single planar formats eg. RGB.
gles2::Texture* GetTexture();
gpu::TextureBase* GetTextureBase(int plane_index) override;
protected:
friend class WrappedGLTextureCompoundImageRepresentation;
void UpdateClearedStateOnBeginAccess() override;
void UpdateClearedStateOnEndAccess() override;
};
class GPU_GLES2_EXPORT GLTexturePassthroughImageRepresentation
: public GLTextureImageRepresentationBase {
public:
GLTexturePassthroughImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: GLTextureImageRepresentationBase(manager, backing, tracker) {}
// TODO(ericrk): Move this to the ScopedAccess object. crbug.com/1003686
// Gets the passthrough texture associated with the `plane_index` for
// SharedImageFormat.
virtual const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
int plane_index) = 0;
// Calls GetTexturePassthrough with `plane_index` = 0 for single planar
// formats eg. RGB.
const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough();
gpu::TextureBase* GetTextureBase(int plane_index) override;
private:
friend class WrappedGLTexturePassthroughCompoundImageRepresentation;
};
class GPU_GLES2_EXPORT SkiaImageRepresentation
: public SharedImageRepresentation {
public:
class GPU_GLES2_EXPORT ScopedWriteAccess
: public ScopedAccessBase<SkiaImageRepresentation> {
public:
ScopedWriteAccess(base::PassKey<SkiaImageRepresentation> pass_key,
SkiaImageRepresentation* representation,
std::vector<sk_sp<SkSurface>> surfaces,
std::unique_ptr<GrBackendSurfaceMutableState> end_state);
ScopedWriteAccess(
base::PassKey<SkiaImageRepresentation> pass_key,
SkiaImageRepresentation* representation,
std::vector<sk_sp<SkPromiseImageTexture>> promise_image_textures,
std::unique_ptr<GrBackendSurfaceMutableState> end_state);
~ScopedWriteAccess();
// NOTE: All references to the returned SkSurface(s) must be destroyed
// before ScopedWriteAccess is destroyed.
SkSurface* surface() const {
DCHECK(representation()->format().is_single_plane());
return surface(0);
}
SkSurface* surface(int plane_index) const {
return surfaces_[plane_index].get();
}
SkPromiseImageTexture* promise_image_texture() const {
DCHECK(representation()->format().is_single_plane());
return promise_image_texture(0);
}
SkPromiseImageTexture* promise_image_texture(int plane_index) const {
return promise_image_textures_[plane_index].get();
}
[[nodiscard]] std::unique_ptr<GrBackendSurfaceMutableState> TakeEndState();
private:
// A vector of surfaces and promise textures corresponding to the number of
// planes in SharedImageFormat.
std::vector<sk_sp<SkSurface>> surfaces_;
std::vector<sk_sp<SkPromiseImageTexture>> promise_image_textures_;
std::unique_ptr<GrBackendSurfaceMutableState> end_state_;
};
class GPU_GLES2_EXPORT ScopedReadAccess
: public ScopedAccessBase<SkiaImageRepresentation> {
public:
ScopedReadAccess(
base::PassKey<SkiaImageRepresentation> pass_key,
SkiaImageRepresentation* representation,
std::vector<sk_sp<SkPromiseImageTexture>> promise_image_textures,
std::unique_ptr<GrBackendSurfaceMutableState> end_state);
~ScopedReadAccess();
SkPromiseImageTexture* promise_image_texture() const {
DCHECK(representation()->format().is_single_plane());
return promise_image_texture(0);
}
SkPromiseImageTexture* promise_image_texture(int plane_index) const {
return promise_image_textures_[plane_index].get();
}
sk_sp<SkImage> CreateSkImage(
GrDirectContext* context,
SkImage::TextureReleaseProc texture_release_proc = nullptr,
SkImage::ReleaseContext release_context = nullptr) const;
[[nodiscard]] std::unique_ptr<GrBackendSurfaceMutableState> TakeEndState();
private:
// A vector of promise textures corresponding to the number of planes in
// SharedImageFormat.
std::vector<sk_sp<SkPromiseImageTexture>> promise_image_textures_;
std::unique_ptr<GrBackendSurfaceMutableState> end_state_;
};
SkiaImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: SharedImageRepresentation(manager, backing, tracker) {}
// Note: See BeginWriteAccess below for a description of the semaphore
// parameters.
std::unique_ptr<ScopedWriteAccess> BeginScopedWriteAccess(
int final_msaa_count,
const SkSurfaceProps& surface_props,
const gfx::Rect& update_rect,
std::vector<GrBackendSemaphore>* begin_semaphores,
std::vector<GrBackendSemaphore>* end_semaphores,
AllowUnclearedAccess allow_uncleared,
bool use_sk_surface = true);
std::unique_ptr<ScopedWriteAccess> BeginScopedWriteAccess(
int final_msaa_count,
const SkSurfaceProps& surface_props,
std::vector<GrBackendSemaphore>* begin_semaphores,
std::vector<GrBackendSemaphore>* end_semaphores,
AllowUnclearedAccess allow_uncleared,
bool use_sk_surface = true);
std::unique_ptr<ScopedWriteAccess> BeginScopedWriteAccess(
std::vector<GrBackendSemaphore>* begin_semaphores,
std::vector<GrBackendSemaphore>* end_semaphores,
AllowUnclearedAccess allow_uncleared,
bool use_sk_surface = true);
// Note: See BeginReadAccess below for a description of the semaphore
// parameters.
std::unique_ptr<ScopedReadAccess> BeginScopedReadAccess(
std::vector<GrBackendSemaphore>* begin_semaphores,
std::vector<GrBackendSemaphore>* end_semaphores);
virtual bool SupportsMultipleConcurrentReadAccess();
protected:
friend class WrappedSkiaCompoundImageRepresentation;
// Begin the write access.
//
// update_rect is a hint to the backend about the portion of the image that
// will be drawn to. Callers shouldn't draw outside of this area, but aren't
// required to overwrite every pixel inside it.
//
// The implementations should insert semaphores into begin_semaphores vector
// which client will wait on before writing the backing. The ownership of
// begin_semaphores is not passed to client. The implementations can also
// optionally insert semaphores into end_semaphores. If using end_semaphores,
// the client must submit them with drawing operations which use the backing.
// The ownership of end_semaphores are not passed to client. And client must
// submit the end_semaphores before calling EndWriteAccess().
//
// The backing can assign end_state, and the caller must reset backing's state
// to the end_state before calling EndWriteAccess().
// Returns an empty vector on failure.
virtual std::vector<sk_sp<SkSurface>> BeginWriteAccess(
int final_msaa_count,
const SkSurfaceProps& surface_props,
const gfx::Rect& update_rect,
std::vector<GrBackendSemaphore>* begin_semaphores,
std::vector<GrBackendSemaphore>* end_semaphores,
std::unique_ptr<GrBackendSurfaceMutableState>* end_state) = 0;
virtual std::vector<sk_sp<SkPromiseImageTexture>> BeginWriteAccess(
std::vector<GrBackendSemaphore>* begin_semaphores,
std::vector<GrBackendSemaphore>* end_semaphores,
std::unique_ptr<GrBackendSurfaceMutableState>* end_state) = 0;
virtual void EndWriteAccess() = 0;
// Begin the read access. The implementations should insert semaphores into
// begin_semaphores vector which client will wait on before reading the
// backing. The ownership of begin_semaphores is not passed to client.
// The implementations can also optionally insert semaphores into
// end_semaphores. If using end_semaphores, the client must submit them with
// drawing operations which use the backing. The ownership of end_semaphores
// are not passed to client. And client must submit the end_semaphores before
// calling EndReadAccess().
// The backing can assign end_state, and the caller must reset backing's state
// to the end_state before calling EndReadAccess().
// Returns an empty vector on failure.
virtual std::vector<sk_sp<SkPromiseImageTexture>> BeginReadAccess(
std::vector<GrBackendSemaphore>* begin_semaphores,
std::vector<GrBackendSemaphore>* end_semaphores,
std::unique_ptr<GrBackendSurfaceMutableState>* end_state) = 0;
virtual void EndReadAccess() = 0;
};
class GPU_GLES2_EXPORT DawnImageRepresentation
: public SharedImageRepresentation {
public:
static constexpr uint32_t kWriteUsage =
WGPUTextureUsage_CopyDst | WGPUTextureUsage_RenderAttachment;
DawnImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: SharedImageRepresentation(manager, backing, tracker) {}
class GPU_GLES2_EXPORT ScopedAccess
: public ScopedAccessBase<DawnImageRepresentation> {
public:
ScopedAccess(base::PassKey<DawnImageRepresentation> pass_key,
DawnImageRepresentation* representation,
WGPUTexture texture);
~ScopedAccess();
// Get the unowned texture handle. The caller should take a reference
// if necessary by doing wgpu::Texture texture(access->texture());
WGPUTexture texture() const { return texture_; }
private:
WGPUTexture texture_ = 0;
};
// Calls BeginAccess and returns a ScopedAccess object which will EndAccess
// when it goes out of scope. The Representation must outlive the returned
// ScopedAccess.
std::unique_ptr<ScopedAccess> BeginScopedAccess(
WGPUTextureUsage usage,
AllowUnclearedAccess allow_uncleared);
private:
friend class WrappedDawnCompoundImageRepresentation;
// This can return null in case of a Dawn validation error, for example if
// usage is invalid.
virtual WGPUTexture BeginAccess(WGPUTextureUsage usage) = 0;
virtual void EndAccess() = 0;
};
class GPU_GLES2_EXPORT OverlayImageRepresentation
: public SharedImageRepresentation {
public:
OverlayImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: SharedImageRepresentation(manager, backing, tracker) {}
class GPU_GLES2_EXPORT ScopedReadAccess
: public ScopedAccessBase<OverlayImageRepresentation> {
public:
ScopedReadAccess(base::PassKey<OverlayImageRepresentation> pass_key,
OverlayImageRepresentation* representation,
gfx::GpuFenceHandle acquire_fence);
~ScopedReadAccess();
#if BUILDFLAG(IS_ANDROID)
AHardwareBuffer* GetAHardwareBuffer() {
return representation()->GetAHardwareBuffer();
}
// Deprecated. All code should use GetAHardwareBuffer() above, this function
// will be deleted when GLSurfaceEGLSurface control will be able to deliver
// fences via EndAccess.
std::unique_ptr<base::android::ScopedHardwareBufferFenceSync>
GetAHardwareBufferFenceSync() {
return representation()->GetAHardwareBufferFenceSync();
}
#elif BUILDFLAG(IS_OZONE)
scoped_refptr<gfx::NativePixmap> GetNativePixmap() {
return representation()->GetNativePixmap();
}
#elif BUILDFLAG(IS_WIN)
absl::optional<gl::DCLayerOverlayImage> GetDCLayerOverlayImage() {
return representation()->GetDCLayerOverlayImage();
}
#elif BUILDFLAG(IS_MAC)
gfx::ScopedIOSurface GetIOSurface() const {
return representation()->GetIOSurface();
}
bool IsInUseByWindowServer() const {
return representation()->IsInUseByWindowServer();
}
#endif
gfx::GpuFenceHandle TakeAcquireFence() { return std::move(acquire_fence_); }
void SetReleaseFence(gfx::GpuFenceHandle release_fence) {
// Note: We overwrite previous fence. In case if window manager uses fence
// for each frame we schedule overlay and the same image is scheduled for
// multiple frames this will be updated after each frame. It's safe to
// wait only for the last frame's fence.
release_fence_ = std::move(release_fence);
}
private:
gfx::GpuFenceHandle acquire_fence_;
gfx::GpuFenceHandle release_fence_;
};
std::unique_ptr<ScopedReadAccess> BeginScopedReadAccess();
protected:
friend class WrappedOverlayCompoundImageRepresentation;
// Notifies the backing that an access will start. Returns false if there is a
// conflict. Otherwise, returns true and:
// - Set a gpu fence to |acquire_fence| that should be waited on before the
// SharedImage is ready to be displayed. This fence is fired when the gpu
// has finished writing.
virtual bool BeginReadAccess(gfx::GpuFenceHandle& acquire_fence) = 0;
// |release_fence| is a fence that will be signaled when the image can be
// safely re-used. Note, on some platforms window manager doesn't support
// release fences and return image when it's already safe to re-use.
// |release_fence| will be null in that case.
virtual void EndReadAccess(gfx::GpuFenceHandle release_fence) = 0;
#if BUILDFLAG(IS_ANDROID)
virtual AHardwareBuffer* GetAHardwareBuffer();
virtual std::unique_ptr<base::android::ScopedHardwareBufferFenceSync>
GetAHardwareBufferFenceSync();
#elif BUILDFLAG(IS_OZONE)
scoped_refptr<gfx::NativePixmap> GetNativePixmap();
#elif BUILDFLAG(IS_WIN)
virtual absl::optional<gl::DCLayerOverlayImage> GetDCLayerOverlayImage();
#elif BUILDFLAG(IS_MAC)
virtual gfx::ScopedIOSurface GetIOSurface() const;
// Return true if the macOS WindowServer is currently using the underlying
// storage for the image.
virtual bool IsInUseByWindowServer() const;
#endif
};
#if BUILDFLAG(IS_ANDROID)
class GPU_GLES2_EXPORT LegacyOverlayImageRepresentation
: public SharedImageRepresentation {
public:
LegacyOverlayImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: SharedImageRepresentation(manager, backing, tracker) {}
// Renders shared image to SurfaceView/Dialog overlay. Should only be called
// if the image already promoted to overlay.
virtual void RenderToOverlay() = 0;
// Notifies legacy overlay system about overlay promotion.
virtual void NotifyOverlayPromotion(bool promotion,
const gfx::Rect& bounds) = 0;
};
#endif
class GPU_GLES2_EXPORT MemoryImageRepresentation
: public SharedImageRepresentation {
public:
class GPU_GLES2_EXPORT ScopedReadAccess
: public ScopedAccessBase<MemoryImageRepresentation> {
public:
ScopedReadAccess(base::PassKey<MemoryImageRepresentation> pass_key,
MemoryImageRepresentation* representation,
SkPixmap pixmap);
~ScopedReadAccess();
SkPixmap pixmap() { return pixmap_; }
private:
SkPixmap pixmap_;
};
MemoryImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: SharedImageRepresentation(manager, backing, tracker) {}
std::unique_ptr<ScopedReadAccess> BeginScopedReadAccess();
protected:
virtual SkPixmap BeginReadAccess() = 0;
};
// An interface that allows a SharedImageBacking to hold a reference to VA-API
// surface without depending on //media/gpu/vaapi targets.
class VaapiDependencies {
public:
virtual ~VaapiDependencies() = default;
virtual const media::VASurface* GetVaSurface() const = 0;
virtual bool SyncSurface() = 0;
};
// Interface that allows a SharedImageBacking to create VaapiDependencies from a
// NativePixmap without depending on //media/gpu/vaapi targets.
class VaapiDependenciesFactory {
public:
virtual ~VaapiDependenciesFactory() = default;
// Returns a VaapiDependencies or nullptr on failure.
virtual std::unique_ptr<VaapiDependencies> CreateVaapiDependencies(
scoped_refptr<gfx::NativePixmap> pixmap) = 0;
};
// Representation of a SharedImageBacking as a VA-API surface.
// This representation is currently only supported by OzoneImageBacking.
//
// Synchronized access is currently not required in this representation because:
//
// For reads:
// We will be using this for the destination of decoding work, so no read access
// synchronization is needed from the point of view of the VA-API.
//
// For writes:
// Because of the design of the current video pipeline, we don't start the
// decoding work until we're sure that the destination buffer is not being used
// by the rest of the pipeline. However, we still need to keep track of write
// accesses so that other representations can synchronize with the decoder.
class GPU_GLES2_EXPORT VaapiImageRepresentation
: public SharedImageRepresentation {
public:
class GPU_GLES2_EXPORT ScopedWriteAccess
: public ScopedAccessBase<VaapiImageRepresentation> {
public:
ScopedWriteAccess(base::PassKey<VaapiImageRepresentation> pass_key,
VaapiImageRepresentation* representation);
~ScopedWriteAccess();
const media::VASurface* va_surface();
};
VaapiImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker,
VaapiDependencies* vaapi_dependency);
~VaapiImageRepresentation() override;
std::unique_ptr<ScopedWriteAccess> BeginScopedWriteAccess();
private:
friend class WrappedVaapiRepresentation;
raw_ptr<VaapiDependencies> vaapi_deps_;
virtual void EndAccess() = 0;
virtual void BeginAccess() = 0;
};
// Representation of a SharedImageBacking for raster work.
// This representation is used for raster work and compositor. The raster work
// will be converted to a cc::PaintOpBuffer and stored in the
// SharedImageBacking. And then the the compositor will access the stored
// cc::PaintOpBuffer and execute paint ops in it.
class GPU_GLES2_EXPORT RasterImageRepresentation
: public SharedImageRepresentation {
public:
class GPU_GLES2_EXPORT ScopedReadAccess
: public ScopedAccessBase<RasterImageRepresentation> {
public:
ScopedReadAccess(base::PassKey<RasterImageRepresentation> pass_key,
RasterImageRepresentation* representation,
const cc::PaintOpBuffer* paint_op_buffer,
const absl::optional<SkColor4f>& clear_color);
~ScopedReadAccess();
const cc::PaintOpBuffer* paint_op_buffer() const {
return paint_op_buffer_;
}
const absl::optional<SkColor4f>& clear_color() const {
return clear_color_;
}
private:
const raw_ptr<const cc::PaintOpBuffer> paint_op_buffer_;
absl::optional<SkColor4f> clear_color_;
};
class GPU_GLES2_EXPORT ScopedWriteAccess
: public ScopedAccessBase<RasterImageRepresentation> {
public:
ScopedWriteAccess(base::PassKey<RasterImageRepresentation> pass_key,
RasterImageRepresentation* representation,
cc::PaintOpBuffer* paint_op_buffer);
~ScopedWriteAccess();
cc::PaintOpBuffer* paint_op_buffer() { return paint_op_buffer_; }
// An optional callback which will be called when the all paint ops in the
// |paint_op_buffer_| are released.
void set_callback(base::OnceClosure callback) {
DCHECK(!callback_);
DCHECK(callback);
callback_ = std::move(callback);
}
private:
const raw_ptr<cc::PaintOpBuffer> paint_op_buffer_;
base::OnceClosure callback_;
};
RasterImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: SharedImageRepresentation(manager, backing, tracker) {}
std::unique_ptr<ScopedReadAccess> BeginScopedReadAccess();
std::unique_ptr<ScopedWriteAccess> BeginScopedWriteAccess(
scoped_refptr<SharedContextState> context_state,
int final_msaa_count,
const SkSurfaceProps& surface_props,
const absl::optional<SkColor4f>& clear_color,
bool visible);
protected:
virtual cc::PaintOpBuffer* BeginReadAccess(
absl::optional<SkColor4f>& clear_color) = 0;
virtual void EndReadAccess() = 0;
virtual cc::PaintOpBuffer* BeginWriteAccess(
scoped_refptr<SharedContextState> context_state,
int final_msaa_count,
const SkSurfaceProps& surface_props,
const absl::optional<SkColor4f>& clear_color,
bool visible) = 0;
virtual void EndWriteAccess(base::OnceClosure callback) = 0;
};
class GPU_GLES2_EXPORT VideoDecodeImageRepresentation
: public SharedImageRepresentation {
public:
class GPU_GLES2_EXPORT ScopedWriteAccess
: public ScopedAccessBase<VideoDecodeImageRepresentation> {
public:
ScopedWriteAccess(base::PassKey<VideoDecodeImageRepresentation> pass_key,
VideoDecodeImageRepresentation* representation);
~ScopedWriteAccess();
#if BUILDFLAG(IS_WIN)
Microsoft::WRL::ComPtr<ID3D11Texture2D> GetD3D11Texture() const {
return representation()->GetD3D11Texture();
}
#endif // BUILDFLAG(IS_WIN)
};
VideoDecodeImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker);
~VideoDecodeImageRepresentation() override;
virtual std::unique_ptr<ScopedWriteAccess> BeginScopedWriteAccess();
protected:
#if BUILDFLAG(IS_WIN)
virtual Microsoft::WRL::ComPtr<ID3D11Texture2D> GetD3D11Texture() const = 0;
#endif // BUILDFLAG(IS_WIN)
virtual bool BeginWriteAccess() = 0;
virtual void EndWriteAccess() = 0;
};
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_SHARED_IMAGE_REPRESENTATION_H_