diff options
Diffstat (limited to 'chromium/third_party/swiftshader/src/Pipeline/ComputeProgram.hpp')
-rw-r--r-- | chromium/third_party/swiftshader/src/Pipeline/ComputeProgram.hpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/chromium/third_party/swiftshader/src/Pipeline/ComputeProgram.hpp b/chromium/third_party/swiftshader/src/Pipeline/ComputeProgram.hpp new file mode 100644 index 00000000000..ab505928338 --- /dev/null +++ b/chromium/third_party/swiftshader/src/Pipeline/ComputeProgram.hpp @@ -0,0 +1,82 @@ +// Copyright 2019 The SwiftShader Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef sw_ComputeProgram_hpp +#define sw_ComputeProgram_hpp + +#include "SpirvShader.hpp" + +#include "Reactor/Reactor.hpp" +#include "Device/Context.hpp" +#include "Vulkan/VkDescriptorSet.hpp" + +#include <functional> + +namespace vk +{ + class PipelineLayout; +} // namespace vk + +namespace sw +{ + + using namespace rr; + + class DescriptorSetsLayout; + + // ComputeProgram builds a SPIR-V compute shader. + class ComputeProgram : public Function<Void(Pointer<Byte>)> + { + public: + ComputeProgram(SpirvShader const *spirvShader, vk::PipelineLayout const *pipelineLayout, const vk::DescriptorSet::Bindings &descriptorSets); + + virtual ~ComputeProgram(); + + // generate builds the shader program. + void generate(); + + // run executes the compute shader routine for all workgroups. + // TODO(bclayton): This probably does not belong here. Consider moving. + static void run( + Routine *routine, + vk::DescriptorSet::Bindings const &descriptorSetBindings, + vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets, + PushConstantStorage const &pushConstants, + uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); + + protected: + void emit(); + + void setInputBuiltin(spv::BuiltIn id, std::function<void(const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)> cb); + + Pointer<Byte> data; // argument 0 + + struct Data + { + vk::DescriptorSet::Bindings descriptorSets; + vk::DescriptorSet::DynamicOffsets descriptorDynamicOffsets; + uint4 numWorkgroups; + uint4 workgroupID; + PushConstantStorage pushConstants; + }; + + SpirvRoutine routine; + SpirvShader const * const shader; + vk::PipelineLayout const * const pipelineLayout; + const vk::DescriptorSet::Bindings &descriptorSets; + }; + +} // namespace sw + +#endif // sw_ComputeProgram_hpp |