From 9a293015671f0d59d9511f41c9b6a7d9bd8f1948 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Fri, 10 Feb 2023 15:58:52 +0100 Subject: [PATCH] r600/sfn: Prepare uniforms and local arrays for better address handling Signed-off-by: Gert Wollny Part-of: --- .../drivers/r600/sfn/sfn_valuefactory.cpp | 2 +- .../drivers/r600/sfn/sfn_virtualvalues.cpp | 45 +++++++++++++++++-- .../drivers/r600/sfn/sfn_virtualvalues.h | 12 +++-- 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp b/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp index 2661449c8db..f36279e69f5 100644 --- a/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp @@ -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': diff --git a/src/gallium/drivers/r600/sfn/sfn_virtualvalues.cpp b/src/gallium/drivers/r600/sfn/sfn_virtualvalues.cpp index 240a690399f..c863738c95c 100644 --- a/src/gallium/drivers/r600/sfn/sfn_virtualvalues.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_virtualvalues.cpp @@ -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 { diff --git a/src/gallium/drivers/r600/sfn/sfn_virtualvalues.h b/src/gallium/drivers/r600/sfn/sfn_virtualvalues.h index 3a59b7d1e70..009d6418dd8 100644 --- a/src/gallium/drivers/r600/sfn/sfn_virtualvalues.h +++ b/src/gallium/drivers/r600/sfn/sfn_virtualvalues.h @@ -70,6 +70,7 @@ class Instr; class InlineConstant; class LiteralConstant; class UniformValue; +class ValueFactory; using InstructionSet = std::set, Allocator>; @@ -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: