Add GlslBuildOptions::FLAG_ALLOW_RELAXED_OFFSETS
Enabling the flag allows GLSL to use layout(offset = N) qualifiers that
follow VK_KHR_relaxed_block_layout rules instead of GLSL std140/std430
rules.
Components: Vulkan
Change-Id: I4f168b04ad0916b740891b603ddde2de0f4bcf50
(cherry picked from commit 4b82e12d3a7bf0947887e0b9d586d0ab63bd4888)
diff --git a/external/vulkancts/framework/vulkan/vkGlslProgram.hpp b/external/vulkancts/framework/vulkan/vkGlslProgram.hpp
index f09779d..a5e00a6 100644
--- a/external/vulkancts/framework/vulkan/vkGlslProgram.hpp
+++ b/external/vulkancts/framework/vulkan/vkGlslProgram.hpp
@@ -40,7 +40,8 @@
{
enum Flags
{
- FLAG_USE_STORAGE_BUFFER_STORAGE_CLASS = (1u<<0)
+ FLAG_USE_STORAGE_BUFFER_STORAGE_CLASS = (1u<<0),
+ FLAG_ALLOW_RELAXED_OFFSETS = (1u<<1) // allow block offsets to follow VK_KHR_relaxed_block_layout
};
SpirvVersion targetVersion;
diff --git a/external/vulkancts/framework/vulkan/vkGlslToSpirV.cpp b/external/vulkancts/framework/vulkan/vkGlslToSpirV.cpp
index 96a80ab..b340622 100644
--- a/external/vulkancts/framework/vulkan/vkGlslToSpirV.cpp
+++ b/external/vulkancts/framework/vulkan/vkGlslToSpirV.cpp
@@ -226,11 +226,22 @@
return program.sources[shaderType][0];
}
+EShMessages getCompileFlags (const GlslBuildOptions& buildOpts)
+{
+ EShMessages flags = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules);
+
+ if ((buildOpts.flags & GlslBuildOptions::FLAG_ALLOW_RELAXED_OFFSETS) != 0)
+ flags = (EShMessages)(flags | EShMsgHlslOffsets);
+
+ return flags;
+}
+
} // anonymous
bool compileGlslToSpirV (const GlslSource& program, std::vector<deUint32>* dst, glu::ShaderProgramInfo* buildInfo)
{
TBuiltInResource builtinRes;
+ const EShMessages compileFlags = getCompileFlags(program.buildOptions);
if (program.buildOptions.targetVersion != SPIRV_VERSION_1_0)
TCU_THROW(InternalError, "Unsupported SPIR-V target version");
@@ -258,7 +269,7 @@
{
const deUint64 compileStartTime = deGetMicroseconds();
- const int compileRes = shader.parse(&builtinRes, 110, false, (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules));
+ const int compileRes = shader.parse(&builtinRes, 110, false, compileFlags);
glu::ShaderInfo shaderBuildInfo;
shaderBuildInfo.type = (glu::ShaderType)shaderType;
@@ -274,7 +285,7 @@
if (buildInfo->shaders[0].compileOk)
{
const deUint64 linkStartTime = deGetMicroseconds();
- const int linkRes = program.link((EShMessages)(EShMsgSpvRules | EShMsgVulkanRules));
+ const int linkRes = program.link(compileFlags);
buildInfo->program.infoLog = program.getInfoLog(); // \todo [2015-11-05 scygan] Include debug log?
buildInfo->program.linkOk = (linkRes != 0);