#ifndef UI_GL_DC_LAYER_OVERLAY_IMAGE_H_
#define UI_GL_DC_LAYER_OVERLAY_IMAGE_H_
#include "ui/gl/gl_export.h"
#include <wrl/client.h>
#include "ui/gl/dcomp_surface_proxy.h"
class ID3D11Texture2D;
class IDCompositionSurface;
class IDXGIKeyedMutex;
class IDXGISwapChain1;
class IUnknown;
namespace gl {
enum class DCLayerOverlayType {
kNV12Texture,
kNV12Pixmap,
kDCompVisualContent,
kDCompSurfaceProxy,
};
GL_EXPORT const char* DCLayerOverlayTypeToString(
DCLayerOverlayType overlay_type);
class GL_EXPORT DCLayerOverlayImage {
public:
DCLayerOverlayImage(
const gfx::Size& size,
Microsoft::WRL::ComPtr<ID3D11Texture2D> nv12_texture,
size_t array_slice = 0u,
Microsoft::WRL::ComPtr<IDXGIKeyedMutex> keyed_mutex = nullptr);
DCLayerOverlayImage(const gfx::Size& size,
const uint8_t* nv12_pixmap,
size_t stride);
DCLayerOverlayImage(const gfx::Size& size,
Microsoft::WRL::ComPtr<IUnknown> dcomp_visual_content,
uint64_t dcomp_surface_serial = 0u);
DCLayerOverlayImage(const gfx::Size& size,
scoped_refptr<gl::DCOMPSurfaceProxy> dcomp_surface_proxy);
DCLayerOverlayImage(DCLayerOverlayImage&&);
DCLayerOverlayImage& operator=(DCLayerOverlayImage&&);
~DCLayerOverlayImage();
DCLayerOverlayType type() const { return type_; }
const gfx::Size& size() const { return size_; }
ID3D11Texture2D* nv12_texture() const { return nv12_texture_.Get(); }
size_t texture_array_slice() const { return texture_array_slice_; }
IDXGIKeyedMutex* keyed_mutex() const { return keyed_mutex_.Get(); }
const uint8_t* nv12_pixmap() const { return nv12_pixmap_; }
size_t pixmap_stride() const { return pixmap_stride_; }
IUnknown* dcomp_visual_content() const { return dcomp_visual_content_.Get(); }
uint64_t dcomp_surface_serial() const { return dcomp_surface_serial_; }
gl::DCOMPSurfaceProxy* dcomp_surface_proxy() const {
return dcomp_surface_proxy_.get();
}
bool operator==(const DCLayerOverlayImage& other) const {
return std::tie(type_, size_, nv12_texture_, texture_array_slice_,
keyed_mutex_, nv12_pixmap_, pixmap_stride_,
dcomp_visual_content_, dcomp_surface_serial_,
dcomp_surface_proxy_) ==
std::tie(other.type_, other.size_, other.nv12_texture_,
other.texture_array_slice_, other.keyed_mutex_,
other.nv12_pixmap_, other.pixmap_stride_,
other.dcomp_visual_content_, other.dcomp_surface_serial_,
other.dcomp_surface_proxy_);
}
private:
DCLayerOverlayType type_;
gfx::Size size_;
Microsoft::WRL::ComPtr<ID3D11Texture2D> nv12_texture_;
size_t texture_array_slice_ = 0;
Microsoft::WRL::ComPtr<IDXGIKeyedMutex> keyed_mutex_;
const uint8_t* nv12_pixmap_ = nullptr;
size_t pixmap_stride_ = 0;
Microsoft::WRL::ComPtr<IUnknown> dcomp_visual_content_;
uint64_t dcomp_surface_serial_ = 0;
scoped_refptr<gl::DCOMPSurfaceProxy> dcomp_surface_proxy_;
};
}
#endif