HLSL: Allow empty struct initializers

Review request: does this harm GLSL in any way?
This commit is contained in:
steve-lunarg 2017-04-27 18:22:52 -06:00
parent 7cca140956
commit c0043cda82
4 changed files with 121 additions and 6 deletions

View File

@ -0,0 +1,112 @@
hlsl.emptystruct.init.vert
WARNING: 0:3: 'Test_Empty' : variable with qualifier 'const' not initialized; zero initializing
Shader version: 500
0:? Sequence
0:6 Function Definition: @main(u1; ( temp 4-component vector of float)
0:6 Function Parameters:
0:6 'vertexIndex' ( in uint)
0:? Sequence
0:7 Branch: Return with expression
0:7 Constant:
0:7 0.000000
0:7 0.000000
0:7 0.000000
0:7 0.000000
0:6 Function Definition: main( ( temp void)
0:6 Function Parameters:
0:? Sequence
0:6 move second child to first child ( temp uint)
0:? 'vertexIndex' ( temp uint)
0:? 'vertexIndex' (layout( location=0) in uint)
0:6 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:6 Function Call: @main(u1; ( temp 4-component vector of float)
0:? 'vertexIndex' ( temp uint)
0:? Linker Objects
0:? 'Test_Empty' ( const structure{})
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:? 'vertexIndex' (layout( location=0) in uint)
Linked vertex stage:
Shader version: 500
0:? Sequence
0:6 Function Definition: @main(u1; ( temp 4-component vector of float)
0:6 Function Parameters:
0:6 'vertexIndex' ( in uint)
0:? Sequence
0:7 Branch: Return with expression
0:7 Constant:
0:7 0.000000
0:7 0.000000
0:7 0.000000
0:7 0.000000
0:6 Function Definition: main( ( temp void)
0:6 Function Parameters:
0:? Sequence
0:6 move second child to first child ( temp uint)
0:? 'vertexIndex' ( temp uint)
0:? 'vertexIndex' (layout( location=0) in uint)
0:6 move second child to first child ( temp 4-component vector of float)
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:6 Function Call: @main(u1; ( temp 4-component vector of float)
0:? 'vertexIndex' ( temp uint)
0:? Linker Objects
0:? 'Test_Empty' ( const structure{})
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
0:? 'vertexIndex' (layout( location=0) in uint)
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 29
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 20 23
Source HLSL 500
Name 4 "main"
Name 12 "@main(u1;"
Name 11 "vertexIndex"
Name 18 "vertexIndex"
Name 20 "vertexIndex"
Name 23 "@entryPointOutput"
Name 24 "param"
Name 27 "Test"
Decorate 20(vertexIndex) Location 0
Decorate 23(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 0
7: TypePointer Function 6(int)
8: TypeFloat 32
9: TypeVector 8(float) 4
10: TypeFunction 9(fvec4) 7(ptr)
14: 8(float) Constant 0
15: 9(fvec4) ConstantComposite 14 14 14 14
19: TypePointer Input 6(int)
20(vertexIndex): 19(ptr) Variable Input
22: TypePointer Output 9(fvec4)
23(@entryPointOutput): 22(ptr) Variable Output
27(Test): TypeStruct
28: 27(Test) ConstantComposite
4(main): 2 Function None 3
5: Label
18(vertexIndex): 7(ptr) Variable Function
24(param): 7(ptr) Variable Function
21: 6(int) Load 20(vertexIndex)
Store 18(vertexIndex) 21
25: 6(int) Load 18(vertexIndex)
Store 24(param) 25
26: 9(fvec4) FunctionCall 12(@main(u1;) 24(param)
Store 23(@entryPointOutput) 26
Return
FunctionEnd
12(@main(u1;): 9(fvec4) Function None 10
11(vertexIndex): 7(ptr) FunctionParameter
13: Label
ReturnValue 15
FunctionEnd

View File

@ -0,0 +1,8 @@
struct Test { };
static const Test Test_Empty;
float4 main(in uint vertexIndex : VERTEXID) : VS_OUT_POSITION
{
return 0;
}

View File

@ -76,12 +76,6 @@ bool TConstTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node)
return false;
}
if (node->getSequence().size() == 0) {
error = true;
return false;
}
bool flag = node->getSequence().size() == 1 && node->getSequence()[0]->getAsTyped()->getAsConstantUnion();
if (flag) {
singleConstantParam = true;

View File

@ -106,6 +106,7 @@ INSTANTIATE_TEST_CASE_P(
{"hlsl.doLoop.frag", "PixelShaderFunction"},
{"hlsl.emptystructreturn.frag", "main"},
{"hlsl.emptystructreturn.vert", "main"},
{"hlsl.emptystruct.init.vert", "main"},
{"hlsl.entry-in.frag", "PixelShaderFunction"},
{"hlsl.entry-out.frag", "PixelShaderFunction"},
{"hlsl.float1.frag", "PixelShaderFunction"},