blob: ee4c1df420959020d552e5998560c9ba5d4b9593 [file] [log] [blame]
/*
* Copyright 2019 Google LLC
* SPDX-License-Identifier: MIT
*
* based in part on anv and radv which are:
* Copyright © 2015 Intel Corporation
* Copyright © 2016 Red Hat.
* Copyright © 2016 Bas Nieuwenhuizen
*/
#ifndef VN_DESCRIPTOR_SET_H
#define VN_DESCRIPTOR_SET_H
#include "vn_common.h"
enum vn_descriptor_type {
VN_DESCRIPTOR_TYPE_SAMPLER,
VN_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VN_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
VN_DESCRIPTOR_TYPE_STORAGE_IMAGE,
VN_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
VN_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
VN_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
VN_DESCRIPTOR_TYPE_STORAGE_BUFFER,
VN_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
VN_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC,
VN_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
VN_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK,
VN_DESCRIPTOR_TYPE_MUTABLE_EXT,
/* add new enum types before this line */
VN_NUM_DESCRIPTOR_TYPES,
};
/* TODO refactor struct to track enum vn_descriptor_type type.
* On VkDescriptorSetLayout creation. When we check against
* VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK, it will be against
* VN_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK instead
*/
struct vn_descriptor_set_layout_binding {
VkDescriptorType type;
uint32_t count;
bool has_immutable_samplers;
BITSET_DECLARE(mutable_descriptor_types, VN_NUM_DESCRIPTOR_TYPES);
};
struct vn_descriptor_set_layout {
struct vn_object_base base;
struct vn_refcount refcount;
uint32_t last_binding;
bool has_variable_descriptor_count;
bool is_push_descriptor;
/* bindings must be the last field in the layout */
struct vn_descriptor_set_layout_binding bindings[];
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_set_layout,
base.base,
VkDescriptorSetLayout,
VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
struct vn_descriptor_pool_state {
uint32_t set_count;
uint32_t iub_binding_count;
uint32_t descriptor_counts[VN_NUM_DESCRIPTOR_TYPES];
};
struct vn_descriptor_pool_state_mutable {
uint32_t max;
uint32_t used;
BITSET_DECLARE(types, VN_NUM_DESCRIPTOR_TYPES);
};
struct vn_descriptor_pool {
struct vn_object_base base;
VkAllocationCallbacks allocator;
bool async_set_allocation;
struct vn_descriptor_pool_state max;
struct vn_descriptor_pool_state used;
struct list_head descriptor_sets;
uint32_t mutable_states_count;
struct vn_descriptor_pool_state_mutable *mutable_states;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_pool,
base.base,
VkDescriptorPool,
VK_OBJECT_TYPE_DESCRIPTOR_POOL)
struct vn_update_descriptor_sets {
uint32_t write_count;
VkWriteDescriptorSet *writes;
VkDescriptorImageInfo *images;
VkDescriptorBufferInfo *buffers;
VkBufferView *views;
VkWriteDescriptorSetInlineUniformBlock *iubs;
};
struct vn_descriptor_set {
struct vn_object_base base;
struct vn_descriptor_set_layout *layout;
uint32_t last_binding_descriptor_count;
struct list_head head;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_set,
base.base,
VkDescriptorSet,
VK_OBJECT_TYPE_DESCRIPTOR_SET)
struct vn_descriptor_update_template_entry {
size_t offset;
size_t stride;
};
struct vn_descriptor_update_template {
struct vn_object_base base;
bool is_push_descriptor;
VkPipelineBindPoint pipeline_bind_point;
struct vn_pipeline_layout *pipeline_layout;
mtx_t mutex;
struct vn_update_descriptor_sets *update;
struct vn_descriptor_update_template_entry entries[];
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_update_template,
base.base,
VkDescriptorUpdateTemplate,
VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE)
struct vn_update_descriptor_sets *
vn_update_descriptor_set_with_template_locked(
struct vn_descriptor_update_template *templ,
struct vn_descriptor_set *set,
const void *data);
void
vn_descriptor_set_layout_destroy(struct vn_device *dev,
struct vn_descriptor_set_layout *layout);
static inline struct vn_descriptor_set_layout *
vn_descriptor_set_layout_ref(struct vn_device *dev,
struct vn_descriptor_set_layout *layout)
{
vn_refcount_inc(&layout->refcount);
return layout;
}
static inline void
vn_descriptor_set_layout_unref(struct vn_device *dev,
struct vn_descriptor_set_layout *layout)
{
if (vn_refcount_dec(&layout->refcount))
vn_descriptor_set_layout_destroy(dev, layout);
}
#endif /* VN_DESCRIPTOR_SET_H */