summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/include/gpu/GrBackendSurface.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/include/gpu/GrBackendSurface.h')
-rw-r--r--gfx/skia/skia/include/gpu/GrBackendSurface.h666
1 files changed, 666 insertions, 0 deletions
diff --git a/gfx/skia/skia/include/gpu/GrBackendSurface.h b/gfx/skia/skia/include/gpu/GrBackendSurface.h
new file mode 100644
index 0000000000..e196cb9272
--- /dev/null
+++ b/gfx/skia/skia/include/gpu/GrBackendSurface.h
@@ -0,0 +1,666 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrBackendSurface_DEFINED
+#define GrBackendSurface_DEFINED
+
+// This include of GrBackendSurfaceMutableState is not needed here, but some clients were depending
+// on the include here instead of including it themselves. Adding this back here until we can fix
+// up clients so it can be removed.
+#include "include/gpu/GrBackendSurfaceMutableState.h"
+
+#include "include/gpu/GrSurfaceInfo.h"
+#include "include/gpu/GrTypes.h"
+#include "include/gpu/MutableTextureState.h"
+#ifdef SK_GL
+#include "include/gpu/gl/GrGLTypes.h"
+#include "include/private/gpu/ganesh/GrGLTypesPriv.h"
+#endif
+#include "include/gpu/mock/GrMockTypes.h"
+#ifdef SK_VULKAN
+#include "include/gpu/vk/GrVkTypes.h"
+#include "include/private/gpu/ganesh/GrVkTypesPriv.h"
+#endif
+
+#ifdef SK_DAWN
+#include "include/gpu/dawn/GrDawnTypes.h"
+#endif
+
+#include <string>
+
+class GrVkImageLayout;
+class GrGLTextureParameters;
+class GrColorFormatDesc;
+enum class SkTextureCompressionType;
+
+namespace skgpu {
+class MutableTextureStateRef;
+}
+
+#ifdef SK_DAWN
+#include "webgpu/webgpu_cpp.h"
+#endif
+
+#ifdef SK_METAL
+#include "include/gpu/mtl/GrMtlTypes.h"
+#endif
+
+#ifdef SK_DIRECT3D
+#include "include/private/gpu/ganesh/GrD3DTypesMinimal.h"
+class GrD3DResourceState;
+#endif
+
+#if defined(SK_DEBUG) || GR_TEST_UTILS
+class SkString;
+#endif
+
+#if !defined(SK_GANESH)
+
+// SkSurfaceCharacterization always needs a minimal version of this
+class SK_API GrBackendFormat {
+public:
+ bool isValid() const { return false; }
+};
+
+// SkSurface and SkImage rely on a minimal version of these always being available
+class SK_API GrBackendTexture {
+public:
+ GrBackendTexture() {}
+
+ bool isValid() const { return false; }
+};
+
+class SK_API GrBackendRenderTarget {
+public:
+ GrBackendRenderTarget() {}
+
+ bool isValid() const { return false; }
+ bool isFramebufferOnly() const { return false; }
+};
+#else
+
+enum class GrGLFormat;
+
+class SK_API GrBackendFormat {
+public:
+ // Creates an invalid backend format.
+ GrBackendFormat() {}
+ GrBackendFormat(const GrBackendFormat&);
+ GrBackendFormat& operator=(const GrBackendFormat&);
+
+#ifdef SK_GL
+ static GrBackendFormat MakeGL(GrGLenum format, GrGLenum target) {
+ return GrBackendFormat(format, target);
+ }
+#endif
+
+#ifdef SK_VULKAN
+ static GrBackendFormat MakeVk(VkFormat format, bool willUseDRMFormatModifiers = false) {
+ return GrBackendFormat(format, GrVkYcbcrConversionInfo(), willUseDRMFormatModifiers);
+ }
+
+ static GrBackendFormat MakeVk(const GrVkYcbcrConversionInfo& ycbcrInfo,
+ bool willUseDRMFormatModifiers = false);
+#endif
+
+#ifdef SK_DAWN
+ static GrBackendFormat MakeDawn(wgpu::TextureFormat format) {
+ return GrBackendFormat(format);
+ }
+#endif
+
+#ifdef SK_METAL
+ static GrBackendFormat MakeMtl(GrMTLPixelFormat format) {
+ return GrBackendFormat(format);
+ }
+#endif
+
+#ifdef SK_DIRECT3D
+ static GrBackendFormat MakeDxgi(DXGI_FORMAT format) {
+ return GrBackendFormat(format);
+ }
+#endif
+
+ static GrBackendFormat MakeMock(GrColorType colorType, SkTextureCompressionType compression,
+ bool isStencilFormat = false);
+
+ bool operator==(const GrBackendFormat& that) const;
+ bool operator!=(const GrBackendFormat& that) const { return !(*this == that); }
+
+ GrBackendApi backend() const { return fBackend; }
+ GrTextureType textureType() const { return fTextureType; }
+
+ /**
+ * Gets the channels present in the format as a bitfield of SkColorChannelFlag values.
+ * Luminance channels are reported as kGray_SkColorChannelFlag.
+ */
+ uint32_t channelMask() const;
+
+ GrColorFormatDesc desc() const;
+
+#ifdef SK_GL
+ /**
+ * If the backend API is GL this gets the format as a GrGLFormat. Otherwise, returns
+ * GrGLFormat::kUnknown.
+ */
+ GrGLFormat asGLFormat() const;
+
+ GrGLenum asGLFormatEnum() const;
+#endif
+
+#ifdef SK_VULKAN
+ /**
+ * If the backend API is Vulkan this gets the format as a VkFormat and returns true. Otherwise,
+ * returns false.
+ */
+ bool asVkFormat(VkFormat*) const;
+
+ const GrVkYcbcrConversionInfo* getVkYcbcrConversionInfo() const;
+#endif
+
+#ifdef SK_DAWN
+ /**
+ * If the backend API is Dawn this gets the format as a wgpu::TextureFormat and returns true.
+ * Otherwise, returns false.
+ */
+ bool asDawnFormat(wgpu::TextureFormat*) const;
+#endif
+
+#ifdef SK_METAL
+ /**
+ * If the backend API is Metal this gets the format as a GrMtlPixelFormat. Otherwise,
+ * Otherwise, returns MTLPixelFormatInvalid.
+ */
+ GrMTLPixelFormat asMtlFormat() const;
+#endif
+
+#ifdef SK_DIRECT3D
+ /**
+ * If the backend API is Direct3D this gets the format as a DXGI_FORMAT and returns true.
+ * Otherwise, returns false.
+ */
+ bool asDxgiFormat(DXGI_FORMAT*) const;
+#endif
+
+ /**
+ * If the backend API is not Mock these three calls will return kUnknown, kNone or false,
+ * respectively. Otherwise, only one of the following can be true. The GrColorType is not
+ * kUnknown, the compression type is not kNone, or this is a mock stencil format.
+ */
+ GrColorType asMockColorType() const;
+ SkTextureCompressionType asMockCompressionType() const;
+ bool isMockStencilFormat() const;
+
+ // If possible, copies the GrBackendFormat and forces the texture type to be Texture2D. If the
+ // GrBackendFormat was for Vulkan and it originally had a GrVkYcbcrConversionInfo, we will
+ // remove the conversion and set the format to be VK_FORMAT_R8G8B8A8_UNORM.
+ GrBackendFormat makeTexture2D() const;
+
+ // Returns true if the backend format has been initialized.
+ bool isValid() const { return fValid; }
+
+#if defined(SK_DEBUG) || GR_TEST_UTILS
+ SkString toStr() const;
+#endif
+
+private:
+#ifdef SK_GL
+ GrBackendFormat(GrGLenum format, GrGLenum target);
+#endif
+
+#ifdef SK_VULKAN
+ GrBackendFormat(const VkFormat vkFormat, const GrVkYcbcrConversionInfo&,
+ bool willUseDRMFormatModifiers);
+#endif
+
+#ifdef SK_DAWN
+ GrBackendFormat(wgpu::TextureFormat format);
+#endif
+
+#ifdef SK_METAL
+ GrBackendFormat(const GrMTLPixelFormat mtlFormat);
+#endif
+
+#ifdef SK_DIRECT3D
+ GrBackendFormat(DXGI_FORMAT dxgiFormat);
+#endif
+
+ GrBackendFormat(GrColorType, SkTextureCompressionType, bool isStencilFormat);
+
+#ifdef SK_DEBUG
+ bool validateMock() const;
+#endif
+
+ GrBackendApi fBackend = GrBackendApi::kMock;
+ bool fValid = false;
+
+ union {
+#ifdef SK_GL
+ GrGLenum fGLFormat; // the sized, internal format of the GL resource
+#endif
+#ifdef SK_VULKAN
+ struct {
+ VkFormat fFormat;
+ GrVkYcbcrConversionInfo fYcbcrConversionInfo;
+ } fVk;
+#endif
+#ifdef SK_DAWN
+ wgpu::TextureFormat fDawnFormat;
+#endif
+
+#ifdef SK_METAL
+ GrMTLPixelFormat fMtlFormat;
+#endif
+
+#ifdef SK_DIRECT3D
+ DXGI_FORMAT fDxgiFormat;
+#endif
+ struct {
+ GrColorType fColorType;
+ SkTextureCompressionType fCompressionType;
+ bool fIsStencilFormat;
+ } fMock;
+ };
+ GrTextureType fTextureType = GrTextureType::kNone;
+};
+
+class SK_API GrBackendTexture {
+public:
+ // Creates an invalid backend texture.
+ GrBackendTexture();
+
+#ifdef SK_GL
+ // The GrGLTextureInfo must have a valid fFormat.
+ GrBackendTexture(int width,
+ int height,
+ GrMipmapped,
+ const GrGLTextureInfo& glInfo,
+ std::string_view label = {});
+#endif
+
+#ifdef SK_VULKAN
+ GrBackendTexture(int width,
+ int height,
+ const GrVkImageInfo& vkInfo,
+ std::string_view label = {});
+#endif
+
+#ifdef SK_METAL
+ GrBackendTexture(int width,
+ int height,
+ GrMipmapped,
+ const GrMtlTextureInfo& mtlInfo,
+ std::string_view label = {});
+#endif
+
+#ifdef SK_DIRECT3D
+ GrBackendTexture(int width,
+ int height,
+ const GrD3DTextureResourceInfo& d3dInfo,
+ std::string_view label = {});
+#endif
+
+#ifdef SK_DAWN
+ GrBackendTexture(int width,
+ int height,
+ const GrDawnTextureInfo& dawnInfo,
+ std::string_view label = {});
+#endif
+
+ GrBackendTexture(int width,
+ int height,
+ GrMipmapped,
+ const GrMockTextureInfo& mockInfo,
+ std::string_view label = {});
+
+ GrBackendTexture(const GrBackendTexture& that);
+
+ ~GrBackendTexture();
+
+ GrBackendTexture& operator=(const GrBackendTexture& that);
+
+ SkISize dimensions() const { return {fWidth, fHeight}; }
+ int width() const { return fWidth; }
+ int height() const { return fHeight; }
+ std::string_view getLabel() const { return fLabel; }
+ GrMipmapped mipmapped() const { return fMipmapped; }
+ bool hasMipmaps() const { return fMipmapped == GrMipmapped::kYes; }
+ /** deprecated alias of hasMipmaps(). */
+ bool hasMipMaps() const { return this->hasMipmaps(); }
+ GrBackendApi backend() const {return fBackend; }
+ GrTextureType textureType() const { return fTextureType; }
+
+#ifdef SK_GL
+ // If the backend API is GL, copies a snapshot of the GrGLTextureInfo struct into the passed in
+ // pointer and returns true. Otherwise returns false if the backend API is not GL.
+ bool getGLTextureInfo(GrGLTextureInfo*) const;
+
+ // Call this to indicate that the texture parameters have been modified in the GL context
+ // externally to GrContext.
+ void glTextureParametersModified();
+#endif
+
+#ifdef SK_DAWN
+ // If the backend API is Dawn, copies a snapshot of the GrDawnTextureInfo struct into the passed
+ // in pointer and returns true. Otherwise returns false if the backend API is not Dawn.
+ bool getDawnTextureInfo(GrDawnTextureInfo*) const;
+#endif
+
+#ifdef SK_VULKAN
+ // If the backend API is Vulkan, copies a snapshot of the GrVkImageInfo struct into the passed
+ // in pointer and returns true. This snapshot will set the fImageLayout to the current layout
+ // state. Otherwise returns false if the backend API is not Vulkan.
+ bool getVkImageInfo(GrVkImageInfo*) const;
+
+ // Anytime the client changes the VkImageLayout of the VkImage captured by this
+ // GrBackendTexture, they must call this function to notify Skia of the changed layout.
+ void setVkImageLayout(VkImageLayout);
+#endif
+
+#ifdef SK_METAL
+ // If the backend API is Metal, copies a snapshot of the GrMtlTextureInfo struct into the passed
+ // in pointer and returns true. Otherwise returns false if the backend API is not Metal.
+ bool getMtlTextureInfo(GrMtlTextureInfo*) const;
+#endif
+
+#ifdef SK_DIRECT3D
+ // If the backend API is Direct3D, copies a snapshot of the GrD3DTextureResourceInfo struct into
+ // the passed in pointer and returns true. This snapshot will set the fResourceState to the
+ // current resource state. Otherwise returns false if the backend API is not D3D.
+ bool getD3DTextureResourceInfo(GrD3DTextureResourceInfo*) const;
+
+ // Anytime the client changes the D3D12_RESOURCE_STATES of the D3D12_RESOURCE captured by this
+ // GrBackendTexture, they must call this function to notify Skia of the changed layout.
+ void setD3DResourceState(GrD3DResourceStateEnum);
+#endif
+
+ // Get the GrBackendFormat for this texture (or an invalid format if this is not valid).
+ GrBackendFormat getBackendFormat() const;
+
+ // If the backend API is Mock, copies a snapshot of the GrMockTextureInfo struct into the passed
+ // in pointer and returns true. Otherwise returns false if the backend API is not Mock.
+ bool getMockTextureInfo(GrMockTextureInfo*) const;
+
+ // If the client changes any of the mutable backend of the GrBackendTexture they should call
+ // this function to inform Skia that those values have changed. The backend API specific state
+ // that can be set from this function are:
+ //
+ // Vulkan: VkImageLayout and QueueFamilyIndex
+ void setMutableState(const skgpu::MutableTextureState&);
+
+ // Returns true if we are working with protected content.
+ bool isProtected() const;
+
+ // Returns true if the backend texture has been initialized.
+ bool isValid() const { return fIsValid; }
+
+ // Returns true if both textures are valid and refer to the same API texture.
+ bool isSameTexture(const GrBackendTexture&);
+
+#if GR_TEST_UTILS
+ static bool TestingOnly_Equals(const GrBackendTexture& , const GrBackendTexture&);
+#endif
+
+private:
+ friend class GrVkGpu; // for getMutableState
+ sk_sp<skgpu::MutableTextureStateRef> getMutableState() const;
+
+#ifdef SK_GL
+ friend class GrGLTexture;
+ friend class GrGLGpu; // for getGLTextureParams
+ GrBackendTexture(int width,
+ int height,
+ GrMipmapped,
+ const GrGLTextureInfo,
+ sk_sp<GrGLTextureParameters>,
+ std::string_view label = {});
+ sk_sp<GrGLTextureParameters> getGLTextureParams() const;
+#endif
+
+#ifdef SK_VULKAN
+ friend class GrVkTexture;
+ GrBackendTexture(int width,
+ int height,
+ const GrVkImageInfo& vkInfo,
+ sk_sp<skgpu::MutableTextureStateRef> mutableState,
+ std::string_view label = {});
+#endif
+
+#ifdef SK_DIRECT3D
+ friend class GrD3DTexture;
+ friend class GrD3DGpu; // for getGrD3DResourceState
+ GrBackendTexture(int width,
+ int height,
+ const GrD3DTextureResourceInfo& vkInfo,
+ sk_sp<GrD3DResourceState> state,
+ std::string_view label = {});
+ sk_sp<GrD3DResourceState> getGrD3DResourceState() const;
+#endif
+
+ // Free and release and resources being held by the GrBackendTexture.
+ void cleanup();
+
+ bool fIsValid;
+ int fWidth; //<! width in pixels
+ int fHeight; //<! height in pixels
+ const std::string fLabel;
+ GrMipmapped fMipmapped;
+ GrBackendApi fBackend;
+ GrTextureType fTextureType;
+
+ union {
+#ifdef SK_GL
+ GrGLBackendTextureInfo fGLInfo;
+#endif
+#ifdef SK_VULKAN
+ GrVkBackendSurfaceInfo fVkInfo;
+#endif
+ GrMockTextureInfo fMockInfo;
+#ifdef SK_DIRECT3D
+ GrD3DBackendSurfaceInfo fD3DInfo;
+#endif
+ };
+#ifdef SK_METAL
+ GrMtlTextureInfo fMtlInfo;
+#endif
+#ifdef SK_DAWN
+ GrDawnTextureInfo fDawnInfo;
+#endif
+
+ sk_sp<skgpu::MutableTextureStateRef> fMutableState;
+};
+
+class SK_API GrBackendRenderTarget {
+public:
+ // Creates an invalid backend texture.
+ GrBackendRenderTarget();
+
+#ifdef SK_GL
+ // The GrGLTextureInfo must have a valid fFormat. If wrapping in an SkSurface we require the
+ // stencil bits to be either 0, 8 or 16.
+ GrBackendRenderTarget(int width,
+ int height,
+ int sampleCnt,
+ int stencilBits,
+ const GrGLFramebufferInfo& glInfo);
+#endif
+
+#ifdef SK_DAWN
+ // If wrapping in an SkSurface we require the stencil bits to be either 0, 8 or 16.
+ GrBackendRenderTarget(int width,
+ int height,
+ int sampleCnt,
+ int stencilBits,
+ const GrDawnRenderTargetInfo& dawnInfo);
+#endif
+
+#ifdef SK_VULKAN
+ /** Deprecated. Sample count is now part of GrVkImageInfo. */
+ GrBackendRenderTarget(int width, int height, int sampleCnt, const GrVkImageInfo& vkInfo);
+
+ GrBackendRenderTarget(int width, int height, const GrVkImageInfo& vkInfo);
+#endif
+
+#ifdef SK_METAL
+ GrBackendRenderTarget(int width,
+ int height,
+ const GrMtlTextureInfo& mtlInfo);
+ /** Deprecated. Sample count is ignored and is instead retrieved from the MtlTexture. */
+ GrBackendRenderTarget(int width,
+ int height,
+ int sampleCnt,
+ const GrMtlTextureInfo& mtlInfo);
+#endif
+
+#ifdef SK_DIRECT3D
+ GrBackendRenderTarget(int width,
+ int height,
+ const GrD3DTextureResourceInfo& d3dInfo);
+#endif
+
+ GrBackendRenderTarget(int width,
+ int height,
+ int sampleCnt,
+ int stencilBits,
+ const GrMockRenderTargetInfo& mockInfo);
+
+ ~GrBackendRenderTarget();
+
+ GrBackendRenderTarget(const GrBackendRenderTarget& that);
+ GrBackendRenderTarget& operator=(const GrBackendRenderTarget&);
+
+ SkISize dimensions() const { return {fWidth, fHeight}; }
+ int width() const { return fWidth; }
+ int height() const { return fHeight; }
+ int sampleCnt() const { return fSampleCnt; }
+ int stencilBits() const { return fStencilBits; }
+ GrBackendApi backend() const {return fBackend; }
+ bool isFramebufferOnly() const { return fFramebufferOnly; }
+
+#ifdef SK_GL
+ // If the backend API is GL, copies a snapshot of the GrGLFramebufferInfo struct into the passed
+ // in pointer and returns true. Otherwise returns false if the backend API is not GL.
+ bool getGLFramebufferInfo(GrGLFramebufferInfo*) const;
+#endif
+
+#ifdef SK_DAWN
+ // If the backend API is Dawn, copies a snapshot of the GrDawnRenderTargetInfo struct into the
+ // passed-in pointer and returns true. Otherwise returns false if the backend API is not Dawn.
+ bool getDawnRenderTargetInfo(GrDawnRenderTargetInfo*) const;
+#endif
+
+#ifdef SK_VULKAN
+ // If the backend API is Vulkan, copies a snapshot of the GrVkImageInfo struct into the passed
+ // in pointer and returns true. This snapshot will set the fImageLayout to the current layout
+ // state. Otherwise returns false if the backend API is not Vulkan.
+ bool getVkImageInfo(GrVkImageInfo*) const;
+
+ // Anytime the client changes the VkImageLayout of the VkImage captured by this
+ // GrBackendRenderTarget, they must call this function to notify Skia of the changed layout.
+ void setVkImageLayout(VkImageLayout);
+#endif
+
+#ifdef SK_METAL
+ // If the backend API is Metal, copies a snapshot of the GrMtlTextureInfo struct into the passed
+ // in pointer and returns true. Otherwise returns false if the backend API is not Metal.
+ bool getMtlTextureInfo(GrMtlTextureInfo*) const;
+#endif
+
+#ifdef SK_DIRECT3D
+ // If the backend API is Direct3D, copies a snapshot of the GrMtlTextureInfo struct into the
+ // passed in pointer and returns true. Otherwise returns false if the backend API is not D3D.
+ bool getD3DTextureResourceInfo(GrD3DTextureResourceInfo*) const;
+
+ // Anytime the client changes the D3D12_RESOURCE_STATES of the D3D12_RESOURCE captured by this
+ // GrBackendTexture, they must call this function to notify Skia of the changed layout.
+ void setD3DResourceState(GrD3DResourceStateEnum);
+#endif
+
+ // Get the GrBackendFormat for this render target (or an invalid format if this is not valid).
+ GrBackendFormat getBackendFormat() const;
+
+ // If the backend API is Mock, copies a snapshot of the GrMockTextureInfo struct into the passed
+ // in pointer and returns true. Otherwise returns false if the backend API is not Mock.
+ bool getMockRenderTargetInfo(GrMockRenderTargetInfo*) const;
+
+ // If the client changes any of the mutable backend of the GrBackendTexture they should call
+ // this function to inform Skia that those values have changed. The backend API specific state
+ // that can be set from this function are:
+ //
+ // Vulkan: VkImageLayout and QueueFamilyIndex
+ void setMutableState(const skgpu::MutableTextureState&);
+
+ // Returns true if we are working with protected content.
+ bool isProtected() const;
+
+ // Returns true if the backend texture has been initialized.
+ bool isValid() const { return fIsValid; }
+
+
+#if GR_TEST_UTILS
+ static bool TestingOnly_Equals(const GrBackendRenderTarget&, const GrBackendRenderTarget&);
+#endif
+
+private:
+ friend class GrVkGpu; // for getMutableState
+ sk_sp<skgpu::MutableTextureStateRef> getMutableState() const;
+
+#ifdef SK_VULKAN
+ friend class GrVkRenderTarget;
+ GrBackendRenderTarget(int width,
+ int height,
+ const GrVkImageInfo& vkInfo,
+ sk_sp<skgpu::MutableTextureStateRef> mutableState);
+#endif
+
+#ifdef SK_DIRECT3D
+ friend class GrD3DGpu;
+ friend class GrD3DRenderTarget;
+ GrBackendRenderTarget(int width,
+ int height,
+ const GrD3DTextureResourceInfo& d3dInfo,
+ sk_sp<GrD3DResourceState> state);
+ sk_sp<GrD3DResourceState> getGrD3DResourceState() const;
+#endif
+
+ // Free and release and resources being held by the GrBackendTexture.
+ void cleanup();
+
+ bool fIsValid;
+ bool fFramebufferOnly = false;
+ int fWidth; //<! width in pixels
+ int fHeight; //<! height in pixels
+
+ int fSampleCnt;
+ int fStencilBits;
+
+ GrBackendApi fBackend;
+
+ union {
+#ifdef SK_GL
+ GrGLFramebufferInfo fGLInfo;
+#endif
+#ifdef SK_VULKAN
+ GrVkBackendSurfaceInfo fVkInfo;
+#endif
+ GrMockRenderTargetInfo fMockInfo;
+#ifdef SK_DIRECT3D
+ GrD3DBackendSurfaceInfo fD3DInfo;
+#endif
+ };
+#ifdef SK_METAL
+ GrMtlTextureInfo fMtlInfo;
+#endif
+#ifdef SK_DAWN
+ GrDawnRenderTargetInfo fDawnInfo;
+#endif
+ sk_sp<skgpu::MutableTextureStateRef> fMutableState;
+};
+
+#endif
+
+#endif