mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-26 04:32:35 +01:00
rsx: Fix fifo draw barriers
This commit is contained in:
parent
2d88e41583
commit
435afcb865
@ -603,7 +603,7 @@ namespace rsx
|
|||||||
{
|
{
|
||||||
m_internal_get = m_ctrl->get;
|
m_internal_get = m_ctrl->get;
|
||||||
read_ahead(m_fifo_info, m_queue, m_internal_get);
|
read_ahead(m_fifo_info, m_queue, m_internal_get);
|
||||||
optimize(m_fifo_info, m_queue);
|
//optimize(m_fifo_info, m_queue);
|
||||||
|
|
||||||
m_ctrl->get = m_internal_get;
|
m_ctrl->get = m_internal_get;
|
||||||
m_ctrl_tag++;
|
m_ctrl_tag++;
|
||||||
@ -854,6 +854,7 @@ namespace rsx
|
|||||||
if (command.value)
|
if (command.value)
|
||||||
{
|
{
|
||||||
last_begin = &command;
|
last_begin = &command;
|
||||||
|
command.reg = FIFO_DRAW_BARRIER;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1248,6 +1248,14 @@ namespace rsx
|
|||||||
{
|
{
|
||||||
void draw_barrier(thread* rsx, u32, u32)
|
void draw_barrier(thread* rsx, u32, u32)
|
||||||
{
|
{
|
||||||
|
if (rsx->in_begin_end)
|
||||||
|
{
|
||||||
|
if (!method_registers.current_draw_clause.is_disjoint_primitive)
|
||||||
|
{
|
||||||
|
// Enable primitive barrier request
|
||||||
|
method_registers.current_draw_clause.primitive_barrier_enable = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2762,7 +2770,7 @@ namespace rsx
|
|||||||
bind<GCM_FLIP_COMMAND, flip_command>();
|
bind<GCM_FLIP_COMMAND, flip_command>();
|
||||||
|
|
||||||
// FIFO
|
// FIFO
|
||||||
bind<FIFO::FIFO_DRAW_BARRIER, fifo::draw_barrier>();
|
bind<(FIFO::FIFO_DRAW_BARRIER >> 2), fifo::draw_barrier>();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}();
|
}();
|
||||||
|
@ -115,8 +115,9 @@ namespace rsx
|
|||||||
primitive_type primitive;
|
primitive_type primitive;
|
||||||
draw_command command;
|
draw_command command;
|
||||||
|
|
||||||
bool is_immediate_draw;
|
bool is_immediate_draw; // Set if part of the draw is submitted via push registers
|
||||||
bool is_disjoint_primitive;
|
bool is_disjoint_primitive; // Set if primitive type does not rely on adjacency information
|
||||||
|
bool primitive_barrier_enable; // Set once to signal that a primitive restart barrier can be inserted
|
||||||
|
|
||||||
simple_array<u32> inline_vertex_array;
|
simple_array<u32> inline_vertex_array;
|
||||||
|
|
||||||
@ -158,6 +159,9 @@ namespace rsx
|
|||||||
|
|
||||||
void append(u32 first, u32 count)
|
void append(u32 first, u32 count)
|
||||||
{
|
{
|
||||||
|
const bool barrier_enable_flag = primitive_barrier_enable;
|
||||||
|
primitive_barrier_enable = false;
|
||||||
|
|
||||||
if (!draw_command_ranges.empty())
|
if (!draw_command_ranges.empty())
|
||||||
{
|
{
|
||||||
auto& last = draw_command_ranges.back();
|
auto& last = draw_command_ranges.back();
|
||||||
@ -172,7 +176,7 @@ namespace rsx
|
|||||||
|
|
||||||
if (last.first + last.count == first)
|
if (last.first + last.count == first)
|
||||||
{
|
{
|
||||||
if (!is_disjoint_primitive)
|
if (!is_disjoint_primitive && barrier_enable_flag)
|
||||||
{
|
{
|
||||||
// Insert barrier
|
// Insert barrier
|
||||||
insert_command_barrier(primitive_restart_barrier, 0);
|
insert_command_barrier(primitive_restart_barrier, 0);
|
||||||
@ -260,6 +264,7 @@ namespace rsx
|
|||||||
|
|
||||||
command = draw_command::none;
|
command = draw_command::none;
|
||||||
primitive = type;
|
primitive = type;
|
||||||
|
primitive_barrier_enable = false;
|
||||||
|
|
||||||
draw_command_ranges.clear();
|
draw_command_ranges.clear();
|
||||||
draw_command_barriers.clear();
|
draw_command_barriers.clear();
|
||||||
|
Loading…
Reference in New Issue
Block a user