diff --git a/src/gallium/drivers/r600/sfn/tests/sfn_liverange_test.cpp b/src/gallium/drivers/r600/sfn/tests/sfn_liverange_test.cpp index a52834a10b0..2cbdb89b59d 100644 --- a/src/gallium/drivers/r600/sfn/tests/sfn_liverange_test.cpp +++ b/src/gallium/drivers/r600/sfn/tests/sfn_liverange_test.cpp @@ -171,19 +171,19 @@ TEST_F(LiveRangeTests, SimpleArrayAccess) LiveRangeMap expect = vf.prepare_live_range_map(); - expect.set_life_range(*array->element(0, nullptr, 0), 0, 4); - expect.set_life_range(*array->element(0, nullptr, 1), 0, 4); - expect.set_life_range(*array->element(1, nullptr, 0), 0, 4); + expect.set_life_range(*array->element(0, nullptr, 0), 0, 5); + expect.set_life_range(*array->element(0, nullptr, 1), 0, 5); + expect.set_life_range(*array->element(1, nullptr, 0), 0, 5); - expect.set_life_range(*array->element(1, nullptr, 1), 0, 4); + expect.set_life_range(*array->element(1, nullptr, 1), 0, 5); expect.set_life_range(*s1, 2, 3); - expect.set_life_range(*s2x, 4, 5); - expect.set_life_range(*s2y, 4, 5); + expect.set_life_range(*s2x, 5, 6); + expect.set_life_range(*s2y, 5, 6); - expect.set_life_range(*s3[0], 5, 6); - expect.set_life_range(*s3[1], 5, 6); + expect.set_life_range(*s3[0], 6, 7); + expect.set_life_range(*s3[1], 6, 7); check(shader_with_dest_array2_scheduled, expect); } diff --git a/src/gallium/drivers/r600/sfn/tests/sfn_optimizer_test.cpp b/src/gallium/drivers/r600/sfn/tests/sfn_optimizer_test.cpp index 7b68fdb0ebe..daa5aaec98c 100644 --- a/src/gallium/drivers/r600/sfn/tests/sfn_optimizer_test.cpp +++ b/src/gallium/drivers/r600/sfn/tests/sfn_optimizer_test.cpp @@ -3,6 +3,7 @@ #include "../sfn_ra.h" #include "../sfn_scheduler.h" #include "../sfn_shader.h" +#include "../sfn_split_address_loads.h" #include "sfn_test_shaders.h" using namespace r600; @@ -136,12 +137,14 @@ TEST_F(TestShaderFromNir, OptimizeWithDestArrayValue) TEST_F(TestShaderFromNir, ScheduleOPtimizedWithDestArrayValue) { auto sh = from_string(shader_with_dest_array_opt_expect); + split_address_loads(*sh); check(schedule(sh), shader_with_dest_array_opt_scheduled); } TEST_F(TestShaderFromNir, ScheduleWithArrayWriteAndRead) { auto sh = from_string(shader_with_dest_array2); + split_address_loads(*sh); check(schedule(sh), shader_with_dest_array2_scheduled); } @@ -409,3 +412,62 @@ BLOCK_END optimize(*sh); check(sh, expect); }; + +TEST_F(TestShaderFromNir, ScheduleSplitLoadIndexConst) +{ + const char *input = +R"( +FS +CHIPCLASS CAYMAN +PROP MAX_COLOR_EXPORTS:1 +PROP COLOR_EXPORTS:1 +PROP COLOR_EXPORT_MASK:15 +PROP WRITE_ALL_COLORS:0 +OUTPUT LOC:0 NAME:1 MASK:15 +SHADER +BLOCK_START + ALU MIN_UINT S3.w@free{s} : KC0[0].x L[0x2] {WL} + ALU MOVA_INT IDX0 : S3.w@free{s} {} + ALU MOV S4.x@group{s} : KC1[IDX0][0].x {W} + ALU MOV S4.y@group{s} : KC1[IDX0][0].y {W} + ALU MOV S4.z@group{s} : KC1[IDX0][0].z {W} + ALU MOV S4.w@group{s} : KC1[IDX0][0].w {WL} + EXPORT_DONE PIXEL 0 S4.xyzw +BLOCK_END +)"; + + const char *expect = +R"( +FS +CHIPCLASS CAYMAN +PROP MAX_COLOR_EXPORTS:1 +PROP COLOR_EXPORTS:1 +PROP COLOR_EXPORT_MASK:15 +PROP WRITE_ALL_COLORS:0 +OUTPUT LOC:0 NAME:1 MASK:15 +SHADER +BLOCK_START +ALU_GROUP_BEGIN + ALU MIN_UINT S3.w@free{s} : KC0[0].x L[0x2] {WL} +ALU_GROUP_END +ALU_GROUP_BEGIN + ALU MOVA_INT IDX0 : S3.w@free{s} {L} +ALU_GROUP_END +BLOCK_END +BLOCK_START +ALU_GROUP_BEGIN + ALU MOV S4.x@chgr : KC1[IDX0][0].x {W} + ALU MOV S4.y@chgr : KC1[IDX0][0].y {W} + ALU MOV S4.z@chgr : KC1[IDX0][0].z {W} + ALU MOV S4.w@chgr : KC1[IDX0][0].w {WL} +ALU_GROUP_END +ALU_GROUP_BEGIN +BLOCK_END +BLOCK_START + EXPORT_DONE PIXEL 0 S4.xyzw +BLOCK_END +)"; + + auto sh = from_string(input); + check(schedule(sh), expect); +} diff --git a/src/gallium/drivers/r600/sfn/tests/sfn_split_address_loads_test.cpp b/src/gallium/drivers/r600/sfn/tests/sfn_split_address_loads_test.cpp index 5bb81ff20fc..026c805aa3b 100644 --- a/src/gallium/drivers/r600/sfn/tests/sfn_split_address_loads_test.cpp +++ b/src/gallium/drivers/r600/sfn/tests/sfn_split_address_loads_test.cpp @@ -408,5 +408,132 @@ BLOCK_END } +TEST_F(TestShaderFromNir, SplitLoadIndexConstOptAndSchedule) +{ + const char *input = +R"( +FS +CHIPCLASS CAYMAN +PROP MAX_COLOR_EXPORTS:1 +PROP COLOR_EXPORTS:1 +PROP COLOR_EXPORT_MASK:15 +PROP WRITE_ALL_COLORS:0 +OUTPUT LOC:0 NAME:1 MASK:15 +SHADER +BLOCK_START + ALU MIN_UINT S3.w@free : KC0[0].x L[0x2] {WL} + ALU MOV S4.x@group : KC1[S3.w@free{s}][0].x {W} + ALU MOV S4.y@group : KC1[S3.w@free{s}][0].y {W} + ALU MOV S4.z@group : KC1[S3.w@free{s}][0].z {W} + ALU MOV S4.w@group : KC1[S3.w@free{s}][0].w {WL} + EXPORT_DONE PIXEL 0 S4.xyzw +BLOCK_END +)"; + + const char *expect = +R"( +FS +CHIPCLASS CAYMAN +PROP MAX_COLOR_EXPORTS:1 +PROP COLOR_EXPORTS:1 +PROP COLOR_EXPORT_MASK:15 +PROP WRITE_ALL_COLORS:0 +OUTPUT LOC:0 NAME:1 MASK:15 +SHADER +BLOCK_START +ALU_GROUP_BEGIN + ALU MIN_UINT S3.w@free : KC0[0].x L[0x2] {WL} +ALU_GROUP_END +ALU_GROUP_BEGIN + ALU MOVA_INT IDX0 : S3.w@free {L} +ALU_GROUP_END +BLOCK_END +BLOCK_START +ALU_GROUP_BEGIN + ALU MOV S4.x@chgr : KC1[IDX0][0].x {W} + ALU MOV S4.y@chgr : KC1[IDX0][0].y {W} + ALU MOV S4.z@chgr : KC1[IDX0][0].z {W} + ALU MOV S4.w@chgr : KC1[IDX0][0].w {WL} +ALU_GROUP_END +BLOCK_END +BLOCK_START +EXPORT_DONE PIXEL 0 S4.xyzw +BLOCK_END +)"; + auto sh = from_string(input); + split_address_loads(*sh); + optimize(*sh); + check(schedule(sh), expect); +} + +TEST_F(TestShaderFromNir, SplitLoadWithNonAlu) +{ + const char *input = +R"( +FS +CHIPCLASS EVERGREEN +PROP MAX_COLOR_EXPORTS:1 +PROP COLOR_EXPORTS:1 +PROP COLOR_EXPORT_MASK:15 +PROP WRITE_ALL_COLORS:0 +OUTPUT LOC:0 NAME:1 MASK:15 +SHADER +BLOCK_START + ALU MOV S0.x@free : KC0[1].x {W} + ALU MOV S0.y@free : KC0[1].y {W} + ALU MOV S2.w@free : KC0[0].x {WL} + TEX SAMPLE S3.xyzw : S0.xy__ RID:0 SID:0 NNNN + ALU ADD S4.x@group : KC1[S2.w@free{s}][0].x S3.x {W} + ALU ADD S4.y@group : KC1[S2.w@free{s}][0].y S3.y {W} + ALU ADD S4.z@group : KC1[S2.w@free{s}][0].z S3.z {W} + ALU ADD S4.w@group : KC1[S2.w@free{s}][0].w S3.w {WL} + EXPORT_DONE PIXEL 0 S4.xyzw +BLOCK_END +)"; + + const char *expect = +R"( +FS +CHIPCLASS EVERGREEN +PROP MAX_COLOR_EXPORTS:1 +PROP COLOR_EXPORTS:1 +PROP COLOR_EXPORT_MASK:15 +PROP WRITE_ALL_COLORS:0 +OUTPUT LOC:0 NAME:1 MASK:15 +SHADER +BLOCK_START +ALU_GROUP_BEGIN + ALU MOV S0.x@free : KC0[1].x {W} + ALU MOV S0.y@free : KC0[1].y {WL} +ALU_GROUP_END +BLOCK_END +BLOCK_START + TEX SAMPLE S3.xyzw : S0.xy__ RID:0 SID:0 NNNN +BLOCK_END +BLOCK_START +ALU_GROUP_BEGIN + ALU MOVA_INT AR : KC0[0].x {L} +ALU_GROUP_END +ALU_GROUP_BEGIN + ALU SET_CF_IDX0 IDX0 : AR {L} +ALU_GROUP_END +BLOCK_END +BLOCK_START +ALU_GROUP_BEGIN + ALU ADD S4.x@chgr : KC1[IDX0][0].x S3.x {W} + ALU ADD S4.y@chgr : KC1[IDX0][0].y S3.y {W} + ALU ADD S4.z@chgr : KC1[IDX0][0].z S3.z {W} + ALU ADD S4.w@chgr : KC1[IDX0][0].w S3.w {WL} +ALU_GROUP_END +BLOCK_END +BLOCK_START +EXPORT_DONE PIXEL 0 S4.xyzw +BLOCK_END +)"; + auto sh = from_string(input); + split_address_loads(*sh); + optimize(*sh); + check(schedule(sh), expect); +} diff --git a/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp b/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp index 44c2d840ead..aa439856b97 100644 --- a/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp +++ b/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp @@ -1908,9 +1908,9 @@ IF (( ALU PRED_SETGE_INT __.x@free : KC0[0].x L[0x4] {LEP} PUSH_BEFORE )) ALU MOV A2[S34.x].z : I[0] {W} ALU MOV A2[S34.x].w : L[0x3dcccccd] {WL} ELSE - ALU MOV S37.x : KC0[0].x {WL} - ALU MOV A2[S37.x].x : I[0] {W} - ALU MOV A2[S37.x].y : L[0x3dcccccd] {WL} + ALU MOV S37.x : KC0[0].x {WL} + ALU MOV A2[S37.x].x : I[0] {W} + ALU MOV A2[S37.x].y : L[0x3dcccccd] {WL} ENDIF EXPORT_DONE POS 0 S19.xyzw ALU MOV S46.x@group : A2[0].x {W} @@ -2003,16 +2003,22 @@ IF (( ALU PRED_SETGE_INT __.x@free : KC0[0].x L[0x4] {LEP} PUSH_BEFORE )) ALU ADD_INT S34.x : KC0[0].x L[0xfffffffc] {WL} ALU_GROUP_END ALU_GROUP_BEGIN - ALU MOV A2[S34.x].z : I[0] {W} - ALU MOV A2[S34.x].w : L[0x3dcccccd] {WL} + ALU MOVA_INT AR : S34.x {L} + ALU_GROUP_END + ALU_GROUP_BEGIN + ALU MOV A2[AR].z : I[0] {W} + ALU MOV A2[AR].w : L[0x3dcccccd] {WL} ALU_GROUP_END ELSE ALU_GROUP_BEGIN - ALU MOV S37.x : KC0[0].x {WL} + ALU MOV S37.x : KC0[0].x {WL} ALU_GROUP_END ALU_GROUP_BEGIN - ALU MOV A2[S37.x].x : I[0] {W} - ALU MOV A2[S37.x].y : L[0x3dcccccd] {WL} + ALU MOVA_INT AR : S37.x {L} + ALU_GROUP_END + ALU_GROUP_BEGIN + ALU MOV A2[AR].x : I[0] {W} + ALU MOV A2[AR].y : L[0x3dcccccd] {WL} ALU_GROUP_END ENDIF ALU_GROUP_BEGIN @@ -2098,8 +2104,11 @@ ALU_GROUP_BEGIN ALU MOV A0[1].y : KC0[1].y {WL} ALU_GROUP_END ALU_GROUP_BEGIN - ALU MOV A0[S1.x].x : I[1.0] {W} - ALU MOV A0[S1.x].y : L[2.0] {WL} + ALU MOVA_INT AR : S1.x {L} +ALU_GROUP_END +ALU_GROUP_BEGIN + ALU MOV A0[AR].x : I[1.0] {W} + ALU MOV A0[AR].y : L[2.0] {WL} ALU_GROUP_END ALU_GROUP_BEGIN ALU MOV S2.x : A0[0].x {W} @@ -2136,8 +2145,11 @@ ALU_GROUP_BEGIN ALU MOV A0[1].y : KC0[1].y {WL} ALU_GROUP_END ALU_GROUP_BEGIN - ALU MOV A0[R2.x].x : I[1.0] {W} - ALU MOV A0[R2.x].y : L[2.0] {WL} + ALU MOVA_INT AR : R2.x {L} +ALU_GROUP_END +ALU_GROUP_BEGIN + ALU MOV A0[AR].x : I[1.0] {W} + ALU MOV A0[AR].y : L[2.0] {WL} ALU_GROUP_END ALU_GROUP_BEGIN ALU MOV R2.x : A0[0].x {W}