}
static void
-radv_cmd_buffer_after_draw(struct radv_cmd_buffer *cmd_buffer, enum radv_cmd_flush_bits flags)
+radv_cmd_buffer_after_draw(struct radv_cmd_buffer *cmd_buffer, enum radv_cmd_flush_bits flags, bool dgc)
{
const struct radv_device *device = cmd_buffer->device;
- if (unlikely(device->sqtt.bo)) {
+ if (unlikely(device->sqtt.bo) && !dgc) {
radeon_check_space(device->ws, cmd_buffer->cs, 2);
radeon_emit(cmd_buffer->cs, PKT3(PKT3_EVENT_WRITE, 0, 0));
/* MUST inline this function to avoid massive perf loss in drawoverhead */
ALWAYS_INLINE static bool
-radv_before_draw(struct radv_cmd_buffer *cmd_buffer, const struct radv_draw_info *info, uint32_t drawCount)
+radv_before_draw(struct radv_cmd_buffer *cmd_buffer, const struct radv_draw_info *info, uint32_t drawCount, bool dgc)
{
const bool has_prefetch = cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX7;
radv_emit_all_graphics_states(cmd_buffer, info);
}
- radv_describe_draw(cmd_buffer);
+ if (!dgc)
+ radv_describe_draw(cmd_buffer);
if (likely(!info->indirect)) {
struct radv_cmd_state *state = &cmd_buffer->state;
struct radeon_cmdbuf *cs = cmd_buffer->cs;
}
ALWAYS_INLINE static void
-radv_after_draw(struct radv_cmd_buffer *cmd_buffer)
+radv_after_draw(struct radv_cmd_buffer *cmd_buffer, bool dgc)
{
const struct radeon_info *rad_info = &cmd_buffer->device->physical_device->rad_info;
bool has_prefetch = cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX7;
cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_VGT_STREAMOUT_SYNC;
}
- radv_cmd_buffer_after_draw(cmd_buffer, RADV_CMD_FLAG_PS_PARTIAL_FLUSH);
+ radv_cmd_buffer_after_draw(cmd_buffer, RADV_CMD_FLAG_PS_PARTIAL_FLUSH, dgc);
}
VKAPI_ATTR void VKAPI_CALL
info.indirect = NULL;
info.indexed = false;
- if (!radv_before_draw(cmd_buffer, &info, 1))
+ if (!radv_before_draw(cmd_buffer, &info, 1, false))
return;
const VkMultiDrawInfoEXT minfo = {firstVertex, vertexCount};
radv_emit_direct_draw_packets(cmd_buffer, &info, 1, &minfo, 0, 0);
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
info.indirect = NULL;
info.indexed = false;
- if (!radv_before_draw(cmd_buffer, &info, drawCount))
+ if (!radv_before_draw(cmd_buffer, &info, drawCount, false))
return;
radv_emit_direct_draw_packets(cmd_buffer, &info, drawCount, pVertexInfo, 0, stride);
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
info.strmout_buffer = NULL;
info.indirect = NULL;
- if (!radv_before_draw(cmd_buffer, &info, 1))
+ if (!radv_before_draw(cmd_buffer, &info, 1, false))
return;
const VkMultiDrawIndexedInfoEXT minfo = {firstIndex, indexCount, vertexOffset};
radv_emit_draw_packets_indexed(cmd_buffer, &info, 1, &minfo, 0, NULL);
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
info.strmout_buffer = NULL;
info.indirect = NULL;
- if (!radv_before_draw(cmd_buffer, &info, drawCount))
+ if (!radv_before_draw(cmd_buffer, &info, drawCount, false))
return;
radv_emit_draw_packets_indexed(cmd_buffer, &info, drawCount, pIndexInfo, stride, pVertexOffset);
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
info.indexed = false;
info.instance_count = 0;
- if (!radv_before_draw(cmd_buffer, &info, 1))
+ if (!radv_before_draw(cmd_buffer, &info, 1, false))
return;
radv_emit_indirect_draw_packets(cmd_buffer, &info);
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
info.strmout_buffer = NULL;
info.instance_count = 0;
- if (!radv_before_draw(cmd_buffer, &info, 1))
+ if (!radv_before_draw(cmd_buffer, &info, 1, false))
return;
radv_emit_indirect_draw_packets(cmd_buffer, &info);
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
info.indexed = false;
info.instance_count = 0;
- if (!radv_before_draw(cmd_buffer, &info, 1))
+ if (!radv_before_draw(cmd_buffer, &info, 1, false))
return;
radv_emit_indirect_draw_packets(cmd_buffer, &info);
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
info.strmout_buffer = NULL;
info.instance_count = 0;
- if (!radv_before_draw(cmd_buffer, &info, 1))
+ if (!radv_before_draw(cmd_buffer, &info, 1, false))
return;
radv_emit_indirect_draw_packets(cmd_buffer, &info);
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
radv_emit_direct_mesh_draw_packet(cmd_buffer, x, y, z);
}
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
radv_emit_indirect_mesh_draw_packets(cmd_buffer, &info);
}
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
radv_emit_indirect_mesh_draw_packets(cmd_buffer, &info);
}
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
/* TODO: Use these functions with the normal dispatch path. */
info.indexed = layout->indexed;
info.instance_count = 0;
- if (!radv_before_draw(cmd_buffer, &info, 1))
+ if (!radv_before_draw(cmd_buffer, &info, 1, true))
return;
}
cmd_buffer->state.last_first_instance = -1;
cmd_buffer->state.last_drawid = -1;
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, true);
}
}
if (compute_shader->info.cs.regalloc_hang_bug)
cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH;
- radv_cmd_buffer_after_draw(cmd_buffer, RADV_CMD_FLAG_CS_PARTIAL_FLUSH);
+ radv_cmd_buffer_after_draw(cmd_buffer, RADV_CMD_FLAG_CS_PARTIAL_FLUSH, false);
}
static void
if (compute_shader->info.cs.regalloc_hang_bug)
cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH;
- radv_cmd_buffer_after_draw(cmd_buffer, RADV_CMD_FLAG_CS_PARTIAL_FLUSH);
+ radv_cmd_buffer_after_draw(cmd_buffer, RADV_CMD_FLAG_CS_PARTIAL_FLUSH, true);
}
void
info.indexed = false;
info.indirect = NULL;
- if (!radv_before_draw(cmd_buffer, &info, 1))
+ if (!radv_before_draw(cmd_buffer, &info, 1, false))
return;
struct VkMultiDrawInfoEXT minfo = {0, 0};
radv_emit_strmout_buffer(cmd_buffer, &info);
radv_emit_direct_draw_packets(cmd_buffer, &info, 1, &minfo, S_0287F0_USE_OPAQUE(1), 0);
- radv_after_draw(cmd_buffer);
+ radv_after_draw(cmd_buffer, false);
}
/* VK_AMD_buffer_marker */