Change fp16_vector_atomic to not require other SPIR-V atomic extensions

This commit is contained in:
Jeff Bolz 2024-02-21 12:09:36 -06:00 committed by arcady-lunarg
parent 78e5d7976e
commit 2518af09c8
2 changed files with 33 additions and 34 deletions

View file

@ -7849,21 +7849,22 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv
opCode = spv::OpAtomicIAdd; opCode = spv::OpAtomicIAdd;
if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) { if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) {
opCode = spv::OpAtomicFAddEXT; opCode = spv::OpAtomicFAddEXT;
builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_add); if (typeProxy == glslang::EbtFloat16 &&
if (typeProxy == glslang::EbtFloat16) { (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) {
if (opType.getVectorSize() == 2 || opType.getVectorSize() == 4) {
builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector); builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector);
builder.addCapability(spv::CapabilityAtomicFloat16VectorNV); builder.addCapability(spv::CapabilityAtomicFloat16VectorNV);
} else { } else {
builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_add);
if (typeProxy == glslang::EbtFloat16) {
builder.addExtension(spv::E_SPV_EXT_shader_atomic_float16_add); builder.addExtension(spv::E_SPV_EXT_shader_atomic_float16_add);
builder.addCapability(spv::CapabilityAtomicFloat16AddEXT); builder.addCapability(spv::CapabilityAtomicFloat16AddEXT);
}
} else if (typeProxy == glslang::EbtFloat) { } else if (typeProxy == glslang::EbtFloat) {
builder.addCapability(spv::CapabilityAtomicFloat32AddEXT); builder.addCapability(spv::CapabilityAtomicFloat32AddEXT);
} else { } else {
builder.addCapability(spv::CapabilityAtomicFloat64AddEXT); builder.addCapability(spv::CapabilityAtomicFloat64AddEXT);
} }
} }
}
break; break;
case glslang::EOpAtomicSubtract: case glslang::EOpAtomicSubtract:
case glslang::EOpAtomicCounterSubtract: case glslang::EOpAtomicCounterSubtract:
@ -7874,19 +7875,19 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv
case glslang::EOpAtomicCounterMin: case glslang::EOpAtomicCounterMin:
if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) { if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) {
opCode = spv::OpAtomicFMinEXT; opCode = spv::OpAtomicFMinEXT;
builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max); if (typeProxy == glslang::EbtFloat16 &&
if (typeProxy == glslang::EbtFloat16) { (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) {
if (opType.getVectorSize() == 2 || opType.getVectorSize() == 4) {
builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector); builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector);
builder.addCapability(spv::CapabilityAtomicFloat16VectorNV); builder.addCapability(spv::CapabilityAtomicFloat16VectorNV);
} else { } else {
builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max);
if (typeProxy == glslang::EbtFloat16)
builder.addCapability(spv::CapabilityAtomicFloat16MinMaxEXT); builder.addCapability(spv::CapabilityAtomicFloat16MinMaxEXT);
}
}
else if (typeProxy == glslang::EbtFloat) else if (typeProxy == glslang::EbtFloat)
builder.addCapability(spv::CapabilityAtomicFloat32MinMaxEXT); builder.addCapability(spv::CapabilityAtomicFloat32MinMaxEXT);
else else
builder.addCapability(spv::CapabilityAtomicFloat64MinMaxEXT); builder.addCapability(spv::CapabilityAtomicFloat64MinMaxEXT);
}
} else if (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) { } else if (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) {
opCode = spv::OpAtomicUMin; opCode = spv::OpAtomicUMin;
} else { } else {
@ -7898,19 +7899,19 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv
case glslang::EOpAtomicCounterMax: case glslang::EOpAtomicCounterMax:
if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) { if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) {
opCode = spv::OpAtomicFMaxEXT; opCode = spv::OpAtomicFMaxEXT;
builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max); if (typeProxy == glslang::EbtFloat16 &&
if (typeProxy == glslang::EbtFloat16) { (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) {
if (opType.getVectorSize() == 2 || opType.getVectorSize() == 4) {
builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector); builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector);
builder.addCapability(spv::CapabilityAtomicFloat16VectorNV); builder.addCapability(spv::CapabilityAtomicFloat16VectorNV);
} else { } else {
builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max);
if (typeProxy == glslang::EbtFloat16)
builder.addCapability(spv::CapabilityAtomicFloat16MinMaxEXT); builder.addCapability(spv::CapabilityAtomicFloat16MinMaxEXT);
}
}
else if (typeProxy == glslang::EbtFloat) else if (typeProxy == glslang::EbtFloat)
builder.addCapability(spv::CapabilityAtomicFloat32MinMaxEXT); builder.addCapability(spv::CapabilityAtomicFloat32MinMaxEXT);
else else
builder.addCapability(spv::CapabilityAtomicFloat64MinMaxEXT); builder.addCapability(spv::CapabilityAtomicFloat64MinMaxEXT);
}
} else if (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) { } else if (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) {
opCode = spv::OpAtomicUMax; opCode = spv::OpAtomicUMax;
} else { } else {

View file

@ -10,8 +10,6 @@ spv.nvAtomicFp16Vec.frag
Capability StorageImageExtendedFormats Capability StorageImageExtendedFormats
Capability StorageUniformBufferBlock16 Capability StorageUniformBufferBlock16
Capability AtomicFloat16VectorNV Capability AtomicFloat16VectorNV
Extension "SPV_EXT_shader_atomic_float_add"
Extension "SPV_EXT_shader_atomic_float_min_max"
Extension "SPV_KHR_16bit_storage" Extension "SPV_KHR_16bit_storage"
Extension "SPV_NV_shader_atomic_fp16_vector" Extension "SPV_NV_shader_atomic_fp16_vector"
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"