blob: ee5ca9da7541495b58d9584b9cd729e33637b147 [file] [log] [blame]
/*
* Copyright 2025 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_DawnTypes_DEFINED
#define skgpu_graphite_DawnTypes_DEFINED
#include "include/core/SkSize.h"
#include "include/gpu/graphite/GraphiteTypes.h"
#include "include/gpu/graphite/TextureInfo.h"
#include "include/private/base/SkAPI.h"
#include "webgpu/webgpu_cpp.h" // NO_G3_REWRITE
class SkStream;
class SkWStream;
namespace skgpu::graphite {
class BackendTexture;
class SK_API DawnTextureInfo final : public TextureInfo::Data {
public:
// wgpu::TextureDescriptor properties
wgpu::TextureFormat fFormat = wgpu::TextureFormat::Undefined;
// `fViewFormat` for multiplanar formats corresponds to the plane TextureView's format.
wgpu::TextureFormat fViewFormat = wgpu::TextureFormat::Undefined;
wgpu::TextureUsage fUsage = wgpu::TextureUsage::None;
// TODO(b/308944094): Migrate aspect information to BackendTextureViews.
wgpu::TextureAspect fAspect = wgpu::TextureAspect::All;
uint32_t fSlice = 0;
#if !defined(__EMSCRIPTEN__)
// The descriptor of the YCbCr info (if any) for this texture. Dawn's YCbCr
// sampling will be used for this texture if this info is set. Setting the
// info is supported only on Android and only if using Vulkan as the
// underlying GPU driver.
wgpu::YCbCrVkDescriptor fYcbcrVkDescriptor = {};
#endif
wgpu::TextureFormat getViewFormat() const {
return fViewFormat != wgpu::TextureFormat::Undefined ? fViewFormat : fFormat;
}
DawnTextureInfo() = default;
explicit DawnTextureInfo(WGPUTexture texture);
DawnTextureInfo(uint32_t sampleCount,
Mipmapped mipmapped,
wgpu::TextureFormat format,
wgpu::TextureUsage usage,
wgpu::TextureAspect aspect)
: DawnTextureInfo(sampleCount,
mipmapped,
/*format=*/format,
/*viewFormat=*/format,
usage,
aspect,
/*slice=*/0) {}
DawnTextureInfo(uint32_t sampleCount,
Mipmapped mipmapped,
wgpu::TextureFormat format,
wgpu::TextureFormat viewFormat,
wgpu::TextureUsage usage,
wgpu::TextureAspect aspect,
uint32_t slice)
: Data(sampleCount, mipmapped)
, fFormat(format)
, fViewFormat(viewFormat)
, fUsage(usage)
, fAspect(aspect)
, fSlice(slice) {}
#if !defined(__EMSCRIPTEN__)
DawnTextureInfo(uint32_t sampleCount,
Mipmapped mipmapped,
wgpu::TextureFormat format,
wgpu::TextureFormat viewFormat,
wgpu::TextureUsage usage,
wgpu::TextureAspect aspect,
uint32_t slice,
wgpu::YCbCrVkDescriptor ycbcrVkDescriptor)
: Data(sampleCount, mipmapped)
, fFormat(format)
, fViewFormat(viewFormat)
, fUsage(usage)
, fAspect(aspect)
, fSlice(slice)
, fYcbcrVkDescriptor(ycbcrVkDescriptor) {}
#endif
private:
friend class TextureInfo;
friend class TextureInfoPriv;
// Non-virtual template API for TextureInfo::Data accessed directly when backend type is known.
static constexpr skgpu::BackendApi kBackend = skgpu::BackendApi::kDawn;
Protected isProtected() const { return Protected::kNo; }
TextureFormat viewFormat() const;
// Virtual API when the specific backend type is not available.
SkString toBackendString() const override;
void copyTo(TextureInfo::AnyTextureInfoData& dstData) const override {
dstData.emplace<DawnTextureInfo>(*this);
}
bool isCompatible(const TextureInfo& that, bool requireExact) const override;
};
namespace TextureInfos {
SK_API TextureInfo MakeDawn(const DawnTextureInfo& dawnInfo);
SK_API bool GetDawnTextureInfo(const TextureInfo&, DawnTextureInfo*);
} // namespace TextureInfos
namespace BackendTextures {
// Create a BackendTexture from a WGPUTexture. Texture info will be queried from the texture.
//
// This is the recommended way of specifying a BackendTexture for Dawn. See the note below on
// the constructor that takes a WGPUTextureView for a fuller explanation.
//
// The BackendTexture will not call retain or release on the passed in WGPUTexture. Thus, the
// client must keep the WGPUTexture valid until they are no longer using the BackendTexture.
// However, any SkImage or SkSurface that wraps the BackendTexture *will* retain and release
// the WGPUTexture.
SK_API BackendTexture MakeDawn(WGPUTexture);
// Create a BackendTexture from a WGPUTexture. Texture planeDimensions, plane aspect and
// info have to be provided. This is intended to be used only when accessing a plane
// of a WGPUTexture.
//
// The BackendTexture will not call retain or release on the passed in WGPUTexture. Thus, the
// client must keep the WGPUTexture valid until they are no longer using the BackendTexture.
// However, any SkImage or SkSurface that wraps the BackendTexture *will* retain and release
// the WGPUTexture.
SK_API BackendTexture MakeDawn(SkISize planeDimensions, const DawnTextureInfo&, WGPUTexture);
// Create a BackendTexture from a WGPUTextureView. Texture dimensions and
// info have to be provided.
//
// Using a WGPUTextureView rather than a WGPUTexture is less effecient for operations that
// require buffer transfers to or from the texture (e.g. methods on graphite::Context that read
// pixels or SkSurface::writePixels). In such cases an intermediate copy to or from a
// WGPUTexture is required. Thus, it is recommended to use this functionality only for cases
// where a WGPUTexture is unavailable, in particular when using wgpu::SwapChain.
//
// The BackendTexture will not call retain or release on the passed in WGPUTextureView. Thus,
// the client must keep the WGPUTextureView valid until they are no longer using the
// BackendTexture. However, any SkImage or SkSurface that wraps the BackendTexture *will* retain
// and release the WGPUTextureView.
SK_API BackendTexture MakeDawn(SkISize dimensions,
const DawnTextureInfo& info,
WGPUTextureView textureView);
} // namespace BackendTextures
} // namespace skgpu::graphite
#endif // skgpu_graphite_DawnTypes_DEFINED