|
@@ -398,6 +398,99 @@ SpirvLayoutRule getLayoutRuleForExternVar(QualType type,
|
|
return SpirvLayoutRule::Void;
|
|
return SpirvLayoutRule::Void;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+spv::ImageFormat getSpvImageFormat(const VKImageFormatAttr *imageFormatAttr) {
|
|
|
|
+ if (imageFormatAttr == nullptr)
|
|
|
|
+ return spv::ImageFormat::Unknown;
|
|
|
|
+
|
|
|
|
+ switch (imageFormatAttr->getImageFormat()) {
|
|
|
|
+ case VKImageFormatAttr::unknown:
|
|
|
|
+ return spv::ImageFormat::Unknown;
|
|
|
|
+ case VKImageFormatAttr::rgba32f:
|
|
|
|
+ return spv::ImageFormat::Rgba32f;
|
|
|
|
+ case VKImageFormatAttr::rgba16f:
|
|
|
|
+ return spv::ImageFormat::Rgba16f;
|
|
|
|
+ case VKImageFormatAttr::r32f:
|
|
|
|
+ return spv::ImageFormat::R32f;
|
|
|
|
+ case VKImageFormatAttr::rgba8:
|
|
|
|
+ return spv::ImageFormat::Rgba8;
|
|
|
|
+ case VKImageFormatAttr::rgba8snorm:
|
|
|
|
+ return spv::ImageFormat::Rgba8Snorm;
|
|
|
|
+ case VKImageFormatAttr::rg32f:
|
|
|
|
+ return spv::ImageFormat::Rg32f;
|
|
|
|
+ case VKImageFormatAttr::rg16f:
|
|
|
|
+ return spv::ImageFormat::Rg16f;
|
|
|
|
+ case VKImageFormatAttr::r11g11b10f:
|
|
|
|
+ return spv::ImageFormat::R11fG11fB10f;
|
|
|
|
+ case VKImageFormatAttr::r16f:
|
|
|
|
+ return spv::ImageFormat::R16f;
|
|
|
|
+ case VKImageFormatAttr::rgba16:
|
|
|
|
+ return spv::ImageFormat::Rgba16;
|
|
|
|
+ case VKImageFormatAttr::rgb10a2:
|
|
|
|
+ return spv::ImageFormat::Rgb10A2;
|
|
|
|
+ case VKImageFormatAttr::rg16:
|
|
|
|
+ return spv::ImageFormat::Rg16;
|
|
|
|
+ case VKImageFormatAttr::rg8:
|
|
|
|
+ return spv::ImageFormat::Rg8;
|
|
|
|
+ case VKImageFormatAttr::r16:
|
|
|
|
+ return spv::ImageFormat::R16;
|
|
|
|
+ case VKImageFormatAttr::r8:
|
|
|
|
+ return spv::ImageFormat::R8;
|
|
|
|
+ case VKImageFormatAttr::rgba16snorm:
|
|
|
|
+ return spv::ImageFormat::Rgba16Snorm;
|
|
|
|
+ case VKImageFormatAttr::rg16snorm:
|
|
|
|
+ return spv::ImageFormat::Rg16Snorm;
|
|
|
|
+ case VKImageFormatAttr::rg8snorm:
|
|
|
|
+ return spv::ImageFormat::Rg8Snorm;
|
|
|
|
+ case VKImageFormatAttr::r16snorm:
|
|
|
|
+ return spv::ImageFormat::R16Snorm;
|
|
|
|
+ case VKImageFormatAttr::r8snorm:
|
|
|
|
+ return spv::ImageFormat::R8Snorm;
|
|
|
|
+ case VKImageFormatAttr::rgba32i:
|
|
|
|
+ return spv::ImageFormat::Rgba32i;
|
|
|
|
+ case VKImageFormatAttr::rgba16i:
|
|
|
|
+ return spv::ImageFormat::Rgba16i;
|
|
|
|
+ case VKImageFormatAttr::rgba8i:
|
|
|
|
+ return spv::ImageFormat::Rgba8i;
|
|
|
|
+ case VKImageFormatAttr::r32i:
|
|
|
|
+ return spv::ImageFormat::R32i;
|
|
|
|
+ case VKImageFormatAttr::rg32i:
|
|
|
|
+ return spv::ImageFormat::Rg32i;
|
|
|
|
+ case VKImageFormatAttr::rg16i:
|
|
|
|
+ return spv::ImageFormat::Rg16i;
|
|
|
|
+ case VKImageFormatAttr::rg8i:
|
|
|
|
+ return spv::ImageFormat::Rg8i;
|
|
|
|
+ case VKImageFormatAttr::r16i:
|
|
|
|
+ return spv::ImageFormat::R16i;
|
|
|
|
+ case VKImageFormatAttr::r8i:
|
|
|
|
+ return spv::ImageFormat::R8i;
|
|
|
|
+ case VKImageFormatAttr::rgba32ui:
|
|
|
|
+ return spv::ImageFormat::Rgba32ui;
|
|
|
|
+ case VKImageFormatAttr::rgba16ui:
|
|
|
|
+ return spv::ImageFormat::Rgba16ui;
|
|
|
|
+ case VKImageFormatAttr::rgba8ui:
|
|
|
|
+ return spv::ImageFormat::Rgba8ui;
|
|
|
|
+ case VKImageFormatAttr::r32ui:
|
|
|
|
+ return spv::ImageFormat::R32ui;
|
|
|
|
+ case VKImageFormatAttr::rgb10a2ui:
|
|
|
|
+ return spv::ImageFormat::Rgb10a2ui;
|
|
|
|
+ case VKImageFormatAttr::rg32ui:
|
|
|
|
+ return spv::ImageFormat::Rg32ui;
|
|
|
|
+ case VKImageFormatAttr::rg16ui:
|
|
|
|
+ return spv::ImageFormat::Rg16ui;
|
|
|
|
+ case VKImageFormatAttr::rg8ui:
|
|
|
|
+ return spv::ImageFormat::Rg8ui;
|
|
|
|
+ case VKImageFormatAttr::r16ui:
|
|
|
|
+ return spv::ImageFormat::R16ui;
|
|
|
|
+ case VKImageFormatAttr::r8ui:
|
|
|
|
+ return spv::ImageFormat::R8ui;
|
|
|
|
+ case VKImageFormatAttr::r64ui:
|
|
|
|
+ return spv::ImageFormat::R64ui;
|
|
|
|
+ case VKImageFormatAttr::r64i:
|
|
|
|
+ return spv::ImageFormat::R64i;
|
|
|
|
+ }
|
|
|
|
+ return spv::ImageFormat::Unknown;
|
|
|
|
+}
|
|
|
|
+
|
|
} // anonymous namespace
|
|
} // anonymous namespace
|
|
|
|
|
|
std::string StageVar::getSemanticStr() const {
|
|
std::string StageVar::getSemanticStr() const {
|
|
@@ -847,6 +940,13 @@ SpirvVariable *DeclResultIdMapper::createExternVar(const VarDecl *var) {
|
|
type, storageClass, var->hasAttr<HLSLPreciseAttr>(), name, llvm::None,
|
|
type, storageClass, var->hasAttr<HLSLPreciseAttr>(), name, llvm::None,
|
|
loc);
|
|
loc);
|
|
varInstr->setLayoutRule(rule);
|
|
varInstr->setLayoutRule(rule);
|
|
|
|
+
|
|
|
|
+ // If this variable has [[vk::image_format("..")]] attribute, we have to keep
|
|
|
|
+ // it in the SpirvContext and use it when we lower the QualType to SpirvType.
|
|
|
|
+ auto spvImageFormat = getSpvImageFormat(var->getAttr<VKImageFormatAttr>());
|
|
|
|
+ if (spvImageFormat != spv::ImageFormat::Unknown)
|
|
|
|
+ spvContext.registerImageFormatForSpirvVariable(varInstr, spvImageFormat);
|
|
|
|
+
|
|
DeclSpirvInfo info(varInstr);
|
|
DeclSpirvInfo info(varInstr);
|
|
astDecls[var] = info;
|
|
astDecls[var] = info;
|
|
|
|
|