mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-06 15:01:28 +12:00
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:
parent
440a31ef18
commit
b7979d3f57
8 changed files with 130 additions and 75 deletions
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue