rsx: Inline rsx_state and texture constructors.

This commit is contained in:
Vincent Lejeune 2016-07-28 23:20:39 +02:00
parent 0578430fd0
commit 4c46bde315
4 changed files with 35 additions and 52 deletions

View File

@ -6,11 +6,6 @@
namespace rsx namespace rsx
{ {
texture::texture(u8 idx, std::array<u32, 0x10000 / 4> &r) : m_index(idx), registers(r)
{
}
void texture::init() void texture::init()
{ {
// Offset // Offset
@ -248,11 +243,6 @@ namespace rsx
return registers[NV4097_SET_TEXTURE_CONTROL3 + m_index] & 0xfffff; return registers[NV4097_SET_TEXTURE_CONTROL3 + m_index] & 0xfffff;
} }
vertex_texture::vertex_texture(u8 idx, std::array<u32, 0x10000 / 4> &r) : m_index(idx), registers(r)
{
}
void vertex_texture::init() void vertex_texture::init()
{ {
// Offset // Offset

View File

@ -21,7 +21,7 @@ namespace rsx
std::array<u32, 0x10000 / 4> &registers; std::array<u32, 0x10000 / 4> &registers;
public: public:
texture(u8 idx, std::array<u32, 0x10000 / 4> &r); texture(u8 idx, std::array<u32, 0x10000 / 4> &r) : m_index(idx), registers(r) { }
texture() = delete; texture() = delete;
//initialize texture registers with default values //initialize texture registers with default values
@ -97,7 +97,7 @@ namespace rsx
std::array<u32, 0x10000 / 4> &registers; std::array<u32, 0x10000 / 4> &registers;
public: public:
vertex_texture(u8 idx, std::array<u32, 0x10000 / 4> &r); vertex_texture(u8 idx, std::array<u32, 0x10000 / 4> &r) : m_index(idx), registers(r) { }
vertex_texture() = delete; vertex_texture() = delete;
//initialize texture registers with default values //initialize texture registers with default values

View File

@ -780,41 +780,6 @@ namespace rsx
} }
} }
template<typename T, size_t... N, typename Args>
std::array<T, sizeof...(N)> fill_array(Args&& arg, std::index_sequence<N...> seq)
{
return{ T(N, std::forward<Args>(arg))... };
}
rsx_state & rsx_state::operator=(const rsx_state & in)
{
registers = in.registers;
transform_program = in.transform_program;
transform_constants = in.transform_constants;
register_vertex_info = in.register_vertex_info;
for (int i = 0; i < 16; i++)
{
vertex_arrays_info[i].size = in.vertex_arrays_info[i].size;
vertex_arrays_info[i].stride = in.vertex_arrays_info[i].stride;
vertex_arrays_info[i].frequency = in.vertex_arrays_info[i].frequency;
vertex_arrays_info[i].type = in.vertex_arrays_info[i].type;
}
return *this;
}
rsx_state::rsx_state() :
fragment_textures(fill_array<texture>(registers, std::make_index_sequence<16>())),
vertex_textures(fill_array<vertex_texture>(registers, std::make_index_sequence<4>())),
vertex_arrays_info(fill_array<data_array_format_info>(registers, std::make_index_sequence<16>()))
{
}
rsx_state::~rsx_state()
{
}
void rsx_state::reset() void rsx_state::reset()
{ {
//setup method registers //setup method registers

View File

@ -75,9 +75,18 @@ namespace rsx
} }
}; };
namespace
{
template<typename T, size_t... N, typename Args>
std::array<T, sizeof...(N)> fill_array(Args&& arg, std::index_sequence<N...> seq)
{
return{ T(N, std::forward<Args>(arg))... };
}
}
struct rsx_state struct rsx_state
{ {
private: protected:
std::array<u32, 0x10000 / 4> registers; std::array<u32, 0x10000 / 4> registers;
template<u32 opcode> template<u32 opcode>
@ -91,7 +100,21 @@ namespace rsx
} }
public: public:
rsx_state &operator=(const rsx_state& in); rsx_state &operator=(const rsx_state& in)
{
registers = in.registers;
transform_program = in.transform_program;
transform_constants = in.transform_constants;
register_vertex_info = in.register_vertex_info;
for (int i = 0; i < 16; i++)
{
vertex_arrays_info[i].size = in.vertex_arrays_info[i].size;
vertex_arrays_info[i].stride = in.vertex_arrays_info[i].stride;
vertex_arrays_info[i].frequency = in.vertex_arrays_info[i].frequency;
vertex_arrays_info[i].type = in.vertex_arrays_info[i].type;
}
return *this;
}
std::array<texture, 16> fragment_textures; std::array<texture, 16> fragment_textures;
std::array<vertex_texture, 4> vertex_textures; std::array<vertex_texture, 4> vertex_textures;
@ -119,8 +142,13 @@ namespace rsx
std::array<register_vertex_data_info, 16> register_vertex_info; std::array<register_vertex_data_info, 16> register_vertex_info;
std::array<data_array_format_info, 16> vertex_arrays_info; std::array<data_array_format_info, 16> vertex_arrays_info;
rsx_state(); rsx_state() :
~rsx_state(); fragment_textures(fill_array<texture>(registers, std::make_index_sequence<16>())),
vertex_textures(fill_array<vertex_texture>(registers, std::make_index_sequence<4>())),
vertex_arrays_info(fill_array<data_array_format_info>(registers, std::make_index_sequence<16>()))
{ }
~rsx_state() { }
void decode(u32 reg, u32 value); void decode(u32 reg, u32 value);
@ -600,7 +628,7 @@ namespace rsx
return decode<NV4097_SET_ALPHA_REF>().alpha_ref(); return decode<NV4097_SET_ALPHA_REF>().alpha_ref();
} }
surface_target surface_color_target() surface_target surface_color_target() const
{ {
return decode<NV4097_SET_SURFACE_COLOR_TARGET>().target(); return decode<NV4097_SET_SURFACE_COLOR_TARGET>().target();
} }