diff --git a/src/virtio/vulkan/vn_instance.h b/src/virtio/vulkan/vn_instance.h index c4ed72e2716..4b5114f5f81 100644 --- a/src/virtio/vulkan/vn_instance.h +++ b/src/virtio/vulkan/vn_instance.h @@ -143,7 +143,8 @@ static inline void vn_instance_submit_command(struct vn_instance *instance, struct vn_instance_submit_command *submit) { - vn_ring_submit_command(instance->ring.ring, submit); + vn_ring_submit_command(instance->ring.ring, + (struct vn_ring_submit_command *)submit); } static inline struct vn_cs_decoder * diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index f56c962d621..8dbd92beeda 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -617,7 +617,7 @@ vn_ring_set_reply_shmem_locked(struct vn_ring *ring, void vn_ring_submit_command(struct vn_ring *ring, - struct vn_instance_submit_command *submit) + struct vn_ring_submit_command *submit) { assert(!vn_cs_encoder_is_empty(&submit->command)); @@ -651,3 +651,11 @@ vn_ring_submit_command(struct vn_ring *ring, vn_ring_wait_seqno(ring, submit->ring_seqno); } } + +void +vn_ring_free_command_reply(struct vn_ring *ring, + struct vn_ring_submit_command *submit) +{ + assert(submit->reply_shmem); + vn_renderer_shmem_unref(ring->instance->renderer, submit->reply_shmem); +} diff --git a/src/virtio/vulkan/vn_ring.h b/src/virtio/vulkan/vn_ring.h index b06b4b5630f..ac8acb7b7fd 100644 --- a/src/virtio/vulkan/vn_ring.h +++ b/src/virtio/vulkan/vn_ring.h @@ -63,12 +63,52 @@ vn_ring_unset_status_bits(struct vn_ring *ring, uint32_t mask); bool vn_ring_get_seqno_status(struct vn_ring *ring, uint32_t seqno); -/* forward declaration before updating protocol to submit via ring */ -struct vn_instance_submit_command; +struct vn_ring_submit_command { + /* empty command implies errors */ + struct vn_cs_encoder command; + struct vn_cs_encoder_buffer buffer; + /* non-zero implies waiting */ + size_t reply_size; + + /* when reply_size is non-zero, NULL can be returned on errors */ + struct vn_renderer_shmem *reply_shmem; + struct vn_cs_decoder reply; + + /* valid when instance ring submission succeeds */ + bool ring_seqno_valid; + uint32_t ring_seqno; +}; + +static inline struct vn_cs_encoder * +vn_ring_submit_command_init(struct vn_ring *ring, + struct vn_ring_submit_command *submit, + void *cmd_data, + size_t cmd_size, + size_t reply_size) +{ + submit->buffer = VN_CS_ENCODER_BUFFER_INITIALIZER(cmd_data); + submit->command = VN_CS_ENCODER_INITIALIZER(&submit->buffer, cmd_size); + + submit->reply_size = reply_size; + submit->reply_shmem = NULL; + + return &submit->command; +} + +static inline struct vn_cs_decoder * +vn_ring_get_command_reply(struct vn_ring *ring, + struct vn_ring_submit_command *submit) +{ + return submit->reply_shmem ? &submit->reply : NULL; +} + +void +vn_ring_free_command_reply(struct vn_ring *ring, + struct vn_ring_submit_command *submit); void vn_ring_submit_command(struct vn_ring *ring, - struct vn_instance_submit_command *submit); + struct vn_ring_submit_command *submit); VkResult vn_ring_submit_command_simple(struct vn_ring *ring,