diff --git a/src/freedreno/vulkan/meson.build b/src/freedreno/vulkan/meson.build index 64d52d7db71..4ad9b3e0954 100644 --- a/src/freedreno/vulkan/meson.build +++ b/src/freedreno/vulkan/meson.build @@ -28,6 +28,7 @@ libtu_files = files( 'tu_device.cc', 'tu_descriptor_set.cc', 'tu_dynamic_rendering.cc', + 'tu_event.cc', 'tu_formats.cc', 'tu_image.cc', 'tu_knl.cc', diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index fbfdb5f6a89..2813d16f321 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -15,6 +15,7 @@ #include "tu_clear_blit.h" #include "tu_cs.h" +#include "tu_event.h" #include "tu_image.h" #include "tu_tracepoints.h" @@ -6232,7 +6233,7 @@ tu_CmdEndRendering(VkCommandBuffer commandBuffer) } } -static void +void tu_barrier(struct tu_cmd_buffer *cmd, const VkDependencyInfo *dep_info) { @@ -6356,9 +6357,9 @@ tu_CmdPipelineBarrier2(VkCommandBuffer commandBuffer, } template -static void -write_event(struct tu_cmd_buffer *cmd, struct tu_event *event, - VkPipelineStageFlags2 stageMask, unsigned value) +void +tu_write_event(struct tu_cmd_buffer *cmd, struct tu_event *event, + VkPipelineStageFlags2 stageMask, unsigned value) { struct tu_cs *cs = &cmd->cs; @@ -6395,64 +6396,7 @@ write_event(struct tu_cmd_buffer *cmd, struct tu_event *event, tu_cs_emit(cs, value); } } - -template -VKAPI_ATTR void VKAPI_CALL -tu_CmdSetEvent2(VkCommandBuffer commandBuffer, - VkEvent _event, - const VkDependencyInfo *pDependencyInfo) -{ - VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - VK_FROM_HANDLE(tu_event, event, _event); - VkPipelineStageFlags2 src_stage_mask = 0; - - for (uint32_t i = 0; i < pDependencyInfo->memoryBarrierCount; i++) - src_stage_mask |= pDependencyInfo->pMemoryBarriers[i].srcStageMask; - for (uint32_t i = 0; i < pDependencyInfo->bufferMemoryBarrierCount; i++) - src_stage_mask |= pDependencyInfo->pBufferMemoryBarriers[i].srcStageMask; - for (uint32_t i = 0; i < pDependencyInfo->imageMemoryBarrierCount; i++) - src_stage_mask |= pDependencyInfo->pImageMemoryBarriers[i].srcStageMask; - - write_event(cmd, event, src_stage_mask, 1); -} -TU_GENX(tu_CmdSetEvent2); - -template -VKAPI_ATTR void VKAPI_CALL -tu_CmdResetEvent2(VkCommandBuffer commandBuffer, - VkEvent _event, - VkPipelineStageFlags2 stageMask) -{ - VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - VK_FROM_HANDLE(tu_event, event, _event); - - write_event(cmd, event, stageMask, 0); -} -TU_GENX(tu_CmdResetEvent2); - -VKAPI_ATTR void VKAPI_CALL -tu_CmdWaitEvents2(VkCommandBuffer commandBuffer, - uint32_t eventCount, - const VkEvent *pEvents, - const VkDependencyInfo* pDependencyInfos) -{ - VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - struct tu_cs *cs = cmd->state.pass ? &cmd->draw_cs : &cmd->cs; - - for (uint32_t i = 0; i < eventCount; i++) { - VK_FROM_HANDLE(tu_event, event, pEvents[i]); - - tu_cs_emit_pkt7(cs, CP_WAIT_REG_MEM, 6); - tu_cs_emit(cs, CP_WAIT_REG_MEM_0_FUNCTION(WRITE_EQ) | - CP_WAIT_REG_MEM_0_POLL(POLL_MEMORY)); - tu_cs_emit_qw(cs, event->bo->iova); /* POLL_ADDR_LO/HI */ - tu_cs_emit(cs, CP_WAIT_REG_MEM_3_REF(1)); - tu_cs_emit(cs, CP_WAIT_REG_MEM_4_MASK(~0u)); - tu_cs_emit(cs, CP_WAIT_REG_MEM_5_DELAY_LOOP_CYCLES(20)); - } - - tu_barrier(cmd, pDependencyInfos); -} +TU_GENX(tu_write_event); template VKAPI_ATTR void VKAPI_CALL @@ -6519,7 +6463,7 @@ tu_CmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkDeviceSize dstOffset, uint32_t marker) { - /* Almost the same as write_event, but also allowed in renderpass */ + /* Almost the same as tu_write_event, but also allowed in renderpass */ VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); VK_FROM_HANDLE(tu_buffer, buffer, dstBuffer); diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index ab171e1ab8c..e3e2ec3ff6c 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -717,6 +717,16 @@ struct tu_fdm_bin_patchpoint { tu_fdm_bin_apply_t apply; }; + +void +tu_barrier(struct tu_cmd_buffer *cmd, + const VkDependencyInfo *dep_info); + +template +void +tu_write_event(struct tu_cmd_buffer *cmd, struct tu_event *event, + VkPipelineStageFlags2 stageMask, unsigned value); + static inline void _tu_create_fdm_bin_patchpoint(struct tu_cmd_buffer *cmd, struct tu_cs *cs, diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc index 469bcfcf192..01c43d205d2 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc @@ -3062,91 +3062,6 @@ tu_QueueBindSparse(VkQueue _queue, return VK_SUCCESS; } -VKAPI_ATTR VkResult VKAPI_CALL -tu_CreateEvent(VkDevice _device, - const VkEventCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkEvent *pEvent) -{ - VK_FROM_HANDLE(tu_device, device, _device); - - struct tu_event *event = (struct tu_event *) - vk_object_alloc(&device->vk, pAllocator, sizeof(*event), - VK_OBJECT_TYPE_EVENT); - if (!event) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - - VkResult result = tu_bo_init_new(device, &event->bo, 0x1000, - TU_BO_ALLOC_NO_FLAGS, "event"); - if (result != VK_SUCCESS) - goto fail_alloc; - - result = tu_bo_map(device, event->bo, NULL); - if (result != VK_SUCCESS) - goto fail_map; - - TU_RMV(event_create, device, pCreateInfo, event); - - *pEvent = tu_event_to_handle(event); - - return VK_SUCCESS; - -fail_map: - tu_bo_finish(device, event->bo); -fail_alloc: - vk_object_free(&device->vk, pAllocator, event); - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); -} - -VKAPI_ATTR void VKAPI_CALL -tu_DestroyEvent(VkDevice _device, - VkEvent _event, - const VkAllocationCallbacks *pAllocator) -{ - VK_FROM_HANDLE(tu_device, device, _device); - VK_FROM_HANDLE(tu_event, event, _event); - - if (!event) - return; - - TU_RMV(resource_destroy, device, event); - - tu_bo_finish(device, event->bo); - vk_object_free(&device->vk, pAllocator, event); -} - -VKAPI_ATTR VkResult VKAPI_CALL -tu_GetEventStatus(VkDevice _device, VkEvent _event) -{ - VK_FROM_HANDLE(tu_device, device, _device); - VK_FROM_HANDLE(tu_event, event, _event); - - if (vk_device_is_lost(&device->vk)) - return VK_ERROR_DEVICE_LOST; - - if (*(uint64_t*) event->bo->map == 1) - return VK_EVENT_SET; - return VK_EVENT_RESET; -} - -VKAPI_ATTR VkResult VKAPI_CALL -tu_SetEvent(VkDevice _device, VkEvent _event) -{ - VK_FROM_HANDLE(tu_event, event, _event); - *(uint64_t*) event->bo->map = 1; - - return VK_SUCCESS; -} - -VKAPI_ATTR VkResult VKAPI_CALL -tu_ResetEvent(VkDevice _device, VkEvent _event) -{ - VK_FROM_HANDLE(tu_event, event, _event); - *(uint64_t*) event->bo->map = 0; - - return VK_SUCCESS; -} - VKAPI_ATTR VkResult VKAPI_CALL tu_CreateBuffer(VkDevice _device, const VkBufferCreateInfo *pCreateInfo, diff --git a/src/freedreno/vulkan/tu_device.h b/src/freedreno/vulkan/tu_device.h index 39fecc668ee..2450dac758c 100644 --- a/src/freedreno/vulkan/tu_device.h +++ b/src/freedreno/vulkan/tu_device.h @@ -476,12 +476,6 @@ struct tu_framebuffer VK_DEFINE_NONDISP_HANDLE_CASTS(tu_framebuffer, base, VkFramebuffer, VK_OBJECT_TYPE_FRAMEBUFFER) -struct tu_event -{ - struct vk_object_base base; - struct tu_bo *bo; -}; -VK_DEFINE_NONDISP_HANDLE_CASTS(tu_event, base, VkEvent, VK_OBJECT_TYPE_EVENT) struct tu_sampler { struct vk_object_base base; diff --git a/src/freedreno/vulkan/tu_event.cc b/src/freedreno/vulkan/tu_event.cc new file mode 100644 index 00000000000..ef15728b91f --- /dev/null +++ b/src/freedreno/vulkan/tu_event.cc @@ -0,0 +1,156 @@ +/* + * Copyright © 2016 Red Hat. + * Copyright © 2016 Bas Nieuwenhuizen + * SPDX-License-Identifier: MIT + * + * based in part on anv driver which is: + * Copyright © 2015 Intel Corporation + */ + +#include "tu_event.h" + +#include "tu_cmd_buffer.h" +#include "tu_rmv.h" + +VKAPI_ATTR VkResult VKAPI_CALL +tu_CreateEvent(VkDevice _device, + const VkEventCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkEvent *pEvent) +{ + VK_FROM_HANDLE(tu_device, device, _device); + + struct tu_event *event = (struct tu_event *) + vk_object_alloc(&device->vk, pAllocator, sizeof(*event), + VK_OBJECT_TYPE_EVENT); + if (!event) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + VkResult result = tu_bo_init_new(device, &event->bo, 0x1000, + TU_BO_ALLOC_NO_FLAGS, "event"); + if (result != VK_SUCCESS) + goto fail_alloc; + + result = tu_bo_map(device, event->bo, NULL); + if (result != VK_SUCCESS) + goto fail_map; + + TU_RMV(event_create, device, pCreateInfo, event); + + *pEvent = tu_event_to_handle(event); + + return VK_SUCCESS; + +fail_map: + tu_bo_finish(device, event->bo); +fail_alloc: + vk_object_free(&device->vk, pAllocator, event); + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); +} + +VKAPI_ATTR void VKAPI_CALL +tu_DestroyEvent(VkDevice _device, + VkEvent _event, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(tu_device, device, _device); + VK_FROM_HANDLE(tu_event, event, _event); + + if (!event) + return; + + TU_RMV(resource_destroy, device, event); + + tu_bo_finish(device, event->bo); + vk_object_free(&device->vk, pAllocator, event); +} + +VKAPI_ATTR VkResult VKAPI_CALL +tu_GetEventStatus(VkDevice _device, VkEvent _event) +{ + VK_FROM_HANDLE(tu_device, device, _device); + VK_FROM_HANDLE(tu_event, event, _event); + + if (vk_device_is_lost(&device->vk)) + return VK_ERROR_DEVICE_LOST; + + if (*(uint64_t*) event->bo->map == 1) + return VK_EVENT_SET; + return VK_EVENT_RESET; +} + +VKAPI_ATTR VkResult VKAPI_CALL +tu_SetEvent(VkDevice _device, VkEvent _event) +{ + VK_FROM_HANDLE(tu_event, event, _event); + *(uint64_t*) event->bo->map = 1; + + return VK_SUCCESS; +} + +VKAPI_ATTR VkResult VKAPI_CALL +tu_ResetEvent(VkDevice _device, VkEvent _event) +{ + VK_FROM_HANDLE(tu_event, event, _event); + *(uint64_t*) event->bo->map = 0; + + return VK_SUCCESS; +} + +template +VKAPI_ATTR void VKAPI_CALL +tu_CmdSetEvent2(VkCommandBuffer commandBuffer, + VkEvent _event, + const VkDependencyInfo *pDependencyInfo) +{ + VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + VK_FROM_HANDLE(tu_event, event, _event); + VkPipelineStageFlags2 src_stage_mask = 0; + + for (uint32_t i = 0; i < pDependencyInfo->memoryBarrierCount; i++) + src_stage_mask |= pDependencyInfo->pMemoryBarriers[i].srcStageMask; + for (uint32_t i = 0; i < pDependencyInfo->bufferMemoryBarrierCount; i++) + src_stage_mask |= pDependencyInfo->pBufferMemoryBarriers[i].srcStageMask; + for (uint32_t i = 0; i < pDependencyInfo->imageMemoryBarrierCount; i++) + src_stage_mask |= pDependencyInfo->pImageMemoryBarriers[i].srcStageMask; + + tu_write_event(cmd, event, src_stage_mask, 1); +} +TU_GENX(tu_CmdSetEvent2); + +template +VKAPI_ATTR void VKAPI_CALL +tu_CmdResetEvent2(VkCommandBuffer commandBuffer, + VkEvent _event, + VkPipelineStageFlags2 stageMask) +{ + VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + VK_FROM_HANDLE(tu_event, event, _event); + + tu_write_event(cmd, event, stageMask, 0); +} +TU_GENX(tu_CmdResetEvent2); + +VKAPI_ATTR void VKAPI_CALL +tu_CmdWaitEvents2(VkCommandBuffer commandBuffer, + uint32_t eventCount, + const VkEvent *pEvents, + const VkDependencyInfo* pDependencyInfos) +{ + VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + struct tu_cs *cs = cmd->state.pass ? &cmd->draw_cs : &cmd->cs; + + for (uint32_t i = 0; i < eventCount; i++) { + VK_FROM_HANDLE(tu_event, event, pEvents[i]); + + tu_cs_emit_pkt7(cs, CP_WAIT_REG_MEM, 6); + tu_cs_emit(cs, CP_WAIT_REG_MEM_0_FUNCTION(WRITE_EQ) | + CP_WAIT_REG_MEM_0_POLL(POLL_MEMORY)); + tu_cs_emit_qw(cs, event->bo->iova); /* POLL_ADDR_LO/HI */ + tu_cs_emit(cs, CP_WAIT_REG_MEM_3_REF(1)); + tu_cs_emit(cs, CP_WAIT_REG_MEM_4_MASK(~0u)); + tu_cs_emit(cs, CP_WAIT_REG_MEM_5_DELAY_LOOP_CYCLES(20)); + } + + tu_barrier(cmd, pDependencyInfos); +} diff --git a/src/freedreno/vulkan/tu_event.h b/src/freedreno/vulkan/tu_event.h new file mode 100644 index 00000000000..e06143256ce --- /dev/null +++ b/src/freedreno/vulkan/tu_event.h @@ -0,0 +1,23 @@ +/* + * Copyright © 2016 Red Hat. + * Copyright © 2016 Bas Nieuwenhuizen + * SPDX-License-Identifier: MIT + * + * based in part on anv driver which is: + * Copyright © 2015 Intel Corporation + */ + +#ifndef TU_EVENT_H +#define TU_EVENT_H + +#include "tu_common.h" + +struct tu_event +{ + struct vk_object_base base; + struct tu_bo *bo; +}; + +VK_DEFINE_NONDISP_HANDLE_CASTS(tu_event, base, VkEvent, VK_OBJECT_TYPE_EVENT) + +#endif /* TU_EVENT_H */ diff --git a/src/freedreno/vulkan/tu_rmv.cc b/src/freedreno/vulkan/tu_rmv.cc index b8b1d03cf22..4f5fa848610 100644 --- a/src/freedreno/vulkan/tu_rmv.cc +++ b/src/freedreno/vulkan/tu_rmv.cc @@ -8,6 +8,7 @@ #include "tu_cmd_buffer.h" #include "tu_cs.h" #include "tu_device.h" +#include "tu_event.h" #include "tu_image.h" #include "tu_query.h"