HLSL: Handle swizzles on vectors of size 1. Addresses issue #453.

This commit is contained in:
John Kessenich 2016-09-02 22:21:25 -06:00
parent 841db35bb3
commit 7d01bd6f0b
5 changed files with 34 additions and 9 deletions

View File

@ -101,8 +101,13 @@ gl_FragCoord origin is upper left
0:27 Construct float (temp 1-component vector of float) 0:27 Construct float (temp 1-component vector of float)
0:27 'v' (temp 4-component vector of float) 0:27 'v' (temp 4-component vector of float)
0:27 'f1' (temp 1-component vector of float) 0:27 'f1' (temp 1-component vector of float)
0:29 Branch: Return with expression 0:28 Construct float (temp float)
0:29 'input' (in 4-component vector of float) 0:28 'f1' (temp 1-component vector of float)
0:29 Construct vec3 (temp 3-component vector of float)
0:29 Construct float (temp float)
0:29 'f1' (temp 1-component vector of float)
0:31 Branch: Return with expression
0:31 'input' (in 4-component vector of float)
0:? Linker Objects 0:? Linker Objects
@ -211,13 +216,18 @@ gl_FragCoord origin is upper left
0:27 Construct float (temp 1-component vector of float) 0:27 Construct float (temp 1-component vector of float)
0:27 'v' (temp 4-component vector of float) 0:27 'v' (temp 4-component vector of float)
0:27 'f1' (temp 1-component vector of float) 0:27 'f1' (temp 1-component vector of float)
0:29 Branch: Return with expression 0:28 Construct float (temp float)
0:29 'input' (in 4-component vector of float) 0:28 'f1' (temp 1-component vector of float)
0:29 Construct vec3 (temp 3-component vector of float)
0:29 Construct float (temp float)
0:29 'f1' (temp 1-component vector of float)
0:31 Branch: Return with expression
0:31 'input' (in 4-component vector of float)
0:? Linker Objects 0:? Linker Objects
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 81 // Id's are bound by 84
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
@ -321,6 +331,9 @@ gl_FragCoord origin is upper left
75: 6(float) CompositeExtract 74 0 75: 6(float) CompositeExtract 74 0
76: 6(float) Load 69(f1) 76: 6(float) Load 69(f1)
77: 41(bool) FOrdLessThan 75 76 77: 41(bool) FOrdLessThan 75 76
78: 7(fvec4) Load 11(input) 78: 6(float) Load 69(f1)
ReturnValue 78 79: 6(float) Load 69(f1)
80: 22(fvec3) CompositeConstruct 79 79 79
81: 7(fvec4) Load 11(input)
ReturnValue 81
FunctionEnd FunctionEnd

View File

@ -25,6 +25,8 @@ float4 PixelShaderFunction(float4 input, float f) : COLOR0
f1 == v; f1 == v;
v < f1; v < f1;
f1.x;
f1.xxx;
return input; return input;
} }

View File

@ -2,5 +2,5 @@
// For the version, it uses the latest git tag followed by the number of commits. // For the version, it uses the latest git tag followed by the number of commits.
// For the date, it uses the current date (when then script is run). // For the date, it uses the current date (when then script is run).
#define GLSLANG_REVISION "Overload400-PrecQual.1464" #define GLSLANG_REVISION "Overload400-PrecQual.1465"
#define GLSLANG_DATE "02-Sep-2016" #define GLSLANG_DATE "02-Sep-2016"

View File

@ -274,7 +274,8 @@ TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, TSo
if (newType != EbtVoid) { if (newType != EbtVoid) {
child = addConversion(op, TType(newType, EvqTemporary, child->getVectorSize(), child = addConversion(op, TType(newType, EvqTemporary, child->getVectorSize(),
child->getMatrixCols(), child->getMatrixCols(),
child->getMatrixRows()), child->getMatrixRows(),
child->isVector()),
child); child);
if (child == 0) if (child == 0)
return 0; return 0;

View File

@ -641,6 +641,15 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt
return addConstructor(loc, base, type); return addConstructor(loc, base, type);
} }
} }
if (base->getVectorSize() == 1) {
TType scalarType(base->getBasicType(), EvqTemporary, 1);
if (fields.num == 1)
return addConstructor(loc, base, scalarType);
else {
TType vectorType(base->getBasicType(), EvqTemporary, fields.num);
return addConstructor(loc, addConstructor(loc, base, scalarType), vectorType);
}
}
if (base->getType().getQualifier().isFrontEndConstant()) if (base->getType().getQualifier().isFrontEndConstant())
result = intermediate.foldSwizzle(base, fields, loc); result = intermediate.foldSwizzle(base, fields, loc);