blob: 25e57c7d5b7e103a691fec9042ae94bc28aa54fb [file] [log] [blame]
Ben Claytonf2be26a2019-03-08 12:02:05 +00001// Copyright 2019 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef sw_ComputeProgram_hpp
16#define sw_ComputeProgram_hpp
17
18#include "SpirvShader.hpp"
19
Ben Claytonbc1c067be2019-12-17 20:37:37 +000020#include "Reactor/Coroutine.hpp"
Ben Clayton225a1302019-04-02 12:28:22 +010021#include "Vulkan/VkDescriptorSet.hpp"
Alexis Hetu35f07702020-10-01 09:21:17 -040022#include "Vulkan/VkPipeline.hpp"
Ben Claytonf2be26a2019-03-08 12:02:05 +000023
24#include <functional>
25
Ben Claytonbc1c067be2019-12-17 20:37:37 +000026namespace vk {
Alexis Hetu72ea2ee2020-08-06 10:08:37 -040027class Device;
Ben Claytonbc1c067be2019-12-17 20:37:37 +000028class PipelineLayout;
Alexis Hetu72ea2ee2020-08-06 10:08:37 -040029} // namespace vk
Nicolas Capens157ba262019-12-10 17:49:14 -050030
31namespace sw {
32
33using namespace rr;
34
35class DescriptorSetsLayout;
36struct Constants;
37
38// ComputeProgram builds a SPIR-V compute shader.
39class ComputeProgram : public Coroutine<SpirvShader::YieldResult(
Nicolas Capens06aaffa2021-11-10 10:19:50 -050040 const vk::Device *device,
Ben Claytonbc1c067be2019-12-17 20:37:37 +000041 void *data,
42 int32_t workgroupX,
43 int32_t workgroupY,
44 int32_t workgroupZ,
45 void *workgroupMemory,
46 int32_t firstSubgroup,
47 int32_t subgroupCount)>
Ben Claytonf2be26a2019-03-08 12:02:05 +000048{
Nicolas Capens157ba262019-12-10 17:49:14 -050049public:
Nicolas Capens3d7faaa2022-10-04 14:48:57 -040050 ComputeProgram(vk::Device *device, std::shared_ptr<SpirvShader> spirvShader, const vk::PipelineLayout *pipelineLayout, const vk::DescriptorSet::Bindings &descriptorSets);
Ben Claytonf2be26a2019-03-08 12:02:05 +000051
Nicolas Capens157ba262019-12-10 17:49:14 -050052 virtual ~ComputeProgram();
Ben Claytonf2be26a2019-03-08 12:02:05 +000053
Nicolas Capens157ba262019-12-10 17:49:14 -050054 // generate builds the shader program.
55 void generate();
Ben Claytonf2be26a2019-03-08 12:02:05 +000056
Nicolas Capens157ba262019-12-10 17:49:14 -050057 // run executes the compute shader routine for all workgroups.
58 void run(
Nicolas Capens7e1d67a2022-10-04 10:36:33 -040059 const vk::DescriptorSet::Array &descriptorSetObjects,
60 const vk::DescriptorSet::Bindings &descriptorSetBindings,
61 const vk::DescriptorSet::DynamicOffsets &descriptorDynamicOffsets,
62 const vk::Pipeline::PushConstantStorage &pushConstants,
Ben Claytonbc1c067be2019-12-17 20:37:37 +000063 uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
64 uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
Ben Claytonf2be26a2019-03-08 12:02:05 +000065
Nicolas Capens157ba262019-12-10 17:49:14 -050066protected:
Ben Claytonbc1c067be2019-12-17 20:37:37 +000067 void emit(SpirvRoutine *routine);
68 void setWorkgroupBuiltins(Pointer<Byte> data, SpirvRoutine *routine, Int workgroupID[3]);
69 void setSubgroupBuiltins(Pointer<Byte> data, SpirvRoutine *routine, Int workgroupID[3], SIMD::Int localInvocationIndex, Int subgroupIndex);
Nicolas Capens157ba262019-12-10 17:49:14 -050070
71 struct Data
Ben Claytonf2be26a2019-03-08 12:02:05 +000072 {
Nicolas Capens157ba262019-12-10 17:49:14 -050073 vk::DescriptorSet::Bindings descriptorSets;
74 vk::DescriptorSet::DynamicOffsets descriptorDynamicOffsets;
Nicolas Capens0eb3b102022-06-15 16:49:17 -040075 uint4 numWorkgroups; // [x, y, z, -]
76 uint4 workgroupSize; // [x, y, z, -]
Ben Claytonbc1c067be2019-12-17 20:37:37 +000077 uint32_t invocationsPerSubgroup; // SPIR-V: "SubgroupSize"
78 uint32_t subgroupsPerWorkgroup; // SPIR-V: "NumSubgroups"
79 uint32_t invocationsPerWorkgroup; // Total number of invocations per workgroup.
Alexis Hetu35f07702020-10-01 09:21:17 -040080 vk::Pipeline::PushConstantStorage pushConstants;
Ben Claytonf2be26a2019-03-08 12:02:05 +000081 };
82
Alexis Hetu72ea2ee2020-08-06 10:08:37 -040083 vk::Device *const device;
Nicolas Capens7d3a8602021-09-16 07:18:22 -040084 const std::shared_ptr<SpirvShader> shader;
85 const vk::PipelineLayout *const pipelineLayout; // Reference held by vk::Pipeline
Nicolas Capens157ba262019-12-10 17:49:14 -050086 const vk::DescriptorSet::Bindings &descriptorSets;
87};
88
89} // namespace sw
Ben Claytonf2be26a2019-03-08 12:02:05 +000090
Ben Claytonbc1c067be2019-12-17 20:37:37 +000091#endif // sw_ComputeProgram_hpp