1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2024 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/dawn/DawnTypes.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/BackendTexturePriv.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/dawn/DawnGraphiteTypesPriv.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/dawn/DawnUtilsPriv.h"
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Worker #include "webgpu/webgpu_cpp.h" // NO_G3_REWRITE
14*c8dee2aaSAndroid Build Coastguard Worker
15*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
16*c8dee2aaSAndroid Build Coastguard Worker
17*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Worker class DawnBackendTextureData final : public BackendTextureData {
20*c8dee2aaSAndroid Build Coastguard Worker public:
DawnBackendTextureData(WGPUTexture tex,WGPUTextureView tv)21*c8dee2aaSAndroid Build Coastguard Worker DawnBackendTextureData(WGPUTexture tex, WGPUTextureView tv) : fTexture(tex), fTextureView(tv) {}
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG)
type() const24*c8dee2aaSAndroid Build Coastguard Worker skgpu::BackendApi type() const override { return skgpu::BackendApi::kDawn; }
25*c8dee2aaSAndroid Build Coastguard Worker #endif
26*c8dee2aaSAndroid Build Coastguard Worker
texture() const27*c8dee2aaSAndroid Build Coastguard Worker WGPUTexture texture() const { return fTexture; }
textureView() const28*c8dee2aaSAndroid Build Coastguard Worker WGPUTextureView textureView() const { return fTextureView; }
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker private:
31*c8dee2aaSAndroid Build Coastguard Worker WGPUTexture fTexture;
32*c8dee2aaSAndroid Build Coastguard Worker WGPUTextureView fTextureView;
33*c8dee2aaSAndroid Build Coastguard Worker
copyTo(AnyBackendTextureData & dstData) const34*c8dee2aaSAndroid Build Coastguard Worker void copyTo(AnyBackendTextureData& dstData) const override {
35*c8dee2aaSAndroid Build Coastguard Worker // Don't assert that dstData has a Dawn type() because it could be
36*c8dee2aaSAndroid Build Coastguard Worker // uninitialized and that assert would fail.
37*c8dee2aaSAndroid Build Coastguard Worker dstData.emplace<DawnBackendTextureData>(fTexture, fTextureView);
38*c8dee2aaSAndroid Build Coastguard Worker }
39*c8dee2aaSAndroid Build Coastguard Worker
equal(const BackendTextureData * that) const40*c8dee2aaSAndroid Build Coastguard Worker bool equal(const BackendTextureData* that) const override {
41*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!that || that->type() == skgpu::BackendApi::kDawn);
42*c8dee2aaSAndroid Build Coastguard Worker if (auto otherDawn = static_cast<const DawnBackendTextureData*>(that)) {
43*c8dee2aaSAndroid Build Coastguard Worker return fTexture == otherDawn->fTexture && fTextureView == otherDawn->fTextureView;
44*c8dee2aaSAndroid Build Coastguard Worker }
45*c8dee2aaSAndroid Build Coastguard Worker return false;
46*c8dee2aaSAndroid Build Coastguard Worker }
47*c8dee2aaSAndroid Build Coastguard Worker };
48*c8dee2aaSAndroid Build Coastguard Worker
get_and_cast_data(const BackendTexture & tex)49*c8dee2aaSAndroid Build Coastguard Worker static const DawnBackendTextureData* get_and_cast_data(const BackendTexture& tex) {
50*c8dee2aaSAndroid Build Coastguard Worker auto data = BackendTexturePriv::GetData(tex);
51*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!data || data->type() == skgpu::BackendApi::kDawn);
52*c8dee2aaSAndroid Build Coastguard Worker return static_cast<const DawnBackendTextureData*>(data);
53*c8dee2aaSAndroid Build Coastguard Worker }
54*c8dee2aaSAndroid Build Coastguard Worker
55*c8dee2aaSAndroid Build Coastguard Worker // When we only have a WGPUTextureView we can't actually take advantage of these TextureUsage bits
56*c8dee2aaSAndroid Build Coastguard Worker // because they require having the WGPUTexture.
strip_copy_usage(const DawnTextureInfo & info)57*c8dee2aaSAndroid Build Coastguard Worker static DawnTextureInfo strip_copy_usage(const DawnTextureInfo& info) {
58*c8dee2aaSAndroid Build Coastguard Worker DawnTextureInfo result = info;
59*c8dee2aaSAndroid Build Coastguard Worker result.fUsage &= ~(wgpu::TextureUsage::CopyDst | wgpu::TextureUsage::CopySrc);
60*c8dee2aaSAndroid Build Coastguard Worker return result;
61*c8dee2aaSAndroid Build Coastguard Worker }
62*c8dee2aaSAndroid Build Coastguard Worker
63*c8dee2aaSAndroid Build Coastguard Worker namespace BackendTextures {
MakeDawn(WGPUTexture texture)64*c8dee2aaSAndroid Build Coastguard Worker BackendTexture MakeDawn(WGPUTexture texture) {
65*c8dee2aaSAndroid Build Coastguard Worker return BackendTexturePriv::Make(
66*c8dee2aaSAndroid Build Coastguard Worker {
67*c8dee2aaSAndroid Build Coastguard Worker static_cast<int32_t>(wgpuTextureGetWidth(texture)),
68*c8dee2aaSAndroid Build Coastguard Worker static_cast<int32_t>(wgpuTextureGetHeight(texture)),
69*c8dee2aaSAndroid Build Coastguard Worker },
70*c8dee2aaSAndroid Build Coastguard Worker TextureInfos::MakeDawn(DawnTextureInfoFromWGPUTexture(texture)),
71*c8dee2aaSAndroid Build Coastguard Worker DawnBackendTextureData(texture, nullptr));
72*c8dee2aaSAndroid Build Coastguard Worker }
73*c8dee2aaSAndroid Build Coastguard Worker
MakeDawn(SkISize planeDimensions,const DawnTextureInfo & info,WGPUTexture texture)74*c8dee2aaSAndroid Build Coastguard Worker BackendTexture MakeDawn(SkISize planeDimensions, const DawnTextureInfo& info, WGPUTexture texture) {
75*c8dee2aaSAndroid Build Coastguard Worker #if defined(__EMSCRIPTEN__)
76*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(info.fAspect == wgpu::TextureAspect::All);
77*c8dee2aaSAndroid Build Coastguard Worker #else
78*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(info.fAspect == wgpu::TextureAspect::All ||
79*c8dee2aaSAndroid Build Coastguard Worker info.fAspect == wgpu::TextureAspect::Plane0Only ||
80*c8dee2aaSAndroid Build Coastguard Worker info.fAspect == wgpu::TextureAspect::Plane1Only ||
81*c8dee2aaSAndroid Build Coastguard Worker info.fAspect == wgpu::TextureAspect::Plane2Only);
82*c8dee2aaSAndroid Build Coastguard Worker #endif
83*c8dee2aaSAndroid Build Coastguard Worker return BackendTexturePriv::Make(planeDimensions,
84*c8dee2aaSAndroid Build Coastguard Worker TextureInfos::MakeDawn(info),
85*c8dee2aaSAndroid Build Coastguard Worker DawnBackendTextureData(texture, nullptr));
86*c8dee2aaSAndroid Build Coastguard Worker }
87*c8dee2aaSAndroid Build Coastguard Worker
MakeDawn(SkISize dimensions,const DawnTextureInfo & info,WGPUTextureView textureView)88*c8dee2aaSAndroid Build Coastguard Worker BackendTexture MakeDawn(SkISize dimensions,
89*c8dee2aaSAndroid Build Coastguard Worker const DawnTextureInfo& info,
90*c8dee2aaSAndroid Build Coastguard Worker WGPUTextureView textureView) {
91*c8dee2aaSAndroid Build Coastguard Worker return BackendTexturePriv::Make(dimensions,
92*c8dee2aaSAndroid Build Coastguard Worker TextureInfos::MakeDawn(strip_copy_usage(info)),
93*c8dee2aaSAndroid Build Coastguard Worker DawnBackendTextureData(nullptr, textureView));
94*c8dee2aaSAndroid Build Coastguard Worker }
95*c8dee2aaSAndroid Build Coastguard Worker
GetDawnTexturePtr(const BackendTexture & tex)96*c8dee2aaSAndroid Build Coastguard Worker WGPUTexture GetDawnTexturePtr(const BackendTexture& tex) {
97*c8dee2aaSAndroid Build Coastguard Worker if (!tex.isValid() || tex.backend() != skgpu::BackendApi::kDawn) {
98*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
99*c8dee2aaSAndroid Build Coastguard Worker }
100*c8dee2aaSAndroid Build Coastguard Worker const DawnBackendTextureData* dawnData = get_and_cast_data(tex);
101*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(dawnData);
102*c8dee2aaSAndroid Build Coastguard Worker return dawnData->texture();
103*c8dee2aaSAndroid Build Coastguard Worker }
104*c8dee2aaSAndroid Build Coastguard Worker
GetDawnTextureViewPtr(const BackendTexture & tex)105*c8dee2aaSAndroid Build Coastguard Worker WGPUTextureView GetDawnTextureViewPtr(const BackendTexture& tex) {
106*c8dee2aaSAndroid Build Coastguard Worker if (!tex.isValid() || tex.backend() != skgpu::BackendApi::kDawn) {
107*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
108*c8dee2aaSAndroid Build Coastguard Worker }
109*c8dee2aaSAndroid Build Coastguard Worker const DawnBackendTextureData* dawnData = get_and_cast_data(tex);
110*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(dawnData);
111*c8dee2aaSAndroid Build Coastguard Worker return dawnData->textureView();
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker
114*c8dee2aaSAndroid Build Coastguard Worker } // namespace BackendTextures
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
117