20void VKDescriptorSetTracker::bind_buffer(VkDescriptorType vk_descriptor_type,
22 VkDeviceSize size_in_bytes,
25 vk_descriptor_buffer_infos_.append({vk_buffer, 0, size_in_bytes});
26 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
38void VKDescriptorSetTracker::bind_texel_buffer(VkBufferView vk_buffer_view,
41 vk_buffer_views_.append(vk_buffer_view);
42 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
48 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
54void VKDescriptorSetTracker::bind_image(VkDescriptorType vk_descriptor_type,
56 VkImageView vk_image_view,
57 VkImageLayout vk_image_layout,
60 vk_descriptor_image_infos_.append({vk_sampler, vk_image_view, vk_image_layout});
61 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
73void VKDescriptorSetTracker::bind_image_resource(
const VKStateManager &state_manager,
77 VKTexture &
texture = *state_manager.images_.get(resource_binding.binding);
78 bind_image(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
80 texture.image_view_get(resource_binding.arrayed).vk_handle(),
81 VK_IMAGE_LAYOUT_GENERAL,
82 resource_binding.location);
85 uint32_t layer_count = VK_REMAINING_ARRAY_LAYERS;
87 IndexRange layer_range =
texture.layer_range();
88 layer_base = layer_range.
start();
89 layer_count = layer_range.
size();
91 access_info.images.append({
texture.vk_image_handle(),
92 resource_binding.access_mask,
98void VKDescriptorSetTracker::bind_texture_resource(
const VKDevice &device,
103 const BindSpaceTextures::Elem &elem = state_manager.textures_.get(resource_binding.binding);
104 switch (elem.resource_type) {
106 VKVertexBuffer *vertex_buffer =
static_cast<VKVertexBuffer *
>(elem.resource);
107 vertex_buffer->ensure_updated();
108 vertex_buffer->ensure_buffer_view();
109 bind_texel_buffer(vertex_buffer->vk_buffer_view_get(), resource_binding.location);
110 access_info.buffers.append({vertex_buffer->vk_handle(), resource_binding.access_mask});
114 VKTexture *
texture =
static_cast<VKTexture *
>(elem.resource);
116 const VKSampler &
sampler = device.samplers().get(elem.sampler);
117 bind_image(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
119 texture->image_view_get(resource_binding.arrayed).vk_handle(),
120 VK_IMAGE_LAYOUT_GENERAL,
121 resource_binding.location);
122 access_info.images.append({
texture->vk_image_handle(),
123 resource_binding.access_mask,
126 VK_REMAINING_ARRAY_LAYERS});
132 VKVertexBuffer *vertex_buffer =
texture->source_buffer_;
133 vertex_buffer->ensure_updated();
134 vertex_buffer->ensure_buffer_view();
135 bind_texel_buffer(vertex_buffer->vk_buffer_view_get(), resource_binding.location);
136 access_info.buffers.append({vertex_buffer->vk_handle(), resource_binding.access_mask});
146void VKDescriptorSetTracker::bind_storage_buffer_resource(
151 const BindSpaceStorageBuffers::Elem &elem = state_manager.storage_buffers_.get(
152 resource_binding.binding);
153 VkBuffer vk_buffer = VK_NULL_HANDLE;
154 VkDeviceSize vk_device_size = 0;
155 switch (elem.resource_type) {
157 VKIndexBuffer *index_buffer =
static_cast<VKIndexBuffer *
>(elem.resource);
158 index_buffer->ensure_updated();
159 vk_buffer = index_buffer->vk_handle();
160 vk_device_size = index_buffer->size_get();
164 VKVertexBuffer *vertex_buffer =
static_cast<VKVertexBuffer *
>(elem.resource);
165 vertex_buffer->ensure_updated();
166 vk_buffer = vertex_buffer->vk_handle();
167 vk_device_size = vertex_buffer->size_used_get();
171 VKUniformBuffer *uniform_buffer =
static_cast<VKUniformBuffer *
>(elem.resource);
172 uniform_buffer->ensure_updated();
173 vk_buffer = uniform_buffer->vk_handle();
174 vk_device_size = uniform_buffer->size_in_bytes();
178 VKStorageBuffer *storage_buffer =
static_cast<VKStorageBuffer *
>(elem.resource);
179 storage_buffer->ensure_allocated();
180 vk_buffer = storage_buffer->vk_handle();
181 vk_device_size = storage_buffer->size_in_bytes();
190 VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk_buffer, vk_device_size, resource_binding.location);
191 access_info.buffers.append({vk_buffer, resource_binding.access_mask});
194void VKDescriptorSetTracker::bind_uniform_buffer_resource(
199 VKUniformBuffer &uniform_buffer = *state_manager.uniform_buffers_.get(resource_binding.binding);
200 uniform_buffer.ensure_updated();
201 bind_buffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
202 uniform_buffer.vk_handle(),
203 uniform_buffer.size_in_bytes(),
204 resource_binding.location);
205 access_info.buffers.append({uniform_buffer.vk_handle(), resource_binding.access_mask});
208void VKDescriptorSetTracker::bind_push_constants(
VKPushConstants &push_constants,
211 if (push_constants.layout_get().storage_type_get() !=
216 push_constants.update_uniform_buffer();
217 const VKUniformBuffer &uniform_buffer = *push_constants.uniform_buffer_get().get();
218 bind_buffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
219 uniform_buffer.vk_handle(),
220 uniform_buffer.size_in_bytes(),
221 push_constants.layout_get().descriptor_set_location_get());
222 access_info.buffers.append({uniform_buffer.vk_handle(), VK_ACCESS_UNIFORM_READ_BIT});
225void VKDescriptorSetTracker::bind_shader_resources(
const VKDevice &device,
230 const VKShaderInterface &shader_interface = shader.interface_get();
231 for (
const VKResourceBinding &resource_binding : shader_interface.resource_bindings_get()) {
232 if (resource_binding.binding == -1) {
236 switch (resource_binding.bind_type) {
238 bind_image_resource(state_manager, resource_binding, access_info);
242 bind_texture_resource(device, state_manager, resource_binding, access_info);
246 bind_storage_buffer_resource(state_manager, resource_binding, access_info);
250 bind_uniform_buffer_resource(state_manager, resource_binding, access_info);
256 bind_push_constants(shader.push_constants, access_info);
268 shader.push_constants.layout_get().storage_type_get() !=
276 VkDescriptorSetLayout vk_descriptor_set_layout =
shader.vk_descriptor_set_layout_get();
277 vk_descriptor_set = context.descriptor_pools_get().allocate(vk_descriptor_set_layout);
281 bind_shader_resources(device, state_manager,
shader, access_info);
286 if (vk_write_descriptor_sets_.is_empty()) {
291 int buffer_index = 0;
292 int buffer_view_index = 0;
294 for (
int write_index : vk_write_descriptor_sets_.index_range()) {
295 VkWriteDescriptorSet &vk_write_descriptor_set = vk_write_descriptor_sets_[write_index++];
296 switch (vk_write_descriptor_set.descriptorType) {
297 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
298 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
299 vk_write_descriptor_set.pImageInfo = &vk_descriptor_image_infos_[image_index++];
302 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
303 vk_write_descriptor_set.pTexelBufferView = &vk_buffer_views_[buffer_view_index++];
306 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
307 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
308 vk_write_descriptor_set.pBufferInfo = &vk_descriptor_buffer_infos_[buffer_index++];
319 vkUpdateDescriptorSets(device.
vk_handle(),
320 vk_write_descriptor_sets_.size(),
321 vk_write_descriptor_sets_.data(),
325 vk_descriptor_image_infos_.clear();
326 vk_descriptor_buffer_infos_.clear();
327 vk_buffer_views_.clear();
328 vk_write_descriptor_sets_.clear();
#define BLI_assert_unreachable()
constexpr int64_t size() const
constexpr int64_t start() const
void update_descriptor_set(VKContext &context, render_graph::VKResourceAccessInfo &resource_access_info)
VkDescriptorSet vk_descriptor_set
void upload_descriptor_sets()
VkDevice vk_handle() const
local_group_size(16, 16) .push_constant(Type local_group_size(16, 16) .push_constant(Type input_tx sampler(1, ImageType::FLOAT_2D, "matte_tx") .image(0
local_group_size(16, 16) .push_constant(Type texture
void object_label(GLenum type, GLuint object, const char *name)
static Context * unwrap(GPUContext *ctx)
VkImageAspectFlags to_vk_image_aspect_flag_bits(const eGPUTextureFormat format)
bool assign_if_different(T &old_value, T new_value)