WIP: Vulkan: Workbench #107886

Closed
Jeroen Bakker wants to merge 88 commits from Jeroen-Bakker:vulkan-draw-manager-workbench into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
4 changed files with 28 additions and 44 deletions
Showing only changes of commit 84298f1f45 - Show all commits

View File

@ -153,11 +153,6 @@ void VKDescriptorSetTracker::update(VKContext &context)
if (!binding.is_texel_buffer()) { if (!binding.is_texel_buffer()) {
continue; continue;
} }
VkDescriptorBufferInfo buffer_info = {};
buffer_info.buffer = binding.vk_buffer;
buffer_info.range = binding.buffer_size;
buffer_infos.append(buffer_info);
VkWriteDescriptorSet write_descriptor = {}; VkWriteDescriptorSet write_descriptor = {};
write_descriptor.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; write_descriptor.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
write_descriptor.dstSet = vk_descriptor_set; write_descriptor.dstSet = vk_descriptor_set;
@ -192,9 +187,6 @@ void VKDescriptorSetTracker::update(VKContext &context)
descriptor_writes.append(write_descriptor); descriptor_writes.append(write_descriptor);
} }
BLI_assert_msg(image_infos.size() + buffer_infos.size() == descriptor_writes.size(),
"Not all changes have been converted to a write descriptor. Check "
"`Binding::is_buffer` and `Binding::is_image`.");
const VKDevice &device = VKBackend::get().device_get(); const VKDevice &device = VKBackend::get().device_get();
vkUpdateDescriptorSets( vkUpdateDescriptorSets(
device.device_get(), descriptor_writes.size(), descriptor_writes.data(), 0, nullptr); device.device_get(), descriptor_writes.size(), descriptor_writes.data(), 0, nullptr);

View File

@ -913,6 +913,7 @@ bool VKShader::finalize_descriptor_set_layouts(VkDevice vk_device,
{ {
return false; return false;
}; };
debug::object_label(layout_, name_get());
return true; return true;
} }

View File

@ -22,12 +22,10 @@ VKStateManager::VKStateManager()
constexpr int max_bindings = 16; constexpr int max_bindings = 16;
image_bindings_ = Array<ImageBinding>(max_bindings); image_bindings_ = Array<ImageBinding>(max_bindings);
image_bindings_.fill(ImageBinding()); image_bindings_.fill(ImageBinding());
texture_bindings_ = Array<ImageBinding>(max_bindings); texture_bindings_ = Array<TextureBinding>(max_bindings);
texture_bindings_.fill(ImageBinding()); texture_bindings_.fill(TextureBinding());
uniform_buffer_bindings_ = Array<UniformBufferBinding>(max_bindings); uniform_buffer_bindings_ = Array<UniformBufferBinding>(max_bindings);
uniform_buffer_bindings_.fill(UniformBufferBinding()); uniform_buffer_bindings_.fill(UniformBufferBinding());
uniform_texel_buffer_bindings_ = Array<UniformTexelBufferBinding>(max_bindings);
uniform_texel_buffer_bindings_.fill(UniformTexelBufferBinding());
} }
void VKStateManager::apply_state() void VKStateManager::apply_state()
@ -45,32 +43,25 @@ void VKStateManager::apply_bindings()
VKContext &context = *VKContext::get(); VKContext &context = *VKContext::get();
if (context.shader) { if (context.shader) {
for (int binding : IndexRange(image_bindings_.size())) { for (int binding : IndexRange(image_bindings_.size())) {
if (image_bindings_[binding].texture == nullptr) { if (image_bindings_[binding].texture) {
continue; image_bindings_[binding].texture->image_bind(binding);
} }
image_bindings_[binding].texture->image_bind(binding);
} }
for (int binding : IndexRange(texture_bindings_.size())) { for (int binding : IndexRange(texture_bindings_.size())) {
if (texture_bindings_[binding].texture == nullptr) { if (texture_bindings_[binding].texture) {
continue; texture_bindings_[binding].texture->bind(binding, sampler_);
} }
texture_bindings_[binding].texture->bind(binding, sampler_); else if (texture_bindings_[binding].vertex_buffer) {
} texture_bindings_[binding].vertex_buffer->bind(binding);
for (int binding : IndexRange(uniform_texel_buffer_bindings_.size())) {
if (uniform_texel_buffer_bindings_[binding].vertex_buffer == nullptr) {
continue;
} }
uniform_texel_buffer_bindings_[binding].vertex_buffer->bind(binding);
} }
for (int binding : IndexRange(uniform_buffer_bindings_.size())) { for (int binding : IndexRange(uniform_buffer_bindings_.size())) {
if (uniform_buffer_bindings_[binding].buffer == nullptr) { if (uniform_buffer_bindings_[binding].buffer) {
continue; uniform_buffer_bindings_[binding].buffer->bind(
binding, shader::ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER);
} }
uniform_buffer_bindings_[binding].buffer->bind(
binding, shader::ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER);
} }
} }
} }
@ -97,12 +88,13 @@ void VKStateManager::texture_bind(Texture *tex, GPUSamplerState /*sampler*/, int
{ {
VKTexture *texture = unwrap(tex); VKTexture *texture = unwrap(tex);
texture_bindings_[unit].texture = texture; texture_bindings_[unit].texture = texture;
texture_bindings_[unit].vertex_buffer = nullptr;
} }
void VKStateManager::texture_unbind(Texture *tex) void VKStateManager::texture_unbind(Texture *tex)
{ {
VKTexture *texture = unwrap(tex); VKTexture *texture = unwrap(tex);
for (ImageBinding &binding : texture_bindings_) { for (TextureBinding &binding : texture_bindings_) {
if (binding.texture == texture) { if (binding.texture == texture) {
binding.texture = nullptr; binding.texture = nullptr;
} }
@ -111,10 +103,8 @@ void VKStateManager::texture_unbind(Texture *tex)
void VKStateManager::texture_unbind_all() void VKStateManager::texture_unbind_all()
{ {
for (ImageBinding &binding : texture_bindings_) { for (TextureBinding &binding : texture_bindings_) {
if (binding.texture != nullptr) { binding.texture = nullptr;
binding.texture = nullptr;
}
} }
} }
@ -136,10 +126,8 @@ void VKStateManager::image_unbind(Texture *tex)
void VKStateManager::image_unbind_all() void VKStateManager::image_unbind_all()
{ {
for (ImageBinding &binding : texture_bindings_) { for (ImageBinding &binding : image_bindings_) {
if (binding.texture != nullptr) { binding.texture = nullptr;
binding.texture = nullptr;
}
} }
} }
@ -159,14 +147,16 @@ void VKStateManager::uniform_buffer_unbind(VKUniformBuffer *uniform_buffer)
void VKStateManager::texel_buffer_bind(VKVertexBuffer *vertex_buffer, int slot) void VKStateManager::texel_buffer_bind(VKVertexBuffer *vertex_buffer, int slot)
{ {
uniform_texel_buffer_bindings_[slot].vertex_buffer = vertex_buffer; texture_bindings_[slot].vertex_buffer = vertex_buffer;
texture_bindings_[slot].texture = nullptr;
} }
void VKStateManager::texel_buffer_unbind(VKVertexBuffer *vertex_buffer) void VKStateManager::texel_buffer_unbind(VKVertexBuffer *vertex_buffer)
{ {
for (UniformTexelBufferBinding &binding : uniform_texel_buffer_bindings_) { for (TextureBinding &binding : texture_bindings_) {
if (binding.vertex_buffer == vertex_buffer) { if (binding.vertex_buffer == vertex_buffer) {
binding.vertex_buffer = nullptr; binding.vertex_buffer = nullptr;
binding.texture = nullptr;
} }
} }
} }

View File

@ -24,19 +24,20 @@ class VKStateManager : public StateManager {
uint texture_unpack_row_length_ = 0; uint texture_unpack_row_length_ = 0;
struct TextureBinding {
VKTexture *texture = nullptr;
/* bufferTextures and samplers share the same namespace. */
VKVertexBuffer *vertex_buffer = nullptr;
};
struct ImageBinding { struct ImageBinding {
VKTexture *texture = nullptr; VKTexture *texture = nullptr;
}; };
struct UniformBufferBinding { struct UniformBufferBinding {
VKUniformBuffer *buffer = nullptr; VKUniformBuffer *buffer = nullptr;
}; };
struct UniformTexelBufferBinding {
VKVertexBuffer *vertex_buffer = nullptr;
};
Array<ImageBinding> image_bindings_; Array<ImageBinding> image_bindings_;
Array<ImageBinding> texture_bindings_; Array<TextureBinding> texture_bindings_;
Array<UniformBufferBinding> uniform_buffer_bindings_; Array<UniformBufferBinding> uniform_buffer_bindings_;
Array<UniformTexelBufferBinding> uniform_texel_buffer_bindings_;
public: public:
VKStateManager(); VKStateManager();