mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 17:10:11 +01:00
turnip: hook up cmdbuffer event set/wait
Gets some basic tests under "dEQP-VK.synchronization.*event*" passing Signed-off-by: Jonathan Marek <jonathan@marek.ca> Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3123> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3123>
This commit is contained in:
parent
5b5b762475
commit
1c5d84fcae
1 changed files with 42 additions and 16 deletions
|
|
@ -3869,11 +3869,23 @@ tu_CmdPipelineBarrier(VkCommandBuffer commandBuffer,
|
|||
}
|
||||
|
||||
static void
|
||||
write_event(struct tu_cmd_buffer *cmd_buffer,
|
||||
struct tu_event *event,
|
||||
VkPipelineStageFlags stageMask,
|
||||
unsigned value)
|
||||
write_event(struct tu_cmd_buffer *cmd, struct tu_event *event, unsigned value)
|
||||
{
|
||||
struct tu_cs *cs = &cmd->cs;
|
||||
|
||||
VkResult result = tu_cs_reserve_space(cmd->device, cs, 4);
|
||||
if (result != VK_SUCCESS) {
|
||||
cmd->record_result = result;
|
||||
return;
|
||||
}
|
||||
|
||||
tu_bo_list_add(&cmd->bo_list, &event->bo, MSM_SUBMIT_BO_WRITE);
|
||||
|
||||
/* TODO: any flush required before/after ? */
|
||||
|
||||
tu_cs_emit_pkt7(cs, CP_MEM_WRITE, 3);
|
||||
tu_cs_emit_qw(cs, event->bo.iova); /* ADDR_LO/HI */
|
||||
tu_cs_emit(cs, value);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -3881,10 +3893,10 @@ tu_CmdSetEvent(VkCommandBuffer commandBuffer,
|
|||
VkEvent _event,
|
||||
VkPipelineStageFlags stageMask)
|
||||
{
|
||||
TU_FROM_HANDLE(tu_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
|
||||
TU_FROM_HANDLE(tu_event, event, _event);
|
||||
|
||||
write_event(cmd_buffer, event, stageMask, 1);
|
||||
write_event(cmd, event, 1);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -3892,10 +3904,10 @@ tu_CmdResetEvent(VkCommandBuffer commandBuffer,
|
|||
VkEvent _event,
|
||||
VkPipelineStageFlags stageMask)
|
||||
{
|
||||
TU_FROM_HANDLE(tu_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
|
||||
TU_FROM_HANDLE(tu_event, event, _event);
|
||||
|
||||
write_event(cmd_buffer, event, stageMask, 0);
|
||||
write_event(cmd, event, 0);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -3911,16 +3923,30 @@ tu_CmdWaitEvents(VkCommandBuffer commandBuffer,
|
|||
uint32_t imageMemoryBarrierCount,
|
||||
const VkImageMemoryBarrier *pImageMemoryBarriers)
|
||||
{
|
||||
TU_FROM_HANDLE(tu_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
struct tu_barrier_info info;
|
||||
TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
|
||||
struct tu_cs *cs = &cmd->cs;
|
||||
|
||||
info.eventCount = eventCount;
|
||||
info.pEvents = pEvents;
|
||||
info.srcStageMask = 0;
|
||||
VkResult result = tu_cs_reserve_space(cmd->device, cs, eventCount * 7);
|
||||
if (result != VK_SUCCESS) {
|
||||
cmd->record_result = result;
|
||||
return;
|
||||
}
|
||||
|
||||
tu_barrier(cmd_buffer, memoryBarrierCount, pMemoryBarriers,
|
||||
bufferMemoryBarrierCount, pBufferMemoryBarriers,
|
||||
imageMemoryBarrierCount, pImageMemoryBarriers, &info);
|
||||
/* TODO: any flush required before/after? (CP_WAIT_FOR_ME?) */
|
||||
|
||||
for (uint32_t i = 0; i < eventCount; i++) {
|
||||
const struct tu_event *event = (const struct tu_event*) pEvents[i];
|
||||
|
||||
tu_bo_list_add(&cmd->bo_list, &event->bo, MSM_SUBMIT_BO_READ);
|
||||
|
||||
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_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));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue