vk/queue: Embed the queue in and allocate it with the device
[mesa.git] / src / vulkan / private.h
index 778e2b0704cf1daec3ed07dec22ed657e76c8690..645e96d75a916691c5343e14f406a73310818e38 100644 (file)
 
 #define VK_PROTOTYPES
 #include <vulkan/vulkan.h>
+#include <vulkan/vulkan_intel.h>
+#include <vulkan/vk_wsi_lunarg.h>
 
-#undef VKAPI
-#define VKAPI __attribute__ ((visibility ("default")))
+#include "entrypoints.h"
 
 #include "brw_context.h"
 
@@ -85,6 +86,26 @@ vk_error(VkResult error)
    return error;
 }
 
+void __anv_finishme(const char *file, int line, const char *format, ...);
+
+/**
+ * Print a FINISHME message, including its source location.
+ */
+#define anv_finishme(format, ...) \
+   __anv_finishme(__FILE__, __LINE__, format, ##__VA_ARGS__);
+
+#define stub_return(v) \
+   do { \
+      anv_finishme("stub %s", __func__); \
+      return (v); \
+   } while (0)
+
+#define stub(v) \
+   do { \
+      anv_finishme("stub %s", __func__); \
+      return; \
+   } while (0)
+
 /**
  * A dynamically growable, circular buffer.  Elements are added at head and
  * removed from tail. head and tail are free-running uint32_t indices and we
@@ -227,6 +248,35 @@ void anv_state_stream_finish(struct anv_state_stream *stream);
 struct anv_state anv_state_stream_alloc(struct anv_state_stream *stream,
                                         uint32_t size, uint32_t alignment);
 
+/**
+ * Implements a pool of re-usable BOs.  The interface is identical to that
+ * of block_pool except that each block is its own BO.
+ */
+struct anv_bo_pool {
+   struct anv_device *device;
+
+   uint32_t bo_size;
+
+   void *free_list;
+};
+
+void anv_bo_pool_init(struct anv_bo_pool *pool,
+                      struct anv_device *device, uint32_t block_size);
+void anv_bo_pool_finish(struct anv_bo_pool *pool);
+VkResult anv_bo_pool_alloc(struct anv_bo_pool *pool, struct anv_bo *bo);
+void anv_bo_pool_free(struct anv_bo_pool *pool, const struct anv_bo *bo);
+
+struct anv_object;
+struct anv_device;
+
+typedef void (*anv_object_destructor_cb)(struct anv_device *,
+                                         struct anv_object *,
+                                         VkObjectType);
+
+struct anv_object {
+   anv_object_destructor_cb                     destructor;
+};
+
 struct anv_physical_device {
     struct anv_instance *                       instance;
     uint32_t                                    chipset_id;
@@ -245,32 +295,22 @@ struct anv_instance {
     struct anv_physical_device                  physicalDevice;
 };
 
-struct anv_clear_state {
-   VkPipeline                                   pipeline;
-   VkDynamicRsState                             rs_state;
-};
-
-struct anv_device {
-    struct anv_instance *                       instance;
-    uint32_t                                    chipset_id;
-    struct brw_device_info                      info;
-    int                                         context_id;
-    int                                         fd;
-    bool                                        no_hw;
-    bool                                        dump_aub;
-
-    struct anv_block_pool                       dyn_state_block_pool;
-    struct anv_state_pool                       dyn_state_pool;
-
-    struct anv_block_pool                       instruction_block_pool;
-    struct anv_block_pool                       surface_state_block_pool;
-    struct anv_state_pool                       surface_state_pool;
+struct anv_meta_state {
+   struct {
+      VkPipeline                                pipeline;
+   } clear;
 
-    struct anv_clear_state                      clear_state;
+   struct {
+      VkPipeline                                pipeline;
+      VkPipelineLayout                          pipeline_layout;
+      VkDescriptorSetLayout                     ds_layout;
+   } blit;
 
-    struct anv_compiler *                       compiler;
-    struct anv_aub_writer *                     aub_writer;
-    pthread_mutex_t                             mutex;
+   struct {
+      VkDynamicRsState                          rs_state;
+      VkDynamicCbState                          cb_state;
+      VkDynamicDsState                          ds_state;
+   } shared;
 };
 
 struct anv_queue {
@@ -293,6 +333,36 @@ struct anv_queue {
     uint32_t                                    last_collected_serial;
 };
 
+struct anv_device {
+    struct anv_instance *                       instance;
+    uint32_t                                    chipset_id;
+    struct brw_device_info                      info;
+    int                                         context_id;
+    int                                         fd;
+    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_state_pool                       surface_state_pool;
+
+    struct anv_meta_state                       meta_state;
+
+    struct anv_state                            float_border_colors;
+    struct anv_state                            uint32_border_colors;
+
+    struct anv_queue                            queue;
+
+    struct anv_compiler *                       compiler;
+    struct anv_aub_writer *                     aub_writer;
+    pthread_mutex_t                             mutex;
+};
+
 void *
 anv_device_alloc(struct anv_device *            device,
                  size_t                         size,
@@ -324,25 +394,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                        surf_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,
@@ -359,17 +451,18 @@ 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
 #include "gen8_pack.h"
 
@@ -403,13 +496,20 @@ __gen_combine_address(struct anv_batch *batch, void *location,
          dw[i] = (dwords0)[i] | (dwords1)[i];                           \
    } while (0)
 
+#define GEN8_MOCS {                                     \
+      .MemoryTypeLLCeLLCCacheabilityControl = WB,       \
+      .TargetCache = L3DefertoPATforLLCeLLCselection,   \
+      .AgeforQUADLRU = 0                                \
+   }
+
 struct anv_device_memory {
-   struct anv_bo bo;
-   VkDeviceSize map_size;
-   void *map;
+   struct anv_bo                                bo;
+   VkDeviceSize                                 map_size;
+   void *                                       map;
 };
 
 struct anv_dynamic_vp_state {
+   struct anv_object base;
    struct anv_state sf_clip_vp;
    struct anv_state cc_vp;
    struct anv_state scissor;
@@ -417,38 +517,64 @@ struct anv_dynamic_vp_state {
 
 struct anv_dynamic_rs_state {
    uint32_t state_sf[GEN8_3DSTATE_SF_length];
+   uint32_t state_raster[GEN8_3DSTATE_RASTER_length];
+};
+
+struct anv_dynamic_ds_state {
+   uint32_t state_wm_depth_stencil[GEN8_3DSTATE_WM_DEPTH_STENCIL_length];
+   uint32_t state_color_calc[GEN8_COLOR_CALC_STATE_length];
 };
 
 struct anv_dynamic_cb_state {
-   uint32_t blend_offset;
+   uint32_t                                     state_color_calc[GEN8_COLOR_CALC_STATE_length];
+
+};
+
+struct anv_descriptor_slot {
+   int8_t dynamic_slot;
+   uint8_t index;
 };
 
 struct anv_descriptor_set_layout {
-   uint32_t total; /* total number of entries in all stages */
-   uint32_t count;
    struct {
-      VkDescriptorType type;
-      uint32_t mask;
-   } bindings[0];
+      uint32_t surface_count;
+      struct anv_descriptor_slot *surface_start;
+      uint32_t sampler_count;
+      struct anv_descriptor_slot *sampler_start;
+   } stage[VK_NUM_SHADER_STAGE];
+
+   uint32_t count;
+   uint32_t num_dynamic_buffers;
+   uint32_t shader_stages;
+   struct anv_descriptor_slot entries[0];
 };
 
-struct anv_descriptor_set {
-   void *descriptors[0];
+struct anv_descriptor {
+   struct anv_sampler *sampler;
+   struct anv_surface_view *view;
 };
 
-struct anv_pipeline_layout_entry {
-   VkDescriptorType type;
-   uint32_t set;
-   uint32_t index;
+struct anv_descriptor_set {
+   struct anv_descriptor descriptors[0];
 };
 
+#define MAX_VBS   32
+#define MAX_SETS   8
+#define MAX_RTS    8
+
 struct anv_pipeline_layout {
    struct {
-      uint32_t count;
-      struct anv_pipeline_layout_entry *entries;
+      struct anv_descriptor_set_layout *layout;
+      uint32_t surface_start[VK_NUM_SHADER_STAGE];
+      uint32_t sampler_start[VK_NUM_SHADER_STAGE];
+   } set[MAX_SETS];
+
+   uint32_t num_sets;
+
+   struct {
+      uint32_t surface_count;
+      uint32_t sampler_count;
    } stage[VK_NUM_SHADER_STAGE];
-   
-   struct anv_pipeline_layout_entry entries[0];
 };
 
 struct anv_buffer {
@@ -460,53 +586,76 @@ struct anv_buffer {
    VkDeviceSize                                 offset;   
 };
 
-#define MAX_VBS   32
-#define MAX_SETS   8
-#define MAX_RTS    8
-
 #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_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 {
+   struct anv_object                            base;
    struct anv_device *                          device;
 
    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_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                      surface_state_stream;
+   struct anv_state_stream                      dynamic_state_stream;
 
    /* State required while building cmd buffer */
-   struct {
-      struct anv_buffer *buffer;
-      VkDeviceSize offset;
-   }                                            vb[MAX_VBS];
    uint32_t                                     vb_dirty;
-   uint32_t                                     num_descriptor_sets;
-   struct anv_descriptor_set *                  descriptor_sets[MAX_SETS];
    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_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);
 void anv_aub_writer_destroy(struct anv_aub_writer *writer);
 
+struct anv_fence {
+   struct anv_object base;
+   struct anv_bo bo;
+   struct drm_i915_gem_execbuffer2 execbuf;
+   struct drm_i915_gem_exec_object2 exec2_objects[1];
+   bool ready;
+};
+
 struct anv_shader {
    uint32_t size;
    char data[0];
 };
 
 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;
@@ -529,24 +678,27 @@ struct anv_pipeline {
    struct anv_bo                                gs_scratch_bo;
 
    uint32_t                                     active_stages;
-   uint32_t                                     program_block;
-   uint32_t                                     program_next;
+   struct anv_state_stream                      program_stream;
+   struct anv_state                             blend_state;
    uint32_t                                     vs_simd8;
    uint32_t                                     ps_simd8;
    uint32_t                                     ps_simd16;
    uint32_t                                     gs_vec4;
    uint32_t                                     gs_vertex_count;
 
+   uint32_t                                     vb_used;
    uint32_t                                     binding_stride[MAX_VBS];
 
    uint32_t                                     state_sf[GEN8_3DSTATE_SF_length];
    uint32_t                                     state_raster[GEN8_3DSTATE_RASTER_length];
+   uint32_t                                     state_wm_depth_stencil[GEN8_3DSTATE_WM_DEPTH_STENCIL_length];
 };
 
 struct anv_pipeline_create_info {
    bool                                         use_repclear;
    bool                                         disable_viewport;
    bool                                         disable_scissor;
+   bool                                         disable_vs;
    bool                                         use_rectlist;
 };
 
@@ -556,17 +708,17 @@ anv_pipeline_create(VkDevice device,
                     const struct anv_pipeline_create_info *extra,
                     VkPipeline *pPipeline);
 
-VkResult anv_pipeline_destroy(struct anv_pipeline *pipeline);
-
-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 {
-   uint32_t                                     format;
-   int32_t                                      cpp;
-   int32_t                                      channels;
+   const char *                                 name;
+   uint16_t                                     format;
+   uint8_t                                      cpp;
+   uint8_t                                      channels;
+   bool                                         has_stencil;
 };
 
 const struct anv_format *
@@ -575,39 +727,90 @@ anv_format_for_vk_format(VkFormat format);
 struct anv_image {
    VkImageType                                  type;
    VkExtent3D                                   extent;
+   VkFormat                                     format;
    uint32_t                                     tile_mode;
    VkDeviceSize                                 size;
    uint32_t                                     alignment;
-   int32_t                                      stride;
+   uint32_t                                     stride;
+
+   uint32_t                                     stencil_offset;
+   uint32_t                                     stencil_stride;
 
    /* Set when bound */
    struct anv_bo *                              bo;
    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_buffer_view {
-   struct anv_buffer *                          buffer;
+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;
 };
 
-struct anv_color_attachment_view {
-   struct anv_image *                           image;
-   struct anv_state                             surface_state;
+struct anv_image_create_info {
+   uint32_t                                     tile_mode;
 };
 
-struct anv_image_view {
-   struct anv_image *                           image;
-   struct anv_state                             surface_state;
+VkResult anv_image_create(VkDevice _device,
+                          const VkImageCreateInfo *pCreateInfo,
+                          const struct anv_image_create_info *extra,
+                          VkImage *pImage);
+
+void anv_image_view_init(struct anv_surface_view *view,
+                         struct anv_device *device,
+                         const VkImageViewCreateInfo* pCreateInfo,
+                         struct anv_cmd_buffer *cmd_buffer);
+
+void anv_color_attachment_view_init(struct anv_surface_view *view,
+                                    struct anv_device *device,
+                                    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];
 };
 
 struct anv_depth_stencil_view {
+   struct anv_bo *                              bo;
+
+   uint32_t                                     depth_offset;
+   uint32_t                                     depth_stride;
+   uint32_t                                     depth_format;
+
+   uint32_t                                     stencil_offset;
+   uint32_t                                     stencil_stride;
 };
 
 struct anv_framebuffer {
+   struct anv_object                            base;
    uint32_t                                     color_attachment_count;
-   struct anv_color_attachment_view *           color_attachments[MAX_RTS];
-   struct anv_depth_stencil_view *              depth_stencil;
+   const struct anv_surface_view *              color_attachments[MAX_RTS];
+   const struct anv_depth_stencil_view *        depth_stencil;
 
    uint32_t                                     sample_count;
    uint32_t                                     width;
@@ -632,11 +835,14 @@ 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_lookup_entrypoint(const char *name);
 
 #ifdef __cplusplus
 }