Merge pull request #627 from KhronosGroup/macro-namespace-fix
Add basic namespace to internal macros
This commit is contained in:
commit
c863f53cac
281
spirv_glsl.cpp
281
spirv_glsl.cpp
@ -2500,48 +2500,48 @@ string CompilerGLSL::constant_op_expression(const SPIRConstantOp &cop)
|
||||
op = type_to_glsl_constructor(type);
|
||||
break;
|
||||
|
||||
#define BOP(opname, x) \
|
||||
case Op##opname: \
|
||||
binary = true; \
|
||||
op = x; \
|
||||
#define GLSL_BOP(opname, x) \
|
||||
case Op##opname: \
|
||||
binary = true; \
|
||||
op = x; \
|
||||
break
|
||||
|
||||
#define UOP(opname, x) \
|
||||
case Op##opname: \
|
||||
unary = true; \
|
||||
op = x; \
|
||||
#define GLSL_UOP(opname, x) \
|
||||
case Op##opname: \
|
||||
unary = true; \
|
||||
op = x; \
|
||||
break
|
||||
|
||||
UOP(SNegate, "-");
|
||||
UOP(Not, "~");
|
||||
BOP(IAdd, "+");
|
||||
BOP(ISub, "-");
|
||||
BOP(IMul, "*");
|
||||
BOP(SDiv, "/");
|
||||
BOP(UDiv, "/");
|
||||
BOP(UMod, "%");
|
||||
BOP(SMod, "%");
|
||||
BOP(ShiftRightLogical, ">>");
|
||||
BOP(ShiftRightArithmetic, ">>");
|
||||
BOP(ShiftLeftLogical, "<<");
|
||||
BOP(BitwiseOr, "|");
|
||||
BOP(BitwiseXor, "^");
|
||||
BOP(BitwiseAnd, "&");
|
||||
BOP(LogicalOr, "||");
|
||||
BOP(LogicalAnd, "&&");
|
||||
UOP(LogicalNot, "!");
|
||||
BOP(LogicalEqual, "==");
|
||||
BOP(LogicalNotEqual, "!=");
|
||||
BOP(IEqual, "==");
|
||||
BOP(INotEqual, "!=");
|
||||
BOP(ULessThan, "<");
|
||||
BOP(SLessThan, "<");
|
||||
BOP(ULessThanEqual, "<=");
|
||||
BOP(SLessThanEqual, "<=");
|
||||
BOP(UGreaterThan, ">");
|
||||
BOP(SGreaterThan, ">");
|
||||
BOP(UGreaterThanEqual, ">=");
|
||||
BOP(SGreaterThanEqual, ">=");
|
||||
GLSL_UOP(SNegate, "-");
|
||||
GLSL_UOP(Not, "~");
|
||||
GLSL_BOP(IAdd, "+");
|
||||
GLSL_BOP(ISub, "-");
|
||||
GLSL_BOP(IMul, "*");
|
||||
GLSL_BOP(SDiv, "/");
|
||||
GLSL_BOP(UDiv, "/");
|
||||
GLSL_BOP(UMod, "%");
|
||||
GLSL_BOP(SMod, "%");
|
||||
GLSL_BOP(ShiftRightLogical, ">>");
|
||||
GLSL_BOP(ShiftRightArithmetic, ">>");
|
||||
GLSL_BOP(ShiftLeftLogical, "<<");
|
||||
GLSL_BOP(BitwiseOr, "|");
|
||||
GLSL_BOP(BitwiseXor, "^");
|
||||
GLSL_BOP(BitwiseAnd, "&");
|
||||
GLSL_BOP(LogicalOr, "||");
|
||||
GLSL_BOP(LogicalAnd, "&&");
|
||||
GLSL_UOP(LogicalNot, "!");
|
||||
GLSL_BOP(LogicalEqual, "==");
|
||||
GLSL_BOP(LogicalNotEqual, "!=");
|
||||
GLSL_BOP(IEqual, "==");
|
||||
GLSL_BOP(INotEqual, "!=");
|
||||
GLSL_BOP(ULessThan, "<");
|
||||
GLSL_BOP(SLessThan, "<");
|
||||
GLSL_BOP(ULessThanEqual, "<=");
|
||||
GLSL_BOP(SLessThanEqual, "<=");
|
||||
GLSL_BOP(UGreaterThan, ">");
|
||||
GLSL_BOP(SGreaterThan, ">");
|
||||
GLSL_BOP(UGreaterThanEqual, ">=");
|
||||
GLSL_BOP(SGreaterThanEqual, ">=");
|
||||
|
||||
case OpSelect:
|
||||
{
|
||||
@ -2620,8 +2620,8 @@ string CompilerGLSL::constant_op_expression(const SPIRConstantOp &cop)
|
||||
break;
|
||||
}
|
||||
|
||||
#undef BOP
|
||||
#undef UOP
|
||||
#undef GLSL_BOP
|
||||
#undef GLSL_UOP
|
||||
if (binary)
|
||||
{
|
||||
if (cop.arguments.size() < 2)
|
||||
@ -3509,7 +3509,7 @@ string CompilerGLSL::legacy_tex_op(const std::string &op, const SPIRType &imgtyp
|
||||
require_extension_internal("GL_EXT_gpu_shader4");
|
||||
}
|
||||
|
||||
// GLES has very limited support for shadow samplers.
|
||||
// GLES has very limited support for shadow samplers.
|
||||
// Basically shadow2D and shadow2DProj work through EXT_shadow_samplers,
|
||||
// everything else can just throw
|
||||
if (imgtype.image.depth && is_legacy_es())
|
||||
@ -3551,7 +3551,8 @@ string CompilerGLSL::legacy_tex_op(const std::string &op, const SPIRType &imgtyp
|
||||
return join(type_prefix, type);
|
||||
}
|
||||
else if (op == "textureProjGrad")
|
||||
return join(type_prefix, type, is_legacy_es() ? "ProjGradEXT" : is_legacy_desktop() ? "ProjGradARB" : "ProjGrad");
|
||||
return join(type_prefix, type,
|
||||
is_legacy_es() ? "ProjGradEXT" : is_legacy_desktop() ? "ProjGradARB" : "ProjGrad");
|
||||
else if (op == "textureProjLodOffset")
|
||||
{
|
||||
if (use_explicit_lod)
|
||||
@ -4810,7 +4811,7 @@ void CompilerGLSL::emit_subgroup_op(const Instruction &i)
|
||||
break;
|
||||
|
||||
// clang-format off
|
||||
#define GROUP_OP(op, glsl_op) \
|
||||
#define GLSL_GROUP_OP(op, glsl_op) \
|
||||
case OpGroupNonUniform##op: \
|
||||
{ \
|
||||
auto operation = static_cast<GroupOperation>(ops[3]); \
|
||||
@ -4826,20 +4827,20 @@ case OpGroupNonUniform##op: \
|
||||
SPIRV_CROSS_THROW("Invalid group operation."); \
|
||||
break; \
|
||||
}
|
||||
GROUP_OP(FAdd, Add)
|
||||
GROUP_OP(FMul, Mul)
|
||||
GROUP_OP(FMin, Min)
|
||||
GROUP_OP(FMax, Max)
|
||||
GROUP_OP(IAdd, Add)
|
||||
GROUP_OP(IMul, Mul)
|
||||
GROUP_OP(SMin, Min)
|
||||
GROUP_OP(SMax, Max)
|
||||
GROUP_OP(UMin, Min)
|
||||
GROUP_OP(UMax, Max)
|
||||
GROUP_OP(BitwiseAnd, And)
|
||||
GROUP_OP(BitwiseOr, Or)
|
||||
GROUP_OP(BitwiseXor, Xor)
|
||||
#undef GROUP_OP
|
||||
GLSL_GROUP_OP(FAdd, Add)
|
||||
GLSL_GROUP_OP(FMul, Mul)
|
||||
GLSL_GROUP_OP(FMin, Min)
|
||||
GLSL_GROUP_OP(FMax, Max)
|
||||
GLSL_GROUP_OP(IAdd, Add)
|
||||
GLSL_GROUP_OP(IMul, Mul)
|
||||
GLSL_GROUP_OP(SMin, Min)
|
||||
GLSL_GROUP_OP(SMax, Max)
|
||||
GLSL_GROUP_OP(UMin, Min)
|
||||
GLSL_GROUP_OP(UMax, Max)
|
||||
GLSL_GROUP_OP(BitwiseAnd, And)
|
||||
GLSL_GROUP_OP(BitwiseOr, Or)
|
||||
GLSL_GROUP_OP(BitwiseXor, Xor)
|
||||
#undef GLSL_GROUP_OP
|
||||
// clang-format on
|
||||
|
||||
case OpGroupNonUniformQuadSwap:
|
||||
@ -6082,17 +6083,17 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
auto opcode = static_cast<Op>(instruction.op);
|
||||
uint32_t length = instruction.length;
|
||||
|
||||
#define BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define BOP_CAST(op, type) \
|
||||
#define GLSL_BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define GLSL_BOP_CAST(op, type) \
|
||||
emit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, glsl_opcode_is_sign_invariant(opcode))
|
||||
#define UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op)
|
||||
#define QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op)
|
||||
#define TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op)
|
||||
#define BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define BFOP_CAST(op, type) \
|
||||
#define GLSL_UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op)
|
||||
#define GLSL_QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op)
|
||||
#define GLSL_TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op)
|
||||
#define GLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define GLSL_BFOP_CAST(op, type) \
|
||||
emit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, glsl_opcode_is_sign_invariant(opcode))
|
||||
#define BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op)
|
||||
#define GLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define GLSL_UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op)
|
||||
|
||||
switch (opcode)
|
||||
{
|
||||
@ -6625,45 +6626,45 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
|
||||
// ALU
|
||||
case OpIsNan:
|
||||
UFOP(isnan);
|
||||
GLSL_UFOP(isnan);
|
||||
break;
|
||||
|
||||
case OpIsInf:
|
||||
UFOP(isinf);
|
||||
GLSL_UFOP(isinf);
|
||||
break;
|
||||
|
||||
case OpSNegate:
|
||||
case OpFNegate:
|
||||
UOP(-);
|
||||
GLSL_UOP(-);
|
||||
break;
|
||||
|
||||
case OpIAdd:
|
||||
{
|
||||
// For simple arith ops, prefer the output type if there's a mismatch to avoid extra bitcasts.
|
||||
auto type = get<SPIRType>(ops[0]).basetype;
|
||||
BOP_CAST(+, type);
|
||||
GLSL_BOP_CAST(+, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpFAdd:
|
||||
BOP(+);
|
||||
GLSL_BOP(+);
|
||||
break;
|
||||
|
||||
case OpISub:
|
||||
{
|
||||
auto type = get<SPIRType>(ops[0]).basetype;
|
||||
BOP_CAST(-, type);
|
||||
GLSL_BOP_CAST(-, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpFSub:
|
||||
BOP(-);
|
||||
GLSL_BOP(-);
|
||||
break;
|
||||
|
||||
case OpIMul:
|
||||
{
|
||||
auto type = get<SPIRType>(ops[0]).basetype;
|
||||
BOP_CAST(*, type);
|
||||
GLSL_BOP_CAST(*, type);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6679,7 +6680,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
e->need_transpose = true;
|
||||
}
|
||||
else
|
||||
BOP(*);
|
||||
GLSL_BOP(*);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6687,19 +6688,19 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
case OpMatrixTimesScalar:
|
||||
case OpVectorTimesScalar:
|
||||
case OpMatrixTimesMatrix:
|
||||
BOP(*);
|
||||
GLSL_BOP(*);
|
||||
break;
|
||||
|
||||
case OpOuterProduct:
|
||||
BFOP(outerProduct);
|
||||
GLSL_BFOP(outerProduct);
|
||||
break;
|
||||
|
||||
case OpDot:
|
||||
BFOP(dot);
|
||||
GLSL_BFOP(dot);
|
||||
break;
|
||||
|
||||
case OpTranspose:
|
||||
UFOP(transpose);
|
||||
GLSL_UFOP(transpose);
|
||||
break;
|
||||
|
||||
case OpSRem:
|
||||
@ -6721,67 +6722,67 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
}
|
||||
|
||||
case OpSDiv:
|
||||
BOP_CAST(/, SPIRType::Int);
|
||||
GLSL_BOP_CAST(/, SPIRType::Int);
|
||||
break;
|
||||
|
||||
case OpUDiv:
|
||||
BOP_CAST(/, SPIRType::UInt);
|
||||
GLSL_BOP_CAST(/, SPIRType::UInt);
|
||||
break;
|
||||
|
||||
case OpFDiv:
|
||||
BOP(/);
|
||||
GLSL_BOP(/);
|
||||
break;
|
||||
|
||||
case OpShiftRightLogical:
|
||||
BOP_CAST(>>, SPIRType::UInt);
|
||||
GLSL_BOP_CAST(>>, SPIRType::UInt);
|
||||
break;
|
||||
|
||||
case OpShiftRightArithmetic:
|
||||
BOP_CAST(>>, SPIRType::Int);
|
||||
GLSL_BOP_CAST(>>, SPIRType::Int);
|
||||
break;
|
||||
|
||||
case OpShiftLeftLogical:
|
||||
{
|
||||
auto type = get<SPIRType>(ops[0]).basetype;
|
||||
BOP_CAST(<<, type);
|
||||
GLSL_BOP_CAST(<<, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpBitwiseOr:
|
||||
{
|
||||
auto type = get<SPIRType>(ops[0]).basetype;
|
||||
BOP_CAST(|, type);
|
||||
GLSL_BOP_CAST(|, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpBitwiseXor:
|
||||
{
|
||||
auto type = get<SPIRType>(ops[0]).basetype;
|
||||
BOP_CAST(^, type);
|
||||
GLSL_BOP_CAST (^, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpBitwiseAnd:
|
||||
{
|
||||
auto type = get<SPIRType>(ops[0]).basetype;
|
||||
BOP_CAST(&, type);
|
||||
GLSL_BOP_CAST(&, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpNot:
|
||||
UOP(~);
|
||||
GLSL_UOP(~);
|
||||
break;
|
||||
|
||||
case OpUMod:
|
||||
BOP_CAST(%, SPIRType::UInt);
|
||||
GLSL_BOP_CAST(%, SPIRType::UInt);
|
||||
break;
|
||||
|
||||
case OpSMod:
|
||||
BOP_CAST(%, SPIRType::Int);
|
||||
GLSL_BOP_CAST(%, SPIRType::Int);
|
||||
break;
|
||||
|
||||
case OpFMod:
|
||||
BFOP(mod);
|
||||
GLSL_BFOP(mod);
|
||||
break;
|
||||
|
||||
case OpFRem:
|
||||
@ -6808,11 +6809,11 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
|
||||
// Relational
|
||||
case OpAny:
|
||||
UFOP(any);
|
||||
GLSL_UFOP(any);
|
||||
break;
|
||||
|
||||
case OpAll:
|
||||
UFOP(all);
|
||||
GLSL_UFOP(all);
|
||||
break;
|
||||
|
||||
case OpSelect:
|
||||
@ -6829,7 +6830,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
if (type.vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "||");
|
||||
else
|
||||
BOP(||);
|
||||
GLSL_BOP(||);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6843,7 +6844,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
if (type.vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "&&");
|
||||
else
|
||||
BOP(&&);
|
||||
GLSL_BOP(&&);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6851,18 +6852,18 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
{
|
||||
auto &type = get<SPIRType>(ops[0]);
|
||||
if (type.vecsize > 1)
|
||||
UFOP(not);
|
||||
GLSL_UFOP(not);
|
||||
else
|
||||
UOP(!);
|
||||
GLSL_UOP(!);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpIEqual:
|
||||
{
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP_CAST(equal, SPIRType::Int);
|
||||
GLSL_BFOP_CAST(equal, SPIRType::Int);
|
||||
else
|
||||
BOP_CAST(==, SPIRType::Int);
|
||||
GLSL_BOP_CAST(==, SPIRType::Int);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6870,18 +6871,18 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
case OpFOrdEqual:
|
||||
{
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP(equal);
|
||||
GLSL_BFOP(equal);
|
||||
else
|
||||
BOP(==);
|
||||
GLSL_BOP(==);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpINotEqual:
|
||||
{
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP_CAST(notEqual, SPIRType::Int);
|
||||
GLSL_BFOP_CAST(notEqual, SPIRType::Int);
|
||||
else
|
||||
BOP_CAST(!=, SPIRType::Int);
|
||||
GLSL_BOP_CAST(!=, SPIRType::Int);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6889,9 +6890,9 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
case OpFOrdNotEqual:
|
||||
{
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP(notEqual);
|
||||
GLSL_BFOP(notEqual);
|
||||
else
|
||||
BOP(!=);
|
||||
GLSL_BOP(!=);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6900,18 +6901,18 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
{
|
||||
auto type = opcode == OpUGreaterThan ? SPIRType::UInt : SPIRType::Int;
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP_CAST(greaterThan, type);
|
||||
GLSL_BFOP_CAST(greaterThan, type);
|
||||
else
|
||||
BOP_CAST(>, type);
|
||||
GLSL_BOP_CAST(>, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpFOrdGreaterThan:
|
||||
{
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP(greaterThan);
|
||||
GLSL_BFOP(greaterThan);
|
||||
else
|
||||
BOP(>);
|
||||
GLSL_BOP(>);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6920,18 +6921,18 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
{
|
||||
auto type = opcode == OpUGreaterThanEqual ? SPIRType::UInt : SPIRType::Int;
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP_CAST(greaterThanEqual, type);
|
||||
GLSL_BFOP_CAST(greaterThanEqual, type);
|
||||
else
|
||||
BOP_CAST(>=, type);
|
||||
GLSL_BOP_CAST(>=, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpFOrdGreaterThanEqual:
|
||||
{
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP(greaterThanEqual);
|
||||
GLSL_BFOP(greaterThanEqual);
|
||||
else
|
||||
BOP(>=);
|
||||
GLSL_BOP(>=);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6940,18 +6941,18 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
{
|
||||
auto type = opcode == OpULessThan ? SPIRType::UInt : SPIRType::Int;
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP_CAST(lessThan, type);
|
||||
GLSL_BFOP_CAST(lessThan, type);
|
||||
else
|
||||
BOP_CAST(<, type);
|
||||
GLSL_BOP_CAST(<, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpFOrdLessThan:
|
||||
{
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP(lessThan);
|
||||
GLSL_BFOP(lessThan);
|
||||
else
|
||||
BOP(<);
|
||||
GLSL_BOP(<);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6960,18 +6961,18 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
{
|
||||
auto type = opcode == OpULessThanEqual ? SPIRType::UInt : SPIRType::Int;
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP_CAST(lessThanEqual, type);
|
||||
GLSL_BFOP_CAST(lessThanEqual, type);
|
||||
else
|
||||
BOP_CAST(<=, type);
|
||||
GLSL_BOP_CAST(<=, type);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpFOrdLessThanEqual:
|
||||
{
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
BFOP(lessThanEqual);
|
||||
GLSL_BFOP(lessThanEqual);
|
||||
else
|
||||
BOP(<=);
|
||||
GLSL_BOP(<=);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -7045,21 +7046,21 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
|
||||
// Derivatives
|
||||
case OpDPdx:
|
||||
UFOP(dFdx);
|
||||
GLSL_UFOP(dFdx);
|
||||
if (is_legacy_es())
|
||||
require_extension_internal("GL_OES_standard_derivatives");
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpDPdy:
|
||||
UFOP(dFdy);
|
||||
GLSL_UFOP(dFdy);
|
||||
if (is_legacy_es())
|
||||
require_extension_internal("GL_OES_standard_derivatives");
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpDPdxFine:
|
||||
UFOP(dFdxFine);
|
||||
GLSL_UFOP(dFdxFine);
|
||||
if (options.es)
|
||||
{
|
||||
SPIRV_CROSS_THROW("GL_ARB_derivative_control is unavailable in OpenGL ES.");
|
||||
@ -7070,7 +7071,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
break;
|
||||
|
||||
case OpDPdyFine:
|
||||
UFOP(dFdyFine);
|
||||
GLSL_UFOP(dFdyFine);
|
||||
if (options.es)
|
||||
{
|
||||
SPIRV_CROSS_THROW("GL_ARB_derivative_control is unavailable in OpenGL ES.");
|
||||
@ -7085,14 +7086,14 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
{
|
||||
SPIRV_CROSS_THROW("GL_ARB_derivative_control is unavailable in OpenGL ES.");
|
||||
}
|
||||
UFOP(dFdxCoarse);
|
||||
GLSL_UFOP(dFdxCoarse);
|
||||
if (options.version < 450)
|
||||
require_extension_internal("GL_ARB_derivative_control");
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpDPdyCoarse:
|
||||
UFOP(dFdyCoarse);
|
||||
GLSL_UFOP(dFdyCoarse);
|
||||
if (options.es)
|
||||
{
|
||||
SPIRV_CROSS_THROW("GL_ARB_derivative_control is unavailable in OpenGL ES.");
|
||||
@ -7103,14 +7104,14 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
break;
|
||||
|
||||
case OpFwidth:
|
||||
UFOP(fwidth);
|
||||
GLSL_UFOP(fwidth);
|
||||
if (is_legacy_es())
|
||||
require_extension_internal("GL_OES_standard_derivatives");
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpFwidthCoarse:
|
||||
UFOP(fwidthCoarse);
|
||||
GLSL_UFOP(fwidthCoarse);
|
||||
if (options.es)
|
||||
{
|
||||
SPIRV_CROSS_THROW("GL_ARB_derivative_control is unavailable in OpenGL ES.");
|
||||
@ -7121,7 +7122,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
break;
|
||||
|
||||
case OpFwidthFine:
|
||||
UFOP(fwidthFine);
|
||||
GLSL_UFOP(fwidthFine);
|
||||
if (options.es)
|
||||
{
|
||||
SPIRV_CROSS_THROW("GL_ARB_derivative_control is unavailable in OpenGL ES.");
|
||||
@ -7134,21 +7135,21 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
// Bitfield
|
||||
case OpBitFieldInsert:
|
||||
// TODO: The signedness of inputs is strict in GLSL, but not in SPIR-V, bitcast if necessary.
|
||||
QFOP(bitfieldInsert);
|
||||
GLSL_QFOP(bitfieldInsert);
|
||||
break;
|
||||
|
||||
case OpBitFieldSExtract:
|
||||
case OpBitFieldUExtract:
|
||||
// TODO: The signedness of inputs is strict in GLSL, but not in SPIR-V, bitcast if necessary.
|
||||
TFOP(bitfieldExtract);
|
||||
GLSL_TFOP(bitfieldExtract);
|
||||
break;
|
||||
|
||||
case OpBitReverse:
|
||||
UFOP(bitfieldReverse);
|
||||
GLSL_UFOP(bitfieldReverse);
|
||||
break;
|
||||
|
||||
case OpBitCount:
|
||||
UFOP(bitCount);
|
||||
GLSL_UFOP(bitCount);
|
||||
break;
|
||||
|
||||
// Atomics
|
||||
@ -7185,7 +7186,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
flush_all_atomic_capable_variables();
|
||||
// FIXME: Image?
|
||||
// OpAtomicLoad seems to only be relevant for atomic counters.
|
||||
UFOP(atomicCounter);
|
||||
GLSL_UFOP(atomicCounter);
|
||||
register_read(ops[1], ops[2], should_forward(ops[2]));
|
||||
break;
|
||||
|
||||
@ -7195,7 +7196,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
case OpAtomicIIncrement:
|
||||
forced_temporaries.insert(ops[1]);
|
||||
// FIXME: Image?
|
||||
UFOP(atomicCounterIncrement);
|
||||
GLSL_UFOP(atomicCounterIncrement);
|
||||
flush_all_atomic_capable_variables();
|
||||
register_read(ops[1], ops[2], should_forward(ops[2]));
|
||||
break;
|
||||
@ -7203,7 +7204,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
case OpAtomicIDecrement:
|
||||
forced_temporaries.insert(ops[1]);
|
||||
// FIXME: Image?
|
||||
UFOP(atomicCounterDecrement);
|
||||
GLSL_UFOP(atomicCounterDecrement);
|
||||
flush_all_atomic_capable_variables();
|
||||
register_read(ops[1], ops[2], should_forward(ops[2]));
|
||||
break;
|
||||
@ -7334,12 +7335,12 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
{
|
||||
require_extension_internal("GL_ARB_texture_query_lod");
|
||||
// For some reason, the ARB spec is all-caps.
|
||||
BFOP(textureQueryLOD);
|
||||
GLSL_BFOP(textureQueryLOD);
|
||||
}
|
||||
else if (options.es)
|
||||
SPIRV_CROSS_THROW("textureQueryLod not supported in ES profile.");
|
||||
else
|
||||
BFOP(textureQueryLod);
|
||||
GLSL_BFOP(textureQueryLod);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
}
|
||||
|
@ -3766,7 +3766,7 @@ void CompilerHLSL::emit_subgroup_op(const Instruction &i)
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
#define GROUP_OP(op, hlsl_op, supports_scan) \
|
||||
#define HLSL_GROUP_OP(op, hlsl_op, supports_scan) \
|
||||
case OpGroupNonUniform##op: \
|
||||
{ \
|
||||
auto operation = static_cast<GroupOperation>(ops[3]); \
|
||||
@ -3786,20 +3786,20 @@ case OpGroupNonUniform##op: \
|
||||
SPIRV_CROSS_THROW("Invalid group operation."); \
|
||||
break; \
|
||||
}
|
||||
GROUP_OP(FAdd, Sum, true)
|
||||
GROUP_OP(FMul, Product, true)
|
||||
GROUP_OP(FMin, Min, false)
|
||||
GROUP_OP(FMax, Max, false)
|
||||
GROUP_OP(IAdd, Sum, true)
|
||||
GROUP_OP(IMul, Product, true)
|
||||
GROUP_OP(SMin, Min, false)
|
||||
GROUP_OP(SMax, Max, false)
|
||||
GROUP_OP(UMin, Min, false)
|
||||
GROUP_OP(UMax, Max, false)
|
||||
GROUP_OP(BitwiseAnd, BitAnd, false)
|
||||
GROUP_OP(BitwiseOr, BitOr, false)
|
||||
GROUP_OP(BitwiseXor, BitXor, false)
|
||||
#undef GROUP_OP
|
||||
HLSL_GROUP_OP(FAdd, Sum, true)
|
||||
HLSL_GROUP_OP(FMul, Product, true)
|
||||
HLSL_GROUP_OP(FMin, Min, false)
|
||||
HLSL_GROUP_OP(FMax, Max, false)
|
||||
HLSL_GROUP_OP(IAdd, Sum, true)
|
||||
HLSL_GROUP_OP(IMul, Product, true)
|
||||
HLSL_GROUP_OP(SMin, Min, false)
|
||||
HLSL_GROUP_OP(SMax, Max, false)
|
||||
HLSL_GROUP_OP(UMin, Min, false)
|
||||
HLSL_GROUP_OP(UMax, Max, false)
|
||||
HLSL_GROUP_OP(BitwiseAnd, BitAnd, false)
|
||||
HLSL_GROUP_OP(BitwiseOr, BitOr, false)
|
||||
HLSL_GROUP_OP(BitwiseXor, BitXor, false)
|
||||
#undef HLSL_GROUP_OP
|
||||
// clang-format on
|
||||
|
||||
case OpGroupNonUniformQuadSwap:
|
||||
@ -3834,17 +3834,17 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
auto ops = stream(instruction);
|
||||
auto opcode = static_cast<Op>(instruction.op);
|
||||
|
||||
#define BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define BOP_CAST(op, type) \
|
||||
#define HLSL_BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define HLSL_BOP_CAST(op, type) \
|
||||
emit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, hlsl_opcode_is_sign_invariant(opcode))
|
||||
#define UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op)
|
||||
#define QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op)
|
||||
#define TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op)
|
||||
#define BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define BFOP_CAST(op, type) \
|
||||
#define HLSL_UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op)
|
||||
#define HLSL_QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op)
|
||||
#define HLSL_TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op)
|
||||
#define HLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define HLSL_BFOP_CAST(op, type) \
|
||||
emit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, hlsl_opcode_is_sign_invariant(opcode))
|
||||
#define BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op)
|
||||
#define HLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define HLSL_UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op)
|
||||
|
||||
switch (opcode)
|
||||
{
|
||||
@ -3913,39 +3913,39 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
}
|
||||
|
||||
case OpDPdx:
|
||||
UFOP(ddx);
|
||||
HLSL_UFOP(ddx);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpDPdy:
|
||||
UFOP(ddy);
|
||||
HLSL_UFOP(ddy);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpDPdxFine:
|
||||
UFOP(ddx_fine);
|
||||
HLSL_UFOP(ddx_fine);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpDPdyFine:
|
||||
UFOP(ddy_fine);
|
||||
HLSL_UFOP(ddy_fine);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpDPdxCoarse:
|
||||
UFOP(ddx_coarse);
|
||||
HLSL_UFOP(ddx_coarse);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpDPdyCoarse:
|
||||
UFOP(ddy_coarse);
|
||||
HLSL_UFOP(ddy_coarse);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpFwidth:
|
||||
case OpFwidthCoarse:
|
||||
case OpFwidthFine:
|
||||
UFOP(fwidth);
|
||||
HLSL_UFOP(fwidth);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
@ -3958,7 +3958,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (type.vecsize > 1)
|
||||
emit_unrolled_unary_op(result_type, id, ops[2], "!");
|
||||
else
|
||||
UOP(!);
|
||||
HLSL_UOP(!);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3970,7 +3970,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "==");
|
||||
else
|
||||
BOP_CAST(==, SPIRType::Int);
|
||||
HLSL_BOP_CAST(==, SPIRType::Int);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3983,7 +3983,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "==");
|
||||
else
|
||||
BOP(==);
|
||||
HLSL_BOP(==);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3995,7 +3995,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "!=");
|
||||
else
|
||||
BOP_CAST(!=, SPIRType::Int);
|
||||
HLSL_BOP_CAST(!=, SPIRType::Int);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4008,7 +4008,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "!=");
|
||||
else
|
||||
BOP(!=);
|
||||
HLSL_BOP(!=);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4022,7 +4022,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], ">");
|
||||
else
|
||||
BOP_CAST(>, type);
|
||||
HLSL_BOP_CAST(>, type);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4034,7 +4034,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], ">");
|
||||
else
|
||||
BOP(>);
|
||||
HLSL_BOP(>);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4048,7 +4048,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], ">=");
|
||||
else
|
||||
BOP_CAST(>=, type);
|
||||
HLSL_BOP_CAST(>=, type);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4060,7 +4060,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], ">=");
|
||||
else
|
||||
BOP(>=);
|
||||
HLSL_BOP(>=);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4074,7 +4074,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "<");
|
||||
else
|
||||
BOP_CAST(<, type);
|
||||
HLSL_BOP_CAST(<, type);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4086,7 +4086,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "<");
|
||||
else
|
||||
BOP(<);
|
||||
HLSL_BOP(<);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4100,7 +4100,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "<=");
|
||||
else
|
||||
BOP_CAST(<=, type);
|
||||
HLSL_BOP_CAST(<=, type);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4112,7 +4112,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
if (expression_type(ops[2]).vecsize > 1)
|
||||
emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "<=");
|
||||
else
|
||||
BOP(<=);
|
||||
HLSL_BOP(<=);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4417,18 +4417,18 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction)
|
||||
}
|
||||
|
||||
if (opcode == OpBitFieldSExtract)
|
||||
TFOP(SPIRV_Cross_bitfieldSExtract);
|
||||
HLSL_TFOP(SPIRV_Cross_bitfieldSExtract);
|
||||
else
|
||||
TFOP(SPIRV_Cross_bitfieldUExtract);
|
||||
HLSL_TFOP(SPIRV_Cross_bitfieldUExtract);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpBitCount:
|
||||
UFOP(countbits);
|
||||
HLSL_UFOP(countbits);
|
||||
break;
|
||||
|
||||
case OpBitReverse:
|
||||
UFOP(reversebits);
|
||||
HLSL_UFOP(reversebits);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1543,16 +1543,16 @@ void CompilerMSL::emit_specialization_constants()
|
||||
void CompilerMSL::emit_instruction(const Instruction &instruction)
|
||||
{
|
||||
|
||||
#define BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define BOP_CAST(op, type) \
|
||||
#define MSL_BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define MSL_BOP_CAST(op, type) \
|
||||
emit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode))
|
||||
#define UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op)
|
||||
#define QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op)
|
||||
#define TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op)
|
||||
#define BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define BFOP_CAST(op, type) \
|
||||
#define MSL_UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op)
|
||||
#define MSL_QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op)
|
||||
#define MSL_TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op)
|
||||
#define MSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)
|
||||
#define MSL_BFOP_CAST(op, type) \
|
||||
emit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode))
|
||||
#define UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op)
|
||||
#define MSL_UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op)
|
||||
|
||||
auto ops = stream(instruction);
|
||||
auto opcode = static_cast<Op>(instruction.op);
|
||||
@ -1564,81 +1564,81 @@ void CompilerMSL::emit_instruction(const Instruction &instruction)
|
||||
case OpIEqual:
|
||||
case OpLogicalEqual:
|
||||
case OpFOrdEqual:
|
||||
BOP(==);
|
||||
MSL_BOP(==);
|
||||
break;
|
||||
|
||||
case OpINotEqual:
|
||||
case OpLogicalNotEqual:
|
||||
case OpFOrdNotEqual:
|
||||
BOP(!=);
|
||||
MSL_BOP(!=);
|
||||
break;
|
||||
|
||||
case OpUGreaterThan:
|
||||
case OpSGreaterThan:
|
||||
case OpFOrdGreaterThan:
|
||||
BOP(>);
|
||||
MSL_BOP(>);
|
||||
break;
|
||||
|
||||
case OpUGreaterThanEqual:
|
||||
case OpSGreaterThanEqual:
|
||||
case OpFOrdGreaterThanEqual:
|
||||
BOP(>=);
|
||||
MSL_BOP(>=);
|
||||
break;
|
||||
|
||||
case OpULessThan:
|
||||
case OpSLessThan:
|
||||
case OpFOrdLessThan:
|
||||
BOP(<);
|
||||
MSL_BOP(<);
|
||||
break;
|
||||
|
||||
case OpULessThanEqual:
|
||||
case OpSLessThanEqual:
|
||||
case OpFOrdLessThanEqual:
|
||||
BOP(<=);
|
||||
MSL_BOP(<=);
|
||||
break;
|
||||
|
||||
// Derivatives
|
||||
case OpDPdx:
|
||||
case OpDPdxFine:
|
||||
case OpDPdxCoarse:
|
||||
UFOP(dfdx);
|
||||
MSL_UFOP(dfdx);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpDPdy:
|
||||
case OpDPdyFine:
|
||||
case OpDPdyCoarse:
|
||||
UFOP(dfdy);
|
||||
MSL_UFOP(dfdy);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
case OpFwidth:
|
||||
case OpFwidthCoarse:
|
||||
case OpFwidthFine:
|
||||
UFOP(fwidth);
|
||||
MSL_UFOP(fwidth);
|
||||
register_control_dependent_expression(ops[1]);
|
||||
break;
|
||||
|
||||
// Bitfield
|
||||
case OpBitFieldInsert:
|
||||
QFOP(insert_bits);
|
||||
MSL_QFOP(insert_bits);
|
||||
break;
|
||||
|
||||
case OpBitFieldSExtract:
|
||||
case OpBitFieldUExtract:
|
||||
TFOP(extract_bits);
|
||||
MSL_TFOP(extract_bits);
|
||||
break;
|
||||
|
||||
case OpBitReverse:
|
||||
UFOP(reverse_bits);
|
||||
MSL_UFOP(reverse_bits);
|
||||
break;
|
||||
|
||||
case OpBitCount:
|
||||
UFOP(popcount);
|
||||
MSL_UFOP(popcount);
|
||||
break;
|
||||
|
||||
case OpFRem:
|
||||
BFOP(fmod);
|
||||
MSL_BFOP(fmod);
|
||||
break;
|
||||
|
||||
// Atomics
|
||||
@ -1691,7 +1691,7 @@ void CompilerMSL::emit_instruction(const Instruction &instruction)
|
||||
break;
|
||||
}
|
||||
|
||||
#define AFMOImpl(op, valsrc) \
|
||||
#define MSL_AFMO_IMPL(op, valsrc) \
|
||||
do \
|
||||
{ \
|
||||
uint32_t result_type = ops[0]; \
|
||||
@ -1702,45 +1702,45 @@ void CompilerMSL::emit_instruction(const Instruction &instruction)
|
||||
emit_atomic_func_op(result_type, id, "atomic_fetch_" #op "_explicit", mem_sem, mem_sem, false, ptr, val); \
|
||||
} while (false)
|
||||
|
||||
#define AFMO(op) AFMOImpl(op, ops[5])
|
||||
#define AFMIO(op) AFMOImpl(op, 1)
|
||||
#define MSL_AFMO(op) MSL_AFMO_IMPL(op, ops[5])
|
||||
#define MSL_AFMIO(op) MSL_AFMO_IMPL(op, 1)
|
||||
|
||||
case OpAtomicIIncrement:
|
||||
AFMIO(add);
|
||||
MSL_AFMIO(add);
|
||||
break;
|
||||
|
||||
case OpAtomicIDecrement:
|
||||
AFMIO(sub);
|
||||
MSL_AFMIO(sub);
|
||||
break;
|
||||
|
||||
case OpAtomicIAdd:
|
||||
AFMO(add);
|
||||
MSL_AFMO(add);
|
||||
break;
|
||||
|
||||
case OpAtomicISub:
|
||||
AFMO(sub);
|
||||
MSL_AFMO(sub);
|
||||
break;
|
||||
|
||||
case OpAtomicSMin:
|
||||
case OpAtomicUMin:
|
||||
AFMO(min);
|
||||
MSL_AFMO(min);
|
||||
break;
|
||||
|
||||
case OpAtomicSMax:
|
||||
case OpAtomicUMax:
|
||||
AFMO(max);
|
||||
MSL_AFMO(max);
|
||||
break;
|
||||
|
||||
case OpAtomicAnd:
|
||||
AFMO(and);
|
||||
MSL_AFMO(and);
|
||||
break;
|
||||
|
||||
case OpAtomicOr:
|
||||
AFMO(or);
|
||||
MSL_AFMO(or);
|
||||
break;
|
||||
|
||||
case OpAtomicXor:
|
||||
AFMO(xor);
|
||||
MSL_AFMO (xor);
|
||||
break;
|
||||
|
||||
// Images
|
||||
@ -1864,7 +1864,7 @@ void CompilerMSL::emit_instruction(const Instruction &instruction)
|
||||
break;
|
||||
}
|
||||
|
||||
#define ImgQry(qrytype) \
|
||||
#define MSL_ImgQry(qrytype) \
|
||||
do \
|
||||
{ \
|
||||
uint32_t rslt_type_id = ops[0]; \
|
||||
@ -1877,11 +1877,11 @@ void CompilerMSL::emit_instruction(const Instruction &instruction)
|
||||
} while (false)
|
||||
|
||||
case OpImageQueryLevels:
|
||||
ImgQry(mip_levels);
|
||||
MSL_ImgQry(mip_levels);
|
||||
break;
|
||||
|
||||
case OpImageQuerySamples:
|
||||
ImgQry(samples);
|
||||
MSL_ImgQry(samples);
|
||||
break;
|
||||
|
||||
// Casting
|
||||
@ -1963,7 +1963,7 @@ void CompilerMSL::emit_instruction(const Instruction &instruction)
|
||||
e->need_transpose = true;
|
||||
}
|
||||
else
|
||||
BOP(*);
|
||||
MSL_BOP(*);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -152,7 +152,7 @@ public:
|
||||
|
||||
Platform platform = macOS;
|
||||
uint32_t msl_version = make_msl_version(1, 2);
|
||||
uint32_t texel_buffer_texture_width = 4096; // Width of 2D Metal textures used as 1D texel buffers
|
||||
uint32_t texel_buffer_texture_width = 4096; // Width of 2D Metal textures used as 1D texel buffers
|
||||
bool enable_point_size_builtin = true;
|
||||
bool resolve_specialized_array_lengths = true;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user