tu: ir3: Emit push constants directly
[mesa.git] / src / freedreno / vulkan / tu_private.h
index 583c38a0a0473915349f7d82a0b277c52b6af5f7..3c50b2ec0194b387be19ee19e8ff9b0b1fd5bbcf 100644 (file)
@@ -77,6 +77,8 @@ typedef uint32_t xcb_window_t;
 
 #include "tu_entrypoints.h"
 
+#include "vk_format.h"
+
 #define MAX_VBS 32
 #define MAX_VERTEX_ATTRIBS 32
 #define MAX_RTS 8
@@ -850,6 +852,8 @@ enum tu_cmd_dirty_bits
    TU_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 17,
    TU_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK = 1 << 18,
    TU_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE = 1 << 19,
+   TU_CMD_DIRTY_DYNAMIC_VIEWPORT = 1 << 20,
+   TU_CMD_DIRTY_DYNAMIC_SCISSOR = 1 << 21,
 };
 
 struct tu_streamout_state {
@@ -1125,10 +1129,17 @@ struct tu_descriptor_map
    int array_size[128];
 };
 
+struct tu_push_constant_range
+{
+   uint32_t lo;
+   uint32_t count;
+};
+
 struct tu_shader
 {
    struct ir3_shader ir3_shader;
 
+   struct tu_push_constant_range push_consts;
    struct tu_descriptor_map texture_map;
    struct tu_descriptor_map sampler_map;
    struct tu_descriptor_map ubo_map;
@@ -1177,6 +1188,7 @@ struct tu_program_descriptor_linkage
 
    uint32_t constlen;
 
+   struct tu_push_constant_range push_consts;
    struct tu_descriptor_map texture_map;
    struct tu_descriptor_map sampler_map;
    struct tu_descriptor_map ubo_map;
@@ -1282,6 +1294,48 @@ tu6_emit_stencil_reference(struct tu_cs *cs, uint32_t front, uint32_t back);
 void
 tu6_emit_blend_constants(struct tu_cs *cs, const float constants[4]);
 
+void tu6_emit_msaa(struct tu_cs *cs, VkSampleCountFlagBits samples);
+
+void tu6_emit_window_scissor(struct tu_cs *cs, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2);
+
+void tu6_emit_window_offset(struct tu_cs *cs, uint32_t x1, uint32_t y1);
+
+struct tu_image_view;
+
+void
+tu_resolve_sysmem(struct tu_cmd_buffer *cmd,
+                  struct tu_cs *cs,
+                  struct tu_image_view *src,
+                  struct tu_image_view *dst,
+                  uint32_t layers,
+                  const VkRect2D *rect);
+
+void
+tu_clear_sysmem_attachment(struct tu_cmd_buffer *cmd,
+                           struct tu_cs *cs,
+                           uint32_t a,
+                           const VkRenderPassBeginInfo *info);
+
+void
+tu_clear_gmem_attachment(struct tu_cmd_buffer *cmd,
+                         struct tu_cs *cs,
+                         uint32_t a,
+                         const VkRenderPassBeginInfo *info);
+
+void
+tu_load_gmem_attachment(struct tu_cmd_buffer *cmd, struct tu_cs *cs, uint32_t a);
+
+/* expose this function to be able to emit load without checking LOAD_OP */
+void
+tu_emit_load_gmem_attachment(struct tu_cmd_buffer *cmd, struct tu_cs *cs, uint32_t a);
+
+/* note: gmem store can also resolve */
+void
+tu_store_gmem_attachment(struct tu_cmd_buffer *cmd,
+                         struct tu_cs *cs,
+                         uint32_t a,
+                         uint32_t gmem_a);
+
 struct tu_userdata_info *
 tu_lookup_user_sgpr(struct tu_pipeline *pipeline,
                     gl_shader_stage stage,
@@ -1313,27 +1367,21 @@ struct tu_native_format
 {
    enum a6xx_format fmt : 8;
    enum a3xx_color_swap swap : 8;
+   enum a6xx_tile_mode tile_mode : 8;
    enum tu_supported_formats supported : 8;
 };
 
-struct tu_native_format tu6_get_native_format(VkFormat format);
 struct tu_native_format tu6_format_vtx(VkFormat format);
-enum a6xx_format tu6_format_gmem(VkFormat format);
-struct tu_native_format tu6_format_color(VkFormat format, bool tiled);
-struct tu_native_format tu6_format_texture(VkFormat format, bool tiled);
+struct tu_native_format tu6_format_color(VkFormat format, enum a6xx_tile_mode tile_mode);
+struct tu_native_format tu6_format_texture(VkFormat format, enum a6xx_tile_mode tile_mode);
 
-void
-tu_pack_clear_value(const VkClearValue *val,
-                    VkFormat format,
-                    uint32_t buf[4]);
-
-void
-tu_2d_clear_color(const VkClearColorValue *val, VkFormat format, uint32_t buf[4]);
-
-void
-tu_2d_clear_zs(const VkClearDepthStencilValue *val, VkFormat format, uint32_t buf[4]);
+static inline enum a6xx_format
+tu6_base_format(VkFormat format)
+{
+   /* note: tu6_format_color doesn't care about tiling for .fmt field */
+   return tu6_format_color(format, TILE6_LINEAR).fmt;
+}
 
-enum a6xx_2d_ifmt tu6_fmt_to_ifmt(enum a6xx_format fmt);
 enum a6xx_depth_format tu6_pipe2depth(VkFormat format);
 
 struct tu_image
@@ -1401,6 +1449,14 @@ tu_image_stride(struct tu_image *image, int level)
    return image->layout.slices[level].pitch * image->layout.cpp;
 }
 
+/* to get the right pitch for compressed formats */
+static inline uint32_t
+tu_image_pitch(struct tu_image *image, int level)
+{
+   uint32_t stride = tu_image_stride(image, level);
+   return stride / vk_format_get_blockwidth(image->vk_format);
+}
+
 static inline uint64_t
 tu_image_base(struct tu_image *image, int level, int layer)
 {
@@ -1450,10 +1506,34 @@ tu_image_ubwc_base(struct tu_image *image, int level, int layer)
 #define tu_image_view_ubwc_base_ref(iview) \
    tu_image_ubwc_base_ref(iview->image, iview->base_mip, iview->base_layer)
 
+#define tu_image_view_ubwc_pitches(iview)                                \
+   .pitch = tu_image_ubwc_pitch(iview->image, iview->base_mip),          \
+   .array_pitch = tu_image_ubwc_size(iview->image, iview->base_mip) >> 2
+
 enum a6xx_tile_mode
 tu6_get_image_tile_mode(struct tu_image *image, int level);
 enum a3xx_msaa_samples
 tu_msaa_samples(uint32_t samples);
+enum a6xx_tex_fetchsize
+tu6_fetchsize(VkFormat format);
+
+static inline struct tu_native_format
+tu6_format_image(struct tu_image *image, VkFormat format, uint32_t level)
+{
+   struct tu_native_format fmt =
+      tu6_format_color(format, image->layout.tile_mode);
+   fmt.tile_mode = tu6_get_image_tile_mode(image, level);
+   return fmt;
+}
+
+static inline struct tu_native_format
+tu6_format_image_src(struct tu_image *image, VkFormat format, uint32_t level)
+{
+   struct tu_native_format fmt =
+      tu6_format_texture(format, image->layout.tile_mode);
+   fmt.tile_mode = tu6_get_image_tile_mode(image, level);
+   return fmt;
+}
 
 struct tu_image_view
 {
@@ -1679,21 +1759,6 @@ tu_gem_info_offset(const struct tu_device *dev, uint32_t gem_handle);
 uint64_t
 tu_gem_info_iova(const struct tu_device *dev, uint32_t gem_handle);
 
-
-void
-tu_clear_sysmem_attachment(struct tu_cmd_buffer *cmd,
-                           struct tu_cs *cs,
-                           uint32_t attachment,
-                           const VkClearValue *value,
-                           const VkClearRect *rect);
-
-void
-tu_clear_gmem_attachment(struct tu_cmd_buffer *cmd,
-                         struct tu_cs *cs,
-                         uint32_t attachment,
-                         uint8_t component_mask,
-                         const VkClearValue *value);
-
 #define TU_DEFINE_HANDLE_CASTS(__tu_type, __VkType)                          \
                                                                              \
    static inline struct __tu_type *__tu_type##_from_handle(__VkType _handle) \