rsx: Fixups

- Also fix visual corruption when using disjoint indexed draws

- Refactor draw call emit again (vk)

- Improve execution barrier resolve
  - Allow vertex/index rebase inside begin/end pair
  - Add ALPHA_TEST to list of excluded methods [TODO: defer raster state]

- gl bringup

- Simplify
  - using the simple_array gets back a few more fps :)
This commit is contained in:
kd-11 2018-10-01 23:05:51 +03:00 committed by kd-11
parent e01d2f08c9
commit 677b16f5c6
19 changed files with 2242 additions and 565 deletions

View file

@ -423,9 +423,7 @@ namespace rsx
{
if (arg)
{
rsx::method_registers.current_draw_clause.draw_command_ranges.clear();
rsx::method_registers.current_draw_clause.command = draw_command::none;
rsx::method_registers.current_draw_clause.primitive = to_primitive_type(arg);
rsx::method_registers.current_draw_clause.reset(to_primitive_type(arg));
rsxthr->begin();
return;
}
@ -453,9 +451,9 @@ namespace rsx
else
rsx::method_registers.current_draw_clause.is_immediate_draw = false;
if (!(rsx::method_registers.current_draw_clause.draw_command_ranges.empty() &&
rsx::method_registers.current_draw_clause.inline_vertex_array.empty()))
if (!rsx::method_registers.current_draw_clause.empty())
{
rsx::method_registers.current_draw_clause.compile();
rsxthr->end();
}
}
@ -598,6 +596,30 @@ namespace rsx
rsx->m_rtts_dirty = true;
}
void set_vertex_base_offset(thread* rsx, u32 reg, u32 arg)
{
if (rsx->in_begin_end)
{
// Revert change to queue later
method_registers.decode(reg, method_registers.register_previous_value);
// Insert base mofifier barrier
method_registers.current_draw_clause.insert_command_barrier(vertex_base_modifier_barrier, arg);
}
}
void set_index_base_offset(thread* rsx, u32 reg, u32 arg)
{
if (rsx->in_begin_end)
{
// Revert change to queue later
method_registers.decode(reg, method_registers.register_previous_value);
// Insert base mofifier barrier
method_registers.current_draw_clause.insert_command_barrier(index_base_modifier_barrier, arg);
}
}
template<u32 index>
struct set_texture_dirty_bit
{
@ -1156,6 +1178,13 @@ namespace rsx
};
}
namespace fifo
{
void draw_barrier(thread* rsx, u32, u32)
{
}
}
void rsx_state::init()
{
// Special values set at initialization, these are not set by a context reset
@ -2122,6 +2151,34 @@ namespace rsx
return registers[reg] == value;
}
u32 draw_clause::execute_pipeline_dependencies() const
{
u32 result = 0;
for (const auto &barrier : draw_command_barriers[current_range_index])
{
switch (barrier.type)
{
case primitive_restart_barrier:
break;
case index_base_modifier_barrier:
// Change index base offset
method_registers.decode(NV4097_SET_VERTEX_DATA_BASE_INDEX, barrier.arg);
result |= index_base_changed;
break;
case vertex_base_modifier_barrier:
// Change vertex base offset
method_registers.decode(NV4097_SET_VERTEX_DATA_BASE_OFFSET, barrier.arg);
result |= vertex_base_changed;
break;
default:
fmt::throw_exception("Unreachable" HERE);
}
}
return result;
}
namespace method_detail
{
template<int Id, int Step, int Count, template<u32> class T, int Index = 0>
@ -2494,6 +2551,7 @@ namespace rsx
//Some custom GCM methods
methods[GCM_SET_DRIVER_OBJECT] = nullptr;
methods[FIFO::FIFO_DRAW_BARRIER] = nullptr;
bind_array<GCM_FLIP_HEAD, 1, 2, nullptr>();
bind_array<GCM_DRIVER_QUEUE, 1, 8, nullptr>();
@ -2600,6 +2658,8 @@ namespace rsx
bind<NV4097_SET_SHADER_PROGRAM, nv4097::set_shader_program_dirty>();
bind<NV4097_SET_TRANSFORM_PROGRAM_START, nv4097::set_transform_program_start>();
bind<NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK, nv4097::set_vertex_attribute_output_mask>();
bind<NV4097_SET_VERTEX_DATA_BASE_OFFSET, nv4097::set_vertex_base_offset>();
bind<NV4097_SET_VERTEX_DATA_BASE_INDEX, nv4097::set_index_base_offset>();
//NV308A
bind_range<NV308A_COLOR, 1, 256, nv308a::color>();
@ -2619,6 +2679,8 @@ namespace rsx
// custom methods
bind<GCM_FLIP_COMMAND, flip_command>();
// FIFO
bind<FIFO::FIFO_DRAW_BARRIER, fifo::draw_barrier>();
return true;
}();