Prechádzať zdrojové kódy

Remove late accesses to attribute_config

Henrik Rydgard 10 rokov pred
rodič
commit
0cf15f64ef
1 zmenil súbory, kde vykonal 7 pridanie a 5 odobranie
  1. 7 5
      src/video_core/command_processor.cpp

+ 7 - 5
src/video_core/command_processor.cpp

@@ -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;