turnip: respect color attachment formats
[mesa.git] / src / freedreno / vulkan / tu_private.h
index 5a9e55aa8efbf5cf16623050da1af250f58d6b84..9b179f666cfa78eb509de1c17164bcef9e9aa038 100644 (file)
@@ -51,6 +51,7 @@
 #include "vk_alloc.h"
 #include "vk_debug_report.h"
 
+#include "drm/msm_drm.h"
 #include "tu_descriptor_set.h"
 #include "tu_extensions.h"
 
@@ -66,12 +67,12 @@ typedef uint32_t xcb_window_t;
 #include <vulkan/vulkan.h>
 #include <vulkan/vulkan_intel.h>
 
-#include "drm/freedreno_ringbuffer.h"
 #include "tu_entrypoints.h"
 
 #define MAX_VBS 32
 #define MAX_VERTEX_ATTRIBS 32
 #define MAX_RTS 8
+#define MAX_VSC_PIPES 32
 #define MAX_VIEWPORTS 16
 #define MAX_SCISSORS 16
 #define MAX_DISCARD_RECTANGLES 4
@@ -293,9 +294,10 @@ struct tu_physical_device
    int local_fd;
    int master_fd;
 
-   struct fd_device *drm_device;
    unsigned gpu_id;
    uint32_t gmem_size;
+   uint32_t tile_align_w;
+   uint32_t tile_align_h;
 
    /* This is the drivers on-disk cache used as a fallback as opposed to
     * the pipeline cache defined by apps.
@@ -394,6 +396,25 @@ struct tu_meta_state
 
 #define TU_MAX_QUEUE_FAMILIES 1
 
+struct tu_fence
+{
+   bool signaled;
+   int fd;
+};
+
+void
+tu_fence_init(struct tu_fence *fence, bool signaled);
+void
+tu_fence_finish(struct tu_fence *fence);
+void
+tu_fence_update_fd(struct tu_fence *fence, int fd);
+void
+tu_fence_copy(struct tu_fence *fence, const struct tu_fence *src);
+void
+tu_fence_signal(struct tu_fence *fence);
+void
+tu_fence_wait_idle(struct tu_fence *fence);
+
 struct tu_queue
 {
    VK_LOADER_DATA _loader_data;
@@ -403,6 +424,7 @@ struct tu_queue
    VkDeviceQueueCreateFlags flags;
 
    uint32_t msm_queue_id;
+   struct tu_fence submit_fence;
 };
 
 struct tu_device
@@ -433,18 +455,85 @@ struct tu_bo
 {
    uint32_t gem_handle;
    uint64_t size;
-   uint64_t offset;
    uint64_t iova;
    void *map;
 };
 
 VkResult
 tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size);
+VkResult
+tu_bo_init_dmabuf(struct tu_device *dev,
+                  struct tu_bo *bo,
+                  uint64_t size,
+                  int fd);
+int
+tu_bo_export_dmabuf(struct tu_device *dev, struct tu_bo *bo);
 void
 tu_bo_finish(struct tu_device *dev, struct tu_bo *bo);
 VkResult
 tu_bo_map(struct tu_device *dev, struct tu_bo *bo);
 
+struct tu_cs_entry
+{
+   /* No ownership */
+   const struct tu_bo *bo;
+
+   uint32_t size;
+   uint64_t offset;
+};
+
+enum tu_cs_mode
+{
+
+   /*
+    * A command stream in TU_CS_MODE_GROW mode grows automatically whenever it
+    * is full.  tu_cs_begin must be called before command packet emission and
+    * tu_cs_end must be called after.
+    *
+    * This mode may create multiple entries internally.  The entries must be
+    * submitted together.
+    */
+   TU_CS_MODE_GROW,
+
+   /*
+    * A command stream in TU_CS_MODE_EXTERNAL mode wraps an external,
+    * fixed-size buffer.  tu_cs_begin and tu_cs_end are optional and have no
+    * effect on it.
+    *
+    * This mode does not create any entry or any BO.
+    */
+   TU_CS_MODE_EXTERNAL,
+
+   /*
+    * A command stream in TU_CS_MODE_SUB_STREAM mode does not support direct
+    * command packet emission.  tu_cs_begin_sub_stream must be called to get a
+    * sub-stream to emit comamnd packets to.  When done with the sub-stream,
+    * tu_cs_end_sub_stream must be called.
+    *
+    * This mode does not create any entry internally.
+    */
+   TU_CS_MODE_SUB_STREAM,
+};
+
+struct tu_cs
+{
+   uint32_t *start;
+   uint32_t *cur;
+   uint32_t *reserved_end;
+   uint32_t *end;
+
+   enum tu_cs_mode mode;
+   uint32_t next_bo_size;
+
+   struct tu_cs_entry *entries;
+   uint32_t entry_count;
+   uint32_t entry_capacity;
+
+   struct tu_bo **bos;
+   uint32_t bo_count;
+   uint32_t bo_capacity;
+};
+
 struct tu_device_memory
 {
    struct tu_bo bo;
@@ -665,6 +754,37 @@ struct tu_descriptor_state
    uint32_t dynamic_buffers[4 * MAX_DYNAMIC_BUFFERS];
 };
 
+struct tu_tile
+{
+   uint8_t pipe;
+   uint8_t slot;
+   VkOffset2D begin;
+   VkOffset2D end;
+};
+
+struct tu_tiling_config
+{
+   VkRect2D render_area;
+   uint32_t buffer_cpp[MAX_RTS + 2];
+   uint32_t buffer_count;
+
+   /* position and size of the first tile */
+   VkRect2D tile0;
+   /* number of tiles */
+   VkExtent2D tile_count;
+
+   uint32_t gmem_offsets[MAX_RTS + 2];
+
+   /* size of the first VSC pipe */
+   VkExtent2D pipe0;
+   /* number of VSC pipes */
+   VkExtent2D pipe_count;
+
+   /* pipe register values */
+   uint32_t pipe_config[MAX_VSC_PIPES];
+   uint32_t pipe_sizes[MAX_VSC_PIPES];
+};
+
 struct tu_cmd_state
 {
    /* Vertex descriptors */
@@ -679,6 +799,16 @@ struct tu_cmd_state
    uint32_t index_type;
    uint32_t max_index_count;
    uint64_t index_va;
+
+   const struct tu_render_pass *pass;
+   const struct tu_subpass *subpass;
+   const struct tu_framebuffer *framebuffer;
+   struct tu_attachment_state *attachments;
+
+   struct tu_tiling_config tiling_config;
+
+   struct tu_cs_entry tile_load_ib;
+   struct tu_cs_entry tile_store_ib;
 };
 
 struct tu_cmd_pool
@@ -710,38 +840,23 @@ struct tu_bo_list
 {
    uint32_t count;
    uint32_t capacity;
-   uint32_t *handles;
+   struct drm_msm_gem_submit_bo *bo_infos;
 };
 
-void tu_bo_list_init(struct tu_bo_list *list);
-void tu_bo_list_destroy(struct tu_bo_list *list);
-void tu_bo_list_reset(struct tu_bo_list *list);
-uint32_t tu_bo_list_add(struct tu_bo_list *list,
-                        const struct tu_bo *bo);
-
-struct tu_cmd_stream_entry
-{
-    /* No ownership */
-   struct tu_bo *bo;
+#define TU_BO_LIST_FAILED (~0)
 
-   uint32_t size;
-   uint64_t offset;
-};
-
-struct tu_cmd_stream
-{
-   uint32_t *start;
-   uint32_t *cur;
-   uint32_t *end;
-
-   struct tu_cmd_stream_entry *entries;
-   uint32_t entry_count;
-   uint32_t entry_capacity;
-
-   struct tu_bo **bos;
-   uint32_t bo_count;
-   uint32_t bo_capacity;
-};
+void
+tu_bo_list_init(struct tu_bo_list *list);
+void
+tu_bo_list_destroy(struct tu_bo_list *list);
+void
+tu_bo_list_reset(struct tu_bo_list *list);
+uint32_t
+tu_bo_list_add(struct tu_bo_list *list,
+               const struct tu_bo *bo,
+               uint32_t flags);
+VkResult
+tu_bo_list_merge(struct tu_bo_list *list, const struct tu_bo_list *other);
 
 struct tu_cmd_buffer
 {
@@ -768,10 +883,19 @@ struct tu_cmd_buffer
 
    struct tu_cmd_buffer_upload upload;
 
+   VkResult record_result;
+
    struct tu_bo_list bo_list;
-   struct tu_cmd_stream cs;
+   struct tu_cs cs;
+   struct tu_cs tile_cs;
 
-   VkResult record_result;
+   uint16_t marker_reg;
+   uint32_t marker_seqno;
+
+   struct tu_bo scratch_bo;
+   uint32_t scratch_seqno;
+
+   bool wait_for_idle;
 };
 
 bool
@@ -878,41 +1002,22 @@ tu_graphics_pipeline_create(
    const VkAllocationCallbacks *alloc,
    VkPipeline *pPipeline);
 
-struct vk_format_description;
-uint32_t
-tu_translate_buffer_dataformat(const struct vk_format_description *desc,
-                               int first_non_void);
-uint32_t
-tu_translate_buffer_numformat(const struct vk_format_description *desc,
-                              int first_non_void);
-uint32_t
-tu_translate_colorformat(VkFormat format);
-uint32_t
-tu_translate_color_numformat(VkFormat format,
-                             const struct vk_format_description *desc,
-                             int first_non_void);
-uint32_t
-tu_colorformat_endian_swap(uint32_t colorformat);
-unsigned
-tu_translate_colorswap(VkFormat format, bool do_endian_swap);
-uint32_t
-tu_translate_dbformat(VkFormat format);
-uint32_t
-tu_translate_tex_dataformat(VkFormat format,
-                            const struct vk_format_description *desc,
-                            int first_non_void);
-uint32_t
-tu_translate_tex_numformat(VkFormat format,
-                           const struct vk_format_description *desc,
-                           int first_non_void);
-bool
-tu_format_pack_clear_color(VkFormat format,
-                           uint32_t clear_vals[2],
-                           VkClearColorValue *value);
-bool
-tu_is_colorbuffer_format_supported(VkFormat format, bool *blendable);
-bool
-tu_dcc_formats_compatible(VkFormat format1, VkFormat format2);
+struct tu_native_format
+{
+   int vtx;      /* VFMTn_xxx or -1 */
+   int tex;      /* TFMTn_xxx or -1 */
+   int rb;       /* RBn_xxx or -1 */
+   int swap;     /* enum a3xx_color_swap */
+   bool present; /* internal only; always true to external users */
+};
+
+const struct tu_native_format *
+tu6_get_native_format(VkFormat format);
+
+int
+tu_pack_clear_value(const VkClearValue *val,
+                    VkFormat format,
+                    uint32_t buf[4]);
 
 struct tu_image_level
 {
@@ -933,6 +1038,8 @@ struct tu_image
    VkImageTiling tiling;     /** VkImageCreateInfo::tiling */
    VkImageCreateFlags flags; /** VkImageCreateInfo::flags */
    VkExtent3D extent;
+   uint32_t level_count;
+   uint32_t layer_count;
 
    VkDeviceSize size;
    uint32_t alignment;
@@ -948,6 +1055,10 @@ struct tu_image
 
    /* For VK_ANDROID_native_buffer, the WSI image owns the memory, */
    VkDeviceMemory owned_memory;
+
+   /* Set when bound */
+   const struct tu_bo *bo;
+   VkDeviceSize bo_offset;
 };
 
 unsigned
@@ -959,14 +1070,18 @@ static inline uint32_t
 tu_get_layerCount(const struct tu_image *image,
                   const VkImageSubresourceRange *range)
 {
-   abort();
+   return range->layerCount == VK_REMAINING_ARRAY_LAYERS
+             ? image->layer_count - range->baseArrayLayer
+             : range->layerCount;
 }
 
 static inline uint32_t
 tu_get_levelCount(const struct tu_image *image,
                   const VkImageSubresourceRange *range)
 {
-   abort();
+   return range->levelCount == VK_REMAINING_MIP_LEVELS
+             ? image->level_count - range->baseMipLevel
+             : range->levelCount;
 }
 
 struct tu_image_view
@@ -1185,24 +1300,34 @@ tu_meta_push_descriptor_set(struct tu_cmd_buffer *cmd_buffer,
                             uint32_t descriptorWriteCount,
                             const VkWriteDescriptorSet *pDescriptorWrites);
 
-struct tu_fence
-{
-   uint32_t syncobj;
-   uint32_t temp_syncobj;
-};
+int
+tu_drm_get_gpu_id(const struct tu_physical_device *dev, uint32_t *id);
+
+int
+tu_drm_get_gmem_size(const struct tu_physical_device *dev, uint32_t *size);
+
+int
+tu_drm_submitqueue_new(const struct tu_device *dev,
+                       int priority,
+                       uint32_t *queue_id);
+
+void
+tu_drm_submitqueue_close(const struct tu_device *dev, uint32_t queue_id);
 
 uint32_t
-tu_gem_new(struct tu_device *dev, uint64_t size, uint32_t flags);
+tu_gem_new(const struct tu_device *dev, uint64_t size, uint32_t flags);
+uint32_t
+tu_gem_import_dmabuf(const struct tu_device *dev,
+                     int prime_fd,
+                     uint64_t size);
+int
+tu_gem_export_dmabuf(const struct tu_device *dev, uint32_t gem_handle);
 void
-tu_gem_close(struct tu_device *dev, uint32_t gem_handle);
+tu_gem_close(const struct tu_device *dev, uint32_t gem_handle);
 uint64_t
-tu_gem_info_offset(struct tu_device *dev, uint32_t gem_handle);
+tu_gem_info_offset(const struct tu_device *dev, uint32_t gem_handle);
 uint64_t
-tu_gem_info_iova(struct tu_device *dev, uint32_t gem_handle);
-int
-tu_drm_query_param(struct tu_physical_device *dev,
-                   uint32_t param,
-                   uint64_t *value);
+tu_gem_info_iova(const struct tu_device *dev, uint32_t gem_handle);
 
 #define TU_DEFINE_HANDLE_CASTS(__tu_type, __VkType)                          \
                                                                              \