Overhaul how we deal with reserved identifiers.

- Do not silently drop reserved identifiers in the parser. This makes it
  possible to reflect identifiers which are reserved by the
  cross-compiler module.
- Instead of dropping the name, emit _RESERVED_IDENTIFIER_FIXUP in the
  source to make it clear that a name has been rewritten.
- Document what is reserved and not.
This commit is contained in:
Hans-Kristian Arntzen 2020-08-21 16:14:13 +02:00
parent f0fe4442e3
commit a07441568e
35 changed files with 449 additions and 232 deletions

View File

@ -402,6 +402,28 @@ Y-flipping of gl_Position and similar is also supported.
The use of this is discouraged, because relying on vertex shader Y-flipping tends to get quite messy.
To enable this, set `CompilerGLSL::Options.vertex.flip_vert_y` or `--flip-vert-y` in CLI.
#### Reserved identifiers
When cross-compiling, certain identifiers are considered to be reserved by the implementation.
Code generated by SPIRV-Cross cannot emit these identifiers as they are reserved and used for various internal purposes,
and such variables will typically show up as `_RESERVED_IDENTIFIER_FIXUP_`
or some similar name to make it more obvious that an identifier has been renamed.
Reflection output will follow the exact name specified in the SPIR-V module. It might not be a valid identifier in the C sense,
as it may contain non-alphanumeric/non-underscore characters.
Reserved identifiers currently assumed by the implementation are (in pseudo-regex):
- _$digit+, e.g. `_100`, `_2`
- _$digit+_.+, e.g. `_100_tmp`, `_2_foobar`. `_2Bar` is **not** reserved.
- gl_- prefix
- spv- prefix
- SPIRV_Cross prefix
- Double underscores (reserved by all target languages).
Members of structs also have a reserved identifier:
- _m$digit+$END, e.g. `_m20` and `_m40` are reserved, but not `_m40Foobar`.
## Contributing
Contributions to SPIRV-Cross are welcome. See Testing and Licensing sections for details.

View File

@ -5,7 +5,7 @@ using namespace metal;
struct cb1_struct
{
float4 _m0[1];
float4 _RESERVED_IDENTIFIER_FIXUP_m0[1];
};
constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(16u, 16u, 1u);
@ -19,7 +19,7 @@ kernel void main0(constant cb1_struct& cb0_1 [[buffer(0)]], texture2d<float, acc
{
for (int _99 = 0; _99 < _46.x; )
{
u0.write(cb0_1._m0[0].xxxx, uint2(((_46 * int3(gl_LocalInvocationID).xy) + int2(_98, _99))));
u0.write(cb0_1._RESERVED_IDENTIFIER_FIXUP_m0[0].xxxx, uint2(((_46 * int3(gl_LocalInvocationID).xy) + int2(_98, _99))));
_99++;
continue;
}

View File

@ -5,7 +5,7 @@ using namespace metal;
struct cb1_struct
{
float4 _m0[1];
float4 _RESERVED_IDENTIFIER_FIXUP_m0[1];
};
constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(16u, 16u, 1u);
@ -19,7 +19,7 @@ kernel void main0(constant cb1_struct& cb0_1 [[buffer(0)]], texture2d<float, acc
{
for (int _81 = 0; _81 < _40.x; )
{
u0.write(cb0_1._m0[0].xxxx, uint2(((_40 * int3(gl_LocalInvocationID).xy) + int2(_80, _81))));
u0.write(cb0_1._RESERVED_IDENTIFIER_FIXUP_m0[0].xxxx, uint2(((_40 * int3(gl_LocalInvocationID).xy) + int2(_80, _81))));
_81++;
continue;
}

View File

@ -19,10 +19,10 @@ struct main0_out
float4 _entryPointOutput [[color(0)]];
};
fragment main0_out main0(constant CB0& _26 [[buffer(0)]])
fragment main0_out main0(constant CB0& _RESERVED_IDENTIFIER_FIXUP_24 [[buffer(0)]])
{
main0_out out = {};
out._entryPointOutput = float4(_26.CB0[1].position[0], _26.CB0[1].position[1], _26.CB0[1].position[2], _26.CB0[1].radius);
out._entryPointOutput = float4(_RESERVED_IDENTIFIER_FIXUP_24.CB0[1].position[0], _RESERVED_IDENTIFIER_FIXUP_24.CB0[1].position[1], _RESERVED_IDENTIFIER_FIXUP_24.CB0[1].position[2], _RESERVED_IDENTIFIER_FIXUP_24.CB0[1].radius);
return out;
}

View File

@ -3,21 +3,21 @@
using namespace metal;
struct _10
struct _RESERVED_IDENTIFIER_FIXUP_10_12
{
uint4 _m0[1024];
uint4 _RESERVED_IDENTIFIER_FIXUP_m0[1024];
};
struct main0_in
{
uint4 m_19 [[attribute(0)]];
uint4 _RESERVED_IDENTIFIER_FIXUP_19 [[attribute(0)]];
};
kernel void main0(main0_in in [[stage_in]], device _10& _12 [[buffer(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 spvStageInputSize [[grid_size]], uint3 spvDispatchBase [[grid_origin]])
kernel void main0(main0_in in [[stage_in]], device _RESERVED_IDENTIFIER_FIXUP_10_12& _RESERVED_IDENTIFIER_FIXUP_12 [[buffer(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 spvStageInputSize [[grid_size]], uint3 spvDispatchBase [[grid_origin]])
{
if (any(gl_GlobalInvocationID >= spvStageInputSize))
return;
uint gl_VertexIndex = gl_GlobalInvocationID.x + spvDispatchBase.x;
_12._m0[int(gl_VertexIndex)] = in.m_19;
_RESERVED_IDENTIFIER_FIXUP_12._RESERVED_IDENTIFIER_FIXUP_m0[int(gl_VertexIndex)] = in._RESERVED_IDENTIFIER_FIXUP_19;
}

View File

@ -3,18 +3,18 @@
using namespace metal;
struct _10
struct _RESERVED_IDENTIFIER_FIXUP_10_12
{
uint4 _m0[1024];
uint4 _RESERVED_IDENTIFIER_FIXUP_m0[1024];
};
struct main0_in
{
uint4 m_19 [[attribute(0)]];
uint4 _RESERVED_IDENTIFIER_FIXUP_19 [[attribute(0)]];
};
vertex void main0(main0_in in [[stage_in]], device _10& _12 [[buffer(0)]], uint gl_VertexIndex [[vertex_id]])
vertex void main0(main0_in in [[stage_in]], device _RESERVED_IDENTIFIER_FIXUP_10_12& _RESERVED_IDENTIFIER_FIXUP_12 [[buffer(0)]], uint gl_VertexIndex [[vertex_id]])
{
_12._m0[int(gl_VertexIndex)] = in.m_19;
_RESERVED_IDENTIFIER_FIXUP_12._RESERVED_IDENTIFIER_FIXUP_m0[int(gl_VertexIndex)] = in._RESERVED_IDENTIFIER_FIXUP_19;
}

View File

@ -3,14 +3,14 @@
using namespace metal;
struct _35
struct _RESERVED_IDENTIFIER_FIXUP_33_35
{
uint4 _m0[1024];
uint4 _RESERVED_IDENTIFIER_FIXUP_m0[1024];
};
struct _40
struct _RESERVED_IDENTIFIER_FIXUP_38_40
{
uint4 _m0[1024];
uint4 _RESERVED_IDENTIFIER_FIXUP_m0[1024];
};
struct main0_out
@ -20,16 +20,16 @@ struct main0_out
struct main0_in
{
float4 m_17 [[attribute(0)]];
float4 _RESERVED_IDENTIFIER_FIXUP_14 [[attribute(0)]];
};
vertex void main0(main0_in in [[stage_in]], device _35& _37 [[buffer(0)]], constant _40& _42 [[buffer(1)]])
vertex void main0(main0_in in [[stage_in]], device _RESERVED_IDENTIFIER_FIXUP_33_35& _RESERVED_IDENTIFIER_FIXUP_35 [[buffer(0)]], constant _RESERVED_IDENTIFIER_FIXUP_38_40& _RESERVED_IDENTIFIER_FIXUP_40 [[buffer(1)]])
{
main0_out out = {};
out.gl_Position = in.m_17;
out.gl_Position = in._RESERVED_IDENTIFIER_FIXUP_14;
for (int _52 = 0; _52 < 1024; )
{
_37._m0[_52] = _42._m0[_52];
_RESERVED_IDENTIFIER_FIXUP_35._RESERVED_IDENTIFIER_FIXUP_m0[_52] = _RESERVED_IDENTIFIER_FIXUP_40._RESERVED_IDENTIFIER_FIXUP_m0[_52];
_52++;
continue;
}

View File

@ -6,9 +6,9 @@
using namespace metal;
struct _23
struct _RESERVED_IDENTIFIER_FIXUP_19_21
{
uint _m0;
uint _RESERVED_IDENTIFIER_FIXUP_m0;
};
struct main0_out
@ -18,13 +18,13 @@ struct main0_out
struct main0_in
{
float4 m_17 [[attribute(0)]];
float4 _RESERVED_IDENTIFIER_FIXUP_14 [[attribute(0)]];
};
vertex void main0(main0_in in [[stage_in]], volatile device _23& _25 [[buffer(0)]])
vertex void main0(main0_in in [[stage_in]], volatile device _RESERVED_IDENTIFIER_FIXUP_19_21& _RESERVED_IDENTIFIER_FIXUP_21 [[buffer(0)]])
{
main0_out out = {};
out.gl_Position = in.m_17;
uint _29 = atomic_fetch_add_explicit((volatile device atomic_uint*)&_25._m0, 1u, memory_order_relaxed);
out.gl_Position = in._RESERVED_IDENTIFIER_FIXUP_14;
uint _29 = atomic_fetch_add_explicit((volatile device atomic_uint*)&_RESERVED_IDENTIFIER_FIXUP_21._RESERVED_IDENTIFIER_FIXUP_m0, 1u, memory_order_relaxed);
}

View File

@ -10,16 +10,16 @@ struct main0_out
struct main0_in
{
float4 m_17 [[attribute(0)]];
float4 _RESERVED_IDENTIFIER_FIXUP_14 [[attribute(0)]];
};
vertex void main0(main0_in in [[stage_in]], texture1d<uint, access::write> _34 [[texture(0)]], texture1d<uint> _37 [[texture(1)]])
vertex void main0(main0_in in [[stage_in]], texture1d<uint, access::write> _RESERVED_IDENTIFIER_FIXUP_32 [[texture(0)]], texture1d<uint> _RESERVED_IDENTIFIER_FIXUP_35 [[texture(1)]])
{
main0_out out = {};
out.gl_Position = in.m_17;
out.gl_Position = in._RESERVED_IDENTIFIER_FIXUP_14;
for (int _45 = 0; _45 < 128; )
{
_34.write(_37.read(uint(_45)), uint(_45));
_RESERVED_IDENTIFIER_FIXUP_32.write(_RESERVED_IDENTIFIER_FIXUP_35.read(uint(_45)), uint(_45));
_45++;
continue;
}

View File

@ -3,43 +3,43 @@
using namespace metal;
struct _15
struct _RESERVED_IDENTIFIER_FIXUP_1365_18812
{
float3x4 _m0;
float3x4 _m1;
float3x4 _RESERVED_IDENTIFIER_FIXUP_m0;
float3x4 _RESERVED_IDENTIFIER_FIXUP_m1;
};
struct _42
struct _RESERVED_IDENTIFIER_FIXUP_1126_22044
{
float4x4 _m0;
float4x4 _m1;
float _m2;
float4x4 _RESERVED_IDENTIFIER_FIXUP_m0;
float4x4 _RESERVED_IDENTIFIER_FIXUP_m1;
float _RESERVED_IDENTIFIER_FIXUP_m9;
char _m3_pad[12];
packed_float3 _m3;
float _m4;
packed_float3 _m5;
float _m6;
float _m7;
float _m8;
float2 _m9;
packed_float3 _RESERVED_IDENTIFIER_FIXUP_m10;
float _RESERVED_IDENTIFIER_FIXUP_m11;
packed_float3 _RESERVED_IDENTIFIER_FIXUP_m12;
float _RESERVED_IDENTIFIER_FIXUP_m17;
float _RESERVED_IDENTIFIER_FIXUP_m18;
float _RESERVED_IDENTIFIER_FIXUP_m19;
float2 _RESERVED_IDENTIFIER_FIXUP_m20;
};
struct main0_out
{
float3 m_72 [[user(locn0)]];
float3 _RESERVED_IDENTIFIER_FIXUP_3976 [[user(locn0)]];
float4 gl_Position [[position]];
};
struct main0_in
{
float4 m_25 [[attribute(0)]];
float4 _RESERVED_IDENTIFIER_FIXUP_5275 [[attribute(0)]];
};
vertex main0_out main0(main0_in in [[stage_in]], constant _15& _17 [[buffer(0)]], constant _42& _44 [[buffer(1)]])
vertex main0_out main0(main0_in in [[stage_in]], constant _RESERVED_IDENTIFIER_FIXUP_1365_18812& _RESERVED_IDENTIFIER_FIXUP_18812 [[buffer(0)]], constant _RESERVED_IDENTIFIER_FIXUP_1126_22044& _RESERVED_IDENTIFIER_FIXUP_22044 [[buffer(1)]])
{
main0_out out = {};
float4 _70 = _44._m0 * float4(float3(_44._m3) + (in.m_25.xyz * (_44._m6 + _44._m7)), 1.0);
out.m_72 = normalize(float4(in.m_25.xyz, 0.0) * _17._m1);
float4 _70 = _RESERVED_IDENTIFIER_FIXUP_22044._RESERVED_IDENTIFIER_FIXUP_m0 * float4(float3(_RESERVED_IDENTIFIER_FIXUP_22044._RESERVED_IDENTIFIER_FIXUP_m10) + (in._RESERVED_IDENTIFIER_FIXUP_5275.xyz * (_RESERVED_IDENTIFIER_FIXUP_22044._RESERVED_IDENTIFIER_FIXUP_m17 + _RESERVED_IDENTIFIER_FIXUP_22044._RESERVED_IDENTIFIER_FIXUP_m18)), 1.0);
out._RESERVED_IDENTIFIER_FIXUP_3976 = normalize(float4(in._RESERVED_IDENTIFIER_FIXUP_5275.xyz, 0.0) * _RESERVED_IDENTIFIER_FIXUP_18812._RESERVED_IDENTIFIER_FIXUP_m1);
float4 _94 = _70;
_94.y = -_70.y;
out.gl_Position = _94;

View File

@ -197,10 +197,10 @@ struct main0_out
float4 out_var_SV_Target0 [[color(0)]];
};
fragment main0_out main0(constant type_View& View [[buffer(0)]], constant type_Globals& _Globals [[buffer(1)]], float4 _gl_LastFragData [[color(0)]], texture2d<float> ShadowDepthTexture [[texture(0)]], sampler ShadowDepthTextureSampler [[sampler(0)]], float4 gl_FragCoord [[position]])
fragment main0_out main0(constant type_View& View [[buffer(0)]], constant type_Globals& _Globals [[buffer(1)]], float4 _RESERVED_IDENTIFIER_FIXUP_gl_LastFragData [[color(0)]], texture2d<float> ShadowDepthTexture [[texture(0)]], sampler ShadowDepthTextureSampler [[sampler(0)]], float4 gl_FragCoord [[position]])
{
main0_out out = {};
float4 _67 = _gl_LastFragData;
float4 _67 = _RESERVED_IDENTIFIER_FIXUP_gl_LastFragData;
float _68 = _67.w;
float4 _82 = _Globals.ScreenToShadowMatrix * float4((((gl_FragCoord.xy * View.View_BufferSizeAndInvSize.zw) - View.View_ScreenPositionScaleBias.wz) / View.View_ScreenPositionScaleBias.xy) * float2(_68), _68, 1.0);
float _118 = fast::clamp(((fast::clamp((ShadowDepthTexture.sample(ShadowDepthTextureSampler, (((_82.xyz / float3(_82.w)).xy * _Globals.ShadowTileOffsetAndSize.zw).xy + _Globals.ShadowTileOffsetAndSize.xy).xy, level(0.0)).xxx * float3(_Globals.SoftTransitionScale.z)) - float3((fast::min(_82.z, 0.999989986419677734375) * _Globals.SoftTransitionScale.z) - 1.0), float3(0.0), float3(1.0)).x - 0.5) * _Globals.ShadowSharpen) + 0.5, 0.0, 1.0);

View File

@ -7,7 +7,7 @@ using namespace metal;
struct cb1_struct
{
float4 _m0[1];
float4 _RESERVED_IDENTIFIER_FIXUP_m0[1];
};
constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(16u, 16u, 1u);
@ -27,7 +27,7 @@ kernel void main0(constant cb1_struct& cb0_1 [[buffer(0)]], texture2d<float, acc
{
int2 param = r0;
int2 param_1 = int2(i, j);
u0.write(cb0_1._m0[0].xxxx, uint2(get_texcoord(param, param_1, gl_LocalInvocationID)));
u0.write(cb0_1._RESERVED_IDENTIFIER_FIXUP_m0[0].xxxx, uint2(get_texcoord(param, param_1, gl_LocalInvocationID)));
}
}
}

View File

@ -5,7 +5,7 @@ using namespace metal;
struct cb1_struct
{
float4 _m0[1];
float4 _RESERVED_IDENTIFIER_FIXUP_m0[1];
};
constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(16u, 16u, 1u);
@ -17,7 +17,7 @@ kernel void main0(constant cb1_struct& cb0_1 [[buffer(0)]], texture2d<float, acc
{
for (int j = 0; j < r0.x; j++)
{
u0.write(cb0_1._m0[0].xxxx, uint2(((r0 * int3(gl_LocalInvocationID).xy) + int2(i, j))));
u0.write(cb0_1._RESERVED_IDENTIFIER_FIXUP_m0[0].xxxx, uint2(((r0 * int3(gl_LocalInvocationID).xy) + int2(i, j))));
}
}
}

View File

@ -33,23 +33,23 @@ struct main0_out
};
static inline __attribute__((always_inline))
float4 _main(thread const VertexOutput& IN, constant CB0& v_26)
float4 _main(thread const VertexOutput& IN, constant CB0& _RESERVED_IDENTIFIER_FIXUP_24)
{
TestStruct st;
st.position = float3(v_26.CB0[1].position);
st.radius = v_26.CB0[1].radius;
st.position = float3(_RESERVED_IDENTIFIER_FIXUP_24.CB0[1].position);
st.radius = _RESERVED_IDENTIFIER_FIXUP_24.CB0[1].radius;
float4 col = float4(st.position, st.radius);
return col;
}
fragment main0_out main0(constant CB0& v_26 [[buffer(0)]], float4 gl_FragCoord [[position]])
fragment main0_out main0(constant CB0& _RESERVED_IDENTIFIER_FIXUP_24 [[buffer(0)]], float4 gl_FragCoord [[position]])
{
main0_out out = {};
VertexOutput IN;
IN.HPosition = gl_FragCoord;
VertexOutput param = IN;
VertexOutput param_1 = param;
out._entryPointOutput = _main(param_1, v_26);
out._entryPointOutput = _main(param_1, _RESERVED_IDENTIFIER_FIXUP_24);
return out;
}

View File

@ -3,21 +3,21 @@
using namespace metal;
struct _10
struct _RESERVED_IDENTIFIER_FIXUP_10_12
{
uint4 _m0[1024];
uint4 _RESERVED_IDENTIFIER_FIXUP_m0[1024];
};
struct main0_in
{
uint4 m_19 [[attribute(0)]];
uint4 _RESERVED_IDENTIFIER_FIXUP_19 [[attribute(0)]];
};
kernel void main0(main0_in in [[stage_in]], device _10& _12 [[buffer(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 spvStageInputSize [[grid_size]], uint3 spvDispatchBase [[grid_origin]])
kernel void main0(main0_in in [[stage_in]], device _RESERVED_IDENTIFIER_FIXUP_10_12& _RESERVED_IDENTIFIER_FIXUP_12 [[buffer(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 spvStageInputSize [[grid_size]], uint3 spvDispatchBase [[grid_origin]])
{
if (any(gl_GlobalInvocationID >= spvStageInputSize))
return;
uint gl_VertexIndex = gl_GlobalInvocationID.x + spvDispatchBase.x;
_12._m0[int(gl_VertexIndex)] = in.m_19;
_RESERVED_IDENTIFIER_FIXUP_12._RESERVED_IDENTIFIER_FIXUP_m0[int(gl_VertexIndex)] = in._RESERVED_IDENTIFIER_FIXUP_19;
}

View File

@ -3,18 +3,18 @@
using namespace metal;
struct _10
struct _RESERVED_IDENTIFIER_FIXUP_10_12
{
uint4 _m0[1024];
uint4 _RESERVED_IDENTIFIER_FIXUP_m0[1024];
};
struct main0_in
{
uint4 m_19 [[attribute(0)]];
uint4 _RESERVED_IDENTIFIER_FIXUP_19 [[attribute(0)]];
};
vertex void main0(main0_in in [[stage_in]], device _10& _12 [[buffer(0)]], uint gl_VertexIndex [[vertex_id]])
vertex void main0(main0_in in [[stage_in]], device _RESERVED_IDENTIFIER_FIXUP_10_12& _RESERVED_IDENTIFIER_FIXUP_12 [[buffer(0)]], uint gl_VertexIndex [[vertex_id]])
{
_12._m0[int(gl_VertexIndex)] = in.m_19;
_RESERVED_IDENTIFIER_FIXUP_12._RESERVED_IDENTIFIER_FIXUP_m0[int(gl_VertexIndex)] = in._RESERVED_IDENTIFIER_FIXUP_19;
}

View File

@ -3,14 +3,14 @@
using namespace metal;
struct _35
struct _RESERVED_IDENTIFIER_FIXUP_33_35
{
uint4 _m0[1024];
uint4 _RESERVED_IDENTIFIER_FIXUP_m0[1024];
};
struct _40
struct _RESERVED_IDENTIFIER_FIXUP_38_40
{
uint4 _m0[1024];
uint4 _RESERVED_IDENTIFIER_FIXUP_m0[1024];
};
struct main0_out
@ -20,16 +20,16 @@ struct main0_out
struct main0_in
{
float4 m_17 [[attribute(0)]];
float4 _RESERVED_IDENTIFIER_FIXUP_14 [[attribute(0)]];
};
vertex void main0(main0_in in [[stage_in]], device _35& _37 [[buffer(0)]], constant _40& _42 [[buffer(1)]])
vertex void main0(main0_in in [[stage_in]], device _RESERVED_IDENTIFIER_FIXUP_33_35& _RESERVED_IDENTIFIER_FIXUP_35 [[buffer(0)]], constant _RESERVED_IDENTIFIER_FIXUP_38_40& _RESERVED_IDENTIFIER_FIXUP_40 [[buffer(1)]])
{
main0_out out = {};
out.gl_Position = in.m_17;
for (int _22 = 0; _22 < 1024; _22++)
out.gl_Position = in._RESERVED_IDENTIFIER_FIXUP_14;
for (int _RESERVED_IDENTIFIER_FIXUP_19 = 0; _RESERVED_IDENTIFIER_FIXUP_19 < 1024; _RESERVED_IDENTIFIER_FIXUP_19++)
{
_37._m0[_22] = _42._m0[_22];
_RESERVED_IDENTIFIER_FIXUP_35._RESERVED_IDENTIFIER_FIXUP_m0[_RESERVED_IDENTIFIER_FIXUP_19] = _RESERVED_IDENTIFIER_FIXUP_40._RESERVED_IDENTIFIER_FIXUP_m0[_RESERVED_IDENTIFIER_FIXUP_19];
}
}

View File

@ -6,9 +6,9 @@
using namespace metal;
struct _23
struct _RESERVED_IDENTIFIER_FIXUP_19_21
{
uint _m0;
uint _RESERVED_IDENTIFIER_FIXUP_m0;
};
struct main0_out
@ -18,14 +18,14 @@ struct main0_out
struct main0_in
{
float4 m_17 [[attribute(0)]];
float4 _RESERVED_IDENTIFIER_FIXUP_14 [[attribute(0)]];
};
vertex void main0(main0_in in [[stage_in]], volatile device _23& _25 [[buffer(0)]])
vertex void main0(main0_in in [[stage_in]], volatile device _RESERVED_IDENTIFIER_FIXUP_19_21& _RESERVED_IDENTIFIER_FIXUP_21 [[buffer(0)]])
{
main0_out out = {};
out.gl_Position = in.m_17;
uint _29 = atomic_fetch_add_explicit((volatile device atomic_uint*)&_25._m0, 1u, memory_order_relaxed);
uint _22 = _29;
out.gl_Position = in._RESERVED_IDENTIFIER_FIXUP_14;
uint _29 = atomic_fetch_add_explicit((volatile device atomic_uint*)&_RESERVED_IDENTIFIER_FIXUP_21._RESERVED_IDENTIFIER_FIXUP_m0, 1u, memory_order_relaxed);
uint _RESERVED_IDENTIFIER_FIXUP_26 = _29;
}

View File

@ -10,16 +10,16 @@ struct main0_out
struct main0_in
{
float4 m_17 [[attribute(0)]];
float4 _RESERVED_IDENTIFIER_FIXUP_14 [[attribute(0)]];
};
vertex void main0(main0_in in [[stage_in]], texture1d<uint, access::write> _34 [[texture(0)]], texture1d<uint> _37 [[texture(1)]])
vertex void main0(main0_in in [[stage_in]], texture1d<uint, access::write> _RESERVED_IDENTIFIER_FIXUP_32 [[texture(0)]], texture1d<uint> _RESERVED_IDENTIFIER_FIXUP_35 [[texture(1)]])
{
main0_out out = {};
out.gl_Position = in.m_17;
for (int _22 = 0; _22 < 128; _22++)
out.gl_Position = in._RESERVED_IDENTIFIER_FIXUP_14;
for (int _RESERVED_IDENTIFIER_FIXUP_19 = 0; _RESERVED_IDENTIFIER_FIXUP_19 < 128; _RESERVED_IDENTIFIER_FIXUP_19++)
{
_34.write(_37.read(uint(_22)), uint(_22));
_RESERVED_IDENTIFIER_FIXUP_32.write(_RESERVED_IDENTIFIER_FIXUP_35.read(uint(_RESERVED_IDENTIFIER_FIXUP_19)), uint(_RESERVED_IDENTIFIER_FIXUP_19));
}
}

View File

@ -3,53 +3,53 @@
using namespace metal;
struct _15
struct _RESERVED_IDENTIFIER_FIXUP_1365_18812
{
float3x4 _m0;
float3x4 _m1;
float3x4 _RESERVED_IDENTIFIER_FIXUP_m0;
float3x4 _RESERVED_IDENTIFIER_FIXUP_m1;
};
struct _42
struct _RESERVED_IDENTIFIER_FIXUP_1126_22044
{
float4x4 _m0;
float4x4 _m1;
float _m2;
float4x4 _RESERVED_IDENTIFIER_FIXUP_m0;
float4x4 _RESERVED_IDENTIFIER_FIXUP_m1;
float _RESERVED_IDENTIFIER_FIXUP_m9;
char _m3_pad[12];
packed_float3 _m3;
float _m4;
packed_float3 _m5;
float _m6;
float _m7;
float _m8;
float2 _m9;
packed_float3 _RESERVED_IDENTIFIER_FIXUP_m10;
float _RESERVED_IDENTIFIER_FIXUP_m11;
packed_float3 _RESERVED_IDENTIFIER_FIXUP_m12;
float _RESERVED_IDENTIFIER_FIXUP_m17;
float _RESERVED_IDENTIFIER_FIXUP_m18;
float _RESERVED_IDENTIFIER_FIXUP_m19;
float2 _RESERVED_IDENTIFIER_FIXUP_m20;
};
struct main0_out
{
float3 m_72 [[user(locn0)]];
float3 _RESERVED_IDENTIFIER_FIXUP_3976 [[user(locn0)]];
float4 gl_Position [[position]];
};
struct main0_in
{
float4 m_25 [[attribute(0)]];
float4 _RESERVED_IDENTIFIER_FIXUP_5275 [[attribute(0)]];
};
vertex main0_out main0(main0_in in [[stage_in]], constant _15& _17 [[buffer(0)]], constant _42& _44 [[buffer(1)]])
vertex main0_out main0(main0_in in [[stage_in]], constant _RESERVED_IDENTIFIER_FIXUP_1365_18812& _RESERVED_IDENTIFIER_FIXUP_18812 [[buffer(0)]], constant _RESERVED_IDENTIFIER_FIXUP_1126_22044& _RESERVED_IDENTIFIER_FIXUP_22044 [[buffer(1)]])
{
main0_out out = {};
float3 _91;
float3 _13;
float3 _RESERVED_IDENTIFIER_FIXUP_2;
float3 _RESERVED_IDENTIFIER_FIXUP_23783;
for (;;)
{
_13 = normalize(float4(in.m_25.xyz, 0.0) * _17._m1);
_RESERVED_IDENTIFIER_FIXUP_23783 = normalize(float4(in._RESERVED_IDENTIFIER_FIXUP_5275.xyz, 0.0) * _RESERVED_IDENTIFIER_FIXUP_18812._RESERVED_IDENTIFIER_FIXUP_m1);
break;
}
float4 _39 = _44._m0 * float4(float3(_44._m3) + (in.m_25.xyz * (_44._m6 + _44._m7)), 1.0);
out.m_72 = _13;
float4 _74 = _39;
_74.y = -_39.y;
out.gl_Position = _74;
float4 _RESERVED_IDENTIFIER_FIXUP_14995 = _RESERVED_IDENTIFIER_FIXUP_22044._RESERVED_IDENTIFIER_FIXUP_m0 * float4(float3(_RESERVED_IDENTIFIER_FIXUP_22044._RESERVED_IDENTIFIER_FIXUP_m10) + (in._RESERVED_IDENTIFIER_FIXUP_5275.xyz * (_RESERVED_IDENTIFIER_FIXUP_22044._RESERVED_IDENTIFIER_FIXUP_m17 + _RESERVED_IDENTIFIER_FIXUP_22044._RESERVED_IDENTIFIER_FIXUP_m18)), 1.0);
out._RESERVED_IDENTIFIER_FIXUP_3976 = _RESERVED_IDENTIFIER_FIXUP_23783;
float4 _RESERVED_IDENTIFIER_FIXUP_6282 = _RESERVED_IDENTIFIER_FIXUP_14995;
_RESERVED_IDENTIFIER_FIXUP_6282.y = -_RESERVED_IDENTIFIER_FIXUP_14995.y;
out.gl_Position = _RESERVED_IDENTIFIER_FIXUP_6282;
return out;
}

View File

@ -0,0 +1,17 @@
#version 450
layout(location = 0) out vec4 _RESERVED_IDENTIFIER_FIXUP_spvFoo;
layout(location = 1) out vec4 SPIRV_Cross_blah;
layout(location = 2) out vec4 _40Bar;
layout(location = 3) out vec4 _m40;
layout(location = 4) out vec4 _underscore_foo_bar_meep_;
void main()
{
_RESERVED_IDENTIFIER_FIXUP_spvFoo = vec4(0.0);
SPIRV_Cross_blah = vec4(1.0);
_40Bar = vec4(2.0);
_m40 = vec4(3.0);
_underscore_foo_bar_meep_ = vec4(4.0);
}

View File

@ -20,7 +20,7 @@
"name" : "UAV0",
"members" : [
{
"name" : "_data",
"name" : "@data",
"type" : "vec4",
"array" : [
0

View File

@ -20,7 +20,7 @@
"name" : "UAV0",
"members" : [
{
"name" : "_data",
"name" : "@data",
"type" : "vec4",
"array" : [
0

View File

@ -20,7 +20,7 @@
"name" : "UAV0",
"members" : [
{
"name" : "_data",
"name" : "@data",
"type" : "vec4",
"array" : [
0

View File

@ -20,7 +20,7 @@
"name" : "UAV0",
"members" : [
{
"name" : "_data",
"name" : "@data",
"type" : "vec4",
"array" : [
0

View File

@ -8,7 +8,7 @@
"outputs" : [
{
"type" : "vec4",
"name" : "_entryPointOutput",
"name" : "@entryPointOutput",
"location" : 0
}
],

View File

@ -197,10 +197,10 @@ struct main0_out
float4 out_var_SV_Target0 [[color(0)]];
};
fragment main0_out main0(constant type_View& View [[buffer(0)]], constant type_Globals& _Globals [[buffer(1)]], float4 _gl_LastFragData [[color(0)]], texture2d<float> ShadowDepthTexture [[texture(0)]], sampler ShadowDepthTextureSampler [[sampler(0)]], float4 gl_FragCoord [[position]])
fragment main0_out main0(constant type_View& View [[buffer(0)]], constant type_Globals& _Globals [[buffer(1)]], float4 _RESERVED_IDENTIFIER_FIXUP_gl_LastFragData [[color(0)]], texture2d<float> ShadowDepthTexture [[texture(0)]], sampler ShadowDepthTextureSampler [[sampler(0)]], float4 gl_FragCoord [[position]])
{
main0_out out = {};
float4 _67 = _gl_LastFragData;
float4 _67 = _RESERVED_IDENTIFIER_FIXUP_gl_LastFragData;
float _68 = _67.w;
float4 _82 = _Globals.ScreenToShadowMatrix * float4((((gl_FragCoord.xy * View.View_BufferSizeAndInvSize.zw) - View.View_ScreenPositionScaleBias.wz) / View.View_ScreenPositionScaleBias.xy) * float2(_68), _68, 1.0);
float _118 = fast::clamp(((fast::clamp((ShadowDepthTexture.sample(ShadowDepthTextureSampler, (((_82.xyz / float3(_82.w)).xy * _Globals.ShadowTileOffsetAndSize.zw).xy + _Globals.ShadowTileOffsetAndSize.xy).xy, level(0.0)).xxx * float3(_Globals.SoftTransitionScale.z)) - float3((fast::min(_82.z, 0.999989986419677734375) * _Globals.SoftTransitionScale.z) - 1.0), float3(0.0), float3(1.0)).x - 0.5) * _Globals.ShadowSharpen) + 0.5, 0.0, 1.0);

View File

@ -0,0 +1,51 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 24
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %spvFoo %SPIRV_Cross_blah %_40 %_m40 %_underscore_foo_bar_meep
OpExecutionMode %main OriginUpperLeft
OpSource GLSL 450
OpName %main "main"
OpName %spvFoo "spvFoo"
OpName %SPIRV_Cross_blah "SPIRV_Cross_blah"
OpName %_40 "_40Bar"
OpName %_m40 "_m40"
OpName %_underscore_foo_bar_meep "__underscore_foo__bar_meep__"
OpDecorate %spvFoo Location 0
OpDecorate %SPIRV_Cross_blah Location 1
OpDecorate %_40 Location 2
OpDecorate %_m40 Location 3
OpDecorate %_underscore_foo_bar_meep Location 4
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%spvFoo = OpVariable %_ptr_Output_v4float Output
%float_0 = OpConstant %float 0
%11 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
%SPIRV_Cross_blah = OpVariable %_ptr_Output_v4float Output
%float_1 = OpConstant %float 1
%14 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%_40 = OpVariable %_ptr_Output_v4float Output
%float_2 = OpConstant %float 2
%17 = OpConstantComposite %v4float %float_2 %float_2 %float_2 %float_2
%_m40 = OpVariable %_ptr_Output_v4float Output
%float_3 = OpConstant %float 3
%20 = OpConstantComposite %v4float %float_3 %float_3 %float_3 %float_3
%_underscore_foo_bar_meep = OpVariable %_ptr_Output_v4float Output
%float_4 = OpConstant %float 4
%23 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_4
%main = OpFunction %void None %3
%5 = OpLabel
OpStore %spvFoo %11
OpStore %SPIRV_Cross_blah %14
OpStore %_40 %17
OpStore %_m40 %20
OpStore %_underscore_foo_bar_meep %23
OpReturn
OpFunctionEnd

View File

@ -306,6 +306,8 @@ void CompilerCPP::emit_resources()
string CompilerCPP::compile()
{
ir.fixup_reserved_names();
// Do not deal with ES-isms like precision, older extensions and such.
options.es = false;
options.version = 450;

View File

@ -74,6 +74,8 @@ ParsedIR &ParsedIR::operator=(ParsedIR &&other) SPIRV_CROSS_NOEXCEPT
source = other.source;
loop_iteration_depth_hard = other.loop_iteration_depth_hard;
loop_iteration_depth_soft = other.loop_iteration_depth_soft;
meta_needing_name_fixup = std::move(other.meta_needing_name_fixup);
}
return *this;
}
@ -106,6 +108,8 @@ ParsedIR &ParsedIR::operator=(const ParsedIR &other)
addressing_model = other.addressing_model;
memory_model = other.memory_model;
meta_needing_name_fixup = other.meta_needing_name_fixup;
// Very deliberate copying of IDs. There is no default copy constructor, nor a simple default constructor.
// Construct object first so we have the correct allocator set-up, then we can copy object into our new pool group.
ids.clear();
@ -134,42 +138,146 @@ static bool is_alpha(char c)
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
static bool is_alphanumeric(char c)
static bool is_numeric(char c)
{
return is_alpha(c) || (c >= '0' && c <= '9');
return c >= '0' && c <= '9';
}
static string ensure_valid_identifier(const string &name, bool member)
static bool is_alphanumeric(char c)
{
return is_alpha(c) || is_numeric(c);
}
static bool is_valid_identifier(const string &name)
{
if (name.empty())
return true;
if (is_numeric(name[0]))
return false;
for (auto c : name)
if (!is_alphanumeric(c) && c != '_')
return false;
bool saw_underscore = false;
// Two underscores in a row is not a valid identifier either.
// Technically reserved, but it's easier to treat it as invalid.
for (auto c : name)
{
bool is_underscore = c == '_';
if (is_underscore && saw_underscore)
return false;
saw_underscore = is_underscore;
}
return true;
}
static bool is_reserved_prefix(const string &name)
{
// Generic reserved identifiers used by the implementation.
return name.compare(0, 3, "gl_", 3) == 0 ||
// Ignore this case for now, might rewrite internal code to always use spv prefix.
//name.compare(0, 11, "SPIRV_Cross", 11) == 0 ||
name.compare(0, 3, "spv", 3) == 0;
}
static bool is_reserved_identifier(const string &name, bool member, bool allow_reserved_prefixes)
{
if (!allow_reserved_prefixes && is_reserved_prefix(name))
return true;
if (member)
{
// Reserved member identifiers come in one form:
// _m[0-9]+$.
if (name.size() < 3)
return false;
if (name.compare(0, 2, "_m", 2) != 0)
return false;
size_t index = 2;
while (index < name.size() && is_numeric(name[index]))
index++;
return index == name.size();
}
else
{
// Reserved non-member identifiers come in two forms:
// _[0-9]+$, used for temporaries which map directly to a SPIR-V ID.
// _[0-9]+_, used for auxillary temporaries which derived from a SPIR-V ID.
if (name.size() < 2)
return false;
if (name[0] != '_' || !is_numeric(name[1]))
return false;
size_t index = 2;
while (index < name.size() && is_numeric(name[index]))
index++;
return index == name.size() || (index < name.size() && name[index] == '_');
}
}
bool ParsedIR::is_globally_reserved_identifier(std::string &str, bool allow_reserved_prefixes)
{
return is_reserved_identifier(str, false, allow_reserved_prefixes);
}
static string make_unreserved_identifier(const string &name)
{
if (is_reserved_prefix(name))
return "_RESERVED_IDENTIFIER_FIXUP_" + name;
else
return "_RESERVED_IDENTIFIER_FIXUP" + name;
}
void ParsedIR::sanitize_underscores(std::string &str)
{
// Compact adjacent underscores to make it valid.
auto dst = str.begin();
auto src = dst;
bool saw_underscore = false;
while (src != str.end())
{
bool is_underscore = *src == '_';
if (saw_underscore && is_underscore)
{
src++;
}
else
{
if (dst != src)
*dst = *src;
dst++;
src++;
saw_underscore = is_underscore;
}
}
str.erase(dst, str.end());
}
static string ensure_valid_identifier(const string &name)
{
// Functions in glslangValidator are mangled with name(<mangled> stuff.
// Normally, we would never see '(' in any legal identifiers, so just strip them out.
auto str = name.substr(0, name.find('('));
for (uint32_t i = 0; i < str.size(); i++)
{
auto &c = str[i];
if (str.empty())
return str;
if (member)
{
// _m<num> variables are reserved by the internal implementation,
// otherwise, make sure the name is a valid identifier.
if (i == 0)
c = is_alpha(c) ? c : '_';
else if (i == 2 && str[0] == '_' && str[1] == 'm')
c = is_alpha(c) ? c : '_';
else
c = is_alphanumeric(c) ? c : '_';
}
else
{
// _<num> variables are reserved by the internal implementation,
// otherwise, make sure the name is a valid identifier.
if (i == 0 || (str[0] == '_' && i == 1))
c = is_alpha(c) ? c : '_';
else
c = is_alphanumeric(c) ? c : '_';
}
}
if (is_numeric(str[0]))
str[0] = '_';
for (auto &c : str)
if (!is_alphanumeric(c) && c != '_')
c = '_';
ParsedIR::sanitize_underscores(str);
return str;
}
@ -195,35 +303,41 @@ const string &ParsedIR::get_member_name(TypeID id, uint32_t index) const
return empty_string;
}
void ParsedIR::sanitize_identifier(std::string &name, bool member, bool allow_reserved_prefixes)
{
if (!is_valid_identifier(name))
name = ensure_valid_identifier(name);
if (is_reserved_identifier(name, member, allow_reserved_prefixes))
name = make_unreserved_identifier(name);
}
void ParsedIR::fixup_reserved_names()
{
for (uint32_t id : meta_needing_name_fixup)
{
auto &m = meta[id];
sanitize_identifier(m.decoration.alias, false, false);
for (auto &memb : m.members)
sanitize_identifier(memb.alias, true, false);
}
meta_needing_name_fixup.clear();
}
void ParsedIR::set_name(ID id, const string &name)
{
auto &str = meta[id].decoration.alias;
str.clear();
if (name.empty())
return;
// Reserved for temporaries.
if (name[0] == '_' && name.size() >= 2 && isdigit(name[1]))
return;
str = ensure_valid_identifier(name, false);
auto &m = meta[id];
m.decoration.alias = name;
if (!is_valid_identifier(name) || is_reserved_identifier(name, false, false))
meta_needing_name_fixup.insert(id);
}
void ParsedIR::set_member_name(TypeID id, uint32_t index, const string &name)
{
meta[id].members.resize(max(meta[id].members.size(), size_t(index) + 1));
auto &str = meta[id].members[index].alias;
str.clear();
if (name.empty())
return;
// Reserved for unnamed members.
if (name[0] == '_' && name.size() >= 3 && name[1] == 'm' && isdigit(name[2]))
return;
str = ensure_valid_identifier(name, true);
auto &m = meta[id];
m.members.resize(max(meta[id].members.size(), size_t(index) + 1));
m.members[index].alias = name;
if (!is_valid_identifier(name) || is_reserved_identifier(name, true, false))
meta_needing_name_fixup.insert(id);
}
void ParsedIR::set_decoration_string(ID id, Decoration decoration, const string &argument)

View File

@ -208,6 +208,12 @@ public:
void make_constant_null(uint32_t id, uint32_t type, bool add_to_typed_id_set);
void fixup_reserved_names();
static void sanitize_underscores(std::string &str);
static void sanitize_identifier(std::string &str, bool member, bool allow_reserved_prefixes);
static bool is_globally_reserved_identifier(std::string &str, bool allow_reserved_prefixes);
private:
template <typename T>
T &get(uint32_t id)
@ -225,6 +231,8 @@ private:
mutable uint32_t loop_iteration_depth_soft = 0;
std::string empty_string;
Bitset cleared_bitset;
std::unordered_set<uint32_t> meta_needing_name_fixup;
};
} // namespace SPIRV_CROSS_NAMESPACE

View File

@ -145,32 +145,6 @@ static BufferPackingStandard packing_to_substruct_packing(BufferPackingStandard
}
}
// Sanitizes underscores for GLSL where multiple underscores in a row are not allowed.
string CompilerGLSL::sanitize_underscores(const string &str)
{
string res;
res.reserve(str.size());
bool last_underscore = false;
for (auto c : str)
{
if (c == '_')
{
if (last_underscore)
continue;
res += c;
last_underscore = true;
}
else
{
res += c;
last_underscore = false;
}
}
return res;
}
void CompilerGLSL::init()
{
if (ir.source.known)
@ -529,6 +503,8 @@ void CompilerGLSL::find_static_extensions()
string CompilerGLSL::compile()
{
ir.fixup_reserved_names();
if (options.vulkan_semantics)
backend.allow_precision_qualifiers = true;
else
@ -2150,7 +2126,7 @@ void CompilerGLSL::emit_flattened_io_block_member(const std::string &basename, c
// Sanitize underscores because joining the two identifiers might create more than 1 underscore in a row,
// which is not allowed.
flattened_name = sanitize_underscores(flattened_name);
ParsedIR::sanitize_underscores(flattened_name);
uint32_t last_index = indices.back();
@ -2693,6 +2669,23 @@ bool CompilerGLSL::should_force_emit_builtin_block(StorageClass storage)
return should_force;
}
void CompilerGLSL::fixup_implicit_builtin_block_names()
{
ir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {
auto &type = this->get<SPIRType>(var.basetype);
bool block = has_decoration(type.self, DecorationBlock);
if ((var.storage == StorageClassOutput || var.storage == StorageClassInput) && block &&
is_builtin_variable(var))
{
// Make sure the array has a supported name in the code.
if (var.storage == StorageClassOutput)
set_name(var.self, "gl_out");
else if (var.storage == StorageClassInput)
set_name(var.self, "gl_in");
}
});
}
void CompilerGLSL::emit_declared_builtin_block(StorageClass storage, ExecutionModel model)
{
Bitset emitted_builtins;
@ -2874,12 +2867,6 @@ void CompilerGLSL::emit_declared_builtin_block(StorageClass storage, ExecutionMo
if (builtin_array)
{
// Make sure the array has a supported name in the code.
if (storage == StorageClassOutput)
set_name(block_var->self, "gl_out");
else if (storage == StorageClassInput)
set_name(block_var->self, "gl_in");
if (model == ExecutionModelTessellationControl && storage == StorageClassOutput)
end_scope_decl(join(to_name(block_var->self), "[", get_entry_point().output_vertices, "]"));
else
@ -2936,6 +2923,18 @@ void CompilerGLSL::emit_resources()
if (!pls_inputs.empty() || !pls_outputs.empty())
emit_pls();
switch (execution.model)
{
case ExecutionModelGeometry:
case ExecutionModelTessellationControl:
case ExecutionModelTessellationEvaluation:
fixup_implicit_builtin_block_names();
break;
default:
break;
}
// Emit custom gl_PerVertex for SSO compatibility.
if (options.separate_shader_objects && !options.es && execution.model != ExecutionModelFragment)
{
@ -7793,7 +7792,9 @@ void CompilerGLSL::prepare_access_chain_for_scalar_access(std::string &, const S
string CompilerGLSL::to_flattened_struct_member(const string &basename, const SPIRType &type, uint32_t index)
{
return sanitize_underscores(join(basename, "_", to_member_name(type, index)));
auto ret = join(basename, "_", to_member_name(type, index));
ParsedIR::sanitize_underscores(ret);
return ret;
}
string CompilerGLSL::access_chain(uint32_t base, const uint32_t *indices, uint32_t count, const SPIRType &target_type,
@ -7837,7 +7838,9 @@ string CompilerGLSL::access_chain(uint32_t base, const uint32_t *indices, uint32
}
auto basename = to_flattened_access_chain_expression(base);
return sanitize_underscores(join(basename, "_", chain));
auto ret = join(basename, "_", chain);
ParsedIR::sanitize_underscores(ret);
return ret;
}
else
{
@ -7895,7 +7898,8 @@ void CompilerGLSL::store_flattened_struct(const string &basename, uint32_t rhs_i
for (uint32_t i = 0; i < uint32_t(member_type->member_types.size()); i++)
{
sub_indices.back() = i;
auto lhs = sanitize_underscores(join(basename, "_", to_member_name(*member_type, i)));
auto lhs = join(basename, "_", to_member_name(*member_type, i));
ParsedIR::sanitize_underscores(lhs);
if (get<SPIRType>(member_type->member_types[i]).basetype == SPIRType::Struct)
{
@ -11435,13 +11439,7 @@ void CompilerGLSL::add_member_name(SPIRType &type, uint32_t index)
if (name.empty())
return;
// Reserved for temporaries.
if (name[0] == '_' && name.size() >= 2 && isdigit(name[1]))
{
name.clear();
return;
}
ParsedIR::sanitize_identifier(name, true, true);
update_name_cache(type.member_name_cache, name);
}
}
@ -12167,16 +12165,13 @@ void CompilerGLSL::add_variable(unordered_set<string> &variables_primary,
if (name.empty())
return;
// Reserved for temporaries.
if (name[0] == '_' && name.size() >= 2 && isdigit(name[1]))
ParsedIR::sanitize_underscores(name);
if (ParsedIR::is_globally_reserved_identifier(name, true))
{
name.clear();
return;
}
// Avoid double underscores.
name = sanitize_underscores(name);
update_name_cache(variables_primary, variables_secondary, name);
}

View File

@ -487,6 +487,7 @@ protected:
void emit_buffer_reference_block(SPIRType &type, bool forward_declaration);
void emit_buffer_block_legacy(const SPIRVariable &var);
void emit_buffer_block_flattened(const SPIRVariable &type);
void fixup_implicit_builtin_block_names();
void emit_declared_builtin_block(spv::StorageClass storage, spv::ExecutionModel model);
bool should_force_emit_builtin_block(spv::StorageClass storage);
void emit_push_constant_block_vulkan(const SPIRVariable &var);
@ -757,8 +758,6 @@ protected:
virtual void declare_undefined_values();
static std::string sanitize_underscores(const std::string &str);
bool can_use_io_location(spv::StorageClass storage, bool block);
const Instruction *get_next_instruction_in_block(const Instruction &instr);
static uint32_t mask_relevant_memory_semantics(uint32_t semantics);

View File

@ -971,7 +971,9 @@ std::string CompilerHLSL::builtin_to_glsl(spv::BuiltIn builtin, spv::StorageClas
auto &var = get<SPIRVariable>(num_workgroups_builtin);
auto &type = get<SPIRType>(var.basetype);
return sanitize_underscores(join(to_name(num_workgroups_builtin), "_", get_member_name(type.self, 0)));
auto ret = join(to_name(num_workgroups_builtin), "_", get_member_name(type.self, 0));
ParsedIR::sanitize_underscores(ret);
return ret;
}
case BuiltInPointCoord:
// Crude hack, but there is no real alternative. This path is only enabled if point_coord_compat is set.
@ -2076,7 +2078,9 @@ void CompilerHLSL::emit_buffer_block(const SPIRVariable &var)
add_member_name(type, i);
auto backup_name = get_member_name(type.self, i);
auto member_name = to_member_name(type, i);
set_member_name(type.self, i, sanitize_underscores(join(to_name(var.self), "_", member_name)));
member_name = join(to_name(var.self), "_", member_name);
ParsedIR::sanitize_underscores(member_name);
set_member_name(type.self, i, member_name);
emit_struct_member(type, member, i, "");
set_member_name(type.self, i, backup_name);
i++;
@ -2157,8 +2161,9 @@ void CompilerHLSL::emit_push_constant_block(const SPIRVariable &var)
add_member_name(type, constant_index);
auto backup_name = get_member_name(type.self, i);
auto member_name = to_member_name(type, i);
set_member_name(type.self, constant_index,
sanitize_underscores(join(to_name(var.self), "_", member_name)));
member_name = join(to_name(var.self), "_", member_name);
ParsedIR::sanitize_underscores(member_name);
set_member_name(type.self, constant_index, member_name);
emit_struct_member(type, member, i, "", layout.start);
set_member_name(type.self, constant_index, backup_name);
@ -5590,6 +5595,8 @@ void CompilerHLSL::validate_shader_model()
string CompilerHLSL::compile()
{
ir.fixup_reserved_names();
// Do not deal with ES-isms like precision, older extensions and such.
options.es = false;
options.version = 450;

View File

@ -589,7 +589,7 @@ void CompilerMSL::build_implicit_builtins()
uint_type_ptr_out.pointer = true;
uint_type_ptr_out.parent_type = get_uint_type_id();
uint_type_ptr_out.storage = StorageClassOutput;
auto &ptr_out_type = set<SPIRType>(offset, uint_type_ptr_out);
ptr_out_type.self = get_uint_type_id();
set<SPIRVariable>(var_id, offset, StorageClassOutput);
@ -1028,6 +1028,8 @@ void CompilerMSL::emit_entry_point_declarations()
string CompilerMSL::compile()
{
ir.fixup_reserved_names();
// Do not deal with GLES-isms like precision, older extensions and such.
options.vulkan_semantics = true;
options.es = false;