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
136b1e2d
Commit
136b1e2d
authored
May 29, 2017
by
John Kessenich
Committed by
GitHub
May 29, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #856 from TiemoJung/texture_upgrade
Pure Texture to Sampled Texture Transform
parents
d6af18f6
baf570ef
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
159 additions
and
2 deletions
+159
-2
spv.texture.sampler.transform.frag.out
Test/baseResults/spv.texture.sampler.transform.frag.out
+38
-0
spv.texture.sampler.transform.frag
Test/spv.texture.sampler.transform.frag
+13
-0
Types.h
glslang/Include/Types.h
+1
-0
Intermediate.cpp
glslang/MachineIndependent/Intermediate.cpp
+45
-0
ShaderLang.cpp
glslang/MachineIndependent/ShaderLang.cpp
+1
-0
localintermediate.h
glslang/MachineIndependent/localintermediate.h
+6
-1
ShaderLang.h
glslang/Public/ShaderLang.h
+9
-0
Spv.FromFile.cpp
gtests/Spv.FromFile.cpp
+18
-0
TestFixture.h
gtests/TestFixture.h
+28
-1
No files found.
Test/baseResults/spv.texture.sampler.transform.frag.out
0 → 100644
View file @
136b1e2d
spv.texture.sampler.transform.frag
Warning, version 440 is not yet complete; most version-specific features are present, but some are missing.
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 19
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 9 16
ExecutionMode 4 OriginUpperLeft
Source GLSL 440
Name 4 "main"
Name 9 "color"
Name 12 "tex"
Name 16 "coord"
Decorate 12(tex) DescriptorSet 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypeVector 6(float) 4
8: TypePointer Output 7(fvec4)
9(color): 8(ptr) Variable Output
10: TypeImage 6(float) 2D sampled format:Unknown
11: TypePointer UniformConstant 10
12(tex): 11(ptr) Variable UniformConstant
14: TypeVector 6(float) 2
15: TypePointer Input 14(fvec2)
16(coord): 15(ptr) Variable Input
4(main): 2 Function None 3
5: Label
13: 10 Load 12(tex)
17: 14(fvec2) Load 16(coord)
18: 7(fvec4) ImageSampleImplicitLod 13 17
Store 9(color) 18
Return
FunctionEnd
Test/spv.texture.sampler.transform.frag
0 → 100644
View file @
136b1e2d
#version 440
uniform
sampler
smp
;
uniform
texture2D
tex
;
in
vec2
coord
;
out
vec4
color
;
void
main
()
{
color
=
texture
(
sampler2D
(
tex
,
smp
),
coord
);
}
glslang/Include/Types.h
View file @
136b1e2d
...
@@ -1310,6 +1310,7 @@ public:
...
@@ -1310,6 +1310,7 @@ public:
virtual
TBasicType
getBasicType
()
const
{
return
basicType
;
}
virtual
TBasicType
getBasicType
()
const
{
return
basicType
;
}
virtual
const
TSampler
&
getSampler
()
const
{
return
sampler
;
}
virtual
const
TSampler
&
getSampler
()
const
{
return
sampler
;
}
virtual
TSampler
&
getSampler
()
{
return
sampler
;
}
virtual
TQualifier
&
getQualifier
()
{
return
qualifier
;
}
virtual
TQualifier
&
getQualifier
()
{
return
qualifier
;
}
virtual
const
TQualifier
&
getQualifier
()
const
{
return
qualifier
;
}
virtual
const
TQualifier
&
getQualifier
()
const
{
return
qualifier
;
}
...
...
glslang/MachineIndependent/Intermediate.cpp
View file @
136b1e2d
...
@@ -1776,6 +1776,14 @@ bool TIntermediate::postProcess(TIntermNode* root, EShLanguage /*language*/)
...
@@ -1776,6 +1776,14 @@ bool TIntermediate::postProcess(TIntermNode* root, EShLanguage /*language*/)
// Propagate 'noContraction' label in backward from 'precise' variables.
// Propagate 'noContraction' label in backward from 'precise' variables.
glslang
::
PropagateNoContraction
(
*
this
);
glslang
::
PropagateNoContraction
(
*
this
);
switch
(
textureSamplerTransformMode
)
{
case
EShTexSampTransKeep
:
break
;
case
EShTexSampTransUpgradeTextureRemoveSampler
:
performTextureUpgradeAndSamplerRemovalTransformation
(
root
);
break
;
}
return
true
;
return
true
;
}
}
...
@@ -2943,4 +2951,41 @@ bool TIntermediate::specConstantPropagates(const TIntermTyped& node1, const TInt
...
@@ -2943,4 +2951,41 @@ bool TIntermediate::specConstantPropagates(const TIntermTyped& node1, const TInt
(
node2
.
getType
().
getQualifier
().
isSpecConstant
()
&&
node1
.
getType
().
getQualifier
().
isConstant
());
(
node2
.
getType
().
getQualifier
().
isSpecConstant
()
&&
node1
.
getType
().
getQualifier
().
isConstant
());
}
}
struct
TextureUpgradeAndSamplerRemovalTransform
:
public
TIntermTraverser
{
bool
visitAggregate
(
TVisit
,
TIntermAggregate
*
ag
)
override
{
using
namespace
std
;
TIntermSequence
&
seq
=
ag
->
getSequence
();
// remove pure sampler variables
TIntermSequence
::
iterator
newEnd
=
remove_if
(
seq
.
begin
(),
seq
.
end
(),
[](
TIntermNode
*
node
)
{
TIntermSymbol
*
symbol
=
node
->
getAsSymbolNode
();
if
(
!
symbol
)
return
false
;
return
(
symbol
->
getBasicType
()
==
EbtSampler
&&
symbol
->
getType
().
getSampler
().
isPureSampler
());
});
seq
.
erase
(
newEnd
,
seq
.
end
());
// replace constructors with sampler/textures
// update textures into sampled textures
for_each
(
seq
.
begin
(),
seq
.
end
(),
[](
TIntermNode
*&
node
)
{
TIntermSymbol
*
symbol
=
node
->
getAsSymbolNode
();
if
(
!
symbol
)
{
TIntermAggregate
*
constructor
=
node
->
getAsAggregate
();
if
(
constructor
&&
constructor
->
getOp
()
==
EOpConstructTextureSampler
)
{
if
(
!
constructor
->
getSequence
().
empty
())
node
=
constructor
->
getSequence
()[
0
];
}
}
else
if
(
symbol
->
getBasicType
()
==
EbtSampler
&&
symbol
->
getType
().
getSampler
().
isTexture
())
{
symbol
->
getWritableType
().
getSampler
().
combined
=
true
;
}
});
return
true
;
}
};
void
TIntermediate
::
performTextureUpgradeAndSamplerRemovalTransformation
(
TIntermNode
*
root
)
{
TextureUpgradeAndSamplerRemovalTransform
transform
;
root
->
traverse
(
&
transform
);
}
}
// end namespace glslang
}
// end namespace glslang
glslang/MachineIndependent/ShaderLang.cpp
View file @
136b1e2d
...
@@ -1578,6 +1578,7 @@ void TShader::setHlslIoMapping(bool hlslIoMap) { intermediate->setHlslI
...
@@ -1578,6 +1578,7 @@ void TShader::setHlslIoMapping(bool hlslIoMap) { intermediate->setHlslI
void
TShader
::
setFlattenUniformArrays
(
bool
flatten
)
{
intermediate
->
setFlattenUniformArrays
(
flatten
);
}
void
TShader
::
setFlattenUniformArrays
(
bool
flatten
)
{
intermediate
->
setFlattenUniformArrays
(
flatten
);
}
void
TShader
::
setNoStorageFormat
(
bool
useUnknownFormat
)
{
intermediate
->
setNoStorageFormat
(
useUnknownFormat
);
}
void
TShader
::
setNoStorageFormat
(
bool
useUnknownFormat
)
{
intermediate
->
setNoStorageFormat
(
useUnknownFormat
);
}
void
TShader
::
setResourceSetBinding
(
const
std
::
vector
<
std
::
string
>&
base
)
{
intermediate
->
setResourceSetBinding
(
base
);
}
void
TShader
::
setResourceSetBinding
(
const
std
::
vector
<
std
::
string
>&
base
)
{
intermediate
->
setResourceSetBinding
(
base
);
}
void
TShader
::
setTextureSamplerTransformMode
(
EShTextureSamplerTransformMode
mode
)
{
intermediate
->
setTextureSamplerTransformMode
(
mode
);
}
//
//
// Turn the shader strings into a parse tree in the TIntermediate.
// Turn the shader strings into a parse tree in the TIntermediate.
...
...
glslang/MachineIndependent/localintermediate.h
View file @
136b1e2d
...
@@ -182,7 +182,8 @@ public:
...
@@ -182,7 +182,8 @@ public:
useUnknownFormat
(
false
),
useUnknownFormat
(
false
),
hlslOffsets
(
false
),
hlslOffsets
(
false
),
useStorageBuffer
(
false
),
useStorageBuffer
(
false
),
hlslIoMapping
(
false
)
hlslIoMapping
(
false
),
textureSamplerTransformMode
(
EShTexSampTransKeep
)
{
{
localSize
[
0
]
=
1
;
localSize
[
0
]
=
1
;
localSize
[
1
]
=
1
;
localSize
[
1
]
=
1
;
...
@@ -233,6 +234,7 @@ public:
...
@@ -233,6 +234,7 @@ public:
bool
usingStorageBuffer
()
const
{
return
useStorageBuffer
;
}
bool
usingStorageBuffer
()
const
{
return
useStorageBuffer
;
}
void
setHlslIoMapping
(
bool
b
)
{
hlslIoMapping
=
b
;
}
void
setHlslIoMapping
(
bool
b
)
{
hlslIoMapping
=
b
;
}
bool
usingHlslIoMapping
()
{
return
hlslIoMapping
;
}
bool
usingHlslIoMapping
()
{
return
hlslIoMapping
;
}
void
setTextureSamplerTransformMode
(
EShTextureSamplerTransformMode
mode
)
{
textureSamplerTransformMode
=
mode
;
}
void
setVersion
(
int
v
)
{
version
=
v
;
}
void
setVersion
(
int
v
)
{
version
=
v
;
}
int
getVersion
()
const
{
return
version
;
}
int
getVersion
()
const
{
return
version
;
}
...
@@ -472,6 +474,7 @@ protected:
...
@@ -472,6 +474,7 @@ protected:
void
pushSelector
(
TIntermSequence
&
,
const
TVectorSelector
&
,
const
TSourceLoc
&
);
void
pushSelector
(
TIntermSequence
&
,
const
TVectorSelector
&
,
const
TSourceLoc
&
);
void
pushSelector
(
TIntermSequence
&
,
const
TMatrixSelector
&
,
const
TSourceLoc
&
);
void
pushSelector
(
TIntermSequence
&
,
const
TMatrixSelector
&
,
const
TSourceLoc
&
);
bool
specConstantPropagates
(
const
TIntermTyped
&
,
const
TIntermTyped
&
);
bool
specConstantPropagates
(
const
TIntermTyped
&
,
const
TIntermTyped
&
);
void
performTextureUpgradeAndSamplerRemovalTransformation
(
TIntermNode
*
root
);
const
EShLanguage
language
;
// stage, known at construction time
const
EShLanguage
language
;
// stage, known at construction time
EShSource
source
;
// source language, known a bit later
EShSource
source
;
// source language, known a bit later
...
@@ -536,6 +539,8 @@ protected:
...
@@ -536,6 +539,8 @@ protected:
std
::
unordered_set
<
int
>
usedConstantId
;
// specialization constant ids used
std
::
unordered_set
<
int
>
usedConstantId
;
// specialization constant ids used
std
::
set
<
TString
>
semanticNameSet
;
std
::
set
<
TString
>
semanticNameSet
;
EShTextureSamplerTransformMode
textureSamplerTransformMode
;
private
:
private
:
void
operator
=
(
TIntermediate
&
);
// prevent assignments
void
operator
=
(
TIntermediate
&
);
// prevent assignments
};
};
...
...
glslang/Public/ShaderLang.h
View file @
136b1e2d
...
@@ -135,6 +135,14 @@ typedef enum {
...
@@ -135,6 +135,14 @@ typedef enum {
}
EShOptimizationLevel
;
}
EShOptimizationLevel
;
//
//
// Texture and Sampler transformation mode.
//
typedef
enum
{
EShTexSampTransKeep
,
// keep textures and samplers as is (default)
EShTexSampTransUpgradeTextureRemoveSampler
,
// change texture w/o embeded sampler into sampled texture and throw away all samplers
}
EShTextureSamplerTransformMode
;
//
// Message choices for what errors and warnings are given.
// Message choices for what errors and warnings are given.
//
//
enum
EShMessages
{
enum
EShMessages
{
...
@@ -313,6 +321,7 @@ public:
...
@@ -313,6 +321,7 @@ public:
void
setHlslIoMapping
(
bool
hlslIoMap
);
void
setHlslIoMapping
(
bool
hlslIoMap
);
void
setFlattenUniformArrays
(
bool
flatten
);
void
setFlattenUniformArrays
(
bool
flatten
);
void
setNoStorageFormat
(
bool
useUnknownFormat
);
void
setNoStorageFormat
(
bool
useUnknownFormat
);
void
setTextureSamplerTransformMode
(
EShTextureSamplerTransformMode
mode
);
// Interface to #include handlers.
// Interface to #include handlers.
//
//
...
...
gtests/Spv.FromFile.cpp
View file @
136b1e2d
...
@@ -75,6 +75,7 @@ using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam<std::st
...
@@ -75,6 +75,7 @@ using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam<std::st
#ifdef NV_EXTENSIONS
#ifdef NV_EXTENSIONS
using
CompileVulkanToSpirvTestNV
=
GlslangTest
<::
testing
::
TestWithParam
<
std
::
string
>>
;
using
CompileVulkanToSpirvTestNV
=
GlslangTest
<::
testing
::
TestWithParam
<
std
::
string
>>
;
#endif
#endif
using
CompileUpgradeTextureToSampledTextureAndDropSamplersTest
=
GlslangTest
<::
testing
::
TestWithParam
<
std
::
string
>>
;
// Compiling GLSL to SPIR-V under Vulkan semantics. Expected to successfully
// Compiling GLSL to SPIR-V under Vulkan semantics. Expected to successfully
// generate SPIR-V.
// generate SPIR-V.
...
@@ -172,6 +173,15 @@ TEST_P(CompileVulkanToSpirvTestNV, FromFile)
...
@@ -172,6 +173,15 @@ TEST_P(CompileVulkanToSpirvTestNV, FromFile)
}
}
#endif
#endif
TEST_P
(
CompileUpgradeTextureToSampledTextureAndDropSamplersTest
,
FromFile
)
{
loadCompileUpgradeTextureToSampledTextureAndDropSamplersAndCheck
(
GlobalTestSettings
.
testRoot
,
GetParam
(),
Source
::
GLSL
,
Semantics
::
Vulkan
,
Target
::
Spv
);
}
// clang-format off
// clang-format off
INSTANTIATE_TEST_CASE_P
(
INSTANTIATE_TEST_CASE_P
(
Glsl
,
CompileVulkanToSpirvTest
,
Glsl
,
CompileVulkanToSpirvTest
,
...
@@ -407,6 +417,14 @@ INSTANTIATE_TEST_CASE_P(
...
@@ -407,6 +417,14 @@ INSTANTIATE_TEST_CASE_P(
FileNameAsCustomTestSuffix
FileNameAsCustomTestSuffix
);
);
#endif
#endif
INSTANTIATE_TEST_CASE_P
(
Glsl
,
CompileUpgradeTextureToSampledTextureAndDropSamplersTest
,
::
testing
::
ValuesIn
(
std
::
vector
<
std
::
string
>
({
"spv.texture.sampler.transform.frag"
,
})),
FileNameAsCustomTestSuffix
);
// clang-format on
// clang-format on
}
// anonymous namespace
}
// anonymous namespace
...
...
gtests/TestFixture.h
View file @
136b1e2d
...
@@ -197,12 +197,14 @@ public:
...
@@ -197,12 +197,14 @@ public:
GlslangResult
compileAndLink
(
GlslangResult
compileAndLink
(
const
std
::
string
shaderName
,
const
std
::
string
&
code
,
const
std
::
string
shaderName
,
const
std
::
string
&
code
,
const
std
::
string
&
entryPointName
,
EShMessages
controls
,
const
std
::
string
&
entryPointName
,
EShMessages
controls
,
bool
flattenUniformArrays
=
false
)
bool
flattenUniformArrays
=
false
,
EShTextureSamplerTransformMode
texSampTransMode
=
EShTexSampTransKeep
)
{
{
const
EShLanguage
kind
=
GetShaderStage
(
GetSuffix
(
shaderName
));
const
EShLanguage
kind
=
GetShaderStage
(
GetSuffix
(
shaderName
));
glslang
::
TShader
shader
(
kind
);
glslang
::
TShader
shader
(
kind
);
shader
.
setAutoMapLocations
(
true
);
shader
.
setAutoMapLocations
(
true
);
shader
.
setTextureSamplerTransformMode
(
texSampTransMode
);
shader
.
setFlattenUniformArrays
(
flattenUniformArrays
);
shader
.
setFlattenUniformArrays
(
flattenUniformArrays
);
bool
success
=
compile
(
&
shader
,
code
,
entryPointName
,
controls
);
bool
success
=
compile
(
&
shader
,
code
,
entryPointName
,
controls
);
...
@@ -570,6 +572,31 @@ public:
...
@@ -570,6 +572,31 @@ public:
expectedErrorFname
);
expectedErrorFname
);
}
}
void
loadCompileUpgradeTextureToSampledTextureAndDropSamplersAndCheck
(
const
std
::
string
&
testDir
,
const
std
::
string
&
testName
,
Source
source
,
Semantics
semantics
,
Target
target
,
const
std
::
string
&
entryPointName
=
""
)
{
const
std
::
string
inputFname
=
testDir
+
"/"
+
testName
;
const
std
::
string
expectedOutputFname
=
testDir
+
"/baseResults/"
+
testName
+
".out"
;
std
::
string
input
,
expectedOutput
;
tryLoadFile
(
inputFname
,
"input"
,
&
input
);
tryLoadFile
(
expectedOutputFname
,
"expected output"
,
&
expectedOutput
);
const
EShMessages
controls
=
DeriveOptions
(
source
,
semantics
,
target
);
GlslangResult
result
=
compileAndLink
(
testName
,
input
,
entryPointName
,
controls
,
false
,
EShTexSampTransUpgradeTextureRemoveSampler
);
// Generate the hybrid output in the way of glslangValidator.
std
::
ostringstream
stream
;
outputResultToStream
(
&
stream
,
result
,
controls
);
checkEqAndUpdateIfRequested
(
expectedOutput
,
stream
.
str
(),
expectedOutputFname
);
}
private
:
private
:
const
int
defaultVersion
;
const
int
defaultVersion
;
const
EProfile
defaultProfile
;
const
EProfile
defaultProfile
;
...
...
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