diff --git a/computecloth/computecloth.cpp b/computecloth/computecloth.cpp index a6accb7b..9305fe89 100644 --- a/computecloth/computecloth.cpp +++ b/computecloth/computecloth.cpp @@ -251,11 +251,20 @@ public: vkCmdBindPipeline(compute.commandBuffers[i], VK_PIPELINE_BIND_POINT_COMPUTE, compute.pipeline); + uint32_t calculateNormals = 0; + vkCmdPushConstants(compute.commandBuffers[i], compute.pipelineLayout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(uint32_t), &calculateNormals); + // Dispatch the compute job - for (uint32_t j = 0; j < 64; j++) { + const uint32_t iterations = 64; + for (uint32_t j = 0; j < iterations; j++) { readSet = 1 - readSet; vkCmdBindDescriptorSets(compute.commandBuffers[i], VK_PIPELINE_BIND_POINT_COMPUTE, compute.pipelineLayout, 0, 1, &compute.descriptorSets[readSet], 0, 0); + if (j == iterations - 1) { + calculateNormals = 1; + vkCmdPushConstants(compute.commandBuffers[i], compute.pipelineLayout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(uint32_t), &calculateNormals); + } + vkCmdDispatch(compute.commandBuffers[i], cloth.gridsize.x / 10, cloth.gridsize.y / 10, 1); for (auto &barrier : bufferBarriers) { @@ -559,24 +568,23 @@ public: }; VkDescriptorSetLayoutCreateInfo descriptorLayout = - vks::initializers::descriptorSetLayoutCreateInfo( - setLayoutBindings.data(), - static_cast(setLayoutBindings.size())); + vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings); VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &compute.descriptorSetLayout)); - VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = - vks::initializers::pipelineLayoutCreateInfo( - &compute.descriptorSetLayout, - 1); + VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = + vks::initializers::pipelineLayoutCreateInfo(&compute.descriptorSetLayout, 1); - VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &compute.pipelineLayout)); + // Push constants used to pass some parameters + VkPushConstantRange pushConstantRange = + vks::initializers::pushConstantRange(VK_SHADER_STAGE_COMPUTE_BIT, sizeof(uint32_t), 0); + pipelineLayoutCreateInfo.pushConstantRangeCount = 1; + pipelineLayoutCreateInfo.pPushConstantRanges = &pushConstantRange; + + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutCreateInfo, nullptr, &compute.pipelineLayout)); VkDescriptorSetAllocateInfo allocInfo = - vks::initializers::descriptorSetAllocateInfo( - descriptorPool, - &compute.descriptorSetLayout, - 1); + vks::initializers::descriptorSetAllocateInfo(descriptorPool, &compute.descriptorSetLayout, 1); // Create two descriptor sets with input and output buffers switched VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &compute.descriptorSets[0])); diff --git a/data/shaders/computecloth/cloth.comp b/data/shaders/computecloth/cloth.comp index edd97488..8c0ad682 100644 --- a/data/shaders/computecloth/cloth.comp +++ b/data/shaders/computecloth/cloth.comp @@ -35,6 +35,10 @@ layout (binding = 2) uniform UBO ivec2 particleCount; } params; +layout (push_constant) uniform PushConsts { + uint calculateNormals; +} pushConsts; + vec3 springForce(vec3 p0, vec3 p1, float restDist) { vec3 dist = p0 - p1; @@ -113,36 +117,37 @@ void main() } // Normals - // todo: Only once (use push const to check) - vec3 normal = vec3(0.0); - vec3 a, b, c; - if (id.y > 0) { - if (id.x > 0) { - a = particleIn[index - 1].pos.xyz - pos; - b = particleIn[index - params.particleCount.x - 1].pos.xyz - pos; - c = particleIn[index - params.particleCount.x].pos.xyz - pos; - normal += cross(a,b) + cross(b,c); + if (pushConsts.calculateNormals == 1) { + vec3 normal = vec3(0.0); + vec3 a, b, c; + if (id.y > 0) { + if (id.x > 0) { + a = particleIn[index - 1].pos.xyz - pos; + b = particleIn[index - params.particleCount.x - 1].pos.xyz - pos; + c = particleIn[index - params.particleCount.x].pos.xyz - pos; + normal += cross(a,b) + cross(b,c); + } + if (id.x < params.particleCount.x - 1) { + a = particleIn[index - params.particleCount.x].pos.xyz - pos; + b = particleIn[index - params.particleCount.x + 1].pos.xyz - pos; + c = particleIn[index + 1].pos.xyz - pos; + normal += cross(a,b) + cross(b,c); + } } - if (id.x < params.particleCount.x - 1) { - a = particleIn[index - params.particleCount.x].pos.xyz - pos; - b = particleIn[index - params.particleCount.x + 1].pos.xyz - pos; - c = particleIn[index + 1].pos.xyz - pos; - normal += cross(a,b) + cross(b,c); + if (id.y < params.particleCount.y - 1) { + if (id.x > 0) { + a = particleIn[index + params.particleCount.x].pos.xyz - pos; + b = particleIn[index + params.particleCount.x - 1].pos.xyz - pos; + c = particleIn[index - 1].pos.xyz - pos; + normal += cross(a,b) + cross(b,c); + } + if (id.x < params.particleCount.x - 1) { + a = particleIn[index + 1].pos.xyz - pos; + b = particleIn[index + params.particleCount.x + 1].pos.xyz - pos; + c = particleIn[index + params.particleCount.x].pos.xyz - pos; + normal += cross(a,b) + cross(b,c); + } } + particleOut[index].normal = vec4(normalize(normal), 0.0f); } - if (id.y < params.particleCount.y - 1) { - if (id.x > 0) { - a = particleIn[index + params.particleCount.x].pos.xyz - pos; - b = particleIn[index + params.particleCount.x - 1].pos.xyz - pos; - c = particleIn[index - 1].pos.xyz - pos; - normal += cross(a,b) + cross(b,c); - } - if (id.x < params.particleCount.x - 1) { - a = particleIn[index + 1].pos.xyz - pos; - b = particleIn[index + params.particleCount.x + 1].pos.xyz - pos; - c = particleIn[index + params.particleCount.x].pos.xyz - pos; - normal += cross(a,b) + cross(b,c); - } - } - particleOut[index].normal = vec4(normalize(normal), 0.0f); } \ No newline at end of file