anv/state: Pull sampler vk-to-gen maps into genX_state_util.h
[mesa.git] / src / vulkan / anv_private.h
index 5e611242481ac2632217b11f97732cefcd21ec82..5bd50258c8ae42d125d92aa42a8bb1d61e1e5a88 100644 (file)
@@ -86,6 +86,12 @@ align_u32(uint32_t v, uint32_t a)
    return (v + a - 1) & ~(a - 1);
 }
 
+static inline uint64_t
+align_u64(uint64_t v, uint64_t a)
+{
+   return (v + a - 1) & ~(a - 1);
+}
+
 static inline int32_t
 align_i32(int32_t v, int32_t a)
 {
@@ -384,10 +390,19 @@ struct anv_state_pool {
    struct anv_fixed_size_state_pool buckets[ANV_STATE_BUCKETS];
 };
 
+struct anv_state_stream_block;
+
 struct anv_state_stream {
    struct anv_block_pool *block_pool;
+
+   /* The current working block */
+   struct anv_state_stream_block *block;
+
+   /* Offset at which the current block starts */
+   uint32_t start;
+   /* Offset at which to allocate the next state */
    uint32_t next;
-   uint32_t current_block;
+   /* Offset at which the current block ends */
    uint32_t end;
 };
 
@@ -543,6 +558,9 @@ struct anv_meta_state {
    struct {
       VkRenderPass render_pass;
 
+      /** Pipeline that blits from a 1D image. */
+      VkPipeline pipeline_1d_src;
+
       /** Pipeline that blits from a 2D image. */
       VkPipeline pipeline_2d_src;
 
@@ -562,6 +580,16 @@ struct anv_queue {
     struct anv_state_pool *                     pool;
 };
 
+struct anv_pipeline_cache {
+   struct anv_device *                          device;
+   struct anv_state_stream                      program_stream;
+   pthread_mutex_t                              mutex;
+};
+
+void anv_pipeline_cache_init(struct anv_pipeline_cache *cache,
+                             struct anv_device *device);
+void anv_pipeline_cache_finish(struct anv_pipeline_cache *cache);
+
 struct anv_device {
     VK_LOADER_DATA                              _loader_data;
 
@@ -580,6 +608,8 @@ struct anv_device {
     struct anv_state_pool                       dynamic_state_pool;
 
     struct anv_block_pool                       instruction_block_pool;
+    struct anv_pipeline_cache                   default_pipeline_cache;
+
     struct anv_block_pool                       surface_state_block_pool;
     struct anv_state_pool                       surface_state_pool;
 
@@ -808,12 +838,18 @@ struct anv_descriptor_set_binding_layout {
    /* Index into the dynamic state array for a dynamic buffer */
    int16_t dynamic_offset_index;
 
+   /* Index into the descriptor set buffer views */
+   int16_t buffer_index;
+
    struct {
       /* Index into the binding table for the associated surface */
       int16_t surface_index;
 
       /* Index into the sampler table for the associated sampler */
       int16_t sampler_index;
+
+      /* Index into the image table for the associated image */
+      int16_t image_index;
    } stage[MESA_SHADER_STAGES];
 
    /* Immutable samplers (or NULL if no immutable samplers) */
@@ -830,6 +866,9 @@ struct anv_descriptor_set_layout {
    /* Shader stages affected by this descriptor set */
    uint16_t shader_stages;
 
+   /* Number of buffers in this descriptor set */
+   uint16_t buffer_count;
+
    /* Number of dynamic offsets used by this descriptor set */
    uint16_t dynamic_offset_count;
 
@@ -848,16 +887,13 @@ struct anv_descriptor {
          struct anv_sampler *sampler;
       };
 
-      struct {
-         struct anv_buffer *buffer;
-         uint64_t offset;
-         uint64_t range;
-      };
+      struct anv_buffer_view *buffer_view;
    };
 };
 
 struct anv_descriptor_set {
    const struct anv_descriptor_set_layout *layout;
+   struct anv_buffer_view *buffer_views;
    struct anv_descriptor descriptors[0];
 };
 
@@ -894,6 +930,7 @@ struct anv_pipeline_layout {
       struct {
          uint32_t surface_start;
          uint32_t sampler_start;
+         uint32_t image_start;
       } stage[MESA_SHADER_STAGES];
    } set[MAX_SETS];
 
@@ -905,6 +942,7 @@ struct anv_pipeline_layout {
       struct anv_pipeline_binding *surface_to_descriptor;
       uint32_t sampler_count;
       struct anv_pipeline_binding *sampler_to_descriptor;
+      uint32_t image_count;
    } stage[MESA_SHADER_STAGES];
 
    struct anv_pipeline_binding entries[0];
@@ -914,6 +952,8 @@ struct anv_buffer {
    struct anv_device *                          device;
    VkDeviceSize                                 size;
 
+   VkBufferUsageFlags                           usage;
+
    /* Set when bound */
    struct anv_bo *                              bo;
    VkDeviceSize                                 offset;
@@ -1022,6 +1062,8 @@ struct anv_cmd_state {
    uint32_t                                     vb_dirty;
    anv_cmd_dirty_mask_t                         dirty;
    anv_cmd_dirty_mask_t                         compute_dirty;
+   uint32_t                                     num_workgroups_offset;
+   struct anv_bo                                *num_workgroups_bo;
    VkShaderStageFlags                           descriptors_dirty;
    VkShaderStageFlags                           push_constants_dirty;
    uint32_t                                     scratch_size;
@@ -1179,6 +1221,8 @@ void anv_cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
 struct anv_state
 anv_cmd_buffer_push_constants(struct anv_cmd_buffer *cmd_buffer,
                               gl_shader_stage stage);
+struct anv_state
+anv_cmd_buffer_cs_push_constants(struct anv_cmd_buffer *cmd_buffer);
 
 void anv_cmd_buffer_clear_attachments(struct anv_cmd_buffer *cmd_buffer,
                                       struct anv_render_pass *pass,
@@ -1195,6 +1239,11 @@ struct anv_fence {
    bool ready;
 };
 
+struct anv_event {
+   uint32_t                                     semaphore;
+   struct anv_state                             state;
+};
+
 struct nir_shader;
 
 struct anv_shader_module {
@@ -1217,8 +1266,11 @@ mesa_to_vk_shader_stage(gl_shader_stage mesa_stage)
    return (1 << mesa_stage);
 }
 
+#define ANV_STAGE_MASK ((1 << MESA_SHADER_STAGES) - 1)
+
 #define anv_foreach_stage(stage, stage_bits)                         \
-   for (gl_shader_stage stage, __tmp = (gl_shader_stage)(stage_bits);\
+   for (gl_shader_stage stage,                                       \
+        __tmp = (gl_shader_stage)((stage_bits) & ANV_STAGE_MASK);    \
         stage = __builtin_ffs(__tmp) - 1, __tmp;                     \
         __tmp &= ~(1 << (stage)))
 
@@ -1251,7 +1303,6 @@ struct anv_pipeline {
    } urb;
 
    VkShaderStageFlags                           active_stages;
-   struct anv_state_stream                      program_stream;
    struct anv_state                             blend_state;
    uint32_t                                     vs_simd8;
    uint32_t                                     vs_vec4;
@@ -1261,7 +1312,7 @@ struct anv_pipeline {
    uint32_t                                     ps_ksp2;
    uint32_t                                     ps_grf_start0;
    uint32_t                                     ps_grf_start2;
-   uint32_t                                     gs_vec4;
+   uint32_t                                     gs_kernel;
    uint32_t                                     gs_vertex_count;
    uint32_t                                     cs_simd;
 
@@ -1300,18 +1351,21 @@ struct anv_graphics_pipeline_create_info {
 
 VkResult
 anv_pipeline_init(struct anv_pipeline *pipeline, struct anv_device *device,
+                  struct anv_pipeline_cache *cache,
                   const VkGraphicsPipelineCreateInfo *pCreateInfo,
                   const struct anv_graphics_pipeline_create_info *extra,
                   const VkAllocationCallbacks *alloc);
 
 VkResult
 anv_pipeline_compile_cs(struct anv_pipeline *pipeline,
+                        struct anv_pipeline_cache *cache,
                         const VkComputePipelineCreateInfo *info,
                         struct anv_shader_module *module,
                         const char *entrypoint_name);
 
 VkResult
 anv_graphics_pipeline_create(VkDevice device,
+                             VkPipelineCache cache,
                              const VkGraphicsPipelineCreateInfo *pCreateInfo,
                              const struct anv_graphics_pipeline_create_info *extra,
                              const VkAllocationCallbacks *alloc,
@@ -1319,6 +1373,7 @@ anv_graphics_pipeline_create(VkDevice device,
 
 VkResult
 gen7_graphics_pipeline_create(VkDevice _device,
+                              struct anv_pipeline_cache *cache,
                               const VkGraphicsPipelineCreateInfo *pCreateInfo,
                               const struct anv_graphics_pipeline_create_info *extra,
                               const VkAllocationCallbacks *alloc,
@@ -1326,6 +1381,7 @@ gen7_graphics_pipeline_create(VkDevice _device,
 
 VkResult
 gen75_graphics_pipeline_create(VkDevice _device,
+                               struct anv_pipeline_cache *cache,
                                const VkGraphicsPipelineCreateInfo *pCreateInfo,
                                const struct anv_graphics_pipeline_create_info *extra,
                                const VkAllocationCallbacks *alloc,
@@ -1333,34 +1389,40 @@ gen75_graphics_pipeline_create(VkDevice _device,
 
 VkResult
 gen8_graphics_pipeline_create(VkDevice _device,
+                              struct anv_pipeline_cache *cache,
                               const VkGraphicsPipelineCreateInfo *pCreateInfo,
                               const struct anv_graphics_pipeline_create_info *extra,
                               const VkAllocationCallbacks *alloc,
                               VkPipeline *pPipeline);
 VkResult
 gen9_graphics_pipeline_create(VkDevice _device,
+                              struct anv_pipeline_cache *cache,
                               const VkGraphicsPipelineCreateInfo *pCreateInfo,
                               const struct anv_graphics_pipeline_create_info *extra,
                               const VkAllocationCallbacks *alloc,
                               VkPipeline *pPipeline);
 VkResult
 gen7_compute_pipeline_create(VkDevice _device,
+                             struct anv_pipeline_cache *cache,
                              const VkComputePipelineCreateInfo *pCreateInfo,
                              const VkAllocationCallbacks *alloc,
                              VkPipeline *pPipeline);
 VkResult
 gen75_compute_pipeline_create(VkDevice _device,
+                              struct anv_pipeline_cache *cache,
                               const VkComputePipelineCreateInfo *pCreateInfo,
                               const VkAllocationCallbacks *alloc,
                               VkPipeline *pPipeline);
 
 VkResult
 gen8_compute_pipeline_create(VkDevice _device,
+                             struct anv_pipeline_cache *cache,
                              const VkComputePipelineCreateInfo *pCreateInfo,
                              const VkAllocationCallbacks *alloc,
                              VkPipeline *pPipeline);
 VkResult
 gen9_compute_pipeline_create(VkDevice _device,
+                             struct anv_pipeline_cache *cache,
                              const VkComputePipelineCreateInfo *pCreateInfo,
                              const VkAllocationCallbacks *alloc,
                              VkPipeline *pPipeline);
@@ -1370,7 +1432,6 @@ struct anv_format {
    const char *name;
    enum isl_format surface_format; /**< RENDER_SURFACE_STATE.SurfaceFormat */
    const struct isl_format_layout *isl_layout;
-   uint8_t num_channels;
    uint16_t depth_format; /**< 3DSTATE_DEPTH_BUFFER.SurfaceFormat */
    bool has_stencil;
 };
@@ -1379,7 +1440,8 @@ const struct anv_format *
 anv_format_for_vk_format(VkFormat format);
 
 enum isl_format
-anv_get_isl_format(VkFormat format, VkImageAspectFlags aspect);
+anv_get_isl_format(VkFormat format, VkImageAspectFlags aspect,
+                   VkImageTiling tiling);
 
 static inline bool
 anv_format_is_color(const struct anv_format *format)
@@ -1393,15 +1455,6 @@ anv_format_is_depth_or_stencil(const struct anv_format *format)
    return format->depth_format || format->has_stencil;
 }
 
-struct anv_image_view_info {
-   uint8_t surface_type; /**< RENDER_SURFACE_STATE.SurfaceType */
-   bool is_array:1; /**< RENDER_SURFACE_STATE.SurfaceArray */
-   bool is_cube:1; /**< RENDER_SURFACE_STATE.CubeFaceEnable* */
-};
-
-struct anv_image_view_info
-anv_image_view_info_for_vk_image_view_type(VkImageViewType type);
-
 /**
  * Subsurface of an anv_image.
  */
@@ -1416,11 +1469,16 @@ struct anv_surface {
 
 struct anv_image {
    VkImageType type;
+   /* The original VkFormat provided by the client.  This may not match any
+    * of the actual surface formats.
+    */
+   VkFormat vk_format;
    const struct anv_format *format;
    VkExtent3D extent;
    uint32_t levels;
    uint32_t array_size;
    VkImageUsageFlags usage; /**< Superset of VkImageCreateInfo::usage. */
+   VkImageTiling tiling; /** VkImageCreateInfo::tiling */
 
    VkDeviceSize size;
    uint32_t alignment;
@@ -1429,10 +1487,9 @@ struct anv_image {
    struct anv_bo *bo;
    VkDeviceSize offset;
 
-   uint8_t surface_type; /**< RENDER_SURFACE_STATE.SurfaceType */
-
    bool needs_nonrt_surface_state:1;
    bool needs_color_rt_surface_state:1;
+   bool needs_storage_surface_state:1;
 
    /**
     * Image subsurfaces
@@ -1458,9 +1515,12 @@ struct anv_image {
 
 struct anv_image_view {
    const struct anv_image *image; /**< VkImageViewCreateInfo::image */
-   const struct anv_format *format; /**< VkImageViewCreateInfo::format */
    struct anv_bo *bo;
    uint32_t offset; /**< Offset into bo. */
+
+   VkImageAspectFlags aspect_mask;
+   VkFormat vk_format;
+   enum isl_format format;
    VkExtent3D extent; /**< Extent of VkImageViewCreateInfo::baseMipLevel. */
 
    /** RENDER_SURFACE_STATE when using image as a color render target. */
@@ -1468,12 +1528,14 @@ struct anv_image_view {
 
    /** RENDER_SURFACE_STATE when using image as a non render target. */
    struct anv_state nonrt_surface_state;
+
+   /** RENDER_SURFACE_STATE when using image as a storage image. */
+   struct anv_state storage_surface_state;
 };
 
 struct anv_image_create_info {
    const VkImageCreateInfo *vk_info;
-   bool force_tiling;
-   enum isl_tiling tiling;
+   isl_tiling_flags_t isl_tiling_flags;
    uint32_t stride;
 };
 
@@ -1515,24 +1577,44 @@ gen9_image_view_init(struct anv_image_view *iview,
                      const VkImageViewCreateInfo* pCreateInfo,
                      struct anv_cmd_buffer *cmd_buffer);
 
+struct anv_buffer_view {
+   enum isl_format format; /**< VkBufferViewCreateInfo::format */
+   struct anv_bo *bo;
+   uint32_t offset; /**< Offset into bo. */
+   uint64_t range; /**< VkBufferViewCreateInfo::range */
+
+   struct anv_state surface_state;
+   struct anv_state storage_surface_state;
+};
+
+const struct anv_format *
+anv_format_for_descriptor_type(VkDescriptorType type);
+
 void anv_fill_buffer_surface_state(struct anv_device *device, void *state,
-                                   const struct anv_format *format,
+                                   enum isl_format format,
                                    uint32_t offset, uint32_t range,
                                    uint32_t stride);
 
-void gen7_fill_buffer_surface_state(void *state, const struct anv_format *format,
+void gen7_fill_buffer_surface_state(void *state, enum isl_format format,
                                     uint32_t offset, uint32_t range,
                                     uint32_t stride);
-void gen75_fill_buffer_surface_state(void *state, const struct anv_format *format,
+void gen75_fill_buffer_surface_state(void *state, enum isl_format format,
                                      uint32_t offset, uint32_t range,
                                      uint32_t stride);
-void gen8_fill_buffer_surface_state(void *state, const struct anv_format *format,
+void gen8_fill_buffer_surface_state(void *state, enum isl_format format,
                                     uint32_t offset, uint32_t range,
                                     uint32_t stride);
-void gen9_fill_buffer_surface_state(void *state, const struct anv_format *format,
+void gen9_fill_buffer_surface_state(void *state, enum isl_format format,
                                     uint32_t offset, uint32_t range,
                                     uint32_t stride);
 
+void anv_image_view_fill_image_param(struct anv_device *device,
+                                     struct anv_image_view *view,
+                                     struct brw_image_param *param);
+void anv_buffer_view_fill_image_param(struct anv_device *device,
+                                      struct anv_buffer_view *view,
+                                      struct brw_image_param *param);
+
 struct anv_sampler {
    uint32_t state[4];
 };
@@ -1565,6 +1647,7 @@ struct anv_render_pass_attachment {
 struct anv_render_pass {
    uint32_t                                     attachment_count;
    uint32_t                                     subpass_count;
+   uint32_t *                                   subpass_attachments;
    struct anv_render_pass_attachment *          attachments;
    struct anv_subpass                           subpasses[0];
 };
@@ -1583,7 +1666,7 @@ struct anv_query_pool {
    struct anv_bo                                bo;
 };
 
-void anv_device_init_meta(struct anv_device *device);
+VkResult anv_device_init_meta(struct anv_device *device);
 void anv_device_finish_meta(struct anv_device *device);
 
 void *anv_lookup_entrypoint(const char *name);
@@ -1631,13 +1714,16 @@ ANV_DEFINE_HANDLE_CASTS(anv_queue, VkQueue)
 
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_cmd_pool, VkCommandPool)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer, VkBuffer)
+ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer_view, VkBufferView)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_descriptor_set, VkDescriptorSet)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_descriptor_set_layout, VkDescriptorSetLayout)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_device_memory, VkDeviceMemory)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_fence, VkFence)
+ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_event, VkEvent)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_framebuffer, VkFramebuffer)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_image, VkImage)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_image_view, VkImageView);
+ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline_cache, VkPipelineCache)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline, VkPipeline)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline_layout, VkPipelineLayout)
 ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_query_pool, VkQueryPool)