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