blob: 0d672cf889b45e03acd8ad789d338c6d83e8a0c8 [file] [log] [blame]
SKIP: FAILED
../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: Camera = struct @align(16) {
projection:mat4x4<f32> @offset(0)
inverseProjection:mat4x4<f32> @offset(64)
view:mat4x4<f32> @offset(128)
position:vec3<f32> @offset(192)
time:f32 @offset(204)
outputSize:vec2<f32> @offset(208)
zNear:f32 @offset(216)
zFar:f32 @offset(220)
}
ClusterLights = struct @align(4) {
offset:u32 @offset(0)
count:u32 @offset(4)
}
ClusterLightGroup = struct @align(4) {
offset:u32 @offset(0)
lights:array<ClusterLights, 27648> @offset(4)
indices:array<u32, 1769472> @offset(221188)
}
Light = struct @align(16) {
position:vec3<f32> @offset(0)
range:f32 @offset(12)
color:vec3<f32> @offset(16)
intensity:f32 @offset(28)
}
GlobalLights = struct @align(16) {
ambient:vec3<f32> @offset(0)
dirColor:vec3<f32> @offset(16)
dirIntensity:f32 @offset(28)
dirDirection:vec3<f32> @offset(32)
lightCount:u32 @offset(44)
lights:array<Light> @offset(48)
}
LightShadowTable = struct @align(4) {
light:array<i32> @offset(0)
}
ShadowProperties = struct @align(16) {
viewport:vec4<f32> @offset(0)
viewProj:mat4x4<f32> @offset(16)
}
LightShadows = struct @align(16) {
properties:array<ShadowProperties> @offset(0)
}
Material = struct @align(16) {
baseColorFactor:vec4<f32> @offset(0)
emissiveFactor:vec3<f32> @offset(16)
occlusionStrength:f32 @offset(28)
metallicRoughnessFactor:vec2<f32> @offset(32)
alphaCutoff:f32 @offset(40)
}
SurfaceInfo = struct @align(16) {
baseColor:vec4<f32> @offset(0)
albedo:vec3<f32> @offset(16)
metallic:f32 @offset(28)
roughness:f32 @offset(32)
normal:vec3<f32> @offset(48)
f0:vec3<f32> @offset(64)
ao:f32 @offset(76)
emissive:vec3<f32> @offset(80)
v:vec3<f32> @offset(96)
}
VertexOutput = struct @align(16) {
position:vec4<f32> @offset(0), @builtin(position)
worldPos:vec3<f32> @offset(16), @location(0)
view:vec3<f32> @offset(32), @location(1)
texcoord:vec2<f32> @offset(48), @location(2)
texcoord2:vec2<f32> @offset(56), @location(3)
color:vec4<f32> @offset(64), @location(4)
instanceColor:vec4<f32> @offset(80), @location(5)
normal:vec3<f32> @offset(96), @location(6)
tangent:vec3<f32> @offset(112), @location(7)
bitangent:vec3<f32> @offset(128), @location(8)
}
PuctualLight = struct @align(16) {
lightType:u32 @offset(0)
pointToLight:vec3<f32> @offset(16)
range:f32 @offset(28)
color:vec3<f32> @offset(32)
intensity:f32 @offset(44)
}
FragmentOutput = struct @align(16) {
color:vec4<f32> @offset(0), @location(0)
emissive:vec4<f32> @offset(16), @location(1)
}
$B1: { # root
%camera:ptr<uniform, Camera, read> = var @binding_point(0, 0)
%clusterLights:ptr<storage, ClusterLightGroup, read> = var @binding_point(0, 1)
%globalLights:ptr<storage, GlobalLights, read> = var @binding_point(0, 2)
%defaultSampler:ptr<handle, sampler, read> = var @binding_point(0, 3)
%shadowTexture:ptr<handle, texture_depth_2d, read> = var @binding_point(0, 4)
%shadowSampler:ptr<handle, sampler_comparison, read> = var @binding_point(0, 5)
%lightShadowTable:ptr<storage, LightShadowTable, read> = var @binding_point(0, 6)
%shadowSampleOffsets:ptr<private, array<vec2<f32>, 16>, read_write> = var, array<vec2<f32>, 16>(vec2<f32>(-1.5f), vec2<f32>(-1.5f, -0.5f), vec2<f32>(-1.5f, 0.5f), vec2<f32>(-1.5f, 1.5f), vec2<f32>(-0.5f, -1.5f), vec2<f32>(-0.5f), vec2<f32>(-0.5f, 0.5f), vec2<f32>(-0.5f, 1.5f), vec2<f32>(0.5f, -1.5f), vec2<f32>(0.5f, -0.5f), vec2<f32>(0.5f), vec2<f32>(0.5f, 1.5f), vec2<f32>(1.5f, -1.5f), vec2<f32>(1.5f, -0.5f), vec2<f32>(1.5f, 0.5f), vec2<f32>(1.5f))
%shadow:ptr<storage, LightShadows, read> = var @binding_point(0, 7)
%material:ptr<uniform, Material, read> = var @binding_point(0, 8)
%baseColorTexture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 9)
%baseColorSampler:ptr<handle, sampler, read> = var @binding_point(0, 10)
%normalTexture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 11)
%normalSampler:ptr<handle, sampler, read> = var @binding_point(0, 12)
%metallicRoughnessTexture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 13)
%metallicRoughnessSampler:ptr<handle, sampler, read> = var @binding_point(0, 14)
%occlusionTexture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 15)
%occlusionSampler:ptr<handle, sampler, read> = var @binding_point(0, 16)
%emissiveTexture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 17)
%emissiveSampler:ptr<handle, sampler, read> = var @binding_point(0, 18)
%ssaoTexture:ptr<handle, texture_2d<f32>, read> = var @binding_point(0, 19)
}
%linearTosRGB = func(%linear:vec3<f32>):vec3<f32> {
$B2: {
%INV_GAMMA:f32 = let 0.45454543828964233398f
%25:vec3<f32> = construct %INV_GAMMA
%26:vec3<f32> = pow %linear, %25
ret %26
}
}
%sRGBToLinear = func(%srgb:vec3<f32>):vec3<f32> {
$B3: {
%29:vec3<f32> = pow %srgb, vec3<f32>(2.20000004768371582031f)
ret %29
}
}
%linearDepth = func(%depthSample:f32):f32 {
$B4: {
%32:ptr<uniform, f32, read> = access %camera, 7u
%33:f32 = load %32
%34:ptr<uniform, f32, read> = access %camera, 6u
%35:f32 = load %34
%36:f32 = mul %33, %35
%37:f32 = let %36
%38:ptr<uniform, f32, read> = access %camera, 6u
%39:f32 = load %38
%40:ptr<uniform, f32, read> = access %camera, 7u
%41:f32 = load %40
%42:f32 = sub %39, %41
%43:ptr<uniform, f32, read> = access %camera, 7u
%44:f32 = load %43
%45:f32 = fma %depthSample, %42, %44
%46:f32 = div %37, %45
ret %46
}
}
%getTile = func(%fragCoord:vec4<f32>):vec3<u32> {
$B5: {
%49:ptr<uniform, f32, read> = access %camera, 7u
%50:f32 = load %49
%51:ptr<uniform, f32, read> = access %camera, 6u
%52:f32 = load %51
%53:f32 = div %50, %52
%54:f32 = log2 %53
%55:f32 = div 48.0f, %54
%sliceScale:f32 = let %55
%57:ptr<uniform, f32, read> = access %camera, 6u
%58:f32 = load %57
%59:f32 = log2 %58
%60:f32 = mul 48.0f, %59
%61:f32 = let %60
%62:ptr<uniform, f32, read> = access %camera, 7u
%63:f32 = load %62
%64:ptr<uniform, f32, read> = access %camera, 6u
%65:f32 = load %64
%66:f32 = div %63, %65
%67:f32 = log2 %66
%68:f32 = div %61, %67
%69:f32 = negation %68
%sliceBias:f32 = let %69
%71:f32 = access %fragCoord, 2u
%72:f32 = call %linearDepth, %71
%73:f32 = log2 %72
%74:f32 = mul %73, %sliceScale
%75:f32 = add %74, %sliceBias
%76:f32 = max %75, 0.0f
%77:u32 = call %tint_f32_to_u32, %76
%zTile:u32 = let %77
%80:f32 = access %fragCoord, 0u
%81:ptr<uniform, vec2<f32>, read> = access %camera, 5u
%82:f32 = load_vector_element %81, 0u
%83:f32 = div %82, 32.0f
%84:f32 = div %80, %83
%85:u32 = call %tint_f32_to_u32, %84
%86:u32 = let %85
%87:f32 = access %fragCoord, 1u
%88:ptr<uniform, vec2<f32>, read> = access %camera, 5u
%89:f32 = load_vector_element %88, 1u
%90:f32 = div %89, 18.0f
%91:f32 = div %87, %90
%92:u32 = call %tint_f32_to_u32, %91
%93:vec3<u32> = construct %86, %92, %zTile
ret %93
}
}
%getClusterIndex = func(%fragCoord_1:vec4<f32>):u32 { # %fragCoord_1: 'fragCoord'
$B6: {
%96:vec3<u32> = call %getTile, %fragCoord_1
%tile:vec3<u32> = let %96
%98:u32 = access %tile, 0u
%99:u32 = access %tile, 1u
%100:u32 = mul %99, 32u
%101:u32 = add %98, %100
%102:u32 = access %tile, 2u
%103:u32 = mul %102, 32u
%104:u32 = mul %103, 18u
%105:u32 = add %101, %104
ret %105
}
}
%dirLightVisibility = func(%worldPos:vec3<f32>):f32 {
$B7: {
%108:ptr<storage, i32, read> = access %lightShadowTable, 0u, 0u
%109:i32 = load %108
%shadowIndex:i32 = let %109
%111:bool = eq %shadowIndex, -1i
if %111 [t: $B8] { # if_1
$B8: { # true
ret 1.0f
}
}
%112:ptr<storage, vec4<f32>, read> = access %shadow, 0u, %shadowIndex, 0u
%113:vec4<f32> = load %112
%viewport:vec4<f32> = let %113
%115:ptr<storage, mat4x4<f32>, read> = access %shadow, 0u, %shadowIndex, 1u
%116:mat4x4<f32> = load %115
%117:mat4x4<f32> = let %116
%118:vec4<f32> = construct %worldPos, 1.0f
%119:vec4<f32> = mul %117, %118
%lightPos:vec4<f32> = let %119
%121:vec2<f32> = swizzle %lightPos, xy
%122:f32 = access %lightPos, 3u
%123:vec2<f32> = div %121, %122
%124:vec2<f32> = mul %123, vec2<f32>(0.5f, -0.5f)
%125:vec2<f32> = add %124, vec2<f32>(0.5f)
%126:f32 = access %lightPos, 2u
%127:f32 = access %lightPos, 3u
%128:f32 = div %126, %127
%129:vec3<f32> = construct %125, %128
%shadowPos:vec3<f32> = let %129
%131:vec2<f32> = swizzle %viewport, xy
%132:vec2<f32> = swizzle %shadowPos, xy
%133:vec2<f32> = swizzle %viewport, zw
%134:vec2<f32> = mul %132, %133
%135:vec2<f32> = add %131, %134
%136:vec2<f32> = construct %135
%viewportPos:vec2<f32> = let %136
%138:texture_depth_2d = load %shadowTexture
%139:vec2<u32> = textureDimensions %138, 0i
%140:vec2<f32> = convert %139
%141:vec2<f32> = div 1.0f, %140
%texelSize:vec2<f32> = let %141
%143:vec2<f32> = swizzle %viewport, xy
%144:vec2<f32> = sub %143, %texelSize
%145:vec2<f32> = swizzle %viewport, xy
%146:vec2<f32> = swizzle %viewport, zw
%147:vec2<f32> = add %145, %146
%148:vec2<f32> = add %147, %texelSize
%149:vec4<f32> = construct %144, %148
%clampRect:vec4<f32> = let %149
%visibility:ptr<function, f32, read_write> = var, 0.0f
loop [i: $B9, b: $B10, c: $B11] { # loop_1
$B9: { # initializer
%i:ptr<function, u32, read_write> = var, 0u
next_iteration # -> $B10
}
$B10: { # body
%153:u32 = load %i
%154:bool = lt %153, 16u
if %154 [t: $B12, f: $B13] { # if_2
$B12: { # true
exit_if # if_2
}
$B13: { # false
exit_loop # loop_1
}
}
%155:f32 = load %visibility
%156:f32 = let %155
%157:texture_depth_2d = load %shadowTexture
%158:texture_depth_2d = let %157
%159:sampler_comparison = load %shadowSampler
%160:sampler_comparison = let %159
%161:u32 = load %i
%162:ptr<private, vec2<f32>, read_write> = access %shadowSampleOffsets, %161
%163:vec2<f32> = load %162
%164:vec2<f32> = mul %163, %texelSize
%165:vec2<f32> = add %viewportPos, %164
%166:vec2<f32> = swizzle %clampRect, xy
%167:vec2<f32> = swizzle %clampRect, zw
%168:vec2<f32> = clamp %165, %166, %167
%169:f32 = access %shadowPos, 2u
%170:f32 = sub %169, 0.00300000002607703209f
%171:f32 = textureSampleCompareLevel %158, %160, %168, %170
%172:f32 = add %156, %171
store %visibility, %172
continue # -> $B11
}
$B11: { # continuing
%173:u32 = load %i
%174:u32 = add %173, 1u
store %i, %174
next_iteration # -> $B10
}
}
%175:f32 = load %visibility
%176:f32 = div %175, 16.0f
ret %176
}
}
%getCubeFace = func(%v:vec3<f32>):i32 {
$B14: {
%179:vec3<f32> = abs %v
%vAbs:vec3<f32> = let %179
%181:f32 = access %vAbs, 2u
%182:f32 = access %vAbs, 0u
%183:bool = gte %181, %182
%184:bool = if %183 [t: $B15, f: $B16] { # if_3
$B15: { # true
%185:f32 = access %vAbs, 2u
%186:f32 = access %vAbs, 1u
%187:bool = gte %185, %186
exit_if %187 # if_3
}
$B16: { # false
exit_if false # if_3
}
}
if %184 [t: $B17] { # if_4
$B17: { # true
%188:f32 = access %v, 2u
%189:bool = lt %188, 0.0f
if %189 [t: $B18] { # if_5
$B18: { # true
ret 5i
}
}
ret 4i
}
}
%190:f32 = access %vAbs, 1u
%191:f32 = access %vAbs, 0u
%192:bool = gte %190, %191
if %192 [t: $B19] { # if_6
$B19: { # true
%193:f32 = access %v, 1u
%194:bool = lt %193, 0.0f
if %194 [t: $B20] { # if_7
$B20: { # true
ret 3i
}
}
ret 2i
}
}
%195:f32 = access %v, 0u
%196:bool = lt %195, 0.0f
if %196 [t: $B21] { # if_8
$B21: { # true
ret 1i
}
}
ret 0i
}
}
%pointLightVisibility = func(%lightIndex:u32, %worldPos_1:vec3<f32>, %pointToLight:vec3<f32>):f32 { # %worldPos_1: 'worldPos'
$B22: {
%201:u32 = add %lightIndex, 1u
%202:ptr<storage, i32, read> = access %lightShadowTable, 0u, %201
%203:i32 = load %202
%shadowIndex_1:ptr<function, i32, read_write> = var, %203 # %shadowIndex_1: 'shadowIndex'
%205:i32 = load %shadowIndex_1
%206:bool = eq %205, -1i
if %206 [t: $B23] { # if_9
$B23: { # true
ret 1.0f
}
}
%207:i32 = load %shadowIndex_1
%208:i32 = let %207
%209:vec3<f32> = mul %pointToLight, -1.0f
%210:i32 = call %getCubeFace, %209
%211:i32 = add %208, %210
store %shadowIndex_1, %211
%212:i32 = load %shadowIndex_1
%213:ptr<storage, vec4<f32>, read> = access %shadow, 0u, %212, 0u
%214:vec4<f32> = load %213
%viewport_1:vec4<f32> = let %214 # %viewport_1: 'viewport'
%216:i32 = load %shadowIndex_1
%217:ptr<storage, mat4x4<f32>, read> = access %shadow, 0u, %216, 1u
%218:mat4x4<f32> = load %217
%219:mat4x4<f32> = let %218
%220:vec4<f32> = construct %worldPos_1, 1.0f
%221:vec4<f32> = mul %219, %220
%lightPos_1:vec4<f32> = let %221 # %lightPos_1: 'lightPos'
%223:vec2<f32> = swizzle %lightPos_1, xy
%224:f32 = access %lightPos_1, 3u
%225:vec2<f32> = div %223, %224
%226:vec2<f32> = mul %225, vec2<f32>(0.5f, -0.5f)
%227:vec2<f32> = add %226, vec2<f32>(0.5f)
%228:f32 = access %lightPos_1, 2u
%229:f32 = access %lightPos_1, 3u
%230:f32 = div %228, %229
%231:vec3<f32> = construct %227, %230
%shadowPos_1:vec3<f32> = let %231 # %shadowPos_1: 'shadowPos'
%233:vec2<f32> = swizzle %viewport_1, xy
%234:vec2<f32> = swizzle %shadowPos_1, xy
%235:vec2<f32> = swizzle %viewport_1, zw
%236:vec2<f32> = mul %234, %235
%237:vec2<f32> = add %233, %236
%238:vec2<f32> = construct %237
%viewportPos_1:vec2<f32> = let %238 # %viewportPos_1: 'viewportPos'
%240:texture_depth_2d = load %shadowTexture
%241:vec2<u32> = textureDimensions %240, 0i
%242:vec2<f32> = convert %241
%243:vec2<f32> = div 1.0f, %242
%texelSize_1:vec2<f32> = let %243 # %texelSize_1: 'texelSize'
%245:vec2<f32> = swizzle %viewport_1, xy
%246:vec2<f32> = swizzle %viewport_1, xy
%247:vec2<f32> = swizzle %viewport_1, zw
%248:vec2<f32> = add %246, %247
%249:vec4<f32> = construct %245, %248
%clampRect_1:vec4<f32> = let %249 # %clampRect_1: 'clampRect'
%visibility_1:ptr<function, f32, read_write> = var, 0.0f # %visibility_1: 'visibility'
loop [i: $B24, b: $B25, c: $B26] { # loop_2
$B24: { # initializer
%i_1:ptr<function, u32, read_write> = var, 0u # %i_1: 'i'
next_iteration # -> $B25
}
$B25: { # body
%253:u32 = load %i_1
%254:bool = lt %253, 16u
if %254 [t: $B27, f: $B28] { # if_10
$B27: { # true
exit_if # if_10
}
$B28: { # false
exit_loop # loop_2
}
}
%255:f32 = load %visibility_1
%256:f32 = let %255
%257:texture_depth_2d = load %shadowTexture
%258:texture_depth_2d = let %257
%259:sampler_comparison = load %shadowSampler
%260:sampler_comparison = let %259
%261:u32 = load %i_1
%262:ptr<private, vec2<f32>, read_write> = access %shadowSampleOffsets, %261
%263:vec2<f32> = load %262
%264:vec2<f32> = mul %263, %texelSize_1
%265:vec2<f32> = add %viewportPos_1, %264
%266:vec2<f32> = swizzle %clampRect_1, xy
%267:vec2<f32> = swizzle %clampRect_1, zw
%268:vec2<f32> = clamp %265, %266, %267
%269:f32 = access %shadowPos_1, 2u
%270:f32 = sub %269, 0.00999999977648258209f
%271:f32 = textureSampleCompareLevel %258, %260, %268, %270
%272:f32 = add %256, %271
store %visibility_1, %272
continue # -> $B26
}
$B26: { # continuing
%273:u32 = load %i_1
%274:u32 = add %273, 1u
store %i_1, %274
next_iteration # -> $B25
}
}
%275:f32 = load %visibility_1
%276:f32 = div %275, 16.0f
ret %276
}
}
%GetSurfaceInfo = func(%input:VertexOutput):SurfaceInfo {
$B29: {
%surface:ptr<function, SurfaceInfo, read_write> = var
%280:ptr<function, vec3<f32>, read_write> = access %surface, 8u
%281:vec3<f32> = access %input, 2u
%282:vec3<f32> = normalize %281
store %280, %282
%283:vec3<f32> = access %input, 8u
%284:vec3<f32> = access %input, 9u
%285:vec3<f32> = access %input, 7u
%286:mat3x3<f32> = construct %283, %284, %285
%tbn:mat3x3<f32> = let %286
%288:texture_2d<f32> = load %normalTexture
%289:sampler = load %normalSampler
%290:vec2<f32> = access %input, 3u
%291:vec4<f32> = textureSample %288, %289, %290
%292:vec3<f32> = swizzle %291, xyz
%normalMap:vec3<f32> = let %292
%294:ptr<function, vec3<f32>, read_write> = access %surface, 4u
%295:vec3<f32> = mul 2.0f, %normalMap
%296:vec3<f32> = sub %295, vec3<f32>(1.0f)
%297:vec3<f32> = mul %tbn, %296
%298:vec3<f32> = normalize %297
store %294, %298
%299:texture_2d<f32> = load %baseColorTexture
%300:sampler = load %baseColorSampler
%301:vec2<f32> = access %input, 3u
%302:vec4<f32> = textureSample %299, %300, %301
%baseColorMap:vec4<f32> = let %302
%304:ptr<function, vec4<f32>, read_write> = access %surface, 0u
%305:vec4<f32> = access %input, 5u
%306:ptr<uniform, vec4<f32>, read> = access %material, 0u
%307:vec4<f32> = load %306
%308:vec4<f32> = mul %305, %307
%309:vec4<f32> = mul %308, %baseColorMap
store %304, %309
%310:ptr<function, vec4<f32>, read_write> = access %surface, 0u
%311:f32 = load_vector_element %310, 3u
%312:ptr<uniform, f32, read> = access %material, 4u
%313:f32 = load %312
%314:bool = lt %311, %313
if %314 [t: $B30] { # if_11
$B30: { # true
exit_if # if_11
}
}
%315:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%316:ptr<function, vec4<f32>, read_write> = access %surface, 0u
%317:vec4<f32> = load %316
%318:vec3<f32> = swizzle %317, xyz
store %315, %318
%319:texture_2d<f32> = load %metallicRoughnessTexture
%320:sampler = load %metallicRoughnessSampler
%321:vec2<f32> = access %input, 3u
%322:vec4<f32> = textureSample %319, %320, %321
%metallicRoughnessMap:vec4<f32> = let %322
%324:ptr<function, f32, read_write> = access %surface, 2u
%325:ptr<uniform, vec2<f32>, read> = access %material, 3u
%326:f32 = load_vector_element %325, 0u
%327:f32 = access %metallicRoughnessMap, 2u
%328:f32 = mul %326, %327
store %324, %328
%329:ptr<function, f32, read_write> = access %surface, 3u
%330:ptr<uniform, vec2<f32>, read> = access %material, 3u
%331:f32 = load_vector_element %330, 1u
%332:f32 = access %metallicRoughnessMap, 1u
%333:f32 = mul %331, %332
store %329, %333
%dielectricSpec:vec3<f32> = let vec3<f32>(0.03999999910593032837f)
%335:ptr<function, vec3<f32>, read_write> = access %surface, 5u
%336:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%337:vec3<f32> = load %336
%338:vec3<f32> = let %337
%339:ptr<function, f32, read_write> = access %surface, 2u
%340:f32 = load %339
%341:vec3<f32> = construct %340
%342:vec3<f32> = mix %dielectricSpec, %338, %341
store %335, %342
%343:texture_2d<f32> = load %occlusionTexture
%344:sampler = load %occlusionSampler
%345:vec2<f32> = access %input, 3u
%346:vec4<f32> = textureSample %343, %344, %345
%occlusionMap:vec4<f32> = let %346
%348:ptr<function, f32, read_write> = access %surface, 6u
%349:ptr<uniform, f32, read> = access %material, 2u
%350:f32 = load %349
%351:f32 = access %occlusionMap, 0u
%352:f32 = mul %350, %351
store %348, %352
%353:texture_2d<f32> = load %emissiveTexture
%354:sampler = load %emissiveSampler
%355:vec2<f32> = access %input, 3u
%356:vec4<f32> = textureSample %353, %354, %355
%emissiveMap:vec4<f32> = let %356
%358:ptr<function, vec3<f32>, read_write> = access %surface, 7u
%359:ptr<uniform, vec3<f32>, read> = access %material, 1u
%360:vec3<f32> = load %359
%361:vec3<f32> = swizzle %emissiveMap, xyz
%362:vec3<f32> = mul %360, %361
store %358, %362
%363:f32 = access %input, 6u, 3u
%364:bool = eq %363, 0.0f
if %364 [t: $B31, f: $B32] { # if_12
$B31: { # true
%365:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%366:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%367:vec3<f32> = load %366
%368:vec4<f32> = access %input, 6u
%369:vec3<f32> = swizzle %368, xyz
%370:vec3<f32> = add %367, %369
store %365, %370
exit_if # if_12
}
$B32: { # false
%371:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%372:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%373:vec3<f32> = load %372
%374:vec4<f32> = access %input, 6u
%375:vec3<f32> = swizzle %374, xyz
%376:vec3<f32> = mul %373, %375
store %371, %376
exit_if # if_12
}
}
%377:SurfaceInfo = load %surface
ret %377
}
}
%FresnelSchlick = func(%cosTheta:f32, %F0:vec3<f32>):vec3<f32> {
$B33: {
%381:vec3<f32> = sub vec3<f32>(1.0f), %F0
%382:f32 = sub 1.0f, %cosTheta
%383:f32 = pow %382, 5.0f
%384:vec3<f32> = mul %381, %383
%385:vec3<f32> = add %F0, %384
ret %385
}
}
%DistributionGGX = func(%N:vec3<f32>, %H:vec3<f32>, %roughness:f32):f32 {
$B34: {
%390:f32 = mul %roughness, %roughness
%a:f32 = let %390
%392:f32 = mul %a, %a
%a2:f32 = let %392
%394:f32 = dot %N, %H
%395:f32 = max %394, 0.0f
%NdotH:f32 = let %395
%397:f32 = mul %NdotH, %NdotH
%NdotH2:f32 = let %397
%num:f32 = let %a2
%400:f32 = sub %a2, 1.0f
%401:f32 = mul %NdotH2, %400
%402:f32 = add %401, 1.0f
%denom:f32 = let %402
%404:f32 = mul 3.14159274101257324219f, %denom
%405:f32 = mul %404, %denom
%406:f32 = div %num, %405
ret %406
}
}
%GeometrySchlickGGX = func(%NdotV:f32, %roughness_1:f32):f32 { # %roughness_1: 'roughness'
$B35: {
%410:f32 = add %roughness_1, 1.0f
%r:f32 = let %410
%412:f32 = mul %r, %r
%413:f32 = div %412, 8.0f
%k:f32 = let %413
%num_1:f32 = let %NdotV # %num_1: 'num'
%416:f32 = sub 1.0f, %k
%417:f32 = mul %NdotV, %416
%418:f32 = add %417, %k
%denom_1:f32 = let %418 # %denom_1: 'denom'
%420:f32 = div %num_1, %denom_1
ret %420
}
}
%GeometrySmith = func(%N_1:vec3<f32>, %V:vec3<f32>, %L:vec3<f32>, %roughness_2:f32):f32 { # %N_1: 'N', %roughness_2: 'roughness'
$B36: {
%426:f32 = dot %N_1, %V
%427:f32 = max %426, 0.0f
%NdotV_1:f32 = let %427 # %NdotV_1: 'NdotV'
%429:f32 = dot %N_1, %L
%430:f32 = max %429, 0.0f
%NdotL:f32 = let %430
%432:f32 = call %GeometrySchlickGGX, %NdotV_1, %roughness_2
%ggx2:f32 = let %432
%434:f32 = call %GeometrySchlickGGX, %NdotL, %roughness_2
%ggx1:f32 = let %434
%436:f32 = mul %ggx1, %ggx2
ret %436
}
}
%lightAttenuation = func(%light:PuctualLight):f32 {
$B37: {
%439:u32 = access %light, 0u
%440:bool = eq %439, 2u
if %440 [t: $B38] { # if_13
$B38: { # true
ret 1.0f
}
}
%441:vec3<f32> = access %light, 1u
%442:f32 = length %441
%distance:f32 = let %442
%444:f32 = access %light, 2u
%445:bool = lte %444, 0.0f
if %445 [t: $B39] { # if_14
$B39: { # true
%446:f32 = pow %distance, 2.0f
%447:f32 = div 1.0f, %446
ret %447
}
}
%448:f32 = access %light, 2u
%449:f32 = div %distance, %448
%450:f32 = pow %449, 4.0f
%451:f32 = sub 1.0f, %450
%452:f32 = clamp %451, 0.0f, 1.0f
%453:f32 = let %452
%454:f32 = pow %distance, 2.0f
%455:f32 = div %453, %454
ret %455
}
}
%lightRadiance = func(%light_1:PuctualLight, %surface_1:SurfaceInfo):vec3<f32> { # %light_1: 'light', %surface_1: 'surface'
$B40: {
%459:vec3<f32> = access %light_1, 1u
%460:vec3<f32> = normalize %459
%L_1:vec3<f32> = let %460 # %L_1: 'L'
%462:vec3<f32> = access %surface_1, 8u
%463:vec3<f32> = add %462, %L_1
%464:vec3<f32> = normalize %463
%H_1:vec3<f32> = let %464 # %H_1: 'H'
%466:vec3<f32> = access %surface_1, 4u
%467:f32 = access %surface_1, 3u
%468:f32 = call %DistributionGGX, %466, %H_1, %467
%NDF:f32 = let %468
%470:vec3<f32> = access %surface_1, 4u
%471:vec3<f32> = access %surface_1, 8u
%472:f32 = access %surface_1, 3u
%473:f32 = call %GeometrySmith, %470, %471, %L_1, %472
%G:f32 = let %473
%475:vec3<f32> = access %surface_1, 8u
%476:f32 = dot %H_1, %475
%477:f32 = max %476, 0.0f
%478:vec3<f32> = access %surface_1, 5u
%479:vec3<f32> = call %FresnelSchlick, %477, %478
%F:vec3<f32> = let %479
%481:vec3<f32> = sub vec3<f32>(1.0f), %F
%482:f32 = access %surface_1, 2u
%483:f32 = sub 1.0f, %482
%484:vec3<f32> = mul %481, %483
%kD:vec3<f32> = let %484
%486:vec3<f32> = access %surface_1, 4u
%487:f32 = dot %486, %L_1
%488:f32 = max %487, 0.0f
%NdotL_1:f32 = let %488 # %NdotL_1: 'NdotL'
%490:f32 = mul %NDF, %G
%491:vec3<f32> = mul %490, %F
%numerator:vec3<f32> = let %491
%493:vec3<f32> = access %surface_1, 4u
%494:vec3<f32> = access %surface_1, 8u
%495:f32 = dot %493, %494
%496:f32 = max %495, 0.0f
%497:f32 = mul 4.0f, %496
%498:f32 = mul %497, %NdotL_1
%499:f32 = max %498, 0.00100000004749745131f
%denominator:f32 = let %499
%501:vec3<f32> = construct %denominator
%502:vec3<f32> = div %numerator, %501
%specular:vec3<f32> = let %502
%504:vec3<f32> = access %light_1, 3u
%505:f32 = access %light_1, 4u
%506:vec3<f32> = mul %504, %505
%507:f32 = call %lightAttenuation, %light_1
%508:vec3<f32> = mul %506, %507
%radiance:vec3<f32> = let %508
%510:vec3<f32> = access %surface_1, 1u
%511:vec3<f32> = mul %kD, %510
%512:vec3<f32> = div %511, vec3<f32>(3.14159274101257324219f)
%513:vec3<f32> = add %512, %specular
%514:vec3<f32> = mul %513, %radiance
%515:vec3<f32> = mul %514, %NdotL_1
ret %515
}
}
%fragmentMain = @fragment func(%input_1:VertexOutput):FragmentOutput { # %input_1: 'input'
$B41: {
%518:SurfaceInfo = call %GetSurfaceInfo, %input_1
%surface_2:SurfaceInfo = let %518 # %surface_2: 'surface'
%Lo:ptr<function, vec3<f32>, read_write> = var, vec3<f32>(0.0f)
%521:ptr<storage, f32, read> = access %globalLights, 2u
%522:f32 = load %521
%523:bool = gt %522, 0.0f
if %523 [t: $B42] { # if_15
$B42: { # true
%light_2:ptr<function, PuctualLight, read_write> = var # %light_2: 'light'
%525:ptr<function, u32, read_write> = access %light_2, 0u
store %525, 2u
%526:ptr<function, vec3<f32>, read_write> = access %light_2, 1u
%527:ptr<storage, vec3<f32>, read> = access %globalLights, 3u
%528:vec3<f32> = load %527
store %526, %528
%529:ptr<function, vec3<f32>, read_write> = access %light_2, 3u
%530:ptr<storage, vec3<f32>, read> = access %globalLights, 1u
%531:vec3<f32> = load %530
store %529, %531
%532:ptr<function, f32, read_write> = access %light_2, 4u
%533:ptr<storage, f32, read> = access %globalLights, 2u
%534:f32 = load %533
store %532, %534
%535:vec3<f32> = access %input_1, 1u
%536:f32 = call %dirLightVisibility, %535
%lightVis:f32 = let %536
%538:vec3<f32> = load %Lo
%539:vec3<f32> = let %538
%540:PuctualLight = load %light_2
%541:vec3<f32> = call %lightRadiance, %540, %surface_2
%542:vec3<f32> = mul %541, %lightVis
%543:vec3<f32> = add %539, %542
store %Lo, %543
exit_if # if_15
}
}
%544:vec4<f32> = access %input_1, 0u
%545:u32 = call %getClusterIndex, %544
%clusterIndex:u32 = let %545
%547:ptr<storage, u32, read> = access %clusterLights, 1u, %clusterIndex, 0u
%548:u32 = load %547
%lightOffset:u32 = let %548
%550:ptr<storage, u32, read> = access %clusterLights, 1u, %clusterIndex, 1u
%551:u32 = load %550
%lightCount:u32 = let %551
loop [i: $B43, b: $B44, c: $B45] { # loop_3
$B43: { # initializer
%lightIndex_1:ptr<function, u32, read_write> = var, 0u # %lightIndex_1: 'lightIndex'
next_iteration # -> $B44
}
$B44: { # body
%554:u32 = load %lightIndex_1
%555:bool = lt %554, %lightCount
if %555 [t: $B46, f: $B47] { # if_16
$B46: { # true
exit_if # if_16
}
$B47: { # false
exit_loop # loop_3
}
}
%556:u32 = load %lightIndex_1
%557:u32 = add %lightOffset, %556
%558:ptr<storage, u32, read> = access %clusterLights, 2u, %557
%559:u32 = load %558
%i_2:u32 = let %559 # %i_2: 'i'
%light_3:ptr<function, PuctualLight, read_write> = var # %light_3: 'light'
%562:ptr<function, u32, read_write> = access %light_3, 0u
store %562, 0u
%563:ptr<function, vec3<f32>, read_write> = access %light_3, 1u
%564:ptr<storage, vec3<f32>, read> = access %globalLights, 5u, %i_2, 0u
%565:vec3<f32> = load %564
%566:vec3<f32> = swizzle %565, xyz
%567:vec3<f32> = access %input_1, 1u
%568:vec3<f32> = sub %566, %567
store %563, %568
%569:ptr<function, f32, read_write> = access %light_3, 2u
%570:ptr<storage, f32, read> = access %globalLights, 5u, %i_2, 1u
%571:f32 = load %570
store %569, %571
%572:ptr<function, vec3<f32>, read_write> = access %light_3, 3u
%573:ptr<storage, vec3<f32>, read> = access %globalLights, 5u, %i_2, 2u
%574:vec3<f32> = load %573
store %572, %574
%575:ptr<function, f32, read_write> = access %light_3, 4u
%576:ptr<storage, f32, read> = access %globalLights, 5u, %i_2, 3u
%577:f32 = load %576
store %575, %577
%578:vec3<f32> = access %input_1, 1u
%579:ptr<function, vec3<f32>, read_write> = access %light_3, 1u
%580:vec3<f32> = load %579
%581:f32 = call %pointLightVisibility, %i_2, %578, %580
%lightVis_1:f32 = let %581 # %lightVis_1: 'lightVis'
%583:vec3<f32> = load %Lo
%584:vec3<f32> = let %583
%585:PuctualLight = load %light_3
%586:vec3<f32> = call %lightRadiance, %585, %surface_2
%587:vec3<f32> = mul %586, %lightVis_1
%588:vec3<f32> = add %584, %587
store %Lo, %588
continue # -> $B45
}
$B45: { # continuing
%589:u32 = load %lightIndex_1
%590:u32 = add %589, 1u
store %lightIndex_1, %590
next_iteration # -> $B44
}
}
%591:vec4<f32> = access %input_1, 0u
%592:vec2<f32> = swizzle %591, xy
%593:texture_2d<f32> = load %ssaoTexture
%594:vec2<u32> = textureDimensions %593
%595:vec2<u32> = swizzle %594, xy
%596:vec2<f32> = convert %595
%597:vec2<f32> = div %592, %596
%ssaoCoord:vec2<f32> = let %597
%599:texture_2d<f32> = load %ssaoTexture
%600:sampler = load %defaultSampler
%601:vec4<f32> = textureSample %599, %600, %ssaoCoord
%602:f32 = access %601, 0u
%ssaoFactor:f32 = let %602
%604:ptr<storage, vec3<f32>, read> = access %globalLights, 0u
%605:vec3<f32> = load %604
%606:vec3<f32> = access %surface_2, 1u
%607:vec3<f32> = mul %605, %606
%608:f32 = access %surface_2, 6u
%609:vec3<f32> = mul %607, %608
%610:vec3<f32> = mul %609, %ssaoFactor
%ambient:vec3<f32> = let %610
%612:vec3<f32> = load %Lo
%613:vec3<f32> = add %612, %ambient
%614:vec3<f32> = access %surface_2, 7u
%615:vec3<f32> = add %613, %614
%616:vec3<f32> = call %linearTosRGB, %615
%color:vec3<f32> = let %616
%out:ptr<function, FragmentOutput, read_write> = var
%619:ptr<function, vec4<f32>, read_write> = access %out, 0u
%620:f32 = access %surface_2, 0u, 3u
%621:vec4<f32> = construct %color, %620
store %619, %621
%622:ptr<function, vec4<f32>, read_write> = access %out, 1u
%623:vec3<f32> = access %surface_2, 7u
%624:f32 = access %surface_2, 0u, 3u
%625:vec4<f32> = construct %623, %624
store %622, %625
%626:FragmentOutput = load %out
ret %626
}
}
%tint_f32_to_u32 = func(%value:f32):u32 {
$B48: {
%628:u32 = convert %value
%629:bool = gte %value, 0.0f
%630:u32 = select 0u, %628, %629
%631:bool = lte %value, 4294967040.0f
%632:u32 = select 4294967295u, %630, %631
ret %632
}
}
unhandled variable address space
********************************************************************
* The tint shader compiler has encountered an unexpected error. *
* *
* Please help us fix this issue by submitting a bug report at *
* crbug.com/tint with the source program that triggered the bug. *
********************************************************************