Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
glslang
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
glslang
Commits
4c576400
Unverified
Commit
4c576400
authored
Jan 29, 2019
by
John Kessenich
Committed by
GitHub
Jan 29, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1681 from baldurk/reflection-fixes
Reflection consistency changes & bugfixes
parents
544c039d
90995f5d
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
155 additions
and
48 deletions
+155
-48
hlsl.reflection.vert.out
Test/baseResults/hlsl.reflection.vert.out
+35
-35
reflection.vert.out
Test/baseResults/reflection.vert.out
+11
-0
reflection.vert
Test/reflection.vert
+13
-0
reflection.cpp
glslang/MachineIndependent/reflection.cpp
+94
-12
reflection.h
glslang/MachineIndependent/reflection.h
+2
-1
No files found.
Test/baseResults/hlsl.reflection.vert.out
View file @
4c576400
...
...
@@ -15,45 +15,45 @@ foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1, stages 1
foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1, stages 1
foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1, stages 1
foo.n2.d: offset 24, type 1406, size 1, index 3, binding -1, stages 1
deepA.d2.d1[2].va: offset
376
, type 8b50, size 2, index 1, binding -1, stages 1
deepA.d2.d1[2].va: offset
440
, type 8b50, size 2, index 1, binding -1, stages 1
deepB.d2.d1.va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1
deepB.d2.d1[0].va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1
deepB.d2.d1[1].va: offset
984
, type 8b50, size 2, index 1, binding -1, stages 1
deepB.d2.d1[2].va: offset
984
, type 8b50, size 2, index 1, binding -1, stages 1
deepB.d2.d1[3].va: offset
984
, type 8b50, size 2, index 1, binding -1, stages 1
deepB.d2.d1[1].va: offset
1016
, type 8b50, size 2, index 1, binding -1, stages 1
deepB.d2.d1[2].va: offset
1048
, type 8b50, size 2, index 1, binding -1, stages 1
deepB.d2.d1[3].va: offset
1080
, type 8b50, size 2, index 1, binding -1, stages 1
deepC.iv4: offset 1568, type 8b52, size 1, index 1, binding -1, stages 1
deepC.d2.i: offset 15
68
, type 1404, size 1, index 1, binding -1, stages 1
deepC.d2.d1[0].va: offset 15
68
, type 8b50, size 3, index 1, binding -1, stages 1
deepC.d2.d1[0].b: offset 1
568
, type 8b56, size 1, index 1, binding -1, stages 1
deepC.d2.d1[1].va: offset 1
568
, type 8b50, size 3, index 1, binding -1, stages 1
deepC.d2.d1[1].b: offset 1
56
8, type 8b56, size 1, index 1, binding -1, stages 1
deepC.d2.d1[2].va: offset 1
568
, type 8b50, size 3, index 1, binding -1, stages 1
deepC.d2.d1[2].b: offset 1
568
, type 8b56, size 1, index 1, binding -1, stages 1
deepC.d2.d1[3].va: offset 1
56
8, type 8b50, size 3, index 1, binding -1, stages 1
deepC.d2.d1[3].b: offset 1
568
, type 8b56, size 1, index 1, binding -1, stages 1
deepC.v3: offset 1
56
8, type 8b54, size 1, index 1, binding -1, stages 1
deepC.d2.i: offset 15
84
, type 1404, size 1, index 1, binding -1, stages 1
deepC.d2.d1[0].va: offset 15
92
, type 8b50, size 3, index 1, binding -1, stages 1
deepC.d2.d1[0].b: offset 1
616
, type 8b56, size 1, index 1, binding -1, stages 1
deepC.d2.d1[1].va: offset 1
624
, type 8b50, size 3, index 1, binding -1, stages 1
deepC.d2.d1[1].b: offset 1
64
8, type 8b56, size 1, index 1, binding -1, stages 1
deepC.d2.d1[2].va: offset 1
656
, type 8b50, size 3, index 1, binding -1, stages 1
deepC.d2.d1[2].b: offset 1
680
, type 8b56, size 1, index 1, binding -1, stages 1
deepC.d2.d1[3].va: offset 1
68
8, type 8b50, size 3, index 1, binding -1, stages 1
deepC.d2.d1[3].b: offset 1
712
, type 8b56, size 1, index 1, binding -1, stages 1
deepC.v3: offset 1
72
8, type 8b54, size 1, index 1, binding -1, stages 1
deepD[0].iv4: offset 2480, type 8b52, size 1, index 1, binding -1, stages 1
deepD[0].d2.i: offset 24
80
, type 1404, size 1, index 1, binding -1, stages 1
deepD[0].d2.d1[0].va: offset 2
480
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[0].d2.d1[0].b: offset 2
480
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[0].d2.d1[1].va: offset 2
480
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[0].d2.d1[1].b: offset 2
48
0, type 8b56, size 1, index 1, binding -1, stages 1
deepD[0].d2.d1[2].va: offset 2
480
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[0].d2.d1[2].b: offset 2
480
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[0].d2.d1[3].va: offset 2
48
0, type 8b50, size 3, index 1, binding -1, stages 1
deepD[0].d2.d1[3].b: offset 2
480
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[0].v3: offset 2
48
0, type 8b54, size 1, index 1, binding -1, stages 1
deepD[1].iv4: offset 2
480
, type 8b52, size 1, index 1, binding -1, stages 1
deepD[1].d2.i: offset 2
48
0, type 1404, size 1, index 1, binding -1, stages 1
deepD[1].d2.d1[0].va: offset 2
480
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[1].d2.d1[0].b: offset 2
480
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[1].d2.d1[1].va: offset 2
48
0, type 8b50, size 3, index 1, binding -1, stages 1
deepD[1].d2.d1[1].b: offset 2
480
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[1].d2.d1[2].va: offset 2
480
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[1].d2.d1[2].b: offset 2
480
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[1].d2.d1[3].va: offset 2
480
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[1].d2.d1[3].b: offset 2
480
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[1].v3: offset 2
480
, type 8b54, size 1, index 1, binding -1, stages 1
deepD[0].d2.i: offset 24
96
, type 1404, size 1, index 1, binding -1, stages 1
deepD[0].d2.d1[0].va: offset 2
504
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[0].d2.d1[0].b: offset 2
528
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[0].d2.d1[1].va: offset 2
536
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[0].d2.d1[1].b: offset 2
56
0, type 8b56, size 1, index 1, binding -1, stages 1
deepD[0].d2.d1[2].va: offset 2
568
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[0].d2.d1[2].b: offset 2
592
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[0].d2.d1[3].va: offset 2
60
0, type 8b50, size 3, index 1, binding -1, stages 1
deepD[0].d2.d1[3].b: offset 2
624
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[0].v3: offset 2
64
0, type 8b54, size 1, index 1, binding -1, stages 1
deepD[1].iv4: offset 2
784
, type 8b52, size 1, index 1, binding -1, stages 1
deepD[1].d2.i: offset 2
80
0, type 1404, size 1, index 1, binding -1, stages 1
deepD[1].d2.d1[0].va: offset 2
808
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[1].d2.d1[0].b: offset 2
832
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[1].d2.d1[1].va: offset 2
84
0, type 8b50, size 3, index 1, binding -1, stages 1
deepD[1].d2.d1[1].b: offset 2
864
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[1].d2.d1[2].va: offset 2
872
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[1].d2.d1[2].b: offset 2
896
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[1].d2.d1[3].va: offset 2
904
, type 8b50, size 3, index 1, binding -1, stages 1
deepD[1].d2.d1[3].b: offset 2
928
, type 8b56, size 1, index 1, binding -1, stages 1
deepD[1].v3: offset 2
944
, type 8b54, size 1, index 1, binding -1, stages 1
foo1: offset 0, type 1406, size 1, index 4, binding -1, stages 1
foo2: offset 0, type 1406, size 1, index 5, binding -1, stages 1
anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
...
...
Test/baseResults/reflection.vert.out
View file @
4c576400
...
...
@@ -74,6 +74,16 @@ buf1.runtimeArray: offset 4, type 1406, size 4, index 12, binding -1, stages 1
buf2.runtimeArray.c: offset 8, type 1406, size 1, index 13, binding -1, stages 1
buf3.runtimeArray: offset 4, type 1406, size 0, index 14, binding -1, stages 1
buf4.runtimeArray.c: offset 8, type 1406, size 1, index 15, binding -1, stages 1
nested2.a.n1.a: offset 16, type 1406, size 1, index 16, binding -1, stages 1
nested2.a.n2.b: offset 32, type 1406, size 1, index 16, binding -1, stages 1
nested2.a.n2.c: offset 36, type 1406, size 1, index 16, binding -1, stages 1
nested2.a.n2.d: offset 40, type 1406, size 1, index 16, binding -1, stages 1
nested2.b[0].a: offset 48, type 1406, size 1, index 16, binding -1, stages 1
nested2.b[1].a: offset 64, type 1406, size 1, index 16, binding -1, stages 1
nested2.b[2].a: offset 80, type 1406, size 1, index 16, binding -1, stages 1
nested2.b[3].a: offset 96, type 1406, size 1, index 16, binding -1, stages 1
nested2.c.a: offset 112, type 1406, size 1, index 16, binding -1, stages 1
nested2.d.a: offset 144, type 1406, size 1, index 16, binding -1, stages 1
anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
uf1: offset -1, type 1406, size 1, index -1, binding -1, stages 1
uf2: offset -1, type 1406, size 1, index -1, binding -1, stages 1
...
...
@@ -96,6 +106,7 @@ buf1: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
buf2: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
buf3: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
buf4: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
nested2: offset -1, type ffffffff, size 208, index -1, binding -1, stages 0
Vertex attribute reflection:
attributeFloat: offset 0, type 1406, size 0, index 0, binding -1, stages 0
...
...
Test/reflection.vert
View file @
4c576400
...
...
@@ -60,6 +60,14 @@ layout(std140) uniform nested {
N3
foo
;
}
nest
;
layout
(
std140
)
uniform
nested2
{
vec4
padding
;
// offset 0, size 16
N3
a
;
// offset 16, size 32
N1
b
[
4
];
// offset 48, size 64
N1
c
[
2
];
// offset 112, size 32
N1
d
[
4
];
// offset 144, size 64
}
nest2
;
struct
TS
{
int
a
;
int
dead
;
...
...
@@ -203,4 +211,9 @@ void main()
f
+=
buf2i
.
runtimeArray
[
3
].
c
;
f
+=
buf3i
.
runtimeArray
[
gl_InstanceID
];
f
+=
buf4i
.
runtimeArray
[
gl_InstanceID
].
c
;
N3
n
=
nest2
.
a
;
N1
b
[
4
]
=
nest2
.
b
;
f
+=
nest2
.
c
[
1
].
a
;
f
+=
nest2
.
d
[
gl_InstanceID
].
a
;
}
glslang/MachineIndependent/reflection.cpp
View file @
4c576400
...
...
@@ -113,6 +113,21 @@ public:
}
}
// shared calculation by getOffset and getOffsets
void
updateOffset
(
const
TType
&
parentType
,
const
TType
&
memberType
,
int
&
offset
,
int
&
memberSize
)
{
int
dummyStride
;
// modify just the children's view of matrix layout, if there is one for this member
TLayoutMatrix
subMatrixLayout
=
memberType
.
getQualifier
().
layoutMatrix
;
int
memberAlignment
=
intermediate
.
getMemberAlignment
(
memberType
,
memberSize
,
dummyStride
,
parentType
.
getQualifier
().
layoutPacking
,
subMatrixLayout
!=
ElmNone
?
subMatrixLayout
==
ElmRowMajor
:
parentType
.
getQualifier
().
layoutMatrix
==
ElmRowMajor
);
RoundToPow2
(
offset
,
memberAlignment
);
}
// Lookup or calculate the offset of a block member, using the recursively
// defined block offset rules.
int
getOffset
(
const
TType
&
type
,
int
index
)
...
...
@@ -125,18 +140,11 @@ public:
if
(
memberList
[
index
].
type
->
getQualifier
().
hasOffset
())
return
memberList
[
index
].
type
->
getQualifier
().
layoutOffset
;
int
memberSize
;
int
dummyStride
;
int
memberSize
=
0
;
int
offset
=
0
;
for
(
int
m
=
0
;
m
<=
index
;
++
m
)
{
// modify just the children's view of matrix layout, if there is one for this member
TLayoutMatrix
subMatrixLayout
=
memberList
[
m
].
type
->
getQualifier
().
layoutMatrix
;
int
memberAlignment
=
intermediate
.
getMemberAlignment
(
*
memberList
[
m
].
type
,
memberSize
,
dummyStride
,
type
.
getQualifier
().
layoutPacking
,
subMatrixLayout
!=
ElmNone
?
subMatrixLayout
==
ElmRowMajor
:
type
.
getQualifier
().
layoutMatrix
==
ElmRowMajor
);
RoundToPow2
(
offset
,
memberAlignment
);
updateOffset
(
type
,
*
memberList
[
m
].
type
,
offset
,
memberSize
);
if
(
m
<
index
)
offset
+=
memberSize
;
}
...
...
@@ -144,6 +152,50 @@ public:
return
offset
;
}
// Lookup or calculate the offset of all block members at once, using the recursively
// defined block offset rules.
void
getOffsets
(
const
TType
&
type
,
TVector
<
int
>&
offsets
)
{
const
TTypeList
&
memberList
=
*
type
.
getStruct
();
int
memberSize
=
0
;
int
offset
=
0
;
for
(
size_t
m
=
0
;
m
<
offsets
.
size
();
++
m
)
{
// if the user supplied an offset, snap to it now
if
(
memberList
[
m
].
type
->
getQualifier
().
hasOffset
())
offset
=
memberList
[
m
].
type
->
getQualifier
().
layoutOffset
;
// calculate the offset of the next member and align the current offset to this member
updateOffset
(
type
,
*
memberList
[
m
].
type
,
offset
,
memberSize
);
// save the offset of this member
offsets
[
m
]
=
offset
;
// update for the next member
offset
+=
memberSize
;
}
}
// Calculate the stride of an array type
int
getArrayStride
(
const
TType
&
baseType
,
const
TType
&
type
)
{
int
dummySize
;
int
stride
;
// consider blocks to have 0 stride, so that all offsets are relative to the start of their block
if
(
type
.
getBasicType
()
==
EbtBlock
)
return
0
;
TLayoutMatrix
subMatrixLayout
=
type
.
getQualifier
().
layoutMatrix
;
intermediate
.
getMemberAlignment
(
type
,
dummySize
,
stride
,
baseType
.
getQualifier
().
layoutPacking
,
subMatrixLayout
!=
ElmNone
?
subMatrixLayout
==
ElmRowMajor
:
baseType
.
getQualifier
().
layoutMatrix
==
ElmRowMajor
);
return
stride
;
}
// Calculate the block data size.
// Block arrayness is not taken into account, each element is backed by a separate buffer.
int
getBlockSize
(
const
TType
&
blockType
)
...
...
@@ -179,7 +231,9 @@ public:
terminalType
=
&
visitNode
->
getType
();
int
index
;
switch
(
visitNode
->
getOp
())
{
case
EOpIndexIndirect
:
case
EOpIndexIndirect
:
{
int
stride
=
getArrayStride
(
baseType
,
visitNode
->
getLeft
()
->
getType
());
// Visit all the indices of this array, and for each one add on the remaining dereferencing
for
(
int
i
=
0
;
i
<
std
::
max
(
visitNode
->
getLeft
()
->
getType
().
getOuterArraySize
(),
1
);
++
i
)
{
TString
newBaseName
=
name
;
...
...
@@ -189,14 +243,22 @@ public:
++
nextDeref
;
TType
derefType
(
*
terminalType
,
0
);
blowUpActiveAggregate
(
derefType
,
newBaseName
,
derefs
,
nextDeref
,
offset
,
blockIndex
,
arraySize
);
if
(
offset
>=
0
)
offset
+=
stride
;
}
// it was all completed in the recursive calls above
return
;
}
case
EOpIndexDirect
:
index
=
visitNode
->
getRight
()
->
getAsConstantUnion
()
->
getConstArray
()[
0
].
getIConst
();
if
(
baseType
.
getBasicType
()
!=
EbtBlock
)
if
(
baseType
.
getBasicType
()
!=
EbtBlock
)
{
name
.
append
(
TString
(
"["
)
+
String
(
index
)
+
"]"
);
if
(
offset
>=
0
)
offset
+=
getArrayStride
(
baseType
,
visitNode
->
getLeft
()
->
getType
())
*
index
;
}
break
;
case
EOpIndexDirectStruct
:
index
=
visitNode
->
getRight
()
->
getAsConstantUnion
()
->
getConstArray
()[
0
].
getIConst
();
...
...
@@ -213,23 +275,43 @@ public:
// if the terminalType is still too coarse a granularity, this is still an aggregate to expand, expand it...
if
(
!
isReflectionGranularity
(
*
terminalType
))
{
// the base offset of this node, that children are relative to
int
baseOffset
=
offset
;
if
(
terminalType
->
isArray
())
{
// Visit all the indices of this array, and for each one,
// fully explode the remaining aggregate to dereference
int
stride
=
0
;
if
(
offset
>=
0
)
stride
=
getArrayStride
(
baseType
,
*
terminalType
);
for
(
int
i
=
0
;
i
<
std
::
max
(
terminalType
->
getOuterArraySize
(),
1
);
++
i
)
{
TString
newBaseName
=
name
;
newBaseName
.
append
(
TString
(
"["
)
+
String
(
i
)
+
"]"
);
TType
derefType
(
*
terminalType
,
0
);
if
(
offset
>=
0
)
offset
=
baseOffset
+
stride
*
i
;
blowUpActiveAggregate
(
derefType
,
newBaseName
,
derefs
,
derefs
.
end
(),
offset
,
blockIndex
,
0
);
}
}
else
{
// Visit all members of this aggregate, and for each one,
// fully explode the remaining aggregate to dereference
const
TTypeList
&
typeList
=
*
terminalType
->
getStruct
();
TVector
<
int
>
memberOffsets
;
if
(
baseOffset
>=
0
)
{
memberOffsets
.
resize
(
typeList
.
size
());
getOffsets
(
*
terminalType
,
memberOffsets
);
}
for
(
int
i
=
0
;
i
<
(
int
)
typeList
.
size
();
++
i
)
{
TString
newBaseName
=
name
;
newBaseName
.
append
(
TString
(
"."
)
+
typeList
[
i
].
type
->
getFieldName
());
TType
derefType
(
*
terminalType
,
i
);
if
(
offset
>=
0
)
offset
=
baseOffset
+
memberOffsets
[
i
];
blowUpActiveAggregate
(
derefType
,
newBaseName
,
derefs
,
derefs
.
end
(),
offset
,
blockIndex
,
0
);
}
}
...
...
glslang/MachineIndependent/reflection.h
View file @
4c576400
...
...
@@ -87,7 +87,8 @@ public:
EShLanguageMask
stages
;
protected
:
TObjectReflection
()
:
offset
(
-
1
),
glDefineType
(
-
1
),
size
(
-
1
),
index
(
-
1
),
type
(
nullptr
)
{
}
TObjectReflection
()
:
offset
(
-
1
),
glDefineType
(
-
1
),
size
(
-
1
),
index
(
-
1
),
counterIndex
(
-
1
),
stages
(
EShLanguageMask
(
0
)),
type
(
nullptr
)
{
}
const
TType
*
type
;
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment