Commit 6212e86f by John Kessenich Committed by GitHub

Merge pull request #764 from steve-lunarg/imagequery-sign

Preserve signedness in SPIR-V image query ops
parents 757bc874 0b5c2ae7
...@@ -2922,6 +2922,10 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ...@@ -2922,6 +2922,10 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
glslang::TCrackedTextureOp cracked; glslang::TCrackedTextureOp cracked;
node->crackTexture(sampler, cracked); node->crackTexture(sampler, cracked);
const bool isUnsignedResult =
node->getType().getBasicType() == glslang::EbtUint64 ||
node->getType().getBasicType() == glslang::EbtUint;
// Check for queries // Check for queries
if (cracked.query) { if (cracked.query) {
// OpImageQueryLod works on a sampled image, for other queries the image has to be extracted first // OpImageQueryLod works on a sampled image, for other queries the image has to be extracted first
...@@ -2933,17 +2937,17 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ...@@ -2933,17 +2937,17 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
case glslang::EOpTextureQuerySize: case glslang::EOpTextureQuerySize:
if (arguments.size() > 1) { if (arguments.size() > 1) {
params.lod = arguments[1]; params.lod = arguments[1];
return builder.createTextureQueryCall(spv::OpImageQuerySizeLod, params); return builder.createTextureQueryCall(spv::OpImageQuerySizeLod, params, isUnsignedResult);
} else } else
return builder.createTextureQueryCall(spv::OpImageQuerySize, params); return builder.createTextureQueryCall(spv::OpImageQuerySize, params, isUnsignedResult);
case glslang::EOpImageQuerySamples: case glslang::EOpImageQuerySamples:
case glslang::EOpTextureQuerySamples: case glslang::EOpTextureQuerySamples:
return builder.createTextureQueryCall(spv::OpImageQuerySamples, params); return builder.createTextureQueryCall(spv::OpImageQuerySamples, params, isUnsignedResult);
case glslang::EOpTextureQueryLod: case glslang::EOpTextureQueryLod:
params.coords = arguments[1]; params.coords = arguments[1];
return builder.createTextureQueryCall(spv::OpImageQueryLod, params); return builder.createTextureQueryCall(spv::OpImageQueryLod, params, isUnsignedResult);
case glslang::EOpTextureQueryLevels: case glslang::EOpTextureQueryLevels:
return builder.createTextureQueryCall(spv::OpImageQueryLevels, params); return builder.createTextureQueryCall(spv::OpImageQueryLevels, params, isUnsignedResult);
case glslang::EOpSparseTexelsResident: case glslang::EOpSparseTexelsResident:
return builder.createUnaryOp(spv::OpImageSparseTexelsResident, builder.makeBoolType(), arguments[0]); return builder.createUnaryOp(spv::OpImageSparseTexelsResident, builder.makeBoolType(), arguments[0]);
default: default:
......
...@@ -1662,7 +1662,7 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, ...@@ -1662,7 +1662,7 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse,
} }
// Comments in header // Comments in header
Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameters) Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameters, bool isUnsignedResult)
{ {
// All these need a capability // All these need a capability
addCapability(CapabilityImageQuery); addCapability(CapabilityImageQuery);
...@@ -1695,10 +1695,12 @@ Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameter ...@@ -1695,10 +1695,12 @@ Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameter
} }
if (isArrayedImageType(getImageType(parameters.sampler))) if (isArrayedImageType(getImageType(parameters.sampler)))
++numComponents; ++numComponents;
Id intType = isUnsignedResult ? makeUintType(32) : makeIntType(32);
if (numComponents == 1) if (numComponents == 1)
resultType = makeIntType(32); resultType = intType;
else else
resultType = makeVectorType(makeIntType(32), numComponents); resultType = makeVectorType(intType, numComponents);
break; break;
} }
...@@ -1707,7 +1709,7 @@ Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameter ...@@ -1707,7 +1709,7 @@ Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameter
break; break;
case OpImageQueryLevels: case OpImageQueryLevels:
case OpImageQuerySamples: case OpImageQuerySamples:
resultType = makeIntType(32); resultType = isUnsignedResult ? makeUintType(32) : makeIntType(32);
break; break;
default: default:
assert(0); assert(0);
......
...@@ -335,7 +335,7 @@ public: ...@@ -335,7 +335,7 @@ public:
// Emit the OpTextureQuery* instruction that was passed in. // Emit the OpTextureQuery* instruction that was passed in.
// Figure out the right return value and type, and return it. // Figure out the right return value and type, and return it.
Id createTextureQueryCall(Op, const TextureParameters&); Id createTextureQueryCall(Op, const TextureParameters&, bool isUnsignedResult);
Id createSamplePositionCall(Decoration precision, Id, Id); Id createSamplePositionCall(Decoration precision, Id, Id);
......
...@@ -186,17 +186,17 @@ Shader version: 450 ...@@ -186,17 +186,17 @@ Shader version: 450
29(NumberOfLevelsU): 13(ptr) Variable Function 29(NumberOfLevelsU): 13(ptr) Variable Function
33(vsout): 32(ptr) Variable Function 33(vsout): 32(ptr) Variable Function
18: 15 Load 17(g_tTex1df4) 18: 15 Load 17(g_tTex1df4)
21: 19(int) ImageQuerySizeLod 18 20 21: 12(int) ImageQuerySizeLod 18 20
Store 14(sizeQueryTemp) 21 Store 14(sizeQueryTemp) 21
23: 12(int) Load 14(sizeQueryTemp) 23: 12(int) Load 14(sizeQueryTemp)
Store 22(WidthU) 23 Store 22(WidthU) 23
25: 15 Load 17(g_tTex1df4) 25: 15 Load 17(g_tTex1df4)
27: 19(int) ImageQuerySizeLod 25 26 27: 12(int) ImageQuerySizeLod 25 26
Store 24(sizeQueryTemp) 27 Store 24(sizeQueryTemp) 27
28: 12(int) Load 24(sizeQueryTemp) 28: 12(int) Load 24(sizeQueryTemp)
Store 22(WidthU) 28 Store 22(WidthU) 28
30: 15 Load 17(g_tTex1df4) 30: 15 Load 17(g_tTex1df4)
31: 19(int) ImageQueryLevels 30 31: 12(int) ImageQueryLevels 30
Store 29(NumberOfLevelsU) 31 Store 29(NumberOfLevelsU) 31
37: 36(ptr) AccessChain 33(vsout) 20 37: 36(ptr) AccessChain 33(vsout) 20
Store 37 35 Store 37 35
......
...@@ -1288,37 +1288,37 @@ gl_FragCoord origin is upper left ...@@ -1288,37 +1288,37 @@ gl_FragCoord origin is upper left
276: 6(float) CompositeExtract 275 0 276: 6(float) CompositeExtract 275 0
Store 268(r51) 276 Store 268(r51) 276
281: 278 Load 280(g_tTex1df4) 281: 278 Load 280(g_tTex1df4)
282: 14(int) ImageQuerySizeLod 281 53 282: 15(int) ImageQuerySizeLod 281 53
Store 277(sizeQueryTemp) 282 Store 277(sizeQueryTemp) 282
284: 15(int) Load 277(sizeQueryTemp) 284: 15(int) Load 277(sizeQueryTemp)
285: 14(int) Bitcast 284 285: 14(int) Bitcast 284
Store 283(WidthI) 285 Store 283(WidthI) 285
287: 278 Load 280(g_tTex1df4) 287: 278 Load 280(g_tTex1df4)
289: 14(int) ImageQuerySizeLod 287 288 289: 15(int) ImageQuerySizeLod 287 288
Store 286(sizeQueryTemp) 289 Store 286(sizeQueryTemp) 289
290: 15(int) Load 286(sizeQueryTemp) 290: 15(int) Load 286(sizeQueryTemp)
291: 14(int) Bitcast 290 291: 14(int) Bitcast 290
Store 283(WidthI) 291 Store 283(WidthI) 291
293: 278 Load 280(g_tTex1df4) 293: 278 Load 280(g_tTex1df4)
294: 14(int) ImageQueryLevels 293 294: 15(int) ImageQueryLevels 293
Store 292(NumberOfLevelsU) 294 Store 292(NumberOfLevelsU) 294
296: 278 Load 280(g_tTex1df4) 296: 278 Load 280(g_tTex1df4)
297: 14(int) ImageQuerySizeLod 296 288 297: 15(int) ImageQuerySizeLod 296 288
Store 295(sizeQueryTemp) 297 Store 295(sizeQueryTemp) 297
299: 15(int) Load 295(sizeQueryTemp) 299: 15(int) Load 295(sizeQueryTemp)
Store 298(WidthU) 299 Store 298(WidthU) 299
301: 278 Load 280(g_tTex1df4) 301: 278 Load 280(g_tTex1df4)
302: 14(int) ImageQueryLevels 301 302: 15(int) ImageQueryLevels 301
303: 14(int) Bitcast 302 303: 14(int) Bitcast 302
Store 300(NumberOfLevelsI) 303 Store 300(NumberOfLevelsI) 303
305: 278 Load 280(g_tTex1df4) 305: 278 Load 280(g_tTex1df4)
306: 14(int) ImageQuerySizeLod 305 288 306: 15(int) ImageQuerySizeLod 305 288
Store 304(sizeQueryTemp) 306 Store 304(sizeQueryTemp) 306
307: 15(int) Load 304(sizeQueryTemp) 307: 15(int) Load 304(sizeQueryTemp)
308: 14(int) Bitcast 307 308: 14(int) Bitcast 307
Store 283(WidthI) 308 Store 283(WidthI) 308
309: 278 Load 280(g_tTex1df4) 309: 278 Load 280(g_tTex1df4)
310: 14(int) ImageQueryLevels 309 310: 15(int) ImageQueryLevels 309
311: 14(int) Bitcast 310 311: 14(int) Bitcast 310
Store 300(NumberOfLevelsI) 311 Store 300(NumberOfLevelsI) 311
314: 6(float) Load 13(r00) 314: 6(float) Load 13(r00)
......
...@@ -314,37 +314,37 @@ gl_FragCoord origin is upper left ...@@ -314,37 +314,37 @@ gl_FragCoord origin is upper left
23: 6(float) Load 22 23: 6(float) Load 22
26: 6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 23 24 25 26: 6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 23 24 25
32: 29 Load 31(g_tTex1df4) 32: 29 Load 31(g_tTex1df4)
34: 12(int) ImageQuerySizeLod 32 33 34: 13(int) ImageQuerySizeLod 32 33
Store 28(sizeQueryTemp) 34 Store 28(sizeQueryTemp) 34
37: 13(int) Load 28(sizeQueryTemp) 37: 13(int) Load 28(sizeQueryTemp)
38: 12(int) Bitcast 37 38: 12(int) Bitcast 37
Store 36(WidthI) 38 Store 36(WidthI) 38
40: 29 Load 31(g_tTex1df4) 40: 29 Load 31(g_tTex1df4)
42: 12(int) ImageQuerySizeLod 40 41 42: 13(int) ImageQuerySizeLod 40 41
Store 39(sizeQueryTemp) 42 Store 39(sizeQueryTemp) 42
43: 13(int) Load 39(sizeQueryTemp) 43: 13(int) Load 39(sizeQueryTemp)
44: 12(int) Bitcast 43 44: 12(int) Bitcast 43
Store 36(WidthI) 44 Store 36(WidthI) 44
46: 29 Load 31(g_tTex1df4) 46: 29 Load 31(g_tTex1df4)
47: 12(int) ImageQueryLevels 46 47: 13(int) ImageQueryLevels 46
Store 45(NumberOfLevelsU) 47 Store 45(NumberOfLevelsU) 47
49: 29 Load 31(g_tTex1df4) 49: 29 Load 31(g_tTex1df4)
50: 12(int) ImageQuerySizeLod 49 41 50: 13(int) ImageQuerySizeLod 49 41
Store 48(sizeQueryTemp) 50 Store 48(sizeQueryTemp) 50
52: 13(int) Load 48(sizeQueryTemp) 52: 13(int) Load 48(sizeQueryTemp)
Store 51(WidthU) 52 Store 51(WidthU) 52
54: 29 Load 31(g_tTex1df4) 54: 29 Load 31(g_tTex1df4)
55: 12(int) ImageQueryLevels 54 55: 13(int) ImageQueryLevels 54
56: 12(int) Bitcast 55 56: 12(int) Bitcast 55
Store 53(NumberOfLevelsI) 56 Store 53(NumberOfLevelsI) 56
58: 29 Load 31(g_tTex1df4) 58: 29 Load 31(g_tTex1df4)
59: 12(int) ImageQuerySizeLod 58 41 59: 13(int) ImageQuerySizeLod 58 41
Store 57(sizeQueryTemp) 59 Store 57(sizeQueryTemp) 59
60: 13(int) Load 57(sizeQueryTemp) 60: 13(int) Load 57(sizeQueryTemp)
61: 12(int) Bitcast 60 61: 12(int) Bitcast 60
Store 36(WidthI) 61 Store 36(WidthI) 61
62: 29 Load 31(g_tTex1df4) 62: 29 Load 31(g_tTex1df4)
63: 12(int) ImageQueryLevels 62 63: 13(int) ImageQueryLevels 62
64: 12(int) Bitcast 63 64: 12(int) Bitcast 63
Store 53(NumberOfLevelsI) 64 Store 53(NumberOfLevelsI) 64
69: 68(ptr) AccessChain 66(ps_output) 33 69: 68(ptr) AccessChain 66(ps_output) 33
......
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