blob: eae0d88dd207001662d26a34404c300ede09d0e9 [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
Chris Forbesa30de542019-03-18 18:51:55 -070020#include "Device/Context.hpp"
Ben Claytonbc1c0672019-12-17 20:37:37 +000021#include "Reactor/Coroutine.hpp"
Ben Clayton225a1302019-04-02 12:28:22 +010022#include "Vulkan/VkDescriptorSet.hpp"
Ben Claytonf2be26a2019-03-08 12:02:05 +000023
24#include <functional>
25
Ben Claytonbc1c0672019-12-17 20:37:37 +000026namespace vk {
27class PipelineLayout;
28}
Nicolas Capens157ba262019-12-10 17:49:14 -050029
30namespace sw {
31
32using namespace rr;
33
34class DescriptorSetsLayout;
35struct Constants;
36
37// ComputeProgram builds a SPIR-V compute shader.
38class ComputeProgram : public Coroutine<SpirvShader::YieldResult(
Ben Claytonbc1c0672019-12-17 20:37:37 +000039 void *data,
40 int32_t workgroupX,
41 int32_t workgroupY,
42 int32_t workgroupZ,
43 void *workgroupMemory,
44 int32_t firstSubgroup,
45 int32_t subgroupCount)>
Ben Claytonf2be26a2019-03-08 12:02:05 +000046{
Nicolas Capens157ba262019-12-10 17:49:14 -050047public:
48 ComputeProgram(SpirvShader const *spirvShader, vk::PipelineLayout const *pipelineLayout, const vk::DescriptorSet::Bindings &descriptorSets);
Ben Claytonf2be26a2019-03-08 12:02:05 +000049
Nicolas Capens157ba262019-12-10 17:49:14 -050050 virtual ~ComputeProgram();
Ben Claytonf2be26a2019-03-08 12:02:05 +000051
Nicolas Capens157ba262019-12-10 17:49:14 -050052 // generate builds the shader program.
53 void generate();
Ben Claytonf2be26a2019-03-08 12:02:05 +000054
Nicolas Capens157ba262019-12-10 17:49:14 -050055 // run executes the compute shader routine for all workgroups.
56 void run(
Alexis Hetu4f438a52020-06-15 16:13:51 -040057 vk::DescriptorSet::Array const &descriptorSetObjects,
Ben Claytonbc1c0672019-12-17 20:37:37 +000058 vk::DescriptorSet::Bindings const &descriptorSetBindings,
59 vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets,
60 PushConstantStorage const &pushConstants,
61 uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
62 uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
Ben Claytonf2be26a2019-03-08 12:02:05 +000063
Nicolas Capens157ba262019-12-10 17:49:14 -050064protected:
Ben Claytonbc1c0672019-12-17 20:37:37 +000065 void emit(SpirvRoutine *routine);
66 void setWorkgroupBuiltins(Pointer<Byte> data, SpirvRoutine *routine, Int workgroupID[3]);
67 void setSubgroupBuiltins(Pointer<Byte> data, SpirvRoutine *routine, Int workgroupID[3], SIMD::Int localInvocationIndex, Int subgroupIndex);
Nicolas Capens157ba262019-12-10 17:49:14 -050068
69 struct Data
Ben Claytonf2be26a2019-03-08 12:02:05 +000070 {
Nicolas Capens157ba262019-12-10 17:49:14 -050071 vk::DescriptorSet::Bindings descriptorSets;
72 vk::DescriptorSet::DynamicOffsets descriptorDynamicOffsets;
Ben Claytonbc1c0672019-12-17 20:37:37 +000073 uint4 numWorkgroups; // [x, y, z, 0]
74 uint4 workgroupSize; // [x, y, z, 0]
75 uint32_t invocationsPerSubgroup; // SPIR-V: "SubgroupSize"
76 uint32_t subgroupsPerWorkgroup; // SPIR-V: "NumSubgroups"
77 uint32_t invocationsPerWorkgroup; // Total number of invocations per workgroup.
Nicolas Capens157ba262019-12-10 17:49:14 -050078 PushConstantStorage pushConstants;
79 const Constants *constants;
Ben Claytonf2be26a2019-03-08 12:02:05 +000080 };
81
Ben Claytonbc1c0672019-12-17 20:37:37 +000082 SpirvShader const *const shader;
83 vk::PipelineLayout const *const pipelineLayout;
Nicolas Capens157ba262019-12-10 17:49:14 -050084 const vk::DescriptorSet::Bindings &descriptorSets;
85};
86
87} // namespace sw
Ben Claytonf2be26a2019-03-08 12:02:05 +000088
Ben Claytonbc1c0672019-12-17 20:37:37 +000089#endif // sw_ComputeProgram_hpp