[spirv] Fix DX layout struct base alignment (#1523)

For cbuffer/tbuffer, struct type's base alignment should be
rounded up to 16.
This commit is contained in:
Lei Zhang 2018-09-12 10:24:22 -04:00 коммит произвёл GitHub
Родитель 4afbc6897d
Коммит df1ee0c331
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 41 добавлений и 2 удалений

Просмотреть файл

@ -1790,7 +1790,6 @@ TypeTranslator::getAlignmentAndSize(QualType type, SpirvLayoutRule rule,
// - Vector base alignment is set as its element type's base alignment.
// - Arrays/structs do not need to have padding at the end; arrays/structs do
// not affect the base offset of the member following them.
// - Struct base alignment does not need to be rounded up to a multiple of 16.
//
// FxcSBuffer:
// - Vector/matrix/array base alignment is set as its element type's base
@ -1935,7 +1934,8 @@ TypeTranslator::getAlignmentAndSize(QualType type, SpirvLayoutRule rule,
}
if (rule == SpirvLayoutRule::GLSLStd140 ||
rule == SpirvLayoutRule::RelaxedGLSLStd140) {
rule == SpirvLayoutRule::RelaxedGLSLStd140 ||
rule == SpirvLayoutRule::FxcCTBuffer) {
// ... and rounded up to the base alignment of a vec4.
maxAlignment = roundToPow2(maxAlignment, kStd140Vec4Alignment);
}

Просмотреть файл

@ -0,0 +1,33 @@
// Run: %dxc -T ps_6_0 -E main -fvk-use-dx-layout
struct S {
float a;
};
// CHECK: OpMemberDecorate %T 0 Offset 0
// CHECK: OpMemberDecorate %T 1 Offset 16
// CHECK: OpMemberDecorate %T 2 Offset 20
// CHECK: OpMemberDecorate %T 3 Offset 32
struct T {
float a;
S b;
float c;
S d;
};
// CHECK: %type_CB = OpTypeStruct %T
cbuffer CB {
T CB_T;
};
// CHECK: %type_TB = OpTypeStruct %T
tbuffer TB {
T TB_T;
};
float4 main() : SV_Target {
return CB_T.a + TB_T.a;
}

Просмотреть файл

@ -1604,6 +1604,12 @@ TEST_F(FileTest, VulkanLayoutFxcRulesCBuffer) {
runFileTest("vk.layout.cbuffer.fxc.hlsl");
}
TEST_F(FileTest, VulkanLayoutFxcRulesCBuffer1) {
// cbuffer/tbuffer/ConstantBuffer/TextureBuffer with fxc layout rules
setDxLayout();
runFileTest("vk.layout.cbuffer.fxc.1.hlsl");
}
TEST_F(FileTest, VulkanSubpassInput) { runFileTest("vk.subpass-input.hlsl"); }
TEST_F(FileTest, VulkanSubpassInputBinding) {
runFileTest("vk.subpass-input.binding.hlsl");