GPU module assumes that image and textures uses different bind namespaces. In Vulkan this isn't the case, leading that some shaders generate incorrect bind types, when the state has bindings that are not used by the shader, but would conflict due to namespace differences. This PR will only return the binding when after validating it is from the expected namespace. This removes several validation warnings. This was done in order to debug EEVEE using modern toolsets. These toolsets don't support OpenGL and we use Vulkan as a workaround if possible. Pull Request: https://projects.blender.org/blender/blender/pulls/116465
84 lines
2.6 KiB
C++
84 lines
2.6 KiB
C++
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "BLI_array.hh"
|
|
|
|
#include "gpu_shader_create_info.hh"
|
|
#include "gpu_shader_interface.hh"
|
|
|
|
#include "BLI_array.hh"
|
|
|
|
#include "vk_push_constants.hh"
|
|
|
|
namespace blender::gpu {
|
|
class VKShaderInterface : public ShaderInterface {
|
|
private:
|
|
/**
|
|
* Offset when searching for a shader input based on a binding number.
|
|
*
|
|
* When shaders combine images and samplers, the images have to be offset to find the correct
|
|
* shader input. Both textures and images are stored in the uniform list and their ID can be
|
|
* overlapping.
|
|
*/
|
|
uint32_t image_offset_ = 0;
|
|
Array<VKDescriptorSet::Location> descriptor_set_locations_;
|
|
Array<shader::ShaderCreateInfo::Resource::BindType> descriptor_set_bind_types_;
|
|
|
|
VKPushConstants::Layout push_constants_layout_;
|
|
|
|
shader::BuiltinBits shader_builtins_;
|
|
|
|
public:
|
|
VKShaderInterface() = default;
|
|
|
|
void init(const shader::ShaderCreateInfo &info);
|
|
|
|
const VKDescriptorSet::Location descriptor_set_location(
|
|
const shader::ShaderCreateInfo::Resource &resource) const;
|
|
const std::optional<VKDescriptorSet::Location> descriptor_set_location(
|
|
const shader::ShaderCreateInfo::Resource::BindType &bind_type, int binding) const;
|
|
|
|
/** Get the Layout of the shader. */
|
|
const VKPushConstants::Layout &push_constants_layout_get() const
|
|
{
|
|
return push_constants_layout_;
|
|
}
|
|
|
|
shader::Type get_attribute_type(int location) const
|
|
{
|
|
return static_cast<shader::Type>(attr_types_[location]);
|
|
}
|
|
|
|
bool is_point_shader() const
|
|
{
|
|
return (shader_builtins_ & shader::BuiltinBits::POINT_SIZE) == shader::BuiltinBits::POINT_SIZE;
|
|
}
|
|
|
|
private:
|
|
/**
|
|
* Retrieve the shader input for the given resource.
|
|
*
|
|
* nullptr is returned when resource could not be found.
|
|
* Should only happen when still developing the Vulkan shader.
|
|
*/
|
|
const ShaderInput *shader_input_get(const shader::ShaderCreateInfo::Resource &resource) const;
|
|
const ShaderInput *shader_input_get(
|
|
const shader::ShaderCreateInfo::Resource::BindType &bind_type, int binding) const;
|
|
const VKDescriptorSet::Location descriptor_set_location(const ShaderInput *shader_input) const;
|
|
const shader::ShaderCreateInfo::Resource::BindType descriptor_set_bind_type(
|
|
const ShaderInput *shader_input) const;
|
|
void descriptor_set_location_update(
|
|
const ShaderInput *shader_input,
|
|
const VKDescriptorSet::Location location,
|
|
const shader::ShaderCreateInfo::Resource::BindType bind_type);
|
|
};
|
|
|
|
} // namespace blender::gpu
|