@ -195,7 +195,7 @@ void Maxwell3D::ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argume
case MAXWELL3D_REG_INDEX ( const_buffer . cb_data ) + 13 :
case MAXWELL3D_REG_INDEX ( const_buffer . cb_data ) + 14 :
case MAXWELL3D_REG_INDEX ( const_buffer . cb_data ) + 15 :
return StartCBData( method ) ;
return ProcessCBData( argument ) ;
case MAXWELL3D_REG_INDEX ( cb_bind [ 0 ] ) :
return ProcessCBBind ( 0 ) ;
case MAXWELL3D_REG_INDEX ( cb_bind [ 1 ] ) :
@ -248,14 +248,6 @@ void Maxwell3D::CallMacroMethod(u32 method, const std::vector<u32>& parameters)
}
void Maxwell3D : : CallMethod ( u32 method , u32 method_argument , bool is_last_call ) {
if ( method = = cb_data_state . current ) {
regs . reg_array [ method ] = method_argument ;
ProcessCBData ( method_argument ) ;
return ;
} else if ( cb_data_state . current ! = null_cb_data ) {
FinishCBData ( ) ;
}
// It is an error to write to a register other than the current macro's ARG register before it
// has finished execution.
if ( executing_macro ! = 0 ) {
@ -302,7 +294,7 @@ void Maxwell3D::CallMultiMethod(u32 method, const u32* base_start, u32 amount,
case MAXWELL3D_REG_INDEX ( const_buffer . cb_data ) + 13 :
case MAXWELL3D_REG_INDEX ( const_buffer . cb_data ) + 14 :
case MAXWELL3D_REG_INDEX ( const_buffer . cb_data ) + 15 :
ProcessCBMultiData ( method, base_start, amount ) ;
ProcessCBMultiData ( base_start, amount ) ;
break ;
default :
for ( std : : size_t i = 0 ; i < amount ; i + + ) {
@ -587,46 +579,7 @@ void Maxwell3D::ProcessCBBind(size_t stage_index) {
rasterizer - > BindGraphicsUniformBuffer ( stage_index , bind_data . index , gpu_addr , size ) ;
}
void Maxwell3D : : ProcessCBData ( u32 value ) {
const u32 id = cb_data_state . id ;
cb_data_state . buffer [ id ] [ cb_data_state . counter ] = value ;
// Increment the current buffer position.
regs . const_buffer . cb_pos = regs . const_buffer . cb_pos + 4 ;
cb_data_state . counter + + ;
}
void Maxwell3D : : StartCBData ( u32 method ) {
constexpr u32 first_cb_data = MAXWELL3D_REG_INDEX ( const_buffer . cb_data ) ;
cb_data_state . start_pos = regs . const_buffer . cb_pos ;
cb_data_state . id = method - first_cb_data ;
cb_data_state . current = method ;
cb_data_state . counter = 0 ;
ProcessCBData ( regs . const_buffer . cb_data [ cb_data_state . id ] ) ;
}
void Maxwell3D : : ProcessCBMultiData ( u32 method , const u32 * start_base , u32 amount ) {
if ( cb_data_state . current ! = method ) {
if ( cb_data_state . current ! = null_cb_data ) {
FinishCBData ( ) ;
}
constexpr u32 first_cb_data = MAXWELL3D_REG_INDEX ( const_buffer . cb_data ) ;
cb_data_state . start_pos = regs . const_buffer . cb_pos ;
cb_data_state . id = method - first_cb_data ;
cb_data_state . current = method ;
cb_data_state . counter = 0 ;
}
const std : : size_t id = cb_data_state . id ;
const std : : size_t size = amount ;
std : : size_t i = 0 ;
for ( ; i < size ; i + + ) {
cb_data_state . buffer [ id ] [ cb_data_state . counter ] = start_base [ i ] ;
cb_data_state . counter + + ;
}
// Increment the current buffer position.
regs . const_buffer . cb_pos = regs . const_buffer . cb_pos + 4 * amount ;
}
void Maxwell3D : : FinishCBData ( ) {
void Maxwell3D : : ProcessCBMultiData ( const u32 * start_base , u32 amount ) {
// Write the input value to the current const buffer at the current position.
const GPUVAddr buffer_address = regs . const_buffer . BufferAddress ( ) ;
ASSERT ( buffer_address ! = 0 ) ;
@ -634,14 +587,16 @@ void Maxwell3D::FinishCBData() {
// Don't allow writing past the end of the buffer.
ASSERT ( regs . const_buffer . cb_pos < = regs . const_buffer . cb_size ) ;
const GPUVAddr address { buffer_address + cb_data_state . start_pos } ;
const std : : size_t size = regs . const_buffer . cb_pos - cb_data_state . start_pos ;
const GPUVAddr address { buffer_address + regs . const_buffer . cb_pos } ;
const size_t copy_size = amount * sizeof ( u32 ) ;
memory_manager . WriteBlock ( address , start_base , copy_size ) ;
const u32 id = cb_data_state . id ;
memory_manager . WriteBlock ( address , cb_data_state . buffer [ id ] . data ( ) , size ) ;
// Increment the current buffer position.
regs . const_buffer . cb_pos + = static_cast < u32 > ( copy_size ) ;
}
cb_data_state . id = null_cb_data ;
cb_data_state. current = null_cb_data ;
void Maxwell3D : : ProcessCBData ( u32 value ) {
ProcessCBMultiData( & value , 1 ) ;
}
Texture : : TICEntry Maxwell3D : : GetTICEntry ( u32 tic_index ) const {