SPIR-V OpLines now contain filenames from HLSL-style #lines.
This commit is contained in:
parent
127cea5c9a
commit
5d43c4aac7
@ -1594,7 +1594,7 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
|
|||||||
|
|
||||||
bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)
|
bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)
|
||||||
{
|
{
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
|
|
||||||
SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
|
SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
|
||||||
if (node->getType().getQualifier().isSpecConstant())
|
if (node->getType().getQualifier().isSpecConstant())
|
||||||
@ -1789,7 +1789,7 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
|
|||||||
|
|
||||||
bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node)
|
bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node)
|
||||||
{
|
{
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
|
|
||||||
SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
|
SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
|
||||||
if (node->getType().getQualifier().isSpecConstant())
|
if (node->getType().getQualifier().isSpecConstant())
|
||||||
@ -2053,7 +2053,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|||||||
return false;
|
return false;
|
||||||
case glslang::EOpFunctionCall:
|
case glslang::EOpFunctionCall:
|
||||||
{
|
{
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
if (node->isUserDefined())
|
if (node->isUserDefined())
|
||||||
result = handleUserFunctionCall(node);
|
result = handleUserFunctionCall(node);
|
||||||
// assert(result); // this can happen for bad shaders because the call graph completeness checking is not yet done
|
// assert(result); // this can happen for bad shaders because the call graph completeness checking is not yet done
|
||||||
@ -2172,7 +2172,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|||||||
case glslang::EOpConstructStruct:
|
case glslang::EOpConstructStruct:
|
||||||
case glslang::EOpConstructTextureSampler:
|
case glslang::EOpConstructTextureSampler:
|
||||||
{
|
{
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
std::vector<spv::Id> arguments;
|
std::vector<spv::Id> arguments;
|
||||||
translateArguments(*node, arguments);
|
translateArguments(*node, arguments);
|
||||||
spv::Id constructed;
|
spv::Id constructed;
|
||||||
@ -2317,7 +2317,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|||||||
right->traverse(this);
|
right->traverse(this);
|
||||||
spv::Id rightId = accessChainLoad(right->getType());
|
spv::Id rightId = accessChainLoad(right->getType());
|
||||||
|
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
OpDecorations decorations = { precision,
|
OpDecorations decorations = { precision,
|
||||||
TranslateNoContractionDecoration(node->getType().getQualifier()),
|
TranslateNoContractionDecoration(node->getType().getQualifier()),
|
||||||
TranslateNonUniformDecoration(node->getType().getQualifier()) };
|
TranslateNonUniformDecoration(node->getType().getQualifier()) };
|
||||||
@ -2405,12 +2405,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|||||||
if (lvalue)
|
if (lvalue)
|
||||||
operands.push_back(builder.accessChainGetLValue());
|
operands.push_back(builder.accessChainGetLValue());
|
||||||
else {
|
else {
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
operands.push_back(accessChainLoad(glslangOperands[arg]->getAsTyped()->getType()));
|
operands.push_back(accessChainLoad(glslangOperands[arg]->getAsTyped()->getType()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
if (atomic) {
|
if (atomic) {
|
||||||
// Handle all atomics
|
// Handle all atomics
|
||||||
result = createAtomicOperation(node->getOp(), precision, resultType(), operands, node->getBasicType());
|
result = createAtomicOperation(node->getOp(), precision, resultType(), operands, node->getBasicType());
|
||||||
@ -2511,7 +2511,7 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang
|
|||||||
node->getFalseBlock()->traverse(this);
|
node->getFalseBlock()->traverse(this);
|
||||||
spv::Id falseValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType());
|
spv::Id falseValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType());
|
||||||
|
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
|
|
||||||
// done if void
|
// done if void
|
||||||
if (node->getBasicType() == glslang::EbtVoid)
|
if (node->getBasicType() == glslang::EbtVoid)
|
||||||
@ -2685,7 +2685,7 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn
|
|||||||
// by a block-ending branch. But we don't want to put any other body/test
|
// by a block-ending branch. But we don't want to put any other body/test
|
||||||
// instructions in it, since the body/test may have arbitrary instructions,
|
// instructions in it, since the body/test may have arbitrary instructions,
|
||||||
// including merges of its own.
|
// including merges of its own.
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
builder.setBuildPoint(&blocks.head);
|
builder.setBuildPoint(&blocks.head);
|
||||||
builder.createLoopMerge(&blocks.merge, &blocks.continue_target, control, dependencyLength);
|
builder.createLoopMerge(&blocks.merge, &blocks.continue_target, control, dependencyLength);
|
||||||
if (node->testFirst() && node->getTest()) {
|
if (node->testFirst() && node->getTest()) {
|
||||||
@ -2709,7 +2709,7 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn
|
|||||||
node->getTerminal()->traverse(this);
|
node->getTerminal()->traverse(this);
|
||||||
builder.createBranch(&blocks.head);
|
builder.createBranch(&blocks.head);
|
||||||
} else {
|
} else {
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
builder.createBranch(&blocks.body);
|
builder.createBranch(&blocks.body);
|
||||||
|
|
||||||
breakForLoop.push(true);
|
breakForLoop.push(true);
|
||||||
@ -2744,7 +2744,7 @@ bool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::T
|
|||||||
if (node->getExpression())
|
if (node->getExpression())
|
||||||
node->getExpression()->traverse(this);
|
node->getExpression()->traverse(this);
|
||||||
|
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
|
|
||||||
switch (node->getFlowOp()) {
|
switch (node->getFlowOp()) {
|
||||||
case glslang::EOpKill:
|
case glslang::EOpKill:
|
||||||
@ -3913,7 +3913,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
if (! node->isImage() && ! node->isTexture())
|
if (! node->isImage() && ! node->isTexture())
|
||||||
return spv::NoResult;
|
return spv::NoResult;
|
||||||
|
|
||||||
builder.setLine(node->getLoc().line);
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
|
|
||||||
// Process a GLSL texturing op (will be SPV image)
|
// Process a GLSL texturing op (will be SPV image)
|
||||||
|
|
||||||
|
@ -60,6 +60,7 @@ Builder::Builder(unsigned int spvVersion, unsigned int magicNumber, SpvBuildLogg
|
|||||||
sourceVersion(0),
|
sourceVersion(0),
|
||||||
sourceFileStringId(NoResult),
|
sourceFileStringId(NoResult),
|
||||||
currentLine(0),
|
currentLine(0),
|
||||||
|
currentFile(nullptr),
|
||||||
emitOpLines(false),
|
emitOpLines(false),
|
||||||
addressModel(AddressingModelLogical),
|
addressModel(AddressingModelLogical),
|
||||||
memoryModel(MemoryModelGLSL450),
|
memoryModel(MemoryModelGLSL450),
|
||||||
@ -87,8 +88,9 @@ Id Builder::import(const char* name)
|
|||||||
return import->getResultId();
|
return import->getResultId();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit an OpLine if we've been asked to emit OpLines and the line number
|
// Emit instruction for non-filename-based #line directives (ie. no filename
|
||||||
// has changed since the last time, and is a valid line number.
|
// seen yet): emit an OpLine if we've been asked to emit OpLines and the line
|
||||||
|
// number has changed since the last time, and is a valid line number.
|
||||||
void Builder::setLine(int lineNum)
|
void Builder::setLine(int lineNum)
|
||||||
{
|
{
|
||||||
if (lineNum != 0 && lineNum != currentLine) {
|
if (lineNum != 0 && lineNum != currentLine) {
|
||||||
@ -98,6 +100,38 @@ void Builder::setLine(int lineNum)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If no filename, do non-filename-based #line emit. Else do filename-based emit.
|
||||||
|
// Emit OpLine if we've been asked to emit OpLines and the line number or filename
|
||||||
|
// has changed since the last time, and line number is valid.
|
||||||
|
void Builder::setLine(int lineNum, const char* filename)
|
||||||
|
{
|
||||||
|
if (filename == nullptr) {
|
||||||
|
setLine(lineNum);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((lineNum != 0 && lineNum != currentLine) || currentFile == nullptr ||
|
||||||
|
strncmp(filename, currentFile, strlen(currentFile) + 1) != 0) {
|
||||||
|
currentLine = lineNum;
|
||||||
|
currentFile = filename;
|
||||||
|
if (emitOpLines) {
|
||||||
|
// If filename previously seen, use its id, else create a string
|
||||||
|
// and put it in the map.
|
||||||
|
auto sItr = stringIds.find(filename);
|
||||||
|
if (sItr != stringIds.end()) {
|
||||||
|
addLine(sItr->second, currentLine, 0);
|
||||||
|
} else {
|
||||||
|
Instruction* fileString =
|
||||||
|
new Instruction(getUniqueId(), NoType, OpString);
|
||||||
|
fileString->addStringOperand(filename);
|
||||||
|
spv::Id stringId = fileString->getResultId();
|
||||||
|
strings.push_back(std::unique_ptr<Instruction>(fileString));
|
||||||
|
addLine(stringId, currentLine, 0);
|
||||||
|
stringIds[filename] = stringId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Builder::addLine(Id fileName, int lineNum, int column)
|
void Builder::addLine(Id fileName, int lineNum, int column)
|
||||||
{
|
{
|
||||||
Instruction* line = new Instruction(OpLine);
|
Instruction* line = new Instruction(OpLine);
|
||||||
|
@ -77,9 +77,11 @@ public:
|
|||||||
void setSourceFile(const std::string& file)
|
void setSourceFile(const std::string& file)
|
||||||
{
|
{
|
||||||
Instruction* fileString = new Instruction(getUniqueId(), NoType, OpString);
|
Instruction* fileString = new Instruction(getUniqueId(), NoType, OpString);
|
||||||
fileString->addStringOperand(file.c_str());
|
const char* file_c_str = file.c_str();
|
||||||
|
fileString->addStringOperand(file_c_str);
|
||||||
sourceFileStringId = fileString->getResultId();
|
sourceFileStringId = fileString->getResultId();
|
||||||
strings.push_back(std::unique_ptr<Instruction>(fileString));
|
strings.push_back(std::unique_ptr<Instruction>(fileString));
|
||||||
|
stringIds[file_c_str] = sourceFileStringId;
|
||||||
}
|
}
|
||||||
void setSourceText(const std::string& text) { sourceText = text; }
|
void setSourceText(const std::string& text) { sourceText = text; }
|
||||||
void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); }
|
void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); }
|
||||||
@ -106,9 +108,16 @@ public:
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log the current line, and if different than the last one,
|
// Generate OpLine for non-filename-based #line directives (ie no filename
|
||||||
// issue a new OpLine, using the current file name.
|
// seen yet): Log the current line, and if different than the last one,
|
||||||
|
// issue a new OpLine using the new line and current source file name.
|
||||||
void setLine(int line);
|
void setLine(int line);
|
||||||
|
|
||||||
|
// If filename null, generate OpLine for non-filename-based line directives,
|
||||||
|
// else do filename-based: Log the current line and file, and if different
|
||||||
|
// than the last one, issue a new OpLine using the new line and file
|
||||||
|
// name.
|
||||||
|
void setLine(int line, const char* filename);
|
||||||
// Low-level OpLine. See setLine() for a layered helper.
|
// Low-level OpLine. See setLine() for a layered helper.
|
||||||
void addLine(Id fileName, int line, int column);
|
void addLine(Id fileName, int line, int column);
|
||||||
|
|
||||||
@ -658,6 +667,7 @@ public:
|
|||||||
spv::Id sourceFileStringId;
|
spv::Id sourceFileStringId;
|
||||||
std::string sourceText;
|
std::string sourceText;
|
||||||
int currentLine;
|
int currentLine;
|
||||||
|
const char* currentFile;
|
||||||
bool emitOpLines;
|
bool emitOpLines;
|
||||||
std::set<std::string> extensions;
|
std::set<std::string> extensions;
|
||||||
std::vector<const char*> sourceExtensions;
|
std::vector<const char*> sourceExtensions;
|
||||||
@ -695,6 +705,9 @@ public:
|
|||||||
// Our loop stack.
|
// Our loop stack.
|
||||||
std::stack<LoopBlocks> loops;
|
std::stack<LoopBlocks> loops;
|
||||||
|
|
||||||
|
// map from strings to their string ids
|
||||||
|
std::unordered_map<std::string, spv::Id> stringIds;
|
||||||
|
|
||||||
// The stream for outputting warnings and errors.
|
// The stream for outputting warnings and errors.
|
||||||
SpvBuildLogger* logger;
|
SpvBuildLogger* logger;
|
||||||
}; // end Builder class
|
}; // end Builder class
|
||||||
|
183
Test/baseResults/hlsl.pp.line2.frag.out
Normal file
183
Test/baseResults/hlsl.pp.line2.frag.out
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
hlsl.pp.line2.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 80
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
2: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 5 "MainPs" 71 75
|
||||||
|
ExecutionMode 5 OriginUpperLeft
|
||||||
|
1: String "hlsl.pp.line2.frag"
|
||||||
|
17: String "foo.frag"
|
||||||
|
32: String "foo.h"
|
||||||
|
42: String "foo2.h"
|
||||||
|
Source HLSL 500 1 "// OpModuleProcessed auto-map-locations
|
||||||
|
// OpModuleProcessed auto-map-bindings
|
||||||
|
// OpModuleProcessed entry-point MainPs
|
||||||
|
// OpModuleProcessed client vulkan100
|
||||||
|
// OpModuleProcessed target-env vulkan1.0
|
||||||
|
// OpModuleProcessed keep-uncalled
|
||||||
|
// OpModuleProcessed hlsl-offsets
|
||||||
|
#line 1
|
||||||
|
#line 1 "foo.frag"
|
||||||
|
Texture2D g_tColor[ 128 ] ;
|
||||||
|
|
||||||
|
layout (push_constant) cbuffer PerViewConstantBuffer_t
|
||||||
|
{
|
||||||
|
uint g_nDataIdx;
|
||||||
|
uint g_nDataIdx2;
|
||||||
|
bool g_B;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
SamplerState g_sAniso;
|
||||||
|
|
||||||
|
struct PS_INPUT
|
||||||
|
{
|
||||||
|
float2 vTextureCoords : TEXCOORD2 ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
struct PS_OUTPUT
|
||||||
|
{
|
||||||
|
float4 vColor : SV_Target0 ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
PS_OUTPUT MainPs ( PS_INPUT i )
|
||||||
|
{
|
||||||
|
PS_OUTPUT ps_output ;
|
||||||
|
|
||||||
|
uint u;
|
||||||
|
#line 47
|
||||||
|
if (g_B)
|
||||||
|
#line 3 "foo.h"
|
||||||
|
u = g_nDataIdx;
|
||||||
|
else
|
||||||
|
#line 67
|
||||||
|
u = g_nDataIdx2;
|
||||||
|
#line 7 "foo2.h"
|
||||||
|
ps_output . vColor = g_tColor [ u ] . Sample ( g_sAniso , i . vTextureCoords . xy );
|
||||||
|
#line 105
|
||||||
|
return ps_output ;
|
||||||
|
}
|
||||||
|
|
||||||
|
"
|
||||||
|
Name 5 "MainPs"
|
||||||
|
Name 9 "PS_INPUT"
|
||||||
|
MemberName 9(PS_INPUT) 0 "vTextureCoords"
|
||||||
|
Name 12 "PS_OUTPUT"
|
||||||
|
MemberName 12(PS_OUTPUT) 0 "vColor"
|
||||||
|
Name 15 "@MainPs(struct-PS_INPUT-vf21;"
|
||||||
|
Name 14 "i"
|
||||||
|
Name 19 "PerViewConstantBuffer_t"
|
||||||
|
MemberName 19(PerViewConstantBuffer_t) 0 "g_nDataIdx"
|
||||||
|
MemberName 19(PerViewConstantBuffer_t) 1 "g_nDataIdx2"
|
||||||
|
MemberName 19(PerViewConstantBuffer_t) 2 "g_B"
|
||||||
|
Name 21 ""
|
||||||
|
Name 34 "u"
|
||||||
|
Name 44 "ps_output"
|
||||||
|
Name 49 "g_tColor"
|
||||||
|
Name 56 "g_sAniso"
|
||||||
|
Name 69 "i"
|
||||||
|
Name 71 "i.vTextureCoords"
|
||||||
|
Name 75 "@entryPointOutput.vColor"
|
||||||
|
Name 76 "param"
|
||||||
|
MemberDecorate 19(PerViewConstantBuffer_t) 0 Offset 0
|
||||||
|
MemberDecorate 19(PerViewConstantBuffer_t) 1 Offset 4
|
||||||
|
MemberDecorate 19(PerViewConstantBuffer_t) 2 Offset 8
|
||||||
|
Decorate 19(PerViewConstantBuffer_t) Block
|
||||||
|
Decorate 49(g_tColor) DescriptorSet 0
|
||||||
|
Decorate 56(g_sAniso) DescriptorSet 0
|
||||||
|
Decorate 71(i.vTextureCoords) Location 0
|
||||||
|
Decorate 75(@entryPointOutput.vColor) Location 0
|
||||||
|
3: TypeVoid
|
||||||
|
4: TypeFunction 3
|
||||||
|
7: TypeFloat 32
|
||||||
|
8: TypeVector 7(float) 2
|
||||||
|
9(PS_INPUT): TypeStruct 8(fvec2)
|
||||||
|
10: TypePointer Function 9(PS_INPUT)
|
||||||
|
11: TypeVector 7(float) 4
|
||||||
|
12(PS_OUTPUT): TypeStruct 11(fvec4)
|
||||||
|
13: TypeFunction 12(PS_OUTPUT) 10(ptr)
|
||||||
|
18: TypeInt 32 0
|
||||||
|
19(PerViewConstantBuffer_t): TypeStruct 18(int) 18(int) 18(int)
|
||||||
|
20: TypePointer PushConstant 19(PerViewConstantBuffer_t)
|
||||||
|
21: 20(ptr) Variable PushConstant
|
||||||
|
22: TypeInt 32 1
|
||||||
|
23: 22(int) Constant 2
|
||||||
|
24: TypePointer PushConstant 18(int)
|
||||||
|
27: TypeBool
|
||||||
|
28: 18(int) Constant 0
|
||||||
|
33: TypePointer Function 18(int)
|
||||||
|
35: 22(int) Constant 0
|
||||||
|
39: 22(int) Constant 1
|
||||||
|
43: TypePointer Function 12(PS_OUTPUT)
|
||||||
|
45: TypeImage 7(float) 2D sampled format:Unknown
|
||||||
|
46: 18(int) Constant 128
|
||||||
|
47: TypeArray 45 46
|
||||||
|
48: TypePointer UniformConstant 47
|
||||||
|
49(g_tColor): 48(ptr) Variable UniformConstant
|
||||||
|
51: TypePointer UniformConstant 45
|
||||||
|
54: TypeSampler
|
||||||
|
55: TypePointer UniformConstant 54
|
||||||
|
56(g_sAniso): 55(ptr) Variable UniformConstant
|
||||||
|
58: TypeSampledImage 45
|
||||||
|
60: TypePointer Function 8(fvec2)
|
||||||
|
64: TypePointer Function 11(fvec4)
|
||||||
|
70: TypePointer Input 8(fvec2)
|
||||||
|
71(i.vTextureCoords): 70(ptr) Variable Input
|
||||||
|
74: TypePointer Output 11(fvec4)
|
||||||
|
75(@entryPointOutput.vColor): 74(ptr) Variable Output
|
||||||
|
5(MainPs): 3 Function None 4
|
||||||
|
6: Label
|
||||||
|
69(i): 10(ptr) Variable Function
|
||||||
|
76(param): 10(ptr) Variable Function
|
||||||
|
Line 17 23 0
|
||||||
|
72: 8(fvec2) Load 71(i.vTextureCoords)
|
||||||
|
73: 60(ptr) AccessChain 69(i) 35
|
||||||
|
Store 73 72
|
||||||
|
77: 9(PS_INPUT) Load 69(i)
|
||||||
|
Store 76(param) 77
|
||||||
|
78:12(PS_OUTPUT) FunctionCall 15(@MainPs(struct-PS_INPUT-vf21;) 76(param)
|
||||||
|
79: 11(fvec4) CompositeExtract 78 0
|
||||||
|
Store 75(@entryPointOutput.vColor) 79
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
15(@MainPs(struct-PS_INPUT-vf21;):12(PS_OUTPUT) Function None 13
|
||||||
|
14(i): 10(ptr) FunctionParameter
|
||||||
|
16: Label
|
||||||
|
34(u): 33(ptr) Variable Function
|
||||||
|
44(ps_output): 43(ptr) Variable Function
|
||||||
|
Line 17 47 0
|
||||||
|
25: 24(ptr) AccessChain 21 23
|
||||||
|
26: 18(int) Load 25
|
||||||
|
29: 27(bool) INotEqual 26 28
|
||||||
|
SelectionMerge 31 None
|
||||||
|
BranchConditional 29 30 38
|
||||||
|
30: Label
|
||||||
|
Line 32 3 0
|
||||||
|
36: 24(ptr) AccessChain 21 35
|
||||||
|
37: 18(int) Load 36
|
||||||
|
Store 34(u) 37
|
||||||
|
Branch 31
|
||||||
|
38: Label
|
||||||
|
Line 32 67 0
|
||||||
|
40: 24(ptr) AccessChain 21 39
|
||||||
|
41: 18(int) Load 40
|
||||||
|
Store 34(u) 41
|
||||||
|
Branch 31
|
||||||
|
31: Label
|
||||||
|
Line 42 7 0
|
||||||
|
50: 18(int) Load 34(u)
|
||||||
|
52: 51(ptr) AccessChain 49(g_tColor) 50
|
||||||
|
53: 45 Load 52
|
||||||
|
57: 54 Load 56(g_sAniso)
|
||||||
|
59: 58 SampledImage 53 57
|
||||||
|
61: 60(ptr) AccessChain 14(i) 35
|
||||||
|
62: 8(fvec2) Load 61
|
||||||
|
63: 11(fvec4) ImageSampleImplicitLod 59 62
|
||||||
|
65: 64(ptr) AccessChain 44(ps_output) 35
|
||||||
|
Store 65 63
|
||||||
|
Line 42 105 0
|
||||||
|
66:12(PS_OUTPUT) Load 44(ps_output)
|
||||||
|
ReturnValue 66
|
||||||
|
FunctionEnd
|
172
Test/baseResults/hlsl.pp.line3.frag.out
Normal file
172
Test/baseResults/hlsl.pp.line3.frag.out
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
hlsl.pp.line3.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 78
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
2: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 5 "MainPs" 69 73
|
||||||
|
ExecutionMode 5 OriginUpperLeft
|
||||||
|
1: String "hlsl.pp.line3.frag"
|
||||||
|
31: String "./i1.h"
|
||||||
|
Source HLSL 500 1 "// OpModuleProcessed entry-point MainPs
|
||||||
|
// OpModuleProcessed client vulkan100
|
||||||
|
// OpModuleProcessed target-env vulkan1.0
|
||||||
|
// OpModuleProcessed hlsl-offsets
|
||||||
|
#line 1
|
||||||
|
Texture2D g_tColor[ 128 ] ;
|
||||||
|
|
||||||
|
layout (push_constant) cbuffer PerViewConstantBuffer_t
|
||||||
|
{
|
||||||
|
uint g_nDataIdx;
|
||||||
|
uint g_nDataIdx2;
|
||||||
|
bool g_B;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
SamplerState g_sAniso;
|
||||||
|
|
||||||
|
struct PS_INPUT
|
||||||
|
{
|
||||||
|
float2 vTextureCoords : TEXCOORD2 ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
struct PS_OUTPUT
|
||||||
|
{
|
||||||
|
float4 vColor : SV_Target0 ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
PS_OUTPUT MainPs ( PS_INPUT i )
|
||||||
|
{
|
||||||
|
PS_OUTPUT ps_output ;
|
||||||
|
|
||||||
|
uint u;
|
||||||
|
if (g_B)
|
||||||
|
#include "i1.h"
|
||||||
|
else
|
||||||
|
u = g_nDataIdx2;
|
||||||
|
ps_output . vColor = g_tColor [ u ] . Sample ( g_sAniso , i . vTextureCoords . xy );
|
||||||
|
return ps_output ;
|
||||||
|
}
|
||||||
|
|
||||||
|
"
|
||||||
|
Name 5 "MainPs"
|
||||||
|
Name 9 "PS_INPUT"
|
||||||
|
MemberName 9(PS_INPUT) 0 "vTextureCoords"
|
||||||
|
Name 12 "PS_OUTPUT"
|
||||||
|
MemberName 12(PS_OUTPUT) 0 "vColor"
|
||||||
|
Name 15 "@MainPs(struct-PS_INPUT-vf21;"
|
||||||
|
Name 14 "i"
|
||||||
|
Name 18 "PerViewConstantBuffer_t"
|
||||||
|
MemberName 18(PerViewConstantBuffer_t) 0 "g_nDataIdx"
|
||||||
|
MemberName 18(PerViewConstantBuffer_t) 1 "g_nDataIdx2"
|
||||||
|
MemberName 18(PerViewConstantBuffer_t) 2 "g_B"
|
||||||
|
Name 20 ""
|
||||||
|
Name 33 "u"
|
||||||
|
Name 42 "ps_output"
|
||||||
|
Name 47 "g_tColor"
|
||||||
|
Name 54 "g_sAniso"
|
||||||
|
Name 67 "i"
|
||||||
|
Name 69 "i.vTextureCoords"
|
||||||
|
Name 73 "@entryPointOutput.vColor"
|
||||||
|
Name 74 "param"
|
||||||
|
MemberDecorate 18(PerViewConstantBuffer_t) 0 Offset 0
|
||||||
|
MemberDecorate 18(PerViewConstantBuffer_t) 1 Offset 4
|
||||||
|
MemberDecorate 18(PerViewConstantBuffer_t) 2 Offset 8
|
||||||
|
Decorate 18(PerViewConstantBuffer_t) Block
|
||||||
|
Decorate 47(g_tColor) DescriptorSet 0
|
||||||
|
Decorate 54(g_sAniso) DescriptorSet 0
|
||||||
|
Decorate 69(i.vTextureCoords) Location 0
|
||||||
|
Decorate 73(@entryPointOutput.vColor) Location 0
|
||||||
|
3: TypeVoid
|
||||||
|
4: TypeFunction 3
|
||||||
|
7: TypeFloat 32
|
||||||
|
8: TypeVector 7(float) 2
|
||||||
|
9(PS_INPUT): TypeStruct 8(fvec2)
|
||||||
|
10: TypePointer Function 9(PS_INPUT)
|
||||||
|
11: TypeVector 7(float) 4
|
||||||
|
12(PS_OUTPUT): TypeStruct 11(fvec4)
|
||||||
|
13: TypeFunction 12(PS_OUTPUT) 10(ptr)
|
||||||
|
17: TypeInt 32 0
|
||||||
|
18(PerViewConstantBuffer_t): TypeStruct 17(int) 17(int) 17(int)
|
||||||
|
19: TypePointer PushConstant 18(PerViewConstantBuffer_t)
|
||||||
|
20: 19(ptr) Variable PushConstant
|
||||||
|
21: TypeInt 32 1
|
||||||
|
22: 21(int) Constant 2
|
||||||
|
23: TypePointer PushConstant 17(int)
|
||||||
|
26: TypeBool
|
||||||
|
27: 17(int) Constant 0
|
||||||
|
32: TypePointer Function 17(int)
|
||||||
|
34: 21(int) Constant 0
|
||||||
|
38: 21(int) Constant 1
|
||||||
|
41: TypePointer Function 12(PS_OUTPUT)
|
||||||
|
43: TypeImage 7(float) 2D sampled format:Unknown
|
||||||
|
44: 17(int) Constant 128
|
||||||
|
45: TypeArray 43 44
|
||||||
|
46: TypePointer UniformConstant 45
|
||||||
|
47(g_tColor): 46(ptr) Variable UniformConstant
|
||||||
|
49: TypePointer UniformConstant 43
|
||||||
|
52: TypeSampler
|
||||||
|
53: TypePointer UniformConstant 52
|
||||||
|
54(g_sAniso): 53(ptr) Variable UniformConstant
|
||||||
|
56: TypeSampledImage 43
|
||||||
|
58: TypePointer Function 8(fvec2)
|
||||||
|
62: TypePointer Function 11(fvec4)
|
||||||
|
68: TypePointer Input 8(fvec2)
|
||||||
|
69(i.vTextureCoords): 68(ptr) Variable Input
|
||||||
|
72: TypePointer Output 11(fvec4)
|
||||||
|
73(@entryPointOutput.vColor): 72(ptr) Variable Output
|
||||||
|
5(MainPs): 3 Function None 4
|
||||||
|
6: Label
|
||||||
|
67(i): 10(ptr) Variable Function
|
||||||
|
74(param): 10(ptr) Variable Function
|
||||||
|
Line 1 23 0
|
||||||
|
70: 8(fvec2) Load 69(i.vTextureCoords)
|
||||||
|
71: 58(ptr) AccessChain 67(i) 34
|
||||||
|
Store 71 70
|
||||||
|
75: 9(PS_INPUT) Load 67(i)
|
||||||
|
Store 74(param) 75
|
||||||
|
76:12(PS_OUTPUT) FunctionCall 15(@MainPs(struct-PS_INPUT-vf21;) 74(param)
|
||||||
|
77: 11(fvec4) CompositeExtract 76 0
|
||||||
|
Store 73(@entryPointOutput.vColor) 77
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
15(@MainPs(struct-PS_INPUT-vf21;):12(PS_OUTPUT) Function None 13
|
||||||
|
14(i): 10(ptr) FunctionParameter
|
||||||
|
16: Label
|
||||||
|
33(u): 32(ptr) Variable Function
|
||||||
|
42(ps_output): 41(ptr) Variable Function
|
||||||
|
Line 1 27 0
|
||||||
|
24: 23(ptr) AccessChain 20 22
|
||||||
|
25: 17(int) Load 24
|
||||||
|
28: 26(bool) INotEqual 25 27
|
||||||
|
SelectionMerge 30 None
|
||||||
|
BranchConditional 28 29 37
|
||||||
|
29: Label
|
||||||
|
Line 31 1 0
|
||||||
|
35: 23(ptr) AccessChain 20 34
|
||||||
|
36: 17(int) Load 35
|
||||||
|
Store 33(u) 36
|
||||||
|
Branch 30
|
||||||
|
37: Label
|
||||||
|
Line 1 30 0
|
||||||
|
39: 23(ptr) AccessChain 20 38
|
||||||
|
40: 17(int) Load 39
|
||||||
|
Store 33(u) 40
|
||||||
|
Branch 30
|
||||||
|
30: Label
|
||||||
|
Line 1 31 0
|
||||||
|
48: 17(int) Load 33(u)
|
||||||
|
50: 49(ptr) AccessChain 47(g_tColor) 48
|
||||||
|
51: 43 Load 50
|
||||||
|
55: 52 Load 54(g_sAniso)
|
||||||
|
57: 56 SampledImage 51 55
|
||||||
|
59: 58(ptr) AccessChain 14(i) 34
|
||||||
|
60: 8(fvec2) Load 59
|
||||||
|
61: 11(fvec4) ImageSampleImplicitLod 57 60
|
||||||
|
63: 62(ptr) AccessChain 42(ps_output) 34
|
||||||
|
Store 63 61
|
||||||
|
Line 1 32 0
|
||||||
|
64:12(PS_OUTPUT) Load 42(ps_output)
|
||||||
|
ReturnValue 64
|
||||||
|
FunctionEnd
|
144
Test/baseResults/spv.pp.line.frag.out
Normal file
144
Test/baseResults/spv.pp.line.frag.out
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
spv.pp.line.frag
|
||||||
|
WARNING: spv.pp.line.frag:6: varying deprecated in version 130; may be removed in future release
|
||||||
|
WARNING: spv.pp.line.frag:7: varying deprecated in version 130; may be removed in future release
|
||||||
|
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 65
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
Capability Sampled1D
|
||||||
|
2: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 5 "main" 41 53 56 59
|
||||||
|
ExecutionMode 5 OriginUpperLeft
|
||||||
|
1: String "spv.pp.line.frag"
|
||||||
|
Source GLSL 140 1 "// OpModuleProcessed auto-map-locations
|
||||||
|
// OpModuleProcessed auto-map-bindings
|
||||||
|
// OpModuleProcessed client vulkan100
|
||||||
|
// OpModuleProcessed target-env vulkan1.0
|
||||||
|
// OpModuleProcessed keep-uncalled
|
||||||
|
// OpModuleProcessed entry-point main
|
||||||
|
#line 1
|
||||||
|
#version 140
|
||||||
|
|
||||||
|
uniform sampler1D texSampler1D;
|
||||||
|
uniform sampler2D texSampler2D;
|
||||||
|
|
||||||
|
varying float blend;
|
||||||
|
varying vec4 u;
|
||||||
|
|
||||||
|
in vec2 coords2D;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
float blendscale = 1.789;
|
||||||
|
float bias = 2.0;
|
||||||
|
float coords1D = 1.789;
|
||||||
|
vec4 color = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
#line 53
|
||||||
|
color += texture (texSampler1D, coords1D);
|
||||||
|
color += texture (texSampler1D, coords1D, bias);
|
||||||
|
#line 102
|
||||||
|
color += texture (texSampler2D, coords2D);
|
||||||
|
color += texture (texSampler2D, coords2D, bias);
|
||||||
|
|
||||||
|
gl_FragColor = mix(color, u, blend * blendscale);
|
||||||
|
}
|
||||||
|
"
|
||||||
|
Name 5 "main"
|
||||||
|
Name 9 "blendscale"
|
||||||
|
Name 11 "bias"
|
||||||
|
Name 13 "coords1D"
|
||||||
|
Name 16 "color"
|
||||||
|
Name 22 "texSampler1D"
|
||||||
|
Name 37 "texSampler2D"
|
||||||
|
Name 41 "coords2D"
|
||||||
|
Name 53 "gl_FragColor"
|
||||||
|
Name 56 "u"
|
||||||
|
Name 59 "blend"
|
||||||
|
Decorate 22(texSampler1D) DescriptorSet 0
|
||||||
|
Decorate 37(texSampler2D) DescriptorSet 0
|
||||||
|
Decorate 53(gl_FragColor) Location 0
|
||||||
|
3: TypeVoid
|
||||||
|
4: TypeFunction 3
|
||||||
|
7: TypeFloat 32
|
||||||
|
8: TypePointer Function 7(float)
|
||||||
|
10: 7(float) Constant 1071971828
|
||||||
|
12: 7(float) Constant 1073741824
|
||||||
|
14: TypeVector 7(float) 4
|
||||||
|
15: TypePointer Function 14(fvec4)
|
||||||
|
17: 7(float) Constant 0
|
||||||
|
18: 14(fvec4) ConstantComposite 17 17 17 17
|
||||||
|
19: TypeImage 7(float) 1D sampled format:Unknown
|
||||||
|
20: TypeSampledImage 19
|
||||||
|
21: TypePointer UniformConstant 20
|
||||||
|
22(texSampler1D): 21(ptr) Variable UniformConstant
|
||||||
|
34: TypeImage 7(float) 2D sampled format:Unknown
|
||||||
|
35: TypeSampledImage 34
|
||||||
|
36: TypePointer UniformConstant 35
|
||||||
|
37(texSampler2D): 36(ptr) Variable UniformConstant
|
||||||
|
39: TypeVector 7(float) 2
|
||||||
|
40: TypePointer Input 39(fvec2)
|
||||||
|
41(coords2D): 40(ptr) Variable Input
|
||||||
|
52: TypePointer Output 14(fvec4)
|
||||||
|
53(gl_FragColor): 52(ptr) Variable Output
|
||||||
|
55: TypePointer Input 14(fvec4)
|
||||||
|
56(u): 55(ptr) Variable Input
|
||||||
|
58: TypePointer Input 7(float)
|
||||||
|
59(blend): 58(ptr) Variable Input
|
||||||
|
5(main): 3 Function None 4
|
||||||
|
6: Label
|
||||||
|
9(blendscale): 8(ptr) Variable Function
|
||||||
|
11(bias): 8(ptr) Variable Function
|
||||||
|
13(coords1D): 8(ptr) Variable Function
|
||||||
|
16(color): 15(ptr) Variable Function
|
||||||
|
Line 1 13 0
|
||||||
|
Store 9(blendscale) 10
|
||||||
|
Line 1 14 0
|
||||||
|
Store 11(bias) 12
|
||||||
|
Line 1 15 0
|
||||||
|
Store 13(coords1D) 10
|
||||||
|
Line 1 16 0
|
||||||
|
Store 16(color) 18
|
||||||
|
Line 1 54 0
|
||||||
|
23: 20 Load 22(texSampler1D)
|
||||||
|
24: 7(float) Load 13(coords1D)
|
||||||
|
25: 14(fvec4) ImageSampleImplicitLod 23 24
|
||||||
|
26: 14(fvec4) Load 16(color)
|
||||||
|
27: 14(fvec4) FAdd 26 25
|
||||||
|
Store 16(color) 27
|
||||||
|
Line 1 55 0
|
||||||
|
28: 20 Load 22(texSampler1D)
|
||||||
|
29: 7(float) Load 13(coords1D)
|
||||||
|
30: 7(float) Load 11(bias)
|
||||||
|
31: 14(fvec4) ImageSampleImplicitLod 28 29 Bias 30
|
||||||
|
32: 14(fvec4) Load 16(color)
|
||||||
|
33: 14(fvec4) FAdd 32 31
|
||||||
|
Store 16(color) 33
|
||||||
|
Line 1 103 0
|
||||||
|
38: 35 Load 37(texSampler2D)
|
||||||
|
42: 39(fvec2) Load 41(coords2D)
|
||||||
|
43: 14(fvec4) ImageSampleImplicitLod 38 42
|
||||||
|
44: 14(fvec4) Load 16(color)
|
||||||
|
45: 14(fvec4) FAdd 44 43
|
||||||
|
Store 16(color) 45
|
||||||
|
Line 1 104 0
|
||||||
|
46: 35 Load 37(texSampler2D)
|
||||||
|
47: 39(fvec2) Load 41(coords2D)
|
||||||
|
48: 7(float) Load 11(bias)
|
||||||
|
49: 14(fvec4) ImageSampleImplicitLod 46 47 Bias 48
|
||||||
|
50: 14(fvec4) Load 16(color)
|
||||||
|
51: 14(fvec4) FAdd 50 49
|
||||||
|
Store 16(color) 51
|
||||||
|
Line 1 106 0
|
||||||
|
54: 14(fvec4) Load 16(color)
|
||||||
|
57: 14(fvec4) Load 56(u)
|
||||||
|
60: 7(float) Load 59(blend)
|
||||||
|
61: 7(float) Load 9(blendscale)
|
||||||
|
62: 7(float) FMul 60 61
|
||||||
|
63: 14(fvec4) CompositeConstruct 62 62 62 62
|
||||||
|
64: 14(fvec4) ExtInst 2(GLSL.std.450) 46(FMix) 54 57 63
|
||||||
|
Store 53(gl_FragColor) 64
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
40
Test/hlsl.pp.line2.frag
Normal file
40
Test/hlsl.pp.line2.frag
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#line 1 "foo.frag"
|
||||||
|
Texture2D g_tColor[ 128 ] ;
|
||||||
|
|
||||||
|
layout (push_constant) cbuffer PerViewConstantBuffer_t
|
||||||
|
{
|
||||||
|
uint g_nDataIdx;
|
||||||
|
uint g_nDataIdx2;
|
||||||
|
bool g_B;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
SamplerState g_sAniso;
|
||||||
|
|
||||||
|
struct PS_INPUT
|
||||||
|
{
|
||||||
|
float2 vTextureCoords : TEXCOORD2 ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
struct PS_OUTPUT
|
||||||
|
{
|
||||||
|
float4 vColor : SV_Target0 ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
PS_OUTPUT MainPs ( PS_INPUT i )
|
||||||
|
{
|
||||||
|
PS_OUTPUT ps_output ;
|
||||||
|
|
||||||
|
uint u;
|
||||||
|
#line 47
|
||||||
|
if (g_B)
|
||||||
|
#line 3 "foo.h"
|
||||||
|
u = g_nDataIdx;
|
||||||
|
else
|
||||||
|
#line 67
|
||||||
|
u = g_nDataIdx2;
|
||||||
|
#line 7 "foo2.h"
|
||||||
|
ps_output . vColor = g_tColor [ u ] . Sample ( g_sAniso , i . vTextureCoords . xy );
|
||||||
|
#line 105
|
||||||
|
return ps_output ;
|
||||||
|
}
|
||||||
|
|
34
Test/hlsl.pp.line3.frag
Normal file
34
Test/hlsl.pp.line3.frag
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
Texture2D g_tColor[ 128 ] ;
|
||||||
|
|
||||||
|
layout (push_constant) cbuffer PerViewConstantBuffer_t
|
||||||
|
{
|
||||||
|
uint g_nDataIdx;
|
||||||
|
uint g_nDataIdx2;
|
||||||
|
bool g_B;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
SamplerState g_sAniso;
|
||||||
|
|
||||||
|
struct PS_INPUT
|
||||||
|
{
|
||||||
|
float2 vTextureCoords : TEXCOORD2 ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
struct PS_OUTPUT
|
||||||
|
{
|
||||||
|
float4 vColor : SV_Target0 ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
PS_OUTPUT MainPs ( PS_INPUT i )
|
||||||
|
{
|
||||||
|
PS_OUTPUT ps_output ;
|
||||||
|
|
||||||
|
uint u;
|
||||||
|
if (g_B)
|
||||||
|
#include "i1.h"
|
||||||
|
else
|
||||||
|
u = g_nDataIdx2;
|
||||||
|
ps_output . vColor = g_tColor [ u ] . Sample ( g_sAniso , i . vTextureCoords . xy );
|
||||||
|
return ps_output ;
|
||||||
|
}
|
||||||
|
|
@ -152,6 +152,8 @@ $EXE -l -i include.vert > $TARGETDIR/include.vert.out
|
|||||||
diff -b $BASEDIR/include.vert.out $TARGETDIR/include.vert.out || HASERROR=1
|
diff -b $BASEDIR/include.vert.out $TARGETDIR/include.vert.out || HASERROR=1
|
||||||
$EXE -D -Od -e main -H -Od -Iinc1/path1 -Iinc1/path2 hlsl.dashI.vert > $TARGETDIR/hlsl.dashI.vert.out
|
$EXE -D -Od -e main -H -Od -Iinc1/path1 -Iinc1/path2 hlsl.dashI.vert > $TARGETDIR/hlsl.dashI.vert.out
|
||||||
diff -b $BASEDIR/hlsl.dashI.vert.out $TARGETDIR/hlsl.dashI.vert.out || HASERROR=1
|
diff -b $BASEDIR/hlsl.dashI.vert.out $TARGETDIR/hlsl.dashI.vert.out || HASERROR=1
|
||||||
|
$EXE -D -Od -e MainPs -H -Od -g hlsl.pp.line3.frag > $TARGETDIR/hlsl.pp.line3.frag.out
|
||||||
|
diff -b $BASEDIR/hlsl.pp.line3.frag.out $TARGETDIR/hlsl.pp.line3.frag.out || HASERROR=1
|
||||||
|
|
||||||
#
|
#
|
||||||
# Testing -D and -U
|
# Testing -D and -U
|
||||||
|
25
Test/spv.pp.line.frag
Normal file
25
Test/spv.pp.line.frag
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#version 140
|
||||||
|
|
||||||
|
uniform sampler1D texSampler1D;
|
||||||
|
uniform sampler2D texSampler2D;
|
||||||
|
|
||||||
|
varying float blend;
|
||||||
|
varying vec4 u;
|
||||||
|
|
||||||
|
in vec2 coords2D;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
float blendscale = 1.789;
|
||||||
|
float bias = 2.0;
|
||||||
|
float coords1D = 1.789;
|
||||||
|
vec4 color = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
#line 53
|
||||||
|
color += texture (texSampler1D, coords1D);
|
||||||
|
color += texture (texSampler1D, coords1D, bias);
|
||||||
|
#line 102
|
||||||
|
color += texture (texSampler2D, coords2D);
|
||||||
|
color += texture (texSampler2D, coords2D, bias);
|
||||||
|
|
||||||
|
gl_FragColor = mix(color, u, blend * blendscale);
|
||||||
|
}
|
@ -229,16 +229,28 @@ inline const TString String(const int i, const int /*base*/ = 10)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct TSourceLoc {
|
struct TSourceLoc {
|
||||||
void init() { name = nullptr; string = 0; line = 0; column = 0; }
|
void init()
|
||||||
|
{
|
||||||
|
name = nullptr; string = 0; line = 0; column = 0;
|
||||||
|
}
|
||||||
void init(int stringNum) { init(); string = stringNum; }
|
void init(int stringNum) { init(); string = stringNum; }
|
||||||
// Returns the name if it exists. Otherwise, returns the string number.
|
// Returns the name if it exists. Otherwise, returns the string number.
|
||||||
std::string getStringNameOrNum(bool quoteStringName = true) const
|
std::string getStringNameOrNum(bool quoteStringName = true) const
|
||||||
{
|
{
|
||||||
if (name != nullptr)
|
if (name != nullptr) {
|
||||||
return quoteStringName ? ("\"" + std::string(name) + "\"") : name;
|
TString qstr = quoteStringName ? ("\"" + *name + "\"") : *name;
|
||||||
|
std::string ret_str(qstr.c_str());
|
||||||
|
return ret_str;
|
||||||
|
}
|
||||||
return std::to_string((long long)string);
|
return std::to_string((long long)string);
|
||||||
}
|
}
|
||||||
const char* name; // descriptive name for this string
|
const char* getFilename() const
|
||||||
|
{
|
||||||
|
if (name == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
return name->c_str();
|
||||||
|
}
|
||||||
|
TString* name; // descriptive name for this string
|
||||||
int string;
|
int string;
|
||||||
int line;
|
int line;
|
||||||
int column;
|
int column;
|
||||||
|
@ -65,7 +65,7 @@ public:
|
|||||||
}
|
}
|
||||||
if (names != nullptr) {
|
if (names != nullptr) {
|
||||||
for (int i = 0; i < numSources; ++i)
|
for (int i = 0; i < numSources; ++i)
|
||||||
loc[i].name = names[i];
|
loc[i].name = names[i] != nullptr ? NewPoolTString(names[i]) : nullptr;
|
||||||
}
|
}
|
||||||
loc[currentSource].line = 1;
|
loc[currentSource].line = 1;
|
||||||
logicalSourceLoc.init(1);
|
logicalSourceLoc.init(1);
|
||||||
@ -170,16 +170,18 @@ public:
|
|||||||
// for #line override in filename based parsing
|
// for #line override in filename based parsing
|
||||||
void setFile(const char* filename)
|
void setFile(const char* filename)
|
||||||
{
|
{
|
||||||
logicalSourceLoc.name = filename;
|
TString* fn_tstr = NewPoolTString(filename);
|
||||||
loc[getLastValidSourceIndex()].name = filename;
|
logicalSourceLoc.name = fn_tstr;
|
||||||
|
loc[getLastValidSourceIndex()].name = fn_tstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setFile(const char* filename, int i)
|
void setFile(const char* filename, int i)
|
||||||
{
|
{
|
||||||
|
TString* fn_tstr = NewPoolTString(filename);
|
||||||
if (i == getLastValidSourceIndex()) {
|
if (i == getLastValidSourceIndex()) {
|
||||||
logicalSourceLoc.name = filename;
|
logicalSourceLoc.name = fn_tstr;
|
||||||
}
|
}
|
||||||
loc[i].name = filename;
|
loc[i].name = fn_tstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setString(int newString)
|
void setString(int newString)
|
||||||
|
@ -533,7 +533,7 @@ protected:
|
|||||||
prologue_(prologue),
|
prologue_(prologue),
|
||||||
epilogue_(epilogue),
|
epilogue_(epilogue),
|
||||||
includedFile_(includedFile),
|
includedFile_(includedFile),
|
||||||
scanner(3, strings, lengths, names, 0, 0, true),
|
scanner(3, strings, lengths, nullptr, 0, 0, true),
|
||||||
prevScanner(nullptr),
|
prevScanner(nullptr),
|
||||||
stringInput(pp, scanner)
|
stringInput(pp, scanner)
|
||||||
{
|
{
|
||||||
@ -548,9 +548,9 @@ protected:
|
|||||||
scanner.setLine(startLoc.line);
|
scanner.setLine(startLoc.line);
|
||||||
scanner.setString(startLoc.string);
|
scanner.setString(startLoc.string);
|
||||||
|
|
||||||
scanner.setFile(startLoc.name, 0);
|
scanner.setFile(startLoc.name->c_str(), 0);
|
||||||
scanner.setFile(startLoc.name, 1);
|
scanner.setFile(startLoc.name->c_str(), 1);
|
||||||
scanner.setFile(startLoc.name, 2);
|
scanner.setFile(startLoc.name->c_str(), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// tInput methods:
|
// tInput methods:
|
||||||
@ -590,8 +590,6 @@ protected:
|
|||||||
const char* strings[3];
|
const char* strings[3];
|
||||||
// Length of str_, passed to scanner constructor.
|
// Length of str_, passed to scanner constructor.
|
||||||
size_t lengths[3];
|
size_t lengths[3];
|
||||||
// String names
|
|
||||||
const char* names[3];
|
|
||||||
// Scans over str_.
|
// Scans over str_.
|
||||||
TInputScanner scanner;
|
TInputScanner scanner;
|
||||||
// The previous effective scanner before the scanner in this instance
|
// The previous effective scanner before the scanner in this instance
|
||||||
|
@ -61,6 +61,7 @@ using HlslCompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointP
|
|||||||
using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
using HlslLegalizeTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
using HlslLegalizeTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
|
using HlslDebugTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
|
|
||||||
// Compiling HLSL to pre-legalized SPIR-V under Vulkan semantics. Expected
|
// Compiling HLSL to pre-legalized SPIR-V under Vulkan semantics. Expected
|
||||||
// to successfully generate both AST and SPIR-V.
|
// to successfully generate both AST and SPIR-V.
|
||||||
@ -95,6 +96,16 @@ TEST_P(HlslLegalizeTest, FromFile)
|
|||||||
"/baseLegalResults/", true);
|
"/baseLegalResults/", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compiling HLSL to pre-legalized SPIR-V. Expected to successfully generate
|
||||||
|
// SPIR-V with debug instructions, particularly line info.
|
||||||
|
TEST_P(HlslDebugTest, FromFile)
|
||||||
|
{
|
||||||
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
||||||
|
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
||||||
|
Target::Spv, true, GetParam().entryPoint,
|
||||||
|
"/baseResults/", false, true);
|
||||||
|
}
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
INSTANTIATE_TEST_CASE_P(
|
INSTANTIATE_TEST_CASE_P(
|
||||||
ToSpirv, HlslCompileTest,
|
ToSpirv, HlslCompileTest,
|
||||||
@ -437,5 +448,15 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
// clang-format on
|
// clang-format on
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
INSTANTIATE_TEST_CASE_P(
|
||||||
|
ToSpirv, HlslDebugTest,
|
||||||
|
::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
|
||||||
|
{"hlsl.pp.line2.frag", "MainPs"}
|
||||||
|
}),
|
||||||
|
FileNameAsCustomTestSuffix
|
||||||
|
);
|
||||||
|
|
||||||
|
// clang-format on
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
} // namespace glslangtest
|
} // namespace glslangtest
|
||||||
|
@ -63,6 +63,7 @@ std::string FileNameAsCustomTestSuffixIoMap(
|
|||||||
}
|
}
|
||||||
|
|
||||||
using CompileVulkanToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileVulkanToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
|
using CompileVulkanToDebugSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using VulkanSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
using VulkanSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
@ -87,6 +88,17 @@ TEST_P(CompileVulkanToSpirvTest, FromFile)
|
|||||||
Target::Spv);
|
Target::Spv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compiling GLSL to SPIR-V with debug info under Vulkan semantics. Expected
|
||||||
|
// to successfully generate SPIR-V.
|
||||||
|
TEST_P(CompileVulkanToDebugSpirvTest, FromFile)
|
||||||
|
{
|
||||||
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
|
Source::GLSL, Semantics::Vulkan,
|
||||||
|
glslang::EShTargetVulkan_1_0,
|
||||||
|
Target::Spv, true, "",
|
||||||
|
"/baseResults/", false, true);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_P(CompileVulkan1_1ToSpirvTest, FromFile)
|
TEST_P(CompileVulkan1_1ToSpirvTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
@ -369,6 +381,15 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
INSTANTIATE_TEST_CASE_P(
|
||||||
|
Glsl, CompileVulkanToDebugSpirvTest,
|
||||||
|
::testing::ValuesIn(std::vector<std::string>({
|
||||||
|
"spv.pp.line.frag",
|
||||||
|
})),
|
||||||
|
FileNameAsCustomTestSuffix
|
||||||
|
);
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
INSTANTIATE_TEST_CASE_P(
|
INSTANTIATE_TEST_CASE_P(
|
||||||
Glsl, CompileVulkan1_1ToSpirvTest,
|
Glsl, CompileVulkan1_1ToSpirvTest,
|
||||||
|
@ -184,12 +184,19 @@ public:
|
|||||||
// and modifies |shader| on success.
|
// and modifies |shader| on success.
|
||||||
bool compile(glslang::TShader* shader, const std::string& code,
|
bool compile(glslang::TShader* shader, const std::string& code,
|
||||||
const std::string& entryPointName, EShMessages controls,
|
const std::string& entryPointName, EShMessages controls,
|
||||||
const TBuiltInResource* resources=nullptr)
|
const TBuiltInResource* resources=nullptr,
|
||||||
|
const std::string* shaderName=nullptr)
|
||||||
{
|
{
|
||||||
const char* shaderStrings = code.data();
|
const char* shaderStrings = code.data();
|
||||||
const int shaderLengths = static_cast<int>(code.size());
|
const int shaderLengths = static_cast<int>(code.size());
|
||||||
|
const char* shaderNames = nullptr;
|
||||||
|
|
||||||
shader->setStringsWithLengths(&shaderStrings, &shaderLengths, 1);
|
if ((controls & EShMsgDebugInfo) && shaderName != nullptr) {
|
||||||
|
shaderNames = shaderName->data();
|
||||||
|
shader->setStringsWithLengthsAndNames(
|
||||||
|
&shaderStrings, &shaderLengths, &shaderNames, 1);
|
||||||
|
} else
|
||||||
|
shader->setStringsWithLengths(&shaderStrings, &shaderLengths, 1);
|
||||||
if (!entryPointName.empty()) shader->setEntryPoint(entryPointName.c_str());
|
if (!entryPointName.empty()) shader->setEntryPoint(entryPointName.c_str());
|
||||||
return shader->parse(
|
return shader->parse(
|
||||||
(resources ? resources : &glslang::DefaultTBuiltInResource),
|
(resources ? resources : &glslang::DefaultTBuiltInResource),
|
||||||
@ -202,12 +209,13 @@ public:
|
|||||||
// during the process. If the target includes SPIR-V, also disassembles
|
// during the process. If the target includes SPIR-V, also disassembles
|
||||||
// the result and returns disassembly text.
|
// the result and returns disassembly text.
|
||||||
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,
|
||||||
glslang::EShTargetClientVersion clientTargetVersion,
|
glslang::EShTargetClientVersion clientTargetVersion,
|
||||||
bool flattenUniformArrays = false,
|
bool flattenUniformArrays = false,
|
||||||
EShTextureSamplerTransformMode texSampTransMode = EShTexSampTransKeep,
|
EShTextureSamplerTransformMode texSampTransMode = EShTexSampTransKeep,
|
||||||
bool enableOptimizer = false,
|
bool enableOptimizer = false,
|
||||||
|
bool enableDebug = false,
|
||||||
bool automap = true)
|
bool automap = true)
|
||||||
{
|
{
|
||||||
const EShLanguage stage = GetShaderStage(GetSuffix(shaderName));
|
const EShLanguage stage = GetShaderStage(GetSuffix(shaderName));
|
||||||
@ -238,7 +246,8 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool success = compile(&shader, code, entryPointName, controls);
|
bool success = compile(
|
||||||
|
&shader, code, entryPointName, controls, nullptr, &shaderName);
|
||||||
|
|
||||||
glslang::TProgram program;
|
glslang::TProgram program;
|
||||||
program.addShader(&shader);
|
program.addShader(&shader);
|
||||||
@ -249,6 +258,7 @@ public:
|
|||||||
if (success && (controls & EShMsgSpvRules)) {
|
if (success && (controls & EShMsgSpvRules)) {
|
||||||
std::vector<uint32_t> spirv_binary;
|
std::vector<uint32_t> spirv_binary;
|
||||||
options().disableOptimizer = !enableOptimizer;
|
options().disableOptimizer = !enableOptimizer;
|
||||||
|
options().generateDebugInfo = enableDebug;
|
||||||
glslang::GlslangToSpv(*program.getIntermediate(stage),
|
glslang::GlslangToSpv(*program.getIntermediate(stage),
|
||||||
spirv_binary, &logger, &options());
|
spirv_binary, &logger, &options());
|
||||||
|
|
||||||
@ -423,7 +433,8 @@ public:
|
|||||||
bool automap = true,
|
bool automap = true,
|
||||||
const std::string& entryPointName="",
|
const std::string& entryPointName="",
|
||||||
const std::string& baseDir="/baseResults/",
|
const std::string& baseDir="/baseResults/",
|
||||||
const bool enableOptimizer = false)
|
const bool enableOptimizer = false,
|
||||||
|
const bool enableDebug = false)
|
||||||
{
|
{
|
||||||
const std::string inputFname = testDir + "/" + testName;
|
const std::string inputFname = testDir + "/" + testName;
|
||||||
const std::string expectedOutputFname =
|
const std::string expectedOutputFname =
|
||||||
@ -436,8 +447,10 @@ public:
|
|||||||
EShMessages controls = DeriveOptions(source, semantics, target);
|
EShMessages controls = DeriveOptions(source, semantics, target);
|
||||||
if (enableOptimizer)
|
if (enableOptimizer)
|
||||||
controls = static_cast<EShMessages>(controls & ~EShMsgHlslLegalization);
|
controls = static_cast<EShMessages>(controls & ~EShMsgHlslLegalization);
|
||||||
|
if (enableDebug)
|
||||||
|
controls = static_cast<EShMessages>(controls | EShMsgDebugInfo);
|
||||||
GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion, false,
|
GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion, false,
|
||||||
EShTexSampTransKeep, enableOptimizer, automap);
|
EShTexSampTransKeep, enableOptimizer, enableDebug, automap);
|
||||||
|
|
||||||
// Generate the hybrid output in the way of glslangValidator.
|
// Generate the hybrid output in the way of glslangValidator.
|
||||||
std::ostringstream stream;
|
std::ostringstream stream;
|
||||||
|
@ -133,7 +133,7 @@ bool HlslParseContext::parseShaderStrings(TPpContext& ppContext, TInputScanner&
|
|||||||
// Print a message formated such that if you click on the message it will take you right to
|
// Print a message formated such that if you click on the message it will take you right to
|
||||||
// the line through most UIs.
|
// the line through most UIs.
|
||||||
const glslang::TSourceLoc& sourceLoc = input.getSourceLoc();
|
const glslang::TSourceLoc& sourceLoc = input.getSourceLoc();
|
||||||
infoSink.info << sourceLoc.name << "(" << sourceLoc.line << "): error at column " << sourceLoc.column
|
infoSink.info << sourceLoc.name->c_str() << "(" << sourceLoc.line << "): error at column " << sourceLoc.column
|
||||||
<< ", HLSL parsing failed.\n";
|
<< ", HLSL parsing failed.\n";
|
||||||
++numErrors;
|
++numErrors;
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user