vk/meta: Clean up temporary objects
[mesa.git] / src / vulkan / private.h
index 5b7f936cdc3ac8124f33b00ae28f6f46f68672ab..873efaa48f511a9d9ed851910d830dab428bc684 100644 (file)
@@ -234,9 +234,6 @@ struct anv_state_stream {
 
 void anv_block_pool_init(struct anv_block_pool *pool,
                          struct anv_device *device, uint32_t block_size);
-void anv_block_pool_init_slave(struct anv_block_pool *pool,
-                               struct anv_block_pool *master_pool,
-                               uint32_t num_blocks);
 void anv_block_pool_finish(struct anv_block_pool *pool);
 uint32_t anv_block_pool_alloc(struct anv_block_pool *pool);
 void anv_block_pool_free(struct anv_block_pool *pool, uint32_t offset);
@@ -298,17 +295,22 @@ struct anv_instance {
     struct anv_physical_device                  physicalDevice;
 };
 
-struct anv_clear_state {
-   VkPipeline                                   pipeline;
-   VkDynamicRsState                             rs_state;
-   VkDynamicCbState                             cb_state;
-};
+struct anv_meta_state {
+   struct {
+      VkPipeline                                pipeline;
+   } clear;
+
+   struct {
+      VkPipeline                                pipeline;
+      VkPipelineLayout                          pipeline_layout;
+      VkDescriptorSetLayout                     ds_layout;
+   } blit;
 
-struct anv_blit_state {
-   VkPipeline                                   pipeline;
-   VkDynamicRsState                             rs_state;
-   VkDescriptorSetLayout                        ds_layout;
-   VkDynamicCbState                             cb_state;
+   struct {
+      VkDynamicRsState                          rs_state;
+      VkDynamicCbState                          cb_state;
+      VkDynamicDsState                          ds_state;
+   } shared;
 };
 
 struct anv_device {
@@ -320,16 +322,19 @@ struct anv_device {
     bool                                        no_hw;
     bool                                        dump_aub;
 
+    struct anv_bo_pool                          batch_bo_pool;
+
     struct anv_block_pool                       dynamic_state_block_pool;
     struct anv_state_pool                       dynamic_state_pool;
 
     struct anv_block_pool                       instruction_block_pool;
     struct anv_block_pool                       surface_state_block_pool;
-    struct anv_block_pool                       binding_table_block_pool;
     struct anv_state_pool                       surface_state_pool;
 
-    struct anv_clear_state                      clear_state;
-    struct anv_blit_state                       blit_state;
+    struct anv_meta_state                       meta_state;
+
+    struct anv_state                            float_border_colors;
+    struct anv_state                            uint32_border_colors;
 
     struct anv_compiler *                       compiler;
     struct anv_aub_writer *                     aub_writer;
@@ -387,24 +392,47 @@ int anv_gem_userptr(struct anv_device *device, void *mem, size_t size);
 
 VkResult anv_bo_init_new(struct anv_bo *bo, struct anv_device *device, uint64_t size);
 
-/* TODO: Remove hardcoded reloc limit. */
-#define ANV_BATCH_MAX_RELOCS 256
-
 struct anv_reloc_list {
    size_t                                       num_relocs;
-   struct drm_i915_gem_relocation_entry         relocs[ANV_BATCH_MAX_RELOCS];
-   struct anv_bo *                              reloc_bos[ANV_BATCH_MAX_RELOCS];
+   size_t                                       array_length;
+   struct drm_i915_gem_relocation_entry *       relocs;
+   struct anv_bo **                             reloc_bos;
 };
 
-struct anv_batch {
+VkResult anv_reloc_list_init(struct anv_reloc_list *list,
+                             struct anv_device *device);
+void anv_reloc_list_finish(struct anv_reloc_list *list,
+                           struct anv_device *device);
+
+struct anv_batch_bo {
    struct anv_bo                                bo;
+
+   /* Bytes actually consumed in this batch BO */
+   size_t                                       length;
+
+   /* These offsets reference the per-batch reloc list */
+   size_t                                       first_reloc;
+   size_t                                       num_relocs;
+
+   struct anv_batch_bo *                        prev_batch_bo;
+};
+
+struct anv_batch {
+   struct anv_device *                          device;
+
+   void *                                       start;
+   void *                                       end;
    void *                                       next;
-   struct anv_reloc_list                        cmd_relocs;
+
+   struct anv_reloc_list                        relocs;
+
+   /* This callback is called (with the associated user data) in the event
+    * that the batch runs out of space.
+    */
+   VkResult (*extend_cb)(struct anv_batch *, void *);
+   void *                                       user_data;
 };
 
-VkResult anv_batch_init(struct anv_batch *batch, struct anv_device *device);
-void anv_batch_finish(struct anv_batch *batch, struct anv_device *device);
-void anv_batch_reset(struct anv_batch *batch);
 void *anv_batch_emit_dwords(struct anv_batch *batch, int num_dwords);
 void anv_batch_emit_batch(struct anv_batch *batch, struct anv_batch *other);
 uint64_t anv_batch_emit_reloc(struct anv_batch *batch,
@@ -421,17 +449,16 @@ struct anv_address {
 static inline uint64_t
 __gen_combine_address(struct anv_batch *batch, void *location,
                       const struct anv_address address, uint32_t delta)
-{   
+{
    if (address.bo == NULL) {
       return delta;
    } else {
-      assert(batch->bo.map <= location &&
-             (char *) location < (char *) batch->bo.map + batch->bo.size);
+      assert(batch->start <= location && location < batch->end);
 
       return anv_batch_emit_reloc(batch, location, address.bo, address.offset + delta);
    }
 }
-   
+
 #include "gen7_pack.h"
 #include "gen75_pack.h"
 #undef GEN8_3DSTATE_MULTISAMPLE
@@ -501,30 +528,23 @@ struct anv_dynamic_cb_state {
 
 };
 
-struct anv_query_pool_slot {
-   uint64_t begin;
-   uint64_t end;
-   uint64_t available;
-};
-
-struct anv_query_pool {
-   struct anv_object                            base;
-   VkQueryType                                  type;
-   uint32_t                                     slots;
-   struct anv_bo                                bo;
+struct anv_descriptor_slot {
+   int8_t dynamic_slot;
+   uint8_t index;
 };
 
 struct anv_descriptor_set_layout {
    struct {
       uint32_t surface_count;
-      uint32_t *surface_start;
+      struct anv_descriptor_slot *surface_start;
       uint32_t sampler_count;
-      uint32_t *sampler_start;
+      struct anv_descriptor_slot *sampler_start;
    } stage[VK_NUM_SHADER_STAGE];
 
    uint32_t count;
    uint32_t num_dynamic_buffers;
-   uint32_t entries[0];
+   uint32_t shader_stages;
+   struct anv_descriptor_slot entries[0];
 };
 
 struct anv_descriptor {
@@ -565,21 +585,18 @@ struct anv_buffer {
 };
 
 #define ANV_CMD_BUFFER_PIPELINE_DIRTY           (1 << 0)
-#define ANV_CMD_BUFFER_DESCRIPTOR_SET_DIRTY     (1 << 1)
 #define ANV_CMD_BUFFER_RS_DIRTY                 (1 << 2)
 #define ANV_CMD_BUFFER_DS_DIRTY                 (1 << 3)
 #define ANV_CMD_BUFFER_CB_DIRTY                 (1 << 4)
-   
-struct anv_bindings {
-   struct {
-      struct anv_buffer *buffer;
-      VkDeviceSize offset;
-   }                                            vb[MAX_VBS];
 
-   struct {
-      uint32_t                                  surfaces[256];
-      struct { uint32_t dwords[4]; }            samplers[16];
-   }                                            descriptors[VK_NUM_SHADER_STAGE];
+struct anv_vertex_binding {
+   struct anv_buffer *                          buffer;
+   VkDeviceSize                                 offset;
+};
+
+struct anv_descriptor_set_binding {
+   struct anv_descriptor_set *                  set;
+   uint32_t                                     dynamic_offsets[128];
 };
 
 struct anv_cmd_buffer {
@@ -589,29 +606,31 @@ struct anv_cmd_buffer {
    struct drm_i915_gem_execbuffer2              execbuf;
    struct drm_i915_gem_exec_object2 *           exec2_objects;
    struct anv_bo **                             exec2_bos;
+   uint32_t                                     exec2_array_length;
    bool                                         need_reloc;
    uint32_t                                     serial;
 
    uint32_t                                     bo_count;
    struct anv_batch                             batch;
-   struct anv_bo                                surface_bo;
+   struct anv_batch_bo *                        last_batch_bo;
+   struct anv_batch_bo *                        surface_batch_bo;
    uint32_t                                     surface_next;
    struct anv_reloc_list                        surface_relocs;
-   struct anv_state_stream                      binding_table_state_stream;
    struct anv_state_stream                      surface_state_stream;
    struct anv_state_stream                      dynamic_state_stream;
 
    /* State required while building cmd buffer */
    uint32_t                                     vb_dirty;
    uint32_t                                     dirty;
+   uint32_t                                     descriptors_dirty;
    struct anv_pipeline *                        pipeline;
    struct anv_framebuffer *                     framebuffer;
    struct anv_dynamic_rs_state *                rs_state;
    struct anv_dynamic_ds_state *                ds_state;
    struct anv_dynamic_vp_state *                vp_state;
    struct anv_dynamic_cb_state *                cb_state;
-   struct anv_bindings *                        bindings;
-   struct anv_bindings                          default_bindings;
+   struct anv_vertex_binding                    vertex_bindings[MAX_VBS];
+   struct anv_descriptor_set_binding            descriptors[MAX_SETS];
 };
 
 void anv_cmd_buffer_dump(struct anv_cmd_buffer *cmd_buffer);
@@ -634,6 +653,7 @@ struct anv_pipeline {
    struct anv_object                            base;
    struct anv_device *                          device;
    struct anv_batch                             batch;
+   uint32_t                                     batch_data[256];
    struct anv_shader *                          shaders[VK_NUM_SHADER_STAGE];
    struct anv_pipeline_layout *                 layout;
    bool                                         use_repclear;
@@ -686,12 +706,13 @@ anv_pipeline_create(VkDevice device,
                     const struct anv_pipeline_create_info *extra,
                     VkPipeline *pPipeline);
 
-struct anv_compiler *anv_compiler_create(int fd);
+struct anv_compiler *anv_compiler_create(struct anv_device *device);
 void anv_compiler_destroy(struct anv_compiler *compiler);
 int anv_compiler_run(struct anv_compiler *compiler, struct anv_pipeline *pipeline);
 void anv_compiler_free(struct anv_pipeline *pipeline);
 
 struct anv_format {
+   const char *                                 name;
    uint16_t                                     format;
    uint8_t                                      cpp;
    uint8_t                                      channels;
@@ -718,12 +739,30 @@ struct anv_image {
    VkDeviceSize                                 offset;
 
    struct anv_swap_chain *                      swap_chain;
+
+   /**
+    * \name Alignment of miptree images, in units of pixels.
+    *
+    * These fields contain the actual alignment values, not the values the
+    * hardware expects. For example, if h_align is 4, then program the hardware
+    * with HALIGN_4.
+    *
+    * \see RENDER_SURFACE_STATE.SurfaceHorizontalAlignment
+    * \see RENDER_SURFACE_STATE.SurfaceVerticalAlignment
+    * \{
+    */
+   uint8_t h_align;
+   uint8_t v_align;
+   /** \} */
 };
 
 struct anv_surface_view {
+   struct anv_object                            base;
+
    struct anv_state                             surface_state;
    struct anv_bo *                              bo;
    uint32_t                                     offset;
+   uint32_t                                     range;
    VkExtent3D                                   extent;
    VkFormat                                     format;
 };
@@ -747,6 +786,9 @@ void anv_color_attachment_view_init(struct anv_surface_view *view,
                                     const VkColorAttachmentViewCreateInfo* pCreateInfo,
                                     struct anv_cmd_buffer *cmd_buffer);
 
+void anv_surface_view_destroy(struct anv_device *device,
+                              struct anv_object *obj, VkObjectType obj_type);
+
 struct anv_sampler {
    uint32_t state[4];
 };
@@ -791,14 +833,12 @@ struct anv_render_pass {
 };
 
 void anv_device_init_meta(struct anv_device *device);
+void anv_device_finish_meta(struct anv_device *device);
 
 void
 anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
                      struct anv_render_pass *pass);
 
-void
-anv_cmd_buffer_fill_render_targets(struct anv_cmd_buffer *cmd_buffer);
-
 void *
 anv_lookup_entrypoint(const char *name);