| struct Transform |
| { |
| float4 mat; |
| float2 translate; |
| }; |
| |
| static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); |
| |
| static const Transform _23 = { float4(1.0f, 0.0f, 0.0f, 1.0f), 0.0f.xx }; |
| |
| RWByteAddressBuffer _89 : register(u0, space0); |
| |
| static uint3 gl_LocalInvocationID; |
| static uint3 gl_GlobalInvocationID; |
| struct SPIRV_Cross_Input |
| { |
| uint3 gl_LocalInvocationID : SV_GroupThreadID; |
| uint3 gl_GlobalInvocationID : SV_DispatchThreadID; |
| }; |
| |
| groupshared Transform sh_scratch[256]; |
| |
| Transform combine_monoid(Transform a, Transform b) |
| { |
| Transform c; |
| c.mat = (a.mat.xyxy * b.mat.xxzz) + (a.mat.zwzw * b.mat.yyww); |
| c.translate = ((a.mat.xy * b.translate.x) + (a.mat.zw * b.translate.y)) + a.translate; |
| return c; |
| } |
| |
| Transform monoid_identity() |
| { |
| return _23; |
| } |
| |
| void comp_main() |
| { |
| uint ix = gl_GlobalInvocationID.x * 8u; |
| Transform _93; |
| _93.mat = asfloat(_89.Load4(ix * 32 + 0)); |
| _93.translate = asfloat(_89.Load2(ix * 32 + 16)); |
| Transform local[8]; |
| local[0].mat = _93.mat; |
| local[0].translate = _93.translate; |
| Transform param_1; |
| for (uint i = 1u; i < 8u; i++) |
| { |
| Transform param = local[i - 1u]; |
| Transform _119; |
| _119.mat = asfloat(_89.Load4((ix + i) * 32 + 0)); |
| _119.translate = asfloat(_89.Load2((ix + i) * 32 + 16)); |
| param_1.mat = _119.mat; |
| param_1.translate = _119.translate; |
| local[i] = combine_monoid(param, param_1); |
| } |
| Transform agg = local[7]; |
| sh_scratch[gl_LocalInvocationID.x] = agg; |
| for (uint i_1 = 0u; i_1 < 8u; i_1++) |
| { |
| GroupMemoryBarrierWithGroupSync(); |
| if (gl_LocalInvocationID.x >= (1u << i_1)) |
| { |
| Transform other = sh_scratch[gl_LocalInvocationID.x - (1u << i_1)]; |
| Transform param_2 = other; |
| Transform param_3 = agg; |
| agg = combine_monoid(param_2, param_3); |
| } |
| GroupMemoryBarrierWithGroupSync(); |
| sh_scratch[gl_LocalInvocationID.x] = agg; |
| } |
| GroupMemoryBarrierWithGroupSync(); |
| Transform row = monoid_identity(); |
| if (gl_LocalInvocationID.x > 0u) |
| { |
| row = sh_scratch[gl_LocalInvocationID.x - 1u]; |
| } |
| for (uint i_2 = 0u; i_2 < 8u; i_2++) |
| { |
| Transform param_4 = row; |
| Transform param_5 = local[i_2]; |
| Transform m = combine_monoid(param_4, param_5); |
| uint _208 = ix + i_2; |
| _89.Store4(_208 * 32 + 0, asuint(m.mat)); |
| _89.Store2(_208 * 32 + 16, asuint(m.translate)); |
| } |
| } |
| |
| [numthreads(256, 1, 1)] |
| void main(SPIRV_Cross_Input stage_input) |
| { |
| gl_LocalInvocationID = stage_input.gl_LocalInvocationID; |
| gl_GlobalInvocationID = stage_input.gl_GlobalInvocationID; |
| comp_main(); |
| } |