Edit

IABSD.fr/xenocara/lib/mesa/src/virtio/vulkan/vn_command_buffer.h

Branch :

  • Show log

    Commit

  • Author : jsg
    Date : 2025-06-05 11:23:11
    Hash : 67d6f117
    Message : Import Mesa 25.0.7

  • lib/mesa/src/virtio/vulkan/vn_command_buffer.h
  • /*
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: MIT
     *
     * based in part on anv and radv which are:
     * Copyright © 2015 Intel Corporation
     * Copyright © 2016 Red Hat.
     * Copyright © 2016 Bas Nieuwenhuizen
     */
    
    #ifndef VN_COMMAND_BUFFER_H
    #define VN_COMMAND_BUFFER_H
    
    #include "vn_common.h"
    
    #include "vn_cs.h"
    
    struct vn_command_pool {
       struct vn_object_base base;
    
       VkAllocationCallbacks allocator;
       struct vn_device *device;
       uint32_t queue_family_index;
    
       struct list_head command_buffers;
    
       /* The list contains the recycled query records allocated from the same
        * command pool.
        *
        * For normal cmd pool, no additional locking is needed as below have
        * already been protected by external synchronization:
        * - alloc: record query, reset query and patch-in query records from the
        *          secondary cmds
        * - recycle: explicit and implicit cmd reset, cmd free and pool reset
        * - free: pool purge reset and pool destroy
        *
        * For feedback cmd pool, external locking is needed for now for below:
        * - alloc: queue submission
        * - recycle: queue submission and companion cmd reset/free
        * - free: device destroy
        */
       struct list_head free_query_records;
    
       /* for scrubbing VK_IMAGE_LAYOUT_PRESENT_SRC_KHR */
       struct vn_cached_storage storage;
    };
    VK_DEFINE_NONDISP_HANDLE_CASTS(vn_command_pool,
                                   base.base,
                                   VkCommandPool,
                                   VK_OBJECT_TYPE_COMMAND_POOL)
    
    enum vn_command_buffer_state {
       VN_COMMAND_BUFFER_STATE_INITIAL,
       VN_COMMAND_BUFFER_STATE_RECORDING,
       VN_COMMAND_BUFFER_STATE_EXECUTABLE,
       VN_COMMAND_BUFFER_STATE_INVALID,
    };
    
    /* command buffer builder to:
     * - fix wsi image ownership and layout transitions
     * - scrub ignored bits in VkCommandBufferBeginInfo
     * - support asynchronization query optimization (query feedback)
     */
    struct vn_command_buffer_builder {
       /* track the active legacy render pass */
       const struct vn_render_pass *render_pass;
       /* track the wsi images requiring layout fixes */
       const struct vn_image **present_src_images;
       /* track if inside a render pass instance */
       bool in_render_pass;
       /* track the active subpass for view mask used in the subpass */
       uint32_t subpass_index;
       /* track the active view mask inside a render pass instance */
       uint32_t view_mask;
       /* track if VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT was set */
       bool is_simultaneous;
       /* track the recorded queries and resets */
       struct list_head query_records;
    };
    
    struct vn_query_feedback_cmd;
    
    struct vn_command_buffer {
       struct vn_object_base base;
    
       struct vn_command_pool *pool;
       VkCommandBufferLevel level;
       enum vn_command_buffer_state state;
       struct vn_cs_encoder cs;
    
       struct vn_command_buffer_builder builder;
    
       struct vn_query_feedback_cmd *linked_qfb_cmd;
    
       struct list_head head;
    };
    VK_DEFINE_HANDLE_CASTS(vn_command_buffer,
                           base.base,
                           VkCommandBuffer,
                           VK_OBJECT_TYPE_COMMAND_BUFFER)
    
    /* Queries recorded to support qfb.
     * - query_count is the actual queries used with multiview considered
     * - copy is whether the record is for result copy or query reset
     *
     * The query records are tracked at each cmd with the recording order. Those
     * from the secondary cmds are patched into the primary ones at this moment.
     */
    struct vn_cmd_query_record {
       struct vn_query_pool *query_pool;
       uint32_t query;
       uint32_t query_count;
       bool copy;
    
       struct list_head head;
    };
    
    struct vn_cmd_query_record *
    vn_cmd_pool_alloc_query_record(struct vn_command_pool *cmd_pool,
                                   struct vn_query_pool *query_pool,
                                   uint32_t query,
                                   uint32_t query_count,
                                   bool copy);
    
    static inline void
    vn_cmd_pool_free_query_records(struct vn_command_pool *cmd_pool,
                                   struct list_head *query_records)
    {
       list_splicetail(query_records, &cmd_pool->free_query_records);
    }
    
    #endif /* VN_COMMAND_BUFFER_H */