aco: Add Primitive Ordered Pixel Shading scheduling rules
Implementing the acquire/release semantics of fragment shader interlock ordered section in Vulkan, and preventing reordering of memory accesses requiring primitive ordering out of the ordered section. Also, the ordered section should be as short as possible, so not reordering the instructions awaiting overlapped waves upwards, and the exit from the ordered section downwards. Reviewed-by: Timur Kristóf <timur.kristof@gmail.com> Signed-off-by: Vitaliy Triang3l Kuzmin <triang3l@yandex.ru> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22250>
This commit is contained in:
committed by
Marge Bot
parent
6082e126eb
commit
2194e8bd82
@@ -223,6 +223,17 @@ init_program(Program* program, Stage stage, const struct aco_shader_info* info,
|
||||
memory_sync_info
|
||||
get_sync_info(const Instruction* instr)
|
||||
{
|
||||
/* Primitive Ordered Pixel Shading barriers necessary for accesses to memory shared between
|
||||
* overlapping waves in the queue family.
|
||||
*/
|
||||
if (instr->opcode == aco_opcode::p_pops_gfx9_overlapped_wave_wait_done ||
|
||||
(instr->opcode == aco_opcode::s_wait_event &&
|
||||
!(instr->sopp().imm & wait_event_imm_dont_wait_export_ready))) {
|
||||
return memory_sync_info(storage_buffer | storage_image, semantic_acquire, scope_queuefamily);
|
||||
} else if (instr->opcode == aco_opcode::p_pops_gfx9_ordered_section_done) {
|
||||
return memory_sync_info(storage_buffer | storage_image, semantic_release, scope_queuefamily);
|
||||
}
|
||||
|
||||
switch (instr->format) {
|
||||
case Format::SMEM: return instr->smem().sync;
|
||||
case Format::MUBUF: return instr->mubuf().sync;
|
||||
|
||||
Reference in New Issue
Block a user