mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-06 23:11:25 +12:00
rsx: Fixups for immediate rendering mode
- Immediate mode is isolated from the rest of the vertex configuration - TODO: Verify register behaviour when immediate mode is used Check if per-primitive const register values are supported (likely are)
This commit is contained in:
parent
4b79ef1ad9
commit
f48abde14b
4 changed files with 31 additions and 11 deletions
|
@ -952,7 +952,7 @@ namespace rsx
|
||||||
|
|
||||||
if (vertex_push_buffers[index].vertex_count > 1)
|
if (vertex_push_buffers[index].vertex_count > 1)
|
||||||
{
|
{
|
||||||
const rsx::register_vertex_data_info& info = state.register_vertex_info[index];
|
const auto& info = vertex_push_buffers[index];
|
||||||
const u8 element_size = info.size * sizeof(u32);
|
const u8 element_size = info.size * sizeof(u32);
|
||||||
|
|
||||||
gsl::span<const gsl::byte> vertex_src = { (const gsl::byte*)vertex_push_buffers[index].data.data(), vertex_push_buffers[index].vertex_count * element_size };
|
gsl::span<const gsl::byte> vertex_src = { (const gsl::byte*)vertex_push_buffers[index].data.data(), vertex_push_buffers[index].vertex_count * element_size };
|
||||||
|
@ -1406,11 +1406,11 @@ namespace rsx
|
||||||
{
|
{
|
||||||
current_vertex_program.rsx_vertex_inputs.push_back(
|
current_vertex_program.rsx_vertex_inputs.push_back(
|
||||||
{ index,
|
{ index,
|
||||||
rsx::method_registers.register_vertex_info[index].size,
|
vertex_push_buffers[index].size,
|
||||||
1,
|
1,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
is_int_type(rsx::method_registers.vertex_arrays_info[index].type()), 0 });
|
is_int_type(vertex_push_buffers[index].type), 0 });
|
||||||
}
|
}
|
||||||
else if (rsx::method_registers.register_vertex_info[index].size > 0)
|
else if (rsx::method_registers.register_vertex_info[index].size > 0)
|
||||||
{
|
{
|
||||||
|
@ -1479,18 +1479,27 @@ namespace rsx
|
||||||
|
|
||||||
//Check for interleaving
|
//Check for interleaving
|
||||||
const auto &info = state.vertex_arrays_info[index];
|
const auto &info = state.vertex_arrays_info[index];
|
||||||
if (rsx::method_registers.current_draw_clause.is_immediate_draw)
|
if (rsx::method_registers.current_draw_clause.is_immediate_draw &&
|
||||||
|
rsx::method_registers.current_draw_clause.command != rsx::draw_command::indexed)
|
||||||
{
|
{
|
||||||
|
// NOTE: In immediate rendering mode, all vertex setup is ignored
|
||||||
|
// Observed with GT5, immediate render bypasses array pointers completely, even falling back to fixed-function register defaults
|
||||||
if (vertex_push_buffers[index].vertex_count > 1)
|
if (vertex_push_buffers[index].vertex_count > 1)
|
||||||
{
|
{
|
||||||
// Read temp buffer (register array)
|
// Read temp buffer (register array)
|
||||||
std::pair<u8, u32> volatile_range_info = std::make_pair(index, static_cast<u32>(vertex_push_buffers[index].data.size() * sizeof(u32)));
|
std::pair<u8, u32> volatile_range_info = std::make_pair(index, static_cast<u32>(vertex_push_buffers[index].data.size() * sizeof(u32)));
|
||||||
result.volatile_blocks.push_back(volatile_range_info);
|
result.volatile_blocks.push_back(volatile_range_info);
|
||||||
result.attribute_placement[index] = attribute_buffer_placement::transient;
|
result.attribute_placement[index] = attribute_buffer_placement::transient;
|
||||||
continue;
|
}
|
||||||
|
else if (state.register_vertex_info[index].size > 0)
|
||||||
|
{
|
||||||
|
// Reads from register
|
||||||
|
result.referenced_registers.push_back(index);
|
||||||
|
result.attribute_placement[index] = attribute_buffer_placement::transient;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Might be an indexed immediate draw - real vertex arrays but glArrayElement style of IB declaration
|
// Fall back to the default register value if no source is specified via register
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!info.size())
|
if (!info.size())
|
||||||
|
@ -2100,7 +2109,7 @@ namespace rsx
|
||||||
vertex_push_buffers[index].vertex_count > 1)
|
vertex_push_buffers[index].vertex_count > 1)
|
||||||
{
|
{
|
||||||
// Push buffer
|
// Push buffer
|
||||||
const auto &info = rsx::method_registers.register_vertex_info[index];
|
const auto &info = vertex_push_buffers[index];
|
||||||
type = info.type;
|
type = info.type;
|
||||||
size = info.size;
|
size = info.size;
|
||||||
|
|
||||||
|
|
|
@ -247,8 +247,11 @@ namespace rsx
|
||||||
|
|
||||||
if (rsx->in_begin_end)
|
if (rsx->in_begin_end)
|
||||||
{
|
{
|
||||||
// Update to immediate mode register/array, aliasing with the register view
|
// Update to immediate mode register/array
|
||||||
rsx->append_to_push_buffer(attribute_index, count, vertex_subreg, vtype, arg);
|
rsx->append_to_push_buffer(attribute_index, count, vertex_subreg, vtype, arg);
|
||||||
|
|
||||||
|
// NOTE: one can update the register to update constant across primitive. Needs verification.
|
||||||
|
// Fall through
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& info = rsx::method_registers.register_vertex_info[attribute_index];
|
auto& info = rsx::method_registers.register_vertex_info[attribute_index];
|
||||||
|
|
|
@ -747,6 +747,12 @@ namespace rsx
|
||||||
_capacity = size;
|
_capacity = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void resize(u32 size)
|
||||||
|
{
|
||||||
|
reserve(size);
|
||||||
|
_size = size;
|
||||||
|
}
|
||||||
|
|
||||||
void push_back(const Ty& val)
|
void push_back(const Ty& val)
|
||||||
{
|
{
|
||||||
if (_size >= _capacity)
|
if (_size >= _capacity)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "GCM.h"
|
#include "GCM.h"
|
||||||
#include "Utilities/types.h"
|
#include "Utilities/types.h"
|
||||||
#include "Utilities/BEType.h"
|
#include "Utilities/BEType.h"
|
||||||
|
#include "rsx_utils.h"
|
||||||
|
|
||||||
namespace rsx
|
namespace rsx
|
||||||
{
|
{
|
||||||
|
@ -60,7 +61,7 @@ struct push_buffer_vertex_info
|
||||||
|
|
||||||
u32 vertex_count = 0;
|
u32 vertex_count = 0;
|
||||||
u32 attribute_mask = ~0;
|
u32 attribute_mask = ~0;
|
||||||
std::vector<u32> data;
|
rsx::simple_array<u32> data;
|
||||||
|
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
|
@ -98,6 +99,8 @@ struct push_buffer_vertex_info
|
||||||
const u32 element_mask = (1 << sub_index);
|
const u32 element_mask = (1 << sub_index);
|
||||||
const u8 vertex_size = get_vertex_size_in_dwords(type);
|
const u8 vertex_size = get_vertex_size_in_dwords(type);
|
||||||
|
|
||||||
|
this->type = type;
|
||||||
|
|
||||||
if (attribute_mask & element_mask)
|
if (attribute_mask & element_mask)
|
||||||
{
|
{
|
||||||
attribute_mask = 0;
|
attribute_mask = 0;
|
||||||
|
@ -122,7 +125,6 @@ struct register_vertex_data_info
|
||||||
|
|
||||||
register_vertex_data_info() {}
|
register_vertex_data_info() {}
|
||||||
std::array<u32, 4> data;
|
std::array<u32, 4> data;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue