Skip to content
Snippets Groups Projects
Commit 0d1c880f authored by Susanne Dötsch's avatar Susanne Dötsch
Browse files

[#94] Compute Shader

We now have Compute Shaders! It lives!
parent ab29bf2a
No related branches found
No related tags found
1 merge request!77Resolve "SAF-R Module"
Pipeline #26809 passed
#version 450 core
#extension GL_ARB_separate_shader_objects : enable
layout(std430, binding = 0) coherent buffer safrBuffers{
int inumbers[];
};
void main(){
int i = 42;
}
\ No newline at end of file
...@@ -35,8 +35,37 @@ int main(int argc, const char** argv) { ...@@ -35,8 +35,37 @@ int main(int argc, const char** argv) {
{ "VK_KHR_swapchain" } { "VK_KHR_swapchain" }
); );
//configuring the compute Shader
vkcv::PassConfig computePassDefinition({});
vkcv::PassHandle computePass = core.createPass(computePassDefinition);
if (!computePass)
{
std::cout << "Error. Could not create renderpass. Exiting." << std::endl;
return EXIT_FAILURE;
}
std::string shaderPathCompute = "shaders/raytracing.comp";
vkcv::ShaderProgram safrShaderProgram; vkcv::ShaderProgram safrShaderProgram;
vkcv::shader::GLSLCompiler compiler; vkcv::shader::GLSLCompiler compiler;
vkcv::ShaderProgram computeShaderProgram{};
compiler.compile(vkcv::ShaderStage::COMPUTE, shaderPathCompute, [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
computeShaderProgram.addShader(shaderStage, path);
});
//Out of range Problem
vkcv::DescriptorSetHandle computeDescriptorSet = core.createDescriptorSet(computeShaderProgram.getReflectedDescriptors()[0]);
const std::vector<vkcv::VertexAttachment> computeVertexAttachments = computeShaderProgram.getVertexAttachments();
std::vector<vkcv::VertexBinding> computeBindings;
for (size_t i = 0; i < computeVertexAttachments.size(); i++) {
computeBindings.push_back(vkcv::VertexBinding(i, { computeVertexAttachments[i] }));
}
const vkcv::VertexLayout computeLayout(computeBindings);
compiler.compile(vkcv::ShaderStage::VERTEX, std::filesystem::path("shaders/shader.vert"), compiler.compile(vkcv::ShaderStage::VERTEX, std::filesystem::path("shaders/shader.vert"),
[&safrShaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { [&safrShaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
...@@ -85,13 +114,24 @@ int main(int argc, const char** argv) { ...@@ -85,13 +114,24 @@ int main(int argc, const char** argv) {
vkcv::SamplerAddressMode::REPEAT vkcv::SamplerAddressMode::REPEAT
); );
vkcv::Buffer<int> safrBuffer = core.createBuffer<int>(
vkcv::BufferType::STORAGE,
2
);
std::vector<int> vec = { 42, 1337 };
safrBuffer.fill(vec);
//particleBuffer.fill(particleSystem.getParticles());
vkcv::DescriptorWrites setWrites; vkcv::DescriptorWrites setWrites;
setWrites.sampledImageWrites = { vkcv::SampledImageDescriptorWrite(0, texture.getHandle()) }; setWrites.sampledImageWrites = { vkcv::SampledImageDescriptorWrite(0, texture.getHandle()) };
setWrites.samplerWrites = { vkcv::SamplerDescriptorWrite(1, sampler) }; setWrites.samplerWrites = { vkcv::SamplerDescriptorWrite(1, sampler) };
core.writeDescriptorSet(descriptorSet, setWrites); core.writeDescriptorSet(descriptorSet, setWrites);
vkcv::DescriptorWrites computeWrites;
computeWrites.storageBufferWrites = { vkcv::BufferDescriptorWrite(0,safrBuffer.getHandle()) };
core.writeDescriptorSet(computeDescriptorSet, computeWrites);
const auto& context = core.getContext(); const auto& context = core.getContext();
auto safrIndexBuffer = core.createBuffer<uint16_t>(vkcv::BufferType::INDEX, 3, vkcv::BufferMemoryType::DEVICE_LOCAL); auto safrIndexBuffer = core.createBuffer<uint16_t>(vkcv::BufferType::INDEX, 3, vkcv::BufferMemoryType::DEVICE_LOCAL);
...@@ -114,7 +154,6 @@ int main(int argc, const char** argv) { ...@@ -114,7 +154,6 @@ int main(int argc, const char** argv) {
} }
const vkcv::PipelineConfig safrPipelineDefinition{ const vkcv::PipelineConfig safrPipelineDefinition{
safrShaderProgram, safrShaderProgram,
(uint32_t)windowWidth, (uint32_t)windowWidth,
...@@ -126,8 +165,9 @@ int main(int argc, const char** argv) { ...@@ -126,8 +165,9 @@ int main(int argc, const char** argv) {
}; };
vkcv::PipelineHandle safrPipeline = core.createGraphicsPipeline(safrPipelineDefinition); vkcv::PipelineHandle safrPipeline = core.createGraphicsPipeline(safrPipelineDefinition);
vkcv::PipelineHandle computePipeline = core.createComputePipeline(computeShaderProgram, { core.getDescriptorSet(computeDescriptorSet).layout });
if (!safrPipeline) if (!safrPipeline || !computePipeline)
{ {
std::cout << "Error. Could not create graphics pipeline. Exiting." << std::endl; std::cout << "Error. Could not create graphics pipeline. Exiting." << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
...@@ -158,6 +198,7 @@ int main(int argc, const char** argv) { ...@@ -158,6 +198,7 @@ int main(int argc, const char** argv) {
continue; continue;
} }
auto end = std::chrono::system_clock::now(); auto end = std::chrono::system_clock::now();
auto deltatime = std::chrono::duration_cast<std::chrono::microseconds>(end - start); auto deltatime = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
start = end; start = end;
...@@ -171,6 +212,18 @@ int main(int argc, const char** argv) { ...@@ -171,6 +212,18 @@ int main(int argc, const char** argv) {
auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
vkcv::PushConstants pushConstantsCompute(0);
//pushConstantsCompute.appendDrawcall(pushData);
uint32_t computeDispatchCount[3] = { 2,1,1 };
core.recordComputeDispatchToCmdStream(cmdStream,
computePipeline,
computeDispatchCount,
{ vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet).vulkanHandle) },
pushConstantsCompute);
core.recordBufferMemoryBarrier(cmdStream, safrBuffer.getHandle());
core.recordDrawcallsToCmdStream( core.recordDrawcallsToCmdStream(
cmdStream, cmdStream,
safrPass, safrPass,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment