Home | History | Annotate | Line # | Download | only in vulkan
      1 /*
      2  * Copyright 2019 Google LLC
      3  * SPDX-License-Identifier: MIT
      4  *
      5  * based in part on anv and radv which are:
      6  * Copyright  2015 Intel Corporation
      7  * Copyright  2016 Red Hat.
      8  * Copyright  2016 Bas Nieuwenhuizen
      9  */
     10 
     11 #ifndef VN_DESCRIPTOR_SET_H
     12 #define VN_DESCRIPTOR_SET_H
     13 
     14 #include "vn_common.h"
     15 
     16 /* TODO accommodate new discrete type enums by:
     17  * 1. increase the number of types here
     18  * 2. add a helper to map to continuous array index
     19  */
     20 #define VN_NUM_DESCRIPTOR_TYPES (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT + 1)
     21 
     22 struct vn_descriptor_set_layout_binding {
     23    VkDescriptorType type;
     24    uint32_t count;
     25    bool has_immutable_samplers;
     26 };
     27 
     28 struct vn_descriptor_set_layout {
     29    struct vn_object_base base;
     30 
     31    struct vn_refcount refcount;
     32 
     33    uint32_t last_binding;
     34    bool has_variable_descriptor_count;
     35 
     36    /* bindings must be the last field in the layout */
     37    struct vn_descriptor_set_layout_binding bindings[];
     38 };
     39 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_set_layout,
     40                                base.base,
     41                                VkDescriptorSetLayout,
     42                                VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
     43 
     44 struct vn_descriptor_pool_state {
     45    uint32_t set_count;
     46    uint32_t descriptor_counts[VN_NUM_DESCRIPTOR_TYPES];
     47 };
     48 
     49 struct vn_descriptor_pool {
     50    struct vn_object_base base;
     51 
     52    VkAllocationCallbacks allocator;
     53    bool async_set_allocation;
     54    struct vn_descriptor_pool_state max;
     55    struct vn_descriptor_pool_state used;
     56 
     57    struct list_head descriptor_sets;
     58 };
     59 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_pool,
     60                                base.base,
     61                                VkDescriptorPool,
     62                                VK_OBJECT_TYPE_DESCRIPTOR_POOL)
     63 
     64 struct vn_update_descriptor_sets {
     65    uint32_t write_count;
     66    VkWriteDescriptorSet *writes;
     67    VkDescriptorImageInfo *images;
     68    VkDescriptorBufferInfo *buffers;
     69    VkBufferView *views;
     70 };
     71 
     72 struct vn_descriptor_set {
     73    struct vn_object_base base;
     74 
     75    struct vn_descriptor_set_layout *layout;
     76    uint32_t last_binding_descriptor_count;
     77 
     78    struct list_head head;
     79 };
     80 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_set,
     81                                base.base,
     82                                VkDescriptorSet,
     83                                VK_OBJECT_TYPE_DESCRIPTOR_SET)
     84 
     85 struct vn_descriptor_update_template_entry {
     86    size_t offset;
     87    size_t stride;
     88 };
     89 
     90 struct vn_descriptor_update_template {
     91    struct vn_object_base base;
     92 
     93    mtx_t mutex;
     94    struct vn_update_descriptor_sets *update;
     95 
     96    struct vn_descriptor_update_template_entry entries[];
     97 };
     98 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_update_template,
     99                                base.base,
    100                                VkDescriptorUpdateTemplate,
    101                                VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE)
    102 
    103 void
    104 vn_descriptor_set_layout_destroy(struct vn_device *dev,
    105                                  struct vn_descriptor_set_layout *layout);
    106 
    107 static inline struct vn_descriptor_set_layout *
    108 vn_descriptor_set_layout_ref(struct vn_device *dev,
    109                              struct vn_descriptor_set_layout *layout)
    110 {
    111    vn_refcount_inc(&layout->refcount);
    112    return layout;
    113 }
    114 
    115 static inline void
    116 vn_descriptor_set_layout_unref(struct vn_device *dev,
    117                                struct vn_descriptor_set_layout *layout)
    118 {
    119    if (vn_refcount_dec(&layout->refcount))
    120       vn_descriptor_set_layout_destroy(dev, layout);
    121 }
    122 
    123 #endif /* VN_DESCRIPTOR_SET_H */
    124