diff options
17 files changed, 908 insertions, 698 deletions
diff --git a/source/slang/slang-ast-expr.h b/source/slang/slang-ast-expr.h index 9a7993937..fa1b27a04 100644 --- a/source/slang/slang-ast-expr.h +++ b/source/slang/slang-ast-expr.h @@ -431,6 +431,19 @@ class SelectExpr: public OperatorExpr SLANG_AST_CLASS(SelectExpr) }; +class LogicOperatorShortCircuitExpr: public OperatorExpr +{ + SLANG_AST_CLASS(LogicOperatorShortCircuitExpr) +public: + enum Flavor + { + And, // && + Or, // || + }; + Flavor flavor; +}; + + class GenericAppExpr: public AppExprBase { SLANG_AST_CLASS(GenericAppExpr) diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 4dfffc414..3596b7045 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -310,6 +310,7 @@ namespace Slang void visitParamDecl(ParamDecl* paramDecl); void visitAggTypeDecl(AggTypeDecl* aggTypeDecl); + }; template<typename VisitorType> @@ -1814,11 +1815,18 @@ namespace Slang { if (auto initExpr = varDecl->initExpr) { - // If the variable has an explicit initial-value expression, - // then we simply need to check that expression and coerce - // it to the type of the variable. - // - initExpr = CheckTerm(initExpr); + // Disable the short-circuiting for static const variable init expression + bool isStaticConst = varDecl->hasModifier<HLSLStaticModifier>() && + varDecl->hasModifier<ConstModifier>(); + + auto subVisitor = isStaticConst? + SemanticsVisitor(disableShortCircuitLogicalExpr()) : *this; + // If the variable has an explicit initial-value expression, + // then we simply need to check that expression and coerce + // it to the type of the variable. + // + initExpr = subVisitor.CheckTerm(initExpr); + initExpr = coerce(CoercionSite::Initializer, varDecl->type.Ptr(), initExpr); varDecl->initExpr = initExpr; diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index 55ff90759..89a7373ee 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -1906,9 +1906,17 @@ namespace Slang { auto baseExpr = checkBaseForMemberExpr(subscriptExpr->baseExpression); + // If the base expression is a type, it means that this is an array declaration, + // then we should disable short-circuit in case there is logical expression in + // the subscript + auto baseType = baseExpr->type.Ptr(); + auto baseTypeType = as<TypeType>(baseType); + auto subVisitor = (baseTypeType && m_shouldShortCircuitLogicExpr)? + SemanticsVisitor(disableShortCircuitLogicalExpr()) : *this; + for (auto& arg : subscriptExpr->indexExprs) { - arg = CheckTerm(arg); + arg = subVisitor.CheckTerm(arg); } // If anything went wrong in the base expression, @@ -1920,8 +1928,7 @@ namespace Slang // Otherwise, we need to look at the type of the base expression, // to figure out how subscripting should work. - auto baseType = baseExpr->type.Ptr(); - if (auto baseTypeType = as<TypeType>(baseType)) + if (baseTypeType) { // We are trying to "index" into a type, so we have an expression like `float[2]` // which should be interpreted as resolving to an array type. @@ -2371,12 +2378,69 @@ namespace Slang return result; } + Expr* SemanticsExprVisitor::convertToLogicOperatorExpr(InvokeExpr* expr) + { + LogicOperatorShortCircuitExpr* newExpr = nullptr; + + // If the logic expression is inside the generic parameter list, it cannot support short-circuit + // which will generate the ifelse branch. + if (!m_shouldShortCircuitLogicExpr) + { + return nullptr; + } + + if (auto varExpr = as<VarExpr>(expr->functionExpr)) + { + if ((varExpr->name->text == "&&") || (varExpr->name->text == "||")) + { + // We only use short-circuiting in scalar input, will fall back + // to non-short-circuiting in vector input. + bool shortCircuitSupport = true; + for (auto & arg : expr->arguments) + { + if(!as<BasicExpressionType>(arg->type.type)) + { + shortCircuitSupport = false; + } + } + + if (!shortCircuitSupport) + { + return nullptr; + } + + // We do the cast in the 2nd pass because we want to leave it for 'visitInvokeExpr' + // to handle if this expression doesn't support short-circuiting. + for (auto & arg : expr->arguments) + { + arg = coerce(CoercionSite::Argument, m_astBuilder->getBoolType(), arg); + } + + expr->functionExpr = CheckTerm(expr->functionExpr); + newExpr = m_astBuilder->create<LogicOperatorShortCircuitExpr>(); + if (varExpr->name->text == "&&") + { + newExpr->flavor = LogicOperatorShortCircuitExpr::Flavor::And; + } + else + { + newExpr->flavor = LogicOperatorShortCircuitExpr::Flavor::Or; + } + newExpr->loc = expr->loc; + newExpr->functionExpr = expr->functionExpr; + newExpr->type = m_astBuilder->getBoolType(); + newExpr->arguments = expr->arguments; + } + } + + return newExpr; + } + Expr* SemanticsExprVisitor::visitInvokeExpr(InvokeExpr* expr) { // check the base expression first if (!expr->originalFunctionExpr) expr->originalFunctionExpr = expr->functionExpr; - expr->functionExpr = CheckTerm(expr->functionExpr); auto treatAsDifferentiableExpr = m_treatAsDifferentiableExpr; m_treatAsDifferentiableExpr = nullptr; // Next check the argument expressions @@ -2384,6 +2448,13 @@ namespace Slang { arg = CheckTerm(arg); } + + // if the expression is '&&' or '||', we will convert it + // to use short-circuit evaluation. + if (auto newExpr = convertToLogicOperatorExpr(expr)) + return newExpr; + + expr->functionExpr = CheckTerm(expr->functionExpr); m_treatAsDifferentiableExpr = treatAsDifferentiableExpr; // If we are in a differentiable function, register differential witness tables involved in diff --git a/source/slang/slang-check-impl.h b/source/slang/slang-check-impl.h index eb3f9486c..a209d96d9 100644 --- a/source/slang/slang-check-impl.h +++ b/source/slang/slang-check-impl.h @@ -848,6 +848,15 @@ namespace Slang return result; } + // Setup the flag to indicate disabling the short-circuiting evaluation + // for the logical expressions associted with the subcontext + SemanticsContext disableShortCircuitLogicalExpr() + { + SemanticsContext result(*this); + result.m_shouldShortCircuitLogicExpr = false; + return result; + } + TryClauseType getEnclosingTryClauseType() { return m_enclosingTryClauseType; } SemanticsContext withEnclosingTryClauseType(TryClauseType tryClauseType) @@ -945,6 +954,13 @@ namespace Slang ASTBuilder* m_astBuilder = nullptr; Scope* m_outerScope = nullptr; + + // By default, we will support short-circuit evaluation for the logic expression. + // However, there are few exceptions where we will disable it: + // 1. the logic expression is inside the generic parameter list. + // 2. the logic expression is in the init expression of a static const variable. + // 3. the logic expression is in an array size declaration. + bool m_shouldShortCircuitLogicExpr = true; }; struct OuterScopeContextRAII @@ -2589,6 +2605,9 @@ namespace Slang /// Perform semantic checking on a `modifier` that is being applied to the given `type` Val* checkTypeModifier(Modifier* modifier, Type* type); + private: + // Convert the logic operator expression to not use 'InvokeExpr' type + Expr* convertToLogicOperatorExpr(InvokeExpr* expr); }; diff --git a/source/slang/slang-check-overload.cpp b/source/slang/slang-check-overload.cpp index c6e6677b3..84c005f28 100644 --- a/source/slang/slang-check-overload.cpp +++ b/source/slang/slang-check-overload.cpp @@ -2113,6 +2113,15 @@ namespace Slang Expr* SemanticsExprVisitor::visitGenericAppExpr(GenericAppExpr* genericAppExpr) { // Start by checking the base expression and arguments. + + // Disable the short-circuiting logic expression when the experssion is in + // the generic parameter. + if (this->m_shouldShortCircuitLogicExpr) + { + auto subContext = disableShortCircuitLogicalExpr(); + return dispatchExpr(genericAppExpr, subContext); + } + auto& baseExpr = genericAppExpr->functionExpr; baseExpr = CheckTerm(baseExpr); auto& args = genericAppExpr->arguments; diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index 5e35bf165..409cd65ee 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -4575,6 +4575,46 @@ struct ExprLoweringVisitorBase : public ExprVisitor<Derived, LoweredValInfo> return LoweredValInfo::simple(result); } + LoweredValInfo visitLogicOperatorShortCircuitExpr(LogicOperatorShortCircuitExpr* expr) + { + auto builder = context->irBuilder; + auto thenBlock = builder->createBlock(); + auto elseBlock = builder->createBlock(); + auto afterBlock = builder->createBlock(); + auto irCond = getSimpleVal(context, lowerRValueExpr(context, expr->arguments[0])); + + // ifElse(<first param>, %true-block, %false-block, %after-block) + builder->emitIfElse(irCond, thenBlock, elseBlock, afterBlock); + + // true-block: nonconditionalBranch(%after-block, <second param> : Bool) + // true-block: nonconditionalBranch(%after-block, true) for || + builder->insertBlock(thenBlock); + builder->setInsertInto(thenBlock); + auto trueVal = expr->flavor == LogicOperatorShortCircuitExpr::Flavor::And ? + getSimpleVal(context, lowerRValueExpr(context, expr->arguments[1])) : + LoweredValInfo::simple(context->irBuilder->getBoolValue(true)).val; + + builder->emitBranch(afterBlock, 1, &trueVal); + + // false-block: nonconditionalBranch(%after-block, false) for && + // false-block: nonconditionalBranch(%after-block, <second param>: Bool) for || + builder->insertBlock(elseBlock); + builder->setInsertInto(elseBlock); + auto falseVal = expr->flavor == LogicOperatorShortCircuitExpr::Flavor::And ? + LoweredValInfo::simple(context->irBuilder->getBoolValue(false)).val : + getSimpleVal(context, lowerRValueExpr(context, expr->arguments[1])); + + builder->emitBranch(afterBlock, 1, &falseVal); + + // after-block: return input parameter + builder->insertBlock(afterBlock); + builder->setInsertInto(afterBlock); + auto paramType = lowerType(context, expr->type.type); + auto result = builder->emitParam(paramType); + + return LoweredValInfo::simple(result); + } + LoweredValInfo visitInvokeExpr(InvokeExpr* expr) { return sharedLoweringContext.visitInvokeExprImpl(expr, LoweredValInfo(), TryClauseEnvironment()); @@ -5197,6 +5237,12 @@ struct DestinationDrivenRValueExprLoweringVisitor assign(context, destination, rValue); } + void visitLogicOperatorShortCircuitExpr(LogicOperatorShortCircuitExpr* expr) + { + auto rValue = lowerRValueExpr(context, expr); + assign(context, destination, rValue); + } + void visitInvokeExpr(InvokeExpr* expr) { LoweredValInfo resultRVal; diff --git a/tests/compute/logic-short-circuit-evaluation.slang b/tests/compute/logic-short-circuit-evaluation.slang new file mode 100644 index 000000000..585a04770 --- /dev/null +++ b/tests/compute/logic-short-circuit-evaluation.slang @@ -0,0 +1,28 @@ +//TEST(compute):COMPARE_COMPUTE:-dx12 -compute -shaderobj +//TEST(compute):COMPARE_COMPUTE:-vk -compute -shaderobj +//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj +//TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -compile-arg -O3 -shaderobj +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj + +// Test doing vector comparisons + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +bool assignFunc(int index) +{ + outputBuffer[index] = 1; + return true; +} + +[numthreads(16, 1, 1)] +void computeMain(int3 dispatchThreadID : SV_DispatchThreadID) +{ + int index = dispatchThreadID.x; + + // Only the first 4 elements will be 1 + (index < 4) && assignFunc(index); + + // Only the last 4 elements will be 1. + (index < 12) || assignFunc(index); +} diff --git a/tests/compute/logic-short-circuit-evaluation.slang.expected.txt b/tests/compute/logic-short-circuit-evaluation.slang.expected.txt new file mode 100644 index 000000000..945f08f2c --- /dev/null +++ b/tests/compute/logic-short-circuit-evaluation.slang.expected.txt @@ -0,0 +1,16 @@ +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 diff --git a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_Exclusive.slang b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_Exclusive.slang index 7bfc4d886..ad4dd1535 100644 --- a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_Exclusive.slang +++ b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_Exclusive.slang @@ -31,9 +31,9 @@ __generic<T : __BuiltinLogicalType> bool test1Logical() { return true #if defined(TEST_when_logical_operators_are_implemented) - && subgroupExclusiveAnd(T(1)) == T(1) - && subgroupExclusiveOr(T(1)) == T(1) - && subgroupExclusiveXor(T(1)) == T(1) + & subgroupExclusiveAnd(T(1)) == T(1) + & subgroupExclusiveOr(T(1)) == T(1) + & subgroupExclusiveXor(T(1)) == T(1) #endif // #if defined(TEST_when_logical_operators_are_implemented) ; } @@ -44,61 +44,61 @@ bool testVLogical() { return true #if defined(TEST_when_logical_operators_are_implemented) - && subgroupExclusiveAnd(gvec(T(1))) == gvec(T(1)) - && subgroupExclusiveOr(gvec(T(1))) == gvec(T(1)) - && subgroupExclusiveXor(gvec(T(1))) == gvec(T(1)) + & subgroupExclusiveAnd(gvec(T(1))) == gvec(T(1)) + & subgroupExclusiveOr(gvec(T(1))) == gvec(T(1)) + & subgroupExclusiveXor(gvec(T(1))) == gvec(T(1)) #endif // #if defined(TEST_when_logical_operators_are_implemented) ; } bool testLogical() { return true - && test1Logical<int>() - && testVLogical<int, 2>() - && testVLogical<int, 3>() - && testVLogical<int, 4>() - && test1Logical<int8_t>() - && testVLogical<int8_t, 2>() - && testVLogical<int8_t, 3>() - && testVLogical<int8_t, 4>() - && test1Logical<int16_t>() - && testVLogical<int16_t, 2>() - && testVLogical<int16_t, 3>() - && testVLogical<int16_t, 4>() - && test1Logical<int64_t>() - && testVLogical<int64_t, 2>() - && testVLogical<int64_t, 3>() - && testVLogical<int64_t, 4>() - && test1Logical<uint>() - && testVLogical<uint, 2>() - && testVLogical<uint, 3>() - && testVLogical<uint, 4>() - && test1Logical<uint8_t>() - && testVLogical<uint8_t, 2>() - && testVLogical<uint8_t, 3>() - && testVLogical<uint8_t, 4>() - && test1Logical<uint16_t>() - && testVLogical<uint16_t, 2>() - && testVLogical<uint16_t, 3>() - && testVLogical<uint16_t, 4>() - && test1Logical<uint64_t>() - && testVLogical<uint64_t, 2>() - && testVLogical<uint64_t, 3>() - && testVLogical<uint64_t, 4>() - && test1Logical<bool>() - && testVLogical<bool, 2>() - && testVLogical<bool, 3>() - && testVLogical<bool, 4>() + & test1Logical<int>() + & testVLogical<int, 2>() + & testVLogical<int, 3>() + & testVLogical<int, 4>() + & test1Logical<int8_t>() + & testVLogical<int8_t, 2>() + & testVLogical<int8_t, 3>() + & testVLogical<int8_t, 4>() + & test1Logical<int16_t>() + & testVLogical<int16_t, 2>() + & testVLogical<int16_t, 3>() + & testVLogical<int16_t, 4>() + & test1Logical<int64_t>() + & testVLogical<int64_t, 2>() + & testVLogical<int64_t, 3>() + & testVLogical<int64_t, 4>() + & test1Logical<uint>() + & testVLogical<uint, 2>() + & testVLogical<uint, 3>() + & testVLogical<uint, 4>() + & test1Logical<uint8_t>() + & testVLogical<uint8_t, 2>() + & testVLogical<uint8_t, 3>() + & testVLogical<uint8_t, 4>() + & test1Logical<uint16_t>() + & testVLogical<uint16_t, 2>() + & testVLogical<uint16_t, 3>() + & testVLogical<uint16_t, 4>() + & test1Logical<uint64_t>() + & testVLogical<uint64_t, 2>() + & testVLogical<uint64_t, 3>() + & testVLogical<uint64_t, 4>() + & test1Logical<bool>() + & testVLogical<bool, 2>() + & testVLogical<bool, 3>() + & testVLogical<bool, 4>() ; } __generic<T : __BuiltinArithmeticType> bool test1Arithmetic() { return true - && subgroupExclusiveAdd(T(1)) == T(3) - && subgroupExclusiveMul(T(1)) == T(1) - && subgroupExclusiveMin(T(1)) == T(1) - && subgroupExclusiveMax(T(1)) == T(1) + & subgroupExclusiveAdd(T(1)) == T(3) + & subgroupExclusiveMul(T(1)) == T(1) + & subgroupExclusiveMin(T(1)) == T(1) + & subgroupExclusiveMax(T(1)) == T(1) ; } __generic<T : __BuiltinArithmeticType, let N : int> @@ -106,59 +106,59 @@ bool testVArithmetic() { typealias gvec = vector<T, N>; return true - && subgroupExclusiveAdd(gvec(T(1))) == gvec(T(3)) - && subgroupExclusiveMul(gvec(T(1))) == gvec(T(1)) - && subgroupExclusiveMin(gvec(T(1))) == gvec(T(1)) - && subgroupExclusiveMax(gvec(T(1))) == gvec(T(1)) + & subgroupExclusiveAdd(gvec(T(1))) == gvec(T(3)) + & subgroupExclusiveMul(gvec(T(1))) == gvec(T(1)) + & subgroupExclusiveMin(gvec(T(1))) == gvec(T(1)) + & subgroupExclusiveMax(gvec(T(1))) == gvec(T(1)) ; } bool testArithmetic() { return true - && test1Arithmetic<float>() - && testVArithmetic<float, 2>() - && testVArithmetic<float, 3>() - && testVArithmetic<float, 4>() - && test1Arithmetic<double>() // WARNING: intel GPU's lack FP64 support - && testVArithmetic<double, 2>() - && testVArithmetic<double, 3>() - && testVArithmetic<double, 4>() - && test1Arithmetic<half>() - && testVArithmetic<half, 2>() - && testVArithmetic<half, 3>() - && testVArithmetic<half, 4>() - && test1Arithmetic<int>() - && testVArithmetic<int, 2>() - && testVArithmetic<int, 3>() - && testVArithmetic<int, 4>() - && test1Arithmetic<int8_t>() - && testVArithmetic<int8_t, 2>() - && testVArithmetic<int8_t, 3>() - && testVArithmetic<int8_t, 4>() - && test1Arithmetic<int16_t>() - && testVArithmetic<int16_t, 2>() - && testVArithmetic<int16_t, 3>() - && testVArithmetic<int16_t, 4>() - && test1Arithmetic<int64_t>() - && testVArithmetic<int64_t, 2>() - && testVArithmetic<int64_t, 3>() - && testVArithmetic<int64_t, 4>() - && test1Arithmetic<uint>() - && testVArithmetic<uint, 2>() - && testVArithmetic<uint, 3>() - && testVArithmetic<uint, 4>() - && test1Arithmetic<uint8_t>() - && testVArithmetic<uint8_t, 2>() - && testVArithmetic<uint8_t, 3>() - && testVArithmetic<uint8_t, 4>() - && test1Arithmetic<uint16_t>() - && testVArithmetic<uint16_t, 2>() - && testVArithmetic<uint16_t, 3>() - && testVArithmetic<uint16_t, 4>() - && test1Arithmetic<uint64_t>() - && testVArithmetic<uint64_t, 2>() - && testVArithmetic<uint64_t, 3>() - && testVArithmetic<uint64_t, 4>() + & test1Arithmetic<float>() + & testVArithmetic<float, 2>() + & testVArithmetic<float, 3>() + & testVArithmetic<float, 4>() + & test1Arithmetic<double>() // WARNING: intel GPU's lack FP64 support + & testVArithmetic<double, 2>() + & testVArithmetic<double, 3>() + & testVArithmetic<double, 4>() + & test1Arithmetic<half>() + & testVArithmetic<half, 2>() + & testVArithmetic<half, 3>() + & testVArithmetic<half, 4>() + & test1Arithmetic<int>() + & testVArithmetic<int, 2>() + & testVArithmetic<int, 3>() + & testVArithmetic<int, 4>() + & test1Arithmetic<int8_t>() + & testVArithmetic<int8_t, 2>() + & testVArithmetic<int8_t, 3>() + & testVArithmetic<int8_t, 4>() + & test1Arithmetic<int16_t>() + & testVArithmetic<int16_t, 2>() + & testVArithmetic<int16_t, 3>() + & testVArithmetic<int16_t, 4>() + & test1Arithmetic<int64_t>() + & testVArithmetic<int64_t, 2>() + & testVArithmetic<int64_t, 3>() + & testVArithmetic<int64_t, 4>() + & test1Arithmetic<uint>() + & testVArithmetic<uint, 2>() + & testVArithmetic<uint, 3>() + & testVArithmetic<uint, 4>() + & test1Arithmetic<uint8_t>() + & testVArithmetic<uint8_t, 2>() + & testVArithmetic<uint8_t, 3>() + & testVArithmetic<uint8_t, 4>() + & test1Arithmetic<uint16_t>() + & testVArithmetic<uint16_t, 2>() + & testVArithmetic<uint16_t, 3>() + & testVArithmetic<uint16_t, 4>() + & test1Arithmetic<uint64_t>() + & testVArithmetic<uint64_t, 2>() + & testVArithmetic<uint64_t, 3>() + & testVArithmetic<uint64_t, 4>() ; } @@ -166,11 +166,11 @@ void computeMain() { bool res0 = true - && testLogical() + & testLogical() ; bool res1 = true - && testArithmetic() + & testArithmetic() ; if (gl_LocalInvocationID.x == 3) { diff --git a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_Inclusive.slang b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_Inclusive.slang index 09c6bdbdf..4d6dd9c2f 100644 --- a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_Inclusive.slang +++ b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_Inclusive.slang @@ -31,9 +31,9 @@ __generic<T : __BuiltinLogicalType> bool test1Logical() { return true #if defined(TEST_when_logical_operators_are_implemented) - && subgroupInclusiveAnd(T(1)) == T(1) - && subgroupInclusiveOr(T(1)) == T(1) - && subgroupInclusiveXor(T(1)) == T(0) + & subgroupInclusiveAnd(T(1)) == T(1) + & subgroupInclusiveOr(T(1)) == T(1) + & subgroupInclusiveXor(T(1)) == T(0) #endif // #if defined(TEST_when_logical_operators_are_implemented) ; } @@ -44,61 +44,61 @@ bool testVLogical() { return true #if defined(TEST_when_logical_operators_are_implemented) - && subgroupInclusiveAnd(gvec(T(1))) == gvec(T(1)) - && subgroupInclusiveOr(gvec(T(1))) == gvec(T(1)) - && subgroupInclusiveXor(gvec(T(1))) == gvec(T(0)) + & subgroupInclusiveAnd(gvec(T(1))) == gvec(T(1)) + & subgroupInclusiveOr(gvec(T(1))) == gvec(T(1)) + & subgroupInclusiveXor(gvec(T(1))) == gvec(T(0)) #endif // #if defined(TEST_when_logical_operators_are_implemented) ; } bool testLogical() { return true - && test1Logical<int>() - && testVLogical<int, 2>() - && testVLogical<int, 3>() - && testVLogical<int, 4>() - && test1Logical<int8_t>() - && testVLogical<int8_t, 2>() - && testVLogical<int8_t, 3>() - && testVLogical<int8_t, 4>() - && test1Logical<int16_t>() - && testVLogical<int16_t, 2>() - && testVLogical<int16_t, 3>() - && testVLogical<int16_t, 4>() - && test1Logical<int64_t>() - && testVLogical<int64_t, 2>() - && testVLogical<int64_t, 3>() - && testVLogical<int64_t, 4>() - && test1Logical<uint>() - && testVLogical<uint, 2>() - && testVLogical<uint, 3>() - && testVLogical<uint, 4>() - && test1Logical<uint8_t>() - && testVLogical<uint8_t, 2>() - && testVLogical<uint8_t, 3>() - && testVLogical<uint8_t, 4>() - && test1Logical<uint16_t>() - && testVLogical<uint16_t, 2>() - && testVLogical<uint16_t, 3>() - && testVLogical<uint16_t, 4>() - && test1Logical<uint64_t>() - && testVLogical<uint64_t, 2>() - && testVLogical<uint64_t, 3>() - && testVLogical<uint64_t, 4>() - && test1Logical<bool>() - && testVLogical<bool, 2>() - && testVLogical<bool, 3>() - && testVLogical<bool, 4>() + & test1Logical<int>() + & testVLogical<int, 2>() + & testVLogical<int, 3>() + & testVLogical<int, 4>() + & test1Logical<int8_t>() + & testVLogical<int8_t, 2>() + & testVLogical<int8_t, 3>() + & testVLogical<int8_t, 4>() + & test1Logical<int16_t>() + & testVLogical<int16_t, 2>() + & testVLogical<int16_t, 3>() + & testVLogical<int16_t, 4>() + & test1Logical<int64_t>() + & testVLogical<int64_t, 2>() + & testVLogical<int64_t, 3>() + & testVLogical<int64_t, 4>() + & test1Logical<uint>() + & testVLogical<uint, 2>() + & testVLogical<uint, 3>() + & testVLogical<uint, 4>() + & test1Logical<uint8_t>() + & testVLogical<uint8_t, 2>() + & testVLogical<uint8_t, 3>() + & testVLogical<uint8_t, 4>() + & test1Logical<uint16_t>() + & testVLogical<uint16_t, 2>() + & testVLogical<uint16_t, 3>() + & testVLogical<uint16_t, 4>() + & test1Logical<uint64_t>() + & testVLogical<uint64_t, 2>() + & testVLogical<uint64_t, 3>() + & testVLogical<uint64_t, 4>() + & test1Logical<bool>() + & testVLogical<bool, 2>() + & testVLogical<bool, 3>() + & testVLogical<bool, 4>() ; } __generic<T : __BuiltinArithmeticType> bool test1Arithmetic() { return true - && subgroupInclusiveAdd(T(1)) == T(4) - && subgroupInclusiveMul(T(1)) == T(1) - && subgroupInclusiveMin(T(1)) == T(1) - && subgroupInclusiveMax(T(1)) == T(1) + & subgroupInclusiveAdd(T(1)) == T(4) + & subgroupInclusiveMul(T(1)) == T(1) + & subgroupInclusiveMin(T(1)) == T(1) + & subgroupInclusiveMax(T(1)) == T(1) ; } __generic<T : __BuiltinArithmeticType, let N : int> @@ -106,59 +106,59 @@ bool testVArithmetic() { typealias gvec = vector<T, N>; return true - && subgroupInclusiveAdd(gvec(T(1))) == gvec(T(4)) - && subgroupInclusiveMul(gvec(T(1))) == gvec(T(1)) - && subgroupInclusiveMin(gvec(T(1))) == gvec(T(1)) - && subgroupInclusiveMax(gvec(T(1))) == gvec(T(1)) + & subgroupInclusiveAdd(gvec(T(1))) == gvec(T(4)) + & subgroupInclusiveMul(gvec(T(1))) == gvec(T(1)) + & subgroupInclusiveMin(gvec(T(1))) == gvec(T(1)) + & subgroupInclusiveMax(gvec(T(1))) == gvec(T(1)) ; } bool testArithmetic() { return true - && test1Arithmetic<float>() - && testVArithmetic<float, 2>() - && testVArithmetic<float, 3>() - && testVArithmetic<float, 4>() - && test1Arithmetic<double>() // WARNING: intel GPU's lack FP64 support - && testVArithmetic<double, 2>() - && testVArithmetic<double, 3>() - && testVArithmetic<double, 4>() - && test1Arithmetic<half>() - && testVArithmetic<half, 2>() - && testVArithmetic<half, 3>() - && testVArithmetic<half, 4>() - && test1Arithmetic<int>() - && testVArithmetic<int, 2>() - && testVArithmetic<int, 3>() - && testVArithmetic<int, 4>() - && test1Arithmetic<int8_t>() - && testVArithmetic<int8_t, 2>() - && testVArithmetic<int8_t, 3>() - && testVArithmetic<int8_t, 4>() - && test1Arithmetic<int16_t>() - && testVArithmetic<int16_t, 2>() - && testVArithmetic<int16_t, 3>() - && testVArithmetic<int16_t, 4>() - && test1Arithmetic<int64_t>() - && testVArithmetic<int64_t, 2>() - && testVArithmetic<int64_t, 3>() - && testVArithmetic<int64_t, 4>() - && test1Arithmetic<uint>() - && testVArithmetic<uint, 2>() - && testVArithmetic<uint, 3>() - && testVArithmetic<uint, 4>() - && test1Arithmetic<uint8_t>() - && testVArithmetic<uint8_t, 2>() - && testVArithmetic<uint8_t, 3>() - && testVArithmetic<uint8_t, 4>() - && test1Arithmetic<uint16_t>() - && testVArithmetic<uint16_t, 2>() - && testVArithmetic<uint16_t, 3>() - && testVArithmetic<uint16_t, 4>() - && test1Arithmetic<uint64_t>() - && testVArithmetic<uint64_t, 2>() - && testVArithmetic<uint64_t, 3>() - && testVArithmetic<uint64_t, 4>() + & test1Arithmetic<float>() + & testVArithmetic<float, 2>() + & testVArithmetic<float, 3>() + & testVArithmetic<float, 4>() + & test1Arithmetic<double>() // WARNING: intel GPU's lack FP64 support + & testVArithmetic<double, 2>() + & testVArithmetic<double, 3>() + & testVArithmetic<double, 4>() + & test1Arithmetic<half>() + & testVArithmetic<half, 2>() + & testVArithmetic<half, 3>() + & testVArithmetic<half, 4>() + & test1Arithmetic<int>() + & testVArithmetic<int, 2>() + & testVArithmetic<int, 3>() + & testVArithmetic<int, 4>() + & test1Arithmetic<int8_t>() + & testVArithmetic<int8_t, 2>() + & testVArithmetic<int8_t, 3>() + & testVArithmetic<int8_t, 4>() + & test1Arithmetic<int16_t>() + & testVArithmetic<int16_t, 2>() + & testVArithmetic<int16_t, 3>() + & testVArithmetic<int16_t, 4>() + & test1Arithmetic<int64_t>() + & testVArithmetic<int64_t, 2>() + & testVArithmetic<int64_t, 3>() + & testVArithmetic<int64_t, 4>() + & test1Arithmetic<uint>() + & testVArithmetic<uint, 2>() + & testVArithmetic<uint, 3>() + & testVArithmetic<uint, 4>() + & test1Arithmetic<uint8_t>() + & testVArithmetic<uint8_t, 2>() + & testVArithmetic<uint8_t, 3>() + & testVArithmetic<uint8_t, 4>() + & test1Arithmetic<uint16_t>() + & testVArithmetic<uint16_t, 2>() + & testVArithmetic<uint16_t, 3>() + & testVArithmetic<uint16_t, 4>() + & test1Arithmetic<uint64_t>() + & testVArithmetic<uint64_t, 2>() + & testVArithmetic<uint64_t, 3>() + & testVArithmetic<uint64_t, 4>() ; } @@ -166,11 +166,11 @@ void computeMain() { bool res0 = true - && testLogical() + & testLogical() ; bool res1 = true - && testArithmetic() + & testArithmetic() ; if (gl_LocalInvocationID.x == 3) { diff --git a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_None.slang b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_None.slang index 5300e6796..a1718bc9b 100644 --- a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_None.slang +++ b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-arithmetic_None.slang @@ -31,9 +31,9 @@ __generic<T : __BuiltinLogicalType> bool test1Logical() { return true #if defined(TEST_when_logical_operators_are_implemented) - && subgroupAnd(T(1)) == T(1) - && subgroupOr(T(1)) == T(1) - && subgroupXor(T(1)) == T(0) + & subgroupAnd(T(1)) == T(1) + & subgroupOr(T(1)) == T(1) + & subgroupXor(T(1)) == T(0) #endif // #if defined(TEST_when_logical_operators_are_implemented) ; } @@ -44,61 +44,61 @@ bool testVLogical() { return true #if defined(TEST_when_logical_operators_are_implemented) - && subgroupAnd(gvec(T(1))) == gvec(T(1)) - && subgroupOr(gvec(T(1))) == gvec(T(1)) - && subgroupXor(gvec(T(1))) == gvec(T(0)) + & subgroupAnd(gvec(T(1))) == gvec(T(1)) + & subgroupOr(gvec(T(1))) == gvec(T(1)) + & subgroupXor(gvec(T(1))) == gvec(T(0)) #endif // #if defined(TEST_when_logical_operators_are_implemented) ; } bool testLogical() { return true - && test1Logical<int>() - && testVLogical<int, 2>() - && testVLogical<int, 3>() - && testVLogical<int, 4>() - && test1Logical<int8_t>() - && testVLogical<int8_t, 2>() - && testVLogical<int8_t, 3>() - && testVLogical<int8_t, 4>() - && test1Logical<int16_t>() - && testVLogical<int16_t, 2>() - && testVLogical<int16_t, 3>() - && testVLogical<int16_t, 4>() - && test1Logical<int64_t>() - && testVLogical<int64_t, 2>() - && testVLogical<int64_t, 3>() - && testVLogical<int64_t, 4>() - && test1Logical<uint>() - && testVLogical<uint, 2>() - && testVLogical<uint, 3>() - && testVLogical<uint, 4>() - && test1Logical<uint8_t>() - && testVLogical<uint8_t, 2>() - && testVLogical<uint8_t, 3>() - && testVLogical<uint8_t, 4>() - && test1Logical<uint16_t>() - && testVLogical<uint16_t, 2>() - && testVLogical<uint16_t, 3>() - && testVLogical<uint16_t, 4>() - && test1Logical<uint64_t>() - && testVLogical<uint64_t, 2>() - && testVLogical<uint64_t, 3>() - && testVLogical<uint64_t, 4>() - && test1Logical<bool>() - && testVLogical<bool, 2>() - && testVLogical<bool, 3>() - && testVLogical<bool, 4>() + & test1Logical<int>() + & testVLogical<int, 2>() + & testVLogical<int, 3>() + & testVLogical<int, 4>() + & test1Logical<int8_t>() + & testVLogical<int8_t, 2>() + & testVLogical<int8_t, 3>() + & testVLogical<int8_t, 4>() + & test1Logical<int16_t>() + & testVLogical<int16_t, 2>() + & testVLogical<int16_t, 3>() + & testVLogical<int16_t, 4>() + & test1Logical<int64_t>() + & testVLogical<int64_t, 2>() + & testVLogical<int64_t, 3>() + & testVLogical<int64_t, 4>() + & test1Logical<uint>() + & testVLogical<uint, 2>() + & testVLogical<uint, 3>() + & testVLogical<uint, 4>() + & test1Logical<uint8_t>() + & testVLogical<uint8_t, 2>() + & testVLogical<uint8_t, 3>() + & testVLogical<uint8_t, 4>() + & test1Logical<uint16_t>() + & testVLogical<uint16_t, 2>() + & testVLogical<uint16_t, 3>() + & testVLogical<uint16_t, 4>() + & test1Logical<uint64_t>() + & testVLogical<uint64_t, 2>() + & testVLogical<uint64_t, 3>() + & testVLogical<uint64_t, 4>() + & test1Logical<bool>() + & testVLogical<bool, 2>() + & testVLogical<bool, 3>() + & testVLogical<bool, 4>() ; } __generic<T : __BuiltinArithmeticType> bool test1Arithmetic() { return true - && subgroupAdd(T(1)) == T(local_size_x_v) // 32 - && subgroupMul(T(1)) == T(1) - && subgroupMin(T(1)) == T(1) - && subgroupMax(T(1)) == T(1) + & subgroupAdd(T(1)) == T(local_size_x_v) // 32 + & subgroupMul(T(1)) == T(1) + & subgroupMin(T(1)) == T(1) + & subgroupMax(T(1)) == T(1) ; } __generic<T : __BuiltinArithmeticType, let N : int> @@ -106,59 +106,59 @@ bool testVArithmetic() { typealias gvec = vector<T, N>; return true - && subgroupAdd(gvec(T(1))) == gvec(T(local_size_x_v)) // 32 - && subgroupMul(gvec(T(1))) == gvec(T(1)) - && subgroupMin(gvec(T(1))) == gvec(T(1)) - && subgroupMax(gvec(T(1))) == gvec(T(1)) + & subgroupAdd(gvec(T(1))) == gvec(T(local_size_x_v)) // 32 + & subgroupMul(gvec(T(1))) == gvec(T(1)) + & subgroupMin(gvec(T(1))) == gvec(T(1)) + & subgroupMax(gvec(T(1))) == gvec(T(1)) ; } bool testArithmetic() { return true - && test1Arithmetic<float>() - && testVArithmetic<float, 2>() - && testVArithmetic<float, 3>() - && testVArithmetic<float, 4>() - && test1Arithmetic<double>() // WARNING: intel GPU's lack FP64 support - && testVArithmetic<double, 2>() - && testVArithmetic<double, 3>() - && testVArithmetic<double, 4>() - && test1Arithmetic<half>() - && testVArithmetic<half, 2>() - && testVArithmetic<half, 3>() - && testVArithmetic<half, 4>() - && test1Arithmetic<int>() - && testVArithmetic<int, 2>() - && testVArithmetic<int, 3>() - && testVArithmetic<int, 4>() - && test1Arithmetic<int8_t>() - && testVArithmetic<int8_t, 2>() - && testVArithmetic<int8_t, 3>() - && testVArithmetic<int8_t, 4>() - && test1Arithmetic<int16_t>() - && testVArithmetic<int16_t, 2>() - && testVArithmetic<int16_t, 3>() - && testVArithmetic<int16_t, 4>() - && test1Arithmetic<int64_t>() - && testVArithmetic<int64_t, 2>() - && testVArithmetic<int64_t, 3>() - && testVArithmetic<int64_t, 4>() - && test1Arithmetic<uint>() - && testVArithmetic<uint, 2>() - && testVArithmetic<uint, 3>() - && testVArithmetic<uint, 4>() - && test1Arithmetic<uint8_t>() - && testVArithmetic<uint8_t, 2>() - && testVArithmetic<uint8_t, 3>() - && testVArithmetic<uint8_t, 4>() - && test1Arithmetic<uint16_t>() - && testVArithmetic<uint16_t, 2>() - && testVArithmetic<uint16_t, 3>() - && testVArithmetic<uint16_t, 4>() - && test1Arithmetic<uint64_t>() - && testVArithmetic<uint64_t, 2>() - && testVArithmetic<uint64_t, 3>() - && testVArithmetic<uint64_t, 4>() + & test1Arithmetic<float>() + & testVArithmetic<float, 2>() + & testVArithmetic<float, 3>() + & testVArithmetic<float, 4>() + & test1Arithmetic<double>() // WARNING: intel GPU's lack FP64 support + & testVArithmetic<double, 2>() + & testVArithmetic<double, 3>() + & testVArithmetic<double, 4>() + & test1Arithmetic<half>() + & testVArithmetic<half, 2>() + & testVArithmetic<half, 3>() + & testVArithmetic<half, 4>() + & test1Arithmetic<int>() + & testVArithmetic<int, 2>() + & testVArithmetic<int, 3>() + & testVArithmetic<int, 4>() + & test1Arithmetic<int8_t>() + & testVArithmetic<int8_t, 2>() + & testVArithmetic<int8_t, 3>() + & testVArithmetic<int8_t, 4>() + & test1Arithmetic<int16_t>() + & testVArithmetic<int16_t, 2>() + & testVArithmetic<int16_t, 3>() + & testVArithmetic<int16_t, 4>() + & test1Arithmetic<int64_t>() + & testVArithmetic<int64_t, 2>() + & testVArithmetic<int64_t, 3>() + & testVArithmetic<int64_t, 4>() + & test1Arithmetic<uint>() + & testVArithmetic<uint, 2>() + & testVArithmetic<uint, 3>() + & testVArithmetic<uint, 4>() + & test1Arithmetic<uint8_t>() + & testVArithmetic<uint8_t, 2>() + & testVArithmetic<uint8_t, 3>() + & testVArithmetic<uint8_t, 4>() + & test1Arithmetic<uint16_t>() + & testVArithmetic<uint16_t, 2>() + & testVArithmetic<uint16_t, 3>() + & testVArithmetic<uint16_t, 4>() + & test1Arithmetic<uint64_t>() + & testVArithmetic<uint64_t, 2>() + & testVArithmetic<uint64_t, 3>() + & testVArithmetic<uint64_t, 4>() ; } @@ -166,11 +166,11 @@ void computeMain() { bool res0 = true - && testLogical() + & testLogical() ; bool res1 = true - && testArithmetic() + & testArithmetic() ; if (gl_LocalInvocationID.x == 3) { diff --git a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-ballot.slang b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-ballot.slang index 8bbd60689..d6947d2d4 100644 --- a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-ballot.slang +++ b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-ballot.slang @@ -25,8 +25,8 @@ layout(local_size_x = 32) in; __generic<T : __BuiltinLogicalType> bool test1BroadcastX() { return true - && subgroupBroadcast(T(1), 0) == T(1) - && subgroupBroadcastFirst(T(1)) == T(1) + & subgroupBroadcast(T(1), 0) == T(1) + & subgroupBroadcastFirst(T(1)) == T(1) ; } __generic<T : __BuiltinLogicalType, let N : int> @@ -34,16 +34,16 @@ bool testVBroadcastX() { typealias gvec = vector<T, N>; return true - && subgroupBroadcast(gvec(T(1)), 0) == gvec(T(1)) - && subgroupBroadcastFirst(gvec(T(1))) == gvec(T(1)) + & subgroupBroadcast(gvec(T(1)), 0) == gvec(T(1)) + & subgroupBroadcastFirst(gvec(T(1))) == gvec(T(1)) ; } __generic<T : __BuiltinFloatingPointType> bool test1BroadcastX() { return true - && subgroupBroadcast(T(1), 0) == T(1) - && subgroupBroadcastFirst(T(1)) == T(1) + & subgroupBroadcast(T(1), 0) == T(1) + & subgroupBroadcastFirst(T(1)) == T(1) ; } __generic<T : __BuiltinFloatingPointType, let N : int> @@ -51,85 +51,85 @@ bool testVBroadcastX() { typealias gvec = vector<T, N>; return true - && subgroupBroadcast(gvec(T(1)), 0) == gvec(T(1)) - && subgroupBroadcastFirst(gvec(T(1))) == gvec(T(1)) + & subgroupBroadcast(gvec(T(1)), 0) == gvec(T(1)) + & subgroupBroadcastFirst(gvec(T(1))) == gvec(T(1)) ; } bool testBroadcastX() { return true - && test1BroadcastX<float>() - && testVBroadcastX<float, 2>() - && testVBroadcastX<float, 3>() - && testVBroadcastX<float, 4>() - && test1BroadcastX<double>() // WARNING: intel GPU's lack FP64 support - && testVBroadcastX<double, 2>() - && testVBroadcastX<double, 3>() - && testVBroadcastX<double, 4>() - && test1BroadcastX<half>() - && testVBroadcastX<half, 2>() - && testVBroadcastX<half, 3>() - && testVBroadcastX<half, 4>() - && test1BroadcastX<int>() - && testVBroadcastX<int, 2>() - && testVBroadcastX<int, 3>() - && testVBroadcastX<int, 4>() - && test1BroadcastX<int8_t>() - && testVBroadcastX<int8_t, 2>() - && testVBroadcastX<int8_t, 3>() - && testVBroadcastX<int8_t, 4>() - && test1BroadcastX<int16_t>() - && testVBroadcastX<int16_t, 2>() - && testVBroadcastX<int16_t, 3>() - && testVBroadcastX<int16_t, 4>() - && test1BroadcastX<int64_t>() - && testVBroadcastX<int64_t, 2>() - && testVBroadcastX<int64_t, 3>() - && testVBroadcastX<int64_t, 4>() - && test1BroadcastX<uint>() - && testVBroadcastX<uint, 2>() - && testVBroadcastX<uint, 3>() - && testVBroadcastX<uint, 4>() - && test1BroadcastX<uint8_t>() - && testVBroadcastX<uint8_t, 2>() - && testVBroadcastX<uint8_t, 3>() - && testVBroadcastX<uint8_t, 4>() - && test1BroadcastX<uint16_t>() - && testVBroadcastX<uint16_t, 2>() - && testVBroadcastX<uint16_t, 3>() - && testVBroadcastX<uint16_t, 4>() - && test1BroadcastX<uint64_t>() - && testVBroadcastX<uint64_t, 2>() - && testVBroadcastX<uint64_t, 3>() - && testVBroadcastX<uint64_t, 4>() - && test1BroadcastX<bool>() - && testVBroadcastX<bool, 2>() - && testVBroadcastX<bool, 3>() - && testVBroadcastX<bool, 4>() + & test1BroadcastX<float>() + & testVBroadcastX<float, 2>() + & testVBroadcastX<float, 3>() + & testVBroadcastX<float, 4>() + & test1BroadcastX<double>() // WARNING: intel GPU's lack FP64 support + & testVBroadcastX<double, 2>() + & testVBroadcastX<double, 3>() + & testVBroadcastX<double, 4>() + & test1BroadcastX<half>() + & testVBroadcastX<half, 2>() + & testVBroadcastX<half, 3>() + & testVBroadcastX<half, 4>() + & test1BroadcastX<int>() + & testVBroadcastX<int, 2>() + & testVBroadcastX<int, 3>() + & testVBroadcastX<int, 4>() + & test1BroadcastX<int8_t>() + & testVBroadcastX<int8_t, 2>() + & testVBroadcastX<int8_t, 3>() + & testVBroadcastX<int8_t, 4>() + & test1BroadcastX<int16_t>() + & testVBroadcastX<int16_t, 2>() + & testVBroadcastX<int16_t, 3>() + & testVBroadcastX<int16_t, 4>() + & test1BroadcastX<int64_t>() + & testVBroadcastX<int64_t, 2>() + & testVBroadcastX<int64_t, 3>() + & testVBroadcastX<int64_t, 4>() + & test1BroadcastX<uint>() + & testVBroadcastX<uint, 2>() + & testVBroadcastX<uint, 3>() + & testVBroadcastX<uint, 4>() + & test1BroadcastX<uint8_t>() + & testVBroadcastX<uint8_t, 2>() + & testVBroadcastX<uint8_t, 3>() + & testVBroadcastX<uint8_t, 4>() + & test1BroadcastX<uint16_t>() + & testVBroadcastX<uint16_t, 2>() + & testVBroadcastX<uint16_t, 3>() + & testVBroadcastX<uint16_t, 4>() + & test1BroadcastX<uint64_t>() + & testVBroadcastX<uint64_t, 2>() + & testVBroadcastX<uint64_t, 3>() + & testVBroadcastX<uint64_t, 4>() + & test1BroadcastX<bool>() + & testVBroadcastX<bool, 2>() + & testVBroadcastX<bool, 3>() + & testVBroadcastX<bool, 4>() ; } bool testBallot() { return true - && (subgroupBallot(true).x == 0xFFFFFFFF) - && (subgroupInverseBallot(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) == true) - && (subgroupBallotBitExtract(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), 0) == true) - && (subgroupBallotBitCount(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) == 32) - && (subgroupBallotInclusiveBitCount(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) != 0) + & (subgroupBallot(true).x == 0xFFFFFFFF) + & (subgroupInverseBallot(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) == true) + & (subgroupBallotBitExtract(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), 0) == true) + & (subgroupBallotBitCount(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) == 32) + & (subgroupBallotInclusiveBitCount(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) != 0) #ifdef TEST_when_glsl_subgroupBallotExclusiveBitCount_is_not_bugged - && (subgroupBallotExclusiveBitCount(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) != 0) + & (subgroupBallotExclusiveBitCount(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) != 0) #endif - && (subgroupBallotFindLSB(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) == 0) - && (subgroupBallotFindMSB(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) == 31) + & (subgroupBallotFindLSB(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) == 0) + & (subgroupBallotFindMSB(uvec4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) == 31) ; } void computeMain() { outputBuffer.data[0] = true - && testBroadcastX() + & testBroadcastX() ; outputBuffer.data[1] = true - && testBallot() + & testBallot() ; // CHECK_GLSL: void main( diff --git a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-clustered.slang b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-clustered.slang index 9e9b089d2..c40421aa1 100644 --- a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-clustered.slang +++ b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-clustered.slang @@ -23,9 +23,9 @@ layout(local_size_x = 32) in; __generic<T : __BuiltinLogicalType> bool test1Logical() { return true - && subgroupClusteredAnd(T(1), 1) == T(1) - && subgroupClusteredOr(T(1), 1) == T(1) - && subgroupClusteredXor(T(1), 1) == T(1) + & subgroupClusteredAnd(T(1), 1) == T(1) + & subgroupClusteredOr(T(1), 1) == T(1) + & subgroupClusteredXor(T(1), 1) == T(1) ; } @@ -34,60 +34,60 @@ bool testVLogical() { typealias gvec = vector<T, N>; return true - && subgroupClusteredAnd(gvec(T(1)), 1) == gvec(T(1)) - && subgroupClusteredOr(gvec(T(1)), 1) == gvec(T(1)) - && subgroupClusteredXor(gvec(T(1)), 1) == gvec(T(1)) + & subgroupClusteredAnd(gvec(T(1)), 1) == gvec(T(1)) + & subgroupClusteredOr(gvec(T(1)), 1) == gvec(T(1)) + & subgroupClusteredXor(gvec(T(1)), 1) == gvec(T(1)) ; } bool testLogical() { return true - && test1Logical<int>() - && testVLogical<int, 2>() - && testVLogical<int, 3>() - && testVLogical<int, 4>() - && test1Logical<int8_t>() - && testVLogical<int8_t, 2>() - && testVLogical<int8_t, 3>() - && testVLogical<int8_t, 4>() - && test1Logical<int16_t>() - && testVLogical<int16_t, 2>() - && testVLogical<int16_t, 3>() - && testVLogical<int16_t, 4>() - && test1Logical<int64_t>() - && testVLogical<int64_t, 2>() - && testVLogical<int64_t, 3>() - && testVLogical<int64_t, 4>() - && test1Logical<uint>() - && testVLogical<uint, 2>() - && testVLogical<uint, 3>() - && testVLogical<uint, 4>() - && test1Logical<uint8_t>() - && testVLogical<uint8_t, 2>() - && testVLogical<uint8_t, 3>() - && testVLogical<uint8_t, 4>() - && test1Logical<uint16_t>() - && testVLogical<uint16_t, 2>() - && testVLogical<uint16_t, 3>() - && testVLogical<uint16_t, 4>() - && test1Logical<uint64_t>() - && testVLogical<uint64_t, 2>() - && testVLogical<uint64_t, 3>() - && testVLogical<uint64_t, 4>() - && test1Logical<bool>() - && testVLogical<bool, 2>() - && testVLogical<bool, 3>() - && testVLogical<bool, 4>() + & test1Logical<int>() + & testVLogical<int, 2>() + & testVLogical<int, 3>() + & testVLogical<int, 4>() + & test1Logical<int8_t>() + & testVLogical<int8_t, 2>() + & testVLogical<int8_t, 3>() + & testVLogical<int8_t, 4>() + & test1Logical<int16_t>() + & testVLogical<int16_t, 2>() + & testVLogical<int16_t, 3>() + & testVLogical<int16_t, 4>() + & test1Logical<int64_t>() + & testVLogical<int64_t, 2>() + & testVLogical<int64_t, 3>() + & testVLogical<int64_t, 4>() + & test1Logical<uint>() + & testVLogical<uint, 2>() + & testVLogical<uint, 3>() + & testVLogical<uint, 4>() + & test1Logical<uint8_t>() + & testVLogical<uint8_t, 2>() + & testVLogical<uint8_t, 3>() + & testVLogical<uint8_t, 4>() + & test1Logical<uint16_t>() + & testVLogical<uint16_t, 2>() + & testVLogical<uint16_t, 3>() + & testVLogical<uint16_t, 4>() + & test1Logical<uint64_t>() + & testVLogical<uint64_t, 2>() + & testVLogical<uint64_t, 3>() + & testVLogical<uint64_t, 4>() + & test1Logical<bool>() + & testVLogical<bool, 2>() + & testVLogical<bool, 3>() + & testVLogical<bool, 4>() ; } __generic<T : __BuiltinArithmeticType> bool test1Arithmetic() { return true - && subgroupClusteredAdd(T(1), 1) == T(1) - && subgroupClusteredMul(T(1), 1) == T(1) - && subgroupClusteredMin(T(1), 1) == T(1) - && subgroupClusteredMax(T(1), 1) == T(1) + & subgroupClusteredAdd(T(1), 1) == T(1) + & subgroupClusteredMul(T(1), 1) == T(1) + & subgroupClusteredMin(T(1), 1) == T(1) + & subgroupClusteredMax(T(1), 1) == T(1) ; } @@ -96,69 +96,69 @@ bool testVArithmetic() { typealias gvec = vector<T, N>; return true - && subgroupClusteredAdd(gvec(T(1)), 1) == gvec(T(1)) - && subgroupClusteredMul(gvec(T(1)), 1) == gvec(T(1)) - && subgroupClusteredMin(gvec(T(1)), 1) == gvec(T(1)) - && subgroupClusteredMax(gvec(T(1)), 1) == gvec(T(1)) + & subgroupClusteredAdd(gvec(T(1)), 1) == gvec(T(1)) + & subgroupClusteredMul(gvec(T(1)), 1) == gvec(T(1)) + & subgroupClusteredMin(gvec(T(1)), 1) == gvec(T(1)) + & subgroupClusteredMax(gvec(T(1)), 1) == gvec(T(1)) ; } bool testArithmetic() { return true - && test1Arithmetic<float>() - && testVArithmetic<float, 2>() - && testVArithmetic<float, 3>() - && testVArithmetic<float, 4>() - && test1Arithmetic<double>() // WARNING: intel GPU's lack FP64 support - && testVArithmetic<double, 2>() - && testVArithmetic<double, 3>() - && testVArithmetic<double, 4>() - && test1Arithmetic<half>() - && testVArithmetic<half, 2>() - && testVArithmetic<half, 3>() - && testVArithmetic<half, 4>() - && test1Arithmetic<int>() - && testVArithmetic<int, 2>() - && testVArithmetic<int, 3>() - && testVArithmetic<int, 4>() - && test1Arithmetic<int8_t>() - && testVArithmetic<int8_t, 2>() - && testVArithmetic<int8_t, 3>() - && testVArithmetic<int8_t, 4>() - && test1Arithmetic<int16_t>() - && testVArithmetic<int16_t, 2>() - && testVArithmetic<int16_t, 3>() - && testVArithmetic<int16_t, 4>() - && test1Arithmetic<int64_t>() - && testVArithmetic<int64_t, 2>() - && testVArithmetic<int64_t, 3>() - && testVArithmetic<int64_t, 4>() - && test1Arithmetic<uint>() - && testVArithmetic<uint, 2>() - && testVArithmetic<uint, 3>() - && testVArithmetic<uint, 4>() - && test1Arithmetic<uint8_t>() - && testVArithmetic<uint8_t, 2>() - && testVArithmetic<uint8_t, 3>() - && testVArithmetic<uint8_t, 4>() - && test1Arithmetic<uint16_t>() - && testVArithmetic<uint16_t, 2>() - && testVArithmetic<uint16_t, 3>() - && testVArithmetic<uint16_t, 4>() - && test1Arithmetic<uint64_t>() - && testVArithmetic<uint64_t, 2>() - && testVArithmetic<uint64_t, 3>() - && testVArithmetic<uint64_t, 4>() + & test1Arithmetic<float>() + & testVArithmetic<float, 2>() + & testVArithmetic<float, 3>() + & testVArithmetic<float, 4>() + & test1Arithmetic<double>() // WARNING: intel GPU's lack FP64 support + & testVArithmetic<double, 2>() + & testVArithmetic<double, 3>() + & testVArithmetic<double, 4>() + & test1Arithmetic<half>() + & testVArithmetic<half, 2>() + & testVArithmetic<half, 3>() + & testVArithmetic<half, 4>() + & test1Arithmetic<int>() + & testVArithmetic<int, 2>() + & testVArithmetic<int, 3>() + & testVArithmetic<int, 4>() + & test1Arithmetic<int8_t>() + & testVArithmetic<int8_t, 2>() + & testVArithmetic<int8_t, 3>() + & testVArithmetic<int8_t, 4>() + & test1Arithmetic<int16_t>() + & testVArithmetic<int16_t, 2>() + & testVArithmetic<int16_t, 3>() + & testVArithmetic<int16_t, 4>() + & test1Arithmetic<int64_t>() + & testVArithmetic<int64_t, 2>() + & testVArithmetic<int64_t, 3>() + & testVArithmetic<int64_t, 4>() + & test1Arithmetic<uint>() + & testVArithmetic<uint, 2>() + & testVArithmetic<uint, 3>() + & testVArithmetic<uint, 4>() + & test1Arithmetic<uint8_t>() + & testVArithmetic<uint8_t, 2>() + & testVArithmetic<uint8_t, 3>() + & testVArithmetic<uint8_t, 4>() + & test1Arithmetic<uint16_t>() + & testVArithmetic<uint16_t, 2>() + & testVArithmetic<uint16_t, 3>() + & testVArithmetic<uint16_t, 4>() + & test1Arithmetic<uint64_t>() + & testVArithmetic<uint64_t, 2>() + & testVArithmetic<uint64_t, 3>() + & testVArithmetic<uint64_t, 4>() ; } void computeMain() { outputBuffer.data[0] = true - && testLogical() + & testLogical() ; outputBuffer.data[1] = true - && testArithmetic() + & testArithmetic() ; // CHECK_GLSL: void main( diff --git a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-quad.slang b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-quad.slang index 5ed6398b2..3465f1b26 100644 --- a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-quad.slang +++ b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-quad.slang @@ -22,10 +22,10 @@ layout(local_size_x = 4) in; __generic<T : __BuiltinLogicalType> bool test1QuadX() { return true - && subgroupQuadSwapHorizontal(T(2)) == T(2) - && subgroupQuadSwapVertical(T(2)) == T(2) - && subgroupQuadSwapDiagonal(T(3)) == T(3) - && subgroupQuadBroadcast(T(1), 1) == T(1) + & subgroupQuadSwapHorizontal(T(2)) == T(2) + & subgroupQuadSwapVertical(T(2)) == T(2) + & subgroupQuadSwapDiagonal(T(3)) == T(3) + & subgroupQuadBroadcast(T(1), 1) == T(1) ; } __generic<T : __BuiltinLogicalType, let N : int> @@ -33,20 +33,20 @@ bool testVQuadX() { typealias gvec = vector<T, N>; return true - && subgroupQuadSwapHorizontal(gvec(T(2))) == gvec(T(2)) - && subgroupQuadSwapVertical(gvec(T(2))) == gvec(T(2)) - && subgroupQuadSwapDiagonal(gvec(T(3))) == gvec(T(3)) - && subgroupQuadBroadcast(gvec(T(1)), 1) == gvec(T(1)) + & subgroupQuadSwapHorizontal(gvec(T(2))) == gvec(T(2)) + & subgroupQuadSwapVertical(gvec(T(2))) == gvec(T(2)) + & subgroupQuadSwapDiagonal(gvec(T(3))) == gvec(T(3)) + & subgroupQuadBroadcast(gvec(T(1)), 1) == gvec(T(1)) ; } __generic<T : __BuiltinFloatingPointType> bool test1QuadX() { return true - && subgroupQuadSwapHorizontal(T(2)) == T(2) - && subgroupQuadSwapVertical(T(2)) == T(2) - && subgroupQuadSwapDiagonal(T(3)) == T(3) - && subgroupQuadBroadcast(T(1), 1) == T(1) + & subgroupQuadSwapHorizontal(T(2)) == T(2) + & subgroupQuadSwapVertical(T(2)) == T(2) + & subgroupQuadSwapDiagonal(T(3)) == T(3) + & subgroupQuadBroadcast(T(1), 1) == T(1) ; } __generic<T : __BuiltinFloatingPointType, let N : int> @@ -54,62 +54,62 @@ bool testVQuadX() { typealias gvec = vector<T, N>; return true - && subgroupQuadSwapHorizontal(gvec(T(2))) == gvec(T(2)) - && subgroupQuadSwapVertical(gvec(T(2))) == gvec(T(2)) - && subgroupQuadSwapDiagonal(gvec(T(3))) == gvec(T(3)) - && subgroupQuadBroadcast(gvec(T(1)), 1) == gvec(T(1)) + & subgroupQuadSwapHorizontal(gvec(T(2))) == gvec(T(2)) + & subgroupQuadSwapVertical(gvec(T(2))) == gvec(T(2)) + & subgroupQuadSwapDiagonal(gvec(T(3))) == gvec(T(3)) + & subgroupQuadBroadcast(gvec(T(1)), 1) == gvec(T(1)) ; } bool testQuadSwapX() { return true - && test1QuadX<float>() - && testVQuadX<float, 2>() - && testVQuadX<float, 3>() - && testVQuadX<float, 4>() - && test1QuadX<double>() // WARNING: intel GPU's lack FP64 support - && testVQuadX<double, 2>() - && testVQuadX<double, 3>() - && testVQuadX<double, 4>() - && test1QuadX<half>() - && testVQuadX<half, 2>() - && testVQuadX<half, 3>() - && testVQuadX<half, 4>() - && test1QuadX<int>() - && testVQuadX<int, 2>() - && testVQuadX<int, 3>() - && testVQuadX<int, 4>() - && test1QuadX<int8_t>() - && testVQuadX<int8_t, 2>() - && testVQuadX<int8_t, 3>() - && testVQuadX<int8_t, 4>() - && test1QuadX<int16_t>() - && testVQuadX<int16_t, 2>() - && testVQuadX<int16_t, 3>() - && testVQuadX<int16_t, 4>() - && test1QuadX<int64_t>() - && testVQuadX<int64_t, 2>() - && testVQuadX<int64_t, 3>() - && testVQuadX<int64_t, 4>() - && test1QuadX<uint>() - && testVQuadX<uint, 2>() - && testVQuadX<uint, 3>() - && testVQuadX<uint, 4>() - && test1QuadX<uint8_t>() - && testVQuadX<uint8_t, 2>() - && testVQuadX<uint8_t, 3>() - && testVQuadX<uint8_t, 4>() - && test1QuadX<uint16_t>() - && testVQuadX<uint16_t, 2>() - && testVQuadX<uint16_t, 3>() - && testVQuadX<uint16_t, 4>() - && test1QuadX<uint64_t>() - && testVQuadX<uint64_t, 2>() - && testVQuadX<uint64_t, 3>() - && testVQuadX<uint64_t, 4>() - && test1QuadX<bool>() - && testVQuadX<bool, 2>() - && testVQuadX<bool, 3>() - && testVQuadX<bool, 4>() + & test1QuadX<float>() + & testVQuadX<float, 2>() + & testVQuadX<float, 3>() + & testVQuadX<float, 4>() + & test1QuadX<double>() // WARNING: intel GPU's lack FP64 support + & testVQuadX<double, 2>() + & testVQuadX<double, 3>() + & testVQuadX<double, 4>() + & test1QuadX<half>() + & testVQuadX<half, 2>() + & testVQuadX<half, 3>() + & testVQuadX<half, 4>() + & test1QuadX<int>() + & testVQuadX<int, 2>() + & testVQuadX<int, 3>() + & testVQuadX<int, 4>() + & test1QuadX<int8_t>() + & testVQuadX<int8_t, 2>() + & testVQuadX<int8_t, 3>() + & testVQuadX<int8_t, 4>() + & test1QuadX<int16_t>() + & testVQuadX<int16_t, 2>() + & testVQuadX<int16_t, 3>() + & testVQuadX<int16_t, 4>() + & test1QuadX<int64_t>() + & testVQuadX<int64_t, 2>() + & testVQuadX<int64_t, 3>() + & testVQuadX<int64_t, 4>() + & test1QuadX<uint>() + & testVQuadX<uint, 2>() + & testVQuadX<uint, 3>() + & testVQuadX<uint, 4>() + & test1QuadX<uint8_t>() + & testVQuadX<uint8_t, 2>() + & testVQuadX<uint8_t, 3>() + & testVQuadX<uint8_t, 4>() + & test1QuadX<uint16_t>() + & testVQuadX<uint16_t, 2>() + & testVQuadX<uint16_t, 3>() + & testVQuadX<uint16_t, 4>() + & test1QuadX<uint64_t>() + & testVQuadX<uint64_t, 2>() + & testVQuadX<uint64_t, 3>() + & testVQuadX<uint64_t, 4>() + & test1QuadX<bool>() + & testVQuadX<bool, 2>() + & testVQuadX<bool, 3>() + & testVQuadX<bool, 4>() ; } @@ -117,7 +117,7 @@ void computeMain() { outputBuffer.data[0] = true - && testQuadSwapX() + & testQuadSwapX() ; // CHECK_GLSL: void main( diff --git a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-shuffle-relative.slang b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-shuffle-relative.slang index 0e187c568..ea4331dbe 100644 --- a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-shuffle-relative.slang +++ b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-shuffle-relative.slang @@ -23,8 +23,8 @@ layout(local_size_x = 32) in; __generic<T : __BuiltinLogicalType> bool test1ShuffleX() { return true - && subgroupShuffleUp(T(1), 1) == T(1) - && subgroupShuffleDown(T(1), 1) == T(1) + & subgroupShuffleUp(T(1), 1) == T(1) + & subgroupShuffleDown(T(1), 1) == T(1) ; } __generic<T : __BuiltinLogicalType, let N : int> @@ -32,16 +32,16 @@ bool testVShuffleX() { typealias gvec = vector<T, N>; return true - && subgroupShuffleUp(gvec(T(1)), 1) == gvec(T(1)) - && subgroupShuffleDown(gvec(T(1)), 1) == gvec(T(1)) + & subgroupShuffleUp(gvec(T(1)), 1) == gvec(T(1)) + & subgroupShuffleDown(gvec(T(1)), 1) == gvec(T(1)) ; } __generic<T : __BuiltinFloatingPointType> bool test1ShuffleX() { return true - && subgroupShuffleUp(T(1), 1) == T(1) - && subgroupShuffleDown(T(1), 1) == T(1) + & subgroupShuffleUp(T(1), 1) == T(1) + & subgroupShuffleDown(T(1), 1) == T(1) ; } __generic<T : __BuiltinFloatingPointType, let N : int> @@ -49,67 +49,67 @@ bool testVShuffleX() { typealias gvec = vector<T, N>; return true - && subgroupShuffleUp(gvec(T(1)), 1) == gvec(T(1)) - && subgroupShuffleDown(gvec(T(1)), 1) == gvec(T(1)) + & subgroupShuffleUp(gvec(T(1)), 1) == gvec(T(1)) + & subgroupShuffleDown(gvec(T(1)), 1) == gvec(T(1)) ; } bool testShuffleX() { return true - && test1ShuffleX<float>() - && testVShuffleX<float, 2>() - && testVShuffleX<float, 3>() - && testVShuffleX<float, 4>() - && test1ShuffleX<double>() // WARNING: intel GPU's lack FP64 support - && testVShuffleX<double, 2>() - && testVShuffleX<double, 3>() - && testVShuffleX<double, 4>() - && test1ShuffleX<half>() - && testVShuffleX<half, 2>() - && testVShuffleX<half, 3>() - && testVShuffleX<half, 4>() - && test1ShuffleX<int>() - && testVShuffleX<int, 2>() - && testVShuffleX<int, 3>() - && testVShuffleX<int, 4>() - && test1ShuffleX<int8_t>() - && testVShuffleX<int8_t, 2>() - && testVShuffleX<int8_t, 3>() - && testVShuffleX<int8_t, 4>() - && test1ShuffleX<int16_t>() - && testVShuffleX<int16_t, 2>() - && testVShuffleX<int16_t, 3>() - && testVShuffleX<int16_t, 4>() - && test1ShuffleX<int64_t>() - && testVShuffleX<int64_t, 2>() - && testVShuffleX<int64_t, 3>() - && testVShuffleX<int64_t, 4>() - && test1ShuffleX<uint>() - && testVShuffleX<uint, 2>() - && testVShuffleX<uint, 3>() - && testVShuffleX<uint, 4>() - && test1ShuffleX<uint8_t>() - && testVShuffleX<uint8_t, 2>() - && testVShuffleX<uint8_t, 3>() - && testVShuffleX<uint8_t, 4>() - && test1ShuffleX<uint16_t>() - && testVShuffleX<uint16_t, 2>() - && testVShuffleX<uint16_t, 3>() - && testVShuffleX<uint16_t, 4>() - && test1ShuffleX<uint64_t>() - && testVShuffleX<uint64_t, 2>() - && testVShuffleX<uint64_t, 3>() - && testVShuffleX<uint64_t, 4>() - && test1ShuffleX<bool>() - && testVShuffleX<bool, 2>() - && testVShuffleX<bool, 3>() - && testVShuffleX<bool, 4>() + & test1ShuffleX<float>() + & testVShuffleX<float, 2>() + & testVShuffleX<float, 3>() + & testVShuffleX<float, 4>() + & test1ShuffleX<double>() // WARNING: intel GPU's lack FP64 support + & testVShuffleX<double, 2>() + & testVShuffleX<double, 3>() + & testVShuffleX<double, 4>() + & test1ShuffleX<half>() + & testVShuffleX<half, 2>() + & testVShuffleX<half, 3>() + & testVShuffleX<half, 4>() + & test1ShuffleX<int>() + & testVShuffleX<int, 2>() + & testVShuffleX<int, 3>() + & testVShuffleX<int, 4>() + & test1ShuffleX<int8_t>() + & testVShuffleX<int8_t, 2>() + & testVShuffleX<int8_t, 3>() + & testVShuffleX<int8_t, 4>() + & test1ShuffleX<int16_t>() + & testVShuffleX<int16_t, 2>() + & testVShuffleX<int16_t, 3>() + & testVShuffleX<int16_t, 4>() + & test1ShuffleX<int64_t>() + & testVShuffleX<int64_t, 2>() + & testVShuffleX<int64_t, 3>() + & testVShuffleX<int64_t, 4>() + & test1ShuffleX<uint>() + & testVShuffleX<uint, 2>() + & testVShuffleX<uint, 3>() + & testVShuffleX<uint, 4>() + & test1ShuffleX<uint8_t>() + & testVShuffleX<uint8_t, 2>() + & testVShuffleX<uint8_t, 3>() + & testVShuffleX<uint8_t, 4>() + & test1ShuffleX<uint16_t>() + & testVShuffleX<uint16_t, 2>() + & testVShuffleX<uint16_t, 3>() + & testVShuffleX<uint16_t, 4>() + & test1ShuffleX<uint64_t>() + & testVShuffleX<uint64_t, 2>() + & testVShuffleX<uint64_t, 3>() + & testVShuffleX<uint64_t, 4>() + & test1ShuffleX<bool>() + & testVShuffleX<bool, 2>() + & testVShuffleX<bool, 3>() + & testVShuffleX<bool, 4>() ; } void computeMain() { outputBuffer.data[0] = true - && testShuffleX() + & testShuffleX() ; // CHECK_GLSL: void main( diff --git a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-shuffle.slang b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-shuffle.slang index 5dca1a588..ff3baf267 100644 --- a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-shuffle.slang +++ b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-shuffle.slang @@ -31,9 +31,9 @@ layout(local_size_x = 32) in; __generic<T : __BuiltinLogicalType> bool test1ShuffleX() { return true - && subgroupShuffle(T(1), 1) == T(1) + & subgroupShuffle(T(1), 1) == T(1) #ifdef TEST_when_subgroupShuffleXor_is_implemented - && subgroupShuffleXor(T(1), 1) == T(1) + & subgroupShuffleXor(T(1), 1) == T(1) #endif // #ifdef TEST_when_subgroupShuffleXor_is_implemented ; } @@ -42,9 +42,9 @@ bool testVShuffleX() { typealias gvec = vector<T, N>; return true - && subgroupShuffle(gvec(T(1)), 1) == gvec(T(1)) + & subgroupShuffle(gvec(T(1)), 1) == gvec(T(1)) #ifdef TEST_when_subgroupShuffleXor_is_implemented - && subgroupShuffleXor(gvec(T(1)), 1) == gvec(T(1)) + & subgroupShuffleXor(gvec(T(1)), 1) == gvec(T(1)) #endif // #ifdef TEST_when_subgroupShuffleXor_is_implemented ; } @@ -52,10 +52,10 @@ bool testVShuffleX() { __generic<T : __BuiltinFloatingPointType> bool test1ShuffleX() { return true - && subgroupShuffle(T(1), 1) == T(1) -#if !defined(TARGET_CUDA) && !defined(TARGET_HLSL) - && subgroupShuffleXor(T(1), 1) == T(1) -#endif // #if !defined(TARGET_CUDA) && !defined(TARGET_HLSL) + & subgroupShuffle(T(1), 1) == T(1) +#if !defined(TARGET_CUDA) & !defined(TARGET_HLSL) + & subgroupShuffleXor(T(1), 1) == T(1) +#endif // #if !defined(TARGET_CUDA) & !defined(TARGET_HLSL) ; } __generic<T : __BuiltinFloatingPointType, let N : int> @@ -63,62 +63,62 @@ bool testVShuffleX() { typealias gvec = vector<T, N>; return true - && subgroupShuffle(gvec(T(1)), 1) == gvec(T(1)) -#if !defined(TARGET_CUDA) && !defined(TARGET_HLSL) - && subgroupShuffleXor(gvec(T(1)), 1) == gvec(T(1)) -#endif // #if !defined(TARGET_CUDA) && !defined(TARGET_HLSL) + & subgroupShuffle(gvec(T(1)), 1) == gvec(T(1)) +#if !defined(TARGET_CUDA) & !defined(TARGET_HLSL) + & subgroupShuffleXor(gvec(T(1)), 1) == gvec(T(1)) +#endif // #if !defined(TARGET_CUDA) & !defined(TARGET_HLSL) ; } bool testShuffleX() { return true - && test1ShuffleX<float>() - && testVShuffleX<float, 2>() - && testVShuffleX<float, 3>() - && testVShuffleX<float, 4>() - && test1ShuffleX<double>() // WARNING: intel GPU's lack FP64 support - && testVShuffleX<double, 2>() - && testVShuffleX<double, 3>() - && testVShuffleX<double, 4>() - && test1ShuffleX<half>() - && testVShuffleX<half, 2>() - && testVShuffleX<half, 3>() - && testVShuffleX<half, 4>() - && test1ShuffleX<int>() - && testVShuffleX<int, 2>() - && testVShuffleX<int, 3>() - && testVShuffleX<int, 4>() - && test1ShuffleX<int8_t>() - && testVShuffleX<int8_t, 2>() - && testVShuffleX<int8_t, 3>() - && testVShuffleX<int8_t, 4>() - && test1ShuffleX<int16_t>() - && testVShuffleX<int16_t, 2>() - && testVShuffleX<int16_t, 3>() - && testVShuffleX<int16_t, 4>() - && test1ShuffleX<int64_t>() - && testVShuffleX<int64_t, 2>() - && testVShuffleX<int64_t, 3>() - && testVShuffleX<int64_t, 4>() - && test1ShuffleX<uint>() - && testVShuffleX<uint, 2>() - && testVShuffleX<uint, 3>() - && testVShuffleX<uint, 4>() - && test1ShuffleX<uint8_t>() - && testVShuffleX<uint8_t, 2>() - && testVShuffleX<uint8_t, 3>() - && testVShuffleX<uint8_t, 4>() - && test1ShuffleX<uint16_t>() - && testVShuffleX<uint16_t, 2>() - && testVShuffleX<uint16_t, 3>() - && testVShuffleX<uint16_t, 4>() - && test1ShuffleX<uint64_t>() - && testVShuffleX<uint64_t, 2>() - && testVShuffleX<uint64_t, 3>() - && testVShuffleX<uint64_t, 4>() - && test1ShuffleX<bool>() - && testVShuffleX<bool, 2>() - && testVShuffleX<bool, 3>() - && testVShuffleX<bool, 4>() + & test1ShuffleX<float>() + & testVShuffleX<float, 2>() + & testVShuffleX<float, 3>() + & testVShuffleX<float, 4>() + & test1ShuffleX<double>() // WARNING: intel GPU's lack FP64 support + & testVShuffleX<double, 2>() + & testVShuffleX<double, 3>() + & testVShuffleX<double, 4>() + & test1ShuffleX<half>() + & testVShuffleX<half, 2>() + & testVShuffleX<half, 3>() + & testVShuffleX<half, 4>() + & test1ShuffleX<int>() + & testVShuffleX<int, 2>() + & testVShuffleX<int, 3>() + & testVShuffleX<int, 4>() + & test1ShuffleX<int8_t>() + & testVShuffleX<int8_t, 2>() + & testVShuffleX<int8_t, 3>() + & testVShuffleX<int8_t, 4>() + & test1ShuffleX<int16_t>() + & testVShuffleX<int16_t, 2>() + & testVShuffleX<int16_t, 3>() + & testVShuffleX<int16_t, 4>() + & test1ShuffleX<int64_t>() + & testVShuffleX<int64_t, 2>() + & testVShuffleX<int64_t, 3>() + & testVShuffleX<int64_t, 4>() + & test1ShuffleX<uint>() + & testVShuffleX<uint, 2>() + & testVShuffleX<uint, 3>() + & testVShuffleX<uint, 4>() + & test1ShuffleX<uint8_t>() + & testVShuffleX<uint8_t, 2>() + & testVShuffleX<uint8_t, 3>() + & testVShuffleX<uint8_t, 4>() + & test1ShuffleX<uint16_t>() + & testVShuffleX<uint16_t, 2>() + & testVShuffleX<uint16_t, 3>() + & testVShuffleX<uint16_t, 4>() + & test1ShuffleX<uint64_t>() + & testVShuffleX<uint64_t, 2>() + & testVShuffleX<uint64_t, 3>() + & testVShuffleX<uint64_t, 4>() + & test1ShuffleX<bool>() + & testVShuffleX<bool, 2>() + & testVShuffleX<bool, 3>() + & testVShuffleX<bool, 4>() ; } @@ -127,7 +127,7 @@ void computeMain() { outputBuffer.data[0] = true - && testShuffleX() + & testShuffleX() ; // CHECK_GLSL: void main( diff --git a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-vote.slang b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-vote.slang index bcd4aeb56..3c700d6d8 100644 --- a/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-vote.slang +++ b/tests/glsl-intrinsic/shader-subgroup/shader-subgroup-vote.slang @@ -28,8 +28,8 @@ layout(local_size_x = 32) in; __generic<T : __BuiltinLogicalType> bool test1AllEqual() { return true - && subgroupAllEqual(T(1)) == true - && subgroupAllEqual(T(gl_GlobalInvocationID.x)) == false + & subgroupAllEqual(T(1)) == true + & subgroupAllEqual(T(gl_GlobalInvocationID.x)) == false ; } __generic<T : __BuiltinLogicalType, let N : int> @@ -37,16 +37,16 @@ bool testVAllEqual() { typealias gvec = vector<T, N>; return true - && subgroupAllEqual(gvec(T(1))) == true - && subgroupAllEqual(gvec(T(gl_GlobalInvocationID.x))) == false + & subgroupAllEqual(gvec(T(1))) == true + & subgroupAllEqual(gvec(T(gl_GlobalInvocationID.x))) == false ; } __generic<T : __BuiltinFloatingPointType> bool test1AllEqual() { return true - && subgroupAllEqual(T(1)) == true - && subgroupAllEqual(T(gl_GlobalInvocationID.x)) == false + & subgroupAllEqual(T(1)) == true + & subgroupAllEqual(T(gl_GlobalInvocationID.x)) == false ; } __generic<T : __BuiltinFloatingPointType, let N : int> @@ -54,60 +54,60 @@ bool testVAllEqual() { typealias gvec = vector<T, N>; return true - && subgroupAllEqual(gvec(T(1))) == true - && subgroupAllEqual(gvec(T(gl_GlobalInvocationID.x))) == false + & subgroupAllEqual(gvec(T(1))) == true + & subgroupAllEqual(gvec(T(gl_GlobalInvocationID.x))) == false ; } bool testAllEqual() { return true - && test1AllEqual<float>() - && testVAllEqual<float, 2>() - && testVAllEqual<float, 3>() - && testVAllEqual<float, 4>() - && test1AllEqual<double>() // WARNING: intel GPU's lack FP64 support - && testVAllEqual<double, 2>() - && testVAllEqual<double, 3>() - && testVAllEqual<double, 4>() - && test1AllEqual<half>() - && testVAllEqual<half, 2>() - && testVAllEqual<half, 3>() - && testVAllEqual<half, 4>() - && test1AllEqual<int>() - && testVAllEqual<int, 2>() - && testVAllEqual<int, 3>() - && testVAllEqual<int, 4>() - && test1AllEqual<int8_t>() - && testVAllEqual<int8_t, 2>() - && testVAllEqual<int8_t, 3>() - && testVAllEqual<int8_t, 4>() - && test1AllEqual<int16_t>() - && testVAllEqual<int16_t, 2>() - && testVAllEqual<int16_t, 3>() - && testVAllEqual<int16_t, 4>() - && test1AllEqual<int64_t>() - && testVAllEqual<int64_t, 2>() - && testVAllEqual<int64_t, 3>() - && testVAllEqual<int64_t, 4>() - && test1AllEqual<uint>() - && testVAllEqual<uint, 2>() - && testVAllEqual<uint, 3>() - && testVAllEqual<uint, 4>() - && test1AllEqual<uint8_t>() - && testVAllEqual<uint8_t, 2>() - && testVAllEqual<uint8_t, 3>() - && testVAllEqual<uint8_t, 4>() - && test1AllEqual<uint16_t>() - && testVAllEqual<uint16_t, 2>() - && testVAllEqual<uint16_t, 3>() - && testVAllEqual<uint16_t, 4>() - && test1AllEqual<uint64_t>() - && testVAllEqual<uint64_t, 2>() - && testVAllEqual<uint64_t, 3>() - && testVAllEqual<uint64_t, 4>() - && test1AllEqual<bool>() - && testVAllEqual<bool, 2>() - && testVAllEqual<bool, 3>() - && testVAllEqual<bool, 4>() + & test1AllEqual<float>() + & testVAllEqual<float, 2>() + & testVAllEqual<float, 3>() + & testVAllEqual<float, 4>() + & test1AllEqual<double>() // WARNING: intel GPU's lack FP64 support + & testVAllEqual<double, 2>() + & testVAllEqual<double, 3>() + & testVAllEqual<double, 4>() + & test1AllEqual<half>() + & testVAllEqual<half, 2>() + & testVAllEqual<half, 3>() + & testVAllEqual<half, 4>() + & test1AllEqual<int>() + & testVAllEqual<int, 2>() + & testVAllEqual<int, 3>() + & testVAllEqual<int, 4>() + & test1AllEqual<int8_t>() + & testVAllEqual<int8_t, 2>() + & testVAllEqual<int8_t, 3>() + & testVAllEqual<int8_t, 4>() + & test1AllEqual<int16_t>() + & testVAllEqual<int16_t, 2>() + & testVAllEqual<int16_t, 3>() + & testVAllEqual<int16_t, 4>() + & test1AllEqual<int64_t>() + & testVAllEqual<int64_t, 2>() + & testVAllEqual<int64_t, 3>() + & testVAllEqual<int64_t, 4>() + & test1AllEqual<uint>() + & testVAllEqual<uint, 2>() + & testVAllEqual<uint, 3>() + & testVAllEqual<uint, 4>() + & test1AllEqual<uint8_t>() + & testVAllEqual<uint8_t, 2>() + & testVAllEqual<uint8_t, 3>() + & testVAllEqual<uint8_t, 4>() + & test1AllEqual<uint16_t>() + & testVAllEqual<uint16_t, 2>() + & testVAllEqual<uint16_t, 3>() + & testVAllEqual<uint16_t, 4>() + & test1AllEqual<uint64_t>() + & testVAllEqual<uint64_t, 2>() + & testVAllEqual<uint64_t, 3>() + & testVAllEqual<uint64_t, 4>() + & test1AllEqual<bool>() + & testVAllEqual<bool, 2>() + & testVAllEqual<bool, 3>() + & testVAllEqual<bool, 4>() ; } |
