blob: 6057b81a2f342c0faaf3631dc84f2ea9aa6039d2 [file] [log] [blame] [edit]
/*
* Copyright 2024 Valve Corporation
* Copyright 2024 Alyssa Rosenzweig
* Copyright 2022-2023 Collabora Ltd. and Red Hat Inc.
* SPDX-License-Identifier: MIT
*/
#include "hk_event.h"
#include "vulkan/vulkan_core.h"
#include "agx_bo.h"
#include "hk_cmd_buffer.h"
#include "hk_device.h"
#include "hk_entrypoints.h"
#define HK_EVENT_MEM_SIZE sizeof(VkResult)
VKAPI_ATTR VkResult VKAPI_CALL
hk_CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkEvent *pEvent)
{
VK_FROM_HANDLE(hk_device, dev, device);
struct hk_event *event;
event = vk_object_zalloc(&dev->vk, pAllocator, sizeof(*event),
VK_OBJECT_TYPE_EVENT);
if (!event)
return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
/* TODO: this is really wasteful, bring back the NVK heap!
*
* XXX
*/
event->bo =
agx_bo_create(&dev->dev, HK_EVENT_MEM_SIZE, 0, AGX_BO_WRITEBACK, "Event");
event->status = event->bo->map;
event->addr = event->bo->va->addr;
*event->status = VK_EVENT_RESET;
*pEvent = hk_event_to_handle(event);
return VK_SUCCESS;
}
VKAPI_ATTR void VKAPI_CALL
hk_DestroyEvent(VkDevice device, VkEvent _event,
const VkAllocationCallbacks *pAllocator)
{
VK_FROM_HANDLE(hk_device, dev, device);
VK_FROM_HANDLE(hk_event, event, _event);
if (!event)
return;
agx_bo_unreference(&dev->dev, event->bo);
vk_object_free(&dev->vk, pAllocator, event);
}
VKAPI_ATTR VkResult VKAPI_CALL
hk_GetEventStatus(VkDevice device, VkEvent _event)
{
VK_FROM_HANDLE(hk_event, event, _event);
return *event->status;
}
VKAPI_ATTR VkResult VKAPI_CALL
hk_SetEvent(VkDevice device, VkEvent _event)
{
VK_FROM_HANDLE(hk_event, event, _event);
*event->status = VK_EVENT_SET;
return VK_SUCCESS;
}
VKAPI_ATTR VkResult VKAPI_CALL
hk_ResetEvent(VkDevice device, VkEvent _event)
{
VK_FROM_HANDLE(hk_event, event, _event);
*event->status = VK_EVENT_RESET;
return VK_SUCCESS;
}
VKAPI_ATTR void VKAPI_CALL
hk_CmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent _event,
const VkDependencyInfo *pDependencyInfo)
{
VK_FROM_HANDLE(hk_cmd_buffer, cmd, commandBuffer);
VK_FROM_HANDLE(hk_event, event, _event);
hk_queue_write(cmd, event->bo->va->addr, VK_EVENT_SET, false);
}
VKAPI_ATTR void VKAPI_CALL
hk_CmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent _event,
VkPipelineStageFlags2 stageMask)
{
VK_FROM_HANDLE(hk_cmd_buffer, cmd, commandBuffer);
VK_FROM_HANDLE(hk_event, event, _event);
hk_queue_write(cmd, event->bo->va->addr, VK_EVENT_RESET, false);
}
VKAPI_ATTR void VKAPI_CALL
hk_CmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount,
const VkEvent *pEvents,
const VkDependencyInfo *pDependencyInfos)
{
/* Currently we barrier everything, so this is a no-op. */
}