diff --git a/src/gallium/drivers/r600/sfn/sfn_valuepool.cpp b/src/gallium/drivers/r600/sfn/sfn_valuepool.cpp index 579e39f0acd..750073a31ac 100644 --- a/src/gallium/drivers/r600/sfn/sfn_valuepool.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_valuepool.cpp @@ -151,8 +151,14 @@ PValue ValuePool::from_nir(const nir_alu_src &v, unsigned component) return from_nir(v.src, component, v.swizzle[component]); } -PValue ValuePool::get_temp_register() +PValue ValuePool::get_temp_register(int channel) { + /* Skip to next register to get the channel we want */ + if (next_temp_reg_comp <= channel) + next_temp_reg_comp = channel; + else + next_temp_reg_comp = 4; + if (next_temp_reg_comp > 3) { current_temp_reg_index = allocate_temp_register(); next_temp_reg_comp = 0; diff --git a/src/gallium/drivers/r600/sfn/sfn_valuepool.h b/src/gallium/drivers/r600/sfn/sfn_valuepool.h index acb04545974..dc44777c204 100644 --- a/src/gallium/drivers/r600/sfn/sfn_valuepool.h +++ b/src/gallium/drivers/r600/sfn/sfn_valuepool.h @@ -184,7 +184,7 @@ public: PValue literal(uint32_t value); - PValue get_temp_register(); + PValue get_temp_register(int channel = -1); GPRVector get_temp_vec4();