rsx/vk: Improvements and minor optimizations

- Improve dirty state tracking affecting program state
- vk: Refactor out transform constants upload into a separate channel to avoid if possible
  transform data uploads are quite expensive
This commit is contained in:
kd-11 2018-04-20 23:44:34 +03:00 committed by kd-11
parent 440a31ef18
commit b7979d3f57
8 changed files with 130 additions and 75 deletions

View file

@ -342,12 +342,17 @@ namespace rsx
u32 load = rsx::method_registers.transform_constant_load();
if ((load + index) >= 512)
{
LOG_ERROR(RSX, "Invalid register index (load=%d, index=%d)", load, index);
LOG_ERROR(RSX, "Invalid transform register index (load=%d, index=%d)", load, index);
return;
}
rsx::method_registers.transform_constants[load + reg][subreg] = arg;
rsxthr->m_transform_constants_dirty = true;
auto &value = rsx::method_registers.transform_constants[load + reg][subreg];
if (value != arg)
{
//Transform constants invalidation is expensive (~8k bytes per update)
value = arg;
rsxthr->m_graphics_state |= rsx::pipeline_state::transform_constants_dirty;
}
}
};
@ -357,19 +362,18 @@ namespace rsx
static void impl(thread* rsx, u32 _reg, u32 arg)
{
method_registers.commit_4_transform_program_instructions(index);
rsx->m_vertex_program_dirty = true;
rsx->m_graphics_state |= rsx::pipeline_state::vertex_program_dirty;
}
};
void set_transform_program_start(thread* rsx, u32, u32)
{
rsx->m_vertex_program_dirty = true;
rsx->m_graphics_state |= rsx::pipeline_state::vertex_program_dirty;
}
void set_vertex_attribute_output_mask(thread* rsx, u32, u32)
{
rsx->m_vertex_program_dirty = true;
rsx->m_fragment_program_dirty = true;
rsx->m_graphics_state |= rsx::pipeline_state::vertex_program_dirty | rsx::pipeline_state::fragment_program_dirty;
}
void set_begin_end(thread* rsxthr, u32 _reg, u32 arg)
@ -535,7 +539,7 @@ namespace rsx
void invalidate_L2(thread* rsx, u32, u32)
{
rsx->m_fragment_program_dirty = true;
rsx->m_graphics_state |= rsx::pipeline_state::fragment_program_dirty;
}
void set_surface_dirty_bit(thread* rsx, u32, u32)
@ -556,7 +560,7 @@ namespace rsx
static void impl(thread* rsx, u32 _reg, u32 arg)
{
rsx->m_textures_dirty[index] = true;
rsx->m_fragment_program_dirty = true;
rsx->m_graphics_state |= rsx::pipeline_state::fragment_program_dirty;
}
};
@ -584,7 +588,7 @@ namespace rsx
u32 address = get_address(method_registers.blit_engine_output_offset_nv3062() + pixel_offset + index * 4, method_registers.blit_engine_output_location_nv3062());
vm::write32(address, arg);
rsx->m_fragment_program_dirty = true;
rsx->m_graphics_state |= rsx::pipeline_state::fragment_program_dirty;
}
};
}