mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-14 06:40:35 +02:00
nvk: Add an nvk_queue_submit wrapper
Instead of having the common queue code call into drm_nouveau code directly, add a wrapper layer. This gives us a place to put things like command buffer dumping. Importantly, we move calling `vk_queue_set_error()` to this layer because it may abort if the `VK_ABORT_ON_DEVICE_LOST` is set and we may want to dump before that happens. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
parent
f249555504
commit
23aaa4e179
3 changed files with 34 additions and 10 deletions
|
|
@ -222,6 +222,30 @@ nvk_queue_state_update(struct nvk_device *dev,
|
|||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
static VkResult
|
||||
nvk_queue_submit(struct vk_queue *vk_queue,
|
||||
struct vk_queue_submit *submit)
|
||||
{
|
||||
struct nvk_queue *queue = container_of(vk_queue, struct nvk_queue, vk);
|
||||
struct nvk_device *dev = nvk_queue_device(queue);
|
||||
VkResult result;
|
||||
|
||||
if (vk_queue_is_lost(&queue->vk))
|
||||
return VK_ERROR_DEVICE_LOST;
|
||||
|
||||
result = nvk_queue_state_update(dev, &queue->state);
|
||||
if (result != VK_SUCCESS) {
|
||||
return vk_queue_set_lost(&queue->vk, "Failed to update queue base "
|
||||
"pointers pushbuf");
|
||||
}
|
||||
|
||||
result = nvk_queue_submit_drm_nouveau(queue, submit);
|
||||
if (result != VK_SUCCESS)
|
||||
return vk_queue_set_lost(&queue->vk, "Submit failed");
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
VkResult
|
||||
nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue,
|
||||
const VkDeviceQueueCreateInfo *pCreateInfo,
|
||||
|
|
@ -235,7 +259,7 @@ nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue,
|
|||
|
||||
nvk_queue_state_init(&queue->state);
|
||||
|
||||
queue->vk.driver_submit = nvk_queue_submit_drm_nouveau;
|
||||
queue->vk.driver_submit = nvk_queue_submit;
|
||||
|
||||
void *empty_push_map;
|
||||
queue->empty_push = nouveau_ws_bo_new_mapped(dev->pdev->dev, 4096, 0,
|
||||
|
|
@ -288,6 +312,9 @@ nvk_queue_submit_simple(struct nvk_queue *queue,
|
|||
struct nouveau_ws_bo *push_bo;
|
||||
VkResult result;
|
||||
|
||||
if (vk_queue_is_lost(&queue->vk))
|
||||
return VK_ERROR_DEVICE_LOST;
|
||||
|
||||
void *push_map;
|
||||
push_bo = nouveau_ws_bo_new_mapped(dev->pdev->dev, dw_count * 4, 0,
|
||||
NOUVEAU_WS_BO_GART | NOUVEAU_WS_BO_MAP,
|
||||
|
|
@ -299,6 +326,8 @@ nvk_queue_submit_simple(struct nvk_queue *queue,
|
|||
|
||||
result = nvk_queue_submit_simple_drm_nouveau(queue, push_bo, dw_count,
|
||||
extra_bo);
|
||||
if (result != VK_SUCCESS)
|
||||
result = vk_queue_set_lost(&queue->vk, "Submit failed");
|
||||
|
||||
nouveau_ws_bo_unmap(push_bo, push_map);
|
||||
nouveau_ws_bo_destroy(push_bo);
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ VkResult nvk_queue_submit_simple_drm_nouveau(struct nvk_queue *queue,
|
|||
uint32_t push_dw_count,
|
||||
struct nouveau_ws_bo *extra_bo);
|
||||
|
||||
VkResult nvk_queue_submit_drm_nouveau(struct vk_queue *vkqueue,
|
||||
VkResult nvk_queue_submit_drm_nouveau(struct nvk_queue *queue,
|
||||
struct vk_queue_submit *submit);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -90,8 +90,8 @@ push_submit(struct push_builder *pb, struct nvk_queue *queue)
|
|||
DRM_NOUVEAU_GEM_PUSHBUF,
|
||||
&pb->req, sizeof(pb->req));
|
||||
if (ret != 0) {
|
||||
return vk_queue_set_lost(&queue->vk,
|
||||
"DRM_NOUVEAU_GEM_PUSHBUF failed: %m");
|
||||
return vk_errorf(queue, VK_ERROR_UNKNOWN,
|
||||
"DRM_NOUVEAU_GEM_PUSHBUF failed: %m");
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
|
|
@ -130,18 +130,13 @@ push_add_queue_state(struct push_builder *pb, struct nvk_queue_state *qs)
|
|||
}
|
||||
|
||||
VkResult
|
||||
nvk_queue_submit_drm_nouveau(struct vk_queue *vk_queue,
|
||||
nvk_queue_submit_drm_nouveau(struct nvk_queue *queue,
|
||||
struct vk_queue_submit *submit)
|
||||
{
|
||||
struct nvk_queue *queue = container_of(vk_queue, struct nvk_queue, vk);
|
||||
struct nvk_device *dev = nvk_queue_device(queue);
|
||||
struct push_builder pb;
|
||||
VkResult result;
|
||||
|
||||
result = nvk_queue_state_update(dev, &queue->state);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
|
||||
push_builder_init(dev, &pb);
|
||||
|
||||
for (uint32_t i = 0; i < submit->signal_count; i++) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue