gl/vk: Accept single-index draws for POINT rendering

This commit is contained in:
kd-11
2026-10-02 13:33:48 +03:00
committed by kd-11
parent d10658b818
commit 18f18b305f
2 changed files with 12 additions and 9 deletions
+7 -5
View File
@@ -86,6 +86,7 @@ namespace
vertex_input_state operator()(const rsx::draw_indexed_array_command& command)
{
u32 min_index = 0, max_index = 0;
const auto primitive = rsx::method_registers.current_draw_clause.primitive;
rsx::index_array_type type = rsx::method_registers.current_draw_clause.is_immediate_draw?
rsx::index_array_type::u32:
@@ -96,8 +97,8 @@ namespace
const u32 vertex_count = rsx::method_registers.current_draw_clause.get_elements_count();
u32 index_count = vertex_count;
if (!gl::is_primitive_native(rsx::method_registers.current_draw_clause.primitive))
index_count = static_cast<u32>(get_index_count(rsx::method_registers.current_draw_clause.primitive, vertex_count));
if (!gl::is_primitive_native(primitive))
index_count = static_cast<u32>(get_index_count(primitive, vertex_count));
u32 max_size = index_count * type_size;
auto mapping = m_index_ring_buffer.alloc_from_heap(max_size, 256);
@@ -107,14 +108,15 @@ namespace
std::tie(min_index, max_index, index_count) = write_index_array_data_to_buffer(
{ reinterpret_cast<std::byte*>(ptr), max_size },
command.raw_index_buffer, type,
rsx::method_registers.current_draw_clause.primitive,
primitive,
rsx::method_registers.restart_index_enabled(),
rsx::method_registers.restart_index(),
[](auto prim) { return !gl::is_primitive_native(prim); });
if (min_index >= max_index)
if (min_index > max_index ||
(min_index == max_index && primitive != rsx::primitive_type::points))
{
//empty set, do not draw
// empty set, do not draw
return{ false, 0, 0, 0, 0, std::make_tuple(get_index_type(type), offset_in_index_buffer) };
}
+5 -4
View File
@@ -117,7 +117,7 @@ namespace
vertex_input_state operator()(const rsx::draw_indexed_array_command& command)
{
auto primitive = rsx::method_registers.current_draw_clause.primitive;
const auto primitive = rsx::method_registers.current_draw_clause.primitive;
const auto [prims, primitives_emulated] = vk::get_appropriate_topology(primitive);
const bool emulate_restart = rsx::method_registers.restart_index_enabled() && vk::emulate_primitive_restart(primitive);
@@ -129,7 +129,7 @@ namespace
u32 index_count = rsx::method_registers.current_draw_clause.get_elements_count();
if (primitives_emulated)
index_count = get_index_count(rsx::method_registers.current_draw_clause.primitive, index_count);
index_count = get_index_count(primitive, index_count);
u32 upload_size = index_count * type_size;
if (emulate_restart) upload_size *= 2;
@@ -161,9 +161,10 @@ namespace
rsx::method_registers.restart_index(),
[](auto prim) { return !vk::is_primitive_native(prim); });
if (min_index >= max_index)
if (min_index > max_index ||
(min_index == max_index && primitive != rsx::primitive_type::points))
{
//empty set, do not draw
// empty set, do not draw
m_index_buffer_ring_info.unmap();
return{ prims, false, 0, 0, 0, 0, {} };
}