Merge pull request #1684 from baldurk/reflection-interface-improve
Opt-in improvements to reflection interface
This commit is contained in:
commit
d83344fc4e
@ -152,6 +152,7 @@ void ProcessConfigFile()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ReflectOptions = EShReflectionDefault;
|
||||||
int Options = 0;
|
int Options = 0;
|
||||||
const char* ExecutableName = nullptr;
|
const char* ExecutableName = nullptr;
|
||||||
const char* binaryFileName = nullptr;
|
const char* binaryFileName = nullptr;
|
||||||
@ -523,6 +524,16 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
|
|||||||
Options |= EOptionNoStorageFormat;
|
Options |= EOptionNoStorageFormat;
|
||||||
} else if (lowerword == "relaxed-errors") {
|
} else if (lowerword == "relaxed-errors") {
|
||||||
Options |= EOptionRelaxedErrors;
|
Options |= EOptionRelaxedErrors;
|
||||||
|
} else if (lowerword == "reflect-strict-array-suffix") {
|
||||||
|
ReflectOptions |= EShReflectionStrictArraySuffix;
|
||||||
|
} else if (lowerword == "reflect-basic-array-suffix") {
|
||||||
|
ReflectOptions |= EShReflectionBasicArraySuffix;
|
||||||
|
} else if (lowerword == "reflect-intermediate-io") {
|
||||||
|
ReflectOptions |= EShReflectionIntermediateIO;
|
||||||
|
} else if (lowerword == "reflect-separate-buffers") {
|
||||||
|
ReflectOptions |= EShReflectionSeparateBuffers;
|
||||||
|
} else if (lowerword == "reflect-all-block-variables") {
|
||||||
|
ReflectOptions |= EShReflectionAllBlockVariables;
|
||||||
} else if (lowerword == "resource-set-bindings" || // synonyms
|
} else if (lowerword == "resource-set-bindings" || // synonyms
|
||||||
lowerword == "resource-set-binding" ||
|
lowerword == "resource-set-binding" ||
|
||||||
lowerword == "rsb") {
|
lowerword == "rsb") {
|
||||||
@ -1051,7 +1062,7 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
|
|||||||
|
|
||||||
// Reflect
|
// Reflect
|
||||||
if (Options & EOptionDumpReflection) {
|
if (Options & EOptionDumpReflection) {
|
||||||
program.buildReflection();
|
program.buildReflection(ReflectOptions);
|
||||||
program.dumpReflection();
|
program.dumpReflection();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1518,6 +1529,15 @@ void usage()
|
|||||||
" --invert-y | --iy invert position.Y output in vertex shader\n"
|
" --invert-y | --iy invert position.Y output in vertex shader\n"
|
||||||
" --keep-uncalled | --ku don't eliminate uncalled functions\n"
|
" --keep-uncalled | --ku don't eliminate uncalled functions\n"
|
||||||
" --no-storage-format | --nsf use Unknown image format\n"
|
" --no-storage-format | --nsf use Unknown image format\n"
|
||||||
|
" --reflect-strict-array-suffix use strict array suffix rules when\n"
|
||||||
|
" reflecting\n"
|
||||||
|
" --reflect-basic-array-suffix arrays of basic types will have trailing [0]\n"
|
||||||
|
" --reflect-intermediate-io reflection includes inputs/outputs of linked\n"
|
||||||
|
" shaders rather than just vertex/fragment\n"
|
||||||
|
" --reflect-separate-buffers reflect buffer variables and blocks\n"
|
||||||
|
" separately to uniforms\n"
|
||||||
|
" --reflect-all-block-variables reflect all variables in blocks, whether\n"
|
||||||
|
" inactive or active\n"
|
||||||
" --resource-set-binding [stage] name set binding\n"
|
" --resource-set-binding [stage] name set binding\n"
|
||||||
" set descriptor set and binding for\n"
|
" set descriptor set and binding for\n"
|
||||||
" individual resources\n"
|
" individual resources\n"
|
||||||
|
@ -3,8 +3,8 @@ Uniform reflection:
|
|||||||
t1: offset -1, type 8b5d, size 1, index -1, binding 11, stages 16
|
t1: offset -1, type 8b5d, size 1, index -1, binding 11, stages 16
|
||||||
t2: offset -1, type 8b5e, size 1, index -1, binding 12, stages 16
|
t2: offset -1, type 8b5e, size 1, index -1, binding 12, stages 16
|
||||||
t3: offset -1, type 8b5f, size 1, index -1, binding 13, stages 16
|
t3: offset -1, type 8b5f, size 1, index -1, binding 13, stages 16
|
||||||
t4.@data: offset 0, type 8b52, size 1, index 0, binding -1, stages 16
|
t4.@data: offset 0, type 8b52, size 1, index 0, binding -1, stages 16, arrayStride 16, topLevelArrayStride 16
|
||||||
t5.@data: offset 0, type 1405, size 0, index 1, binding -1, stages 16
|
t5.@data: offset 0, type 1405, size 0, index 1, binding -1, stages 16, arrayStride 4, topLevelArrayStride 4
|
||||||
t6: offset -1, type 8dc2, size 1, index -1, binding 16, stages 16
|
t6: offset -1, type 8dc2, size 1, index -1, binding 16, stages 16
|
||||||
s1: offset -1, type 0, size 1, index -1, binding 31, stages 16
|
s1: offset -1, type 0, size 1, index -1, binding 31, stages 16
|
||||||
s2: offset -1, type 0, size 1, index -1, binding 32, stages 16
|
s2: offset -1, type 0, size 1, index -1, binding 32, stages 16
|
||||||
@ -12,18 +12,25 @@ u1: offset -1, type 904c, size 1, index -1, binding 41, stages 16
|
|||||||
u2: offset -1, type 904d, size 1, index -1, binding 42, stages 16
|
u2: offset -1, type 904d, size 1, index -1, binding 42, stages 16
|
||||||
u3: offset -1, type 904e, size 1, index -1, binding 43, stages 16
|
u3: offset -1, type 904e, size 1, index -1, binding 43, stages 16
|
||||||
u4: offset -1, type 9051, size 1, index -1, binding 44, stages 16
|
u4: offset -1, type 9051, size 1, index -1, binding 44, stages 16
|
||||||
u5.@data: offset 0, type 1405, size 0, index 2, binding -1, stages 16
|
u5.@data: offset 0, type 1405, size 0, index 2, binding -1, stages 16, arrayStride 4, topLevelArrayStride 4
|
||||||
u6.@data: offset 0, type 1406, size 1, index 3, binding -1, stages 16
|
u6.@data: offset 0, type 1406, size 1, index 3, binding -1, stages 16, arrayStride 4, topLevelArrayStride 4
|
||||||
cb1: offset 0, type 1404, size 1, index 4, binding -1, stages 16
|
cb1: offset 0, type 1404, size 1, index 4, binding -1, stages 16
|
||||||
tb1: offset 0, type 1404, size 1, index 5, binding -1, stages 16
|
tb1: offset 0, type 1404, size 1, index 5, binding -1, stages 16
|
||||||
|
|
||||||
Uniform block reflection:
|
Uniform block reflection:
|
||||||
t4: offset -1, type ffffffff, size 0, index -1, binding 14, stages 0
|
t4: offset -1, type ffffffff, size 0, index -1, binding 14, stages 16, numMembers 1
|
||||||
t5: offset -1, type ffffffff, size 0, index -1, binding 15, stages 0
|
t5: offset -1, type ffffffff, size 0, index -1, binding 15, stages 16, numMembers 1
|
||||||
u5: offset -1, type ffffffff, size 0, index -1, binding 45, stages 0
|
u5: offset -1, type ffffffff, size 0, index -1, binding 45, stages 16, numMembers 1
|
||||||
u6: offset -1, type ffffffff, size 0, index -1, binding 46, stages 0
|
u6: offset -1, type ffffffff, size 0, index -1, binding 46, stages 16, numMembers 1
|
||||||
cb: offset -1, type ffffffff, size 4, index -1, binding 51, stages 0
|
cb: offset -1, type ffffffff, size 4, index -1, binding 51, stages 16, numMembers 1
|
||||||
tb: offset -1, type ffffffff, size 4, index -1, binding 17, stages 0
|
tb: offset -1, type ffffffff, size 4, index -1, binding 17, stages 16, numMembers 1
|
||||||
|
|
||||||
Vertex attribute reflection:
|
Buffer variable reflection:
|
||||||
|
|
||||||
|
Buffer block reflection:
|
||||||
|
|
||||||
|
Pipeline input reflection:
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
@entryPointOutput: offset 0, type 8b52, size 0, index 0, binding -1, stages 16
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@ hlsl.reflection.binding.frag
|
|||||||
Uniform reflection:
|
Uniform reflection:
|
||||||
t1: offset -1, type 8b5d, size 1, index -1, binding 15, stages 16
|
t1: offset -1, type 8b5d, size 1, index -1, binding 15, stages 16
|
||||||
s1: offset -1, type 0, size 1, index -1, binding 5, stages 16
|
s1: offset -1, type 0, size 1, index -1, binding 5, stages 16
|
||||||
t1a: offset -1, type 8b5d, size 1, index -1, binding 16, stages 16
|
t1a: offset -1, type 8b5d, size 1, index -1, binding 16, stages 16, arrayStride 4, topLevelArrayStride 4
|
||||||
s1a: offset -1, type 0, size 1, index -1, binding 6, stages 16
|
s1a: offset -1, type 0, size 1, index -1, binding 6, stages 16, arrayStride 4, topLevelArrayStride 4
|
||||||
c1_a: offset 0, type 8b52, size 1, index 0, binding -1, stages 16
|
c1_a: offset 0, type 8b52, size 1, index 0, binding -1, stages 16
|
||||||
c1_b: offset 16, type 1404, size 1, index 0, binding -1, stages 16
|
c1_b: offset 16, type 1404, size 1, index 0, binding -1, stages 16
|
||||||
c1_c: offset 20, type 1406, size 1, index 0, binding -1, stages 16
|
c1_c: offset 20, type 1406, size 1, index 0, binding -1, stages 16
|
||||||
@ -12,8 +12,15 @@ c2_b: offset 16, type 1404, size 1, index 1, binding -1, stages 16
|
|||||||
c2_c: offset 20, type 1406, size 1, index 1, binding -1, stages 16
|
c2_c: offset 20, type 1406, size 1, index 1, binding -1, stages 16
|
||||||
|
|
||||||
Uniform block reflection:
|
Uniform block reflection:
|
||||||
cbuff1: offset -1, type ffffffff, size 24, index -1, binding 2, stages 0
|
cbuff1: offset -1, type ffffffff, size 24, index -1, binding 2, stages 16, numMembers 3
|
||||||
cbuff2: offset -1, type ffffffff, size 24, index -1, binding 3, stages 0
|
cbuff2: offset -1, type ffffffff, size 24, index -1, binding 3, stages 16, numMembers 3
|
||||||
|
|
||||||
Vertex attribute reflection:
|
Buffer variable reflection:
|
||||||
|
|
||||||
|
Buffer block reflection:
|
||||||
|
|
||||||
|
Pipeline input reflection:
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
psout.Color: offset 0, type 8b52, size 0, index 0, binding -1, stages 16
|
||||||
|
|
||||||
|
@ -7,70 +7,76 @@ scalarAfterm23: offset 48, type 1404, size 1, index 0, binding -1, stages 1
|
|||||||
c_m23: offset 16, type 8b67, size 1, index 2, binding -1, stages 1
|
c_m23: offset 16, type 8b67, size 1, index 2, binding -1, stages 1
|
||||||
c_scalarAfterm23: offset 48, type 1404, size 1, index 2, binding -1, stages 1
|
c_scalarAfterm23: offset 48, type 1404, size 1, index 2, binding -1, stages 1
|
||||||
scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1, stages 1
|
scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1, stages 1
|
||||||
floatArray: offset 112, type 1406, size 5, index 0, binding -1, stages 1
|
floatArray: offset 112, type 1406, size 5, index 0, binding -1, stages 1, arrayStride 16, topLevelArrayStride 16
|
||||||
scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1, stages 1
|
scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1, stages 1
|
||||||
m22: offset 208, type 8b5a, size 9, index 0, binding -1, stages 1
|
m22: offset 208, type 8b5a, size 9, index 0, binding -1, stages 1, arrayStride 32, topLevelArrayStride 32
|
||||||
dm22: offset 32, type 8b5a, size 4, index 1, binding -1, stages 1
|
dm22: offset 32, type 8b5a, size 4, index 1, binding -1, stages 1, arrayStride 32, topLevelArrayStride 32
|
||||||
foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1, stages 1
|
foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1, stages 1
|
||||||
foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1, stages 1
|
foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1, stages 1
|
||||||
foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1, stages 1
|
foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1, stages 1
|
||||||
foo.n2.d: offset 24, type 1406, size 1, index 3, binding -1, stages 1
|
foo.n2.d: offset 24, type 1406, size 1, index 3, binding -1, stages 1
|
||||||
deepA.d2.d1[2].va: offset 440, type 8b50, size 2, index 1, binding -1, stages 1
|
deepA.d2.d1[2].va: offset 440, type 8b50, size 2, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepB.d2.d1.va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1
|
deepB.d2.d1.va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepB.d2.d1[0].va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1
|
deepB.d2.d1[0].va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepB.d2.d1[1].va: offset 1016, type 8b50, size 2, index 1, binding -1, stages 1
|
deepB.d2.d1[1].va: offset 1016, type 8b50, size 2, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepB.d2.d1[2].va: offset 1048, type 8b50, size 2, index 1, binding -1, stages 1
|
deepB.d2.d1[2].va: offset 1048, type 8b50, size 2, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepB.d2.d1[3].va: offset 1080, type 8b50, size 2, index 1, binding -1, stages 1
|
deepB.d2.d1[3].va: offset 1080, type 8b50, size 2, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepC.iv4: offset 1568, type 8b52, size 1, index 1, binding -1, stages 1
|
deepC.iv4: offset 1568, type 8b52, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepC.d2.i: offset 1584, type 1404, size 1, index 1, binding -1, stages 1
|
deepC.d2.i: offset 1584, type 1404, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepC.d2.d1[0].va: offset 1592, type 8b50, size 3, index 1, binding -1, stages 1
|
deepC.d2.d1[0].va: offset 1592, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepC.d2.d1[0].b: offset 1616, type 8b56, size 1, index 1, binding -1, stages 1
|
deepC.d2.d1[0].b: offset 1616, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepC.d2.d1[1].va: offset 1624, type 8b50, size 3, index 1, binding -1, stages 1
|
deepC.d2.d1[1].va: offset 1624, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepC.d2.d1[1].b: offset 1648, type 8b56, size 1, index 1, binding -1, stages 1
|
deepC.d2.d1[1].b: offset 1648, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepC.d2.d1[2].va: offset 1656, type 8b50, size 3, index 1, binding -1, stages 1
|
deepC.d2.d1[2].va: offset 1656, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepC.d2.d1[2].b: offset 1680, type 8b56, size 1, index 1, binding -1, stages 1
|
deepC.d2.d1[2].b: offset 1680, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepC.d2.d1[3].va: offset 1688, type 8b50, size 3, index 1, binding -1, stages 1
|
deepC.d2.d1[3].va: offset 1688, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepC.d2.d1[3].b: offset 1712, type 8b56, size 1, index 1, binding -1, stages 1
|
deepC.d2.d1[3].b: offset 1712, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepC.v3: offset 1728, type 8b54, size 1, index 1, binding -1, stages 1
|
deepC.v3: offset 1728, type 8b54, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[0].iv4: offset 2480, type 8b52, size 1, index 1, binding -1, stages 1
|
deepD[0].iv4: offset 2480, type 8b52, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[0].d2.i: offset 2496, type 1404, size 1, index 1, binding -1, stages 1
|
deepD[0].d2.i: offset 2496, type 1404, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[0].d2.d1[0].va: offset 2504, type 8b50, size 3, index 1, binding -1, stages 1
|
deepD[0].d2.d1[0].va: offset 2504, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepD[0].d2.d1[0].b: offset 2528, type 8b56, size 1, index 1, binding -1, stages 1
|
deepD[0].d2.d1[0].b: offset 2528, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[0].d2.d1[1].va: offset 2536, type 8b50, size 3, index 1, binding -1, stages 1
|
deepD[0].d2.d1[1].va: offset 2536, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepD[0].d2.d1[1].b: offset 2560, type 8b56, size 1, index 1, binding -1, stages 1
|
deepD[0].d2.d1[1].b: offset 2560, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[0].d2.d1[2].va: offset 2568, type 8b50, size 3, index 1, binding -1, stages 1
|
deepD[0].d2.d1[2].va: offset 2568, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepD[0].d2.d1[2].b: offset 2592, type 8b56, size 1, index 1, binding -1, stages 1
|
deepD[0].d2.d1[2].b: offset 2592, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[0].d2.d1[3].va: offset 2600, type 8b50, size 3, index 1, binding -1, stages 1
|
deepD[0].d2.d1[3].va: offset 2600, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepD[0].d2.d1[3].b: offset 2624, type 8b56, size 1, index 1, binding -1, stages 1
|
deepD[0].d2.d1[3].b: offset 2624, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[0].v3: offset 2640, type 8b54, size 1, index 1, binding -1, stages 1
|
deepD[0].v3: offset 2640, type 8b54, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[1].iv4: offset 2784, type 8b52, size 1, index 1, binding -1, stages 1
|
deepD[1].iv4: offset 2784, type 8b52, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[1].d2.i: offset 2800, type 1404, size 1, index 1, binding -1, stages 1
|
deepD[1].d2.i: offset 2800, type 1404, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[1].d2.d1[0].va: offset 2808, type 8b50, size 3, index 1, binding -1, stages 1
|
deepD[1].d2.d1[0].va: offset 2808, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepD[1].d2.d1[0].b: offset 2832, type 8b56, size 1, index 1, binding -1, stages 1
|
deepD[1].d2.d1[0].b: offset 2832, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[1].d2.d1[1].va: offset 2840, type 8b50, size 3, index 1, binding -1, stages 1
|
deepD[1].d2.d1[1].va: offset 2840, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepD[1].d2.d1[1].b: offset 2864, type 8b56, size 1, index 1, binding -1, stages 1
|
deepD[1].d2.d1[1].b: offset 2864, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[1].d2.d1[2].va: offset 2872, type 8b50, size 3, index 1, binding -1, stages 1
|
deepD[1].d2.d1[2].va: offset 2872, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepD[1].d2.d1[2].b: offset 2896, type 8b56, size 1, index 1, binding -1, stages 1
|
deepD[1].d2.d1[2].b: offset 2896, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[1].d2.d1[3].va: offset 2904, type 8b50, size 3, index 1, binding -1, stages 1
|
deepD[1].d2.d1[3].va: offset 2904, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
|
||||||
deepD[1].d2.d1[3].b: offset 2928, type 8b56, size 1, index 1, binding -1, stages 1
|
deepD[1].d2.d1[3].b: offset 2928, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
deepD[1].v3: offset 2944, type 8b54, size 1, index 1, binding -1, stages 1
|
deepD[1].v3: offset 2944, type 8b54, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
|
||||||
foo1: offset 0, type 1406, size 1, index 4, binding -1, stages 1
|
foo1: offset 0, type 1406, size 1, index 4, binding -1, stages 1
|
||||||
foo2: offset 0, type 1406, size 1, index 5, binding -1, stages 1
|
foo2: offset 0, type 1406, size 1, index 5, binding -1, stages 1
|
||||||
anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
|
anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
|
||||||
uf1: offset 16, type 1406, size 1, index 1, binding -1, stages 1
|
uf1: offset 16, type 1406, size 1, index 1, binding -1, stages 1
|
||||||
|
|
||||||
Uniform block reflection:
|
Uniform block reflection:
|
||||||
nameless: offset -1, type ffffffff, size 496, index -1, binding -1, stages 0
|
nameless: offset -1, type ffffffff, size 496, index -1, binding -1, stages 1, numMembers 9
|
||||||
$Global: offset -1, type ffffffff, size 3088, index -1, binding -1, stages 0
|
$Global: offset -1, type ffffffff, size 3088, index -1, binding -1, stages 1, numMembers 106
|
||||||
c_nameless: offset -1, type ffffffff, size 96, index -1, binding -1, stages 0
|
c_nameless: offset -1, type ffffffff, size 96, index -1, binding -1, stages 1, numMembers 5
|
||||||
nested: offset -1, type ffffffff, size 32, index -1, binding -1, stages 0
|
nested: offset -1, type ffffffff, size 32, index -1, binding -1, stages 1, numMembers 4
|
||||||
abl: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
abl2: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl2: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
|
|
||||||
Vertex attribute reflection:
|
Buffer variable reflection:
|
||||||
attributeFloat: offset 0, type 1406, size 0, index 0, binding -1, stages 0
|
|
||||||
attributeFloat2: offset 0, type 8b50, size 0, index 0, binding -1, stages 0
|
Buffer block reflection:
|
||||||
attributeFloat3: offset 0, type 8b51, size 0, index 0, binding -1, stages 0
|
|
||||||
attributeFloat4: offset 0, type 8b52, size 0, index 0, binding -1, stages 0
|
Pipeline input reflection:
|
||||||
attributeMat4: offset 0, type 8b5c, size 0, index 0, binding -1, stages 0
|
attributeFloat: offset 0, type 1406, size 0, index 0, binding -1, stages 1
|
||||||
|
attributeFloat2: offset 0, type 8b50, size 0, index 0, binding -1, stages 1
|
||||||
|
attributeFloat3: offset 0, type 8b51, size 0, index 0, binding -1, stages 1
|
||||||
|
attributeFloat4: offset 0, type 8b52, size 0, index 0, binding -1, stages 1
|
||||||
|
attributeMat4: offset 0, type 8b5c, size 0, index 0, binding -1, stages 1
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
|
||||||
|
@ -203,8 +203,8 @@ Uniform reflection:
|
|||||||
t1: offset -1, type 8b5d, size 1, index -1, binding 21, stages 16
|
t1: offset -1, type 8b5d, size 1, index -1, binding 21, stages 16
|
||||||
t2: offset -1, type 8b5e, size 1, index -1, binding 22, stages 16
|
t2: offset -1, type 8b5e, size 1, index -1, binding 22, stages 16
|
||||||
t3: offset -1, type 8b5f, size 1, index -1, binding 26, stages 16
|
t3: offset -1, type 8b5f, size 1, index -1, binding 26, stages 16
|
||||||
t4.@data: offset 0, type 8b52, size 1, index 0, binding -1, stages 16
|
t4.@data: offset 0, type 8b52, size 1, index 0, binding -1, stages 16, arrayStride 16, topLevelArrayStride 16
|
||||||
t5.@data: offset 0, type 1405, size 0, index 1, binding -1, stages 16
|
t5.@data: offset 0, type 1405, size 0, index 1, binding -1, stages 16, arrayStride 4, topLevelArrayStride 4
|
||||||
t6: offset -1, type 8dc2, size 1, index -1, binding 23, stages 16
|
t6: offset -1, type 8dc2, size 1, index -1, binding 23, stages 16
|
||||||
s1: offset -1, type 0, size 1, index -1, binding 11, stages 16
|
s1: offset -1, type 0, size 1, index -1, binding 11, stages 16
|
||||||
s2: offset -1, type 0, size 1, index -1, binding 17, stages 16
|
s2: offset -1, type 0, size 1, index -1, binding 17, stages 16
|
||||||
@ -212,19 +212,26 @@ u1: offset -1, type 904c, size 1, index -1, binding 31, stages 16
|
|||||||
u2: offset -1, type 904d, size 1, index -1, binding 42, stages 16
|
u2: offset -1, type 904d, size 1, index -1, binding 42, stages 16
|
||||||
u3: offset -1, type 904e, size 1, index -1, binding 43, stages 16
|
u3: offset -1, type 904e, size 1, index -1, binding 43, stages 16
|
||||||
u4: offset -1, type 9051, size 1, index -1, binding 34, stages 16
|
u4: offset -1, type 9051, size 1, index -1, binding 34, stages 16
|
||||||
u5.@data: offset 0, type 1405, size 0, index 2, binding -1, stages 16
|
u5.@data: offset 0, type 1405, size 0, index 2, binding -1, stages 16, arrayStride 4, topLevelArrayStride 4
|
||||||
u6.@data: offset 0, type 1406, size 1, index 3, binding -1, stages 16
|
u6.@data: offset 0, type 1406, size 1, index 3, binding -1, stages 16, arrayStride 4, topLevelArrayStride 4
|
||||||
cb1: offset 0, type 1404, size 1, index 4, binding -1, stages 16
|
cb1: offset 0, type 1404, size 1, index 4, binding -1, stages 16
|
||||||
tb1: offset 0, type 1404, size 1, index 5, binding -1, stages 16
|
tb1: offset 0, type 1404, size 1, index 5, binding -1, stages 16
|
||||||
ts6: offset -1, type 8b5f, size 1, index -1, binding 71, stages 16
|
ts6: offset -1, type 8b5f, size 1, index -1, binding 71, stages 16
|
||||||
|
|
||||||
Uniform block reflection:
|
Uniform block reflection:
|
||||||
t4: offset -1, type ffffffff, size 0, index -1, binding 21, stages 0
|
t4: offset -1, type ffffffff, size 0, index -1, binding 21, stages 16, numMembers 1
|
||||||
t5: offset -1, type ffffffff, size 0, index -1, binding 22, stages 0
|
t5: offset -1, type ffffffff, size 0, index -1, binding 22, stages 16, numMembers 1
|
||||||
u5: offset -1, type ffffffff, size 0, index -1, binding 44, stages 0
|
u5: offset -1, type ffffffff, size 0, index -1, binding 44, stages 16, numMembers 1
|
||||||
u6: offset -1, type ffffffff, size 0, index -1, binding 34, stages 0
|
u6: offset -1, type ffffffff, size 0, index -1, binding 34, stages 16, numMembers 1
|
||||||
cb: offset -1, type ffffffff, size 4, index -1, binding 51, stages 0
|
cb: offset -1, type ffffffff, size 4, index -1, binding 51, stages 16, numMembers 1
|
||||||
tb: offset -1, type ffffffff, size 4, index -1, binding 27, stages 0
|
tb: offset -1, type ffffffff, size 4, index -1, binding 27, stages 16, numMembers 1
|
||||||
|
|
||||||
Vertex attribute reflection:
|
Buffer variable reflection:
|
||||||
|
|
||||||
|
Buffer block reflection:
|
||||||
|
|
||||||
|
Pipeline input reflection:
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
@entryPointOutput: offset 0, type 8b52, size 0, index 0, binding -1, stages 16
|
||||||
|
|
||||||
|
13
Test/baseResults/reflection.frag.out
Normal file
13
Test/baseResults/reflection.frag.out
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
reflection.frag
|
||||||
|
Uniform reflection:
|
||||||
|
|
||||||
|
Uniform block reflection:
|
||||||
|
|
||||||
|
Buffer variable reflection:
|
||||||
|
|
||||||
|
Buffer block reflection:
|
||||||
|
|
||||||
|
Pipeline input reflection:
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
|
21
Test/baseResults/reflection.linked.options.out
Normal file
21
Test/baseResults/reflection.linked.options.out
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
reflection.linked.vert
|
||||||
|
reflection.linked.frag
|
||||||
|
Uniform reflection:
|
||||||
|
ubo_block.unused_uniform: offset 0, type 1406, size 1, index 0, binding -1, stages 0
|
||||||
|
ubo_block.shared_uniform: offset 4, type 1406, size 1, index 0, binding -1, stages 17
|
||||||
|
ubo_block.vsonly_uniform: offset 8, type 1406, size 1, index 0, binding -1, stages 1
|
||||||
|
ubo_block.fsonly_uniform: offset 12, type 1406, size 1, index 0, binding -1, stages 16
|
||||||
|
|
||||||
|
Uniform block reflection:
|
||||||
|
ubo_block: offset -1, type ffffffff, size 16, index -1, binding 0, stages 17, numMembers 4
|
||||||
|
|
||||||
|
Buffer variable reflection:
|
||||||
|
|
||||||
|
Buffer block reflection:
|
||||||
|
|
||||||
|
Pipeline input reflection:
|
||||||
|
vertin: offset 0, type 1406, size 0, index 0, binding -1, stages 1
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
fragout: offset 0, type 1406, size 0, index 0, binding -1, stages 16
|
||||||
|
|
20
Test/baseResults/reflection.linked.out
Normal file
20
Test/baseResults/reflection.linked.out
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
reflection.linked.vert
|
||||||
|
reflection.linked.frag
|
||||||
|
Uniform reflection:
|
||||||
|
ubo_block.shared_uniform: offset 4, type 1406, size 1, index 0, binding -1, stages 17
|
||||||
|
ubo_block.vsonly_uniform: offset 8, type 1406, size 1, index 0, binding -1, stages 17
|
||||||
|
ubo_block.fsonly_uniform: offset 12, type 1406, size 1, index 0, binding -1, stages 16
|
||||||
|
|
||||||
|
Uniform block reflection:
|
||||||
|
ubo_block: offset -1, type ffffffff, size 16, index -1, binding 0, stages 17, numMembers 4
|
||||||
|
|
||||||
|
Buffer variable reflection:
|
||||||
|
|
||||||
|
Buffer block reflection:
|
||||||
|
|
||||||
|
Pipeline input reflection:
|
||||||
|
vertin: offset 0, type 1406, size 0, index 0, binding -1, stages 1
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
fragout: offset 0, type 1406, size 0, index 0, binding -1, stages 16
|
||||||
|
|
14
Test/baseResults/reflection.options.frag.out
Normal file
14
Test/baseResults/reflection.options.frag.out
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
reflection.frag
|
||||||
|
Uniform reflection:
|
||||||
|
|
||||||
|
Uniform block reflection:
|
||||||
|
|
||||||
|
Buffer variable reflection:
|
||||||
|
|
||||||
|
Buffer block reflection:
|
||||||
|
|
||||||
|
Pipeline input reflection:
|
||||||
|
inval: offset 0, type 1406, size 0, index 0, binding -1, stages 16
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
|
40
Test/baseResults/reflection.options.vert.out
Normal file
40
Test/baseResults/reflection.options.vert.out
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
reflection.options.vert
|
||||||
|
Uniform reflection:
|
||||||
|
UBO.verts[0].position[0]: offset 0, type 1406, size 3, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 24
|
||||||
|
UBO.verts[0].normal[0]: offset 12, type 1406, size 3, index 0, binding -1, stages 0, arrayStride 4, topLevelArrayStride 24
|
||||||
|
UBO.verts[1].position[0]: offset 24, type 1406, size 3, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 24
|
||||||
|
UBO.verts[1].normal[0]: offset 36, type 1406, size 3, index 0, binding -1, stages 0, arrayStride 4, topLevelArrayStride 24
|
||||||
|
UBO.flt[0]: offset 48, type 1406, size 8, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 4
|
||||||
|
UBO.unused: offset 80, type 8dc8, size 1, index 0, binding -1, stages 0
|
||||||
|
|
||||||
|
Uniform block reflection:
|
||||||
|
UBO: offset -1, type ffffffff, size 96, index -1, binding -1, stages 1, numMembers 6
|
||||||
|
|
||||||
|
Buffer variable reflection:
|
||||||
|
t[0].v[0].position[0]: offset 0, type 1406, size 3, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[0].normal[0]: offset 12, type 1406, size 3, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[1].position[0]: offset 24, type 1406, size 3, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[1].normal[0]: offset 36, type 1406, size 3, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[2].position[0]: offset 48, type 1406, size 3, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[2].normal[0]: offset 60, type 1406, size 3, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
padding[0]: offset 360, type 1405, size 10, index 0, binding -1, stages 0, arrayStride 4, topLevelArrayStride 4
|
||||||
|
MultipleArrays.tri[0].v[0].position[0]: offset 0, type 1406, size 3, index 1, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
MultipleArrays.tri[0].v[0].normal[0]: offset 12, type 1406, size 3, index 1, binding -1, stages 0, arrayStride 4, topLevelArrayStride 72
|
||||||
|
MultipleArrays.tri[0].v[1].position[0]: offset 24, type 1406, size 3, index 1, binding -1, stages 0, arrayStride 4, topLevelArrayStride 72
|
||||||
|
MultipleArrays.tri[0].v[1].normal[0]: offset 36, type 1406, size 3, index 1, binding -1, stages 0, arrayStride 4, topLevelArrayStride 72
|
||||||
|
MultipleArrays.tri[0].v[2].position[0]: offset 48, type 1406, size 3, index 1, binding -1, stages 0, arrayStride 4, topLevelArrayStride 72
|
||||||
|
MultipleArrays.tri[0].v[2].normal[0]: offset 60, type 1406, size 3, index 1, binding -1, stages 0, arrayStride 4, topLevelArrayStride 72
|
||||||
|
MultipleArrays.vert[0].position[0]: offset 360, type 1406, size 3, index 1, binding -1, stages 1, arrayStride 4, topLevelArrayStride 24
|
||||||
|
MultipleArrays.vert[0].normal[0]: offset 372, type 1406, size 3, index 1, binding -1, stages 0, arrayStride 4, topLevelArrayStride 24
|
||||||
|
MultipleArrays.f[0]: offset 480, type 1406, size 5, index 1, binding -1, stages 1, arrayStride 4, topLevelArrayStride 4
|
||||||
|
|
||||||
|
Buffer block reflection:
|
||||||
|
VertexCollection: offset -1, type ffffffff, size 400, index -1, binding -1, stages 1, numMembers 7
|
||||||
|
MultipleArrays: offset -1, type ffffffff, size 500, index -1, binding -1, stages 1, numMembers 9
|
||||||
|
|
||||||
|
Pipeline input reflection:
|
||||||
|
gl_InstanceID: offset 0, type 1404, size 0, index 0, binding -1, stages 1
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
outval: offset 0, type 1406, size 0, index 0, binding -1, stages 1
|
||||||
|
|
@ -11,108 +11,152 @@ scalarAfterm23: offset 48, type 1404, size 1, index 0, binding -1, stages 1
|
|||||||
c_m23: offset 16, type 8b67, size 1, index 2, binding -1, stages 1
|
c_m23: offset 16, type 8b67, size 1, index 2, binding -1, stages 1
|
||||||
c_scalarAfterm23: offset 64, type 1404, size 1, index 2, binding -1, stages 1
|
c_scalarAfterm23: offset 64, type 1404, size 1, index 2, binding -1, stages 1
|
||||||
scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1, stages 1
|
scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1, stages 1
|
||||||
floatArray: offset 112, type 1406, size 5, index 0, binding -1, stages 1
|
floatArray: offset 112, type 1406, size 5, index 0, binding -1, stages 1, arrayStride 16, topLevelArrayStride 16
|
||||||
scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1, stages 1
|
scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1, stages 1
|
||||||
named.memvec2: offset 48, type 8b50, size 1, index 1, binding -1, stages 1
|
named.memvec2: offset 48, type 8b50, size 1, index 1, binding -1, stages 1
|
||||||
named.memf1: offset 56, type 1406, size 1, index 1, binding -1, stages 1
|
named.memf1: offset 56, type 1406, size 1, index 1, binding -1, stages 1
|
||||||
named.memf2: offset 60, type 8b56, size 1, index 1, binding -1, stages 1
|
named.memf2: offset 60, type 8b56, size 1, index 1, binding -1, stages 1
|
||||||
named.memf3: offset 64, type 1404, size 1, index 1, binding -1, stages 1
|
named.memf3: offset 64, type 1404, size 1, index 1, binding -1, stages 1
|
||||||
named.memvec2a: offset 72, type 8b50, size 1, index 1, binding -1, stages 1
|
named.memvec2a: offset 72, type 8b50, size 1, index 1, binding -1, stages 1
|
||||||
named.m22: offset 80, type 8b5a, size 7, index 1, binding -1, stages 1
|
named.m22: offset 80, type 8b5a, size 7, index 1, binding -1, stages 1, arrayStride 32, topLevelArrayStride 32
|
||||||
dm22: offset -1, type 8b5a, size 4, index -1, binding -1, stages 1
|
dm22: offset -1, type 8b5a, size 4, index -1, binding -1, stages 1, arrayStride 16, topLevelArrayStride 16
|
||||||
m22: offset 208, type 8b5a, size 3, index 0, binding -1, stages 1
|
m22: offset 208, type 8b5a, size 3, index 0, binding -1, stages 1, arrayStride 32, topLevelArrayStride 32
|
||||||
nested.foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1, stages 1
|
nested.foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1, stages 1
|
||||||
nested.foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1, stages 1
|
nested.foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1, stages 1
|
||||||
nested.foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1, stages 1
|
nested.foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1, stages 1
|
||||||
nested.foo.n2.d: offset 24, type 1406, size 1, index 3, binding -1, stages 1
|
nested.foo.n2.d: offset 24, type 1406, size 1, index 3, binding -1, stages 1
|
||||||
deepA[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepA[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepA[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepA[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepB[1].d2.d1[0].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepB[1].d2.d1[0].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepB[1].d2.d1[1].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepB[1].d2.d1[1].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepB[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepB[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepB[1].d2.d1[3].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepB[1].d2.d1[3].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepB[0].d2.d1[0].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepB[0].d2.d1[0].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepB[0].d2.d1[1].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepB[0].d2.d1[1].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepB[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepB[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepB[0].d2.d1[3].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
|
deepB[0].d2.d1[3].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepC[1].iv4: offset -1, type 8b52, size 1, index -1, binding -1, stages 1
|
deepC[1].iv4: offset -1, type 8b52, size 1, index -1, binding -1, stages 1, topLevelArrayStride 176
|
||||||
deepC[1].d2.i: offset -1, type 1404, size 1, index -1, binding -1, stages 1
|
deepC[1].d2.i: offset -1, type 1404, size 1, index -1, binding -1, stages 1, topLevelArrayStride 176
|
||||||
deepC[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepC[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepC[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepC[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1, topLevelArrayStride 176
|
||||||
deepC[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepC[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepC[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepC[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1, topLevelArrayStride 176
|
||||||
deepC[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepC[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepC[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepC[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1, topLevelArrayStride 176
|
||||||
deepC[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepC[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
|
||||||
deepC[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepC[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1, topLevelArrayStride 176
|
||||||
deepC[1].v3: offset -1, type 8b54, size 1, index -1, binding -1, stages 1
|
deepC[1].v3: offset -1, type 8b54, size 1, index -1, binding -1, stages 1, topLevelArrayStride 176
|
||||||
deepD[0].iv4: offset -1, type 8b52, size 1, index -1, binding -1, stages 1
|
deepD[0].iv4: offset -1, type 8b52, size 1, index -1, binding -1, stages 1
|
||||||
deepD[0].d2.i: offset -1, type 1404, size 1, index -1, binding -1, stages 1
|
deepD[0].d2.i: offset -1, type 1404, size 1, index -1, binding -1, stages 1
|
||||||
deepD[0].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepD[0].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 8
|
||||||
deepD[0].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepD[0].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
||||||
deepD[0].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepD[0].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 8
|
||||||
deepD[0].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepD[0].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
||||||
deepD[0].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepD[0].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 8
|
||||||
deepD[0].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepD[0].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
||||||
deepD[0].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepD[0].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 8
|
||||||
deepD[0].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepD[0].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
||||||
deepD[0].v3: offset -1, type 8b54, size 1, index -1, binding -1, stages 1
|
deepD[0].v3: offset -1, type 8b54, size 1, index -1, binding -1, stages 1
|
||||||
deepD[1].iv4: offset -1, type 8b52, size 1, index -1, binding -1, stages 1
|
deepD[1].iv4: offset -1, type 8b52, size 1, index -1, binding -1, stages 1
|
||||||
deepD[1].d2.i: offset -1, type 1404, size 1, index -1, binding -1, stages 1
|
deepD[1].d2.i: offset -1, type 1404, size 1, index -1, binding -1, stages 1
|
||||||
deepD[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepD[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 8
|
||||||
deepD[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepD[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
||||||
deepD[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepD[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 8
|
||||||
deepD[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepD[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
||||||
deepD[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepD[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 8
|
||||||
deepD[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepD[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
||||||
deepD[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
|
deepD[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 8
|
||||||
deepD[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
deepD[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
|
||||||
deepD[1].v3: offset -1, type 8b54, size 1, index -1, binding -1, stages 1
|
deepD[1].v3: offset -1, type 8b54, size 1, index -1, binding -1, stages 1
|
||||||
abl.foo: offset 0, type 1406, size 1, index 7, binding -1, stages 1
|
abl.foo: offset 0, type 1406, size 1, index 7, binding -1, stages 1
|
||||||
abl2.foo: offset 0, type 1406, size 1, index 11, binding -1, stages 1
|
abl2.foo: offset 0, type 1406, size 1, index 11, binding -1, stages 1
|
||||||
buf1.runtimeArray: offset 4, type 1406, size 4, index 12, binding -1, stages 1
|
buf1.runtimeArray: offset 4, type 1406, size 4, index 12, binding -1, stages 1, arrayStride 4, topLevelArrayStride 4
|
||||||
buf2.runtimeArray.c: offset 8, type 1406, size 1, index 13, binding -1, stages 1
|
buf2.runtimeArray.c: offset 8, type 1406, size 1, index 13, binding -1, stages 1, topLevelArrayStride 12
|
||||||
buf3.runtimeArray: offset 4, type 1406, size 0, index 14, binding -1, stages 1
|
buf3.runtimeArray: offset 4, type 1406, size 0, index 14, binding -1, stages 1, arrayStride 4, topLevelArrayStride 4
|
||||||
buf4.runtimeArray.c: offset 8, type 1406, size 1, index 15, binding -1, stages 1
|
buf4.runtimeArray.c: offset 8, type 1406, size 1, index 15, binding -1, stages 1, topLevelArrayStride 12
|
||||||
nested2.a.n1.a: offset 16, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.a.n1.a: offset 16, type 1406, size 1, index 16, binding -1, stages 1
|
||||||
nested2.a.n2.b: offset 32, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.a.n2.b: offset 32, type 1406, size 1, index 16, binding -1, stages 1
|
||||||
nested2.a.n2.c: offset 36, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.a.n2.c: offset 36, type 1406, size 1, index 16, binding -1, stages 1
|
||||||
nested2.a.n2.d: offset 40, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.a.n2.d: offset 40, type 1406, size 1, index 16, binding -1, stages 1
|
||||||
nested2.b[0].a: offset 48, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.b[0].a: offset 48, type 1406, size 1, index 16, binding -1, stages 1, topLevelArrayStride 16
|
||||||
nested2.b[1].a: offset 64, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.b[1].a: offset 64, type 1406, size 1, index 16, binding -1, stages 1, topLevelArrayStride 16
|
||||||
nested2.b[2].a: offset 80, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.b[2].a: offset 80, type 1406, size 1, index 16, binding -1, stages 1, topLevelArrayStride 16
|
||||||
nested2.b[3].a: offset 96, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.b[3].a: offset 96, type 1406, size 1, index 16, binding -1, stages 1, topLevelArrayStride 16
|
||||||
nested2.c.a: offset 112, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.c.a: offset 112, type 1406, size 1, index 16, binding -1, stages 1, topLevelArrayStride 16
|
||||||
nested2.d.a: offset 144, type 1406, size 1, index 16, binding -1, stages 1
|
nested2.d.a: offset 144, type 1406, size 1, index 16, binding -1, stages 1, topLevelArrayStride 16
|
||||||
|
t.v.position: offset 0, type 1406, size 1, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t.v[0].position: offset 0, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t.v[1].position: offset 24, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t.v[2].position: offset 48, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t.v[0].normal: offset 12, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t.v[1].normal: offset 36, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t.v[2].normal: offset 60, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[0].position: offset 0, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[0].normal: offset 12, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[1].position: offset 24, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[1].normal: offset 36, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[2].position: offset 48, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[0].v[2].normal: offset 60, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[1].v[0].position: offset 72, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[1].v[0].normal: offset 84, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[1].v[1].position: offset 96, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[1].v[1].normal: offset 108, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[1].v[2].position: offset 120, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[1].v[2].normal: offset 132, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[2].v[0].position: offset 144, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[2].v[0].normal: offset 156, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[2].v[1].position: offset 168, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[2].v[1].normal: offset 180, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[2].v[2].position: offset 192, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[2].v[2].normal: offset 204, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[3].v[0].position: offset 216, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[3].v[0].normal: offset 228, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[3].v[1].position: offset 240, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[3].v[1].normal: offset 252, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[3].v[2].position: offset 264, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[3].v[2].normal: offset 276, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[4].v[0].position: offset 288, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[4].v[0].normal: offset 300, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[4].v[1].position: offset 312, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[4].v[1].normal: offset 324, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[4].v[2].position: offset 336, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
|
t[4].v[2].normal: offset 348, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
|
||||||
anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
|
anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
|
||||||
uf1: offset -1, type 1406, size 1, index -1, binding -1, stages 1
|
uf1: offset -1, type 1406, size 1, index -1, binding -1, stages 1
|
||||||
uf2: offset -1, type 1406, size 1, index -1, binding -1, stages 1
|
uf2: offset -1, type 1406, size 1, index -1, binding -1, stages 1
|
||||||
named.member3: offset 32, type 8b52, size 1, index 1, binding -1, stages 1
|
named.member3: offset 32, type 8b52, size 1, index 1, binding -1, stages 1
|
||||||
|
|
||||||
Uniform block reflection:
|
Uniform block reflection:
|
||||||
nameless: offset -1, type ffffffff, size 496, index -1, binding -1, stages 0
|
nameless: offset -1, type ffffffff, size 496, index -1, binding -1, stages 1, numMembers 9
|
||||||
named: offset -1, type ffffffff, size 304, index -1, binding -1, stages 0
|
named: offset -1, type ffffffff, size 304, index -1, binding -1, stages 1, numMembers 10
|
||||||
c_nameless: offset -1, type ffffffff, size 112, index -1, binding -1, stages 0
|
c_nameless: offset -1, type ffffffff, size 112, index -1, binding -1, stages 1, numMembers 5
|
||||||
nested: offset -1, type ffffffff, size 32, index -1, binding -1, stages 0
|
nested: offset -1, type ffffffff, size 32, index -1, binding -1, stages 1, numMembers 4
|
||||||
abl[0]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl[0]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
abl[1]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl[1]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
abl[2]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl[2]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
abl[3]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl[3]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
abl2[0]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl2[0]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
abl2[1]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl2[1]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
abl2[2]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl2[2]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
abl2[3]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
abl2[3]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
|
||||||
buf1: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
buf1: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 2
|
||||||
buf2: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
buf2: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 4
|
||||||
buf3: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
buf3: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 2
|
||||||
buf4: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
|
buf4: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 4
|
||||||
nested2: offset -1, type ffffffff, size 208, index -1, binding -1, stages 0
|
nested2: offset -1, type ffffffff, size 208, index -1, binding -1, stages 1, numMembers 15
|
||||||
|
VertexCollection: offset -1, type ffffffff, size 400, index -1, binding -1, stages 1, numMembers 31
|
||||||
|
|
||||||
Vertex attribute reflection:
|
Buffer variable reflection:
|
||||||
attributeFloat: offset 0, type 1406, size 0, index 0, binding -1, stages 0
|
|
||||||
attributeFloat2: offset 0, type 8b50, size 0, index 0, binding -1, stages 0
|
Buffer block reflection:
|
||||||
attributeFloat3: offset 0, type 8b51, size 0, index 0, binding -1, stages 0
|
|
||||||
attributeFloat4: offset 0, type 8b52, size 0, index 0, binding -1, stages 0
|
Pipeline input reflection:
|
||||||
attributeMat4: offset 0, type 8b5c, size 0, index 0, binding -1, stages 0
|
attributeFloat: offset 0, type 1406, size 0, index 0, binding -1, stages 1
|
||||||
gl_InstanceID: offset 0, type 1404, size 0, index 0, binding -1, stages 0
|
attributeFloat2: offset 0, type 8b50, size 0, index 0, binding -1, stages 1
|
||||||
|
attributeFloat3: offset 0, type 8b51, size 0, index 0, binding -1, stages 1
|
||||||
|
attributeFloat4: offset 0, type 8b52, size 0, index 0, binding -1, stages 1
|
||||||
|
attributeMat4: offset 0, type 8b5c, size 0, index 0, binding -1, stages 1
|
||||||
|
gl_InstanceID: offset 0, type 1404, size 0, index 0, binding -1, stages 1
|
||||||
|
|
||||||
|
Pipeline output reflection:
|
||||||
|
|
||||||
|
8
Test/reflection.frag
Normal file
8
Test/reflection.frag
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#version 440 core
|
||||||
|
|
||||||
|
in float inval;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
float f = inval;
|
||||||
|
}
|
19
Test/reflection.linked.frag
Normal file
19
Test/reflection.linked.frag
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#version 440 core
|
||||||
|
|
||||||
|
layout(binding = 0, std140) uniform ubo_block {
|
||||||
|
float unused_uniform;
|
||||||
|
float shared_uniform;
|
||||||
|
float vsonly_uniform;
|
||||||
|
float fsonly_uniform;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
in float vertout;
|
||||||
|
|
||||||
|
out float fragout;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
fragout = vertout;
|
||||||
|
fragout += ubo.shared_uniform;
|
||||||
|
fragout += ubo.fsonly_uniform;
|
||||||
|
}
|
19
Test/reflection.linked.vert
Normal file
19
Test/reflection.linked.vert
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#version 440 core
|
||||||
|
|
||||||
|
layout(binding = 0, std140) uniform ubo_block {
|
||||||
|
float unused_uniform;
|
||||||
|
float shared_uniform;
|
||||||
|
float vsonly_uniform;
|
||||||
|
float fsonly_uniform;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
in float vertin;
|
||||||
|
|
||||||
|
out float vertout;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vertout = vertin;
|
||||||
|
vertout += ubo.shared_uniform;
|
||||||
|
vertout += ubo.vsonly_uniform;
|
||||||
|
}
|
44
Test/reflection.options.vert
Normal file
44
Test/reflection.options.vert
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#version 440 core
|
||||||
|
|
||||||
|
struct VertexInfo {
|
||||||
|
float position[3];
|
||||||
|
float normal[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TriangleInfo {
|
||||||
|
VertexInfo v[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
buffer VertexCollection {
|
||||||
|
TriangleInfo t[5];
|
||||||
|
uint padding[10];
|
||||||
|
};
|
||||||
|
|
||||||
|
buffer MultipleArrays {
|
||||||
|
TriangleInfo tri[5];
|
||||||
|
VertexInfo vert[5];
|
||||||
|
float f[5];
|
||||||
|
} multiarray;
|
||||||
|
|
||||||
|
uniform UBO {
|
||||||
|
VertexInfo verts[2];
|
||||||
|
float flt[8];
|
||||||
|
uvec4 unused;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
out float outval;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
float f;
|
||||||
|
f += t[0].v[0].position[0];
|
||||||
|
f += t[gl_InstanceID].v[gl_InstanceID].position[gl_InstanceID];
|
||||||
|
f += t[gl_InstanceID].v[gl_InstanceID].normal[gl_InstanceID];
|
||||||
|
f += multiarray.tri[gl_InstanceID].v[0].position[0];
|
||||||
|
f += multiarray.vert[gl_InstanceID].position[0];
|
||||||
|
f += multiarray.f[gl_InstanceID];
|
||||||
|
f += ubo.verts[gl_InstanceID].position[0];
|
||||||
|
f += ubo.flt[gl_InstanceID];
|
||||||
|
TriangleInfo tlocal[5] = t;
|
||||||
|
outval = f;
|
||||||
|
}
|
@ -161,6 +161,22 @@ buffer buf4 {
|
|||||||
N2 runtimeArray[];
|
N2 runtimeArray[];
|
||||||
} buf4i;
|
} buf4i;
|
||||||
|
|
||||||
|
struct VertexInfo {
|
||||||
|
float position[3];
|
||||||
|
float normal[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TriangleInfo {
|
||||||
|
VertexInfo v[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
buffer VertexCollection {
|
||||||
|
TriangleInfo t[5];
|
||||||
|
uint padding[10];
|
||||||
|
};
|
||||||
|
|
||||||
|
out float outval;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
liveFunction1(image_ui2D, sampler_2D, sampler_2DMSArray);
|
liveFunction1(image_ui2D, sampler_2D, sampler_2DMSArray);
|
||||||
@ -216,4 +232,11 @@ void main()
|
|||||||
N1 b[4] = nest2.b;
|
N1 b[4] = nest2.b;
|
||||||
f += nest2.c[1].a;
|
f += nest2.c[1].a;
|
||||||
f += nest2.d[gl_InstanceID].a;
|
f += nest2.d[gl_InstanceID].a;
|
||||||
|
|
||||||
|
f += t[0].v[0].position[0];
|
||||||
|
f += t[gl_InstanceID].v[gl_InstanceID].position[gl_InstanceID];
|
||||||
|
f += t[gl_InstanceID].v[gl_InstanceID].normal[gl_InstanceID];
|
||||||
|
TriangleInfo tlocal[5] = t;
|
||||||
|
|
||||||
|
outval = f;
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,16 @@ diff -b $BASEDIR/badMacroArgs.frag.out $TARGETDIR/badMacroArgs.frag.out || HASER
|
|||||||
echo Running reflection...
|
echo Running reflection...
|
||||||
$EXE -l -q -C reflection.vert > $TARGETDIR/reflection.vert.out
|
$EXE -l -q -C reflection.vert > $TARGETDIR/reflection.vert.out
|
||||||
diff -b $BASEDIR/reflection.vert.out $TARGETDIR/reflection.vert.out || HASERROR=1
|
diff -b $BASEDIR/reflection.vert.out $TARGETDIR/reflection.vert.out || HASERROR=1
|
||||||
|
$EXE -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables reflection.options.vert > $TARGETDIR/reflection.options.vert.out
|
||||||
|
diff -b $BASEDIR/reflection.options.vert.out $TARGETDIR/reflection.options.vert.out || HASERROR=1
|
||||||
|
$EXE -l -q -C reflection.frag > $TARGETDIR/reflection.frag.out
|
||||||
|
diff -b $BASEDIR/reflection.frag.out $TARGETDIR/reflection.frag.out || HASERROR=1
|
||||||
|
$EXE -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables reflection.frag > $TARGETDIR/reflection.options.frag.out
|
||||||
|
diff -b $BASEDIR/reflection.options.frag.out $TARGETDIR/reflection.options.frag.out || HASERROR=1
|
||||||
|
$EXE -l -q -C reflection.linked.vert reflection.linked.frag > $TARGETDIR/reflection.linked.out
|
||||||
|
diff -b $BASEDIR/reflection.linked.out $TARGETDIR/reflection.linked.out || HASERROR=1
|
||||||
|
$EXE -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables reflection.linked.vert reflection.linked.frag > $TARGETDIR/reflection.linked.options.out
|
||||||
|
diff -b $BASEDIR/reflection.linked.options.out $TARGETDIR/reflection.linked.options.out || HASERROR=1
|
||||||
$EXE -D -Od -e flizv -l -q -C -V -Od hlsl.reflection.vert > $TARGETDIR/hlsl.reflection.vert.out
|
$EXE -D -Od -e flizv -l -q -C -V -Od hlsl.reflection.vert > $TARGETDIR/hlsl.reflection.vert.out
|
||||||
diff -b $BASEDIR/hlsl.reflection.vert.out $TARGETDIR/hlsl.reflection.vert.out || HASERROR=1
|
diff -b $BASEDIR/hlsl.reflection.vert.out $TARGETDIR/hlsl.reflection.vert.out || HASERROR=1
|
||||||
$EXE -D -Od -e main -l -q -C -V -Od hlsl.reflection.binding.frag > $TARGETDIR/hlsl.reflection.binding.frag.out
|
$EXE -D -Od -e main -l -q -C -V -Od hlsl.reflection.binding.frag > $TARGETDIR/hlsl.reflection.binding.frag.out
|
||||||
|
@ -1966,12 +1966,27 @@ const char* TProgram::getInfoDebugLog()
|
|||||||
// Reflection implementation.
|
// Reflection implementation.
|
||||||
//
|
//
|
||||||
|
|
||||||
bool TProgram::buildReflection()
|
bool TProgram::buildReflection(int opts)
|
||||||
{
|
{
|
||||||
if (! linked || reflection)
|
if (! linked || reflection)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
reflection = new TReflection;
|
int firstStage = EShLangVertex, lastStage = EShLangFragment;
|
||||||
|
|
||||||
|
if (opts & EShReflectionIntermediateIO) {
|
||||||
|
// if we're reflecting intermediate I/O, determine the first and last stage linked and use those as the
|
||||||
|
// boundaries for which stages generate pipeline inputs/outputs
|
||||||
|
firstStage = EShLangCount;
|
||||||
|
lastStage = 0;
|
||||||
|
for (int s = 0; s < EShLangCount; ++s) {
|
||||||
|
if (intermediate[s]) {
|
||||||
|
firstStage = std::min(firstStage, s);
|
||||||
|
lastStage = std::max(lastStage, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reflection = new TReflection((EShReflectionOptions)opts, (EShLanguage)firstStage, (EShLanguage)lastStage);
|
||||||
|
|
||||||
for (int s = 0; s < EShLangCount; ++s) {
|
for (int s = 0; s < EShLangCount; ++s) {
|
||||||
if (intermediate[s]) {
|
if (intermediate[s]) {
|
||||||
@ -1983,27 +1998,23 @@ bool TProgram::buildReflection()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TProgram::getNumLiveUniformVariables() const { return reflection->getNumUniforms(); }
|
|
||||||
int TProgram::getNumLiveUniformBlocks() const { return reflection->getNumUniformBlocks(); }
|
|
||||||
const char* TProgram::getUniformName(int index) const { return reflection->getUniform(index).name.c_str(); }
|
|
||||||
const char* TProgram::getUniformBlockName(int index) const { return reflection->getUniformBlock(index).name.c_str(); }
|
|
||||||
int TProgram::getUniformBlockSize(int index) const { return reflection->getUniformBlock(index).size; }
|
|
||||||
int TProgram::getUniformIndex(const char* name) const { return reflection->getIndex(name); }
|
|
||||||
int TProgram::getUniformBinding(int index) const { return reflection->getUniform(index).getBinding(); }
|
|
||||||
EShLanguageMask TProgram::getUniformStages(int index) const { return reflection->getUniform(index).stages; }
|
|
||||||
int TProgram::getUniformBlockBinding(int index) const { return reflection->getUniformBlock(index).getBinding(); }
|
|
||||||
int TProgram::getUniformBlockIndex(int index) const { return reflection->getUniform(index).index; }
|
|
||||||
int TProgram::getUniformBlockCounterIndex(int index) const { return reflection->getUniformBlock(index).counterIndex; }
|
|
||||||
int TProgram::getUniformType(int index) const { return reflection->getUniform(index).glDefineType; }
|
|
||||||
int TProgram::getUniformBufferOffset(int index) const { return reflection->getUniform(index).offset; }
|
|
||||||
int TProgram::getUniformArraySize(int index) const { return reflection->getUniform(index).size; }
|
|
||||||
int TProgram::getNumLiveAttributes() const { return reflection->getNumAttributes(); }
|
|
||||||
const char* TProgram::getAttributeName(int index) const { return reflection->getAttribute(index).name.c_str(); }
|
|
||||||
int TProgram::getAttributeType(int index) const { return reflection->getAttribute(index).glDefineType; }
|
|
||||||
const TType* TProgram::getAttributeTType(int index) const { return reflection->getAttribute(index).getType(); }
|
|
||||||
const TType* TProgram::getUniformTType(int index) const { return reflection->getUniform(index).getType(); }
|
|
||||||
const TType* TProgram::getUniformBlockTType(int index) const { return reflection->getUniformBlock(index).getType(); }
|
|
||||||
unsigned TProgram::getLocalSize(int dim) const { return reflection->getLocalSize(dim); }
|
unsigned TProgram::getLocalSize(int dim) const { return reflection->getLocalSize(dim); }
|
||||||
|
int TProgram::getReflectionIndex(const char* name) const { return reflection->getIndex(name); }
|
||||||
|
|
||||||
|
int TProgram::getNumUniformVariables() const { return reflection->getNumUniforms(); }
|
||||||
|
const TObjectReflection& TProgram::getUniform(int index) const { return reflection->getUniform(index); }
|
||||||
|
int TProgram::getNumUniformBlocks() const { return reflection->getNumUniformBlocks(); }
|
||||||
|
const TObjectReflection& TProgram::getUniformBlock(int index) const { return reflection->getUniformBlock(index); }
|
||||||
|
int TProgram::getNumPipeInputs() const { return reflection->getNumPipeInputs(); }
|
||||||
|
const TObjectReflection& TProgram::getPipeInput(int index) const { return reflection->getPipeInput(index); }
|
||||||
|
int TProgram::getNumPipeOutputs() const { return reflection->getNumPipeOutputs(); }
|
||||||
|
const TObjectReflection& TProgram::getPipeOutput(int index) const { return reflection->getPipeOutput(index); }
|
||||||
|
int TProgram::getNumBufferVariables() const { return reflection->getNumBufferVariables(); }
|
||||||
|
const TObjectReflection& TProgram::getBufferVariable(int index) const { return reflection->getBufferVariable(index); }
|
||||||
|
int TProgram::getNumBufferBlocks() const { return reflection->getNumStorageBuffers(); }
|
||||||
|
const TObjectReflection& TProgram::getBufferBlock(int index) const { return reflection->getStorageBufferBlock(index); }
|
||||||
|
int TProgram::getNumAtomicCounters() const { return reflection->getNumAtomicCounters(); }
|
||||||
|
const TObjectReflection& TProgram::getAtomicCounter(int index) const { return reflection->getAtomicCounter(index); }
|
||||||
|
|
||||||
void TProgram::dumpReflection() { reflection->dump(); }
|
void TProgram::dumpReflection() { reflection->dump(); }
|
||||||
|
|
||||||
|
@ -93,11 +93,12 @@ public:
|
|||||||
// Use a degenerate (empty) set of dereferences to immediately put as at the end of
|
// Use a degenerate (empty) set of dereferences to immediately put as at the end of
|
||||||
// the dereference change expected by blowUpActiveAggregate.
|
// the dereference change expected by blowUpActiveAggregate.
|
||||||
TList<TIntermBinary*> derefs;
|
TList<TIntermBinary*> derefs;
|
||||||
blowUpActiveAggregate(base.getType(), base.getName(), derefs, derefs.end(), -1, -1, 0);
|
blowUpActiveAggregate(base.getType(), base.getName(), derefs, derefs.end(), -1, -1, 0, 0,
|
||||||
|
base.getQualifier().storage, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void addAttribute(const TIntermSymbol& base)
|
void addPipeInput(const TIntermSymbol& base)
|
||||||
{
|
{
|
||||||
if (processedDerefs.find(&base) == processedDerefs.end()) {
|
if (processedDerefs.find(&base) == processedDerefs.end()) {
|
||||||
processedDerefs.insert(&base);
|
processedDerefs.insert(&base);
|
||||||
@ -107,8 +108,36 @@ public:
|
|||||||
|
|
||||||
TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());
|
TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());
|
||||||
if (it == reflection.nameToIndex.end()) {
|
if (it == reflection.nameToIndex.end()) {
|
||||||
reflection.nameToIndex[name.c_str()] = (int)reflection.indexToAttribute.size();
|
reflection.nameToIndex[name.c_str()] = (int)reflection.indexToPipeInput.size();
|
||||||
reflection.indexToAttribute.push_back(TObjectReflection(name.c_str(), type, 0, mapToGlType(type), 0, 0));
|
reflection.indexToPipeInput.push_back(TObjectReflection(name.c_str(), type, 0, mapToGlType(type), 0, 0));
|
||||||
|
|
||||||
|
EShLanguageMask& stages = reflection.indexToPipeInput.back().stages;
|
||||||
|
stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
|
||||||
|
} else {
|
||||||
|
EShLanguageMask& stages = reflection.indexToPipeInput[it->second].stages;
|
||||||
|
stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addPipeOutput(const TIntermSymbol& base)
|
||||||
|
{
|
||||||
|
if (processedDerefs.find(&base) == processedDerefs.end()) {
|
||||||
|
processedDerefs.insert(&base);
|
||||||
|
|
||||||
|
const TString &name = base.getName();
|
||||||
|
const TType &type = base.getType();
|
||||||
|
|
||||||
|
TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());
|
||||||
|
if (it == reflection.nameToIndex.end()) {
|
||||||
|
reflection.nameToIndex[name.c_str()] = (int)reflection.indexToPipeOutput.size();
|
||||||
|
reflection.indexToPipeOutput.push_back(TObjectReflection(name.c_str(), type, 0, mapToGlType(type), 0, 0));
|
||||||
|
|
||||||
|
EShLanguageMask& stages = reflection.indexToPipeOutput.back().stages;
|
||||||
|
stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
|
||||||
|
} else {
|
||||||
|
EShLanguageMask& stages = reflection.indexToPipeOutput[it->second].stages;
|
||||||
|
stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -213,6 +242,36 @@ public:
|
|||||||
return lastOffset + lastMemberSize;
|
return lastOffset + lastMemberSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// count the total number of leaf members from iterating out of a block type
|
||||||
|
int countAggregateMembers(const TType& parentType)
|
||||||
|
{
|
||||||
|
if (! parentType.isStruct())
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
const bool strictArraySuffix = (reflection.options & EShReflectionStrictArraySuffix);
|
||||||
|
|
||||||
|
bool blockParent = (parentType.getBasicType() == EbtBlock && parentType.getQualifier().storage == EvqBuffer);
|
||||||
|
|
||||||
|
const TTypeList &memberList = *parentType.getStruct();
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < memberList.size(); i++)
|
||||||
|
{
|
||||||
|
const TType &memberType = *memberList[i].type;
|
||||||
|
int numMembers = countAggregateMembers(memberType);
|
||||||
|
// for sized arrays of structs, apply logic to expand out the same as we would below in
|
||||||
|
// blowUpActiveAggregate
|
||||||
|
if (memberType.isArray() && ! memberType.getArraySizes()->hasUnsized() && memberType.isStruct()) {
|
||||||
|
if (! strictArraySuffix || ! blockParent)
|
||||||
|
numMembers *= memberType.getArraySizes()->getCumulativeSize();
|
||||||
|
}
|
||||||
|
ret += numMembers;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
// Traverse the provided deref chain, including the base, and
|
// Traverse the provided deref chain, including the base, and
|
||||||
// - build a full reflection-granularity name, array size, etc. entry out of it, if it goes down to that granularity
|
// - build a full reflection-granularity name, array size, etc. entry out of it, if it goes down to that granularity
|
||||||
// - recursively expand any variable array index in the middle of that traversal
|
// - recursively expand any variable array index in the middle of that traversal
|
||||||
@ -221,8 +280,19 @@ public:
|
|||||||
// arraySize tracks, just for the final dereference in the chain, if there was a specific known size.
|
// arraySize tracks, just for the final dereference in the chain, if there was a specific known size.
|
||||||
// A value of 0 for arraySize will mean to use the full array's size.
|
// A value of 0 for arraySize will mean to use the full array's size.
|
||||||
void blowUpActiveAggregate(const TType& baseType, const TString& baseName, const TList<TIntermBinary*>& derefs,
|
void blowUpActiveAggregate(const TType& baseType, const TString& baseName, const TList<TIntermBinary*>& derefs,
|
||||||
TList<TIntermBinary*>::const_iterator deref, int offset, int blockIndex, int arraySize)
|
TList<TIntermBinary*>::const_iterator deref, int offset, int blockIndex, int arraySize,
|
||||||
|
int topLevelArrayStride, TStorageQualifier baseStorage, bool active)
|
||||||
{
|
{
|
||||||
|
// when strictArraySuffix is enabled, we closely follow the rules from ARB_program_interface_query.
|
||||||
|
// Broadly:
|
||||||
|
// * arrays-of-structs always have a [x] suffix.
|
||||||
|
// * with array-of-struct variables in the root of a buffer block, only ever return [0].
|
||||||
|
// * otherwise, array suffixes are added whenever we iterate, even if that means expanding out an array.
|
||||||
|
const bool strictArraySuffix = (reflection.options & EShReflectionStrictArraySuffix);
|
||||||
|
|
||||||
|
// is this variable inside a buffer block. This flag is set back to false after we iterate inside the first array element.
|
||||||
|
bool blockParent = (baseType.getBasicType() == EbtBlock && baseType.getQualifier().storage == EvqBuffer);
|
||||||
|
|
||||||
// process the part of the dereference chain that was explicit in the shader
|
// process the part of the dereference chain that was explicit in the shader
|
||||||
TString name = baseName;
|
TString name = baseName;
|
||||||
const TType* terminalType = &baseType;
|
const TType* terminalType = &baseType;
|
||||||
@ -234,15 +304,21 @@ public:
|
|||||||
case EOpIndexIndirect: {
|
case EOpIndexIndirect: {
|
||||||
int stride = getArrayStride(baseType, visitNode->getLeft()->getType());
|
int stride = getArrayStride(baseType, visitNode->getLeft()->getType());
|
||||||
|
|
||||||
|
if (topLevelArrayStride == 0)
|
||||||
|
topLevelArrayStride = stride;
|
||||||
|
|
||||||
// Visit all the indices of this array, and for each one add on the remaining dereferencing
|
// Visit all the indices of this array, and for each one add on the remaining dereferencing
|
||||||
for (int i = 0; i < std::max(visitNode->getLeft()->getType().getOuterArraySize(), 1); ++i) {
|
for (int i = 0; i < std::max(visitNode->getLeft()->getType().getOuterArraySize(), 1); ++i) {
|
||||||
TString newBaseName = name;
|
TString newBaseName = name;
|
||||||
if (baseType.getBasicType() != EbtBlock)
|
if (strictArraySuffix && blockParent)
|
||||||
|
newBaseName.append(TString("[0]"));
|
||||||
|
else if (strictArraySuffix || baseType.getBasicType() != EbtBlock)
|
||||||
newBaseName.append(TString("[") + String(i) + "]");
|
newBaseName.append(TString("[") + String(i) + "]");
|
||||||
TList<TIntermBinary*>::const_iterator nextDeref = deref;
|
TList<TIntermBinary*>::const_iterator nextDeref = deref;
|
||||||
++nextDeref;
|
++nextDeref;
|
||||||
TType derefType(*terminalType, 0);
|
TType derefType(*terminalType, 0);
|
||||||
blowUpActiveAggregate(derefType, newBaseName, derefs, nextDeref, offset, blockIndex, arraySize);
|
blowUpActiveAggregate(derefType, newBaseName, derefs, nextDeref, offset, blockIndex, arraySize,
|
||||||
|
topLevelArrayStride, baseStorage, active);
|
||||||
|
|
||||||
if (offset >= 0)
|
if (offset >= 0)
|
||||||
offset += stride;
|
offset += stride;
|
||||||
@ -251,15 +327,25 @@ public:
|
|||||||
// it was all completed in the recursive calls above
|
// it was all completed in the recursive calls above
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case EOpIndexDirect:
|
case EOpIndexDirect: {
|
||||||
|
int stride = getArrayStride(baseType, visitNode->getLeft()->getType());
|
||||||
|
|
||||||
index = visitNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();
|
index = visitNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();
|
||||||
if (baseType.getBasicType() != EbtBlock) {
|
if (strictArraySuffix && blockParent) {
|
||||||
|
name.append(TString("[0]"));
|
||||||
|
} else if (strictArraySuffix || baseType.getBasicType() != EbtBlock) {
|
||||||
name.append(TString("[") + String(index) + "]");
|
name.append(TString("[") + String(index) + "]");
|
||||||
|
|
||||||
if (offset >= 0)
|
if (offset >= 0)
|
||||||
offset += getArrayStride(baseType, visitNode->getLeft()->getType()) * index;
|
offset += stride * index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (topLevelArrayStride == 0)
|
||||||
|
topLevelArrayStride = stride;
|
||||||
|
|
||||||
|
blockParent = false;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case EOpIndexDirectStruct:
|
case EOpIndexDirectStruct:
|
||||||
index = visitNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();
|
index = visitNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();
|
||||||
if (offset >= 0)
|
if (offset >= 0)
|
||||||
@ -286,13 +372,24 @@ public:
|
|||||||
if (offset >= 0)
|
if (offset >= 0)
|
||||||
stride = getArrayStride(baseType, *terminalType);
|
stride = getArrayStride(baseType, *terminalType);
|
||||||
|
|
||||||
for (int i = 0; i < std::max(terminalType->getOuterArraySize(), 1); ++i) {
|
if (topLevelArrayStride == 0)
|
||||||
|
topLevelArrayStride = stride;
|
||||||
|
|
||||||
|
int arrayIterateSize = std::max(terminalType->getOuterArraySize(), 1);
|
||||||
|
|
||||||
|
// for top-level arrays in blocks, only expand [0] to avoid explosion of items
|
||||||
|
if (strictArraySuffix && blockParent)
|
||||||
|
arrayIterateSize = 1;
|
||||||
|
|
||||||
|
for (int i = 0; i < arrayIterateSize; ++i) {
|
||||||
TString newBaseName = name;
|
TString newBaseName = name;
|
||||||
newBaseName.append(TString("[") + String(i) + "]");
|
newBaseName.append(TString("[") + String(i) + "]");
|
||||||
TType derefType(*terminalType, 0);
|
TType derefType(*terminalType, 0);
|
||||||
if (offset >= 0)
|
if (offset >= 0)
|
||||||
offset = baseOffset + stride * i;
|
offset = baseOffset + stride * i;
|
||||||
blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), offset, blockIndex, 0);
|
|
||||||
|
blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), offset, blockIndex, 0,
|
||||||
|
topLevelArrayStride, baseStorage, active);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Visit all members of this aggregate, and for each one,
|
// Visit all members of this aggregate, and for each one,
|
||||||
@ -308,11 +405,21 @@ public:
|
|||||||
|
|
||||||
for (int i = 0; i < (int)typeList.size(); ++i) {
|
for (int i = 0; i < (int)typeList.size(); ++i) {
|
||||||
TString newBaseName = name;
|
TString newBaseName = name;
|
||||||
newBaseName.append(TString(".") + typeList[i].type->getFieldName());
|
if (newBaseName.size() > 0)
|
||||||
|
newBaseName.append(".");
|
||||||
|
newBaseName.append(typeList[i].type->getFieldName());
|
||||||
TType derefType(*terminalType, i);
|
TType derefType(*terminalType, i);
|
||||||
if (offset >= 0)
|
if (offset >= 0)
|
||||||
offset = baseOffset + memberOffsets[i];
|
offset = baseOffset + memberOffsets[i];
|
||||||
blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), offset, blockIndex, 0);
|
|
||||||
|
int arrayStride = topLevelArrayStride;
|
||||||
|
if (terminalType->getBasicType() == EbtBlock && terminalType->getQualifier().storage == EvqBuffer &&
|
||||||
|
derefType.isArray()) {
|
||||||
|
arrayStride = getArrayStride(baseType, derefType);
|
||||||
|
}
|
||||||
|
|
||||||
|
blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), offset, blockIndex, 0,
|
||||||
|
arrayStride, baseStorage, active);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,6 +427,10 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((reflection.options & EShReflectionBasicArraySuffix) && terminalType->isArray()) {
|
||||||
|
name.append(TString("[0]"));
|
||||||
|
}
|
||||||
|
|
||||||
// Finally, add a full string to the reflection database, and update the array size if necessary.
|
// Finally, add a full string to the reflection database, and update the array size if necessary.
|
||||||
// If the dereferenced entity to record is an array, compute the size and update the maximum size.
|
// If the dereferenced entity to record is an array, compute the size and update the maximum size.
|
||||||
|
|
||||||
@ -327,16 +438,40 @@ public:
|
|||||||
if (arraySize == 0)
|
if (arraySize == 0)
|
||||||
arraySize = mapToGlArraySize(*terminalType);
|
arraySize = mapToGlArraySize(*terminalType);
|
||||||
|
|
||||||
|
TReflection::TMapIndexToReflection& variables = reflection.GetVariableMapForStorage(baseStorage);
|
||||||
|
|
||||||
TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());
|
TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());
|
||||||
if (it == reflection.nameToIndex.end()) {
|
if (it == reflection.nameToIndex.end()) {
|
||||||
reflection.nameToIndex[name.c_str()] = (int)reflection.indexToUniform.size();
|
int uniformIndex = (int)variables.size();
|
||||||
reflection.indexToUniform.push_back(TObjectReflection(name.c_str(), *terminalType, offset,
|
reflection.nameToIndex[name.c_str()] = uniformIndex;
|
||||||
mapToGlType(*terminalType),
|
variables.push_back(TObjectReflection(name.c_str(), *terminalType, offset, mapToGlType(*terminalType),
|
||||||
arraySize, blockIndex));
|
arraySize, blockIndex));
|
||||||
} else if (arraySize > 1) {
|
if (terminalType->isArray()) {
|
||||||
int& reflectedArraySize = reflection.indexToUniform[it->second].size;
|
variables.back().arrayStride = getArrayStride(baseType, *terminalType);
|
||||||
|
if (topLevelArrayStride == 0)
|
||||||
|
topLevelArrayStride = variables.back().arrayStride;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((reflection.options & EShReflectionSeparateBuffers) && terminalType->getBasicType() == EbtAtomicUint)
|
||||||
|
reflection.atomicCounterUniformIndices.push_back(uniformIndex);
|
||||||
|
|
||||||
|
variables.back().topLevelArrayStride = topLevelArrayStride;
|
||||||
|
|
||||||
|
if ((reflection.options & EShReflectionAllBlockVariables) && active) {
|
||||||
|
EShLanguageMask& stages = variables.back().stages;
|
||||||
|
stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (arraySize > 1) {
|
||||||
|
int& reflectedArraySize = variables[it->second].size;
|
||||||
reflectedArraySize = std::max(arraySize, reflectedArraySize);
|
reflectedArraySize = std::max(arraySize, reflectedArraySize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((reflection.options & EShReflectionAllBlockVariables) && active) {
|
||||||
|
EShLanguageMask& stages = variables[it->second].stages;
|
||||||
|
stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a uniform dereference where blocks/struct/arrays are involved in the access.
|
// Add a uniform dereference where blocks/struct/arrays are involved in the access.
|
||||||
@ -385,6 +520,10 @@ public:
|
|||||||
anonymous = IsAnonymous(base->getName());
|
anonymous = IsAnonymous(base->getName());
|
||||||
|
|
||||||
const TString& blockName = base->getType().getTypeName();
|
const TString& blockName = base->getType().getTypeName();
|
||||||
|
TString baseName;
|
||||||
|
|
||||||
|
if (! anonymous)
|
||||||
|
baseName = blockName;
|
||||||
|
|
||||||
if (base->getType().isArray()) {
|
if (base->getType().isArray()) {
|
||||||
TType derefType(base->getType(), 0);
|
TType derefType(base->getType(), 0);
|
||||||
@ -393,8 +532,56 @@ public:
|
|||||||
for (int e = 0; e < base->getType().getCumulativeArraySize(); ++e)
|
for (int e = 0; e < base->getType().getCumulativeArraySize(); ++e)
|
||||||
blockIndex = addBlockName(blockName + "[" + String(e) + "]", derefType,
|
blockIndex = addBlockName(blockName + "[" + String(e) + "]", derefType,
|
||||||
getBlockSize(base->getType()));
|
getBlockSize(base->getType()));
|
||||||
|
baseName.append(TString("[0]"));
|
||||||
} else
|
} else
|
||||||
blockIndex = addBlockName(blockName, base->getType(), getBlockSize(base->getType()));
|
blockIndex = addBlockName(blockName, base->getType(), getBlockSize(base->getType()));
|
||||||
|
|
||||||
|
if (reflection.options & EShReflectionAllBlockVariables) {
|
||||||
|
// Use a degenerate (empty) set of dereferences to immediately put as at the end of
|
||||||
|
// the dereference change expected by blowUpActiveAggregate.
|
||||||
|
TList<TIntermBinary*> derefs;
|
||||||
|
|
||||||
|
// because we don't have any derefs, the first thing blowUpActiveAggregate will do is iterate over each
|
||||||
|
// member in the struct definition. This will lose any information about whether the parent was a buffer
|
||||||
|
// block. So if we're using strict array rules which don't expand the first child of a buffer block we
|
||||||
|
// instead iterate over the children here.
|
||||||
|
const bool strictArraySuffix = (reflection.options & EShReflectionStrictArraySuffix);
|
||||||
|
bool blockParent = (base->getType().getBasicType() == EbtBlock && base->getQualifier().storage == EvqBuffer);
|
||||||
|
|
||||||
|
if (strictArraySuffix && blockParent) {
|
||||||
|
const TTypeList& typeList = *base->getType().getStruct();
|
||||||
|
|
||||||
|
TVector<int> memberOffsets;
|
||||||
|
|
||||||
|
memberOffsets.resize(typeList.size());
|
||||||
|
getOffsets(base->getType(), memberOffsets);
|
||||||
|
|
||||||
|
for (int i = 0; i < (int)typeList.size(); ++i) {
|
||||||
|
TType derefType(base->getType(), i);
|
||||||
|
TString name = baseName;
|
||||||
|
if (name.size() > 0)
|
||||||
|
name.append(".");
|
||||||
|
name.append(typeList[i].type->getFieldName());
|
||||||
|
|
||||||
|
// if this member is an array, store the top-level array stride but start the explosion from
|
||||||
|
// the inner struct type.
|
||||||
|
if (derefType.isArray() && derefType.isStruct()) {
|
||||||
|
name.append("[0]");
|
||||||
|
blowUpActiveAggregate(TType(derefType, 0), name, derefs, derefs.end(), memberOffsets[i],
|
||||||
|
blockIndex, 0, getArrayStride(base->getType(), derefType),
|
||||||
|
base->getQualifier().storage, false);
|
||||||
|
} else {
|
||||||
|
blowUpActiveAggregate(derefType, name, derefs, derefs.end(), memberOffsets[i], blockIndex,
|
||||||
|
0, 0, base->getQualifier().storage, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// otherwise - if we're not using strict array suffix rules, or this isn't a block so we are
|
||||||
|
// expanding root arrays anyway, just start the iteration from the base block type.
|
||||||
|
blowUpActiveAggregate(base->getType(), baseName, derefs, derefs.end(), 0, blockIndex, 0, 0,
|
||||||
|
base->getQualifier().storage, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process the dereference chain, backward, accumulating the pieces for later forward traversal.
|
// Process the dereference chain, backward, accumulating the pieces for later forward traversal.
|
||||||
@ -424,20 +611,32 @@ public:
|
|||||||
else
|
else
|
||||||
baseName = base->getName();
|
baseName = base->getName();
|
||||||
}
|
}
|
||||||
blowUpActiveAggregate(base->getType(), baseName, derefs, derefs.begin(), offset, blockIndex, arraySize);
|
blowUpActiveAggregate(base->getType(), baseName, derefs, derefs.begin(), offset, blockIndex, arraySize, 0,
|
||||||
|
base->getQualifier().storage, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
int addBlockName(const TString& name, const TType& type, int size)
|
int addBlockName(const TString& name, const TType& type, int size)
|
||||||
{
|
{
|
||||||
|
TReflection::TMapIndexToReflection& blocks = reflection.GetBlockMapForStorage(type.getQualifier().storage);
|
||||||
|
|
||||||
int blockIndex;
|
int blockIndex;
|
||||||
TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());
|
TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());
|
||||||
if (reflection.nameToIndex.find(name.c_str()) == reflection.nameToIndex.end()) {
|
if (reflection.nameToIndex.find(name.c_str()) == reflection.nameToIndex.end()) {
|
||||||
blockIndex = (int)reflection.indexToUniformBlock.size();
|
blockIndex = (int)blocks.size();
|
||||||
reflection.nameToIndex[name.c_str()] = blockIndex;
|
reflection.nameToIndex[name.c_str()] = blockIndex;
|
||||||
reflection.indexToUniformBlock.push_back(TObjectReflection(name.c_str(), type, -1, -1, size, -1));
|
blocks.push_back(TObjectReflection(name.c_str(), type, -1, -1, size, -1));
|
||||||
} else
|
|
||||||
|
blocks.back().numMembers = countAggregateMembers(type);
|
||||||
|
|
||||||
|
EShLanguageMask& stages = blocks.back().stages;
|
||||||
|
stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
|
||||||
|
} else {
|
||||||
blockIndex = it->second;
|
blockIndex = it->second;
|
||||||
|
|
||||||
|
EShLanguageMask& stages = blocks[blockIndex].stages;
|
||||||
|
stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
|
||||||
|
}
|
||||||
|
|
||||||
return blockIndex;
|
return blockIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -828,8 +1027,49 @@ void TReflectionTraverser::visitSymbol(TIntermSymbol* base)
|
|||||||
if (base->getQualifier().storage == EvqUniform)
|
if (base->getQualifier().storage == EvqUniform)
|
||||||
addUniform(*base);
|
addUniform(*base);
|
||||||
|
|
||||||
if (intermediate.getStage() == EShLangVertex && base->getQualifier().isPipeInput())
|
if (intermediate.getStage() == reflection.firstStage && base->getQualifier().isPipeInput())
|
||||||
addAttribute(*base);
|
addPipeInput(*base);
|
||||||
|
|
||||||
|
if (intermediate.getStage() == reflection.lastStage && base->getQualifier().isPipeOutput())
|
||||||
|
addPipeOutput(*base);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Implement TObjectReflection methods.
|
||||||
|
//
|
||||||
|
|
||||||
|
TObjectReflection::TObjectReflection(const std::string &pName, const TType &pType, int pOffset, int pGLDefineType,
|
||||||
|
int pSize, int pIndex)
|
||||||
|
: name(pName), offset(pOffset), glDefineType(pGLDefineType), size(pSize), index(pIndex), counterIndex(-1),
|
||||||
|
numMembers(-1), arrayStride(0), topLevelArrayStride(0), stages(EShLanguageMask(0)), type(pType.clone())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int TObjectReflection::getBinding() const
|
||||||
|
{
|
||||||
|
if (type == nullptr || !type->getQualifier().hasBinding())
|
||||||
|
return -1;
|
||||||
|
return type->getQualifier().layoutBinding;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TObjectReflection::dump() const
|
||||||
|
{
|
||||||
|
printf("%s: offset %d, type %x, size %d, index %d, binding %d, stages %d", name.c_str(), offset, glDefineType, size,
|
||||||
|
index, getBinding(), stages);
|
||||||
|
|
||||||
|
if (counterIndex != -1)
|
||||||
|
printf(", counter %d", counterIndex);
|
||||||
|
|
||||||
|
if (numMembers != -1)
|
||||||
|
printf(", numMembers %d", numMembers);
|
||||||
|
|
||||||
|
if (arrayStride != 0)
|
||||||
|
printf(", arrayStride %d", arrayStride);
|
||||||
|
|
||||||
|
if (topLevelArrayStride != 0)
|
||||||
|
printf(", topLevelArrayStride %d", topLevelArrayStride);
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -863,9 +1103,17 @@ void TReflection::buildCounterIndices(const TIntermediate& intermediate)
|
|||||||
// build Shader Stages mask for all uniforms
|
// build Shader Stages mask for all uniforms
|
||||||
void TReflection::buildUniformStageMask(const TIntermediate& intermediate)
|
void TReflection::buildUniformStageMask(const TIntermediate& intermediate)
|
||||||
{
|
{
|
||||||
|
if (options & EShReflectionAllBlockVariables)
|
||||||
|
return;
|
||||||
|
|
||||||
for (int i = 0; i < int(indexToUniform.size()); ++i) {
|
for (int i = 0; i < int(indexToUniform.size()); ++i) {
|
||||||
indexToUniform[i].stages = static_cast<EShLanguageMask>(indexToUniform[i].stages | 1 << intermediate.getStage());
|
indexToUniform[i].stages = static_cast<EShLanguageMask>(indexToUniform[i].stages | 1 << intermediate.getStage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < int(indexToBufferVariable.size()); ++i) {
|
||||||
|
indexToBufferVariable[i].stages =
|
||||||
|
static_cast<EShLanguageMask>(indexToBufferVariable[i].stages | 1 << intermediate.getStage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge live symbols from 'intermediate' into the existing reflection database.
|
// Merge live symbols from 'intermediate' into the existing reflection database.
|
||||||
@ -910,9 +1158,24 @@ void TReflection::dump()
|
|||||||
indexToUniformBlock[i].dump();
|
indexToUniformBlock[i].dump();
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
printf("Vertex attribute reflection:\n");
|
printf("Buffer variable reflection:\n");
|
||||||
for (size_t i = 0; i < indexToAttribute.size(); ++i)
|
for (size_t i = 0; i < indexToBufferVariable.size(); ++i)
|
||||||
indexToAttribute[i].dump();
|
indexToBufferVariable[i].dump();
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf("Buffer block reflection:\n");
|
||||||
|
for (size_t i = 0; i < indexToBufferBlock.size(); ++i)
|
||||||
|
indexToBufferBlock[i].dump();
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf("Pipeline input reflection:\n");
|
||||||
|
for (size_t i = 0; i < indexToPipeInput.size(); ++i)
|
||||||
|
indexToPipeInput[i].dump();
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf("Pipeline output reflection:\n");
|
||||||
|
for (size_t i = 0; i < indexToPipeOutput.size(); ++i)
|
||||||
|
indexToPipeOutput[i].dump();
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
if (getLocalSize(0) > 1) {
|
if (getLocalSize(0) > 1) {
|
||||||
|
@ -52,51 +52,11 @@ class TIntermediate;
|
|||||||
class TIntermAggregate;
|
class TIntermAggregate;
|
||||||
class TReflectionTraverser;
|
class TReflectionTraverser;
|
||||||
|
|
||||||
// Data needed for just a single object at the granularity exchanged by the reflection API
|
|
||||||
class TObjectReflection {
|
|
||||||
public:
|
|
||||||
TObjectReflection(const std::string& pName, const TType& pType, int pOffset, int pGLDefineType, int pSize, int pIndex) :
|
|
||||||
name(pName), offset(pOffset),
|
|
||||||
glDefineType(pGLDefineType), size(pSize), index(pIndex), counterIndex(-1), stages(EShLanguageMask(0)), type(pType.clone()) { }
|
|
||||||
|
|
||||||
const TType* getType() const { return type; }
|
|
||||||
int getBinding() const
|
|
||||||
{
|
|
||||||
if (type == nullptr || !type->getQualifier().hasBinding())
|
|
||||||
return -1;
|
|
||||||
return type->getQualifier().layoutBinding;
|
|
||||||
}
|
|
||||||
void dump() const
|
|
||||||
{
|
|
||||||
printf("%s: offset %d, type %x, size %d, index %d, binding %d, stages %d",
|
|
||||||
name.c_str(), offset, glDefineType, size, index, getBinding(), stages );
|
|
||||||
|
|
||||||
if (counterIndex != -1)
|
|
||||||
printf(", counter %d", counterIndex);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
static TObjectReflection badReflection() { return TObjectReflection(); }
|
|
||||||
|
|
||||||
std::string name;
|
|
||||||
int offset;
|
|
||||||
int glDefineType;
|
|
||||||
int size; // data size in bytes for a block, array size for a (non-block) object that's an array
|
|
||||||
int index;
|
|
||||||
int counterIndex;
|
|
||||||
EShLanguageMask stages;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
TObjectReflection() :
|
|
||||||
offset(-1), glDefineType(-1), size(-1), index(-1), counterIndex(-1), stages(EShLanguageMask(0)), type(nullptr) { }
|
|
||||||
|
|
||||||
const TType* type;
|
|
||||||
};
|
|
||||||
|
|
||||||
// The full reflection database
|
// The full reflection database
|
||||||
class TReflection {
|
class TReflection {
|
||||||
public:
|
public:
|
||||||
TReflection() : badReflection(TObjectReflection::badReflection())
|
TReflection(EShReflectionOptions opts, EShLanguage first, EShLanguage last)
|
||||||
|
: options(opts), firstStage(first), lastStage(last), badReflection(TObjectReflection::badReflection())
|
||||||
{
|
{
|
||||||
for (int dim=0; dim<3; ++dim)
|
for (int dim=0; dim<3; ++dim)
|
||||||
localSize[dim] = 0;
|
localSize[dim] = 0;
|
||||||
@ -127,17 +87,57 @@ public:
|
|||||||
return badReflection;
|
return badReflection;
|
||||||
}
|
}
|
||||||
|
|
||||||
// for mapping an attribute index to the attribute's description
|
// for mapping an pipeline input index to the input's description
|
||||||
int getNumAttributes() { return (int)indexToAttribute.size(); }
|
int getNumPipeInputs() { return (int)indexToPipeInput.size(); }
|
||||||
const TObjectReflection& getAttribute(int i) const
|
const TObjectReflection& getPipeInput(int i) const
|
||||||
{
|
{
|
||||||
if (i >= 0 && i < (int)indexToAttribute.size())
|
if (i >= 0 && i < (int)indexToPipeInput.size())
|
||||||
return indexToAttribute[i];
|
return indexToPipeInput[i];
|
||||||
else
|
else
|
||||||
return badReflection;
|
return badReflection;
|
||||||
}
|
}
|
||||||
|
|
||||||
// for mapping any name to its index (block names, uniform names and attribute names)
|
// for mapping an pipeline output index to the output's description
|
||||||
|
int getNumPipeOutputs() { return (int)indexToPipeOutput.size(); }
|
||||||
|
const TObjectReflection& getPipeOutput(int i) const
|
||||||
|
{
|
||||||
|
if (i >= 0 && i < (int)indexToPipeOutput.size())
|
||||||
|
return indexToPipeOutput[i];
|
||||||
|
else
|
||||||
|
return badReflection;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for mapping from an atomic counter to the uniform index
|
||||||
|
int getNumAtomicCounters() const { return (int)atomicCounterUniformIndices.size(); }
|
||||||
|
const TObjectReflection& getAtomicCounter(int i) const
|
||||||
|
{
|
||||||
|
if (i >= 0 && i < (int)atomicCounterUniformIndices.size())
|
||||||
|
return getUniform(atomicCounterUniformIndices[i]);
|
||||||
|
else
|
||||||
|
return badReflection;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for mapping a buffer variable index to a buffer variable object's description
|
||||||
|
int getNumBufferVariables() { return (int)indexToBufferVariable.size(); }
|
||||||
|
const TObjectReflection& getBufferVariable(int i) const
|
||||||
|
{
|
||||||
|
if (i >= 0 && i < (int)indexToBufferVariable.size())
|
||||||
|
return indexToBufferVariable[i];
|
||||||
|
else
|
||||||
|
return badReflection;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for mapping a storage block index to the storage block's description
|
||||||
|
int getNumStorageBuffers() const { return (int)indexToBufferBlock.size(); }
|
||||||
|
const TObjectReflection& getStorageBufferBlock(int i) const
|
||||||
|
{
|
||||||
|
if (i >= 0 && i < (int)indexToBufferBlock.size())
|
||||||
|
return indexToBufferBlock[i];
|
||||||
|
else
|
||||||
|
return badReflection;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for mapping any name to its index (block names, uniform names and input/output names)
|
||||||
int getIndex(const char* name) const
|
int getIndex(const char* name) const
|
||||||
{
|
{
|
||||||
TNameToIndex::const_iterator it = nameToIndex.find(name);
|
TNameToIndex::const_iterator it = nameToIndex.find(name);
|
||||||
@ -165,12 +165,35 @@ protected:
|
|||||||
// Need a TString hash: typedef std::unordered_map<TString, int> TNameToIndex;
|
// Need a TString hash: typedef std::unordered_map<TString, int> TNameToIndex;
|
||||||
typedef std::map<std::string, int> TNameToIndex;
|
typedef std::map<std::string, int> TNameToIndex;
|
||||||
typedef std::vector<TObjectReflection> TMapIndexToReflection;
|
typedef std::vector<TObjectReflection> TMapIndexToReflection;
|
||||||
|
typedef std::vector<int> TIndices;
|
||||||
|
|
||||||
|
TMapIndexToReflection& GetBlockMapForStorage(TStorageQualifier storage)
|
||||||
|
{
|
||||||
|
if ((options & EShReflectionSeparateBuffers) && storage == EvqBuffer)
|
||||||
|
return indexToBufferBlock;
|
||||||
|
return indexToUniformBlock;
|
||||||
|
}
|
||||||
|
TMapIndexToReflection& GetVariableMapForStorage(TStorageQualifier storage)
|
||||||
|
{
|
||||||
|
if ((options & EShReflectionSeparateBuffers) && storage == EvqBuffer)
|
||||||
|
return indexToBufferVariable;
|
||||||
|
return indexToUniform;
|
||||||
|
}
|
||||||
|
|
||||||
|
EShReflectionOptions options;
|
||||||
|
|
||||||
|
EShLanguage firstStage;
|
||||||
|
EShLanguage lastStage;
|
||||||
|
|
||||||
TObjectReflection badReflection; // return for queries of -1 or generally out of range; has expected descriptions with in it for this
|
TObjectReflection badReflection; // return for queries of -1 or generally out of range; has expected descriptions with in it for this
|
||||||
TNameToIndex nameToIndex; // maps names to indexes; can hold all types of data: uniform/buffer and which function names have been processed
|
TNameToIndex nameToIndex; // maps names to indexes; can hold all types of data: uniform/buffer and which function names have been processed
|
||||||
TMapIndexToReflection indexToUniform;
|
TMapIndexToReflection indexToUniform;
|
||||||
TMapIndexToReflection indexToUniformBlock;
|
TMapIndexToReflection indexToUniformBlock;
|
||||||
TMapIndexToReflection indexToAttribute;
|
TMapIndexToReflection indexToBufferVariable;
|
||||||
|
TMapIndexToReflection indexToBufferBlock;
|
||||||
|
TMapIndexToReflection indexToPipeInput;
|
||||||
|
TMapIndexToReflection indexToPipeOutput;
|
||||||
|
TIndices atomicCounterUniformIndices;
|
||||||
|
|
||||||
unsigned int localSize[3];
|
unsigned int localSize[3];
|
||||||
};
|
};
|
||||||
|
@ -236,6 +236,18 @@ enum EShMessages {
|
|||||||
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (right now only for samplers)
|
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (right now only for samplers)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Options for building reflection
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
EShReflectionDefault = 0, // default is original behaviour before options were added
|
||||||
|
EShReflectionStrictArraySuffix = (1 << 0), // reflection will follow stricter rules for array-of-structs suffixes
|
||||||
|
EShReflectionBasicArraySuffix = (1 << 1), // arrays of basic types will be appended with [0] as in GL reflection
|
||||||
|
EShReflectionIntermediateIO = (1 << 2), // reflect inputs and outputs to program, even with no vertex shader
|
||||||
|
EShReflectionSeparateBuffers = (1 << 3), // buffer variables and buffer blocks are reflected separately
|
||||||
|
EShReflectionAllBlockVariables = (1 << 4), // reflect all variables in blocks, even if they are inactive
|
||||||
|
} EShReflectionOptions;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Build a table for bindings. This can be used for locating
|
// Build a table for bindings. This can be used for locating
|
||||||
// attributes, uniforms, globals, etc., as needed.
|
// attributes, uniforms, globals, etc., as needed.
|
||||||
@ -596,6 +608,41 @@ private:
|
|||||||
TShader& operator=(TShader&);
|
TShader& operator=(TShader&);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// A reflection database and its interface, consistent with the OpenGL API reflection queries.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Data needed for just a single object at the granularity exchanged by the reflection API
|
||||||
|
class TObjectReflection {
|
||||||
|
public:
|
||||||
|
TObjectReflection(const std::string& pName, const TType& pType, int pOffset, int pGLDefineType, int pSize, int pIndex);
|
||||||
|
|
||||||
|
const TType* getType() const { return type; }
|
||||||
|
int getBinding() const;
|
||||||
|
void dump() const;
|
||||||
|
static TObjectReflection badReflection() { return TObjectReflection(); }
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
int offset;
|
||||||
|
int glDefineType;
|
||||||
|
int size; // data size in bytes for a block, array size for a (non-block) object that's an array
|
||||||
|
int index;
|
||||||
|
int counterIndex;
|
||||||
|
int numMembers;
|
||||||
|
int arrayStride; // stride of an array variable
|
||||||
|
int topLevelArrayStride; // stride of the top-level variable in a storage buffer member
|
||||||
|
EShLanguageMask stages;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
TObjectReflection()
|
||||||
|
: offset(-1), glDefineType(-1), size(-1), index(-1), counterIndex(-1), numMembers(-1), arrayStride(0),
|
||||||
|
topLevelArrayStride(0), stages(EShLanguageMask(0)), type(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const TType* type;
|
||||||
|
};
|
||||||
|
|
||||||
class TReflection;
|
class TReflection;
|
||||||
class TIoMapper;
|
class TIoMapper;
|
||||||
|
|
||||||
@ -685,28 +732,89 @@ public:
|
|||||||
TIntermediate* getIntermediate(EShLanguage stage) const { return intermediate[stage]; }
|
TIntermediate* getIntermediate(EShLanguage stage) const { return intermediate[stage]; }
|
||||||
|
|
||||||
// Reflection Interface
|
// Reflection Interface
|
||||||
bool buildReflection(); // call first, to do liveness analysis, index mapping, etc.; returns false on failure
|
|
||||||
int getNumLiveUniformVariables() const; // can be used for glGetProgramiv(GL_ACTIVE_UNIFORMS)
|
// call first, to do liveness analysis, index mapping, etc.; returns false on failure
|
||||||
int getNumLiveUniformBlocks() const; // can be used for glGetProgramiv(GL_ACTIVE_UNIFORM_BLOCKS)
|
bool buildReflection(int opts = EShReflectionDefault);
|
||||||
const char* getUniformName(int index) const; // can be used for "name" part of glGetActiveUniform()
|
|
||||||
const char* getUniformBlockName(int blockIndex) const; // can be used for glGetActiveUniformBlockName()
|
|
||||||
int getUniformBlockSize(int blockIndex) const; // can be used for glGetActiveUniformBlockiv(UNIFORM_BLOCK_DATA_SIZE)
|
|
||||||
int getUniformIndex(const char* name) const; // can be used for glGetUniformIndices()
|
|
||||||
int getUniformBinding(int index) const; // returns the binding number
|
|
||||||
EShLanguageMask getUniformStages(int index) const; // returns Shaders Stages where a Uniform is present
|
|
||||||
int getUniformBlockBinding(int index) const; // returns the block binding number
|
|
||||||
int getUniformBlockIndex(int index) const; // can be used for glGetActiveUniformsiv(GL_UNIFORM_BLOCK_INDEX)
|
|
||||||
int getUniformBlockCounterIndex(int index) const; // returns block index of associated counter.
|
|
||||||
int getUniformType(int index) const; // can be used for glGetActiveUniformsiv(GL_UNIFORM_TYPE)
|
|
||||||
int getUniformBufferOffset(int index) const; // can be used for glGetActiveUniformsiv(GL_UNIFORM_OFFSET)
|
|
||||||
int getUniformArraySize(int index) const; // can be used for glGetActiveUniformsiv(GL_UNIFORM_SIZE)
|
|
||||||
int getNumLiveAttributes() const; // can be used for glGetProgramiv(GL_ACTIVE_ATTRIBUTES)
|
|
||||||
unsigned getLocalSize(int dim) const; // return dim'th local size
|
unsigned getLocalSize(int dim) const; // return dim'th local size
|
||||||
const char *getAttributeName(int index) const; // can be used for glGetActiveAttrib()
|
int getReflectionIndex(const char *name) const;
|
||||||
int getAttributeType(int index) const; // can be used for glGetActiveAttrib()
|
|
||||||
const TType* getUniformTType(int index) const; // returns a TType*
|
int getNumUniformVariables() const;
|
||||||
const TType* getUniformBlockTType(int index) const; // returns a TType*
|
const TObjectReflection& getUniform(int index) const;
|
||||||
const TType* getAttributeTType(int index) const; // returns a TType*
|
int getNumUniformBlocks() const;
|
||||||
|
const TObjectReflection& getUniformBlock(int index) const;
|
||||||
|
int getNumPipeInputs() const;
|
||||||
|
const TObjectReflection& getPipeInput(int index) const;
|
||||||
|
int getNumPipeOutputs() const;
|
||||||
|
const TObjectReflection& getPipeOutput(int index) const;
|
||||||
|
int getNumBufferVariables() const;
|
||||||
|
const TObjectReflection& getBufferVariable(int index) const;
|
||||||
|
int getNumBufferBlocks() const;
|
||||||
|
const TObjectReflection& getBufferBlock(int index) const;
|
||||||
|
int getNumAtomicCounters() const;
|
||||||
|
const TObjectReflection& getAtomicCounter(int index) const;
|
||||||
|
|
||||||
|
// Legacy Reflection Interface - expressed in terms of above interface
|
||||||
|
|
||||||
|
// can be used for glGetProgramiv(GL_ACTIVE_UNIFORMS)
|
||||||
|
int getNumLiveUniformVariables() const { return getNumUniformVariables(); }
|
||||||
|
|
||||||
|
// can be used for glGetProgramiv(GL_ACTIVE_UNIFORM_BLOCKS)
|
||||||
|
int getNumLiveUniformBlocks() const { return getNumUniformBlocks(); }
|
||||||
|
|
||||||
|
// can be used for glGetProgramiv(GL_ACTIVE_ATTRIBUTES)
|
||||||
|
int getNumLiveAttributes() const { return getNumPipeInputs(); }
|
||||||
|
|
||||||
|
// can be used for glGetUniformIndices()
|
||||||
|
int getUniformIndex(const char *name) const { return getReflectionIndex(name); }
|
||||||
|
|
||||||
|
// can be used for "name" part of glGetActiveUniform()
|
||||||
|
const char *getUniformName(int index) const { return getUniform(index).name.c_str(); }
|
||||||
|
|
||||||
|
// returns the binding number
|
||||||
|
int getUniformBinding(int index) const { return getUniform(index).getBinding(); }
|
||||||
|
|
||||||
|
// returns Shaders Stages where a Uniform is present
|
||||||
|
EShLanguageMask getUniformStages(int index) const { return getUniform(index).stages; }
|
||||||
|
|
||||||
|
// can be used for glGetActiveUniformsiv(GL_UNIFORM_BLOCK_INDEX)
|
||||||
|
int getUniformBlockIndex(int index) const { return getUniform(index).index; }
|
||||||
|
|
||||||
|
// can be used for glGetActiveUniformsiv(GL_UNIFORM_TYPE)
|
||||||
|
int getUniformType(int index) const { return getUniform(index).glDefineType; }
|
||||||
|
|
||||||
|
// can be used for glGetActiveUniformsiv(GL_UNIFORM_OFFSET)
|
||||||
|
int getUniformBufferOffset(int index) const { return getUniform(index).offset; }
|
||||||
|
|
||||||
|
// can be used for glGetActiveUniformsiv(GL_UNIFORM_SIZE)
|
||||||
|
int getUniformArraySize(int index) const { return getUniform(index).size; }
|
||||||
|
|
||||||
|
// returns a TType*
|
||||||
|
const TType *getUniformTType(int index) const { return getUniform(index).getType(); }
|
||||||
|
|
||||||
|
// can be used for glGetActiveUniformBlockName()
|
||||||
|
const char *getUniformBlockName(int index) const { return getUniformBlock(index).name.c_str(); }
|
||||||
|
|
||||||
|
// can be used for glGetActiveUniformBlockiv(UNIFORM_BLOCK_DATA_SIZE)
|
||||||
|
int getUniformBlockSize(int index) const { return getUniformBlock(index).size; }
|
||||||
|
|
||||||
|
// returns the block binding number
|
||||||
|
int getUniformBlockBinding(int index) const { return getUniformBlock(index).getBinding(); }
|
||||||
|
|
||||||
|
// returns block index of associated counter.
|
||||||
|
int getUniformBlockCounterIndex(int index) const { return getUniformBlock(index).counterIndex; }
|
||||||
|
|
||||||
|
// returns a TType*
|
||||||
|
const TType *getUniformBlockTType(int index) const { return getUniformBlock(index).getType(); }
|
||||||
|
|
||||||
|
// can be used for glGetActiveAttrib()
|
||||||
|
const char *getAttributeName(int index) const { return getPipeInput(index).name.c_str(); }
|
||||||
|
|
||||||
|
// can be used for glGetActiveAttrib()
|
||||||
|
int getAttributeType(int index) const { return getPipeInput(index).glDefineType; }
|
||||||
|
|
||||||
|
// returns a TType*
|
||||||
|
const TType *getAttributeTType(int index) const { return getPipeInput(index).getType(); }
|
||||||
|
|
||||||
void dumpReflection();
|
void dumpReflection();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user