mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
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:
parent
fac4760c7d
commit
9a29301567
3 changed files with 50 additions and 9 deletions
|
|
@ -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':
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue