2018-10-01 23:05:51 +03:00
|
|
|
|
#pragma once
|
2016-06-26 23:37:02 +02:00
|
|
|
|
|
2018-09-29 01:12:00 +03:00
|
|
|
|
#include "gcm_enums.h"
|
2018-09-26 01:14:10 +03:00
|
|
|
|
#include "rsx_decode.h"
|
|
|
|
|
|
|
2016-06-26 23:37:02 +02:00
|
|
|
|
#include "Utilities/types.h"
|
2018-11-25 00:31:16 +03:00
|
|
|
|
#include "rsx_utils.h"
|
2016-06-26 23:37:02 +02:00
|
|
|
|
|
|
|
|
|
|
namespace rsx
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
struct data_array_format_info
|
|
|
|
|
|
{
|
2016-07-20 18:23:55 +02:00
|
|
|
|
private:
|
2016-08-26 15:46:44 +02:00
|
|
|
|
u8 index;
|
|
|
|
|
|
std::array<u32, 0x10000 / 4>& registers;
|
|
|
|
|
|
|
|
|
|
|
|
auto decode_reg() const
|
|
|
|
|
|
{
|
|
|
|
|
|
const typename rsx::registers_decoder<NV4097_SET_VERTEX_DATA_ARRAY_FORMAT>::decoded_type
|
|
|
|
|
|
decoded_value(registers[NV4097_SET_VERTEX_DATA_ARRAY_FORMAT + index]);
|
|
|
|
|
|
return decoded_value;
|
|
|
|
|
|
}
|
2016-06-26 23:37:02 +02:00
|
|
|
|
|
2016-08-26 15:46:44 +02:00
|
|
|
|
public:
|
|
|
|
|
|
data_array_format_info(int id, std::array<u32, 0x10000 / 4>& r)
|
2020-02-21 15:20:10 +03:00
|
|
|
|
: index(id)
|
|
|
|
|
|
, registers(r)
|
2016-08-26 15:46:44 +02:00
|
|
|
|
{
|
|
|
|
|
|
}
|
2016-06-26 23:37:02 +02:00
|
|
|
|
|
|
|
|
|
|
u32 offset() const
|
|
|
|
|
|
{
|
2016-08-26 15:46:44 +02:00
|
|
|
|
return registers[NV4097_SET_VERTEX_DATA_ARRAY_OFFSET + index];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
u8 stride() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return decode_reg().stride();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
u8 size() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return decode_reg().size();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
u16 frequency() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return decode_reg().frequency();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
vertex_base_type type() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return decode_reg().type();
|
2016-06-26 23:37:02 +02:00
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2017-03-26 00:59:57 +03:00
|
|
|
|
struct push_buffer_vertex_info
|
|
|
|
|
|
{
|
2017-07-31 14:38:28 +03:00
|
|
|
|
u8 size = 0;
|
|
|
|
|
|
vertex_base_type type = vertex_base_type::f;
|
2017-03-26 00:59:57 +03:00
|
|
|
|
|
|
|
|
|
|
u32 vertex_count = 0;
|
|
|
|
|
|
u32 attribute_mask = ~0;
|
2018-11-25 00:31:16 +03:00
|
|
|
|
rsx::simple_array<u32> data;
|
2017-03-26 00:59:57 +03:00
|
|
|
|
|
|
|
|
|
|
void clear()
|
|
|
|
|
|
{
|
2018-10-01 23:05:51 +03:00
|
|
|
|
if (size)
|
|
|
|
|
|
{
|
|
|
|
|
|
data.clear();
|
|
|
|
|
|
attribute_mask = ~0;
|
|
|
|
|
|
vertex_count = 0;
|
|
|
|
|
|
size = 0;
|
|
|
|
|
|
}
|
2017-03-26 00:59:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-03-26 12:01:50 +03:00
|
|
|
|
u8 get_vertex_size_in_dwords(vertex_base_type type)
|
|
|
|
|
|
{
|
|
|
|
|
|
//NOTE: Types are always provided to fit into 32-bits
|
|
|
|
|
|
//i.e no less than 4 8-bit values and no less than 2 16-bit values
|
|
|
|
|
|
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case vertex_base_type::f:
|
|
|
|
|
|
return size;
|
|
|
|
|
|
case vertex_base_type::ub:
|
|
|
|
|
|
case vertex_base_type::ub256:
|
|
|
|
|
|
return 1;
|
2017-07-27 19:04:55 +03:00
|
|
|
|
case vertex_base_type::s1:
|
2017-03-26 12:01:50 +03:00
|
|
|
|
case vertex_base_type::s32k:
|
|
|
|
|
|
return size / 2;
|
|
|
|
|
|
default:
|
2019-11-30 02:11:28 +03:00
|
|
|
|
fmt::throw_exception("Unsupported vertex base type %d", static_cast<u8>(type));
|
2017-03-26 12:01:50 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void append_vertex_data(u32 sub_index, vertex_base_type type, u32 arg)
|
2017-03-26 00:59:57 +03:00
|
|
|
|
{
|
|
|
|
|
|
const u32 element_mask = (1 << sub_index);
|
2017-03-26 12:01:50 +03:00
|
|
|
|
const u8 vertex_size = get_vertex_size_in_dwords(type);
|
|
|
|
|
|
|
2018-11-25 00:31:16 +03:00
|
|
|
|
this->type = type;
|
|
|
|
|
|
|
2017-03-26 00:59:57 +03:00
|
|
|
|
if (attribute_mask & element_mask)
|
|
|
|
|
|
{
|
|
|
|
|
|
attribute_mask = 0;
|
|
|
|
|
|
|
|
|
|
|
|
vertex_count++;
|
2017-03-26 12:01:50 +03:00
|
|
|
|
data.resize(vertex_count * vertex_size);
|
2017-03-26 00:59:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
attribute_mask |= element_mask;
|
2017-03-26 12:01:50 +03:00
|
|
|
|
|
2019-11-30 02:11:28 +03:00
|
|
|
|
u32* dst = data.data() + ((vertex_count - 1) * vertex_size) + sub_index;
|
|
|
|
|
|
*dst = arg;
|
2017-03-26 00:59:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2016-07-13 18:18:10 +02:00
|
|
|
|
struct register_vertex_data_info
|
|
|
|
|
|
{
|
|
|
|
|
|
u16 frequency = 0;
|
|
|
|
|
|
u8 stride = 0;
|
|
|
|
|
|
u8 size = 0;
|
|
|
|
|
|
vertex_base_type type = vertex_base_type::f;
|
|
|
|
|
|
|
2019-06-08 09:33:48 +02:00
|
|
|
|
register_vertex_data_info() = default;
|
2016-07-13 18:18:10 +02:00
|
|
|
|
std::array<u32, 4> data;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2016-06-26 23:37:02 +02:00
|
|
|
|
}
|