mirror of
https://github.com/RPCS3/glslang.git
synced 2025-01-26 05:04:27 +00:00
Merge pull request #756 from steve-lunarg/getdimensions-fix
HLSL: use LOD form of ImageQuerySize when needed.
This commit is contained in:
commit
b7201f8ee6
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,8 @@ Shader version: 450
|
||||
0:21 'sizeQueryTemp' (temp uint)
|
||||
0:21 textureSize (temp uint)
|
||||
0:21 'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
|
||||
0:21 Constant:
|
||||
0:21 0 (const int)
|
||||
0:21 move second child to first child (temp uint)
|
||||
0:21 'WidthU' (temp uint)
|
||||
0:21 'sizeQueryTemp' (temp uint)
|
||||
@ -66,6 +68,8 @@ Shader version: 450
|
||||
0:21 'sizeQueryTemp' (temp uint)
|
||||
0:21 textureSize (temp uint)
|
||||
0:21 'g_tTex1df4' (layout(binding=0 ) uniform texture1D)
|
||||
0:21 Constant:
|
||||
0:21 0 (const int)
|
||||
0:21 move second child to first child (temp uint)
|
||||
0:21 'WidthU' (temp uint)
|
||||
0:21 'sizeQueryTemp' (temp uint)
|
||||
@ -125,10 +129,10 @@ Shader version: 450
|
||||
Name 10 "@main("
|
||||
Name 14 "sizeQueryTemp"
|
||||
Name 17 "g_tTex1df4"
|
||||
Name 21 "WidthU"
|
||||
Name 23 "sizeQueryTemp"
|
||||
Name 28 "NumberOfLevelsU"
|
||||
Name 32 "vsout"
|
||||
Name 22 "WidthU"
|
||||
Name 24 "sizeQueryTemp"
|
||||
Name 29 "NumberOfLevelsU"
|
||||
Name 33 "vsout"
|
||||
Name 42 "@entryPointOutput_Pos"
|
||||
Name 47 "g_sSamp"
|
||||
Decorate 17(g_tTex1df4) DescriptorSet 0
|
||||
@ -148,9 +152,9 @@ Shader version: 450
|
||||
16: TypePointer UniformConstant 15
|
||||
17(g_tTex1df4): 16(ptr) Variable UniformConstant
|
||||
19: TypeInt 32 1
|
||||
25: 12(int) Constant 6
|
||||
31: TypePointer Function 8(VS_OUTPUT)
|
||||
33: 19(int) Constant 0
|
||||
20: 19(int) Constant 0
|
||||
26: 12(int) Constant 6
|
||||
32: TypePointer Function 8(VS_OUTPUT)
|
||||
34: 6(float) Constant 0
|
||||
35: 7(fvec4) ConstantComposite 34 34 34 34
|
||||
36: TypePointer Function 7(fvec4)
|
||||
@ -169,25 +173,25 @@ Shader version: 450
|
||||
10(@main():8(VS_OUTPUT) Function None 9
|
||||
11: Label
|
||||
14(sizeQueryTemp): 13(ptr) Variable Function
|
||||
21(WidthU): 13(ptr) Variable Function
|
||||
23(sizeQueryTemp): 13(ptr) Variable Function
|
||||
28(NumberOfLevelsU): 13(ptr) Variable Function
|
||||
32(vsout): 31(ptr) Variable Function
|
||||
22(WidthU): 13(ptr) Variable Function
|
||||
24(sizeQueryTemp): 13(ptr) Variable Function
|
||||
29(NumberOfLevelsU): 13(ptr) Variable Function
|
||||
33(vsout): 32(ptr) Variable Function
|
||||
18: 15 Load 17(g_tTex1df4)
|
||||
20: 19(int) ImageQuerySize 18
|
||||
Store 14(sizeQueryTemp) 20
|
||||
22: 12(int) Load 14(sizeQueryTemp)
|
||||
Store 21(WidthU) 22
|
||||
24: 15 Load 17(g_tTex1df4)
|
||||
26: 19(int) ImageQuerySizeLod 24 25
|
||||
Store 23(sizeQueryTemp) 26
|
||||
27: 12(int) Load 23(sizeQueryTemp)
|
||||
Store 21(WidthU) 27
|
||||
29: 15 Load 17(g_tTex1df4)
|
||||
30: 19(int) ImageQueryLevels 29
|
||||
Store 28(NumberOfLevelsU) 30
|
||||
37: 36(ptr) AccessChain 32(vsout) 33
|
||||
21: 19(int) ImageQuerySizeLod 18 20
|
||||
Store 14(sizeQueryTemp) 21
|
||||
23: 12(int) Load 14(sizeQueryTemp)
|
||||
Store 22(WidthU) 23
|
||||
25: 15 Load 17(g_tTex1df4)
|
||||
27: 19(int) ImageQuerySizeLod 25 26
|
||||
Store 24(sizeQueryTemp) 27
|
||||
28: 12(int) Load 24(sizeQueryTemp)
|
||||
Store 22(WidthU) 28
|
||||
30: 15 Load 17(g_tTex1df4)
|
||||
31: 19(int) ImageQueryLevels 30
|
||||
Store 29(NumberOfLevelsU) 31
|
||||
37: 36(ptr) AccessChain 33(vsout) 20
|
||||
Store 37 35
|
||||
38:8(VS_OUTPUT) Load 32(vsout)
|
||||
38:8(VS_OUTPUT) Load 33(vsout)
|
||||
ReturnValue 38
|
||||
FunctionEnd
|
||||
|
@ -364,6 +364,8 @@ gl_FragCoord origin is upper left
|
||||
0:70 'sizeQueryTemp' (temp uint)
|
||||
0:70 textureSize (temp uint)
|
||||
0:70 'g_tTex1df4' (uniform texture1D)
|
||||
0:70 Constant:
|
||||
0:70 0 (const int)
|
||||
0:70 move second child to first child (temp int)
|
||||
0:70 'WidthI' (temp int)
|
||||
0:70 Convert uint to int (temp int)
|
||||
@ -808,6 +810,8 @@ gl_FragCoord origin is upper left
|
||||
0:70 'sizeQueryTemp' (temp uint)
|
||||
0:70 textureSize (temp uint)
|
||||
0:70 'g_tTex1df4' (uniform texture1D)
|
||||
0:70 Constant:
|
||||
0:70 0 (const int)
|
||||
0:70 move second child to first child (temp int)
|
||||
0:70 'WidthI' (temp int)
|
||||
0:70 Convert uint to int (temp int)
|
||||
@ -1284,7 +1288,7 @@ gl_FragCoord origin is upper left
|
||||
276: 6(float) CompositeExtract 275 0
|
||||
Store 268(r51) 276
|
||||
281: 278 Load 280(g_tTex1df4)
|
||||
282: 14(int) ImageQuerySize 281
|
||||
282: 14(int) ImageQuerySizeLod 281 53
|
||||
Store 277(sizeQueryTemp) 282
|
||||
284: 15(int) Load 277(sizeQueryTemp)
|
||||
285: 14(int) Bitcast 284
|
||||
|
@ -19,6 +19,8 @@ gl_FragCoord origin is upper left
|
||||
0:40 'sizeQueryTemp' (temp uint)
|
||||
0:40 textureSize (temp uint)
|
||||
0:40 'g_tTex1df4' (uniform texture1D)
|
||||
0:40 Constant:
|
||||
0:40 0 (const int)
|
||||
0:40 move second child to first child (temp int)
|
||||
0:40 'WidthI' (temp int)
|
||||
0:40 Convert uint to int (temp int)
|
||||
@ -121,6 +123,8 @@ gl_FragCoord origin is upper left
|
||||
0:40 'sizeQueryTemp' (temp uint)
|
||||
0:40 textureSize (temp uint)
|
||||
0:40 'g_tTex1df4' (uniform texture1D)
|
||||
0:40 Constant:
|
||||
0:40 0 (const int)
|
||||
0:40 move second child to first child (temp int)
|
||||
0:40 'WidthI' (temp int)
|
||||
0:40 Convert uint to int (temp int)
|
||||
@ -229,14 +233,14 @@ gl_FragCoord origin is upper left
|
||||
Name 19 ""
|
||||
Name 28 "sizeQueryTemp"
|
||||
Name 31 "g_tTex1df4"
|
||||
Name 35 "WidthI"
|
||||
Name 38 "sizeQueryTemp"
|
||||
Name 44 "NumberOfLevelsU"
|
||||
Name 47 "sizeQueryTemp"
|
||||
Name 50 "WidthU"
|
||||
Name 52 "NumberOfLevelsI"
|
||||
Name 56 "sizeQueryTemp"
|
||||
Name 65 "ps_output"
|
||||
Name 36 "WidthI"
|
||||
Name 39 "sizeQueryTemp"
|
||||
Name 45 "NumberOfLevelsU"
|
||||
Name 48 "sizeQueryTemp"
|
||||
Name 51 "WidthU"
|
||||
Name 53 "NumberOfLevelsI"
|
||||
Name 57 "sizeQueryTemp"
|
||||
Name 66 "ps_output"
|
||||
Name 74 "color"
|
||||
Name 80 "g_tTexbfs"
|
||||
MemberDecorate 17($Global) 0 Offset 0
|
||||
@ -276,10 +280,10 @@ gl_FragCoord origin is upper left
|
||||
29: TypeImage 6(float) 1D sampled format:Unknown
|
||||
30: TypePointer UniformConstant 29
|
||||
31(g_tTex1df4): 30(ptr) Variable UniformConstant
|
||||
34: TypePointer Function 12(int)
|
||||
40: 13(int) Constant 6
|
||||
64: TypePointer Function 8(PS_OUTPUT)
|
||||
66: 12(int) Constant 0
|
||||
33: 12(int) Constant 0
|
||||
35: TypePointer Function 12(int)
|
||||
41: 13(int) Constant 6
|
||||
65: TypePointer Function 8(PS_OUTPUT)
|
||||
67: 7(fvec4) ConstantComposite 24 24 24 24
|
||||
68: TypePointer Function 7(fvec4)
|
||||
73: TypePointer Output 7(fvec4)
|
||||
@ -298,53 +302,53 @@ gl_FragCoord origin is upper left
|
||||
10(@main():8(PS_OUTPUT) Function None 9
|
||||
11: Label
|
||||
28(sizeQueryTemp): 27(ptr) Variable Function
|
||||
35(WidthI): 34(ptr) Variable Function
|
||||
38(sizeQueryTemp): 27(ptr) Variable Function
|
||||
44(NumberOfLevelsU): 27(ptr) Variable Function
|
||||
47(sizeQueryTemp): 27(ptr) Variable Function
|
||||
50(WidthU): 27(ptr) Variable Function
|
||||
52(NumberOfLevelsI): 34(ptr) Variable Function
|
||||
56(sizeQueryTemp): 27(ptr) Variable Function
|
||||
65(ps_output): 64(ptr) Variable Function
|
||||
36(WidthI): 35(ptr) Variable Function
|
||||
39(sizeQueryTemp): 27(ptr) Variable Function
|
||||
45(NumberOfLevelsU): 27(ptr) Variable Function
|
||||
48(sizeQueryTemp): 27(ptr) Variable Function
|
||||
51(WidthU): 27(ptr) Variable Function
|
||||
53(NumberOfLevelsI): 35(ptr) Variable Function
|
||||
57(sizeQueryTemp): 27(ptr) Variable Function
|
||||
66(ps_output): 65(ptr) Variable Function
|
||||
22: 21(ptr) AccessChain 19 20
|
||||
23: 6(float) Load 22
|
||||
26: 6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 23 24 25
|
||||
32: 29 Load 31(g_tTex1df4)
|
||||
33: 12(int) ImageQuerySize 32
|
||||
Store 28(sizeQueryTemp) 33
|
||||
36: 13(int) Load 28(sizeQueryTemp)
|
||||
37: 12(int) Bitcast 36
|
||||
Store 35(WidthI) 37
|
||||
39: 29 Load 31(g_tTex1df4)
|
||||
41: 12(int) ImageQuerySizeLod 39 40
|
||||
Store 38(sizeQueryTemp) 41
|
||||
42: 13(int) Load 38(sizeQueryTemp)
|
||||
43: 12(int) Bitcast 42
|
||||
Store 35(WidthI) 43
|
||||
45: 29 Load 31(g_tTex1df4)
|
||||
46: 12(int) ImageQueryLevels 45
|
||||
Store 44(NumberOfLevelsU) 46
|
||||
48: 29 Load 31(g_tTex1df4)
|
||||
49: 12(int) ImageQuerySizeLod 48 40
|
||||
Store 47(sizeQueryTemp) 49
|
||||
51: 13(int) Load 47(sizeQueryTemp)
|
||||
Store 50(WidthU) 51
|
||||
53: 29 Load 31(g_tTex1df4)
|
||||
54: 12(int) ImageQueryLevels 53
|
||||
55: 12(int) Bitcast 54
|
||||
Store 52(NumberOfLevelsI) 55
|
||||
57: 29 Load 31(g_tTex1df4)
|
||||
58: 12(int) ImageQuerySizeLod 57 40
|
||||
Store 56(sizeQueryTemp) 58
|
||||
59: 13(int) Load 56(sizeQueryTemp)
|
||||
60: 12(int) Bitcast 59
|
||||
Store 35(WidthI) 60
|
||||
61: 29 Load 31(g_tTex1df4)
|
||||
62: 12(int) ImageQueryLevels 61
|
||||
63: 12(int) Bitcast 62
|
||||
Store 52(NumberOfLevelsI) 63
|
||||
69: 68(ptr) AccessChain 65(ps_output) 66
|
||||
34: 12(int) ImageQuerySizeLod 32 33
|
||||
Store 28(sizeQueryTemp) 34
|
||||
37: 13(int) Load 28(sizeQueryTemp)
|
||||
38: 12(int) Bitcast 37
|
||||
Store 36(WidthI) 38
|
||||
40: 29 Load 31(g_tTex1df4)
|
||||
42: 12(int) ImageQuerySizeLod 40 41
|
||||
Store 39(sizeQueryTemp) 42
|
||||
43: 13(int) Load 39(sizeQueryTemp)
|
||||
44: 12(int) Bitcast 43
|
||||
Store 36(WidthI) 44
|
||||
46: 29 Load 31(g_tTex1df4)
|
||||
47: 12(int) ImageQueryLevels 46
|
||||
Store 45(NumberOfLevelsU) 47
|
||||
49: 29 Load 31(g_tTex1df4)
|
||||
50: 12(int) ImageQuerySizeLod 49 41
|
||||
Store 48(sizeQueryTemp) 50
|
||||
52: 13(int) Load 48(sizeQueryTemp)
|
||||
Store 51(WidthU) 52
|
||||
54: 29 Load 31(g_tTex1df4)
|
||||
55: 12(int) ImageQueryLevels 54
|
||||
56: 12(int) Bitcast 55
|
||||
Store 53(NumberOfLevelsI) 56
|
||||
58: 29 Load 31(g_tTex1df4)
|
||||
59: 12(int) ImageQuerySizeLod 58 41
|
||||
Store 57(sizeQueryTemp) 59
|
||||
60: 13(int) Load 57(sizeQueryTemp)
|
||||
61: 12(int) Bitcast 60
|
||||
Store 36(WidthI) 61
|
||||
62: 29 Load 31(g_tTex1df4)
|
||||
63: 12(int) ImageQueryLevels 62
|
||||
64: 12(int) Bitcast 63
|
||||
Store 53(NumberOfLevelsI) 64
|
||||
69: 68(ptr) AccessChain 66(ps_output) 33
|
||||
Store 69 67
|
||||
70:8(PS_OUTPUT) Load 65(ps_output)
|
||||
70:8(PS_OUTPUT) Load 66(ps_output)
|
||||
ReturnValue 70
|
||||
FunctionEnd
|
||||
|
@ -2703,6 +2703,7 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType
|
||||
const TSampler& sampler = texType.getSampler();
|
||||
const TSamplerDim dim = sampler.dim;
|
||||
const bool isImage = sampler.isImage();
|
||||
const bool isMs = sampler.isMultiSample();
|
||||
const int numArgs = (int)argAggregate->getSequence().size();
|
||||
|
||||
int numDims = 0;
|
||||
@ -2713,6 +2714,7 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType
|
||||
case Esd3D: numDims = 3; break; // W, H, D
|
||||
case EsdCube: numDims = 2; break; // W, H (cube)
|
||||
case EsdBuffer: numDims = 1; break; // W (buffers)
|
||||
case EsdRect: numDims = 2; break; // W, H (rect)
|
||||
default:
|
||||
assert(0 && "unhandled texture dimension");
|
||||
}
|
||||
@ -2721,17 +2723,31 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType
|
||||
if (sampler.isArrayed())
|
||||
++numDims;
|
||||
|
||||
// Establish whether we're querying mip levels
|
||||
const bool mipQuery = (numArgs > (numDims + 1)) && (!sampler.isMultiSample());
|
||||
// Establish whether the method itself is querying mip levels. This can be false even
|
||||
// if the underlying query requires a MIP level, due to the available HLSL method overloads.
|
||||
const bool mipQuery = (numArgs > (numDims + 1 + (isMs ? 1 : 0)));
|
||||
|
||||
// Establish whether we must use the LOD form of query (even if the method did not supply a mip level to query).
|
||||
// True if:
|
||||
// 1. 1D/2D/3D/Cube AND multisample==0 AND NOT image (those can be sent to the non-LOD query)
|
||||
// or,
|
||||
// 2. There is a LOD (because the non-LOD query cannot be used in that case, per spec)
|
||||
const bool mipRequired =
|
||||
((dim == Esd1D || dim == Esd2D || dim == Esd3D || dim == EsdCube) && !isMs && !isImage) || // 1...
|
||||
mipQuery; // 2...
|
||||
|
||||
// AST assumes integer return. Will be converted to float if required.
|
||||
TIntermAggregate* sizeQuery = new TIntermAggregate(isImage ? EOpImageQuerySize : EOpTextureQuerySize);
|
||||
sizeQuery->getSequence().push_back(argTex);
|
||||
// If we're querying an explicit LOD, add the LOD, which is always arg #1
|
||||
if (mipQuery) {
|
||||
TIntermTyped* queryLod = argAggregate->getSequence()[1]->getAsTyped();
|
||||
|
||||
// If we're building an LOD query, add the LOD.
|
||||
if (mipRequired) {
|
||||
// If the base HLSL query had no MIP level given, use level 0.
|
||||
TIntermTyped* queryLod = mipQuery ? argAggregate->getSequence()[1]->getAsTyped() :
|
||||
intermediate.addConstantUnion(0, loc, true);
|
||||
sizeQuery->getSequence().push_back(queryLod);
|
||||
}
|
||||
|
||||
sizeQuery->setType(TType(EbtUint, EvqTemporary, numDims));
|
||||
sizeQuery->setLoc(loc);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user