I've been trying to follow along with the compute shader tutorial after doing everything up till this tutorial, and it seems like the compute shader section is based off an older version of the tutorial, as there are multiple inconsistencies with how the code is structured. These are a couple of the issues I've found:
In Drawing a Triangle / Setup / Logical device and queues, the graphics queue is created like so:
graphicsQueue = vk::raii::Queue(device, graphicsIndex, 0);
In the compute shader section, the compute queue is created like so:
computeQueue = std::make_unique<vk::raii::Queue>( *device, graphicsAndComputeIndex, 0 );
The "Loading compute shaders" section states to load in the shader with
vk::PipelineShaderStageCreateInfo computeShaderStageInfo({}, vk::ShaderStageFlagBits::eCompute, shaderModule, "compMain");
but this gives errors with constructor parameter mismatches. Seems like the fix is to create the computer shader stage in the same way the vertex/fragment shader stages are created in the other tutorial section:
vk::PipelineShaderStageCreateInfo computeShaderStageInfo {
.stage = vk::ShaderStageFlagBits::eCompute,
.module = shaderModule,
.pName = "compMain"
};
When dispatching work, the tutorial says
Now it’s time to actually tell the GPU to do some compute. This is done by calling computeCommandBuffers[frameIndex]→dispatch inside a command buffer. While not perfectly true, a dispatch is for compute as a draw call like commandBuffers[frameIndex]→draw is for graphics. This dispatches a given number of compute work items in at max. three dimensions.
yet commandBuffers[frameIndex]→draw isn't used before in the tutorial. There are a few others (e.g the createBuffer function having a different prototype than the one in earlier sections, the std::array layoutBindings also needing to be created with structs, instead of vk::DescriptorSetLayoutBinding, etc.)
The computer shader tutorial also assume a lot more than the previous sections. When creating the compute queue, it assigns to a computeQueue variable that hasn't appeared anywhere before up till this point. A few sections later, in the loop where the particle positions are initialized, it creates std::vector<Particle> particles(PARTICLE_COUNT);. This is the first time PARTICLE_COUNT is mentioned, and the first time the C++ Particle struct is mentioned. Neither are defined or mentioned anywhere after (though the Particle struct is added onto later).
I've been trying to follow along with the compute shader tutorial after doing everything up till this tutorial, and it seems like the compute shader section is based off an older version of the tutorial, as there are multiple inconsistencies with how the code is structured. These are a couple of the issues I've found:
In Drawing a Triangle / Setup / Logical device and queues, the graphics queue is created like so:
graphicsQueue = vk::raii::Queue(device, graphicsIndex, 0);In the compute shader section, the compute queue is created like so:
computeQueue = std::make_unique<vk::raii::Queue>( *device, graphicsAndComputeIndex, 0 );The "Loading compute shaders" section states to load in the shader with
but this gives errors with constructor parameter mismatches. Seems like the fix is to create the computer shader stage in the same way the vertex/fragment shader stages are created in the other tutorial section:
vk::PipelineShaderStageCreateInfo computeShaderStageInfo { .stage = vk::ShaderStageFlagBits::eCompute, .module = shaderModule, .pName = "compMain" };When dispatching work, the tutorial says
yet
commandBuffers[frameIndex]→drawisn't used before in the tutorial. There are a few others (e.g thecreateBufferfunction having a different prototype than the one in earlier sections, thestd::array layoutBindingsalso needing to be created with structs, instead ofvk::DescriptorSetLayoutBinding, etc.)The computer shader tutorial also assume a lot more than the previous sections. When creating the compute queue, it assigns to a
computeQueuevariable that hasn't appeared anywhere before up till this point. A few sections later, in the loop where the particle positions are initialized, it createsstd::vector<Particle> particles(PARTICLE_COUNT);. This is the first timePARTICLE_COUNTis mentioned, and the first time the C++ Particle struct is mentioned. Neither are defined or mentioned anywhere after (though the Particle struct is added onto later).