anv/cmd_buffer: Reuse gen8 Cmd{Set, Reset}Event on gen7
Modern DXVK requires event support [1], but looks like it only
uses vkCmdSetEvent() + vkGetEventStatus(). So we can just
borrow the relevant code from gen8, leaving CmdWaitEvents still
unimplemented.
[1] 8c3900c533
v2: Also move CmdWaitEvents into genX_cmd_buffer.c (Jason)
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:

committed by
Jason Ekstrand

parent
39f4dc23a5
commit
6230bfeb65
@@ -565,105 +565,3 @@ void genX(CmdBindIndexBuffer)(
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_INDEX_BUFFER;
|
||||
}
|
||||
|
||||
/* Set of stage bits for which are pipelined, i.e. they get queued by the
|
||||
* command streamer for later execution.
|
||||
*/
|
||||
#define ANV_PIPELINE_STAGE_PIPELINED_BITS \
|
||||
(VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | \
|
||||
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | \
|
||||
VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT | \
|
||||
VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | \
|
||||
VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | \
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | \
|
||||
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | \
|
||||
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | \
|
||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | \
|
||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | \
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT | \
|
||||
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | \
|
||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | \
|
||||
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)
|
||||
|
||||
void genX(CmdSetEvent)(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkEvent _event,
|
||||
VkPipelineStageFlags stageMask)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
ANV_FROM_HANDLE(anv_event, event, _event);
|
||||
|
||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||
if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {
|
||||
pc.StallAtPixelScoreboard = true;
|
||||
pc.CommandStreamerStallEnable = true;
|
||||
}
|
||||
|
||||
pc.DestinationAddressType = DAT_PPGTT,
|
||||
pc.PostSyncOperation = WriteImmediateData,
|
||||
pc.Address = (struct anv_address) {
|
||||
cmd_buffer->device->dynamic_state_pool.block_pool.bo,
|
||||
event->state.offset
|
||||
};
|
||||
pc.ImmediateData = VK_EVENT_SET;
|
||||
}
|
||||
}
|
||||
|
||||
void genX(CmdResetEvent)(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkEvent _event,
|
||||
VkPipelineStageFlags stageMask)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
ANV_FROM_HANDLE(anv_event, event, _event);
|
||||
|
||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||
if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {
|
||||
pc.StallAtPixelScoreboard = true;
|
||||
pc.CommandStreamerStallEnable = true;
|
||||
}
|
||||
|
||||
pc.DestinationAddressType = DAT_PPGTT;
|
||||
pc.PostSyncOperation = WriteImmediateData;
|
||||
pc.Address = (struct anv_address) {
|
||||
cmd_buffer->device->dynamic_state_pool.block_pool.bo,
|
||||
event->state.offset
|
||||
};
|
||||
pc.ImmediateData = VK_EVENT_RESET;
|
||||
}
|
||||
}
|
||||
|
||||
void genX(CmdWaitEvents)(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t eventCount,
|
||||
const VkEvent* pEvents,
|
||||
VkPipelineStageFlags srcStageMask,
|
||||
VkPipelineStageFlags destStageMask,
|
||||
uint32_t memoryBarrierCount,
|
||||
const VkMemoryBarrier* pMemoryBarriers,
|
||||
uint32_t bufferMemoryBarrierCount,
|
||||
const VkBufferMemoryBarrier* pBufferMemoryBarriers,
|
||||
uint32_t imageMemoryBarrierCount,
|
||||
const VkImageMemoryBarrier* pImageMemoryBarriers)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
for (uint32_t i = 0; i < eventCount; i++) {
|
||||
ANV_FROM_HANDLE(anv_event, event, pEvents[i]);
|
||||
|
||||
anv_batch_emit(&cmd_buffer->batch, GENX(MI_SEMAPHORE_WAIT), sem) {
|
||||
sem.WaitMode = PollingMode,
|
||||
sem.CompareOperation = COMPARE_SAD_EQUAL_SDD,
|
||||
sem.SemaphoreDataDword = VK_EVENT_SET,
|
||||
sem.SemaphoreAddress = (struct anv_address) {
|
||||
cmd_buffer->device->dynamic_state_pool.block_pool.bo,
|
||||
event->state.offset
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
genX(CmdPipelineBarrier)(commandBuffer, srcStageMask, destStageMask,
|
||||
false, /* byRegion */
|
||||
memoryBarrierCount, pMemoryBarriers,
|
||||
bufferMemoryBarrierCount, pBufferMemoryBarriers,
|
||||
imageMemoryBarrierCount, pImageMemoryBarriers);
|
||||
}
|
||||
|
Reference in New Issue
Block a user