writer/hlsl: Use vector write helper for dynamic indices

This uses FXC compilation failure mitigation for _any_ vector index assignment that has a non-constant index. FXC can still fall over if the loop calls a function that performs the dynamic index.

Use some vector swizzle logic to avoid branches in the helper.

Fixed: tint:980
Change-Id: I2a759d88a7d884bc61b4631cf57feb4acc8178de
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/57882
Auto-Submit: Ben Clayton <bclayton@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
This commit is contained in:
Ben Clayton
2021-07-14 18:43:51 +00:00
committed by Tint LUCI CQ
parent 8a8ddcfbed
commit 3242d3e8c9
14 changed files with 436 additions and 306 deletions

View File

@@ -1,30 +1,19 @@
void Set_float2(inout float2 vec, int idx, float val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_float2(inout float2 vec, int idx, float val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void Set_int3(inout int3 vec, int idx, int val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
}
void set_int3(inout int3 vec, int idx, int val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void Set_uint4(inout uint4 vec, int idx, uint val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
case 3: vec[3] = val; break;
}
void set_uint4(inout uint4 vec, int idx, uint val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void Set_bool2(inout bool2 vec, int idx, bool val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_bool2(inout bool2 vec, int idx, bool val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
static float2 v2f = float2(0.0f, 0.0f);
static int3 v3i = int3(0, 0, 0);
static uint4 v4u = uint4(0u, 0u, 0u, 0u);
@@ -33,10 +22,10 @@ static bool2 v2b = bool2(false, false);
void foo() {
{
for(int i = 0; (i < 2); i = (i + 1)) {
Set_float2(v2f, i, 1.0f);
Set_int3(v3i, i, 1);
Set_uint4(v4u, i, 1u);
Set_bool2(v2b, i, true);
set_float2(v2f, i, 1.0f);
set_int3(v3i, i, 1);
set_uint4(v4u, i, 1u);
set_bool2(v2b, i, true);
}
}
}

View File

@@ -1,3 +1,19 @@
void set_float2(inout float2 vec, int idx, float val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void set_int3(inout int3 vec, int idx, int val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void set_uint4(inout uint4 vec, int idx, uint val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void set_bool2(inout bool2 vec, int idx, bool val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
static float2 v2f = float2(0.0f, 0.0f);
static int3 v3i = int3(0, 0, 0);
static uint4 v4u = uint4(0u, 0u, 0u, 0u);
@@ -5,10 +21,10 @@ static bool2 v2b = bool2(false, false);
void foo() {
int i = 0;
v2f[i] = 1.0f;
v3i[i] = 1;
v4u[i] = 1u;
v2b[i] = true;
set_float2(v2f, i, 1.0f);
set_int3(v3i, i, 1);
set_uint4(v4u, i, 1u);
set_bool2(v2b, i, true);
}
[numthreads(1, 1, 1)]

View File

@@ -1,87 +1,51 @@
void Set_float2(inout float2 vec, int idx, float val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_float2(inout float2 vec, int idx, float val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void Set_float3(inout float3 vec, int idx, float val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
}
void set_float3(inout float3 vec, int idx, float val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void Set_float4(inout float4 vec, int idx, float val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
case 3: vec[3] = val; break;
}
void set_float4(inout float4 vec, int idx, float val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void Set_int2(inout int2 vec, int idx, int val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_int2(inout int2 vec, int idx, int val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void Set_int3(inout int3 vec, int idx, int val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
}
void set_int3(inout int3 vec, int idx, int val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void Set_int4(inout int4 vec, int idx, int val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
case 3: vec[3] = val; break;
}
void set_int4(inout int4 vec, int idx, int val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void Set_uint2(inout uint2 vec, int idx, uint val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_uint2(inout uint2 vec, int idx, uint val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void Set_uint3(inout uint3 vec, int idx, uint val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
}
void set_uint3(inout uint3 vec, int idx, uint val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void Set_uint4(inout uint4 vec, int idx, uint val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
case 3: vec[3] = val; break;
}
void set_uint4(inout uint4 vec, int idx, uint val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void Set_bool2(inout bool2 vec, int idx, bool val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_bool2(inout bool2 vec, int idx, bool val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void Set_bool3(inout bool3 vec, int idx, bool val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
}
void set_bool3(inout bool3 vec, int idx, bool val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void Set_bool4(inout bool4 vec, int idx, bool val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
case 3: vec[3] = val; break;
}
void set_bool4(inout bool4 vec, int idx, bool val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
[numthreads(1, 1, 1)]
void main() {
float2 v2f = float2(0.0f, 0.0f);
@@ -98,18 +62,18 @@ void main() {
bool4 v4b = bool4(false, false, false, false);
{
for(int i = 0; (i < 2); i = (i + 1)) {
Set_float2(v2f, i, 1.0f);
Set_float3(v3f, i, 1.0f);
Set_float4(v4f, i, 1.0f);
Set_int2(v2i, i, 1);
Set_int3(v3i, i, 1);
Set_int4(v4i, i, 1);
Set_uint2(v2u, i, 1u);
Set_uint3(v3u, i, 1u);
Set_uint4(v4u, i, 1u);
Set_bool2(v2b, i, true);
Set_bool3(v3b, i, true);
Set_bool4(v4b, i, true);
set_float2(v2f, i, 1.0f);
set_float3(v3f, i, 1.0f);
set_float4(v4f, i, 1.0f);
set_int2(v2i, i, 1);
set_int3(v3i, i, 1);
set_int4(v4i, i, 1);
set_uint2(v2u, i, 1u);
set_uint3(v3u, i, 1u);
set_uint4(v4u, i, 1u);
set_bool2(v2b, i, true);
set_bool3(v3b, i, true);
set_bool4(v4b, i, true);
}
}
return;

View File

@@ -1,30 +1,19 @@
void Set_float2(inout float2 vec, int idx, float val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_float2(inout float2 vec, int idx, float val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void Set_int3(inout int3 vec, int idx, int val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
}
void set_int3(inout int3 vec, int idx, int val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void Set_uint4(inout uint4 vec, int idx, uint val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
case 2: vec[2] = val; break;
case 3: vec[3] = val; break;
}
void set_uint4(inout uint4 vec, int idx, uint val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void Set_bool2(inout bool2 vec, int idx, bool val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_bool2(inout bool2 vec, int idx, bool val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
[numthreads(1, 1, 1)]
void main() {
float2 v2f = float2(0.0f, 0.0f);
@@ -37,14 +26,14 @@ void main() {
bool2 v2b_2 = bool2(false, false);
{
for(int i = 0; (i < 2); i = (i + 1)) {
Set_float2(v2f, i, 1.0f);
Set_int3(v3i, i, 1);
Set_uint4(v4u, i, 1u);
Set_bool2(v2b, i, true);
Set_float2(v2f_2, i, 1.0f);
Set_int3(v3i_2, i, 1);
Set_uint4(v4u_2, i, 1u);
Set_bool2(v2b_2, i, true);
set_float2(v2f, i, 1.0f);
set_int3(v3i, i, 1);
set_uint4(v4u, i, 1u);
set_bool2(v2b, i, true);
set_float2(v2f_2, i, 1.0f);
set_int3(v3i_2, i, 1);
set_uint4(v4u_2, i, 1u);
set_bool2(v2b_2, i, true);
}
}
return;

View File

@@ -1,27 +1,51 @@
void Set_float2(inout float2 vec, int idx, float val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_float2(inout float2 vec, int idx, float val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void Set_int2(inout int2 vec, int idx, int val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_int2(inout int2 vec, int idx, int val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void Set_uint2(inout uint2 vec, int idx, uint val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_uint2(inout uint2 vec, int idx, uint val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void Set_bool2(inout bool2 vec, int idx, bool val) {
switch(idx) {
case 0: vec[0] = val; break;
case 1: vec[1] = val; break;
}
void set_bool2(inout bool2 vec, int idx, bool val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void set_float3(inout float3 vec, int idx, float val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void set_float4(inout float4 vec, int idx, float val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void set_int3(inout int3 vec, int idx, int val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void set_int4(inout int4 vec, int idx, int val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void set_uint3(inout uint3 vec, int idx, uint val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void set_uint4(inout uint4 vec, int idx, uint val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void set_bool3(inout bool3 vec, int idx, bool val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void set_bool4(inout bool4 vec, int idx, bool val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
[numthreads(1, 1, 1)]
void main() {
float2 v2f = float2(0.0f, 0.0f);
@@ -38,20 +62,20 @@ void main() {
bool4 v4b = bool4(false, false, false, false);
{
for(int i = 0; (i < 2); i = (i + 1)) {
Set_float2(v2f, i, 1.0f);
Set_int2(v2i, i, 1);
Set_uint2(v2u, i, 1u);
Set_bool2(v2b, i, true);
set_float2(v2f, i, 1.0f);
set_int2(v2i, i, 1);
set_uint2(v2u, i, 1u);
set_bool2(v2b, i, true);
}
}
int i = 0;
v3f[i] = 1.0f;
v4f[i] = 1.0f;
v3i[i] = 1;
v4i[i] = 1;
v3u[i] = 1u;
v4u[i] = 1u;
v3b[i] = true;
v4b[i] = true;
set_float3(v3f, i, 1.0f);
set_float4(v4f, i, 1.0f);
set_int3(v3i, i, 1);
set_int4(v4i, i, 1);
set_uint3(v3u, i, 1u);
set_uint4(v4u, i, 1u);
set_bool3(v3b, i, true);
set_bool4(v4b, i, true);
return;
}

View File

@@ -1,3 +1,51 @@
void set_float2(inout float2 vec, int idx, float val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void set_float3(inout float3 vec, int idx, float val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void set_float4(inout float4 vec, int idx, float val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void set_int2(inout int2 vec, int idx, int val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void set_int3(inout int3 vec, int idx, int val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void set_int4(inout int4 vec, int idx, int val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void set_uint2(inout uint2 vec, int idx, uint val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void set_uint3(inout uint3 vec, int idx, uint val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void set_uint4(inout uint4 vec, int idx, uint val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
void set_bool2(inout bool2 vec, int idx, bool val) {
vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}
void set_bool3(inout bool3 vec, int idx, bool val) {
vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}
void set_bool4(inout bool4 vec, int idx, bool val) {
vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
}
[numthreads(1, 1, 1)]
void main() {
float2 v2f = float2(0.0f, 0.0f);
@@ -13,17 +61,17 @@ void main() {
bool3 v3b = bool3(false, false, false);
bool4 v4b = bool4(false, false, false, false);
int i = 0;
v2f[i] = 1.0f;
v3f[i] = 1.0f;
v4f[i] = 1.0f;
v2i[i] = 1;
v3i[i] = 1;
v4i[i] = 1;
v2u[i] = 1u;
v3u[i] = 1u;
v4u[i] = 1u;
v2b[i] = true;
v3b[i] = true;
v4b[i] = true;
set_float2(v2f, i, 1.0f);
set_float3(v3f, i, 1.0f);
set_float4(v4f, i, 1.0f);
set_int2(v2i, i, 1);
set_int3(v3i, i, 1);
set_int4(v4i, i, 1);
set_uint2(v2u, i, 1u);
set_uint3(v3u, i, 1u);
set_uint4(v4u, i, 1u);
set_bool2(v2b, i, true);
set_bool3(v3b, i, true);
set_bool4(v4b, i, true);
return;
}