79 auto [shaderModule, entryPointName] = compile_shader_module(
sharedContext, pipelineDesc);
93 std::vector<wgpu::BindGroupLayoutEntry> bindGroupLayoutEntries;
94 auto resources =
step->resources();
97 size_t resourceCount = 0;
100 if (r.fType == ComputeStep::ResourceType::kSampledTexture) {
105 bindGroupLayoutEntries.reserve(resourceCount);
106 int declarationIndex = 0;
108 bindGroupLayoutEntries.emplace_back();
109 uint32_t bindingIndex = bindGroupLayoutEntries.size() - 1;
111 wgpu::BindGroupLayoutEntry& entry = bindGroupLayoutEntries.back();
112 entry.binding = bindingIndex;
113 entry.visibility = wgpu::ShaderStage::Compute;
115 case ComputeStep::ResourceType::kUniformBuffer:
116 entry.buffer.type = wgpu::BufferBindingType::Uniform;
118 case ComputeStep::ResourceType::kStorageBuffer:
119 case ComputeStep::ResourceType::kIndirectBuffer:
120 entry.buffer.type = wgpu::BufferBindingType::Storage;
122 case ComputeStep::ResourceType::kReadOnlyStorageBuffer:
123 entry.buffer.type = wgpu::BufferBindingType::ReadOnlyStorage;
125 case ComputeStep::ResourceType::kReadOnlyTexture:
126 entry.texture.sampleType = wgpu::TextureSampleType::Float;
127 entry.texture.viewDimension = wgpu::TextureViewDimension::e2D;
129 case ComputeStep::ResourceType::kWriteOnlyStorageTexture: {
130 entry.storageTexture.access = wgpu::StorageTextureAccess::WriteOnly;
131 entry.storageTexture.viewDimension = wgpu::TextureViewDimension::e2D;
133 auto [_,
colorType] =
step->calculateTextureParameters(declarationIndex, r);
135 entry.storageTexture.format = textureInfo.dawnTextureSpec().getViewFormat();
138 case ComputeStep::ResourceType::kSampledTexture: {
139 entry.sampler.type = wgpu::SamplerBindingType::Filtering;
142 bindGroupLayoutEntries.emplace_back();
143 wgpu::BindGroupLayoutEntry& texEntry = bindGroupLayoutEntries.back();
144 texEntry.binding = bindingIndex + 1;
145 texEntry.visibility = wgpu::ShaderStage::Compute;
146 texEntry.texture.sampleType = wgpu::TextureSampleType::Float;
147 texEntry.texture.viewDimension = wgpu::TextureViewDimension::e2D;
157 wgpu::BindGroupLayoutDescriptor bindGroupLayoutDesc;
158 bindGroupLayoutDesc.entryCount = bindGroupLayoutEntries.size();
159 bindGroupLayoutDesc.entries = bindGroupLayoutEntries.data();
160 wgpu::BindGroupLayout bindGroupLayout =
device.CreateBindGroupLayout(&bindGroupLayoutDesc);
161 if (!bindGroupLayout) {
165 wgpu::PipelineLayoutDescriptor pipelineLayoutDesc;
166 pipelineLayoutDesc.label =
step->name();
167 pipelineLayoutDesc.bindGroupLayoutCount = 1;
168 pipelineLayoutDesc.bindGroupLayouts = &bindGroupLayout;
169 wgpu::PipelineLayout layout =
device.CreatePipelineLayout(&pipelineLayoutDesc);
174 wgpu::ComputePipelineDescriptor descriptor;
175 descriptor.label =
step->name();
176 descriptor.compute.module = std::move(shaderModule);
177 descriptor.compute.entryPoint = entryPointName.c_str();
178 descriptor.layout = std::move(layout);
180 std::optional<DawnErrorChecker> errorChecker;
184 wgpu::ComputePipeline pipeline =
device.CreateComputePipeline(&descriptor);
191 sharedContext, std::move(pipeline), std::move(bindGroupLayout)));
bool SkSLToWGSL(const SkSL::ShaderCaps *caps, const std::string &sksl, SkSL::ProgramKind programKind, const SkSL::ProgramSettings &settings, std::string *wgsl, SkSL::ProgramInterface *outInterface, ShaderErrorHandler *errorHandler)