Vulkan: Make ShaderInput optional #107735

Merged
Jeroen Bakker merged 1 commits from Jeroen-Bakker/blender:vulkan-shader-interface-optional-locations into main 2023-05-11 08:45:05 +02:00
7 changed files with 34 additions and 20 deletions

View File

@ -45,9 +45,11 @@ void VKIndexBuffer::bind_as_ssbo(uint binding)
VKContext &context = *VKContext::get(); VKContext &context = *VKContext::get();
VKShader *shader = static_cast<VKShader *>(context.shader); VKShader *shader = static_cast<VKShader *>(context.shader);
const VKShaderInterface &shader_interface = shader->interface_get(); const VKShaderInterface &shader_interface = shader->interface_get();
const VKDescriptorSet::Location location = shader_interface.descriptor_set_location( const std::optional<VKDescriptorSet::Location> location =
shader::ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER, binding); shader_interface.descriptor_set_location(
shader->pipeline_get().descriptor_set_get().bind_as_ssbo(*this, location); shader::ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER, binding);
BLI_assert_msg(location, "Locations to SSBOs should always exist.");
shader->pipeline_get().descriptor_set_get().bind_as_ssbo(*this, *location);
} }
void VKIndexBuffer::read(uint32_t *data) const void VKIndexBuffer::read(uint32_t *data) const

View File

@ -84,7 +84,7 @@ void VKShaderInterface::init(const shader::ShaderCreateInfo &info)
/* Uniform blocks */ /* Uniform blocks */
for (const ShaderCreateInfo::Resource &res : all_resources) { for (const ShaderCreateInfo::Resource &res : all_resources) {
if (res.bind_type == ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER) { if (res.bind_type == ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER) {
copy_input_name(input, res.image.name, name_buffer_, name_buffer_offset); copy_input_name(input, res.uniformbuf.name, name_buffer_, name_buffer_offset);
input->location = input->binding = res.slot; input->location = input->binding = res.slot;
input++; input++;
} }
@ -196,11 +196,13 @@ const VKDescriptorSet::Location VKShaderInterface::descriptor_set_location(
return descriptor_set_location(shader_input); return descriptor_set_location(shader_input);
} }
const VKDescriptorSet::Location VKShaderInterface::descriptor_set_location( const std::optional<VKDescriptorSet::Location> VKShaderInterface::descriptor_set_location(
const shader::ShaderCreateInfo::Resource::BindType &bind_type, int binding) const const shader::ShaderCreateInfo::Resource::BindType &bind_type, int binding) const
{ {
const ShaderInput *shader_input = shader_input_get(bind_type, binding); const ShaderInput *shader_input = shader_input_get(bind_type, binding);
BLI_assert(shader_input); if (shader_input == nullptr) {
return std::nullopt;
}
return descriptor_set_location(shader_input); return descriptor_set_location(shader_input);
} }

View File

@ -38,7 +38,7 @@ class VKShaderInterface : public ShaderInterface {
const VKDescriptorSet::Location descriptor_set_location( const VKDescriptorSet::Location descriptor_set_location(
const shader::ShaderCreateInfo::Resource &resource) const; const shader::ShaderCreateInfo::Resource &resource) const;
const VKDescriptorSet::Location descriptor_set_location( const std::optional<VKDescriptorSet::Location> descriptor_set_location(
const shader::ShaderCreateInfo::Resource::BindType &bind_type, int binding) const; const shader::ShaderCreateInfo::Resource::BindType &bind_type, int binding) const;
/** Get the Layout of the shader. */ /** Get the Layout of the shader. */

View File

@ -37,9 +37,11 @@ void VKStorageBuffer::bind(int slot)
} }
VKShader *shader = static_cast<VKShader *>(context.shader); VKShader *shader = static_cast<VKShader *>(context.shader);
const VKShaderInterface &shader_interface = shader->interface_get(); const VKShaderInterface &shader_interface = shader->interface_get();
const VKDescriptorSet::Location location = shader_interface.descriptor_set_location( const std::optional<VKDescriptorSet::Location> location =
shader::ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER, slot); shader_interface.descriptor_set_location(
shader->pipeline_get().descriptor_set_get().bind(*this, location); shader::ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER, slot);
BLI_assert_msg(location, "Locations to SSBOs should always exist.");
shader->pipeline_get().descriptor_set_get().bind(*this, *location);
} }
void VKStorageBuffer::unbind() {} void VKStorageBuffer::unbind() {}

View File

@ -312,9 +312,13 @@ void VKTexture::image_bind(int binding)
VKContext &context = *VKContext::get(); VKContext &context = *VKContext::get();
VKShader *shader = static_cast<VKShader *>(context.shader); VKShader *shader = static_cast<VKShader *>(context.shader);
const VKShaderInterface &shader_interface = shader->interface_get(); const VKShaderInterface &shader_interface = shader->interface_get();
const VKDescriptorSet::Location location = shader_interface.descriptor_set_location( const std::optional<VKDescriptorSet::Location> location =
shader::ShaderCreateInfo::Resource::BindType::IMAGE, binding); shader_interface.descriptor_set_location(shader::ShaderCreateInfo::Resource::BindType::IMAGE,
shader->pipeline_get().descriptor_set_get().image_bind(*this, location); binding);
if (location) {
VKDescriptorSetTracker &descriptor_set = shader->pipeline_get().descriptor_set_get();
descriptor_set.image_bind(*this, *location);
}
} }
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */

View File

@ -44,10 +44,12 @@ void VKUniformBuffer::bind(int slot, shader::ShaderCreateInfo::Resource::BindTyp
VKContext &context = *VKContext::get(); VKContext &context = *VKContext::get();
VKShader *shader = static_cast<VKShader *>(context.shader); VKShader *shader = static_cast<VKShader *>(context.shader);
const VKShaderInterface &shader_interface = shader->interface_get(); const VKShaderInterface &shader_interface = shader->interface_get();
const VKDescriptorSet::Location location = shader_interface.descriptor_set_location(bind_type, const std::optional<VKDescriptorSet::Location> location =
slot); shader_interface.descriptor_set_location(bind_type, slot);
VKDescriptorSetTracker &descriptor_set = shader->pipeline_get().descriptor_set_get(); if (location) {
descriptor_set.bind(*this, location); VKDescriptorSetTracker &descriptor_set = shader->pipeline_get().descriptor_set_get();
descriptor_set.bind(*this, *location);
}
} }
void VKUniformBuffer::bind(int slot) void VKUniformBuffer::bind(int slot)

View File

@ -27,9 +27,11 @@ void VKVertexBuffer::bind_as_ssbo(uint binding)
VKContext &context = *VKContext::get(); VKContext &context = *VKContext::get();
VKShader *shader = static_cast<VKShader *>(context.shader); VKShader *shader = static_cast<VKShader *>(context.shader);
const VKShaderInterface &shader_interface = shader->interface_get(); const VKShaderInterface &shader_interface = shader->interface_get();
const VKDescriptorSet::Location location = shader_interface.descriptor_set_location( const std::optional<VKDescriptorSet::Location> location =
shader::ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER, binding); shader_interface.descriptor_set_location(
shader->pipeline_get().descriptor_set_get().bind_as_ssbo(*this, location); shader::ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER, binding);
BLI_assert_msg(location, "Locations to SSBOs should always exist.");
shader->pipeline_get().descriptor_set_get().bind_as_ssbo(*this, *location);
} }
void VKVertexBuffer::bind_as_texture(uint /*binding*/) {} void VKVertexBuffer::bind_as_texture(uint /*binding*/) {}