summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorGert Wollny <[email protected]>2017-10-11 19:56:46 +0200
committerBrian Paul <[email protected]>2018-01-24 10:23:00 -0700
commit6569b33b6eed94aa8722287344f9f06a9390e0e5 (patch)
tree1dd103fb5e4657dce30ed5a417600f37e45d6430 /src/mesa/state_tracker
parentad1990629e4d855101977f39319db47f51daf536 (diff)
mesa/st/tests: unify MockCodeLine* classes
* Merge the classes MockCodeLine and MockCodelineWithSwizzle into one, and refactor tests accordingly. * Change memory allocations to use ralloc* interface. v2: * move the test classes into a conveniance library * rename the Mock* classes to Fake* since they are not really Mocks * Base assertion of correct number of src and dst registers in tests on what the operatand actually expects * Fix number of destinations in one test v6: * fix local includes using "..." insteadof <...> Reviewed-by: Brian Paul <[email protected]> Signed-off-by: Gert Wollny <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/tests/Makefile.am6
-rw-r--r--src/mesa/state_tracker/tests/st_tests_common.cpp394
-rw-r--r--src/mesa/state_tracker/tests/st_tests_common.h163
-rw-r--r--src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp719
4 files changed, 735 insertions, 547 deletions
diff --git a/src/mesa/state_tracker/tests/Makefile.am b/src/mesa/state_tracker/tests/Makefile.am
index 6c58d367694..0350c64bf3d 100644
--- a/src/mesa/state_tracker/tests/Makefile.am
+++ b/src/mesa/state_tracker/tests/Makefile.am
@@ -18,8 +18,13 @@ AM_CPPFLAGS = \
if HAVE_STD_CXX11
TESTS = st-renumerate-test
check_PROGRAMS = st-renumerate-test
+
+noinst_LIBRARIES = libmesa-st-tests-common.a
endif
+libmesa_st_tests_common_a_SOURCES = \
+ st_tests_common.cpp
+
st_renumerate_test_SOURCES = \
test_glsl_to_tgsi_lifetime.cpp
@@ -27,6 +32,7 @@ st_renumerate_test_LDFLAGS = \
$(LLVM_LDFLAGS)
st_renumerate_test_LDADD = \
+ libmesa-st-tests-common.a \
$(top_builddir)/src/mesa/libmesagallium.la \
$(top_builddir)/src/mapi/shared-glapi/libglapi.la \
$(top_builddir)/src/gallium/auxiliary/libgallium.la \
diff --git a/src/mesa/state_tracker/tests/st_tests_common.cpp b/src/mesa/state_tracker/tests/st_tests_common.cpp
new file mode 100644
index 00000000000..03d664dd4bb
--- /dev/null
+++ b/src/mesa/state_tracker/tests/st_tests_common.cpp
@@ -0,0 +1,394 @@
+/*
+ * Copyright © 2017 Gert Wollny
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "st_tests_common.h"
+
+#include "mesa/program/prog_instruction.h"
+#include "tgsi/tgsi_info.h"
+#include "tgsi/tgsi_ureg.h"
+#include "compiler/glsl/list.h"
+#include "gtest/gtest.h"
+
+#include <utility>
+#include <algorithm>
+
+using std::vector;
+using std::pair;
+using std::make_pair;
+using std::transform;
+using std::copy;
+using std::tuple;
+
+
+/* Implementation of helper and test classes */
+void *FakeCodeline::mem_ctx = nullptr;
+
+FakeCodeline::FakeCodeline(unsigned _op, const vector<int>& _dst,
+ const vector<int>& _src, const vector<int>&_to):
+ op(_op),
+ max_temp_id(0)
+{
+ transform(_dst.begin(), _dst.end(), std::back_inserter(dst),
+ [this](int i) { return create_dst_register(i);});
+
+ transform(_src.begin(), _src.end(), std::back_inserter(src),
+ [this](int i) { return create_src_register(i);});
+
+ transform(_to.begin(), _to.end(), std::back_inserter(tex_offsets),
+ [this](int i) { return create_src_register(i);});
+
+}
+
+FakeCodeline::FakeCodeline(unsigned _op, const vector<pair<int,int>>& _dst,
+ const vector<pair<int, const char *>>& _src,
+ const vector<pair<int, const char *>>&_to,
+ SWZ with_swizzle):
+ op(_op),
+ max_temp_id(0)
+{
+ (void)with_swizzle;
+
+ transform(_dst.begin(), _dst.end(), std::back_inserter(dst),
+ [this](pair<int,int> r) {
+ return create_dst_register(r.first, r.second);
+ });
+
+ transform(_src.begin(), _src.end(), std::back_inserter(src),
+ [this](const pair<int,const char *>& r) {
+ return create_src_register(r.first, r.second);
+ });
+
+ transform(_to.begin(), _to.end(), std::back_inserter(tex_offsets),
+ [this](const pair<int,const char *>& r) {
+ return create_src_register(r.first, r.second);
+ });
+}
+
+FakeCodeline::FakeCodeline(const glsl_to_tgsi_instruction& instr):
+ op(instr.op),
+ max_temp_id(0)
+{
+ int nsrc = num_inst_src_regs(&instr);
+ int ndst = num_inst_dst_regs(&instr);
+
+ copy(instr.src, instr.src + nsrc, std::back_inserter(src));
+ copy(instr.dst, instr.dst + ndst, std::back_inserter(dst));
+
+ for (auto& s: src)
+ read_reg(s);
+
+ for (auto& d: dst)
+ read_reg(d);
+
+}
+
+template <typename st_reg>
+void FakeCodeline::read_reg(const st_reg& s)
+{
+ if (s.file == PROGRAM_TEMPORARY) {
+ if (s.index > max_temp_id)
+ max_temp_id = s.index;
+ }
+}
+
+void FakeCodeline::print(std::ostream& os) const
+{
+ const struct tgsi_opcode_info *info = tgsi_get_opcode_info(op);
+ os << tgsi_get_opcode_name(info->opcode) << " ";
+
+ for (auto d: dst) {
+ os << d << " ";
+ }
+ os << " <- ";
+ for (auto s: src) {
+ os << s << " ";
+ }
+ os << "\n";
+}
+
+bool operator == (const FakeCodeline& lhs, const FakeCodeline& rhs)
+{
+ if ((lhs.op != rhs.op) ||
+ (lhs.src.size() != rhs.src.size()) ||
+ (lhs.dst.size() != rhs.dst.size()))
+ return false;
+
+ return std::equal(lhs.src.begin(), lhs.src.end(), rhs.src.begin()) &&
+ std::equal(lhs.dst.begin(), lhs.dst.end(), rhs.dst.begin());
+}
+
+st_src_reg FakeCodeline::create_src_register(int src_idx)
+{
+ return create_src_register(src_idx,
+ src_idx < 0 ? PROGRAM_INPUT : PROGRAM_TEMPORARY);
+}
+
+static int swizzle_from_char(const char *sw)
+{
+ int swizzle = 0;
+ if (!sw || sw[0] == 0)
+ return SWIZZLE_XYZW;
+
+ const char *isw = sw;
+ for (int i = 0; i < 4; ++i) {
+ switch (*isw) {
+ case 'x': break; /* is zero */
+ case 'y': swizzle |= SWIZZLE_Y << 3 * i; break;
+ case 'z': swizzle |= SWIZZLE_Z << 3 * i; break;
+ case 'w': swizzle |= SWIZZLE_W << 3 * i; break;
+ default:
+ assert(!"This test uses an unknown swizzle character");
+ }
+ if (isw[1] != 0)
+ ++isw;
+ }
+ return swizzle;
+}
+
+st_src_reg FakeCodeline::create_src_register(int src_idx, const char *sw)
+{
+ st_src_reg result = create_src_register(src_idx);
+ result.swizzle = swizzle_from_char(sw);
+ return result;
+}
+
+st_src_reg FakeCodeline::create_src_register(int src_idx, gl_register_file file)
+{
+ st_src_reg retval;
+ retval.file = file;
+ retval.index = src_idx >= 0 ? src_idx : 1 - src_idx;
+
+ if (file == PROGRAM_TEMPORARY) {
+ if (max_temp_id < src_idx)
+ max_temp_id = src_idx;
+ } else if (file == PROGRAM_ARRAY) {
+ retval.array_id = 1;
+ }
+ retval.swizzle = SWIZZLE_XYZW;
+ retval.type = GLSL_TYPE_INT;
+
+ return retval;
+}
+
+st_dst_reg FakeCodeline::create_dst_register(int dst_idx)
+{
+ return create_dst_register(dst_idx, dst_idx < 0 ?
+ PROGRAM_OUTPUT : PROGRAM_TEMPORARY);
+}
+
+st_dst_reg FakeCodeline::create_dst_register(int dst_idx,int writemask)
+{
+ gl_register_file file;
+ int idx = 0;
+ if (dst_idx >= 0) {
+ file = PROGRAM_TEMPORARY;
+ idx = dst_idx;
+ if (max_temp_id < idx)
+ max_temp_id = idx;
+ } else {
+ file = PROGRAM_OUTPUT;
+ idx = 1 - dst_idx;
+ }
+ return st_dst_reg(file, writemask, GLSL_TYPE_INT, idx);
+}
+
+st_dst_reg FakeCodeline::create_dst_register(int dst_idx, gl_register_file file)
+{
+ st_dst_reg retval;
+ retval.file = file;
+ retval.index = dst_idx >= 0 ? dst_idx : 1 - dst_idx;
+
+ if (file == PROGRAM_TEMPORARY) {
+ if (max_temp_id < dst_idx)
+ max_temp_id = dst_idx;
+ } else if (file == PROGRAM_ARRAY) {
+ retval.array_id = 1;
+ }
+ retval.writemask = 0xF;
+ retval.type = GLSL_TYPE_INT;
+
+ return retval;
+}
+
+glsl_to_tgsi_instruction *FakeCodeline::get_codeline() const
+{
+ glsl_to_tgsi_instruction *next_instr = new(mem_ctx) glsl_to_tgsi_instruction();
+ next_instr->op = op;
+ next_instr->info = tgsi_get_opcode_info(op);
+
+ assert(src.size() == num_inst_src_regs(next_instr));
+ assert(dst.size() == num_inst_dst_regs(next_instr));
+ assert(tex_offsets.size() < 3);
+
+ copy(src.begin(), src.end(), next_instr->src);
+ copy(dst.begin(), dst.end(), next_instr->dst);
+
+ next_instr->tex_offset_num_offset = tex_offsets.size();
+
+ if (next_instr->tex_offset_num_offset > 0) {
+ next_instr->tex_offsets = ralloc_array(mem_ctx, st_src_reg, tex_offsets.size());
+ copy(tex_offsets.begin(), tex_offsets.end(), next_instr->tex_offsets);
+ } else {
+ next_instr->tex_offsets = nullptr;
+ }
+ return next_instr;
+}
+
+void FakeCodeline::set_mem_ctx(void *ctx)
+{
+ mem_ctx = ctx;
+}
+
+FakeShader::FakeShader(const vector<FakeCodeline>& source):
+ program(source),
+ num_temps(0)
+{
+ for (const FakeCodeline& i: source) {
+ int t = i.get_max_reg_id();
+ if (t > num_temps)
+ num_temps = t;
+ }
+ ++num_temps;
+}
+
+FakeShader::FakeShader(exec_list *tgsi_prog):
+ num_temps(0)
+{
+ FakeCodeline nop(TGSI_OPCODE_NOP);
+ FakeCodeline& last = nop;
+
+ foreach_in_list(glsl_to_tgsi_instruction, inst, tgsi_prog) {
+ program.push_back(last = FakeCodeline(*inst));
+ if (num_temps < last.get_max_reg_id())
+ num_temps = last.get_max_reg_id();
+ }
+ ++num_temps;
+}
+
+int FakeShader::get_num_temps() const
+{
+ return num_temps;
+}
+
+exec_list* FakeShader::get_program(void *ctx) const
+{
+ exec_list *prog = new(ctx) exec_list();
+
+ for (const FakeCodeline& i: program) {
+ prog->push_tail(i.get_codeline());
+ }
+
+ return prog;
+}
+
+void MesaTestWithMemCtx::SetUp()
+{
+ mem_ctx = ralloc_context(nullptr);
+ FakeCodeline::set_mem_ctx(mem_ctx);
+}
+
+void MesaTestWithMemCtx::TearDown()
+{
+ ralloc_free(mem_ctx);
+ FakeCodeline::set_mem_ctx(nullptr);
+ mem_ctx = nullptr;
+}
+
+
+LifetimeEvaluatorTest::lifetime_result
+LifetimeEvaluatorTest::run(const vector<FakeCodeline>& code, bool& success)
+{
+ FakeShader shader(code);
+ lifetime_result result(shader.get_num_temps());
+
+ success =
+ get_temp_registers_required_lifetimes(mem_ctx, shader.get_program(mem_ctx),
+ shader.get_num_temps(),
+ &result[0]);
+
+ return result;
+}
+
+void LifetimeEvaluatorTest::run(const vector<FakeCodeline>& code, const temp_lt_expect& e)
+{
+ FakeShader shader(code);
+ lifetime_result result(shader.get_num_temps());
+ bool success =
+ get_temp_registers_required_lifetimes(mem_ctx, shader.get_program(mem_ctx),
+ shader.get_num_temps(),
+ &result[0]);
+ ASSERT_TRUE(success);
+ ASSERT_EQ(result.size(), e.size());
+ check(result, e);
+}
+
+void LifetimeEvaluatorExactTest::check( const vector<lifetime>& lifetimes,
+ const temp_lt_expect& e)
+{
+ for (unsigned i = 1; i < lifetimes.size(); ++i) {
+ EXPECT_EQ(lifetimes[i].begin, e[i][0]);
+ EXPECT_EQ(lifetimes[i].end, e[i][1]);
+ }
+}
+
+void LifetimeEvaluatorAtLeastTest::check( const vector<lifetime>& lifetimes,
+ const temp_lt_expect& e)
+{
+ for (unsigned i = 1; i < lifetimes.size(); ++i) {
+ EXPECT_LE(lifetimes[i].begin, e[i][0]);
+ EXPECT_GE(lifetimes[i].end, e[i][1]);
+ }
+}
+
+void RegisterRemappingTest::run(const vector<lifetime>& lt,
+ const vector<int>& expect)
+{
+ rename_reg_pair proto{false,0};
+ vector<rename_reg_pair> result(lt.size(), proto);
+
+ get_temp_registers_remapping(mem_ctx, lt.size(), &lt[0], &result[0]);
+
+ vector<int> remap(lt.size());
+ for (unsigned i = 0; i < lt.size(); ++i) {
+ remap[i] = result[i].valid ? result[i].new_reg : i;
+ }
+
+ std::transform(remap.begin(), remap.end(), result.begin(), remap.begin(),
+ [](int x, const rename_reg_pair& rn) {
+ return rn.valid ? rn.new_reg : x;
+ });
+
+ for(unsigned i = 1; i < remap.size(); ++i) {
+ EXPECT_EQ(remap[i], expect[i]);
+ }
+}
+
+void RegisterLifetimeAndRemappingTest::run(const vector<FakeCodeline>& code,
+ const vector<int>& expect)
+{
+ FakeShader shader(code);
+ std::vector<lifetime> lt(shader.get_num_temps());
+ get_temp_registers_required_lifetimes(mem_ctx, shader.get_program(mem_ctx),
+ shader.get_num_temps(), &lt[0]);
+ this->run(lt, expect);
+}
diff --git a/src/mesa/state_tracker/tests/st_tests_common.h b/src/mesa/state_tracker/tests/st_tests_common.h
new file mode 100644
index 00000000000..cea8a5ce08e
--- /dev/null
+++ b/src/mesa/state_tracker/tests/st_tests_common.h
@@ -0,0 +1,163 @@
+/*
+ * Copyright © 2017 Gert Wollny
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef mesa_st_tests_h
+#define mesa_st_tests_h
+
+#include <state_tracker/st_glsl_to_tgsi_temprename.h>
+#include <gtest/gtest.h>
+#include <utility>
+
+#define MP(X, W) std::make_pair(X, W)
+#define MT(X,Y,Z) std::make_tuple(X,Y,Z)
+
+
+/* Use this to make the compiler pick the swizzle constructor below */
+struct SWZ {};
+
+/* A line to describe a TGSI instruction for building mock shaders. */
+struct FakeCodeline {
+ FakeCodeline(unsigned _op): op(_op), max_temp_id(0){}
+ FakeCodeline(unsigned _op, const std::vector<int>& _dst, const std::vector<int>& _src,
+ const std::vector<int>&_to);
+
+ FakeCodeline(unsigned _op, const std::vector<std::pair<int,int>>& _dst,
+ const std::vector<std::pair<int, const char *>>& _src,
+ const std::vector<std::pair<int, const char *>>&_to, SWZ with_swizzle);
+
+ FakeCodeline(const glsl_to_tgsi_instruction& inst);
+
+ int get_max_reg_id() const { return max_temp_id;}
+
+ glsl_to_tgsi_instruction *get_codeline() const;
+
+ static void set_mem_ctx(void *ctx);
+
+ friend bool operator == (const FakeCodeline& lsh, const FakeCodeline& rhs);
+
+ void print(std::ostream& os) const;
+private:
+ st_src_reg create_src_register(int src_idx);
+ st_src_reg create_src_register(int src_idx, const char *swizzle);
+ st_src_reg create_src_register(int src_idx, gl_register_file file);
+
+ st_dst_reg create_dst_register(int dst_idx);
+ st_dst_reg create_dst_register(int dst_idx, int writemask);
+ st_dst_reg create_dst_register(int dst_idx, gl_register_file file);
+
+ template <typename st_reg>
+ void read_reg(const st_reg& s);
+
+ unsigned op;
+ std::vector<st_dst_reg> dst;
+ std::vector<st_src_reg> src;
+ std::vector<st_src_reg> tex_offsets;
+
+ int max_temp_id;
+ static void *mem_ctx;
+};
+
+inline std::ostream& operator << (std::ostream& os, const FakeCodeline& line)
+{
+ line.print(os);
+ return os;
+}
+
+/* A few constants that will not be tracked as temporary registers
+ by the fake shader.
+ */
+const int in0 = -1;
+const int in1 = -2;
+const int in2 = -3;
+
+const int out0 = -1;
+const int out1 = -2;
+const int out2 = -3;
+
+class FakeShader {
+public:
+ FakeShader(const std::vector<FakeCodeline>& source);
+ FakeShader(exec_list *tgsi_prog);
+
+ exec_list* get_program(void *ctx) const;
+ int get_num_temps() const;
+
+private:
+
+ std::vector<FakeCodeline> program;
+ int num_temps;
+};
+
+using temp_lt_expect = std::vector<std::vector<int>>;
+
+class MesaTestWithMemCtx : public testing::Test {
+ void SetUp();
+ void TearDown();
+protected:
+ void *mem_ctx;
+};
+
+class LifetimeEvaluatorTest : public MesaTestWithMemCtx {
+protected:
+ void run(const std::vector<FakeCodeline>& code, const temp_lt_expect& e);
+private:
+ using lifetime_result=std::vector<lifetime>;
+ lifetime_result run(const std::vector<FakeCodeline>& code, bool& success);
+
+ virtual void check(const std::vector<lifetime>& result, const temp_lt_expect& e) = 0;
+};
+
+/* This is a test class to check the exact life times of
+ * registers. */
+class LifetimeEvaluatorExactTest : public LifetimeEvaluatorTest {
+protected:
+ void check(const std::vector<lifetime>& result, const temp_lt_expect& e);
+
+};
+
+/* This test class checks that the life time covers at least
+ * in the expected range. It is used for cases where we know that
+ * a the implementation could be improved on estimating the minimal
+ * life time.
+ */
+class LifetimeEvaluatorAtLeastTest : public LifetimeEvaluatorTest {
+protected:
+ void check(const std::vector<lifetime>& result, const temp_lt_expect& e);
+};
+
+/* With this test class the renaming mapping estimation is tested */
+class RegisterRemappingTest : public MesaTestWithMemCtx {
+protected:
+ void run(const std::vector<lifetime>& lt, const std::vector<int> &expect);
+};
+
+/* With this test class the combined lifetime estimation and renaming
+ * mepping estimation is tested
+ */
+class RegisterLifetimeAndRemappingTest : public RegisterRemappingTest {
+protected:
+ using RegisterRemappingTest::run;
+ void run(const std::vector<FakeCodeline>& code, const std::vector<int> &expect);
+};
+
+#endif
diff --git a/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp b/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp
index 1c8b9acfa4f..4f226429aff 100644
--- a/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp
+++ b/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp
@@ -21,155 +21,43 @@
* DEALINGS IN THE SOFTWARE.
*/
-#include <state_tracker/st_glsl_to_tgsi_temprename.h>
#include <tgsi/tgsi_ureg.h>
#include <tgsi/tgsi_info.h>
-#include <compiler/glsl/list.h>
#include <mesa/program/prog_instruction.h>
-#include <utility>
#include <gtest/gtest.h>
+#include <utility>
+#include <algorithm>
+#include <iostream>
+
+#include "st_tests_common.h"
using std::vector;
using std::pair;
using std::make_pair;
+using std::transform;
+using std::copy;
-/* A line to describe a TGSI instruction for building mock shaders. */
-struct MockCodeline {
- MockCodeline(unsigned _op): op(_op) {}
- MockCodeline(unsigned _op, const vector<int>& _dst, const vector<int>& _src, const vector<int>&_to):
- op(_op), dst(_dst), src(_src), tex_offsets(_to){}
- unsigned op;
- vector<int> dst;
- vector<int> src;
- vector<int> tex_offsets;
-};
-
-/* A line to describe a TGSI instruction with swizzeling and write makss
- * for building mock shaders.
- */
-struct MockCodelineWithSwizzle {
- MockCodelineWithSwizzle(unsigned _op): op(_op) {}
- MockCodelineWithSwizzle(unsigned _op, const vector<pair<int,int>>& _dst,
- const vector<pair<int, const char *>>& _src,
- const vector<pair<int, const char *>>&_to):
- op(_op), dst(_dst), src(_src), tex_offsets(_to){}
- unsigned op;
- vector<pair<int,int>> dst;
- vector<pair<int, const char *>> src;
- vector<pair<int, const char *>> tex_offsets;
-};
-
-/* A few constants that will notbe tracked as temporary registers by the
- * mock shader.
- */
-const int in0 = -1;
-const int in1 = -2;
-const int in2 = -3;
-
-const int out0 = -1;
-const int out1 = -2;
-
-class MockShader {
-public:
- MockShader(const vector<MockCodeline>& source);
- MockShader(const vector<MockCodelineWithSwizzle>& source);
- ~MockShader();
-
- void free();
-
- exec_list* get_program() const;
- int get_num_temps() const;
-private:
- st_src_reg create_src_register(int src_idx);
- st_dst_reg create_dst_register(int dst_idx);
- st_src_reg create_src_register(int src_idx, const char *swizzle);
- st_dst_reg create_dst_register(int dst_idx,int writemask);
- exec_list* program;
- int num_temps;
- void *mem_ctx;
-};
-
-using expectation = vector<vector<int>>;
-
-class MesaTestWithMemCtx : public testing::Test {
- void SetUp();
- void TearDown();
-protected:
- void *mem_ctx;
-};
-
-class LifetimeEvaluatorTest : public MesaTestWithMemCtx {
-protected:
- void run(const vector<MockCodeline>& code, const expectation& e);
- void run(const vector<MockCodelineWithSwizzle>& code, const expectation& e);
-private:
- virtual void check(const vector<lifetime>& result, const expectation& e) = 0;
-};
-
-/* This is a test class to check the exact life times of
- * registers. */
-class LifetimeEvaluatorExactTest : public LifetimeEvaluatorTest {
-protected:
- void check(const vector<lifetime>& result, const expectation& e);
-};
-
-/* This test class checks that the life time covers at least
- * in the expected range. It is used for cases where we know that
- * a the implementation could be improved on estimating the minimal
- * life time.
- */
-class LifetimeEvaluatorAtLeastTest : public LifetimeEvaluatorTest {
-protected:
- void check(const vector<lifetime>& result, const expectation& e);
-};
-
-/* With this test class the renaming mapping estimation is tested */
-class RegisterRemappingTest : public MesaTestWithMemCtx {
-protected:
- void run(const vector<lifetime>& lt, const vector<int>& expect);
-};
-
-/* With this test class the combined lifetime estimation and renaming
- * mepping estimation is tested
- */
-class RegisterLifetimeAndRemappingTest : public RegisterRemappingTest {
-protected:
- using RegisterRemappingTest::run;
- template <typename CodeLine>
- void run(const vector<CodeLine>& code, const vector<int>& expect);
-};
-
-template <typename CodeLine>
-void RegisterLifetimeAndRemappingTest::run(const vector<CodeLine>& code,
- const vector<int>& expect)
-{
- MockShader shader(code);
- std::vector<lifetime> lt(shader.get_num_temps());
- get_temp_registers_required_lifetimes(mem_ctx, shader.get_program(),
- shader.get_num_temps(), &lt[0]);
- this->run(lt, expect);
-}
TEST_F(LifetimeEvaluatorExactTest, SimpleMoveAdd)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_UADD, {out0}, {1,in0}, {}},
{ TGSI_OPCODE_END}
};
- run(code, expectation({{-1,-1}, {0,1}}));
+ run(code, temp_lt_expect({{-1,-1}, {0,1}}));
}
TEST_F(LifetimeEvaluatorExactTest, SimpleMoveAddMove)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_UADD, {2}, {1,in0}, {}},
{ TGSI_OPCODE_MOV, {out0}, {2}, {}},
{ TGSI_OPCODE_END}
};
- run(code, expectation({{-1, -1}, {0,1}, {1,2}}));
+ run(code, temp_lt_expect({{-1, -1}, {0,1}, {1,2}}));
}
/* Test whether the texoffst are actually visited by the
@@ -180,13 +68,13 @@ TEST_F(LifetimeEvaluatorExactTest, SimpleMoveAddMove)
*/
TEST_F(LifetimeEvaluatorExactTest, SimpleOpWithTexoffset)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_MOV, {2}, {in1}, {}},
{ TGSI_OPCODE_TEX, {out0}, {in0}, {1,2}},
{ TGSI_OPCODE_END}
};
- run(code, expectation({{-1, -1}, {0,2}, {1,2}}));
+ run(code, temp_lt_expect({{-1, -1}, {0,2}, {1,2}}));
}
/* Simple register access involving a loop
@@ -196,7 +84,7 @@ TEST_F(LifetimeEvaluatorExactTest, SimpleOpWithTexoffset)
*/
TEST_F(LifetimeEvaluatorExactTest, SimpleMoveInLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_UADD, {2}, {1,in0}, {}},
@@ -206,7 +94,7 @@ TEST_F(LifetimeEvaluatorExactTest, SimpleMoveInLoop)
{ TGSI_OPCODE_MOV, {out0}, {3}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,5}, {2,3}, {3,6}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,5}, {2,3}, {3,6}}));
}
/* In loop if/else value written only in one path, and read later
@@ -214,7 +102,7 @@ TEST_F(LifetimeEvaluatorExactTest, SimpleMoveInLoop)
*/
TEST_F(LifetimeEvaluatorExactTest, MoveInIfInLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in1}, {}},
@@ -226,7 +114,7 @@ TEST_F(LifetimeEvaluatorExactTest, MoveInIfInLoop)
{ TGSI_OPCODE_MOV, {out0}, {3}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,7}, {1,7}, {5,8}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,7}, {1,7}, {5,8}}));
}
/* A non-dominant write within an IF can be ignored (if it is read
@@ -234,7 +122,7 @@ TEST_F(LifetimeEvaluatorExactTest, MoveInIfInLoop)
*/
TEST_F(LifetimeEvaluatorExactTest, NonDominantWriteinIfInLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_IF, {}, {in1}, {}},
@@ -248,7 +136,7 @@ TEST_F(LifetimeEvaluatorExactTest, NonDominantWriteinIfInLoop)
{ TGSI_OPCODE_MOV, {out0}, {2}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {1,5}, {5,10}}));
+ run (code, temp_lt_expect({{-1,-1}, {1,5}, {5,10}}));
}
/* In Nested loop if/else value written only in one path, and read later
@@ -256,7 +144,7 @@ TEST_F(LifetimeEvaluatorExactTest, NonDominantWriteinIfInLoop)
*/
TEST_F(LifetimeEvaluatorExactTest, MoveInIfInNestedLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_BGNLOOP },
@@ -269,7 +157,7 @@ TEST_F(LifetimeEvaluatorExactTest, MoveInIfInNestedLoop)
{ TGSI_OPCODE_MOV, {out0}, {3}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,8}, {1,8}, {6,9}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,8}, {1,8}, {6,9}}));
}
/* In loop if/else value written in both path, and read later
@@ -278,7 +166,7 @@ TEST_F(LifetimeEvaluatorExactTest, MoveInIfInNestedLoop)
*/
TEST_F(LifetimeEvaluatorAtLeastTest, WriteInIfAndElseInLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {1}, {}},
@@ -292,7 +180,7 @@ TEST_F(LifetimeEvaluatorAtLeastTest, WriteInIfAndElseInLoop)
{ TGSI_OPCODE_MOV, {out0}, {3}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,9}, {3,7}, {7,10}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,9}, {3,7}, {7,10}}));
}
/* In loop if/else value written in both path, read in else path
@@ -301,7 +189,7 @@ TEST_F(LifetimeEvaluatorAtLeastTest, WriteInIfAndElseInLoop)
*/
TEST_F(LifetimeEvaluatorExactTest, WriteInIfAndElseReadInElseInLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {1}, {}},
@@ -315,7 +203,7 @@ TEST_F(LifetimeEvaluatorExactTest, WriteInIfAndElseReadInElseInLoop)
{ TGSI_OPCODE_MOV, {out0}, {3}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,9}, {1,9}, {7,10}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,9}, {1,9}, {7,10}}));
}
/* In loop if/else read in one path before written in the same loop
@@ -323,7 +211,7 @@ TEST_F(LifetimeEvaluatorExactTest, WriteInIfAndElseReadInElseInLoop)
*/
TEST_F(LifetimeEvaluatorExactTest, ReadInIfInLoopBeforeWrite)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
@@ -335,7 +223,7 @@ TEST_F(LifetimeEvaluatorExactTest, ReadInIfInLoopBeforeWrite)
{ TGSI_OPCODE_MOV, {out0}, {3}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,7}, {1,7}, {1,8}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,7}, {1,7}, {1,8}}));
}
/* In loop if/else read in one path before written in the same loop
@@ -344,7 +232,7 @@ TEST_F(LifetimeEvaluatorExactTest, ReadInIfInLoopBeforeWrite)
*/
TEST_F(LifetimeEvaluatorExactTest, ReadInLoopInIfBeforeWriteAndLifeToTheEnd)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_MUL, {1}, {1,in1}, {}},
@@ -354,7 +242,7 @@ TEST_F(LifetimeEvaluatorExactTest, ReadInLoopInIfBeforeWriteAndLifeToTheEnd)
{ TGSI_OPCODE_MOV, {out0}, {1}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,6}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,6}}));
}
/* In loop if/else read in one path before written in the same loop
@@ -363,7 +251,7 @@ TEST_F(LifetimeEvaluatorExactTest, ReadInLoopInIfBeforeWriteAndLifeToTheEnd)
*/
TEST_F(LifetimeEvaluatorExactTest, ReadInLoopBeforeWriteAndLifeToTheEnd)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_MUL, {1}, {1,in1}, {}},
{ TGSI_OPCODE_UADD, {1}, {1,in1}, {}},
@@ -371,7 +259,7 @@ TEST_F(LifetimeEvaluatorExactTest, ReadInLoopBeforeWriteAndLifeToTheEnd)
{ TGSI_OPCODE_MOV, {out0}, {1}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,4}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,4}}));
}
@@ -381,7 +269,7 @@ TEST_F(LifetimeEvaluatorExactTest, ReadInLoopBeforeWriteAndLifeToTheEnd)
*/
TEST_F(LifetimeEvaluatorAtLeastTest, NestedIfInLoopAlwaysWriteButNotPropagated)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_IF, {}, {in0}, {}},
@@ -400,7 +288,7 @@ TEST_F(LifetimeEvaluatorAtLeastTest, NestedIfInLoopAlwaysWriteButNotPropagated)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {3,14}}));
+ run (code, temp_lt_expect({{-1,-1}, {3,14}}));
}
/* The value is written in a loop and in a nested if, but
@@ -408,7 +296,7 @@ TEST_F(LifetimeEvaluatorAtLeastTest, NestedIfInLoopAlwaysWriteButNotPropagated)
*/
TEST_F(LifetimeEvaluatorExactTest, NestedIfInLoopWriteNotAlways)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_IF, {}, {in0}, {}},
@@ -425,13 +313,13 @@ TEST_F(LifetimeEvaluatorExactTest, NestedIfInLoopWriteNotAlways)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,13}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,13}}));
}
/* A continue in the loop is not relevant */
TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterContinue)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_CONT},
@@ -441,7 +329,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterContinue)
{ TGSI_OPCODE_MOV, {out0}, {1}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {4,6}}));
+ run (code, temp_lt_expect({{-1,-1}, {4,6}}));
}
/* Temporary used to in case must live up to the case
@@ -451,7 +339,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterContinue)
*/
TEST_F(LifetimeEvaluatorExactTest, UseSwitchCase)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_MOV, {2}, {in1}, {}},
{ TGSI_OPCODE_MOV, {3}, {in2}, {}},
@@ -463,7 +351,7 @@ TEST_F(LifetimeEvaluatorExactTest, UseSwitchCase)
{ TGSI_OPCODE_ENDSWITCH},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,5}, {1,4}, {2,3}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,5}, {1,4}, {2,3}}));
}
/* With two destinations, if one result is thrown away, the
@@ -471,14 +359,14 @@ TEST_F(LifetimeEvaluatorExactTest, UseSwitchCase)
*/
TEST_F(LifetimeEvaluatorExactTest, WriteTwoOnlyUseOne)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_DFRACEXP , {1,2}, {in0}, {}},
{ TGSI_OPCODE_ADD , {3}, {2,in0}, {}},
{ TGSI_OPCODE_MOV, {out1}, {3}, {}},
{ TGSI_OPCODE_END},
};
- run (code, expectation({{-1,-1}, {0,1}, {0,1}, {1,2}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,1}, {0,1}, {1,2}}));
}
/* If a break is in the loop, all variables written after the
@@ -487,7 +375,7 @@ TEST_F(LifetimeEvaluatorExactTest, WriteTwoOnlyUseOne)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterBreak)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_BRK},
@@ -497,7 +385,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterBreak)
{ TGSI_OPCODE_MOV, {out0}, {1}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,6}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,6}}));
}
/* If a break is in the loop, all variables written after the
@@ -506,7 +394,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterBreak)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterBreak2Breaks)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_BRK},
@@ -517,7 +405,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterBreak2Breaks)
{ TGSI_OPCODE_MOV, {out0}, {1}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,7}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,7}}));
}
/* Loop with a break at the beginning and read/write in the post
@@ -529,7 +417,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterBreak2Breaks)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAndReadAfterBreak)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_BRK},
@@ -540,7 +428,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAndReadAfterBreak)
{ TGSI_OPCODE_MOV, {out0}, {2}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {4,5}, {0,7}}));
+ run (code, temp_lt_expect({{-1,-1}, {4,5}, {0,7}}));
}
/* Same as above, just make sure that the life time of the local variable
@@ -548,7 +436,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAndReadAfterBreak)
*/
TEST_F(LifetimeEvaluatorExactTest, NestedLoopWithWriteAndReadAfterBreak)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in1}, {}},
{ TGSI_OPCODE_BRK},
@@ -566,7 +454,7 @@ TEST_F(LifetimeEvaluatorExactTest, NestedLoopWithWriteAndReadAfterBreak)
{ TGSI_OPCODE_MOV, {out0}, {4}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {8,9}, {0,13}, {11,12}, {0,14}}));
+ run (code, temp_lt_expect({{-1,-1}, {8,9}, {0,13}, {11,12}, {0,14}}));
}
/* If a break is in the loop inside a switch case, make sure it is
@@ -575,7 +463,7 @@ TEST_F(LifetimeEvaluatorExactTest, NestedLoopWithWriteAndReadAfterBreak)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterBreakInSwitchInLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_SWITCH, {}, {in1}, {}},
{ TGSI_OPCODE_CASE, {}, {in1}, {}},
{ TGSI_OPCODE_BGNLOOP },
@@ -589,7 +477,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterBreakInSwitchInLoop)
{ TGSI_OPCODE_MOV, {out0}, {1}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {2,10}}));
+ run (code, temp_lt_expect({{-1,-1}, {2,10}}));
}
/* Value written conditionally in one loop and read in another loop,
@@ -598,7 +486,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteAfterBreakInSwitchInLoop)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopsWithDifferntScopesConditionalWrite)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
@@ -609,7 +497,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopsWithDifferntScopesConditionalWrite)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,7}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,7}}));
}
/* Value written and read in one loop and last read in another loop,
@@ -617,7 +505,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopsWithDifferntScopesConditionalWrite)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopsWithDifferntScopesFirstReadBeforeWrite)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_MUL, {1}, {1,in0}, {}},
{ TGSI_OPCODE_ENDLOOP },
@@ -626,7 +514,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopsWithDifferntScopesFirstReadBeforeWrite)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,5}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,5}}));
}
@@ -635,7 +523,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopsWithDifferntScopesFirstReadBeforeWrite)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteInSwitch)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_SWITCH, {}, {in0}, {} },
{ TGSI_OPCODE_CASE, {}, {in0}, {} },
@@ -648,7 +536,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteInSwitch)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,9}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,9}}));
}
/* Value written in one case, and read in other,in loop
@@ -656,7 +544,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithWriteInSwitch)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopWithReadWriteInSwitchDifferentCase)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_SWITCH, {}, {in0}, {} },
{ TGSI_OPCODE_CASE, {}, {in0}, {} },
@@ -669,7 +557,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithReadWriteInSwitchDifferentCase)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,9}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,9}}));
}
/* Value written in one case, and read in other,in loop
@@ -677,7 +565,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithReadWriteInSwitchDifferentCase)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopWithReadWriteInSwitchDifferentCaseFallThrough)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_SWITCH, {}, {in0}, {} },
{ TGSI_OPCODE_CASE, {}, {in0}, {} },
@@ -689,7 +577,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithReadWriteInSwitchDifferentCaseFallThr
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,8}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,8}}));
}
@@ -699,7 +587,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithReadWriteInSwitchDifferentCaseFallThr
*/
TEST_F(LifetimeEvaluatorExactTest, WriteSelectFromSelf)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{TGSI_OPCODE_USEQ, {5}, {in0,in1}, {}},
{TGSI_OPCODE_UCMP, {1}, {5,in1,1}, {}},
{TGSI_OPCODE_UCMP, {1}, {5,in1,1}, {}},
@@ -716,7 +604,7 @@ TEST_F(LifetimeEvaluatorExactTest, WriteSelectFromSelf)
{TGSI_OPCODE_MOV, {out1}, {3}, {}},
{TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {1,5}, {5,6}, {7,13}, {9,11}, {0,4}}));
+ run (code, temp_lt_expect({{-1,-1}, {1,5}, {5,6}, {7,13}, {9,11}, {0,4}}));
}
/* This test checks wheter the ENDSWITCH is handled properly if the
@@ -724,7 +612,7 @@ TEST_F(LifetimeEvaluatorExactTest, WriteSelectFromSelf)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopRWInSwitchCaseLastCaseWithoutBreak)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_SWITCH, {}, {in0}, {} },
{ TGSI_OPCODE_CASE, {}, {in0}, {} },
@@ -736,13 +624,13 @@ TEST_F(LifetimeEvaluatorExactTest, LoopRWInSwitchCaseLastCaseWithoutBreak)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,8}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,8}}));
}
/* Value read/write in same case, stays there */
TEST_F(LifetimeEvaluatorExactTest, LoopWithReadWriteInSwitchSameCase)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_SWITCH, {}, {in0}, {} },
{ TGSI_OPCODE_CASE, {}, {in0}, {} },
@@ -755,7 +643,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithReadWriteInSwitchSameCase)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {3,4}}));
+ run (code, temp_lt_expect({{-1,-1}, {3,4}}));
}
/* Value read/write in all cases, should only live from first
@@ -763,7 +651,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithReadWriteInSwitchSameCase)
*/
TEST_F(LifetimeEvaluatorAtLeastTest, LoopWithReadWriteInSwitchSameCase)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_SWITCH, {}, {in0}, {}},
{ TGSI_OPCODE_CASE, {}, {in0}, {} },
@@ -777,13 +665,13 @@ TEST_F(LifetimeEvaluatorAtLeastTest, LoopWithReadWriteInSwitchSameCase)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {3,9}}));
+ run (code, temp_lt_expect({{-1,-1}, {3,9}}));
}
/* First read before first write with nested loops */
TEST_F(LifetimeEvaluatorExactTest, LoopsWithDifferentScopesCondReadBeforeWrite)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
@@ -796,7 +684,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopsWithDifferentScopesCondReadBeforeWrite)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,9}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,9}}));
}
/* First read before first write wiredness with nested loops.
@@ -805,7 +693,7 @@ TEST_F(LifetimeEvaluatorExactTest, LoopsWithDifferentScopesCondReadBeforeWrite)
*/
TEST_F(LifetimeEvaluatorExactTest, FirstWriteAtferReadInNestedLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_BGNLOOP },
@@ -817,7 +705,7 @@ TEST_F(LifetimeEvaluatorExactTest, FirstWriteAtferReadInNestedLoop)
{ TGSI_OPCODE_MOV, {out0}, {3}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,7}, {1,7}, {4,8}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,7}, {1,7}, {4,8}}));
}
@@ -831,82 +719,83 @@ TEST_F(LifetimeEvaluatorExactTest, FirstWriteAtferReadInNestedLoop)
*/
TEST_F(LifetimeEvaluatorExactTest, LoopWithConditionalComponentWrite_X)
{
- const vector<MockCodelineWithSwizzle> code = {
- MockCodelineWithSwizzle(TGSI_OPCODE_BGNLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_Y), SRC(in1, "x"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "y"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDIF),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(2, WRITEMASK_XY), SRC(1, "xy"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(out0, WRITEMASK_XYZW), SRC(2, "xyxy"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_END)
+ const vector<FakeCodeline> code = {
+ { TGSI_OPCODE_BGNLOOP},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_Y), SRC(in1, "x"), {}, SWZ()},
+ { TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}, SWZ()},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "y"), {}, SWZ()},
+ { TGSI_OPCODE_ENDIF},
+ { TGSI_OPCODE_MOV, DST(2, WRITEMASK_XY), SRC(1, "xy"), {}, SWZ()},
+ { TGSI_OPCODE_ENDLOOP},
+ { TGSI_OPCODE_MOV, DST(out0, WRITEMASK_XYZW), SRC(2, "xyxy"), {}, SWZ()},
+ { TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,6}, {5,7}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,6}, {5,7}}));
}
TEST_F(LifetimeEvaluatorExactTest, LoopWithConditionalComponentWrite_Y)
{
- const vector<MockCodelineWithSwizzle> code = {
- MockCodelineWithSwizzle(TGSI_OPCODE_BGNLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "x"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_Y), SRC(in1, "y"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDIF),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(2, WRITEMASK_XY), SRC(1, "xy"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(out0, WRITEMASK_XYZW), SRC(2, "xyxy"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_END)
+ const vector<FakeCodeline> code = {
+ { TGSI_OPCODE_BGNLOOP},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "x"), {}, SWZ()},
+ { TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}, SWZ()},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_Y), SRC(in1, "y"), {}, SWZ()},
+ { TGSI_OPCODE_ENDIF},
+ { TGSI_OPCODE_MOV, DST(2, WRITEMASK_XY), SRC(1, "xy"), {}, SWZ()},
+ { TGSI_OPCODE_ENDLOOP},
+ { TGSI_OPCODE_MOV, DST(out0, WRITEMASK_XYZW), SRC(2, "xyxy"), {}, SWZ()},
+ { TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,6}, {5,7}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,6}, {5,7}}));
}
TEST_F(LifetimeEvaluatorExactTest, LoopWithConditionalComponentWrite_Z)
{
- const vector<MockCodelineWithSwizzle> code = {
- MockCodelineWithSwizzle(TGSI_OPCODE_BGNLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "x"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_Z), SRC(in1, "y"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDIF),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(2, WRITEMASK_XY), SRC(1, "xz"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(out0, WRITEMASK_XYZW), SRC(2, "xyxy"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_END)
+ const vector<FakeCodeline> code = {
+ { TGSI_OPCODE_BGNLOOP},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "x"), {}, SWZ()},
+ { TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}, SWZ()},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_Z), SRC(in1, "y"), {}, SWZ()},
+ { TGSI_OPCODE_ENDIF},
+ { TGSI_OPCODE_MOV, DST(2, WRITEMASK_XY), SRC(1, "xz"), {}, SWZ()},
+ { TGSI_OPCODE_ENDLOOP},
+ { TGSI_OPCODE_MOV, DST(out0, WRITEMASK_XYZW), SRC(2, "xyxy"), {}, SWZ()},
+ { TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,6}, {5,7}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,6}, {5,7}}));
}
TEST_F(LifetimeEvaluatorExactTest, LoopWithConditionalComponentWrite_W)
{
- const vector<MockCodelineWithSwizzle> code = {
- MockCodelineWithSwizzle(TGSI_OPCODE_BGNLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "x"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_W), SRC(in1, "y"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDIF),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(2, WRITEMASK_XY), SRC(1, "xw"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(out0, WRITEMASK_XYZW), SRC(2, "xyxy"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_END)
+ const vector<FakeCodeline> code = {
+ { TGSI_OPCODE_BGNLOOP},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "x"), {}, SWZ()},
+ { TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}, SWZ()},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_W), SRC(in1, "y"), {}, SWZ()},
+ { TGSI_OPCODE_ENDIF},
+ { TGSI_OPCODE_MOV, DST(2, WRITEMASK_XY), SRC(1, "xw"), {}, SWZ()},
+ { TGSI_OPCODE_ENDLOOP},
+ { TGSI_OPCODE_MOV, DST(out0, WRITEMASK_XYZW), SRC(2, "xyxy"), {}, SWZ()},
+ { TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,6}, {5,7}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,6}, {5,7}}));
}
TEST_F(LifetimeEvaluatorExactTest, LoopWithConditionalComponentWrite_X_Read_Y_Before)
{
- const vector<MockCodelineWithSwizzle> code = {
- MockCodelineWithSwizzle(TGSI_OPCODE_BGNLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "x"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(2, WRITEMASK_XYZW), SRC(1, "yyyy"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDIF),
- MockCodelineWithSwizzle(TGSI_OPCODE_MOV, DST(1, WRITEMASK_YZW), SRC(2, "yyzw"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_ENDLOOP),
- MockCodelineWithSwizzle(TGSI_OPCODE_ADD, DST(out0, WRITEMASK_XYZW), SRC2(2, "yyzw", 1, "xyxy"), {}),
- MockCodelineWithSwizzle(TGSI_OPCODE_END)
+ const vector<FakeCodeline> code = {
+ { TGSI_OPCODE_BGNLOOP},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_X), SRC(in1, "x"), {}, SWZ()},
+ { TGSI_OPCODE_IF, {}, SRC(in0, "xxxx"), {}, SWZ()},
+ { TGSI_OPCODE_MOV, DST(2, WRITEMASK_XYZW), SRC(1, "yyyy"), {}, SWZ()},
+ { TGSI_OPCODE_ENDIF},
+ { TGSI_OPCODE_MOV, DST(1, WRITEMASK_YZW), SRC(2, "yyzw"), {}, SWZ()},
+ { TGSI_OPCODE_ENDLOOP},
+ { TGSI_OPCODE_ADD, DST(out0, WRITEMASK_XYZW),
+ SRC2(2, "yyzw", 1, "xyxy"), {}, SWZ()},
+ { TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,7}, {0,7}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,7}, {0,7}}));
}
/* The variable is conditionally read before first written, so
@@ -914,10 +803,10 @@ TEST_F(LifetimeEvaluatorExactTest, LoopWithConditionalComponentWrite_X_Read_Y_Be
*/
TEST_F(LifetimeEvaluatorExactTest, FRaWSameInstructionInLoopAndCondition)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_BGNLOOP },
- { TGSI_OPCODE_IF, {0}, {in0}, {} },
+ { TGSI_OPCODE_IF, {}, {in0}, {} },
{ TGSI_OPCODE_ADD, {1}, {1,in0}, {}},
{ TGSI_OPCODE_ENDIF},
{ TGSI_OPCODE_MOV, {1}, {in1}, {}},
@@ -926,7 +815,7 @@ TEST_F(LifetimeEvaluatorExactTest, FRaWSameInstructionInLoopAndCondition)
{ TGSI_OPCODE_END},
};
- run (code, expectation({{-1,-1}, {0,7}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,7}}));
}
/* If unconditionally first written and read in the same
@@ -935,12 +824,12 @@ TEST_F(LifetimeEvaluatorExactTest, FRaWSameInstructionInLoopAndCondition)
*/
TEST_F(LifetimeEvaluatorExactTest, FRaWSameInstruction)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_ADD, {1}, {1,in0}, {}},
{ TGSI_OPCODE_END},
};
- run (code, expectation({{-1,-1}, {0,1}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,1}}));
}
/* If unconditionally written and read in the same
@@ -949,14 +838,14 @@ TEST_F(LifetimeEvaluatorExactTest, FRaWSameInstruction)
*/
TEST_F(LifetimeEvaluatorExactTest, FRaWSameInstructionMoreThenOnce)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_ADD, {1}, {1,in0}, {}},
{ TGSI_OPCODE_ADD, {1}, {1,in0}, {}},
{ TGSI_OPCODE_MOV, {out0}, {in0}, {}},
{ TGSI_OPCODE_END},
};
- run (code, expectation({{-1,-1}, {0,2}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,2}}));
}
/* Register is only written. This should not happen,
@@ -965,52 +854,51 @@ TEST_F(LifetimeEvaluatorExactTest, FRaWSameInstructionMoreThenOnce)
*/
TEST_F(LifetimeEvaluatorExactTest, WriteOnly)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,1}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,1}}));
}
/* Register is read in IF.
*/
TEST_F(LifetimeEvaluatorExactTest, SimpleReadForIf)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_ADD, {out0}, {in0,in1}, {}},
{ TGSI_OPCODE_IF, {}, {1}, {}},
{ TGSI_OPCODE_ENDIF}
};
- run (code, expectation({{-1,-1}, {0,2}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,2}}));
}
TEST_F(LifetimeEvaluatorExactTest, WriteTwoReadOne)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_DFRACEXP , {1,2}, {in0}, {}},
{ TGSI_OPCODE_ADD , {3}, {2,in0}, {}},
{ TGSI_OPCODE_MOV, {out1}, {3}, {}},
{ TGSI_OPCODE_END},
};
- run (code, expectation({{-1,-1}, {0,1}, {0,1}, {1,2}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,1}, {0,1}, {1,2}}));
}
TEST_F(LifetimeEvaluatorExactTest, ReadOnly)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {out0}, {1}, {}},
{ TGSI_OPCODE_END},
};
- run (code, expectation({{-1,-1}, {-1,-1}}));
+ run (code, temp_lt_expect({{-1,-1}, {-1,-1}}));
}
-
/* Test handling of missing END marker
*/
TEST_F(LifetimeEvaluatorExactTest, SomeScopesAndNoEndProgramId)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_IF, {}, {1}, {}},
{ TGSI_OPCODE_MOV, {2}, {1}, {}},
@@ -1019,30 +907,30 @@ TEST_F(LifetimeEvaluatorExactTest, SomeScopesAndNoEndProgramId)
{ TGSI_OPCODE_MOV, {out0}, {2}, {}},
{ TGSI_OPCODE_ENDIF},
};
- run (code, expectation({{-1,-1}, {0,4}, {2,5}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,4}, {2,5}}));
}
TEST_F(LifetimeEvaluatorExactTest, SerialReadWrite)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_MOV, {2}, {1}, {}},
{ TGSI_OPCODE_MOV, {3}, {2}, {}},
{ TGSI_OPCODE_MOV, {out0}, {3}, {}},
{ TGSI_OPCODE_END},
};
- run (code, expectation({{-1,-1}, {0,1}, {1,2}, {2,3}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,1}, {1,2}, {2,3}}));
}
/* Check that two destination registers are used */
TEST_F(LifetimeEvaluatorExactTest, TwoDestRegisters)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_DFRACEXP , {1,2}, {in0}, {}},
{ TGSI_OPCODE_ADD, {out0}, {1,2}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,1}, {0,1}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,1}, {0,1}}));
}
/* Check that writing within a loop in a conditional is propagated
@@ -1050,7 +938,7 @@ TEST_F(LifetimeEvaluatorExactTest, TwoDestRegisters)
*/
TEST_F(LifetimeEvaluatorExactTest, WriteInLoopInConditionalReadOutside)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP},
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP},
@@ -1062,7 +950,7 @@ TEST_F(LifetimeEvaluatorExactTest, WriteInLoopInConditionalReadOutside)
{ TGSI_OPCODE_MOV, {out0}, {2}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,7}, {6,8}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,7}, {6,8}}));
}
/* Check that a register written in a loop that is inside a conditional
@@ -1071,7 +959,7 @@ TEST_F(LifetimeEvaluatorExactTest, WriteInLoopInConditionalReadOutside)
*/
TEST_F(LifetimeEvaluatorExactTest, WriteInLoopInCondReadInCondOutsideLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP},
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP},
@@ -1083,7 +971,7 @@ TEST_F(LifetimeEvaluatorExactTest, WriteInLoopInCondReadInCondOutsideLoop)
{ TGSI_OPCODE_MOV, {out0}, {2}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {3,5}, {0,8}}));
+ run (code, temp_lt_expect({{-1,-1}, {3,5}, {0,8}}));
}
/* Check that a register read before written in a loop that is
@@ -1091,7 +979,7 @@ TEST_F(LifetimeEvaluatorExactTest, WriteInLoopInCondReadInCondOutsideLoop)
*/
TEST_F(LifetimeEvaluatorExactTest, ReadWriteInLoopInCondReadInCondOutsideLoop)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP},
{ TGSI_OPCODE_IF, {}, {in0}, {}},
{ TGSI_OPCODE_BGNLOOP},
@@ -1103,7 +991,7 @@ TEST_F(LifetimeEvaluatorExactTest, ReadWriteInLoopInCondReadInCondOutsideLoop)
{ TGSI_OPCODE_MOV, {out0}, {2}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,7}, {0,8}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,7}, {0,8}}));
}
/* With two destinations if one value is thrown away, we must
@@ -1114,7 +1002,7 @@ TEST_F(LifetimeEvaluatorExactTest, ReadWriteInLoopInCondReadInCondOutsideLoop)
*/
TEST_F(LifetimeEvaluatorExactTest, WritePastLastRead2)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_MOV, {2}, {in0}, {}},
{ TGSI_OPCODE_ADD, {3}, {1,2}, {}},
@@ -1122,30 +1010,30 @@ TEST_F(LifetimeEvaluatorExactTest, WritePastLastRead2)
{ TGSI_OPCODE_MOV, {out1}, {4}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,2}, {1,4}, {2,3}, {3,4}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,2}, {1,4}, {2,3}, {3,4}}));
}
/* Check that three source registers are used */
TEST_F(LifetimeEvaluatorExactTest, ThreeSourceRegisters)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_DFRACEXP , {1,2}, {in0}, {}},
{ TGSI_OPCODE_ADD , {3}, {in0,in1}, {}},
{ TGSI_OPCODE_MAD, {out0}, {1,2,3}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,2}, {0,2}, {1,2}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,2}, {0,2}, {1,2}}));
}
/* Check minimal lifetime for registers only written to */
TEST_F(LifetimeEvaluatorExactTest, OverwriteWrittenOnlyTemps)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV , {1}, {in0}, {}},
{ TGSI_OPCODE_MOV , {2}, {in1}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,1}, {1,2}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,1}, {1,2}}));
}
/* Same register is only written twice. This should not happen,
@@ -1154,12 +1042,12 @@ TEST_F(LifetimeEvaluatorExactTest, OverwriteWrittenOnlyTemps)
*/
TEST_F(LifetimeEvaluatorExactTest, WriteOnlyTwiceSame)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,2}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,2}}));
}
/* Dead code elimination should catch and remove the case
@@ -1171,14 +1059,14 @@ TEST_F(LifetimeEvaluatorExactTest, WriteOnlyTwiceSame)
*/
TEST_F(LifetimeEvaluatorExactTest, WritePastLastRead)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_MOV, {1}, {in0}, {}},
{ TGSI_OPCODE_MOV, {2}, {1}, {}},
{ TGSI_OPCODE_MOV, {1}, {2}, {}},
{ TGSI_OPCODE_END},
};
- run (code, expectation({{-1,-1}, {0,3}, {1,2}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,3}, {1,2}}));
}
/* If a break is in the loop, all variables written after the
@@ -1187,7 +1075,7 @@ TEST_F(LifetimeEvaluatorExactTest, WritePastLastRead)
*/
TEST_F(LifetimeEvaluatorExactTest, NestedLoopWithWriteAfterBreak)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_BGNLOOP },
{ TGSI_OPCODE_IF, {}, {in0}, {}},
@@ -1199,7 +1087,7 @@ TEST_F(LifetimeEvaluatorExactTest, NestedLoopWithWriteAfterBreak)
{ TGSI_OPCODE_ENDLOOP },
{ TGSI_OPCODE_END}
};
- run (code, expectation({{-1,-1}, {0,8}}));
+ run (code, temp_lt_expect({{-1,-1}, {0,8}}));
}
/* Test remapping table of registers. The tests don't assume
@@ -1273,7 +1161,7 @@ TEST_F(RegisterRemappingTest, RegisterRemappingMergeZeroLifetimeRegisters)
TEST_F(RegisterLifetimeAndRemappingTest, LifetimeAndRemapping)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{TGSI_OPCODE_USEQ, {5}, {in0,in1}, {}},
{TGSI_OPCODE_UCMP, {1}, {5,in1,1}, {}},
{TGSI_OPCODE_UCMP, {1}, {5,in1,1}, {}},
@@ -1295,7 +1183,7 @@ TEST_F(RegisterLifetimeAndRemappingTest, LifetimeAndRemapping)
TEST_F(RegisterLifetimeAndRemappingTest, LifetimeAndRemappingWithUnusedReadOnlyIgnored)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{TGSI_OPCODE_USEQ, {1}, {in0,in1}, {}},
{TGSI_OPCODE_UCMP, {2}, {1,in1,2}, {}},
{TGSI_OPCODE_UCMP, {4}, {2,in1,1}, {}},
@@ -1312,7 +1200,7 @@ TEST_F(RegisterLifetimeAndRemappingTest, LifetimeAndRemappingWithUnusedReadOnlyI
TEST_F(RegisterLifetimeAndRemappingTest, LifetimeAndRemappingWithUnusedReadOnlyRemappedTo)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{TGSI_OPCODE_USEQ, {1}, {in0,in1}, {}},
{TGSI_OPCODE_UIF, {}, {7}, {}},
{ TGSI_OPCODE_UCMP, {2}, {1,in1,2}, {}},
@@ -1329,7 +1217,7 @@ TEST_F(RegisterLifetimeAndRemappingTest, LifetimeAndRemappingWithUnusedReadOnlyR
TEST_F(RegisterLifetimeAndRemappingTest, LifetimeAndRemappingWithUnusedReadOnlyRemapped)
{
- const vector<MockCodeline> code = {
+ const vector<FakeCodeline> code = {
{TGSI_OPCODE_USEQ, {0}, {in0,in1}, {}},
{TGSI_OPCODE_UCMP, {2}, {0,in1,2}, {}},
{TGSI_OPCODE_UCMP, {4}, {2,in1,0}, {}},
@@ -1343,266 +1231,3 @@ TEST_F(RegisterLifetimeAndRemappingTest, LifetimeAndRemappingWithUnusedReadOnlyR
/* lt: 0: 0-2 1: u 2: 1-2 3: u 4: 2-5 5: 4-5 6: u 7:ro 8: 5-7 */
run (code, vector<int>({0,1,2,3,0,2,6,7,0}));
}
-
-/* Implementation of helper and test classes */
-MockShader::~MockShader()
-{
- free();
- ralloc_free(mem_ctx);
-}
-
-MockShader::MockShader(const vector<MockCodelineWithSwizzle>& source):
- num_temps(0)
-{
- mem_ctx = ralloc_context(NULL);
-
- program = new(mem_ctx) exec_list();
-
- for (MockCodelineWithSwizzle i: source) {
- glsl_to_tgsi_instruction *next_instr = new(mem_ctx) glsl_to_tgsi_instruction();
- next_instr->op = i.op;
- next_instr->info = tgsi_get_opcode_info(i.op);
-
- assert(i.src.size() < 4);
- assert(i.dst.size() < 3);
- assert(i.tex_offsets.size() < 3);
-
- for (unsigned k = 0; k < i.src.size(); ++k) {
- next_instr->src[k] = create_src_register(i.src[k].first, i.src[k].second);
- }
- for (unsigned k = 0; k < i.dst.size(); ++k) {
- next_instr->dst[k] = create_dst_register(i.dst[k].first, i.dst[k].second);
- }
- next_instr->tex_offset_num_offset = i.tex_offsets.size();
- if (next_instr->tex_offset_num_offset > 0) {
- next_instr->tex_offsets = new st_src_reg[i.tex_offsets.size()];
- for (unsigned k = 0; k < i.tex_offsets.size(); ++k) {
- next_instr->tex_offsets[k] = create_src_register(i.tex_offsets[k].first,
- i.tex_offsets[k].second);
- }
- } else {
- next_instr->tex_offsets = nullptr;
- }
- program->push_tail(next_instr);
- }
- ++num_temps;
-}
-
-MockShader::MockShader(const vector<MockCodeline>& source):
- num_temps(0)
-{
- mem_ctx = ralloc_context(NULL);
-
- program = new(mem_ctx) exec_list();
-
- for (MockCodeline i: source) {
- glsl_to_tgsi_instruction *next_instr = new(mem_ctx) glsl_to_tgsi_instruction();
- next_instr->op = i.op;
- next_instr->info = tgsi_get_opcode_info(i.op);
-
- assert(i.src.size() < 4);
- assert(i.dst.size() < 3);
- assert(i.tex_offsets.size() < 3);
-
- for (unsigned k = 0; k < i.src.size(); ++k) {
- next_instr->src[k] = create_src_register(i.src[k]);
- }
- for (unsigned k = 0; k < i.dst.size(); ++k) {
- next_instr->dst[k] = create_dst_register(i.dst[k]);
- }
- next_instr->tex_offset_num_offset = i.tex_offsets.size();
- if (next_instr->tex_offset_num_offset > 0) {
- next_instr->tex_offsets = new st_src_reg[i.tex_offsets.size()];
- for (unsigned k = 0; k < i.tex_offsets.size(); ++k) {
- next_instr->tex_offsets[k] = create_src_register(i.tex_offsets[k]);
- }
- } else {
- next_instr->tex_offsets = nullptr;
- }
- program->push_tail(next_instr);
- }
- ++num_temps;
-}
-
-int MockShader::get_num_temps() const
-{
- return num_temps;
-}
-
-
-exec_list* MockShader::get_program() const
-{
- return program;
-}
-
-void MockShader::free()
-{
- /* The list is not fully initialized, so
- * tearing it down also must be done manually. */
- exec_node *p;
- while ((p = program->pop_head())) {
- glsl_to_tgsi_instruction * instr = static_cast<glsl_to_tgsi_instruction *>(p);
- if (instr->tex_offset_num_offset > 0)
- delete[] instr->tex_offsets;
- delete p;
- }
- program = 0;
- num_temps = 0;
-}
-
-st_src_reg MockShader::create_src_register(int src_idx)
-{
- gl_register_file file;
- int idx = 0;
- if (src_idx >= 0) {
- file = PROGRAM_TEMPORARY;
- idx = src_idx;
- if (num_temps < idx)
- num_temps = idx;
- } else {
- file = PROGRAM_INPUT;
- idx = 1 - src_idx;
- }
- return st_src_reg(file, idx, GLSL_TYPE_INT);
-}
-
-st_src_reg MockShader::create_src_register(int src_idx, const char *sw)
-{
- uint16_t swizzle = 0;
- for (int i = 0; i < 4; ++i) {
- switch (sw[i]) {
- case 'x': break; /* is zero */
- case 'y': swizzle |= SWIZZLE_Y << 3 * i; break;
- case 'z': swizzle |= SWIZZLE_Z << 3 * i; break;
- case 'w': swizzle |= SWIZZLE_W << 3 * i; break;
- }
- }
-
- gl_register_file file;
- int idx = 0;
- if (src_idx >= 0) {
- file = PROGRAM_TEMPORARY;
- idx = src_idx;
- if (num_temps < idx)
- num_temps = idx;
- } else {
- file = PROGRAM_INPUT;
- idx = 1 - src_idx;
- }
- st_src_reg result(file, idx, GLSL_TYPE_INT);
- result.swizzle = swizzle;
- return result;
-}
-
-st_dst_reg MockShader::create_dst_register(int dst_idx,int writemask)
-{
- gl_register_file file;
- int idx = 0;
- if (dst_idx >= 0) {
- file = PROGRAM_TEMPORARY;
- idx = dst_idx;
- if (num_temps < idx)
- num_temps = idx;
- } else {
- file = PROGRAM_OUTPUT;
- idx = 1 - dst_idx;
- }
- return st_dst_reg(file, writemask, GLSL_TYPE_INT, idx);
-}
-
-st_dst_reg MockShader::create_dst_register(int dst_idx)
-{
- gl_register_file file;
- int idx = 0;
- if (dst_idx >= 0) {
- file = PROGRAM_TEMPORARY;
- idx = dst_idx;
- if (num_temps < idx)
- num_temps = idx;
- } else {
- file = PROGRAM_OUTPUT;
- idx = 1 - dst_idx;
- }
- return st_dst_reg(file,0xF, GLSL_TYPE_INT, idx);
-}
-
-
-void MesaTestWithMemCtx::SetUp()
-{
- mem_ctx = ralloc_context(nullptr);
-}
-
-void MesaTestWithMemCtx::TearDown()
-{
- ralloc_free(mem_ctx);
- mem_ctx = nullptr;
-}
-
-void LifetimeEvaluatorTest::run(const vector<MockCodeline>& code, const expectation& e)
-{
- MockShader shader(code);
- std::vector<lifetime> result(shader.get_num_temps());
-
- bool success =
- get_temp_registers_required_lifetimes(mem_ctx, shader.get_program(),
- shader.get_num_temps(), &result[0]);
-
- ASSERT_TRUE(success);
- ASSERT_EQ(result.size(), e.size());
- check(result, e);
-}
-
-void LifetimeEvaluatorTest::run(const vector<MockCodelineWithSwizzle>& code,
- const expectation& e)
-{
- MockShader shader(code);
- std::vector<lifetime> result(shader.get_num_temps());
-
- bool success =
- get_temp_registers_required_lifetimes(mem_ctx, shader.get_program(),
- shader.get_num_temps(), &result[0]);
- ASSERT_TRUE(success);
- ASSERT_EQ(result.size(), e.size());
- check(result, e);
-}
-
-void LifetimeEvaluatorExactTest::check( const vector<lifetime>& lifetimes,
- const expectation& e)
-{
- for (unsigned i = 1; i < lifetimes.size(); ++i) {
- EXPECT_EQ(lifetimes[i].begin, e[i][0]);
- EXPECT_EQ(lifetimes[i].end, e[i][1]);
- }
-}
-
-void LifetimeEvaluatorAtLeastTest::check( const vector<lifetime>& lifetimes,
- const expectation& e)
-{
- for (unsigned i = 1; i < lifetimes.size(); ++i) {
- EXPECT_LE(lifetimes[i].begin, e[i][0]);
- EXPECT_GE(lifetimes[i].end, e[i][1]);
- }
-}
-
-void RegisterRemappingTest::run(const vector<lifetime>& lt,
- const vector<int>& expect)
-{
- rename_reg_pair proto{false,0};
- vector<rename_reg_pair> result(lt.size(), proto);
-
- get_temp_registers_remapping(mem_ctx, lt.size(), &lt[0], &result[0]);
-
- vector<int> remap(lt.size());
- for (unsigned i = 0; i < lt.size(); ++i) {
- remap[i] = result[i].valid ? result[i].new_reg : i;
- }
-
- std::transform(remap.begin(), remap.end(), result.begin(), remap.begin(),
- [](int x, const rename_reg_pair& rn) {
- return rn.valid ? rn.new_reg : x;
- });
-
- for(unsigned i = 1; i < remap.size(); ++i) {
- EXPECT_EQ(remap[i], expect[i]);
- }
-}