r600/sfn: Prepare uniforms and local arrays for better address handling

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21347>
This commit is contained in:
Gert Wollny 2023-02-10 15:58:52 +01:00 committed by Marge Bot
parent fac4760c7d
commit 9a29301567
3 changed files with 50 additions and 9 deletions

View file

@ -788,7 +788,7 @@ ValueFactory::src_from_string(const std::string& s)
case 'L':
return LiteralConstant::from_string(s);
case 'K':
return UniformValue::from_string(s);
return UniformValue::from_string(s, this);
case 'P':
return InlineConstant::param_from_string(s);
case 'I':

View file

@ -137,7 +137,7 @@ VirtualValue::from_string(const std::string& s)
case 'L':
return LiteralConstant::from_string(s);
case 'K':
return UniformValue::from_string(s);
return UniformValue::from_string(s, nullptr);
case 'P':
return InlineConstant::param_from_string(s);
case 'I':
@ -763,6 +763,11 @@ UniformValue::buf_addr() const
return m_buf_addr;
}
void UniformValue::set_buf_addr(PVirtualValue addr)
{
m_buf_addr = addr;
}
void
UniformValue::print(std::ostream& os) const
{
@ -788,10 +793,12 @@ UniformValue::equal_buf_and_cache(const UniformValue& other) const
}
UniformValue::Pointer
UniformValue::from_string(const std::string& s)
UniformValue::from_string(const std::string& s, ValueFactory *factory)
{
assert(s[1] == 'C');
std::istringstream is(s.substr(2));
VirtualValue *bufid = nullptr;
int bank;
char c;
is >> bank;
@ -799,10 +806,31 @@ UniformValue::from_string(const std::string& s)
assert(c == '[');
std::stringstream index0_ss;
int index;
is >> index;
is >> c;
while (c != ']' && is.good()) {
index0_ss << c;
is >> c;
}
auto index0_str = index0_ss.str();
if (isdigit(index0_str[0])) {
std::istringstream is_digit(index0_str);
is_digit >> index;
} else {
bufid = factory ?
factory->src_from_string(index0_str) :
Register::from_string(index0_str);
assert(c == ']');
is >> c;
assert(c == '[');
is >> index;
is >> c;
}
assert(c == ']');
is >> c;
assert(c == '.');
@ -825,7 +853,10 @@ UniformValue::from_string(const std::string& s)
default:
unreachable("Unknown channel when reading uniform");
}
return new UniformValue(index + 512, chan, bank);
if (bufid)
return new UniformValue(index + 512, chan, bufid, bank);
else
return new UniformValue(index + 512, chan, bank);
}
LocalArray::LocalArray(int base_sel, int nchannels, int size, int frac):
@ -1003,6 +1034,12 @@ LocalArrayValue::addr() const
return m_addr;
}
void LocalArrayValue::set_addr(PRegister addr)
{
m_addr = addr;
}
const LocalArray&
LocalArrayValue::array() const
{

View file

@ -70,6 +70,7 @@ class Instr;
class InlineConstant;
class LiteralConstant;
class UniformValue;
class ValueFactory;
using InstructionSet = std::set<Instr *, std::less<Instr *>, Allocator<Instr *>>;
@ -228,13 +229,12 @@ class AddressRegister : public Register {
public:
enum Type {
addr,
idx0 = 2,
idx1 = 3
idx0 = 1,
idx1 = 2
};
AddressRegister(Type type) : Register(type, 0, pin_fully) {
set_flag(addr_or_idx);
}
Register *as_register() override { return nullptr; }
protected:
void do_set_chan(UNUSED int c) { unreachable("Address registers must have chan 0");}
@ -406,10 +406,11 @@ public:
void print(std::ostream& os) const override;
int kcache_bank() const { return m_kcache_bank; }
PVirtualValue buf_addr() const;
void set_buf_addr(PVirtualValue addr);
UniformValue *as_uniform() override { return this; }
bool equal_buf_and_cache(const UniformValue& other) const;
static Pointer from_string(const std::string& s);
static Pointer from_string(const std::string& s, ValueFactory *factory);
private:
int m_kcache_bank;
@ -449,6 +450,8 @@ public:
Values::iterator begin() { return m_values.begin(); }
Values::iterator end() { return m_values.end(); }
Values::const_iterator begin() const { return m_values.begin(); }
Values::const_iterator end() const { return m_values.end(); }
private:
uint32_t m_base_sel;
@ -479,6 +482,7 @@ public:
bool ready(int block, int index) const override;
VirtualValue *addr() const override;
void set_addr(PRegister addr);
const LocalArray& array() const;
private: