WIP: Vulkan: Workbench #107886
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue