|
|
@ -198,6 +198,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
|
|
|
|
|
|
|
|
|
|
|
|
const auto& attribute_config = regs.vertex_attributes;
|
|
|
|
const auto& attribute_config = regs.vertex_attributes;
|
|
|
|
const u32 base_address = attribute_config.GetPhysicalBaseAddress();
|
|
|
|
const u32 base_address = attribute_config.GetPhysicalBaseAddress();
|
|
|
|
|
|
|
|
int num_total_attributes = attribute_config.GetNumTotalAttributes();
|
|
|
|
|
|
|
|
|
|
|
|
// Information about internal vertex attributes
|
|
|
|
// Information about internal vertex attributes
|
|
|
|
u32 vertex_attribute_sources[16];
|
|
|
|
u32 vertex_attribute_sources[16];
|
|
|
@ -207,7 +208,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
|
|
|
|
|
|
|
|
|
|
|
|
u32 vertex_attribute_elements[16] = {};
|
|
|
|
u32 vertex_attribute_elements[16] = {};
|
|
|
|
u32 vertex_attribute_element_size[16] = {};
|
|
|
|
u32 vertex_attribute_element_size[16] = {};
|
|
|
|
|
|
|
|
bool vertex_attribute_default[16] = {};
|
|
|
|
// Setup attribute data from loaders
|
|
|
|
// Setup attribute data from loaders
|
|
|
|
for (int loader = 0; loader < 12; ++loader) {
|
|
|
|
for (int loader = 0; loader < 12; ++loader) {
|
|
|
|
const auto& loader_config = attribute_config.attribute_loaders[loader];
|
|
|
|
const auto& loader_config = attribute_config.attribute_loaders[loader];
|
|
|
@ -230,6 +231,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
|
|
|
|
vertex_attribute_formats[attribute_index] = attribute_config.GetFormat(attribute_index);
|
|
|
|
vertex_attribute_formats[attribute_index] = attribute_config.GetFormat(attribute_index);
|
|
|
|
vertex_attribute_elements[attribute_index] = attribute_config.GetNumElements(attribute_index);
|
|
|
|
vertex_attribute_elements[attribute_index] = attribute_config.GetNumElements(attribute_index);
|
|
|
|
vertex_attribute_element_size[attribute_index] = element_size;
|
|
|
|
vertex_attribute_element_size[attribute_index] = element_size;
|
|
|
|
|
|
|
|
vertex_attribute_default[attribute_index] = attribute_config.IsDefaultAttribute(attribute_index);
|
|
|
|
offset += attribute_config.GetStride(attribute_index);
|
|
|
|
offset += attribute_config.GetStride(attribute_index);
|
|
|
|
} else if (attribute_index < 16) {
|
|
|
|
} else if (attribute_index < 16) {
|
|
|
|
// Attribute ids 12, 13, 14 and 15 signify 4, 8, 12 and 16-byte paddings, respectively
|
|
|
|
// Attribute ids 12, 13, 14 and 15 signify 4, 8, 12 and 16-byte paddings, respectively
|
|
|
@ -333,7 +335,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
|
|
|
|
// Initialize data for the current vertex
|
|
|
|
// Initialize data for the current vertex
|
|
|
|
Shader::InputVertex input;
|
|
|
|
Shader::InputVertex input;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < attribute_config.GetNumTotalAttributes(); ++i) {
|
|
|
|
for (int i = 0; i < num_total_attributes; ++i) {
|
|
|
|
if (vertex_attribute_elements[i] != 0) {
|
|
|
|
if (vertex_attribute_elements[i] != 0) {
|
|
|
|
// Default attribute values set if array elements have < 4 components. This
|
|
|
|
// Default attribute values set if array elements have < 4 components. This
|
|
|
|
// is *not* carried over from the default attribute settings even if they're
|
|
|
|
// is *not* carried over from the default attribute settings even if they're
|
|
|
@ -362,12 +364,12 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
|
|
|
|
input.attr[i][comp] = float24::FromFloat32(srcval);
|
|
|
|
input.attr[i][comp] = float24::FromFloat32(srcval);
|
|
|
|
LOG_TRACE(HW_GPU, "Loaded component %x of attribute %x for vertex %x (index %x) from 0x%08x + 0x%08x + 0x%04x: %f",
|
|
|
|
LOG_TRACE(HW_GPU, "Loaded component %x of attribute %x for vertex %x (index %x) from 0x%08x + 0x%08x + 0x%04x: %f",
|
|
|
|
comp, i, vertex, index,
|
|
|
|
comp, i, vertex, index,
|
|
|
|
attribute_config.GetPhysicalBaseAddress(),
|
|
|
|
base_address,
|
|
|
|
vertex_attribute_sources[i] - base_address,
|
|
|
|
vertex_attribute_sources[i] - base_address,
|
|
|
|
vertex_attribute_strides[i] * vertex + comp * vertex_attribute_element_size[i],
|
|
|
|
vertex_attribute_strides[i] * vertex + comp * vertex_attribute_element_size[i],
|
|
|
|
input.attr[i][comp].ToFloat32());
|
|
|
|
input.attr[i][comp].ToFloat32());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (attribute_config.IsDefaultAttribute(i)) {
|
|
|
|
} else if (vertex_attribute_default[i]) {
|
|
|
|
// Load the default attribute if we're configured to do so
|
|
|
|
// Load the default attribute if we're configured to do so
|
|
|
|
input.attr[i] = g_state.vs.default_attributes[i];
|
|
|
|
input.attr[i] = g_state.vs.default_attributes[i];
|
|
|
|
LOG_TRACE(HW_GPU, "Loaded default attribute %x for vertex %x (index %x): (%f, %f, %f, %f)",
|
|
|
|
LOG_TRACE(HW_GPU, "Loaded default attribute %x for vertex %x (index %x): (%f, %f, %f, %f)",
|
|
|
@ -385,7 +387,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
|
|
|
|
g_debug_context->OnEvent(DebugContext::Event::VertexLoaded, (void*)&input);
|
|
|
|
g_debug_context->OnEvent(DebugContext::Event::VertexLoaded, (void*)&input);
|
|
|
|
|
|
|
|
|
|
|
|
// Send to vertex shader
|
|
|
|
// Send to vertex shader
|
|
|
|
output = Shader::Run(shader_unit, input, attribute_config.GetNumTotalAttributes());
|
|
|
|
output = Shader::Run(shader_unit, input, num_total_attributes);
|
|
|
|
|
|
|
|
|
|
|
|
if (is_indexed) {
|
|
|
|
if (is_indexed) {
|
|
|
|
vertex_cache[vertex_cache_pos] = output;
|
|
|
|
vertex_cache[vertex_cache_pos] = output;
|
|
|
|