mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 21:41:26 +12:00
rsx: Fixup calculate_required_range
This commit is contained in:
parent
2022098b13
commit
e2d4d400ff
4 changed files with 51 additions and 11 deletions
|
@ -514,10 +514,19 @@ void GLGSRender::emit_geometry(u32 sub_index)
|
||||||
// Rebase vertex bases instead of
|
// Rebase vertex bases instead of
|
||||||
for (auto& info : m_vertex_layout.interleaved_blocks)
|
for (auto& info : m_vertex_layout.interleaved_blocks)
|
||||||
{
|
{
|
||||||
|
info->vertex_range.second = 0;
|
||||||
const auto vertex_base_offset = rsx::method_registers.vertex_data_base_offset();
|
const auto vertex_base_offset = rsx::method_registers.vertex_data_base_offset();
|
||||||
info->real_offset_address = rsx::get_address(rsx::get_vertex_offset_from_base(vertex_base_offset, info->base_offset), info->memory_location);
|
info->real_offset_address = rsx::get_address(rsx::get_vertex_offset_from_base(vertex_base_offset, info->base_offset), info->memory_location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Discard cached results
|
||||||
|
for (auto& info : m_vertex_layout.interleaved_blocks)
|
||||||
|
{
|
||||||
|
info->vertex_range.second = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (vertex_state && !m_vertex_layout.validate())
|
if (vertex_state && !m_vertex_layout.validate())
|
||||||
{
|
{
|
||||||
|
|
|
@ -354,12 +354,12 @@ namespace rsx
|
||||||
|
|
||||||
const u32 index_size = index_type == rsx::index_array_type::u32 ? 4 : 2;
|
const u32 index_size = index_type == rsx::index_array_type::u32 ? 4 : 2;
|
||||||
|
|
||||||
|
const auto render = rsx::get_current_renderer();
|
||||||
|
|
||||||
// If we can access a bit a more memory than required - do it
|
// If we can access a bit a more memory than required - do it
|
||||||
// The alternative would be re-iterating again over all of them
|
// The alternative would be re-iterating again over all of them
|
||||||
if (get_location(real_offset_address) == CELL_GCM_LOCATION_LOCAL)
|
if (get_location(real_offset_address) == CELL_GCM_LOCATION_LOCAL)
|
||||||
{
|
{
|
||||||
const auto render = rsx::get_current_renderer();
|
|
||||||
|
|
||||||
if (utils::add_saturate<u32>(real_offset_address - rsx::constants::local_mem_base, (_max_index + 1) * attribute_stride) <= render->local_mem_size)
|
if (utils::add_saturate<u32>(real_offset_address - rsx::constants::local_mem_base, (_max_index + 1) * attribute_stride) <= render->local_mem_size)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
|
@ -372,14 +372,18 @@ namespace rsx
|
||||||
|
|
||||||
_max_index = 0;
|
_max_index = 0;
|
||||||
|
|
||||||
// Force aligned indices as realhw
|
auto re_evaluate = [&] <typename T> (const std::byte* ptr, T)
|
||||||
const u32 address = (0 - index_size) & get_address(rsx::method_registers.index_array_address(), rsx::method_registers.index_array_location());
|
|
||||||
|
|
||||||
auto re_evaluate = [&](auto ptr)
|
|
||||||
{
|
{
|
||||||
|
const u64 restart = rsx::method_registers.restart_index_enabled() ? rsx::method_registers.restart_index() : u64{umax};
|
||||||
|
|
||||||
for (u32 _index = first; _index < first + count; _index++)
|
for (u32 _index = first; _index < first + count; _index++)
|
||||||
{
|
{
|
||||||
const auto value = ptr[_index];
|
const auto value = read_from_ptr<be_t<T>>(ptr, _index * sizeof(T));
|
||||||
|
|
||||||
|
if (value == restart)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (u32 freq_it = 0; freq_it < freq_count; freq_it++)
|
for (u32 freq_it = 0; freq_it < freq_count; freq_it++)
|
||||||
{
|
{
|
||||||
|
@ -387,7 +391,7 @@ namespace rsx
|
||||||
|
|
||||||
if (res > _max_index)
|
if (res > _max_index)
|
||||||
{
|
{
|
||||||
_max_index = value;
|
_max_index = res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -395,11 +399,29 @@ namespace rsx
|
||||||
|
|
||||||
if (index_size == 4)
|
if (index_size == 4)
|
||||||
{
|
{
|
||||||
re_evaluate(vm::get_super_ptr<u32>(address));
|
if (!render->element_push_buffer.empty()) [[unlikely]]
|
||||||
|
{
|
||||||
|
// Indices provided via immediate mode
|
||||||
|
re_evaluate(reinterpret_cast<const std::byte*>(render->element_push_buffer.data()), u32{});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const u32 address = (0 - index_size) & get_address(rsx::method_registers.index_array_address(), rsx::method_registers.index_array_location());
|
||||||
|
re_evaluate(vm::get_super_ptr<std::byte>(address), u32{});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
re_evaluate(vm::get_super_ptr<u16>(address));
|
if (!render->element_push_buffer.empty()) [[unlikely]]
|
||||||
|
{
|
||||||
|
// Indices provided via immediate mode
|
||||||
|
re_evaluate(reinterpret_cast<const std::byte*>(render->element_push_buffer.data()), u16{});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const u32 address = (0 - index_size) & get_address(rsx::method_registers.index_array_address(), rsx::method_registers.index_array_location());
|
||||||
|
re_evaluate(vm::get_super_ptr<std::byte>(address), u16{});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -159,7 +159,6 @@ namespace rsx
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
std::array<push_buffer_vertex_info, 16> vertex_push_buffers;
|
std::array<push_buffer_vertex_info, 16> vertex_push_buffers;
|
||||||
rsx::simple_array<u32> element_push_buffer;
|
|
||||||
|
|
||||||
s32 m_skip_frame_ctr = 0;
|
s32 m_skip_frame_ctr = 0;
|
||||||
bool skip_current_frame = false;
|
bool skip_current_frame = false;
|
||||||
|
@ -215,6 +214,7 @@ namespace rsx
|
||||||
atomic_t<u32> external_interrupt_lock{ 0 };
|
atomic_t<u32> external_interrupt_lock{ 0 };
|
||||||
atomic_t<bool> external_interrupt_ack{ false };
|
atomic_t<bool> external_interrupt_ack{ false };
|
||||||
atomic_t<u32> is_initialized{0};
|
atomic_t<u32> is_initialized{0};
|
||||||
|
rsx::simple_array<u32> element_push_buffer;
|
||||||
bool is_fifo_idle() const;
|
bool is_fifo_idle() const;
|
||||||
void flush_fifo();
|
void flush_fifo();
|
||||||
|
|
||||||
|
|
|
@ -718,10 +718,19 @@ void VKGSRender::emit_geometry(u32 sub_index)
|
||||||
// Rebase vertex bases instead of
|
// Rebase vertex bases instead of
|
||||||
for (auto& info : m_vertex_layout.interleaved_blocks)
|
for (auto& info : m_vertex_layout.interleaved_blocks)
|
||||||
{
|
{
|
||||||
|
info->vertex_range.second = 0;
|
||||||
const auto vertex_base_offset = rsx::method_registers.vertex_data_base_offset();
|
const auto vertex_base_offset = rsx::method_registers.vertex_data_base_offset();
|
||||||
info->real_offset_address = rsx::get_address(rsx::get_vertex_offset_from_base(vertex_base_offset, info->base_offset), info->memory_location);
|
info->real_offset_address = rsx::get_address(rsx::get_vertex_offset_from_base(vertex_base_offset, info->base_offset), info->memory_location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Discard cached results
|
||||||
|
for (auto& info : m_vertex_layout.interleaved_blocks)
|
||||||
|
{
|
||||||
|
info->vertex_range.second = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (vertex_state && !m_vertex_layout.validate())
|
if (vertex_state && !m_vertex_layout.validate())
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue