xref: /aosp_15_r20/external/skia/src/gpu/graphite/compute/ComputeStep.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2023 Google LLC
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "src/gpu/graphite/compute/ComputeStep.h"
9 
10 #include "include/core/SkColorType.h"
11 #include "include/core/SkSize.h"
12 #include "include/core/SkTileMode.h"
13 #include "include/private/base/SkAssert.h"
14 #include "include/private/base/SkDebug.h"
15 
16 #include <atomic>
17 #include <unordered_set>
18 
19 namespace skgpu::graphite {
20 namespace {
21 
next_id()22 static uint32_t next_id() {
23     static std::atomic<uint32_t> nextId{0};
24     // Not worried about overflow since a Context isn't expected to have that many ComputeSteps.
25     // Even if this it wraps around to 0, that ComputeStep will not be in the same Context as the
26     // original 0.
27     return nextId.fetch_add(1, std::memory_order_relaxed);
28 }
29 
30 }  // namespace
31 
ComputeStep(std::string_view name,WorkgroupSize localDispatchSize,SkSpan<const ResourceDesc> resources,SkSpan<const WorkgroupBufferDesc> workgroupBuffers,Flags baseFlags)32 ComputeStep::ComputeStep(std::string_view name,
33                          WorkgroupSize localDispatchSize,
34                          SkSpan<const ResourceDesc> resources,
35                          SkSpan<const WorkgroupBufferDesc> workgroupBuffers,
36                          Flags baseFlags)
37         : fUniqueID(next_id())
38         , fFlags(baseFlags)
39         , fName(name)
40         , fResources(resources.data(), resources.size())
41         , fWorkgroupBuffers(workgroupBuffers.data(), workgroupBuffers.size())
42         , fLocalDispatchSize(localDispatchSize) {
43 #ifdef SK_DEBUG
44     std::unordered_set<int> slots;
45     for (const ResourceDesc& r : fResources) {
46         // Validate that slot assignments within a ComputeStep are unique.
47         if (r.fFlow == DataFlow::kShared) {
48             SkASSERT(r.fSlot > -1);
49             SkASSERT(r.fSlot < kMaxComputeDataFlowSlots);
50             auto [_, inserted] = slots.insert(r.fSlot);
51             SkASSERT(inserted);
52         }
53     }
54 #endif  // SK_DEBUG
55 }
56 
prepareStorageBuffer(int,const ResourceDesc &,void *,size_t) const57 void ComputeStep::prepareStorageBuffer(int, const ResourceDesc&, void*, size_t) const {
58     SK_ABORT("ComputeSteps that initialize a mapped storage buffer must override "
59              "prepareStorageBuffer()");
60 }
61 
prepareUniformBuffer(int,const ResourceDesc &,UniformManager *) const62 void ComputeStep::prepareUniformBuffer(int, const ResourceDesc&, UniformManager*) const {
63     SK_ABORT("ComputeSteps that initialize a uniform buffer must override prepareUniformBuffer()");
64 }
65 
computeSkSL() const66 std::string ComputeStep::computeSkSL() const {
67     SK_ABORT("ComputeSteps must override computeSkSL() unless they support native shader source");
68     return "";
69 }
70 
nativeShaderSource(NativeShaderFormat) const71 ComputeStep::NativeShaderSource ComputeStep::nativeShaderSource(NativeShaderFormat) const {
72     SK_ABORT("ComputeSteps that support native shader source must override nativeShaderSource()");
73     return {};
74 }
75 
calculateBufferSize(int,const ResourceDesc &) const76 size_t ComputeStep::calculateBufferSize(int, const ResourceDesc&) const {
77     SK_ABORT("ComputeSteps that initialize a storage buffer must override calculateBufferSize()");
78     return 0u;
79 }
80 
calculateTextureParameters(int,const ResourceDesc &) const81 std::tuple<SkISize, SkColorType> ComputeStep::calculateTextureParameters(
82         int, const ResourceDesc&) const {
83     SK_ABORT("ComputeSteps that initialize a texture must override calculateTextureParameters()");
84     return {SkISize::MakeEmpty(), kUnknown_SkColorType};
85 }
86 
calculateSamplerParameters(int resourceIndex,const ResourceDesc &) const87 SamplerDesc ComputeStep::calculateSamplerParameters(int resourceIndex, const ResourceDesc&) const {
88     SK_ABORT("ComputeSteps that initialize a sampler must override calculateSamplerParameters()");
89     return {{}, SkTileMode::kClamp};
90 }
91 
calculateGlobalDispatchSize() const92 WorkgroupSize ComputeStep::calculateGlobalDispatchSize() const {
93     SK_ABORT("ComputeSteps must override calculateGlobalDispatchSize() unless "
94              "the workgroup count is determined out-of-band");
95     return WorkgroupSize();
96 }
97 
98 }  // namespace skgpu::graphite
99