зеркало из https://github.com/stride3d/xkslang.git
HLSL: Fix #1154: Support PointSize, as an attribute.
This commit is contained in:
Родитель
b0159f8565
Коммит
cc951f8183
|
@ -0,0 +1,143 @@
|
|||
hlsl.PointSize.geom
|
||||
Shader version: 500
|
||||
invocations = -1
|
||||
max_vertices = 4
|
||||
input primitive = triangles
|
||||
output primitive = line_strip
|
||||
0:? Sequence
|
||||
0:8 Function Definition: @main(u1[3];struct-S-f11; ( temp void)
|
||||
0:8 Function Parameters:
|
||||
0:8 'ps' ( in 3-element array of uint)
|
||||
0:8 'OutputStream' ( out structure{ temp float ps})
|
||||
0:? Sequence
|
||||
0:10 Sequence
|
||||
0:10 Sequence
|
||||
0:10 move second child to first child ( temp float)
|
||||
0:? 'OutputStream.ps' ( out float PointSize)
|
||||
0:10 ps: direct index for structure ( temp float)
|
||||
0:10 's' ( temp structure{ temp float ps})
|
||||
0:10 Constant:
|
||||
0:10 0 (const int)
|
||||
0:10 EmitVertex ( temp void)
|
||||
0:8 Function Definition: main( ( temp void)
|
||||
0:8 Function Parameters:
|
||||
0:? Sequence
|
||||
0:8 move second child to first child ( temp 3-element array of uint)
|
||||
0:? 'ps' ( temp 3-element array of uint)
|
||||
0:? 'ps' ( in 3-element array of uint PointSize)
|
||||
0:8 Function Call: @main(u1[3];struct-S-f11; ( temp void)
|
||||
0:? 'ps' ( temp 3-element array of uint)
|
||||
0:? 'OutputStream' ( temp structure{ temp float ps})
|
||||
0:? Linker Objects
|
||||
0:? 'ps' ( in 3-element array of uint PointSize)
|
||||
0:? 'OutputStream.ps' ( out float PointSize)
|
||||
|
||||
|
||||
Linked geometry stage:
|
||||
|
||||
|
||||
Shader version: 500
|
||||
invocations = 1
|
||||
max_vertices = 4
|
||||
input primitive = triangles
|
||||
output primitive = line_strip
|
||||
0:? Sequence
|
||||
0:8 Function Definition: @main(u1[3];struct-S-f11; ( temp void)
|
||||
0:8 Function Parameters:
|
||||
0:8 'ps' ( in 3-element array of uint)
|
||||
0:8 'OutputStream' ( out structure{ temp float ps})
|
||||
0:? Sequence
|
||||
0:10 Sequence
|
||||
0:10 Sequence
|
||||
0:10 move second child to first child ( temp float)
|
||||
0:? 'OutputStream.ps' ( out float PointSize)
|
||||
0:10 ps: direct index for structure ( temp float)
|
||||
0:10 's' ( temp structure{ temp float ps})
|
||||
0:10 Constant:
|
||||
0:10 0 (const int)
|
||||
0:10 EmitVertex ( temp void)
|
||||
0:8 Function Definition: main( ( temp void)
|
||||
0:8 Function Parameters:
|
||||
0:? Sequence
|
||||
0:8 move second child to first child ( temp 3-element array of uint)
|
||||
0:? 'ps' ( temp 3-element array of uint)
|
||||
0:? 'ps' ( in 3-element array of uint PointSize)
|
||||
0:8 Function Call: @main(u1[3];struct-S-f11; ( temp void)
|
||||
0:? 'ps' ( temp 3-element array of uint)
|
||||
0:? 'OutputStream' ( temp structure{ temp float ps})
|
||||
0:? Linker Objects
|
||||
0:? 'ps' ( in 3-element array of uint PointSize)
|
||||
0:? 'OutputStream.ps' ( out float PointSize)
|
||||
|
||||
// Module Version 10000
|
||||
// Generated by (magic number): 80002
|
||||
// Id's are bound by 36
|
||||
|
||||
Capability Geometry
|
||||
Capability GeometryPointSize
|
||||
1: ExtInstImport "GLSL.std.450"
|
||||
MemoryModel Logical GLSL450
|
||||
EntryPoint Geometry 4 "main" 19 28
|
||||
ExecutionMode 4 Triangles
|
||||
ExecutionMode 4 Invocations 1
|
||||
ExecutionMode 4 OutputLineStrip
|
||||
ExecutionMode 4 OutputVertices 4
|
||||
Source HLSL 500
|
||||
Name 4 "main"
|
||||
Name 11 "S"
|
||||
MemberName 11(S) 0 "ps"
|
||||
Name 16 "@main(u1[3];struct-S-f11;"
|
||||
Name 14 "ps"
|
||||
Name 15 "OutputStream"
|
||||
Name 19 "OutputStream.ps"
|
||||
Name 20 "s"
|
||||
Name 26 "ps"
|
||||
Name 28 "ps"
|
||||
Name 30 "OutputStream"
|
||||
Name 31 "param"
|
||||
Name 33 "param"
|
||||
Decorate 19(OutputStream.ps) BuiltIn PointSize
|
||||
Decorate 28(ps) BuiltIn PointSize
|
||||
2: TypeVoid
|
||||
3: TypeFunction 2
|
||||
6: TypeInt 32 0
|
||||
7: 6(int) Constant 3
|
||||
8: TypeArray 6(int) 7
|
||||
9: TypePointer Function 8
|
||||
10: TypeFloat 32
|
||||
11(S): TypeStruct 10(float)
|
||||
12: TypePointer Function 11(S)
|
||||
13: TypeFunction 2 9(ptr) 12(ptr)
|
||||
18: TypePointer Output 10(float)
|
||||
19(OutputStream.ps): 18(ptr) Variable Output
|
||||
21: TypeInt 32 1
|
||||
22: 21(int) Constant 0
|
||||
23: TypePointer Function 10(float)
|
||||
27: TypePointer Input 8
|
||||
28(ps): 27(ptr) Variable Input
|
||||
4(main): 2 Function None 3
|
||||
5: Label
|
||||
26(ps): 9(ptr) Variable Function
|
||||
30(OutputStream): 12(ptr) Variable Function
|
||||
31(param): 9(ptr) Variable Function
|
||||
33(param): 12(ptr) Variable Function
|
||||
29: 8 Load 28(ps)
|
||||
Store 26(ps) 29
|
||||
32: 8 Load 26(ps)
|
||||
Store 31(param) 32
|
||||
34: 2 FunctionCall 16(@main(u1[3];struct-S-f11;) 31(param) 33(param)
|
||||
35: 11(S) Load 33(param)
|
||||
Store 30(OutputStream) 35
|
||||
Return
|
||||
FunctionEnd
|
||||
16(@main(u1[3];struct-S-f11;): 2 Function None 13
|
||||
14(ps): 9(ptr) FunctionParameter
|
||||
15(OutputStream): 12(ptr) FunctionParameter
|
||||
17: Label
|
||||
20(s): 12(ptr) Variable Function
|
||||
24: 23(ptr) AccessChain 20(s) 22
|
||||
25: 10(float) Load 24
|
||||
Store 19(OutputStream.ps) 25
|
||||
EmitVertex
|
||||
Return
|
||||
FunctionEnd
|
|
@ -0,0 +1,69 @@
|
|||
hlsl.PointSize.vert
|
||||
Shader version: 500
|
||||
0:? Sequence
|
||||
0:2 Function Definition: @main( ( temp float)
|
||||
0:2 Function Parameters:
|
||||
0:? Sequence
|
||||
0:3 Branch: Return with expression
|
||||
0:3 Constant:
|
||||
0:3 2.300000
|
||||
0:2 Function Definition: main( ( temp void)
|
||||
0:2 Function Parameters:
|
||||
0:? Sequence
|
||||
0:2 move second child to first child ( temp float)
|
||||
0:? '@entryPointOutput' ( out float PointSize)
|
||||
0:2 Function Call: @main( ( temp float)
|
||||
0:? Linker Objects
|
||||
0:? '@entryPointOutput' ( out float PointSize)
|
||||
|
||||
|
||||
Linked vertex stage:
|
||||
|
||||
|
||||
Shader version: 500
|
||||
0:? Sequence
|
||||
0:2 Function Definition: @main( ( temp float)
|
||||
0:2 Function Parameters:
|
||||
0:? Sequence
|
||||
0:3 Branch: Return with expression
|
||||
0:3 Constant:
|
||||
0:3 2.300000
|
||||
0:2 Function Definition: main( ( temp void)
|
||||
0:2 Function Parameters:
|
||||
0:? Sequence
|
||||
0:2 move second child to first child ( temp float)
|
||||
0:? '@entryPointOutput' ( out float PointSize)
|
||||
0:2 Function Call: @main( ( temp float)
|
||||
0:? Linker Objects
|
||||
0:? '@entryPointOutput' ( out float PointSize)
|
||||
|
||||
// Module Version 10000
|
||||
// Generated by (magic number): 80002
|
||||
// Id's are bound by 16
|
||||
|
||||
Capability Shader
|
||||
1: ExtInstImport "GLSL.std.450"
|
||||
MemoryModel Logical GLSL450
|
||||
EntryPoint Vertex 4 "main" 14
|
||||
Source HLSL 500
|
||||
Name 4 "main"
|
||||
Name 8 "@main("
|
||||
Name 14 "@entryPointOutput"
|
||||
Decorate 14(@entryPointOutput) BuiltIn PointSize
|
||||
2: TypeVoid
|
||||
3: TypeFunction 2
|
||||
6: TypeFloat 32
|
||||
7: TypeFunction 6(float)
|
||||
10: 6(float) Constant 1075000115
|
||||
13: TypePointer Output 6(float)
|
||||
14(@entryPointOutput): 13(ptr) Variable Output
|
||||
4(main): 2 Function None 3
|
||||
5: Label
|
||||
15: 6(float) FunctionCall 8(@main()
|
||||
Store 14(@entryPointOutput) 15
|
||||
Return
|
||||
FunctionEnd
|
||||
8(@main(): 6(float) Function None 7
|
||||
9: Label
|
||||
ReturnValue 10
|
||||
FunctionEnd
|
|
@ -0,0 +1,11 @@
|
|||
struct S {
|
||||
[[vk::builtin("PointSize")]] float ps;
|
||||
};
|
||||
|
||||
[maxvertexcount(4)]
|
||||
void main([[vk::builtin("PointSize")]] triangle in uint ps[3],
|
||||
inout LineStream<S> OutputStream)
|
||||
{
|
||||
S s;
|
||||
OutputStream.Append(s);
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
[[vk::builtin("PointSize")]] float main()
|
||||
{
|
||||
return 2.3;
|
||||
}
|
|
@ -252,6 +252,8 @@ INSTANTIATE_TEST_CASE_P(
|
|||
{"hlsl.params.default.negative.frag", "main"},
|
||||
{"hlsl.partialInit.frag", "PixelShaderFunction"},
|
||||
{"hlsl.partialFlattenLocal.vert", "main"},
|
||||
{"hlsl.PointSize.geom", "main"},
|
||||
{"hlsl.PointSize.vert", "main"},
|
||||
{"hlsl.pp.vert", "main"},
|
||||
{"hlsl.pp.line.frag", "main"},
|
||||
{"hlsl.precise.frag", "main"},
|
||||
|
|
|
@ -60,6 +60,8 @@ namespace glslang {
|
|||
return EatBinding;
|
||||
else if (lowername == "global_cbuffer_binding")
|
||||
return EatGlobalBinding;
|
||||
else if (lowername == "builtin")
|
||||
return EatBuiltIn;
|
||||
} else if (lowernameSpace.size() > 0)
|
||||
return EatNone;
|
||||
|
||||
|
@ -177,7 +179,7 @@ namespace glslang {
|
|||
const TConstUnion* constVal = &attrAgg->getSequence()[argNum]->getAsConstantUnion()->getConstArray()[0];
|
||||
if (constVal == nullptr || constVal->getType() != basicType)
|
||||
return nullptr;
|
||||
|
||||
|
||||
return constVal;
|
||||
}
|
||||
|
||||
|
|
|
@ -66,7 +66,8 @@ namespace glslang {
|
|||
EatBinding,
|
||||
EatGlobalBinding,
|
||||
EatLocation,
|
||||
EatInputAttachment
|
||||
EatInputAttachment,
|
||||
EatBuiltIn
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -84,6 +85,8 @@ namespace glslang {
|
|||
|
||||
class TAttributeMap {
|
||||
public:
|
||||
int size() const { return (int)attributes.size(); }
|
||||
|
||||
// Search for and potentially add the attribute into the map. Return the
|
||||
// attribute type enum for it, if found, else EatNone.
|
||||
TAttributeType setAttribute(const TString& nameSpace, const TString* name, TIntermAggregate* value);
|
||||
|
|
|
@ -2302,8 +2302,8 @@ bool HlslGrammar::acceptStructBufferType(TType& type)
|
|||
// : struct_declaration SEMI_COLON struct_declaration SEMI_COLON ...
|
||||
//
|
||||
// struct_declaration
|
||||
// : fully_specified_type struct_declarator COMMA struct_declarator ...
|
||||
// | fully_specified_type IDENTIFIER function_parameters post_decls compound_statement // member-function definition
|
||||
// : attributes fully_specified_type struct_declarator COMMA struct_declarator ...
|
||||
// | attributes fully_specified_type IDENTIFIER function_parameters post_decls compound_statement // member-function definition
|
||||
//
|
||||
// struct_declarator
|
||||
// : IDENTIFIER post_decls
|
||||
|
@ -2322,7 +2322,11 @@ bool HlslGrammar::acceptStructDeclarationList(TTypeList*& typeList, TIntermNode*
|
|||
break;
|
||||
|
||||
// struct_declaration
|
||||
|
||||
|
||||
// attributes
|
||||
TAttributeMap attributes;
|
||||
acceptAttributes(attributes);
|
||||
|
||||
bool declarator_list = false;
|
||||
|
||||
// fully_specified_type
|
||||
|
@ -2332,6 +2336,8 @@ bool HlslGrammar::acceptStructDeclarationList(TTypeList*& typeList, TIntermNode*
|
|||
return false;
|
||||
}
|
||||
|
||||
parseContext.transferTypeAttributes(attributes, memberType);
|
||||
|
||||
// struct_declarator COMMA struct_declarator ...
|
||||
bool functionDefinitionAccepted = false;
|
||||
do {
|
||||
|
|
|
@ -1854,6 +1854,9 @@ void HlslParseContext::handleEntryPointAttributes(const TSourceLoc& loc, const T
|
|||
// attributes.
|
||||
void HlslParseContext::transferTypeAttributes(const TAttributeMap& attributes, TType& type)
|
||||
{
|
||||
if (attributes.size() == 0)
|
||||
return;
|
||||
|
||||
// location
|
||||
int value;
|
||||
if (attributes.getInt(EatLocation, value))
|
||||
|
@ -1880,6 +1883,13 @@ void HlslParseContext::transferTypeAttributes(const TAttributeMap& attributes, T
|
|||
// input attachment
|
||||
if (attributes.getInt(EatInputAttachment, value))
|
||||
type.getQualifier().layoutAttachment = value;
|
||||
|
||||
// PointSize built-in
|
||||
TString builtInString;
|
||||
if (attributes.getString(EatBuiltIn, builtInString, 0, false)) {
|
||||
if (builtInString == "PointSize")
|
||||
type.getQualifier().builtIn = EbvPointSize;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
Загрузка…
Ссылка в новой задаче