Commit 3226b083 by steve-lunarg

HLSL: Add min*{float,int,uint} types

These HLSL types are guaranteed to have at least the given number of bits, but may have more. min{16,10}float is mapped to EbtFloat at medium precision -> SPIRV RelaxedPrecision min{16,12}int and min16uint are mapped to mediump -> SPIR-V RelaxedPrecision
parent e19e68d4
struct PS_OUTPUT
{
float4 Color : SV_Target0;
};
uniform min16float b1a, b1b;
PS_OUTPUT main()
{
min16float mf16;
min16float1 mf16_1;
min16float2 mf16_2;
min16float3 mf16_3;
min16float4 mf16_4;
min10float mf10;
min10float1 mf10_1;
min10float2 mf10_2;
min10float3 mf10_3;
min10float4 mf12_4;
min16int mi16;
min16int1 mi16_1;
min16int2 mi16_2;
min16int3 mi16_3;
min16int4 mi16_4;
min12int mi12;
min12int1 mi12_1;
min12int2 mi12_2;
min12int3 mi12_3;
min12int4 mi12_4;
min16uint mu16;
min16uint1 mu16_1;
min16uint2 mu16_2;
min16uint3 mu16_3;
min16uint4 mu16_4;
mf16_2 + mf16;
mf10_2 + mf10;
mi16_2 + mi16;
mi12_2 + mi12;
mu16_2 + mu16;
PS_OUTPUT psout;
psout.Color = 0;
return psout;
}
...@@ -146,6 +146,7 @@ INSTANTIATE_TEST_CASE_P( ...@@ -146,6 +146,7 @@ INSTANTIATE_TEST_CASE_P(
{"hlsl.logical.unary.frag", "main"}, {"hlsl.logical.unary.frag", "main"},
{"hlsl.logical.binary.frag", "main"}, {"hlsl.logical.binary.frag", "main"},
{"hlsl.logical.binary.vec.frag", "main"}, {"hlsl.logical.binary.vec.frag", "main"},
{"hlsl.mintypes.frag", "main"},
{"hlsl.multiEntry.vert", "RealEntrypoint"}, {"hlsl.multiEntry.vert", "RealEntrypoint"},
{"hlsl.multiReturn.frag", "main"}, {"hlsl.multiReturn.frag", "main"},
{"hlsl.matrixindex.frag", "main"}, {"hlsl.matrixindex.frag", "main"},
......
...@@ -465,7 +465,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type) ...@@ -465,7 +465,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type)
// whatever comes from acceptQualifier. // whatever comes from acceptQualifier.
assert(qualifier.layoutFormat == ElfNone); assert(qualifier.layoutFormat == ElfNone);
qualifier.layoutFormat = type.getQualifier().layoutFormat; qualifier.layoutFormat = type.getQualifier().layoutFormat;
qualifier.precision = type.getQualifier().precision;
type.getQualifier() = qualifier; type.getQualifier() = qualifier;
} }
...@@ -967,6 +967,14 @@ bool HlslGrammar::acceptTextureType(TType& type) ...@@ -967,6 +967,14 @@ bool HlslGrammar::acceptTextureType(TType& type)
// Otherwise, return false, and don't advance // Otherwise, return false, and don't advance
bool HlslGrammar::acceptType(TType& type) bool HlslGrammar::acceptType(TType& type)
{ {
// Basic types for min* types, broken out here in case of future
// changes, e.g, to use native halfs.
static const TBasicType min16float_bt = EbtFloat;
static const TBasicType min10float_bt = EbtFloat;
static const TBasicType min16int_bt = EbtInt;
static const TBasicType min12int_bt = EbtInt;
static const TBasicType min16uint_bt = EbtUint;
switch (peek()) { switch (peek()) {
case EHTokVector: case EHTokVector:
return acceptVectorTemplateType(type); return acceptVectorTemplateType(type);
...@@ -1118,6 +1126,91 @@ bool HlslGrammar::acceptType(TType& type) ...@@ -1118,6 +1126,91 @@ bool HlslGrammar::acceptType(TType& type)
new(&type) TType(EbtBool, EvqTemporary, 4); new(&type) TType(EbtBool, EvqTemporary, 4);
break; break;
case EHTokMin16float:
new(&type) TType(min16float_bt, EvqTemporary, EpqMedium);
break;
case EHTokMin16float1:
new(&type) TType(min16float_bt, EvqTemporary, EpqMedium);
type.makeVector();
break;
case EHTokMin16float2:
new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 2);
break;
case EHTokMin16float3:
new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 3);
break;
case EHTokMin16float4:
new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 4);
break;
case EHTokMin10float:
new(&type) TType(min10float_bt, EvqTemporary, EpqMedium);
break;
case EHTokMin10float1:
new(&type) TType(min10float_bt, EvqTemporary, EpqMedium);
type.makeVector();
break;
case EHTokMin10float2:
new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 2);
break;
case EHTokMin10float3:
new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 3);
break;
case EHTokMin10float4:
new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 4);
break;
case EHTokMin16int:
new(&type) TType(min16int_bt, EvqTemporary, EpqMedium);
break;
case EHTokMin16int1:
new(&type) TType(min16int_bt, EvqTemporary, EpqMedium);
type.makeVector();
break;
case EHTokMin16int2:
new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 2);
break;
case EHTokMin16int3:
new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 3);
break;
case EHTokMin16int4:
new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 4);
break;
case EHTokMin12int:
new(&type) TType(min12int_bt, EvqTemporary, EpqMedium);
break;
case EHTokMin12int1:
new(&type) TType(min12int_bt, EvqTemporary, EpqMedium);
type.makeVector();
break;
case EHTokMin12int2:
new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 2);
break;
case EHTokMin12int3:
new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 3);
break;
case EHTokMin12int4:
new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 4);
break;
case EHTokMin16uint:
new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium);
break;
case EHTokMin16uint1:
new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium);
type.makeVector();
break;
case EHTokMin16uint2:
new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 2);
break;
case EHTokMin16uint3:
new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 3);
break;
case EHTokMin16uint4:
new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 4);
break;
case EHTokInt1x1: case EHTokInt1x1:
new(&type) TType(EbtInt, EvqTemporary, 0, 1, 1); new(&type) TType(EbtInt, EvqTemporary, 0, 1, 1);
break; break;
......
...@@ -136,7 +136,7 @@ void HlslScanContext::fillInKeywordMap() ...@@ -136,7 +136,7 @@ void HlslScanContext::fillInKeywordMap()
(*KeywordMap)["min10float"] = EHTokMin10float; (*KeywordMap)["min10float"] = EHTokMin10float;
(*KeywordMap)["min16int"] = EHTokMin16int; (*KeywordMap)["min16int"] = EHTokMin16int;
(*KeywordMap)["min12int"] = EHTokMin12int; (*KeywordMap)["min12int"] = EHTokMin12int;
(*KeywordMap)["min16uint"] = EHTokMin16int; (*KeywordMap)["min16uint"] = EHTokMin16uint;
(*KeywordMap)["bool1"] = EHTokBool1; (*KeywordMap)["bool1"] = EHTokBool1;
(*KeywordMap)["bool2"] = EHTokBool2; (*KeywordMap)["bool2"] = EHTokBool2;
...@@ -159,6 +159,27 @@ void HlslScanContext::fillInKeywordMap() ...@@ -159,6 +159,27 @@ void HlslScanContext::fillInKeywordMap()
(*KeywordMap)["uint3"] = EHTokUint3; (*KeywordMap)["uint3"] = EHTokUint3;
(*KeywordMap)["uint4"] = EHTokUint4; (*KeywordMap)["uint4"] = EHTokUint4;
(*KeywordMap)["min16float1"] = EHTokMin16float1;
(*KeywordMap)["min16float2"] = EHTokMin16float2;
(*KeywordMap)["min16float3"] = EHTokMin16float3;
(*KeywordMap)["min16float4"] = EHTokMin16float4;
(*KeywordMap)["min10float1"] = EHTokMin10float1;
(*KeywordMap)["min10float2"] = EHTokMin10float2;
(*KeywordMap)["min10float3"] = EHTokMin10float3;
(*KeywordMap)["min10float4"] = EHTokMin10float4;
(*KeywordMap)["min16int1"] = EHTokMin16int1;
(*KeywordMap)["min16int2"] = EHTokMin16int2;
(*KeywordMap)["min16int3"] = EHTokMin16int3;
(*KeywordMap)["min16int4"] = EHTokMin16int4;
(*KeywordMap)["min12int1"] = EHTokMin12int1;
(*KeywordMap)["min12int2"] = EHTokMin12int2;
(*KeywordMap)["min12int3"] = EHTokMin12int3;
(*KeywordMap)["min12int4"] = EHTokMin12int4;
(*KeywordMap)["min16uint1"] = EHTokMin16uint1;
(*KeywordMap)["min16uint2"] = EHTokMin16uint2;
(*KeywordMap)["min16uint3"] = EHTokMin16uint3;
(*KeywordMap)["min16uint4"] = EHTokMin16uint4;
(*KeywordMap)["int1x1"] = EHTokInt1x1; (*KeywordMap)["int1x1"] = EHTokInt1x1;
(*KeywordMap)["int1x2"] = EHTokInt1x2; (*KeywordMap)["int1x2"] = EHTokInt1x2;
(*KeywordMap)["int1x3"] = EHTokInt1x3; (*KeywordMap)["int1x3"] = EHTokInt1x3;
...@@ -518,6 +539,26 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier() ...@@ -518,6 +539,26 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier()
case EHTokUint2: case EHTokUint2:
case EHTokUint3: case EHTokUint3:
case EHTokUint4: case EHTokUint4:
case EHTokMin16float1:
case EHTokMin16float2:
case EHTokMin16float3:
case EHTokMin16float4:
case EHTokMin10float1:
case EHTokMin10float2:
case EHTokMin10float3:
case EHTokMin10float4:
case EHTokMin16int1:
case EHTokMin16int2:
case EHTokMin16int3:
case EHTokMin16int4:
case EHTokMin12int1:
case EHTokMin12int2:
case EHTokMin12int3:
case EHTokMin12int4:
case EHTokMin16uint1:
case EHTokMin16uint2:
case EHTokMin16uint3:
case EHTokMin16uint4:
// matrix types // matrix types
case EHTokInt1x1: case EHTokInt1x1:
......
...@@ -108,6 +108,26 @@ enum EHlslTokenClass { ...@@ -108,6 +108,26 @@ enum EHlslTokenClass {
EHTokUint2, EHTokUint2,
EHTokUint3, EHTokUint3,
EHTokUint4, EHTokUint4,
EHTokMin16float1,
EHTokMin16float2,
EHTokMin16float3,
EHTokMin16float4,
EHTokMin10float1,
EHTokMin10float2,
EHTokMin10float3,
EHTokMin10float4,
EHTokMin16int1,
EHTokMin16int2,
EHTokMin16int3,
EHTokMin16int4,
EHTokMin12int1,
EHTokMin12int2,
EHTokMin12int3,
EHTokMin12int4,
EHTokMin16uint1,
EHTokMin16uint2,
EHTokMin16uint3,
EHTokMin16uint4,
// matrix types // matrix types
EHTokInt1x1, EHTokInt1x1,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment