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
e4ad1bb6
Commit
e4ad1bb6
authored
Oct 13, 2016
by
John Kessenich
Committed by
GitHub
Oct 13, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #538 from steve-lunarg/iomap-binding-range-err
Check for out-of-range bindings during IO mapping.
parents
e3aa654c
9ae34742
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
72 additions
and
13 deletions
+72
-13
StandAlone.cpp
StandAlone/StandAlone.cpp
+6
-4
spv.register.autoassign.rangetest.frag.out
Test/baseResults/spv.register.autoassign.rangetest.frag.out
+12
-0
spv.register.autoassign.rangetest.frag
Test/spv.register.autoassign.rangetest.frag
+15
-0
ShaderLang.cpp
glslang/MachineIndependent/ShaderLang.cpp
+1
-1
iomapper.cpp
glslang/MachineIndependent/iomapper.cpp
+31
-7
iomapper.h
glslang/MachineIndependent/iomapper.h
+3
-1
Spv.FromFile.cpp
gtests/Spv.FromFile.cpp
+4
-0
No files found.
StandAlone/StandAlone.cpp
View file @
e4ad1bb6
...
...
@@ -584,6 +584,12 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
if
(
!
(
Options
&
EOptionOutputPreprocessed
)
&&
!
program
.
link
(
messages
))
LinkFailed
=
true
;
// Map IO
if
(
Options
&
EOptionSpv
)
{
if
(
!
program
.
mapIO
())
LinkFailed
=
true
;
}
// Report
if
(
!
(
Options
&
EOptionSuppressInfolog
)
&&
!
(
Options
&
EOptionMemoryLeakMode
))
{
...
...
@@ -591,10 +597,6 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
PutsIfNonEmpty
(
program
.
getInfoDebugLog
());
}
// Map IO
if
(
Options
&
EOptionSpv
)
program
.
mapIO
();
// Reflect
if
(
Options
&
EOptionDumpReflection
)
{
program
.
buildReflection
();
...
...
Test/baseResults/spv.register.autoassign.rangetest.frag.out
0 → 100644
View file @
e4ad1bb6
spv.register.autoassign.rangetest.frag
Linked fragment stage:
INTERNAL ERROR: mapped binding out of range: g_tScene
INTERNAL ERROR: mapped binding out of range: g_tSamp
INTERNAL ERROR: mapped binding out of range: g_tScene
INTERNAL ERROR: mapped binding out of range: g_tSamp
INTERNAL ERROR: mapped binding out of range: g_tSamp
INTERNAL ERROR: mapped binding out of range: g_tScene
SPIR-V is not generated for failed compile or link
Test/spv.register.autoassign.rangetest.frag
0 → 100644
View file @
e4ad1bb6
SamplerState
g_tSamp
:
register
(
s5
);
Texture2D
g_tScene
[
2
]
:
register
(
t5
);
struct
PS_OUTPUT
{
float4
Color
:
SV_Target0
;
};
void
main
(
out
PS_OUTPUT
psout
)
{
psout
.
Color
=
g_tScene
[
0
].
Sample
(
g_tSamp
,
0
.
3
)
+
g_tScene
[
1
].
Sample
(
g_tSamp
,
0
.
3
);
}
glslang/MachineIndependent/ShaderLang.cpp
View file @
e4ad1bb6
...
...
@@ -1724,7 +1724,7 @@ bool TProgram::mapIO()
for
(
int
s
=
0
;
s
<
EShLangCount
;
++
s
)
{
if
(
intermediate
[
s
])
{
if
(
!
ioMapper
->
addStage
((
EShLanguage
)
s
,
*
intermediate
[
s
]))
if
(
!
ioMapper
->
addStage
((
EShLanguage
)
s
,
*
intermediate
[
s
]
,
*
infoSink
))
return
false
;
}
}
...
...
glslang/MachineIndependent/iomapper.cpp
View file @
e4ad1bb6
...
...
@@ -34,6 +34,7 @@
//
#include "../Include/Common.h"
#include "../Include/InfoSink.h"
#include "iomapper.h"
#include "LiveTraverser.h"
#include "localintermediate.h"
...
...
@@ -150,11 +151,30 @@ protected:
class
TIoMappingTraverser
:
public
TBindingTraverser
{
public
:
TIoMappingTraverser
(
TIntermediate
&
i
,
TBindingMap
&
bindingMap
,
TUsedBindings
&
usedBindings
,
bool
traverseDeadCode
)
:
TBindingTraverser
(
i
,
bindingMap
,
usedBindings
,
traverseDeadCode
)
TInfoSink
&
infoSink
,
bool
traverseDeadCode
)
:
TBindingTraverser
(
i
,
bindingMap
,
usedBindings
,
traverseDeadCode
),
infoSink
(
infoSink
),
assignError
(
false
)
{
}
bool
success
()
const
{
return
!
assignError
;
}
protected
:
unsigned
checkBindingRange
(
const
TIntermSymbol
&
base
,
unsigned
binding
)
{
if
(
binding
>=
TQualifier
::
layoutBindingEnd
)
{
TString
err
=
"mapped binding out of range: "
;
err
+=
base
.
getName
();
infoSink
.
info
.
message
(
EPrefixInternalError
,
err
.
c_str
());
assignError
=
true
;
return
0
;
}
return
binding
;
}
void
addUniform
(
TIntermSymbol
&
base
)
override
{
// Skip things we don't intend to bind.
...
...
@@ -165,7 +185,7 @@ protected:
// Apply existing binding, if we were given one or already made one up.
if
(
existingBinding
!=
-
1
)
{
base
.
getWritableType
().
getQualifier
().
layoutBinding
=
existingBinding
;
base
.
getWritableType
().
getQualifier
().
layoutBinding
=
checkBindingRange
(
base
,
existingBinding
)
;
return
;
}
...
...
@@ -174,7 +194,7 @@ protected:
const
int
freeBinding
=
getFreeBinding
(
base
.
getType
(),
getBindingBase
(
base
.
getType
()));
markBinding
(
base
,
freeBinding
);
base
.
getWritableType
().
getQualifier
().
layoutBinding
=
freeBinding
;
base
.
getWritableType
().
getQualifier
().
layoutBinding
=
checkBindingRange
(
base
,
freeBinding
)
;
}
}
...
...
@@ -195,13 +215,17 @@ protected:
return
nextBinding
;
}
private
:
bool
assignError
;
// true if there was an error assigning the bindings
TInfoSink
&
infoSink
;
};
// Map I/O variables to provided offsets, and make bindings for
// unbound but live variables.
//
// Returns false if the input is too malformed to do this.
bool
TIoMapper
::
addStage
(
EShLanguage
,
TIntermediate
&
intermediate
)
bool
TIoMapper
::
addStage
(
EShLanguage
,
TIntermediate
&
intermediate
,
TInfoSink
&
infoSink
)
{
// Trivial return if there is nothing to do.
if
(
intermediate
.
getShiftSamplerBinding
()
==
0
&&
...
...
@@ -223,7 +247,7 @@ bool TIoMapper::addStage(EShLanguage, TIntermediate& intermediate)
TBindingTraverser
it_binding_all
(
intermediate
,
bindingMap
,
usedBindings
,
true
);
TBindingTraverser
it_binding_live
(
intermediate
,
bindingMap
,
usedBindings
,
false
);
TIoMappingTraverser
it_iomap
(
intermediate
,
bindingMap
,
usedBindings
,
true
);
TIoMappingTraverser
it_iomap
(
intermediate
,
bindingMap
,
usedBindings
,
infoSink
,
true
);
// Traverse all (live+dead) code to find explicit bindings, so we can avoid those.
root
->
traverse
(
&
it_binding_all
);
...
...
@@ -240,7 +264,7 @@ bool TIoMapper::addStage(EShLanguage, TIntermediate& intermediate)
// Bind everything that needs a binding and doesn't have one.
root
->
traverse
(
&
it_iomap
);
return
true
;
return
it_iomap
.
success
()
;
}
}
// end namespace glslang
glslang/MachineIndependent/iomapper.h
View file @
e4ad1bb6
...
...
@@ -42,6 +42,8 @@
// A reflection database and its interface, consistent with the OpenGL API reflection queries.
//
class
TInfoSink
;
namespace
glslang
{
class
TIntermediate
;
...
...
@@ -53,7 +55,7 @@ public:
virtual
~
TIoMapper
()
{}
// grow the reflection stage by stage
bool
addStage
(
EShLanguage
,
TIntermediate
&
);
bool
addStage
(
EShLanguage
,
TIntermediate
&
,
TInfoSink
&
);
};
}
// end namespace glslang
...
...
gtests/Spv.FromFile.cpp
View file @
e4ad1bb6
...
...
@@ -287,6 +287,10 @@ INSTANTIATE_TEST_CASE_P(
{
"spv.register.noautoassign.frag"
,
"main_ep"
,
5
,
10
,
15
,
false
,
false
},
{
"spv.register.autoassign-2.frag"
,
"main"
,
5
,
10
,
15
,
true
,
true
},
{
"spv.buffer.autoassign.frag"
,
"main"
,
5
,
10
,
15
,
true
,
true
},
{
"spv.register.autoassign.rangetest.frag"
,
"main"
,
glslang
::
TQualifier
::
layoutBindingEnd
-
2
,
glslang
::
TQualifier
::
layoutBindingEnd
+
5
,
20
,
true
,
false
},
}),
FileNameAsCustomTestSuffixIoMap
);
...
...
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