Commit ff9f9b5d by Nicolas Capens Committed by Nicolas Capens

Rename size/sizeInComponents to componentCount

Bug: b/129000021 Change-Id: I36401de649eb53474ca74acb069351ce37f7529f Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43828 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarBen Clayton <bclayton@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 71186756
...@@ -264,7 +264,7 @@ SpirvShader::SpirvShader( ...@@ -264,7 +264,7 @@ SpirvShader::SpirvShader(
case spv::StorageClassWorkgroup: case spv::StorageClassWorkgroup:
{ {
auto &elTy = getType(getType(typeId).element); auto &elTy = getType(getType(typeId).element);
auto sizeInBytes = elTy.sizeInComponents * static_cast<uint32_t>(sizeof(float)); auto sizeInBytes = elTy.componentCount * static_cast<uint32_t>(sizeof(float));
workgroupMemory.allocate(resultId, sizeInBytes); workgroupMemory.allocate(resultId, sizeInBytes);
object.kind = Object::Kind::Pointer; object.kind = Object::Kind::Pointer;
break; break;
...@@ -308,7 +308,7 @@ SpirvShader::SpirvShader( ...@@ -308,7 +308,7 @@ SpirvShader::SpirvShader(
// OpConstantNull forms a constant of arbitrary type, all zeros. // OpConstantNull forms a constant of arbitrary type, all zeros.
auto &object = CreateConstant(insn); auto &object = CreateConstant(insn);
auto &objectTy = getType(object); auto &objectTy = getType(object);
for(auto i = 0u; i < objectTy.sizeInComponents; i++) for(auto i = 0u; i < objectTy.componentCount; i++)
{ {
object.constantValue[i] = 0; object.constantValue[i] = 0;
} }
...@@ -323,7 +323,7 @@ SpirvShader::SpirvShader( ...@@ -323,7 +323,7 @@ SpirvShader::SpirvShader(
{ {
auto &constituent = getObject(insn.word(i + 3)); auto &constituent = getObject(insn.word(i + 3));
auto &constituentTy = getType(constituent); auto &constituentTy = getType(constituent);
for(auto j = 0u; j < constituentTy.sizeInComponents; j++) for(auto j = 0u; j < constituentTy.componentCount; j++)
{ {
object.constantValue[offset++] = constituent.constantValue[j]; object.constantValue[offset++] = constituent.constantValue[j];
} }
...@@ -342,7 +342,7 @@ SpirvShader::SpirvShader( ...@@ -342,7 +342,7 @@ SpirvShader::SpirvShader(
// any execution mode set for LocalSize. // any execution mode set for LocalSize.
// The object decorated with WorkgroupSize must be declared // The object decorated with WorkgroupSize must be declared
// as a three-component vector of 32-bit integers. // as a three-component vector of 32-bit integers.
ASSERT(getType(object).sizeInComponents == 3); ASSERT(getType(object).componentCount == 3);
modes.WorkgroupSizeX = object.constantValue[0]; modes.WorkgroupSizeX = object.constantValue[0];
modes.WorkgroupSizeY = object.constantValue[1]; modes.WorkgroupSizeY = object.constantValue[1];
modes.WorkgroupSizeZ = object.constantValue[2]; modes.WorkgroupSizeZ = object.constantValue[2];
...@@ -743,7 +743,7 @@ void SpirvShader::DeclareType(InsnIterator insn) ...@@ -743,7 +743,7 @@ void SpirvShader::DeclareType(InsnIterator insn)
auto &type = types[resultId]; auto &type = types[resultId];
type.definition = insn; type.definition = insn;
type.sizeInComponents = ComputeTypeSize(insn); type.componentCount = ComputeTypeSize(insn);
// A structure is a builtin block if it has a builtin // A structure is a builtin block if it has a builtin
// member. All members of such a structure are builtins. // member. All members of such a structure are builtins.
...@@ -795,7 +795,7 @@ SpirvShader::Object &SpirvShader::CreateConstant(InsnIterator insn) ...@@ -795,7 +795,7 @@ SpirvShader::Object &SpirvShader::CreateConstant(InsnIterator insn)
auto &objectTy = getType(typeId); auto &objectTy = getType(typeId);
object.kind = Object::Kind::Constant; object.kind = Object::Kind::Constant;
object.definition = insn; object.definition = insn;
object.constantValue = std::unique_ptr<uint32_t[]>(new uint32_t[objectTy.sizeInComponents]); object.constantValue = std::unique_ptr<uint32_t[]>(new uint32_t[objectTy.componentCount]);
return object; return object;
} }
...@@ -829,10 +829,10 @@ void SpirvShader::ProcessInterfaceVariable(Object &object) ...@@ -829,10 +829,10 @@ void SpirvShader::ProcessInterfaceVariable(Object &object)
if(member.HasBuiltIn) if(member.HasBuiltIn)
{ {
builtinInterface[member.BuiltIn] = { resultId, offset, memberType.sizeInComponents }; builtinInterface[member.BuiltIn] = { resultId, offset, memberType.componentCount };
} }
offset += memberType.sizeInComponents; offset += memberType.componentCount;
++memberIndex; ++memberIndex;
} }
...@@ -842,7 +842,7 @@ void SpirvShader::ProcessInterfaceVariable(Object &object) ...@@ -842,7 +842,7 @@ void SpirvShader::ProcessInterfaceVariable(Object &object)
auto d = decorations.find(resultId); auto d = decorations.find(resultId);
if(d != decorations.end() && d->second.HasBuiltIn) if(d != decorations.end() && d->second.HasBuiltIn)
{ {
builtinInterface[d->second.BuiltIn] = { resultId, 0, pointeeTy.sizeInComponents }; builtinInterface[d->second.BuiltIn] = { resultId, 0, pointeeTy.componentCount };
} }
else else
{ {
...@@ -924,13 +924,13 @@ uint32_t SpirvShader::ComputeTypeSize(InsnIterator insn) ...@@ -924,13 +924,13 @@ uint32_t SpirvShader::ComputeTypeSize(InsnIterator insn)
case spv::OpTypeVector: case spv::OpTypeVector:
case spv::OpTypeMatrix: case spv::OpTypeMatrix:
// Vectors and matrices both consume element count * element size. // Vectors and matrices both consume element count * element size.
return getType(insn.word(2)).sizeInComponents * insn.word(3); return getType(insn.word(2)).componentCount * insn.word(3);
case spv::OpTypeArray: case spv::OpTypeArray:
{ {
// Element count * element size. Array sizes come from constant ids. // Element count * element size. Array sizes come from constant ids.
auto arraySize = GetConstScalarInt(insn.word(3)); auto arraySize = GetConstScalarInt(insn.word(3));
return getType(insn.word(2)).sizeInComponents * arraySize; return getType(insn.word(2)).componentCount * arraySize;
} }
case spv::OpTypeStruct: case spv::OpTypeStruct:
...@@ -938,7 +938,7 @@ uint32_t SpirvShader::ComputeTypeSize(InsnIterator insn) ...@@ -938,7 +938,7 @@ uint32_t SpirvShader::ComputeTypeSize(InsnIterator insn)
uint32_t size = 0; uint32_t size = 0;
for(uint32_t i = 2u; i < insn.wordCount(); i++) for(uint32_t i = 2u; i < insn.wordCount(); i++)
{ {
size += getType(insn.word(i)).sizeInComponents; size += getType(insn.word(i)).componentCount;
} }
return size; return size;
} }
...@@ -1202,7 +1202,7 @@ SIMD::Pointer SpirvShader::WalkAccessChain(Object::ID baseId, uint32_t numIndexe ...@@ -1202,7 +1202,7 @@ SIMD::Pointer SpirvShader::WalkAccessChain(Object::ID baseId, uint32_t numIndexe
for(auto j = 0; j < memberIndex; j++) for(auto j = 0; j < memberIndex; j++)
{ {
auto memberType = type.definition.word(2u + j); auto memberType = type.definition.word(2u + j);
offsetIntoStruct += getType(memberType).sizeInComponents * sizeof(float); offsetIntoStruct += getType(memberType).componentCount * sizeof(float);
} }
constantOffset += offsetIntoStruct; constantOffset += offsetIntoStruct;
typeId = type.definition.word(2u + memberIndex); typeId = type.definition.word(2u + memberIndex);
...@@ -1233,7 +1233,7 @@ SIMD::Pointer SpirvShader::WalkAccessChain(Object::ID baseId, uint32_t numIndexe ...@@ -1233,7 +1233,7 @@ SIMD::Pointer SpirvShader::WalkAccessChain(Object::ID baseId, uint32_t numIndexe
} }
else else
{ {
auto stride = getType(type.element).sizeInComponents * static_cast<uint32_t>(sizeof(float)); auto stride = getType(type.element).componentCount * static_cast<uint32_t>(sizeof(float));
auto &obj = getObject(indexIds[i]); auto &obj = getObject(indexIds[i]);
if(obj.kind == Object::Kind::Constant) if(obj.kind == Object::Kind::Constant)
{ {
...@@ -1276,7 +1276,7 @@ uint32_t SpirvShader::WalkLiteralAccessChain(Type::ID typeId, uint32_t numIndexe ...@@ -1276,7 +1276,7 @@ uint32_t SpirvShader::WalkLiteralAccessChain(Type::ID typeId, uint32_t numIndexe
for(auto j = 0; j < memberIndex; j++) for(auto j = 0; j < memberIndex; j++)
{ {
auto memberType = type.definition.word(2u + j); auto memberType = type.definition.word(2u + j);
offsetIntoStruct += getType(memberType).sizeInComponents; offsetIntoStruct += getType(memberType).componentCount;
} }
componentOffset += offsetIntoStruct; componentOffset += offsetIntoStruct;
typeId = type.definition.word(2u + memberIndex); typeId = type.definition.word(2u + memberIndex);
...@@ -1288,7 +1288,7 @@ uint32_t SpirvShader::WalkLiteralAccessChain(Type::ID typeId, uint32_t numIndexe ...@@ -1288,7 +1288,7 @@ uint32_t SpirvShader::WalkLiteralAccessChain(Type::ID typeId, uint32_t numIndexe
case spv::OpTypeArray: case spv::OpTypeArray:
{ {
auto elementType = type.definition.word(2); auto elementType = type.definition.word(2);
auto stride = getType(elementType).sizeInComponents; auto stride = getType(elementType).componentCount;
componentOffset += stride * indexes[i]; componentOffset += stride * indexes[i];
typeId = elementType; typeId = elementType;
break; break;
...@@ -1515,16 +1515,16 @@ void SpirvShader::emitProlog(SpirvRoutine *routine) const ...@@ -1515,16 +1515,16 @@ void SpirvShader::emitProlog(SpirvRoutine *routine) const
auto resultPointerType = getType(insn.resultTypeId()); auto resultPointerType = getType(insn.resultTypeId());
auto pointeeType = getType(resultPointerType.element); auto pointeeType = getType(resultPointerType.element);
if(pointeeType.sizeInComponents > 0) // TODO: what to do about zero-slot objects? if(pointeeType.componentCount > 0) // TODO: what to do about zero-slot objects?
{ {
routine->createVariable(insn.resultId(), pointeeType.sizeInComponents); routine->createVariable(insn.resultId(), pointeeType.componentCount);
} }
break; break;
} }
case spv::OpPhi: case spv::OpPhi:
{ {
auto type = getType(insn.resultTypeId()); auto type = getType(insn.resultTypeId());
routine->phis.emplace(insn.resultId(), SpirvRoutine::Variable(type.sizeInComponents)); routine->phis.emplace(insn.resultId(), SpirvRoutine::Variable(type.componentCount));
break; break;
} }
...@@ -1973,7 +1973,7 @@ SpirvShader::EmitResult SpirvShader::EmitAccessChain(InsnIterator insn, EmitStat ...@@ -1973,7 +1973,7 @@ SpirvShader::EmitResult SpirvShader::EmitAccessChain(InsnIterator insn, EmitStat
uint32_t numIndexes = insn.wordCount() - 4; uint32_t numIndexes = insn.wordCount() - 4;
const uint32_t *indexes = insn.wordPointer(4); const uint32_t *indexes = insn.wordPointer(4);
auto &type = getType(typeId); auto &type = getType(typeId);
ASSERT(type.sizeInComponents == 1); ASSERT(type.componentCount == 1);
ASSERT(getObject(resultId).kind == Object::Kind::Pointer); ASSERT(getObject(resultId).kind == Object::Kind::Pointer);
if(type.storageClass == spv::StorageClassPushConstant || if(type.storageClass == spv::StorageClassPushConstant ||
...@@ -1995,7 +1995,7 @@ SpirvShader::EmitResult SpirvShader::EmitAccessChain(InsnIterator insn, EmitStat ...@@ -1995,7 +1995,7 @@ SpirvShader::EmitResult SpirvShader::EmitAccessChain(InsnIterator insn, EmitStat
SpirvShader::EmitResult SpirvShader::EmitCompositeConstruct(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitCompositeConstruct(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto offset = 0u; auto offset = 0u;
for(auto i = 0u; i < insn.wordCount() - 3; i++) for(auto i = 0u; i < insn.wordCount() - 3; i++)
...@@ -2005,7 +2005,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeConstruct(InsnIterator insn, E ...@@ -2005,7 +2005,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeConstruct(InsnIterator insn, E
auto &srcObjectTy = getType(srcObject); auto &srcObjectTy = getType(srcObject);
Operand srcObjectAccess(this, state, srcObjectId); Operand srcObjectAccess(this, state, srcObjectId);
for(auto j = 0u; j < srcObjectTy.sizeInComponents; j++) for(auto j = 0u; j < srcObjectTy.componentCount; j++)
{ {
dst.move(offset++, srcObjectAccess.Float(j)); dst.move(offset++, srcObjectAccess.Float(j));
} }
...@@ -2018,7 +2018,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit ...@@ -2018,7 +2018,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit
{ {
Type::ID resultTypeId = insn.word(1); Type::ID resultTypeId = insn.word(1);
auto &type = getType(resultTypeId); auto &type = getType(resultTypeId);
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto &newPartObject = getObject(insn.word(3)); auto &newPartObject = getObject(insn.word(3));
auto &newPartObjectTy = getType(newPartObject); auto &newPartObjectTy = getType(newPartObject);
auto firstNewComponent = WalkLiteralAccessChain(resultTypeId, insn.wordCount() - 5, insn.wordPointer(5)); auto firstNewComponent = WalkLiteralAccessChain(resultTypeId, insn.wordCount() - 5, insn.wordPointer(5));
...@@ -2032,12 +2032,12 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit ...@@ -2032,12 +2032,12 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit
dst.move(i, srcObjectAccess.Float(i)); dst.move(i, srcObjectAccess.Float(i));
} }
// new part // new part
for(auto i = 0u; i < newPartObjectTy.sizeInComponents; i++) for(auto i = 0u; i < newPartObjectTy.componentCount; i++)
{ {
dst.move(firstNewComponent + i, newPartObjectAccess.Float(i)); dst.move(firstNewComponent + i, newPartObjectAccess.Float(i));
} }
// old components after // old components after
for(auto i = firstNewComponent + newPartObjectTy.sizeInComponents; i < type.sizeInComponents; i++) for(auto i = firstNewComponent + newPartObjectTy.componentCount; i < type.componentCount; i++)
{ {
dst.move(i, srcObjectAccess.Float(i)); dst.move(i, srcObjectAccess.Float(i));
} }
...@@ -2048,13 +2048,13 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit ...@@ -2048,13 +2048,13 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeInsert(InsnIterator insn, Emit
SpirvShader::EmitResult SpirvShader::EmitCompositeExtract(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitCompositeExtract(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto &compositeObject = getObject(insn.word(3)); auto &compositeObject = getObject(insn.word(3));
Type::ID compositeTypeId = compositeObject.definition.word(1); Type::ID compositeTypeId = compositeObject.definition.word(1);
auto firstComponent = WalkLiteralAccessChain(compositeTypeId, insn.wordCount() - 4, insn.wordPointer(4)); auto firstComponent = WalkLiteralAccessChain(compositeTypeId, insn.wordCount() - 4, insn.wordPointer(4));
Operand compositeObjectAccess(this, state, insn.word(3)); Operand compositeObjectAccess(this, state, insn.word(3));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, compositeObjectAccess.Float(firstComponent + i)); dst.move(i, compositeObjectAccess.Float(firstComponent + i));
} }
...@@ -2065,7 +2065,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeExtract(InsnIterator insn, Emi ...@@ -2065,7 +2065,7 @@ SpirvShader::EmitResult SpirvShader::EmitCompositeExtract(InsnIterator insn, Emi
SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
// Note: number of components in result type, first half type, and second // Note: number of components in result type, first half type, and second
// half type are all independent. // half type are all independent.
...@@ -2074,7 +2074,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt ...@@ -2074,7 +2074,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt
Operand firstHalfAccess(this, state, insn.word(3)); Operand firstHalfAccess(this, state, insn.word(3));
Operand secondHalfAccess(this, state, insn.word(4)); Operand secondHalfAccess(this, state, insn.word(4));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto selector = insn.word(5 + i); auto selector = insn.word(5 + i);
if(selector == static_cast<uint32_t>(-1)) if(selector == static_cast<uint32_t>(-1))
...@@ -2083,13 +2083,13 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt ...@@ -2083,13 +2083,13 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt
// a value as any // a value as any
dst.move(i, RValue<SIMD::Float>(0.0f)); dst.move(i, RValue<SIMD::Float>(0.0f));
} }
else if(selector < firstHalfType.sizeInComponents) else if(selector < firstHalfType.componentCount)
{ {
dst.move(i, firstHalfAccess.Float(selector)); dst.move(i, firstHalfAccess.Float(selector));
} }
else else
{ {
dst.move(i, secondHalfAccess.Float(selector - firstHalfType.sizeInComponents)); dst.move(i, secondHalfAccess.Float(selector - firstHalfType.componentCount));
} }
} }
...@@ -2099,7 +2099,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt ...@@ -2099,7 +2099,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorShuffle(InsnIterator insn, EmitSt
SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto &srcType = getType(getObject(insn.word(3))); auto &srcType = getType(getObject(insn.word(3)));
Operand src(this, state, insn.word(3)); Operand src(this, state, insn.word(3));
...@@ -2107,7 +2107,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn, ...@@ -2107,7 +2107,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn,
SIMD::UInt v = SIMD::UInt(0); SIMD::UInt v = SIMD::UInt(0);
for(auto i = 0u; i < srcType.sizeInComponents; i++) for(auto i = 0u; i < srcType.componentCount; i++)
{ {
v |= CmpEQ(index.UInt(0), SIMD::UInt(i)) & src.UInt(i); v |= CmpEQ(index.UInt(0), SIMD::UInt(i)) & src.UInt(i);
} }
...@@ -2119,13 +2119,13 @@ SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn, ...@@ -2119,13 +2119,13 @@ SpirvShader::EmitResult SpirvShader::EmitVectorExtractDynamic(InsnIterator insn,
SpirvShader::EmitResult SpirvShader::EmitVectorInsertDynamic(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorInsertDynamic(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
Operand src(this, state, insn.word(3)); Operand src(this, state, insn.word(3));
Operand component(this, state, insn.word(4)); Operand component(this, state, insn.word(4));
Operand index(this, state, insn.word(5)); Operand index(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::UInt mask = CmpEQ(SIMD::UInt(i), index.UInt(0)); SIMD::UInt mask = CmpEQ(SIMD::UInt(i), index.UInt(0));
dst.move(i, (src.UInt(i) & ~mask) | (component.UInt(0) & mask)); dst.move(i, (src.UInt(i) & ~mask) | (component.UInt(0) & mask));
...@@ -2136,13 +2136,13 @@ SpirvShader::EmitResult SpirvShader::EmitVectorInsertDynamic(InsnIterator insn, ...@@ -2136,13 +2136,13 @@ SpirvShader::EmitResult SpirvShader::EmitVectorInsertDynamic(InsnIterator insn,
SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto cond = Operand(this, state, insn.word(3)); auto cond = Operand(this, state, insn.word(3));
auto condIsScalar = (getType(cond).sizeInComponents == 1); auto condIsScalar = (getType(cond).componentCount == 1);
auto lhs = Operand(this, state, insn.word(4)); auto lhs = Operand(this, state, insn.word(4));
auto rhs = Operand(this, state, insn.word(5)); auto rhs = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto sel = cond.Int(condIsScalar ? 0 : i); auto sel = cond.Int(condIsScalar ? 0 : i);
dst.move(i, (sel & lhs.Int(i)) | (~sel & rhs.Int(i))); // TODO: IfThenElse() dst.move(i, (sel & lhs.Int(i)) | (~sel & rhs.Int(i))); // TODO: IfThenElse()
...@@ -2154,14 +2154,14 @@ SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *st ...@@ -2154,14 +2154,14 @@ SpirvShader::EmitResult SpirvShader::EmitSelect(InsnIterator insn, EmitState *st
SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
ASSERT(type.sizeInComponents == 1); ASSERT(type.componentCount == 1);
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto &srcType = getType(getObject(insn.word(3))); auto &srcType = getType(getObject(insn.word(3)));
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
SIMD::UInt result = src.UInt(0); SIMD::UInt result = src.UInt(0);
for(auto i = 1u; i < srcType.sizeInComponents; i++) for(auto i = 1u; i < srcType.componentCount; i++)
{ {
result |= src.UInt(i); result |= src.UInt(i);
} }
...@@ -2173,14 +2173,14 @@ SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state ...@@ -2173,14 +2173,14 @@ SpirvShader::EmitResult SpirvShader::EmitAny(InsnIterator insn, EmitState *state
SpirvShader::EmitResult SpirvShader::EmitAll(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitAll(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
ASSERT(type.sizeInComponents == 1); ASSERT(type.componentCount == 1);
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto &srcType = getType(getObject(insn.word(3))); auto &srcType = getType(getObject(insn.word(3)));
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
SIMD::UInt result = src.UInt(0); SIMD::UInt result = src.UInt(0);
for(auto i = 1u; i < srcType.sizeInComponents; i++) for(auto i = 1u; i < srcType.componentCount; i++)
{ {
result &= src.UInt(i); result &= src.UInt(i);
} }
...@@ -2198,7 +2198,7 @@ SpirvShader::EmitResult SpirvShader::EmitAtomicOp(InsnIterator insn, EmitState * ...@@ -2198,7 +2198,7 @@ SpirvShader::EmitResult SpirvShader::EmitAtomicOp(InsnIterator insn, EmitState *
auto memoryOrder = MemoryOrder(memorySemantics); auto memoryOrder = MemoryOrder(memorySemantics);
// Where no value is provided (increment/decrement) use an implicit value of 1. // Where no value is provided (increment/decrement) use an implicit value of 1.
auto value = (insn.wordCount() == 7) ? Operand(this, state, insn.word(6)).UInt(0) : RValue<SIMD::UInt>(1); auto value = (insn.wordCount() == 7) ? Operand(this, state, insn.word(6)).UInt(0) : RValue<SIMD::UInt>(1);
auto &dst = state->createIntermediate(resultId, resultType.sizeInComponents); auto &dst = state->createIntermediate(resultId, resultType.componentCount);
auto ptr = state->getPointer(insn.word(3)); auto ptr = state->getPointer(insn.word(3));
auto ptrOffsets = ptr.offsets(); auto ptrOffsets = ptr.offsets();
...@@ -2270,7 +2270,7 @@ SpirvShader::EmitResult SpirvShader::EmitAtomicCompareExchange(InsnIterator insn ...@@ -2270,7 +2270,7 @@ SpirvShader::EmitResult SpirvShader::EmitAtomicCompareExchange(InsnIterator insn
auto value = Operand(this, state, insn.word(7)); auto value = Operand(this, state, insn.word(7));
auto comparator = Operand(this, state, insn.word(8)); auto comparator = Operand(this, state, insn.word(8));
auto &dst = state->createIntermediate(resultId, resultType.sizeInComponents); auto &dst = state->createIntermediate(resultId, resultType.componentCount);
auto ptr = state->getPointer(insn.word(3)); auto ptr = state->getPointer(insn.word(3));
auto ptrOffsets = ptr.offsets(); auto ptrOffsets = ptr.offsets();
...@@ -2295,9 +2295,9 @@ SpirvShader::EmitResult SpirvShader::EmitAtomicCompareExchange(InsnIterator insn ...@@ -2295,9 +2295,9 @@ SpirvShader::EmitResult SpirvShader::EmitAtomicCompareExchange(InsnIterator insn
SpirvShader::EmitResult SpirvShader::EmitCopyObject(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitCopyObject(InsnIterator insn, EmitState *state) const
{ {
auto type = getType(insn.resultTypeId()); auto type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
for(uint32_t i = 0; i < type.sizeInComponents; i++) for(uint32_t i = 0; i < type.componentCount; i++)
{ {
dst.move(i, src.Int(i)); dst.move(i, src.Int(i));
} }
...@@ -2310,7 +2310,7 @@ SpirvShader::EmitResult SpirvShader::EmitArrayLength(InsnIterator insn, EmitStat ...@@ -2310,7 +2310,7 @@ SpirvShader::EmitResult SpirvShader::EmitArrayLength(InsnIterator insn, EmitStat
auto arrayFieldIdx = insn.word(4); auto arrayFieldIdx = insn.word(4);
auto &resultType = getType(insn.resultTypeId()); auto &resultType = getType(insn.resultTypeId());
ASSERT(resultType.sizeInComponents == 1); ASSERT(resultType.componentCount == 1);
ASSERT(resultType.definition.opcode() == spv::OpTypeInt); ASSERT(resultType.definition.opcode() == spv::OpTypeInt);
auto &structPtrTy = getType(getObject(structPtrId)); auto &structPtrTy = getType(getObject(structPtrId));
...@@ -2356,7 +2356,7 @@ uint32_t SpirvShader::GetConstScalarInt(Object::ID id) const ...@@ -2356,7 +2356,7 @@ uint32_t SpirvShader::GetConstScalarInt(Object::ID id) const
{ {
auto &scopeObj = getObject(id); auto &scopeObj = getObject(id);
ASSERT(scopeObj.kind == Object::Kind::Constant); ASSERT(scopeObj.kind == Object::Kind::Constant);
ASSERT(getType(scopeObj).sizeInComponents == 1); ASSERT(getType(scopeObj).componentCount == 1);
return scopeObj.constantValue[0]; return scopeObj.constantValue[0];
} }
......
...@@ -65,17 +65,17 @@ class SpirvRoutine; ...@@ -65,17 +65,17 @@ class SpirvRoutine;
// Incrementally constructed complex bundle of rvalues // Incrementally constructed complex bundle of rvalues
// Effectively a restricted vector, supporting only: // Effectively a restricted vector, supporting only:
// - allocation to a (runtime-known) fixed size // - allocation to a (runtime-known) fixed component count
// - in-place construction of elements // - in-place construction of elements
// - const operator[] // - const operator[]
class Intermediate class Intermediate
{ {
public: public:
Intermediate(uint32_t size) Intermediate(uint32_t componentCount)
: scalar(new rr::Value *[size]) : scalar(new rr::Value *[componentCount])
, size(size) , componentCount(componentCount)
{ {
memset(scalar, 0, sizeof(rr::Value *) * size); memset(scalar, 0, sizeof(rr::Value *) * componentCount);
} }
~Intermediate() ~Intermediate()
...@@ -94,21 +94,21 @@ public: ...@@ -94,21 +94,21 @@ public:
// Value retrieval functions. // Value retrieval functions.
RValue<SIMD::Float> Float(uint32_t i) const RValue<SIMD::Float> Float(uint32_t i) const
{ {
ASSERT(i < size); ASSERT(i < componentCount);
ASSERT(scalar[i] != nullptr); ASSERT(scalar[i] != nullptr);
return As<SIMD::Float>(scalar[i]); // TODO(b/128539387): RValue<SIMD::Float>(scalar) return As<SIMD::Float>(scalar[i]); // TODO(b/128539387): RValue<SIMD::Float>(scalar)
} }
RValue<SIMD::Int> Int(uint32_t i) const RValue<SIMD::Int> Int(uint32_t i) const
{ {
ASSERT(i < size); ASSERT(i < componentCount);
ASSERT(scalar[i] != nullptr); ASSERT(scalar[i] != nullptr);
return As<SIMD::Int>(scalar[i]); // TODO(b/128539387): RValue<SIMD::Int>(scalar) return As<SIMD::Int>(scalar[i]); // TODO(b/128539387): RValue<SIMD::Int>(scalar)
} }
RValue<SIMD::UInt> UInt(uint32_t i) const RValue<SIMD::UInt> UInt(uint32_t i) const
{ {
ASSERT(i < size); ASSERT(i < componentCount);
ASSERT(scalar[i] != nullptr); ASSERT(scalar[i] != nullptr);
return As<SIMD::UInt>(scalar[i]); // TODO(b/128539387): RValue<SIMD::UInt>(scalar) return As<SIMD::UInt>(scalar[i]); // TODO(b/128539387): RValue<SIMD::UInt>(scalar)
} }
...@@ -122,13 +122,13 @@ public: ...@@ -122,13 +122,13 @@ public:
private: private:
void emplace(uint32_t i, rr::Value *value) void emplace(uint32_t i, rr::Value *value)
{ {
ASSERT(i < size); ASSERT(i < componentCount);
ASSERT(scalar[i] == nullptr); ASSERT(scalar[i] == nullptr);
scalar[i] = value; scalar[i] = value;
} }
rr::Value **const scalar; rr::Value **const scalar;
uint32_t size; uint32_t componentCount;
}; };
class SpirvShader class SpirvShader
...@@ -259,7 +259,7 @@ public: ...@@ -259,7 +259,7 @@ public:
InsnIterator definition; InsnIterator definition;
spv::StorageClass storageClass = static_cast<spv::StorageClass>(-1); spv::StorageClass storageClass = static_cast<spv::StorageClass>(-1);
uint32_t sizeInComponents = 0; uint32_t componentCount = 0;
bool isBuiltInBlock = false; bool isBuiltInBlock = false;
// Inner element type for pointers, arrays, vectors and matrices. // Inner element type for pointers, arrays, vectors and matrices.
...@@ -939,11 +939,11 @@ private: ...@@ -939,11 +939,11 @@ private:
OutOfBoundsBehavior getOutOfBoundsBehavior(spv::StorageClass storageClass) const; OutOfBoundsBehavior getOutOfBoundsBehavior(spv::StorageClass storageClass) const;
Intermediate &createIntermediate(Object::ID id, uint32_t size) Intermediate &createIntermediate(Object::ID id, uint32_t componentCount)
{ {
auto it = intermediates.emplace(std::piecewise_construct, auto it = intermediates.emplace(std::piecewise_construct,
std::forward_as_tuple(id), std::forward_as_tuple(id),
std::forward_as_tuple(size)); std::forward_as_tuple(componentCount));
ASSERT_MSG(it.second, "Intermediate %d created twice", id.value()); ASSERT_MSG(it.second, "Intermediate %d created twice", id.value());
return it.first->second; return it.first->second;
} }
...@@ -1336,9 +1336,9 @@ public: ...@@ -1336,9 +1336,9 @@ public:
Pointer<Byte> dbgState; // Pointer to a debugger state. Pointer<Byte> dbgState; // Pointer to a debugger state.
void createVariable(SpirvShader::Object::ID id, uint32_t size) void createVariable(SpirvShader::Object::ID id, uint32_t componentCount)
{ {
bool added = variables.emplace(id, Variable(size)).second; bool added = variables.emplace(id, Variable(componentCount)).second;
ASSERT_MSG(added, "Variable %d created twice", id.value()); ASSERT_MSG(added, "Variable %d created twice", id.value());
} }
......
...@@ -23,11 +23,11 @@ namespace sw { ...@@ -23,11 +23,11 @@ namespace sw {
SpirvShader::EmitResult SpirvShader::EmitVectorTimesScalar(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorTimesScalar(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, lhs.Float(i) * rhs.Float(0)); dst.move(i, lhs.Float(i) * rhs.Float(0));
} }
...@@ -38,17 +38,17 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesScalar(InsnIterator insn, Em ...@@ -38,17 +38,17 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesScalar(InsnIterator insn, Em
SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
auto rhsType = getType(rhs); auto rhsType = getType(rhs);
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::Float v = lhs.Float(i) * rhs.Float(0); SIMD::Float v = lhs.Float(i) * rhs.Float(0);
for(auto j = 1u; j < rhsType.sizeInComponents; j++) for(auto j = 1u; j < rhsType.componentCount; j++)
{ {
v += lhs.Float(i + type.sizeInComponents * j) * rhs.Float(j); v += lhs.Float(i + type.componentCount * j) * rhs.Float(j);
} }
dst.move(i, v); dst.move(i, v);
} }
...@@ -59,17 +59,17 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, Em ...@@ -59,17 +59,17 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesVector(InsnIterator insn, Em
SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
auto lhsType = getType(lhs); auto lhsType = getType(lhs);
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::Float v = lhs.Float(0) * rhs.Float(i * lhsType.sizeInComponents); SIMD::Float v = lhs.Float(0) * rhs.Float(i * lhsType.componentCount);
for(auto j = 1u; j < lhsType.sizeInComponents; j++) for(auto j = 1u; j < lhsType.componentCount; j++)
{ {
v += lhs.Float(j) * rhs.Float(i * lhsType.sizeInComponents + j); v += lhs.Float(j) * rhs.Float(i * lhsType.componentCount + j);
} }
dst.move(i, v); dst.move(i, v);
} }
...@@ -80,7 +80,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, Em ...@@ -80,7 +80,7 @@ SpirvShader::EmitResult SpirvShader::EmitVectorTimesMatrix(InsnIterator insn, Em
SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
...@@ -107,7 +107,7 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, Em ...@@ -107,7 +107,7 @@ SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, Em
SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
auto &lhsType = getType(lhs); auto &lhsType = getType(lhs);
...@@ -136,11 +136,11 @@ SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitSta ...@@ -136,11 +136,11 @@ SpirvShader::EmitResult SpirvShader::EmitOuterProduct(InsnIterator insn, EmitSta
SpirvShader::EmitResult SpirvShader::EmitTranspose(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitTranspose(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto mat = Operand(this, state, insn.word(3)); auto mat = Operand(this, state, insn.word(3));
auto numCols = type.definition.word(3); auto numCols = type.definition.word(3);
auto numRows = getType(type.definition.word(2)).sizeInComponents; auto numRows = getType(type.definition.word(2)).componentCount;
for(auto col = 0u; col < numCols; col++) for(auto col = 0u; col < numCols; col++)
{ {
...@@ -156,10 +156,10 @@ SpirvShader::EmitResult SpirvShader::EmitTranspose(InsnIterator insn, EmitState ...@@ -156,10 +156,10 @@ SpirvShader::EmitResult SpirvShader::EmitTranspose(InsnIterator insn, EmitState
SpirvShader::EmitResult SpirvShader::EmitUnaryOp(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitUnaryOp(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto src = Operand(this, state, insn.word(3)); auto src = Operand(this, state, insn.word(3));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
switch(insn.opcode()) switch(insn.opcode())
{ {
...@@ -318,12 +318,12 @@ SpirvShader::EmitResult SpirvShader::EmitUnaryOp(InsnIterator insn, EmitState *s ...@@ -318,12 +318,12 @@ SpirvShader::EmitResult SpirvShader::EmitUnaryOp(InsnIterator insn, EmitState *s
SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto &lhsType = getType(getObject(insn.word(3))); auto &lhsType = getType(getObject(insn.word(3)));
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
for(auto i = 0u; i < lhsType.sizeInComponents; i++) for(auto i = 0u; i < lhsType.componentCount; i++)
{ {
switch(insn.opcode()) switch(insn.opcode())
{ {
...@@ -496,19 +496,19 @@ SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState * ...@@ -496,19 +496,19 @@ SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState *
// In our flat view then, component i is the i'th component of the first member; // In our flat view then, component i is the i'th component of the first member;
// component i + N is the i'th component of the second member. // component i + N is the i'th component of the second member.
dst.move(i, lhs.Int(i) * rhs.Int(i)); dst.move(i, lhs.Int(i) * rhs.Int(i));
dst.move(i + lhsType.sizeInComponents, MulHigh(lhs.Int(i), rhs.Int(i))); dst.move(i + lhsType.componentCount, MulHigh(lhs.Int(i), rhs.Int(i)));
break; break;
case spv::OpUMulExtended: case spv::OpUMulExtended:
dst.move(i, lhs.UInt(i) * rhs.UInt(i)); dst.move(i, lhs.UInt(i) * rhs.UInt(i));
dst.move(i + lhsType.sizeInComponents, MulHigh(lhs.UInt(i), rhs.UInt(i))); dst.move(i + lhsType.componentCount, MulHigh(lhs.UInt(i), rhs.UInt(i)));
break; break;
case spv::OpIAddCarry: case spv::OpIAddCarry:
dst.move(i, lhs.UInt(i) + rhs.UInt(i)); dst.move(i, lhs.UInt(i) + rhs.UInt(i));
dst.move(i + lhsType.sizeInComponents, CmpLT(dst.UInt(i), lhs.UInt(i)) >> 31); dst.move(i + lhsType.componentCount, CmpLT(dst.UInt(i), lhs.UInt(i)) >> 31);
break; break;
case spv::OpISubBorrow: case spv::OpISubBorrow:
dst.move(i, lhs.UInt(i) - rhs.UInt(i)); dst.move(i, lhs.UInt(i) - rhs.UInt(i));
dst.move(i + lhsType.sizeInComponents, CmpLT(lhs.UInt(i), rhs.UInt(i)) >> 31); dst.move(i + lhsType.componentCount, CmpLT(lhs.UInt(i), rhs.UInt(i)) >> 31);
break; break;
default: default:
UNREACHABLE("%s", OpcodeName(insn.opcode()).c_str()); UNREACHABLE("%s", OpcodeName(insn.opcode()).c_str());
...@@ -521,13 +521,13 @@ SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState * ...@@ -521,13 +521,13 @@ SpirvShader::EmitResult SpirvShader::EmitBinaryOp(InsnIterator insn, EmitState *
SpirvShader::EmitResult SpirvShader::EmitDot(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitDot(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
ASSERT(type.sizeInComponents == 1); ASSERT(type.componentCount == 1);
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto &lhsType = getType(getObject(insn.word(3))); auto &lhsType = getType(getObject(insn.word(3)));
auto lhs = Operand(this, state, insn.word(3)); auto lhs = Operand(this, state, insn.word(3));
auto rhs = Operand(this, state, insn.word(4)); auto rhs = Operand(this, state, insn.word(4));
dst.move(0, Dot(lhsType.sizeInComponents, lhs, rhs)); dst.move(0, Dot(lhsType.componentCount, lhs, rhs));
return EmitResult::Continue; return EmitResult::Continue;
} }
......
...@@ -496,7 +496,7 @@ SpirvShader::EmitResult SpirvShader::EmitBranchConditional(InsnIterator insn, Em ...@@ -496,7 +496,7 @@ SpirvShader::EmitResult SpirvShader::EmitBranchConditional(InsnIterator insn, Em
auto falseBlockId = Block::ID(block.branchInstruction.word(3)); auto falseBlockId = Block::ID(block.branchInstruction.word(3));
auto cond = Operand(this, state, condId); auto cond = Operand(this, state, condId);
ASSERT_MSG(getType(cond).sizeInComponents == 1, "Condition must be a Boolean type scalar"); ASSERT_MSG(getType(cond).componentCount == 1, "Condition must be a Boolean type scalar");
// TODO: Optimize for case where all lanes take same path. // TODO: Optimize for case where all lanes take same path.
...@@ -515,7 +515,7 @@ SpirvShader::EmitResult SpirvShader::EmitSwitch(InsnIterator insn, EmitState *st ...@@ -515,7 +515,7 @@ SpirvShader::EmitResult SpirvShader::EmitSwitch(InsnIterator insn, EmitState *st
auto selId = Object::ID(block.branchInstruction.word(1)); auto selId = Object::ID(block.branchInstruction.word(1));
auto sel = Operand(this, state, selId); auto sel = Operand(this, state, selId);
ASSERT_MSG(getType(sel).sizeInComponents == 1, "Selector must be a scalar"); ASSERT_MSG(getType(sel).componentCount == 1, "Selector must be a scalar");
auto numCases = (block.branchInstruction.wordCount() - 3) / 2; auto numCases = (block.branchInstruction.wordCount() - 3) / 2;
...@@ -650,8 +650,8 @@ void SpirvShader::LoadPhi(InsnIterator insn, EmitState *state) const ...@@ -650,8 +650,8 @@ void SpirvShader::LoadPhi(InsnIterator insn, EmitState *state) const
ASSERT(storageIt != state->routine->phis.end()); ASSERT(storageIt != state->routine->phis.end());
auto &storage = storageIt->second; auto &storage = storageIt->second;
auto &dst = state->createIntermediate(objectId, type.sizeInComponents); auto &dst = state->createIntermediate(objectId, type.componentCount);
for(uint32_t i = 0; i < type.sizeInComponents; i++) for(uint32_t i = 0; i < type.componentCount; i++)
{ {
dst.move(i, storage[i]); dst.move(i, storage[i]);
} }
...@@ -680,7 +680,7 @@ void SpirvShader::StorePhi(Block::ID currentBlock, InsnIterator insn, EmitState ...@@ -680,7 +680,7 @@ void SpirvShader::StorePhi(Block::ID currentBlock, InsnIterator insn, EmitState
auto mask = GetActiveLaneMaskEdge(state, blockId, currentBlock); auto mask = GetActiveLaneMaskEdge(state, blockId, currentBlock);
auto in = Operand(this, state, varId); auto in = Operand(this, state, varId);
for(uint32_t i = 0; i < type.sizeInComponents; i++) for(uint32_t i = 0; i < type.componentCount; i++)
{ {
storage[i] = As<SIMD::Float>((As<SIMD::Int>(storage[i]) & ~mask) | (in.Int(i) & mask)); storage[i] = As<SIMD::Float>((As<SIMD::Int>(storage[i]) & ~mask) | (in.Int(i) & mask));
} }
......
...@@ -28,7 +28,7 @@ namespace sw { ...@@ -28,7 +28,7 @@ namespace sw {
SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitState *state) const
{ {
auto &type = getType(insn.resultTypeId()); auto &type = getType(insn.resultTypeId());
auto &dst = state->createIntermediate(insn.resultId(), type.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), type.componentCount);
auto extInstIndex = static_cast<GLSLstd450>(insn.word(4)); auto extInstIndex = static_cast<GLSLstd450>(insn.word(4));
switch(extInstIndex) switch(extInstIndex)
...@@ -36,7 +36,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -36,7 +36,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450FAbs: case GLSLstd450FAbs:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Abs(src.Float(i))); dst.move(i, Abs(src.Float(i)));
} }
...@@ -45,7 +45,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -45,7 +45,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450SAbs: case GLSLstd450SAbs:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Abs(src.Int(i))); dst.move(i, Abs(src.Int(i)));
} }
...@@ -63,7 +63,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -63,7 +63,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Floor: case GLSLstd450Floor:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Floor(src.Float(i))); dst.move(i, Floor(src.Float(i)));
} }
...@@ -72,7 +72,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -72,7 +72,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Trunc: case GLSLstd450Trunc:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Trunc(src.Float(i))); dst.move(i, Trunc(src.Float(i)));
} }
...@@ -81,7 +81,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -81,7 +81,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Ceil: case GLSLstd450Ceil:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Ceil(src.Float(i))); dst.move(i, Ceil(src.Float(i)));
} }
...@@ -90,7 +90,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -90,7 +90,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Fract: case GLSLstd450Fract:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Frac(src.Float(i))); dst.move(i, Frac(src.Float(i)));
} }
...@@ -99,7 +99,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -99,7 +99,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Round: case GLSLstd450Round:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Round(src.Float(i))); dst.move(i, Round(src.Float(i)));
} }
...@@ -108,7 +108,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -108,7 +108,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450RoundEven: case GLSLstd450RoundEven:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto x = Round(src.Float(i)); auto x = Round(src.Float(i));
// dst = round(src) + ((round(src) < src) * 2 - 1) * (fract(src) == 0.5) * isOdd(round(src)); // dst = round(src) + ((round(src) < src) * 2 - 1) * (fract(src) == 0.5) * isOdd(round(src));
...@@ -121,7 +121,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -121,7 +121,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto lhs = Operand(this, state, insn.word(5)); auto lhs = Operand(this, state, insn.word(5));
auto rhs = Operand(this, state, insn.word(6)); auto rhs = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Min(lhs.Float(i), rhs.Float(i))); dst.move(i, Min(lhs.Float(i), rhs.Float(i)));
} }
...@@ -131,7 +131,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -131,7 +131,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto lhs = Operand(this, state, insn.word(5)); auto lhs = Operand(this, state, insn.word(5));
auto rhs = Operand(this, state, insn.word(6)); auto rhs = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Max(lhs.Float(i), rhs.Float(i))); dst.move(i, Max(lhs.Float(i), rhs.Float(i)));
} }
...@@ -141,7 +141,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -141,7 +141,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto lhs = Operand(this, state, insn.word(5)); auto lhs = Operand(this, state, insn.word(5));
auto rhs = Operand(this, state, insn.word(6)); auto rhs = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Min(lhs.Int(i), rhs.Int(i))); dst.move(i, Min(lhs.Int(i), rhs.Int(i)));
} }
...@@ -151,7 +151,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -151,7 +151,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto lhs = Operand(this, state, insn.word(5)); auto lhs = Operand(this, state, insn.word(5));
auto rhs = Operand(this, state, insn.word(6)); auto rhs = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Max(lhs.Int(i), rhs.Int(i))); dst.move(i, Max(lhs.Int(i), rhs.Int(i)));
} }
...@@ -161,7 +161,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -161,7 +161,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto lhs = Operand(this, state, insn.word(5)); auto lhs = Operand(this, state, insn.word(5));
auto rhs = Operand(this, state, insn.word(6)); auto rhs = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Min(lhs.UInt(i), rhs.UInt(i))); dst.move(i, Min(lhs.UInt(i), rhs.UInt(i)));
} }
...@@ -171,7 +171,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -171,7 +171,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto lhs = Operand(this, state, insn.word(5)); auto lhs = Operand(this, state, insn.word(5));
auto rhs = Operand(this, state, insn.word(6)); auto rhs = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Max(lhs.UInt(i), rhs.UInt(i))); dst.move(i, Max(lhs.UInt(i), rhs.UInt(i)));
} }
...@@ -181,7 +181,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -181,7 +181,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto edge = Operand(this, state, insn.word(5)); auto edge = Operand(this, state, insn.word(5));
auto x = Operand(this, state, insn.word(6)); auto x = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, CmpNLT(x.Float(i), edge.Float(i)) & As<SIMD::Int>(SIMD::Float(1.0f))); dst.move(i, CmpNLT(x.Float(i), edge.Float(i)) & As<SIMD::Int>(SIMD::Float(1.0f)));
} }
...@@ -192,7 +192,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -192,7 +192,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto edge0 = Operand(this, state, insn.word(5)); auto edge0 = Operand(this, state, insn.word(5));
auto edge1 = Operand(this, state, insn.word(6)); auto edge1 = Operand(this, state, insn.word(6));
auto x = Operand(this, state, insn.word(7)); auto x = Operand(this, state, insn.word(7));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto tx = Min(Max((x.Float(i) - edge0.Float(i)) / auto tx = Min(Max((x.Float(i) - edge0.Float(i)) /
(edge1.Float(i) - edge0.Float(i)), (edge1.Float(i) - edge0.Float(i)),
...@@ -207,7 +207,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -207,7 +207,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
auto y = Operand(this, state, insn.word(6)); auto y = Operand(this, state, insn.word(6));
auto a = Operand(this, state, insn.word(7)); auto a = Operand(this, state, insn.word(7));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, a.Float(i) * (y.Float(i) - x.Float(i)) + x.Float(i)); dst.move(i, a.Float(i) * (y.Float(i) - x.Float(i)) + x.Float(i));
} }
...@@ -218,7 +218,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -218,7 +218,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
auto minVal = Operand(this, state, insn.word(6)); auto minVal = Operand(this, state, insn.word(6));
auto maxVal = Operand(this, state, insn.word(7)); auto maxVal = Operand(this, state, insn.word(7));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Min(Max(x.Float(i), minVal.Float(i)), maxVal.Float(i))); dst.move(i, Min(Max(x.Float(i), minVal.Float(i)), maxVal.Float(i)));
} }
...@@ -229,7 +229,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -229,7 +229,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
auto minVal = Operand(this, state, insn.word(6)); auto minVal = Operand(this, state, insn.word(6));
auto maxVal = Operand(this, state, insn.word(7)); auto maxVal = Operand(this, state, insn.word(7));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Min(Max(x.Int(i), minVal.Int(i)), maxVal.Int(i))); dst.move(i, Min(Max(x.Int(i), minVal.Int(i)), maxVal.Int(i)));
} }
...@@ -240,7 +240,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -240,7 +240,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
auto minVal = Operand(this, state, insn.word(6)); auto minVal = Operand(this, state, insn.word(6));
auto maxVal = Operand(this, state, insn.word(7)); auto maxVal = Operand(this, state, insn.word(7));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Min(Max(x.UInt(i), minVal.UInt(i)), maxVal.UInt(i))); dst.move(i, Min(Max(x.UInt(i), minVal.UInt(i)), maxVal.UInt(i)));
} }
...@@ -249,7 +249,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -249,7 +249,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450FSign: case GLSLstd450FSign:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto neg = As<SIMD::Int>(CmpLT(src.Float(i), SIMD::Float(-0.0f))) & As<SIMD::Int>(SIMD::Float(-1.0f)); auto neg = As<SIMD::Int>(CmpLT(src.Float(i), SIMD::Float(-0.0f))) & As<SIMD::Int>(SIMD::Float(-1.0f));
auto pos = As<SIMD::Int>(CmpNLE(src.Float(i), SIMD::Float(+0.0f))) & As<SIMD::Int>(SIMD::Float(1.0f)); auto pos = As<SIMD::Int>(CmpNLE(src.Float(i), SIMD::Float(+0.0f))) & As<SIMD::Int>(SIMD::Float(1.0f));
...@@ -260,7 +260,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -260,7 +260,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450SSign: case GLSLstd450SSign:
{ {
auto src = Operand(this, state, insn.word(5)); auto src = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto neg = CmpLT(src.Int(i), SIMD::Int(0)) & SIMD::Int(-1); auto neg = CmpLT(src.Int(i), SIMD::Int(0)) & SIMD::Int(-1);
auto pos = CmpNLE(src.Int(i), SIMD::Int(0)) & SIMD::Int(1); auto pos = CmpNLE(src.Int(i), SIMD::Int(0)) & SIMD::Int(1);
...@@ -273,9 +273,9 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -273,9 +273,9 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto I = Operand(this, state, insn.word(5)); auto I = Operand(this, state, insn.word(5));
auto N = Operand(this, state, insn.word(6)); auto N = Operand(this, state, insn.word(6));
SIMD::Float d = Dot(type.sizeInComponents, I, N); SIMD::Float d = Dot(type.componentCount, I, N);
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, I.Float(i) - SIMD::Float(2.0f) * d * N.Float(i)); dst.move(i, I.Float(i) - SIMD::Float(2.0f) * d * N.Float(i));
} }
...@@ -287,12 +287,12 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -287,12 +287,12 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto N = Operand(this, state, insn.word(6)); auto N = Operand(this, state, insn.word(6));
auto eta = Operand(this, state, insn.word(7)); auto eta = Operand(this, state, insn.word(7));
SIMD::Float d = Dot(type.sizeInComponents, I, N); SIMD::Float d = Dot(type.componentCount, I, N);
SIMD::Float k = SIMD::Float(1.0f) - eta.Float(0) * eta.Float(0) * (SIMD::Float(1.0f) - d * d); SIMD::Float k = SIMD::Float(1.0f) - eta.Float(0) * eta.Float(0) * (SIMD::Float(1.0f) - d * d);
SIMD::Int pos = CmpNLT(k, SIMD::Float(0.0f)); SIMD::Int pos = CmpNLT(k, SIMD::Float(0.0f));
SIMD::Float t = (eta.Float(0) * d + Sqrt(k)); SIMD::Float t = (eta.Float(0) * d + Sqrt(k));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, pos & As<SIMD::Int>(eta.Float(0) * I.Float(i) - t * N.Float(i))); dst.move(i, pos & As<SIMD::Int>(eta.Float(0) * I.Float(i) - t * N.Float(i)));
} }
...@@ -304,10 +304,10 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -304,10 +304,10 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto I = Operand(this, state, insn.word(6)); auto I = Operand(this, state, insn.word(6));
auto Nref = Operand(this, state, insn.word(7)); auto Nref = Operand(this, state, insn.word(7));
SIMD::Float d = Dot(type.sizeInComponents, I, Nref); SIMD::Float d = Dot(type.componentCount, I, Nref);
SIMD::Int neg = CmpLT(d, SIMD::Float(0.0f)); SIMD::Int neg = CmpLT(d, SIMD::Float(0.0f));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto n = N.Float(i); auto n = N.Float(i);
dst.move(i, (neg & As<SIMD::Int>(n)) | (~neg & As<SIMD::Int>(-n))); dst.move(i, (neg & As<SIMD::Int>(n)) | (~neg & As<SIMD::Int>(-n)));
...@@ -317,7 +317,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -317,7 +317,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Length: case GLSLstd450Length:
{ {
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
SIMD::Float d = Dot(getType(getObject(insn.word(5))).sizeInComponents, x, x); SIMD::Float d = Dot(getType(getObject(insn.word(5))).componentCount, x, x);
dst.move(0, Sqrt(d)); dst.move(0, Sqrt(d));
break; break;
...@@ -325,10 +325,10 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -325,10 +325,10 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Normalize: case GLSLstd450Normalize:
{ {
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
SIMD::Float d = Dot(getType(getObject(insn.word(5))).sizeInComponents, x, x); SIMD::Float d = Dot(getType(getObject(insn.word(5))).componentCount, x, x);
SIMD::Float invLength = SIMD::Float(1.0f) / Sqrt(d); SIMD::Float invLength = SIMD::Float(1.0f) / Sqrt(d);
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, invLength * x.Float(i)); dst.move(i, invLength * x.Float(i));
} }
...@@ -343,7 +343,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -343,7 +343,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
// sqrt(dot(p0-p1, p0-p1)) // sqrt(dot(p0-p1, p0-p1))
SIMD::Float d = (p0.Float(0) - p1.Float(0)) * (p0.Float(0) - p1.Float(0)); SIMD::Float d = (p0.Float(0) - p1.Float(0)) * (p0.Float(0) - p1.Float(0));
for(auto i = 1u; i < p0Type.sizeInComponents; i++) for(auto i = 1u; i < p0Type.componentCount; i++)
{ {
d += (p0.Float(i) - p1.Float(i)) * (p0.Float(i) - p1.Float(i)); d += (p0.Float(i) - p1.Float(i)) * (p0.Float(i) - p1.Float(i));
} }
...@@ -364,7 +364,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -364,7 +364,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
// - Eliminate lane masking and assume interleaving. // - Eliminate lane masking and assume interleaving.
auto robustness = OutOfBoundsBehavior::UndefinedBehavior; auto robustness = OutOfBoundsBehavior::UndefinedBehavior;
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::Float whole, frac; SIMD::Float whole, frac;
std::tie(whole, frac) = Modf(val.Float(i)); std::tie(whole, frac) = Modf(val.Float(i));
...@@ -380,12 +380,12 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -380,12 +380,12 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
auto valTy = getType(val); auto valTy = getType(val);
for(auto i = 0u; i < valTy.sizeInComponents; i++) for(auto i = 0u; i < valTy.componentCount; i++)
{ {
SIMD::Float whole, frac; SIMD::Float whole, frac;
std::tie(whole, frac) = Modf(val.Float(i)); std::tie(whole, frac) = Modf(val.Float(i));
dst.move(i, frac); dst.move(i, frac);
dst.move(i + valTy.sizeInComponents, whole); dst.move(i + valTy.componentCount, whole);
} }
break; break;
} }
...@@ -491,7 +491,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -491,7 +491,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto a = Operand(this, state, insn.word(5)); auto a = Operand(this, state, insn.word(5));
auto b = Operand(this, state, insn.word(6)); auto b = Operand(this, state, insn.word(6));
auto c = Operand(this, state, insn.word(7)); auto c = Operand(this, state, insn.word(7));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, FMA(a.Float(i), b.Float(i), c.Float(i))); dst.move(i, FMA(a.Float(i), b.Float(i), c.Float(i)));
} }
...@@ -510,7 +510,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -510,7 +510,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
// - Eliminate lane masking and assume interleaving. // - Eliminate lane masking and assume interleaving.
auto robustness = OutOfBoundsBehavior::UndefinedBehavior; auto robustness = OutOfBoundsBehavior::UndefinedBehavior;
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::Float significand; SIMD::Float significand;
SIMD::Int exponent; SIMD::Int exponent;
...@@ -527,7 +527,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -527,7 +527,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450FrexpStruct: case GLSLstd450FrexpStruct:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
auto numComponents = getType(val).sizeInComponents; auto numComponents = getType(val).componentCount;
for(auto i = 0u; i < numComponents; i++) for(auto i = 0u; i < numComponents; i++)
{ {
auto significandAndExponent = Frexp(val.Float(i)); auto significandAndExponent = Frexp(val.Float(i));
...@@ -540,7 +540,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -540,7 +540,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto significand = Operand(this, state, insn.word(5)); auto significand = Operand(this, state, insn.word(5));
auto exponent = Operand(this, state, insn.word(6)); auto exponent = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
// Assumes IEEE 754 // Assumes IEEE 754
auto in = significand.Float(i); auto in = significand.Float(i);
...@@ -573,7 +573,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -573,7 +573,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Radians: case GLSLstd450Radians:
{ {
auto degrees = Operand(this, state, insn.word(5)); auto degrees = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, degrees.Float(i) * SIMD::Float(PI / 180.0f)); dst.move(i, degrees.Float(i) * SIMD::Float(PI / 180.0f));
} }
...@@ -582,7 +582,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -582,7 +582,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Degrees: case GLSLstd450Degrees:
{ {
auto radians = Operand(this, state, insn.word(5)); auto radians = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, radians.Float(i) * SIMD::Float(180.0f / PI)); dst.move(i, radians.Float(i) * SIMD::Float(180.0f / PI));
} }
...@@ -591,7 +591,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -591,7 +591,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Sin: case GLSLstd450Sin:
{ {
auto radians = Operand(this, state, insn.word(5)); auto radians = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Sin(radians.Float(i))); dst.move(i, Sin(radians.Float(i)));
} }
...@@ -600,7 +600,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -600,7 +600,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Cos: case GLSLstd450Cos:
{ {
auto radians = Operand(this, state, insn.word(5)); auto radians = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Cos(radians.Float(i))); dst.move(i, Cos(radians.Float(i)));
} }
...@@ -609,7 +609,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -609,7 +609,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Tan: case GLSLstd450Tan:
{ {
auto radians = Operand(this, state, insn.word(5)); auto radians = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Tan(radians.Float(i))); dst.move(i, Tan(radians.Float(i)));
} }
...@@ -618,7 +618,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -618,7 +618,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Asin: case GLSLstd450Asin:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Asin(val.Float(i))); dst.move(i, Asin(val.Float(i)));
} }
...@@ -627,7 +627,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -627,7 +627,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Acos: case GLSLstd450Acos:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Acos(val.Float(i))); dst.move(i, Acos(val.Float(i)));
} }
...@@ -636,7 +636,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -636,7 +636,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Atan: case GLSLstd450Atan:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Atan(val.Float(i))); dst.move(i, Atan(val.Float(i)));
} }
...@@ -645,7 +645,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -645,7 +645,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Sinh: case GLSLstd450Sinh:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Sinh(val.Float(i))); dst.move(i, Sinh(val.Float(i)));
} }
...@@ -654,7 +654,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -654,7 +654,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Cosh: case GLSLstd450Cosh:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Cosh(val.Float(i))); dst.move(i, Cosh(val.Float(i)));
} }
...@@ -663,7 +663,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -663,7 +663,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Tanh: case GLSLstd450Tanh:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Tanh(val.Float(i))); dst.move(i, Tanh(val.Float(i)));
} }
...@@ -672,7 +672,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -672,7 +672,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Asinh: case GLSLstd450Asinh:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Asinh(val.Float(i))); dst.move(i, Asinh(val.Float(i)));
} }
...@@ -681,7 +681,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -681,7 +681,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Acosh: case GLSLstd450Acosh:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Acosh(val.Float(i))); dst.move(i, Acosh(val.Float(i)));
} }
...@@ -690,7 +690,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -690,7 +690,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Atanh: case GLSLstd450Atanh:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Atanh(val.Float(i))); dst.move(i, Atanh(val.Float(i)));
} }
...@@ -700,7 +700,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -700,7 +700,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
auto y = Operand(this, state, insn.word(6)); auto y = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Atan2(x.Float(i), y.Float(i))); dst.move(i, Atan2(x.Float(i), y.Float(i)));
} }
...@@ -710,7 +710,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -710,7 +710,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
auto y = Operand(this, state, insn.word(6)); auto y = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Pow(x.Float(i), y.Float(i))); dst.move(i, Pow(x.Float(i), y.Float(i)));
} }
...@@ -719,7 +719,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -719,7 +719,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Exp: case GLSLstd450Exp:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Exp(val.Float(i))); dst.move(i, Exp(val.Float(i)));
} }
...@@ -728,7 +728,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -728,7 +728,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Log: case GLSLstd450Log:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Log(val.Float(i))); dst.move(i, Log(val.Float(i)));
} }
...@@ -737,7 +737,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -737,7 +737,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Exp2: case GLSLstd450Exp2:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Exp2(val.Float(i))); dst.move(i, Exp2(val.Float(i)));
} }
...@@ -746,7 +746,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -746,7 +746,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Log2: case GLSLstd450Log2:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Log2(val.Float(i))); dst.move(i, Log2(val.Float(i)));
} }
...@@ -755,7 +755,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -755,7 +755,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Sqrt: case GLSLstd450Sqrt:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, Sqrt(val.Float(i))); dst.move(i, Sqrt(val.Float(i)));
} }
...@@ -768,14 +768,14 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -768,14 +768,14 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
ApplyDecorationsForId(&d, insn.word(5)); ApplyDecorationsForId(&d, insn.word(5));
if(d.RelaxedPrecision) if(d.RelaxedPrecision)
{ {
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, RcpSqrt_pp(val.Float(i))); dst.move(i, RcpSqrt_pp(val.Float(i)));
} }
} }
else else
{ {
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, SIMD::Float(1.0f) / Sqrt(val.Float(i))); dst.move(i, SIMD::Float(1.0f) / Sqrt(val.Float(i)));
} }
...@@ -785,7 +785,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -785,7 +785,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450Determinant: case GLSLstd450Determinant:
{ {
auto mat = Operand(this, state, insn.word(5)); auto mat = Operand(this, state, insn.word(5));
auto numComponents = getType(mat).sizeInComponents; auto numComponents = getType(mat).componentCount;
switch(numComponents) switch(numComponents)
{ {
case 4: // 2x2 case 4: // 2x2
...@@ -814,7 +814,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -814,7 +814,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450MatrixInverse: case GLSLstd450MatrixInverse:
{ {
auto mat = Operand(this, state, insn.word(5)); auto mat = Operand(this, state, insn.word(5));
auto numComponents = getType(mat).sizeInComponents; auto numComponents = getType(mat).componentCount;
switch(numComponents) switch(numComponents)
{ {
case 4: // 2x2 case 4: // 2x2
...@@ -876,7 +876,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -876,7 +876,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450FindILsb: case GLSLstd450FindILsb:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto v = val.UInt(i); auto v = val.UInt(i);
dst.move(i, Cttz(v, true) | CmpEQ(v, SIMD::UInt(0))); dst.move(i, Cttz(v, true) | CmpEQ(v, SIMD::UInt(0)));
...@@ -886,7 +886,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -886,7 +886,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450FindSMsb: case GLSLstd450FindSMsb:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto v = val.UInt(i) ^ As<SIMD::UInt>(CmpLT(val.Int(i), SIMD::Int(0))); auto v = val.UInt(i) ^ As<SIMD::UInt>(CmpLT(val.Int(i), SIMD::Int(0)));
dst.move(i, SIMD::UInt(31) - Ctlz(v, false)); dst.move(i, SIMD::UInt(31) - Ctlz(v, false));
...@@ -896,7 +896,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -896,7 +896,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
case GLSLstd450FindUMsb: case GLSLstd450FindUMsb:
{ {
auto val = Operand(this, state, insn.word(5)); auto val = Operand(this, state, insn.word(5));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, SIMD::UInt(31) - Ctlz(val.UInt(i), false)); dst.move(i, SIMD::UInt(31) - Ctlz(val.UInt(i), false));
} }
...@@ -921,7 +921,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -921,7 +921,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
auto y = Operand(this, state, insn.word(6)); auto y = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, NMin(x.Float(i), y.Float(i))); dst.move(i, NMin(x.Float(i), y.Float(i)));
} }
...@@ -931,7 +931,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -931,7 +931,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
{ {
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
auto y = Operand(this, state, insn.word(6)); auto y = Operand(this, state, insn.word(6));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, NMax(x.Float(i), y.Float(i))); dst.move(i, NMax(x.Float(i), y.Float(i)));
} }
...@@ -942,7 +942,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt ...@@ -942,7 +942,7 @@ SpirvShader::EmitResult SpirvShader::EmitExtGLSLstd450(InsnIterator insn, EmitSt
auto x = Operand(this, state, insn.word(5)); auto x = Operand(this, state, insn.word(5));
auto minVal = Operand(this, state, insn.word(6)); auto minVal = Operand(this, state, insn.word(6));
auto maxVal = Operand(this, state, insn.word(7)); auto maxVal = Operand(this, state, insn.word(7));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto clamp = NMin(NMax(x.Float(i), minVal.Float(i)), maxVal.Float(i)); auto clamp = NMin(NMax(x.Float(i), minVal.Float(i)), maxVal.Float(i));
dst.move(i, clamp); dst.move(i, clamp);
......
...@@ -36,7 +36,7 @@ struct SpirvShader::Impl::Group ...@@ -36,7 +36,7 @@ struct SpirvShader::Impl::Group
{ {
SpirvShader::Operand value(shader, state, insn.word(5)); SpirvShader::Operand value(shader, state, insn.word(5));
auto &type = shader->getType(SpirvShader::Type::ID(insn.word(1))); auto &type = shader->getType(SpirvShader::Type::ID(insn.word(1)));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
auto mask = As<SIMD::UInt>(state->activeLaneMask()); auto mask = As<SIMD::UInt>(state->activeLaneMask());
auto identity = TYPE(identityValue); auto identity = TYPE(identityValue);
...@@ -85,7 +85,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -85,7 +85,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
auto scope = spv::Scope(GetConstScalarInt(insn.word(3))); auto scope = spv::Scope(GetConstScalarInt(insn.word(3)));
ASSERT_MSG(scope == spv::ScopeSubgroup, "Scope for Non Uniform Group Operations must be Subgroup for Vulkan 1.1"); ASSERT_MSG(scope == spv::ScopeSubgroup, "Scope for Non Uniform Group Operations must be Subgroup for Vulkan 1.1");
auto &dst = state->createIntermediate(resultId, type.sizeInComponents); auto &dst = state->createIntermediate(resultId, type.componentCount);
switch(insn.opcode()) switch(insn.opcode())
{ {
...@@ -122,7 +122,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -122,7 +122,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
auto res = SIMD::UInt(0xffffffff); auto res = SIMD::UInt(0xffffffff);
SIMD::UInt active = As<SIMD::UInt>(state->activeLaneMask()); SIMD::UInt active = As<SIMD::UInt>(state->activeLaneMask());
SIMD::UInt inactive = ~active; SIMD::UInt inactive = ~active;
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::UInt v = value.UInt(i) & active; SIMD::UInt v = value.UInt(i) & active;
SIMD::UInt filled = v; SIMD::UInt filled = v;
...@@ -142,7 +142,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -142,7 +142,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
auto id = SIMD::Int(GetConstScalarInt(insn.word(5))); auto id = SIMD::Int(GetConstScalarInt(insn.word(5)));
Operand value(this, state, valueId); Operand value(this, state, valueId);
auto mask = CmpEQ(id, SIMD::Int(0, 1, 2, 3)); auto mask = CmpEQ(id, SIMD::Int(0, 1, 2, 3));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, OrAll(value.Int(i) & mask)); dst.move(i, OrAll(value.Int(i) & mask));
} }
...@@ -160,7 +160,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -160,7 +160,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
// elect = active & ~(active.Oxyz | active.OOxy | active.OOOx) // elect = active & ~(active.Oxyz | active.OOxy | active.OOOx)
auto v0111 = SIMD::Int(0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); auto v0111 = SIMD::Int(0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
auto elect = active & ~(v0111 & (active.xxyz | active.xxxy | active.xxxx)); auto elect = active & ~(v0111 & (active.xxyz | active.xxxy | active.xxxx));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
dst.move(i, OrAll(value.Int(i) & elect)); dst.move(i, OrAll(value.Int(i) & elect));
} }
...@@ -169,7 +169,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -169,7 +169,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
case spv::OpGroupNonUniformBallot: case spv::OpGroupNonUniformBallot:
{ {
ASSERT(type.sizeInComponents == 4); ASSERT(type.componentCount == 4);
Operand predicate(this, state, insn.word(4)); Operand predicate(this, state, insn.word(4));
dst.move(0, SIMD::Int(SignMask(state->activeLaneMask() & predicate.Int(0)))); dst.move(0, SIMD::Int(SignMask(state->activeLaneMask() & predicate.Int(0))));
dst.move(1, SIMD::Int(0)); dst.move(1, SIMD::Int(0));
...@@ -181,8 +181,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -181,8 +181,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
case spv::OpGroupNonUniformInverseBallot: case spv::OpGroupNonUniformInverseBallot:
{ {
auto valueId = Object::ID(insn.word(4)); auto valueId = Object::ID(insn.word(4));
ASSERT(type.sizeInComponents == 1); ASSERT(type.componentCount == 1);
ASSERT(getType(getObject(valueId)).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).componentCount == 4);
Operand value(this, state, valueId); Operand value(this, state, valueId);
auto bit = (value.Int(0) >> SIMD::Int(0, 1, 2, 3)) & SIMD::Int(1); auto bit = (value.Int(0) >> SIMD::Int(0, 1, 2, 3)) & SIMD::Int(1);
dst.move(0, -bit); dst.move(0, -bit);
...@@ -193,9 +193,9 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -193,9 +193,9 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
{ {
auto valueId = Object::ID(insn.word(4)); auto valueId = Object::ID(insn.word(4));
auto indexId = Object::ID(insn.word(5)); auto indexId = Object::ID(insn.word(5));
ASSERT(type.sizeInComponents == 1); ASSERT(type.componentCount == 1);
ASSERT(getType(getObject(valueId)).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).componentCount == 4);
ASSERT(getType(getObject(indexId)).sizeInComponents == 1); ASSERT(getType(getObject(indexId)).componentCount == 1);
Operand value(this, state, valueId); Operand value(this, state, valueId);
Operand index(this, state, indexId); Operand index(this, state, indexId);
auto vecIdx = index.Int(0) / SIMD::Int(32); auto vecIdx = index.Int(0) / SIMD::Int(32);
...@@ -212,8 +212,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -212,8 +212,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
{ {
auto operation = spv::GroupOperation(insn.word(4)); auto operation = spv::GroupOperation(insn.word(4));
auto valueId = Object::ID(insn.word(5)); auto valueId = Object::ID(insn.word(5));
ASSERT(type.sizeInComponents == 1); ASSERT(type.componentCount == 1);
ASSERT(getType(getObject(valueId)).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).componentCount == 4);
Operand value(this, state, valueId); Operand value(this, state, valueId);
switch(operation) switch(operation)
{ {
...@@ -235,8 +235,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -235,8 +235,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
case spv::OpGroupNonUniformBallotFindLSB: case spv::OpGroupNonUniformBallotFindLSB:
{ {
auto valueId = Object::ID(insn.word(4)); auto valueId = Object::ID(insn.word(4));
ASSERT(type.sizeInComponents == 1); ASSERT(type.componentCount == 1);
ASSERT(getType(getObject(valueId)).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).componentCount == 4);
Operand value(this, state, valueId); Operand value(this, state, valueId);
dst.move(0, Cttz(value.UInt(0) & SIMD::UInt(15), true)); dst.move(0, Cttz(value.UInt(0) & SIMD::UInt(15), true));
break; break;
...@@ -245,8 +245,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -245,8 +245,8 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
case spv::OpGroupNonUniformBallotFindMSB: case spv::OpGroupNonUniformBallotFindMSB:
{ {
auto valueId = Object::ID(insn.word(4)); auto valueId = Object::ID(insn.word(4));
ASSERT(type.sizeInComponents == 1); ASSERT(type.componentCount == 1);
ASSERT(getType(getObject(valueId)).sizeInComponents == 4); ASSERT(getType(getObject(valueId)).componentCount == 4);
Operand value(this, state, valueId); Operand value(this, state, valueId);
dst.move(0, SIMD::UInt(31) - Ctlz(value.UInt(0) & SIMD::UInt(15), false)); dst.move(0, SIMD::UInt(31) - Ctlz(value.UInt(0) & SIMD::UInt(15), false));
break; break;
...@@ -260,7 +260,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -260,7 +260,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
auto y = CmpEQ(SIMD::Int(1), id.Int(0)); auto y = CmpEQ(SIMD::Int(1), id.Int(0));
auto z = CmpEQ(SIMD::Int(2), id.Int(0)); auto z = CmpEQ(SIMD::Int(2), id.Int(0));
auto w = CmpEQ(SIMD::Int(3), id.Int(0)); auto w = CmpEQ(SIMD::Int(3), id.Int(0));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::Int v = value.Int(i); SIMD::Int v = value.Int(i);
dst.move(i, (x & v.xxxx) | (y & v.yyyy) | (z & v.zzzz) | (w & v.wwww)); dst.move(i, (x & v.xxxx) | (y & v.yyyy) | (z & v.zzzz) | (w & v.wwww));
...@@ -276,7 +276,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -276,7 +276,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
auto y = CmpEQ(SIMD::Int(1), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0)); auto y = CmpEQ(SIMD::Int(1), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0));
auto z = CmpEQ(SIMD::Int(2), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0)); auto z = CmpEQ(SIMD::Int(2), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0));
auto w = CmpEQ(SIMD::Int(3), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0)); auto w = CmpEQ(SIMD::Int(3), SIMD::Int(0, 1, 2, 3) ^ mask.Int(0));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::Int v = value.Int(i); SIMD::Int v = value.Int(i);
dst.move(i, (x & v.xxxx) | (y & v.yyyy) | (z & v.zzzz) | (w & v.wwww)); dst.move(i, (x & v.xxxx) | (y & v.yyyy) | (z & v.zzzz) | (w & v.wwww));
...@@ -292,7 +292,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -292,7 +292,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
auto d1 = CmpEQ(SIMD::Int(1), delta.Int(0)); auto d1 = CmpEQ(SIMD::Int(1), delta.Int(0));
auto d2 = CmpEQ(SIMD::Int(2), delta.Int(0)); auto d2 = CmpEQ(SIMD::Int(2), delta.Int(0));
auto d3 = CmpEQ(SIMD::Int(3), delta.Int(0)); auto d3 = CmpEQ(SIMD::Int(3), delta.Int(0));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::Int v = value.Int(i); SIMD::Int v = value.Int(i);
dst.move(i, (d0 & v.xyzw) | (d1 & v.xxyz) | (d2 & v.xxxy) | (d3 & v.xxxx)); dst.move(i, (d0 & v.xyzw) | (d1 & v.xxyz) | (d2 & v.xxxy) | (d3 & v.xxxx));
...@@ -308,7 +308,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit ...@@ -308,7 +308,7 @@ SpirvShader::EmitResult SpirvShader::EmitGroupNonUniform(InsnIterator insn, Emit
auto d1 = CmpEQ(SIMD::Int(1), delta.Int(0)); auto d1 = CmpEQ(SIMD::Int(1), delta.Int(0));
auto d2 = CmpEQ(SIMD::Int(2), delta.Int(0)); auto d2 = CmpEQ(SIMD::Int(2), delta.Int(0));
auto d3 = CmpEQ(SIMD::Int(3), delta.Int(0)); auto d3 = CmpEQ(SIMD::Int(3), delta.Int(0));
for(auto i = 0u; i < type.sizeInComponents; i++) for(auto i = 0u; i < type.componentCount; i++)
{ {
SIMD::Int v = value.Int(i); SIMD::Int v = value.Int(i);
dst.move(i, (d0 & v.xyzw) | (d1 & v.yzww) | (d2 & v.zwww) | (d3 & v.wwww)); dst.move(i, (d0 & v.xyzw) | (d1 & v.yzww) | (d2 & v.zwww) | (d3 & v.wwww));
......
...@@ -111,7 +111,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -111,7 +111,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
Object::ID coordinateId = insn.word(4); Object::ID coordinateId = insn.word(4);
auto &resultType = getType(insn.resultTypeId()); auto &resultType = getType(insn.resultTypeId());
auto &result = state->createIntermediate(insn.resultId(), resultType.sizeInComponents); auto &result = state->createIntermediate(insn.resultId(), resultType.componentCount);
auto imageDescriptor = state->getPointer(sampledImageId).base; // vk::SampledImageDescriptor* auto imageDescriptor = state->getPointer(sampledImageId).base; // vk::SampledImageDescriptor*
// If using a separate sampler, look through the OpSampledImage instruction to find the sampler descriptor // If using a separate sampler, look through the OpSampledImage instruction to find the sampler descriptor
...@@ -204,7 +204,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -204,7 +204,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
Array<SIMD::Float> in(16); // Maximum 16 input parameter components. Array<SIMD::Float> in(16); // Maximum 16 input parameter components.
uint32_t coordinates = coordinateType.sizeInComponents - instruction.isProj(); uint32_t coordinates = coordinateType.componentCount - instruction.isProj();
instruction.coordinates = coordinates; instruction.coordinates = coordinates;
uint32_t i = 0; uint32_t i = 0;
...@@ -247,16 +247,16 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -247,16 +247,16 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
auto dxValue = Operand(this, state, gradDxId); auto dxValue = Operand(this, state, gradDxId);
auto dyValue = Operand(this, state, gradDyId); auto dyValue = Operand(this, state, gradDyId);
auto &dxyType = getType(dxValue); auto &dxyType = getType(dxValue);
ASSERT(dxyType.sizeInComponents == getType(dyValue).sizeInComponents); ASSERT(dxyType.componentCount == getType(dyValue).componentCount);
instruction.grad = dxyType.sizeInComponents; instruction.grad = dxyType.componentCount;
for(uint32_t j = 0; j < dxyType.sizeInComponents; j++, i++) for(uint32_t j = 0; j < dxyType.componentCount; j++, i++)
{ {
in[i] = dxValue.Float(j); in[i] = dxValue.Float(j);
} }
for(uint32_t j = 0; j < dxyType.sizeInComponents; j++, i++) for(uint32_t j = 0; j < dxyType.componentCount; j++, i++)
{ {
in[i] = dyValue.Float(j); in[i] = dyValue.Float(j);
} }
...@@ -275,9 +275,9 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -275,9 +275,9 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
auto offsetValue = Operand(this, state, offsetId); auto offsetValue = Operand(this, state, offsetId);
auto &offsetType = getType(offsetValue); auto &offsetType = getType(offsetValue);
instruction.offset = offsetType.sizeInComponents; instruction.offset = offsetType.componentCount;
for(uint32_t j = 0; j < offsetType.sizeInComponents; j++, i++) for(uint32_t j = 0; j < offsetType.componentCount; j++, i++)
{ {
in[i] = As<SIMD::Float>(offsetValue.Int(j)); // Integer values, but transfered as float. in[i] = As<SIMD::Float>(offsetValue.Int(j)); // Integer values, but transfered as float.
} }
...@@ -304,7 +304,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio ...@@ -304,7 +304,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageSample(ImageInstruction instructio
Array<SIMD::Float> out(4); Array<SIMD::Float> out(4);
Call<ImageSampler>(cache.function, texture, &in[0], &out[0], state->routine->constants); Call<ImageSampler>(cache.function, texture, &in[0], &out[0], state->routine->constants);
for(auto i = 0u; i < resultType.sizeInComponents; i++) { result.move(i, out[i]); } for(auto i = 0u; i < resultType.componentCount; i++) { result.move(i, out[i]); }
return EmitResult::Continue; return EmitResult::Continue;
} }
...@@ -315,7 +315,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySizeLod(InsnIterator insn, Em ...@@ -315,7 +315,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySizeLod(InsnIterator insn, Em
auto imageId = Object::ID(insn.word(3)); auto imageId = Object::ID(insn.word(3));
auto lodId = Object::ID(insn.word(4)); auto lodId = Object::ID(insn.word(4));
auto &dst = state->createIntermediate(insn.resultId(), resultTy.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), resultTy.componentCount);
GetImageDimensions(state, resultTy, imageId, lodId, dst); GetImageDimensions(state, resultTy, imageId, lodId, dst);
return EmitResult::Continue; return EmitResult::Continue;
...@@ -327,7 +327,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySize(InsnIterator insn, EmitS ...@@ -327,7 +327,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQuerySize(InsnIterator insn, EmitS
auto imageId = Object::ID(insn.word(3)); auto imageId = Object::ID(insn.word(3));
auto lodId = Object::ID(0); auto lodId = Object::ID(0);
auto &dst = state->createIntermediate(insn.resultId(), resultTy.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), resultTy.componentCount);
GetImageDimensions(state, resultTy, imageId, lodId, dst); GetImageDimensions(state, resultTy, imageId, lodId, dst);
return EmitResult::Continue; return EmitResult::Continue;
...@@ -378,12 +378,12 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT ...@@ -378,12 +378,12 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT
UNREACHABLE("Image descriptorType: %d", int(bindingLayout.descriptorType)); UNREACHABLE("Image descriptorType: %d", int(bindingLayout.descriptorType));
} }
auto dimensions = resultTy.sizeInComponents - (isArrayed ? 1 : 0); auto dimensions = resultTy.componentCount - (isArrayed ? 1 : 0);
std::vector<Int> out; std::vector<Int> out;
if(lodId != 0) if(lodId != 0)
{ {
auto lodVal = Operand(this, state, lodId); auto lodVal = Operand(this, state, lodId);
ASSERT(getType(lodVal).sizeInComponents == 1); ASSERT(getType(lodVal).componentCount == 1);
auto lod = lodVal.Int(0); auto lod = lodVal.Int(0);
auto one = SIMD::Int(1); auto one = SIMD::Int(1);
for(uint32_t i = 0; i < dimensions; i++) for(uint32_t i = 0; i < dimensions; i++)
...@@ -409,7 +409,7 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT ...@@ -409,7 +409,7 @@ void SpirvShader::GetImageDimensions(EmitState const *state, Type const &resultT
SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, EmitState *state) const
{ {
auto &resultTy = getType(Type::ID(insn.resultTypeId())); auto &resultTy = getType(Type::ID(insn.resultTypeId()));
ASSERT(resultTy.sizeInComponents == 1); ASSERT(resultTy.componentCount == 1);
auto imageId = Object::ID(insn.word(3)); auto imageId = Object::ID(insn.word(3));
const DescriptorDecorations &d = descriptorDecorations.at(imageId); const DescriptorDecorations &d = descriptorDecorations.at(imageId);
...@@ -438,7 +438,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, Emi ...@@ -438,7 +438,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageQueryLevels(InsnIterator insn, Emi
SpirvShader::EmitResult SpirvShader::EmitImageQuerySamples(InsnIterator insn, EmitState *state) const SpirvShader::EmitResult SpirvShader::EmitImageQuerySamples(InsnIterator insn, EmitState *state) const
{ {
auto &resultTy = getType(Type::ID(insn.resultTypeId())); auto &resultTy = getType(Type::ID(insn.resultTypeId()));
ASSERT(resultTy.sizeInComponents == 1); ASSERT(resultTy.componentCount == 1);
auto imageId = Object::ID(insn.word(3)); auto imageId = Object::ID(insn.word(3));
auto imageTy = getType(getObject(imageId)); auto imageTy = getType(getObject(imageId));
ASSERT(imageTy.definition.opcode() == spv::OpTypeImage); ASSERT(imageTy.definition.opcode() == spv::OpTypeImage);
...@@ -476,12 +476,12 @@ SIMD::Pointer SpirvShader::GetTexelAddress(EmitState const *state, SIMD::Pointer ...@@ -476,12 +476,12 @@ SIMD::Pointer SpirvShader::GetTexelAddress(EmitState const *state, SIMD::Pointer
auto routine = state->routine; auto routine = state->routine;
bool isArrayed = imageType.definition.word(5) != 0; bool isArrayed = imageType.definition.word(5) != 0;
auto dim = static_cast<spv::Dim>(imageType.definition.word(3)); auto dim = static_cast<spv::Dim>(imageType.definition.word(3));
int dims = getType(coordinate).sizeInComponents - (isArrayed ? 1 : 0); int dims = getType(coordinate).componentCount - (isArrayed ? 1 : 0);
SIMD::Int u = coordinate.Int(0); SIMD::Int u = coordinate.Int(0);
SIMD::Int v = SIMD::Int(0); SIMD::Int v = SIMD::Int(0);
if(getType(coordinate).sizeInComponents > 1) if(getType(coordinate).componentCount > 1)
{ {
v = coordinate.Int(1); v = coordinate.Int(1);
} }
...@@ -586,7 +586,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageRead(InsnIterator insn, EmitState ...@@ -586,7 +586,7 @@ SpirvShader::EmitResult SpirvShader::EmitImageRead(InsnIterator insn, EmitState
auto imageSizeInBytes = *Pointer<Int>(binding + OFFSET(vk::StorageImageDescriptor, sizeInBytes)); auto imageSizeInBytes = *Pointer<Int>(binding + OFFSET(vk::StorageImageDescriptor, sizeInBytes));
auto &dst = state->createIntermediate(insn.resultId(), resultType.sizeInComponents); auto &dst = state->createIntermediate(insn.resultId(), resultType.componentCount);
auto texelSize = vk::Format(vkFormat).bytes(); auto texelSize = vk::Format(vkFormat).bytes();
auto basePtr = SIMD::Pointer(imageBase, imageSizeInBytes); auto basePtr = SIMD::Pointer(imageBase, imageSizeInBytes);
......
...@@ -54,7 +54,7 @@ SpirvShader::EmitResult SpirvShader::EmitLoad(InsnIterator insn, EmitState *stat ...@@ -54,7 +54,7 @@ SpirvShader::EmitResult SpirvShader::EmitLoad(InsnIterator insn, EmitState *stat
auto ptr = GetPointerToData(pointerId, 0, state); auto ptr = GetPointerToData(pointerId, 0, state);
bool interleavedByLane = IsStorageInterleavedByLane(pointerTy.storageClass); bool interleavedByLane = IsStorageInterleavedByLane(pointerTy.storageClass);
auto &dst = state->createIntermediate(resultId, resultTy.sizeInComponents); auto &dst = state->createIntermediate(resultId, resultTy.componentCount);
auto robustness = state->getOutOfBoundsBehavior(pointerTy.storageClass); auto robustness = state->getOutOfBoundsBehavior(pointerTy.storageClass);
VisitMemoryObject(pointerId, [&](const MemoryElement &el) { VisitMemoryObject(pointerId, [&](const MemoryElement &el) {
...@@ -136,7 +136,7 @@ SpirvShader::EmitResult SpirvShader::EmitVariable(InsnIterator insn, EmitState * ...@@ -136,7 +136,7 @@ SpirvShader::EmitResult SpirvShader::EmitVariable(InsnIterator insn, EmitState *
ASSERT(objectTy.opcode() == spv::OpTypePointer); ASSERT(objectTy.opcode() == spv::OpTypePointer);
auto base = &routine->getVariable(resultId)[0]; auto base = &routine->getVariable(resultId)[0];
auto elementTy = getType(objectTy.element); auto elementTy = getType(objectTy.element);
auto size = elementTy.sizeInComponents * static_cast<uint32_t>(sizeof(float)) * SIMD::Width; auto size = elementTy.componentCount * static_cast<uint32_t>(sizeof(float)) * SIMD::Width;
state->createPointer(resultId, SIMD::Pointer(base, size)); state->createPointer(resultId, SIMD::Pointer(base, size));
break; break;
} }
...@@ -163,7 +163,7 @@ SpirvShader::EmitResult SpirvShader::EmitVariable(InsnIterator insn, EmitState * ...@@ -163,7 +163,7 @@ SpirvShader::EmitResult SpirvShader::EmitVariable(InsnIterator insn, EmitState *
ASSERT(objectTy.opcode() == spv::OpTypePointer); ASSERT(objectTy.opcode() == spv::OpTypePointer);
auto base = &routine->getVariable(resultId)[0]; auto base = &routine->getVariable(resultId)[0];
auto elementTy = getType(objectTy.element); auto elementTy = getType(objectTy.element);
auto size = elementTy.sizeInComponents * static_cast<uint32_t>(sizeof(float)) * SIMD::Width; auto size = elementTy.componentCount * static_cast<uint32_t>(sizeof(float)) * SIMD::Width;
state->createPointer(resultId, SIMD::Pointer(base, size)); state->createPointer(resultId, SIMD::Pointer(base, size));
break; break;
} }
...@@ -378,7 +378,7 @@ void SpirvShader::VisitMemoryObject(Object::ID id, const MemoryVisitor &f) const ...@@ -378,7 +378,7 @@ void SpirvShader::VisitMemoryObject(Object::ID id, const MemoryVisitor &f) const
{ {
// Objects without explicit layout are tightly packed. // Objects without explicit layout are tightly packed.
auto &elType = getType(type.element); auto &elType = getType(type.element);
for(auto index = 0u; index < elType.sizeInComponents; index++) for(auto index = 0u; index < elType.componentCount; index++)
{ {
auto offset = static_cast<uint32_t>(index * sizeof(float)); auto offset = static_cast<uint32_t>(index * sizeof(float));
f({ index, offset, elType }); f({ index, offset, elType });
......
...@@ -69,11 +69,11 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -69,11 +69,11 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
{ {
auto &result = CreateConstant(insn); auto &result = CreateConstant(insn);
auto const &cond = getObject(insn.word(4)); auto const &cond = getObject(insn.word(4));
auto condIsScalar = (getType(cond).sizeInComponents == 1); auto condIsScalar = (getType(cond).componentCount == 1);
auto const &left = getObject(insn.word(5)); auto const &left = getObject(insn.word(5));
auto const &right = getObject(insn.word(6)); auto const &right = getObject(insn.word(6));
for(auto i = 0u; i < getType(result).sizeInComponents; i++) for(auto i = 0u; i < getType(result).componentCount; i++)
{ {
auto sel = cond.constantValue[condIsScalar ? 0 : i]; auto sel = cond.constantValue[condIsScalar ? 0 : i];
result.constantValue[i] = sel ? left.constantValue[i] : right.constantValue[i]; result.constantValue[i] = sel ? left.constantValue[i] : right.constantValue[i];
...@@ -87,7 +87,7 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -87,7 +87,7 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
auto const &compositeObject = getObject(insn.word(4)); auto const &compositeObject = getObject(insn.word(4));
auto firstComponent = WalkLiteralAccessChain(compositeObject.typeId(), insn.wordCount() - 5, insn.wordPointer(5)); auto firstComponent = WalkLiteralAccessChain(compositeObject.typeId(), insn.wordCount() - 5, insn.wordPointer(5));
for(auto i = 0u; i < getType(result).sizeInComponents; i++) for(auto i = 0u; i < getType(result).componentCount; i++)
{ {
result.constantValue[i] = compositeObject.constantValue[firstComponent + i]; result.constantValue[i] = compositeObject.constantValue[firstComponent + i];
} }
...@@ -107,12 +107,12 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -107,12 +107,12 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
result.constantValue[i] = oldObject.constantValue[i]; result.constantValue[i] = oldObject.constantValue[i];
} }
// new part // new part
for(auto i = 0u; i < getType(newPart).sizeInComponents; i++) for(auto i = 0u; i < getType(newPart).componentCount; i++)
{ {
result.constantValue[firstNewComponent + i] = newPart.constantValue[i]; result.constantValue[firstNewComponent + i] = newPart.constantValue[i];
} }
// old components after // old components after
for(auto i = firstNewComponent + getType(newPart).sizeInComponents; i < getType(result).sizeInComponents; i++) for(auto i = firstNewComponent + getType(newPart).componentCount; i < getType(result).componentCount; i++)
{ {
result.constantValue[i] = oldObject.constantValue[i]; result.constantValue[i] = oldObject.constantValue[i];
} }
...@@ -125,7 +125,7 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -125,7 +125,7 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
auto const &firstHalf = getObject(insn.word(4)); auto const &firstHalf = getObject(insn.word(4));
auto const &secondHalf = getObject(insn.word(5)); auto const &secondHalf = getObject(insn.word(5));
for(auto i = 0u; i < getType(result).sizeInComponents; i++) for(auto i = 0u; i < getType(result).componentCount; i++)
{ {
auto selector = insn.word(6 + i); auto selector = insn.word(6 + i);
if(selector == static_cast<uint32_t>(-1)) if(selector == static_cast<uint32_t>(-1))
...@@ -133,13 +133,13 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn) ...@@ -133,13 +133,13 @@ void SpirvShader::EvalSpecConstantOp(InsnIterator insn)
// Undefined value, we'll use zero // Undefined value, we'll use zero
result.constantValue[i] = 0; result.constantValue[i] = 0;
} }
else if(selector < getType(firstHalf).sizeInComponents) else if(selector < getType(firstHalf).componentCount)
{ {
result.constantValue[i] = firstHalf.constantValue[selector]; result.constantValue[i] = firstHalf.constantValue[selector];
} }
else else
{ {
result.constantValue[i] = secondHalf.constantValue[selector - getType(firstHalf).sizeInComponents]; result.constantValue[i] = secondHalf.constantValue[selector - getType(firstHalf).componentCount];
} }
} }
break; break;
...@@ -159,7 +159,7 @@ void SpirvShader::EvalSpecConstantUnaryOp(InsnIterator insn) ...@@ -159,7 +159,7 @@ void SpirvShader::EvalSpecConstantUnaryOp(InsnIterator insn)
auto opcode = static_cast<spv::Op>(insn.word(3)); auto opcode = static_cast<spv::Op>(insn.word(3));
auto const &lhs = getObject(insn.word(4)); auto const &lhs = getObject(insn.word(4));
auto size = getType(lhs).sizeInComponents; auto size = getType(lhs).componentCount;
for(auto i = 0u; i < size; i++) for(auto i = 0u; i < size; i++)
{ {
...@@ -210,7 +210,7 @@ void SpirvShader::EvalSpecConstantBinaryOp(InsnIterator insn) ...@@ -210,7 +210,7 @@ void SpirvShader::EvalSpecConstantBinaryOp(InsnIterator insn)
auto opcode = static_cast<spv::Op>(insn.word(3)); auto opcode = static_cast<spv::Op>(insn.word(3));
auto const &lhs = getObject(insn.word(4)); auto const &lhs = getObject(insn.word(4));
auto const &rhs = getObject(insn.word(5)); auto const &rhs = getObject(insn.word(5));
auto size = getType(lhs).sizeInComponents; auto size = getType(lhs).componentCount;
for(auto i = 0u; i < size; i++) for(auto i = 0u; i < size; i++)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment