anv: Drop bo_flags from anv_bo_pool
[mesa.git] / src / intel / vulkan / anv_private.h
index 0b1e97c64b6b8a3105eb3f8bf1986fc16b4e50d8..d4d14245501a4da83112d7e5075475c0f994db0b 100644 (file)
@@ -900,13 +900,10 @@ anv_state_table_get(struct anv_state_table *table, uint32_t idx)
 struct anv_bo_pool {
    struct anv_device *device;
 
-   uint64_t bo_flags;
-
    struct util_sparse_array_free_list free_list[16];
 };
 
-void anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device,
-                      uint64_t bo_flags);
+void anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device);
 void anv_bo_pool_finish(struct anv_bo_pool *pool);
 VkResult anv_bo_pool_alloc(struct anv_bo_pool *pool, uint32_t size,
                            struct anv_bo **bo_out);
@@ -1002,6 +999,8 @@ struct anv_physical_device {
     /** True if we can use bindless access for samplers */
     bool                                        has_bindless_samplers;
 
+    bool                                        always_flush_cache;
+
     struct anv_device_extension_table           supported_extensions;
     struct anv_physical_device_dispatch_table   dispatch;
 
@@ -1803,6 +1802,9 @@ struct anv_descriptor_set_layout {
    /* Number of dynamic offsets used by this descriptor set */
    uint16_t dynamic_offset_count;
 
+   /* For each shader stage, which offsets apply to that stage */
+   uint16_t stage_dynamic_offsets[MESA_SHADER_STAGES];
+
    /* Size of the descriptor buffer for this descriptor set */
    uint32_t descriptor_buffer_size;
 
@@ -2006,32 +2008,63 @@ anv_descriptor_set_destroy(struct anv_device *device,
                            struct anv_descriptor_pool *pool,
                            struct anv_descriptor_set *set);
 
+#define ANV_DESCRIPTOR_SET_NULL             (UINT8_MAX - 5)
+#define ANV_DESCRIPTOR_SET_PUSH_CONSTANTS   (UINT8_MAX - 4)
 #define ANV_DESCRIPTOR_SET_DESCRIPTORS      (UINT8_MAX - 3)
 #define ANV_DESCRIPTOR_SET_NUM_WORK_GROUPS  (UINT8_MAX - 2)
 #define ANV_DESCRIPTOR_SET_SHADER_CONSTANTS (UINT8_MAX - 1)
 #define ANV_DESCRIPTOR_SET_COLOR_ATTACHMENTS UINT8_MAX
 
 struct anv_pipeline_binding {
-   /* The descriptor set this surface corresponds to.  The special value of
-    * ANV_DESCRIPTOR_SET_COLOR_ATTACHMENTS indicates that the offset refers
-    * to a color attachment and not a regular descriptor.
+   /** Index in the descriptor set
+    *
+    * This is a flattened index; the descriptor set layout is already taken
+    * into account.
+    */
+   uint32_t index;
+
+   /** The descriptor set this surface corresponds to.
+    *
+    * The special ANV_DESCRIPTOR_SET_* values above indicates that this
+    * binding is not a normal descriptor set but something else.
     */
    uint8_t set;
 
-   /* Binding in the descriptor set */
-   uint32_t binding;
+   union {
+      /** Plane in the binding index for images */
+      uint8_t plane;
+
+      /** Input attachment index (relative to the subpass) */
+      uint8_t input_attachment_index;
+
+      /** Dynamic offset index (for dynamic UBOs and SSBOs) */
+      uint8_t dynamic_offset_index;
+   };
+
+   /** For a storage image, whether it is write-only */
+   uint8_t write_only;
+
+   /** Pad to 64 bits so that there are no holes and we can safely memcmp
+    * assuming POD zero-initialization.
+    */
+   uint8_t pad;
+};
 
-   /* Index in the binding */
+struct anv_push_range {
+   /** Index in the descriptor set */
    uint32_t index;
 
-   /* Plane in the binding index */
-   uint8_t plane;
+   /** Descriptor set index */
+   uint8_t set;
+
+   /** Dynamic offset index (for dynamic UBOs) */
+   uint8_t dynamic_offset_index;
 
-   /* Input attachment index (relative to the subpass) */
-   uint8_t input_attachment_index;
+   /** Start offset in units of 32B */
+   uint8_t start;
 
-   /* For a storage image, whether it is write-only */
-   bool write_only;
+   /** Range in units of 32B */
+   uint8_t length;
 };
 
 struct anv_pipeline_layout {
@@ -2337,20 +2370,30 @@ struct anv_xfb_binding {
    VkDeviceSize                                 size;
 };
 
-#define ANV_PARAM_PUSH(offset)         ((1 << 16) | (uint32_t)(offset))
-#define ANV_PARAM_IS_PUSH(param)       ((uint32_t)(param) >> 16 == 1)
-#define ANV_PARAM_PUSH_OFFSET(param)   ((param) & 0xffff)
-
-#define ANV_PARAM_DYN_OFFSET(offset)      ((2 << 16) | (uint32_t)(offset))
-#define ANV_PARAM_IS_DYN_OFFSET(param)    ((uint32_t)(param) >> 16 == 2)
-#define ANV_PARAM_DYN_OFFSET_IDX(param)   ((param) & 0xffff)
-
 struct anv_push_constants {
-   /* Push constant data provided by the client through vkPushConstants */
+   /** Push constant data provided by the client through vkPushConstants */
    uint8_t client_data[MAX_PUSH_CONSTANTS_SIZE];
 
-   /* Used for vkCmdDispatchBase */
-   uint32_t base_work_group_id[3];
+   /** Dynamic offsets for dynamic UBOs and SSBOs */
+   uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS];
+
+   struct {
+      /** Base workgroup ID
+       *
+       * Used for vkCmdDispatchBase.
+       */
+      uint32_t base_work_group_id[3];
+
+      /** Subgroup ID
+       *
+       * This is never set by software but is implicitly filled out when
+       * uploading the push constants for compute shaders.
+       */
+      uint32_t subgroup_id;
+
+      /** Pad out to a multiple of 32 bytes */
+      uint32_t pad[4];
+   } cs;
 };
 
 struct anv_dynamic_state {
@@ -2468,11 +2511,8 @@ struct anv_attachment_state {
  */
 struct anv_cmd_pipeline_state {
    struct anv_pipeline *pipeline;
-   struct anv_pipeline_layout *layout;
 
    struct anv_descriptor_set *descriptors[MAX_SETS];
-   uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS];
-
    struct anv_push_descriptor_set *push_descriptors[MAX_SETS];
 };
 
@@ -2540,6 +2580,10 @@ struct anv_cmd_state {
    struct anv_state                             binding_tables[MESA_SHADER_STAGES];
    struct anv_state                             samplers[MESA_SHADER_STAGES];
 
+   unsigned char                                sampler_sha1s[MESA_SHADER_STAGES][20];
+   unsigned char                                surface_sha1s[MESA_SHADER_STAGES][20];
+   unsigned char                                push_sha1s[MESA_SHADER_STAGES][20];
+
    /**
     * Whether or not the gen8 PMA fix is enabled.  We ensure that, at the top
     * of any command buffer it is disabled by disabling it in EndCommandBuffer
@@ -2626,7 +2670,7 @@ struct anv_cmd_buffer {
     * initialized by anv_cmd_buffer_init_batch_bo_chain()
     */
    struct u_vector                              bt_block_states;
-   uint32_t                                     bt_next;
+   struct anv_state                             bt_next;
 
    struct anv_reloc_list                        surface_relocs;
    /** Last seen surface state block pool center bo offset */
@@ -2901,11 +2945,17 @@ mesa_to_vk_shader_stage(gl_shader_stage mesa_stage)
         __tmp &= ~(1 << (stage)))
 
 struct anv_pipeline_bind_map {
+   unsigned char                                surface_sha1[20];
+   unsigned char                                sampler_sha1[20];
+   unsigned char                                push_sha1[20];
+
    uint32_t surface_count;
    uint32_t sampler_count;
 
    struct anv_pipeline_binding *                surface_to_descriptor;
    struct anv_pipeline_binding *                sampler_to_descriptor;
+
+   struct anv_push_range                        push_ranges[4];
 };
 
 struct anv_shader_bin_key {