Add logical comparisons and any/all operators

This commit is contained in:
baldurk
2020-04-15 20:33:57 +01:00
parent 44f46b6ae9
commit c4437f6be0
2 changed files with 116 additions and 2 deletions
+48 -2
View File
@@ -951,6 +951,10 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray<ThreadState>
//
//////////////////////////////////////////////////////////////////////////////
case Op::LogicalEqual:
case Op::LogicalNotEqual:
case Op::LogicalOr:
case Op::LogicalAnd:
case Op::IEqual:
case Op::INotEqual:
case Op::UGreaterThan:
@@ -979,16 +983,26 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray<ThreadState>
ShaderVariable var = GetSrc(comp.operand1);
ShaderVariable b = GetSrc(comp.operand2);
if(opdata.op == Op::IEqual)
if(opdata.op == Op::IEqual || opdata.op == Op::LogicalEqual)
{
for(uint8_t c = 0; c < var.columns; c++)
var.value.uv[c] = (var.value.uv[c] == b.value.uv[c]) ? 1 : 0;
}
else if(opdata.op == Op::INotEqual)
else if(opdata.op == Op::INotEqual || opdata.op == Op::LogicalNotEqual)
{
for(uint8_t c = 0; c < var.columns; c++)
var.value.uv[c] = (var.value.uv[c] != b.value.uv[c]) ? 1 : 0;
}
else if(opdata.op == Op::LogicalAnd)
{
for(uint8_t c = 0; c < var.columns; c++)
var.value.uv[c] = var.value.uv[c] & b.value.uv[c];
}
else if(opdata.op == Op::LogicalOr)
{
for(uint8_t c = 0; c < var.columns; c++)
var.value.uv[c] = var.value.uv[c] | b.value.uv[c];
}
else if(opdata.op == Op::UGreaterThan)
{
for(uint8_t c = 0; c < var.columns; c++)
@@ -1111,6 +1125,38 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray<ThreadState>
SetDst(state, comp.result, var);
break;
}
case Op::LogicalNot:
{
OpLogicalNot negate(it);
ShaderVariable var = GetSrc(negate.operand);
for(uint8_t c = 0; c < var.columns; c++)
var.value.uv[c] = 1U - var.value.uv[c];
SetDst(state, negate.result, var);
break;
}
case Op::Any:
case Op::All:
{
OpAny any(it);
ShaderVariable var = GetSrc(any.vector);
for(uint8_t c = 1; c < var.columns; c++)
{
if(opdata.op == Op::Any)
var.value.uv[0] |= var.value.uv[c];
else
var.value.uv[0] &= var.value.uv[c];
}
var.columns = 1;
SetDst(state, any.result, var);
break;
}
case Op::IsNan:
{
OpIsNan is(it);
@@ -581,6 +581,74 @@ void main()
Color = vec4(radians(negone*164.2f), radians(posone*164.2f), radians(zerof), radians(posone*3456.78f));
break;
}
case 71:
{
vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f);
vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f);
Color = vec4(float(a.x < b.x), float(a.x <= b.x), float(a.x > b.x), float(a.x >= b.x));
break;
}
case 72:
{
vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f);
vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f);
bvec4 c = lessThanEqual(a, b);
Color = vec4(float(a.x == b.x), float(a.x != b.x), 0.0f, 1.0f);
break;
}
case 73:
{
ivec4 a = ivec4(zeroi+2, zeroi+3, zeroi+4, zeroi+5);
ivec4 b = ivec4(zeroi+4, zeroi+4, zeroi+4, zeroi+4);
Color = vec4(float(a.x < b.x), float(a.x <= b.x), float(a.x > b.x), float(a.x >= b.x));
break;
}
case 74:
{
ivec4 a = ivec4(zeroi+2, zeroi+3, zeroi+4, zeroi+5);
ivec4 b = ivec4(zeroi+4, zeroi+4, zeroi+4, zeroi+4);
Color = vec4(float(a.x == b.x), float(a.x != b.x), 0.0f, 1.0f);
break;
}
case 75:
{
uvec4 a = uvec4(zerou+2, zerou+3, zerou+4, zerou+5);
uvec4 b = uvec4(zerou+4, zerou+4, zerou+4, zerou+4);
Color = vec4(float(a.x < b.x), float(a.x <= b.x), float(a.x > b.x), float(a.x >= b.x));
break;
}
case 76:
{
uvec4 a = uvec4(zerou+2, zerou+3, zerou+4, zerou+5);
uvec4 b = uvec4(zerou+4, zerou+4, zerou+4, zerou+4);
Color = vec4(float(a.x == b.x), float(a.x != b.x), 0.0f, 1.0f);
break;
}
case 77:
{
vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f);
vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f);
bvec4 c = lessThanEqual(a, b);
Color = vec4(float(any(c)), float(all(c)), float(c.x == c.z), float(c.x != c.w));
break;
}
case 78:
{
vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f);
vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f);
bvec4 c = lessThanEqual(a, b);
Color = vec4(float(c.x || c.y), float(c.x && c.y), float(!c.x), 1.0f);
break;
}
case 79:
{
vec4 a = vec4(posone*2.4f, posone*2.5f, posone*2.6f, posone*2.7f);
vec4 b = vec4(zerof+2.5f, zerof+2.5f, zerof+2.5f, zerof+2.5f);
bvec4 c = lessThanEqual(a, b);
Color = mix(vec4(posone*9.0f, posone*8.0f, posone*7.0f, posone*6.0f),
vec4(posone*1.0f, posone*2.0f, posone*3.0f, posone*4.0f), c);
break;
}
default: break;
}
}