shader.set_flag(Shader::sh_txs_cube_array_comp);
if (const_offset) {
- unsigned lookup_resid = const_offset[0].u32;
+ unsigned lookup_resid = const_offset[0].u32 + shader.image_size_const_offset();
shader.emit_instruction(
new AluInstr(op1_mov,
dest[2],
break;
case MESA_SHADER_KERNEL:
case MESA_SHADER_COMPUTE:
- shader = new ComputeShader(key);
+ shader = new ComputeShader(key, BITSET_COUNT(nir->info.samplers_used));
break;
default:
return nullptr;
PRegister emit_load_to_register(PVirtualValue src);
+ virtual unsigned image_size_const_offset() { return 0;}
+
protected:
enum ESlots {
es_face,
namespace r600 {
-ComputeShader::ComputeShader(UNUSED const r600_shader_key& key):
- Shader("CS", 0)
+ComputeShader::ComputeShader(UNUSED const r600_shader_key& key, int num_samplers):
+ Shader("CS", 0),
+ m_image_size_const_offset(num_samplers)
{
}
class ComputeShader : public Shader {
public:
- ComputeShader(const r600_shader_key& key);
+ ComputeShader(const r600_shader_key& key, int num_samplers);
+
+ unsigned image_size_const_offset() override { return m_image_size_const_offset;}
private:
bool do_scan_instruction(nir_instr *instr) override;
std::array<PRegister, 3> m_local_invocation_id{nullptr};
PRegister m_zero_register{0};
+ int m_image_size_const_offset{0};
};
} // namespace r600
m_pos_input(127, false),
m_fs_write_all(false),
m_apply_sample_mask(key.ps.apply_sample_id_mask),
- m_rat_base(key.ps.nr_cbufs)
+ m_rat_base(key.ps.nr_cbufs),
+ m_image_size_const_offset(key.ps.image_size_const_offset)
{
}
bool process_stage_intrinsic(nir_intrinsic_instr *intr) override;
+ unsigned image_size_const_offset() override { return m_image_size_const_offset;}
+
protected:
static const int s_max_interpolators = 6;
bool interpolators_used(int i) const { return m_interpolators_used.test(i); }
int m_rat_base{0};
int m_pos_driver_loc{0};
int m_face_driver_loc{0};
+ int m_image_size_const_offset{0};
};
class FragmentShaderR600 : public FragmentShader {