blob: 804ef8d807b60230aad5f57de3924d6a89bbdcdf [file] [log] [blame]
SKIP: FAILED
<dawn>/src/tint/lang/msl/writer/printer/printer.cc:355 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 = block { # 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 {
%b2 = block {
%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 {
%b3 = block {
%29:vec3<f32> = pow %srgb, vec3<f32>(2.20000004768371582031f)
ret %29
}
}
%linearDepth = func(%depthSample:f32):f32 -> %b4 {
%b4 = block {
%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:ptr<uniform, f32, read> = access %camera, 6u
%38:f32 = load %37
%39:ptr<uniform, f32, read> = access %camera, 7u
%40:f32 = load %39
%41:f32 = sub %38, %40
%42:ptr<uniform, f32, read> = access %camera, 7u
%43:f32 = load %42
%44:f32 = fma %depthSample, %41, %43
%45:f32 = div %36, %44
ret %45
}
}
%getTile = func(%fragCoord:vec4<f32>):vec3<u32> -> %b5 {
%b5 = block {
%48:ptr<uniform, f32, read> = access %camera, 7u
%49:f32 = load %48
%50:ptr<uniform, f32, read> = access %camera, 6u
%51:f32 = load %50
%52:f32 = div %49, %51
%53:f32 = log2 %52
%sliceScale:f32 = div 48.0f, %53
%55:ptr<uniform, f32, read> = access %camera, 6u
%56:f32 = load %55
%57:f32 = log2 %56
%58:f32 = mul 48.0f, %57
%59:ptr<uniform, f32, read> = access %camera, 7u
%60:f32 = load %59
%61:ptr<uniform, f32, read> = access %camera, 6u
%62:f32 = load %61
%63:f32 = div %60, %62
%64:f32 = log2 %63
%65:f32 = div %58, %64
%sliceBias:f32 = negation %65
%67:f32 = access %fragCoord, 2u
%68:f32 = call %linearDepth, %67
%69:f32 = log2 %68
%70:f32 = mul %69, %sliceScale
%71:f32 = add %70, %sliceBias
%72:f32 = max %71, 0.0f
%zTile:u32 = convert %72
%74:f32 = access %fragCoord, 0u
%75:ptr<uniform, vec2<f32>, read> = access %camera, 5u
%76:f32 = load_vector_element %75, 0u
%77:f32 = div %76, 32.0f
%78:f32 = div %74, %77
%79:u32 = convert %78
%80:f32 = access %fragCoord, 1u
%81:ptr<uniform, vec2<f32>, read> = access %camera, 5u
%82:f32 = load_vector_element %81, 1u
%83:f32 = div %82, 18.0f
%84:f32 = div %80, %83
%85:u32 = convert %84
%86:vec3<u32> = construct %79, %85, %zTile
ret %86
}
}
%getClusterIndex = func(%fragCoord_1:vec4<f32>):u32 -> %b6 { # %fragCoord_1: 'fragCoord'
%b6 = block {
%tile:vec3<u32> = call %getTile, %fragCoord_1
%90:u32 = access %tile, 0u
%91:u32 = access %tile, 1u
%92:u32 = mul %91, 32u
%93:u32 = add %90, %92
%94:u32 = access %tile, 2u
%95:u32 = mul %94, 32u
%96:u32 = mul %95, 18u
%97:u32 = add %93, %96
ret %97
}
}
%dirLightVisibility = func(%worldPos:vec3<f32>):f32 -> %b7 {
%b7 = block {
%100:ptr<storage, i32, read> = access %lightShadowTable, 0u, 0u
%shadowIndex:i32 = load %100
%102:bool = eq %shadowIndex, -1i
if %102 [t: %b8] { # if_1
%b8 = block { # true
ret 1.0f
}
}
%103:ptr<storage, vec4<f32>, read> = access %shadow, 0u, %shadowIndex, 0u
%viewport:vec4<f32> = load %103
%105:ptr<storage, mat4x4<f32>, read> = access %shadow, 0u, %shadowIndex, 1u
%106:mat4x4<f32> = load %105
%107:vec4<f32> = construct %worldPos, 1.0f
%lightPos:vec4<f32> = mul %106, %107
%109:vec2<f32> = swizzle %lightPos, xy
%110:f32 = access %lightPos, 3u
%111:vec2<f32> = div %109, %110
%112:vec2<f32> = mul %111, vec2<f32>(0.5f, -0.5f)
%113:vec2<f32> = add %112, vec2<f32>(0.5f)
%114:f32 = access %lightPos, 2u
%115:f32 = access %lightPos, 3u
%116:f32 = div %114, %115
%shadowPos:vec3<f32> = construct %113, %116
%118:vec2<f32> = swizzle %viewport, xy
%119:vec2<f32> = swizzle %shadowPos, xy
%120:vec2<f32> = swizzle %viewport, zw
%121:vec2<f32> = mul %119, %120
%122:vec2<f32> = add %118, %121
%viewportPos:vec2<f32> = construct %122
%124:texture_depth_2d = load %shadowTexture
%125:vec2<u32> = textureDimensions %124, 0i
%126:vec2<f32> = convert %125
%texelSize:vec2<f32> = div 1.0f, %126
%128:vec2<f32> = swizzle %viewport, xy
%129:vec2<f32> = sub %128, %texelSize
%130:vec2<f32> = swizzle %viewport, xy
%131:vec2<f32> = swizzle %viewport, zw
%132:vec2<f32> = add %130, %131
%133:vec2<f32> = add %132, %texelSize
%clampRect:vec4<f32> = construct %129, %133
%visibility:ptr<function, f32, read_write> = var, 0.0f
loop [i: %b9, b: %b10, c: %b11] { # loop_1
%b9 = block { # initializer
%i:ptr<function, u32, read_write> = var, 0u
next_iteration %b10
}
%b10 = block { # body
%137:u32 = load %i
%138:bool = lt %137, 16u
if %138 [t: %b12, f: %b13] { # if_2
%b12 = block { # true
exit_if # if_2
}
%b13 = block { # false
exit_loop # loop_1
}
}
%139:f32 = load %visibility
%140:texture_depth_2d = load %shadowTexture
%141:sampler_comparison = load %shadowSampler
%142:u32 = load %i
%143:ptr<private, vec2<f32>, read_write> = access %shadowSampleOffsets, %142
%144:vec2<f32> = load %143
%145:vec2<f32> = mul %144, %texelSize
%146:vec2<f32> = add %viewportPos, %145
%147:vec2<f32> = swizzle %clampRect, xy
%148:vec2<f32> = swizzle %clampRect, zw
%149:vec2<f32> = clamp %146, %147, %148
%150:f32 = access %shadowPos, 2u
%151:f32 = sub %150, 0.00300000002607703209f
%152:f32 = textureSampleCompareLevel %140, %141, %149, %151
%153:f32 = add %139, %152
store %visibility, %153
continue %b11
}
%b11 = block { # continuing
%154:u32 = load %i
%155:u32 = add %154, 1u
store %i, %155
next_iteration %b10
}
}
%156:f32 = load %visibility
%157:f32 = div %156, 16.0f
ret %157
}
}
%getCubeFace = func(%v:vec3<f32>):i32 -> %b14 {
%b14 = block {
%vAbs:vec3<f32> = abs %v
%161:f32 = access %vAbs, 2u
%162:f32 = access %vAbs, 0u
%163:bool = gte %161, %162
%164:bool = if %163 [t: %b15, f: %b16] { # if_3
%b15 = block { # true
%165:f32 = access %vAbs, 2u
%166:f32 = access %vAbs, 1u
%167:bool = gte %165, %166
exit_if %167 # if_3
}
%b16 = block { # false
exit_if false # if_3
}
}
if %164 [t: %b17] { # if_4
%b17 = block { # true
%168:f32 = access %v, 2u
%169:bool = lt %168, 0.0f
if %169 [t: %b18] { # if_5
%b18 = block { # true
ret 5i
}
}
ret 4i
}
}
%170:f32 = access %vAbs, 1u
%171:f32 = access %vAbs, 0u
%172:bool = gte %170, %171
if %172 [t: %b19] { # if_6
%b19 = block { # true
%173:f32 = access %v, 1u
%174:bool = lt %173, 0.0f
if %174 [t: %b20] { # if_7
%b20 = block { # true
ret 3i
}
}
ret 2i
}
}
%175:f32 = access %v, 0u
%176:bool = lt %175, 0.0f
if %176 [t: %b21] { # if_8
%b21 = block { # true
ret 1i
}
}
ret 0i
}
}
%pointLightVisibility = func(%lightIndex:u32, %worldPos_1:vec3<f32>, %pointToLight:vec3<f32>):f32 -> %b22 { # %worldPos_1: 'worldPos'
%b22 = block {
%181:u32 = add %lightIndex, 1u
%182:ptr<storage, i32, read> = access %lightShadowTable, 0u, %181
%183:i32 = load %182
%shadowIndex_1:ptr<function, i32, read_write> = var, %183 # %shadowIndex_1: 'shadowIndex'
%185:i32 = load %shadowIndex_1
%186:bool = eq %185, -1i
if %186 [t: %b23] { # if_9
%b23 = block { # true
ret 1.0f
}
}
%187:i32 = load %shadowIndex_1
%188:vec3<f32> = mul %pointToLight, -1.0f
%189:i32 = call %getCubeFace, %188
%190:i32 = add %187, %189
store %shadowIndex_1, %190
%191:i32 = load %shadowIndex_1
%192:ptr<storage, vec4<f32>, read> = access %shadow, 0u, %191, 0u
%viewport_1:vec4<f32> = load %192 # %viewport_1: 'viewport'
%194:i32 = load %shadowIndex_1
%195:ptr<storage, mat4x4<f32>, read> = access %shadow, 0u, %194, 1u
%196:mat4x4<f32> = load %195
%197:vec4<f32> = construct %worldPos_1, 1.0f
%lightPos_1:vec4<f32> = mul %196, %197 # %lightPos_1: 'lightPos'
%199:vec2<f32> = swizzle %lightPos_1, xy
%200:f32 = access %lightPos_1, 3u
%201:vec2<f32> = div %199, %200
%202:vec2<f32> = mul %201, vec2<f32>(0.5f, -0.5f)
%203:vec2<f32> = add %202, vec2<f32>(0.5f)
%204:f32 = access %lightPos_1, 2u
%205:f32 = access %lightPos_1, 3u
%206:f32 = div %204, %205
%shadowPos_1:vec3<f32> = construct %203, %206 # %shadowPos_1: 'shadowPos'
%208:vec2<f32> = swizzle %viewport_1, xy
%209:vec2<f32> = swizzle %shadowPos_1, xy
%210:vec2<f32> = swizzle %viewport_1, zw
%211:vec2<f32> = mul %209, %210
%212:vec2<f32> = add %208, %211
%viewportPos_1:vec2<f32> = construct %212 # %viewportPos_1: 'viewportPos'
%214:texture_depth_2d = load %shadowTexture
%215:vec2<u32> = textureDimensions %214, 0i
%216:vec2<f32> = convert %215
%texelSize_1:vec2<f32> = div 1.0f, %216 # %texelSize_1: 'texelSize'
%218:vec2<f32> = swizzle %viewport_1, xy
%219:vec2<f32> = swizzle %viewport_1, xy
%220:vec2<f32> = swizzle %viewport_1, zw
%221:vec2<f32> = add %219, %220
%clampRect_1:vec4<f32> = construct %218, %221 # %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 = block { # initializer
%i_1:ptr<function, u32, read_write> = var, 0u # %i_1: 'i'
next_iteration %b25
}
%b25 = block { # body
%225:u32 = load %i_1
%226:bool = lt %225, 16u
if %226 [t: %b27, f: %b28] { # if_10
%b27 = block { # true
exit_if # if_10
}
%b28 = block { # false
exit_loop # loop_2
}
}
%227:f32 = load %visibility_1
%228:texture_depth_2d = load %shadowTexture
%229:sampler_comparison = load %shadowSampler
%230:u32 = load %i_1
%231:ptr<private, vec2<f32>, read_write> = access %shadowSampleOffsets, %230
%232:vec2<f32> = load %231
%233:vec2<f32> = mul %232, %texelSize_1
%234:vec2<f32> = add %viewportPos_1, %233
%235:vec2<f32> = swizzle %clampRect_1, xy
%236:vec2<f32> = swizzle %clampRect_1, zw
%237:vec2<f32> = clamp %234, %235, %236
%238:f32 = access %shadowPos_1, 2u
%239:f32 = sub %238, 0.00999999977648258209f
%240:f32 = textureSampleCompareLevel %228, %229, %237, %239
%241:f32 = add %227, %240
store %visibility_1, %241
continue %b26
}
%b26 = block { # continuing
%242:u32 = load %i_1
%243:u32 = add %242, 1u
store %i_1, %243
next_iteration %b25
}
}
%244:f32 = load %visibility_1
%245:f32 = div %244, 16.0f
ret %245
}
}
%GetSurfaceInfo = func(%input:VertexOutput):SurfaceInfo -> %b29 {
%b29 = block {
%surface:ptr<function, SurfaceInfo, read_write> = var
%249:ptr<function, vec3<f32>, read_write> = access %surface, 8u
%250:vec3<f32> = access %input, 2u
%251:vec3<f32> = normalize %250
store %249, %251
%252:vec3<f32> = access %input, 8u
%253:vec3<f32> = access %input, 9u
%254:vec3<f32> = access %input, 7u
%tbn:mat3x3<f32> = construct %252, %253, %254
%256:texture_2d<f32> = load %normalTexture
%257:sampler = load %normalSampler
%258:vec2<f32> = access %input, 3u
%259:vec4<f32> = textureSample %256, %257, %258
%normalMap:vec3<f32> = swizzle %259, xyz
%261:ptr<function, vec3<f32>, read_write> = access %surface, 4u
%262:vec3<f32> = mul 2.0f, %normalMap
%263:vec3<f32> = sub %262, vec3<f32>(1.0f)
%264:vec3<f32> = mul %tbn, %263
%265:vec3<f32> = normalize %264
store %261, %265
%266:texture_2d<f32> = load %baseColorTexture
%267:sampler = load %baseColorSampler
%268:vec2<f32> = access %input, 3u
%baseColorMap:vec4<f32> = textureSample %266, %267, %268
%270:ptr<function, vec4<f32>, read_write> = access %surface, 0u
%271:vec4<f32> = access %input, 5u
%272:ptr<uniform, vec4<f32>, read> = access %material, 0u
%273:vec4<f32> = load %272
%274:vec4<f32> = mul %271, %273
%275:vec4<f32> = mul %274, %baseColorMap
store %270, %275
%276:ptr<function, vec4<f32>, read_write> = access %surface, 0u
%277:f32 = load_vector_element %276, 3u
%278:ptr<uniform, f32, read> = access %material, 4u
%279:f32 = load %278
%280:bool = lt %277, %279
if %280 [t: %b30] { # if_11
%b30 = block { # true
exit_if # if_11
}
}
%281:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%282:ptr<function, vec4<f32>, read_write> = access %surface, 0u
%283:vec4<f32> = load %282
%284:vec3<f32> = swizzle %283, xyz
store %281, %284
%285:texture_2d<f32> = load %metallicRoughnessTexture
%286:sampler = load %metallicRoughnessSampler
%287:vec2<f32> = access %input, 3u
%metallicRoughnessMap:vec4<f32> = textureSample %285, %286, %287
%289:ptr<function, f32, read_write> = access %surface, 2u
%290:ptr<uniform, vec2<f32>, read> = access %material, 3u
%291:f32 = load_vector_element %290, 0u
%292:f32 = access %metallicRoughnessMap, 2u
%293:f32 = mul %291, %292
store %289, %293
%294:ptr<function, f32, read_write> = access %surface, 3u
%295:ptr<uniform, vec2<f32>, read> = access %material, 3u
%296:f32 = load_vector_element %295, 1u
%297:f32 = access %metallicRoughnessMap, 1u
%298:f32 = mul %296, %297
store %294, %298
%dielectricSpec:vec3<f32> = let vec3<f32>(0.03999999910593032837f)
%300:ptr<function, vec3<f32>, read_write> = access %surface, 5u
%301:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%302:vec3<f32> = load %301
%303:ptr<function, f32, read_write> = access %surface, 2u
%304:f32 = load %303
%305:vec3<f32> = construct %304
%306:vec3<f32> = mix %dielectricSpec, %302, %305
store %300, %306
%307:texture_2d<f32> = load %occlusionTexture
%308:sampler = load %occlusionSampler
%309:vec2<f32> = access %input, 3u
%occlusionMap:vec4<f32> = textureSample %307, %308, %309
%311:ptr<function, f32, read_write> = access %surface, 6u
%312:ptr<uniform, f32, read> = access %material, 2u
%313:f32 = load %312
%314:f32 = access %occlusionMap, 0u
%315:f32 = mul %313, %314
store %311, %315
%316:texture_2d<f32> = load %emissiveTexture
%317:sampler = load %emissiveSampler
%318:vec2<f32> = access %input, 3u
%emissiveMap:vec4<f32> = textureSample %316, %317, %318
%320:ptr<function, vec3<f32>, read_write> = access %surface, 7u
%321:ptr<uniform, vec3<f32>, read> = access %material, 1u
%322:vec3<f32> = load %321
%323:vec3<f32> = swizzle %emissiveMap, xyz
%324:vec3<f32> = mul %322, %323
store %320, %324
%325:f32 = access %input, 6u, 3u
%326:bool = eq %325, 0.0f
if %326 [t: %b31, f: %b32] { # if_12
%b31 = block { # true
%327:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%328:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%329:vec3<f32> = load %328
%330:vec4<f32> = access %input, 6u
%331:vec3<f32> = swizzle %330, xyz
%332:vec3<f32> = add %329, %331
store %327, %332
exit_if # if_12
}
%b32 = block { # false
%333:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%334:ptr<function, vec3<f32>, read_write> = access %surface, 1u
%335:vec3<f32> = load %334
%336:vec4<f32> = access %input, 6u
%337:vec3<f32> = swizzle %336, xyz
%338:vec3<f32> = mul %335, %337
store %333, %338
exit_if # if_12
}
}
%339:SurfaceInfo = load %surface
ret %339
}
}
%FresnelSchlick = func(%cosTheta:f32, %F0:vec3<f32>):vec3<f32> -> %b33 {
%b33 = block {
%343:vec3<f32> = sub vec3<f32>(1.0f), %F0
%344:f32 = sub 1.0f, %cosTheta
%345:f32 = pow %344, 5.0f
%346:vec3<f32> = mul %343, %345
%347:vec3<f32> = add %F0, %346
ret %347
}
}
%DistributionGGX = func(%N:vec3<f32>, %H:vec3<f32>, %roughness:f32):f32 -> %b34 {
%b34 = block {
%a:f32 = mul %roughness, %roughness
%a2:f32 = mul %a, %a
%354:f32 = dot %N, %H
%NdotH:f32 = max %354, 0.0f
%NdotH2:f32 = mul %NdotH, %NdotH
%num:f32 = let %a2
%358:f32 = sub %a2, 1.0f
%359:f32 = mul %NdotH2, %358
%denom:f32 = add %359, 1.0f
%361:f32 = mul 3.14159274101257324219f, %denom
%362:f32 = mul %361, %denom
%363:f32 = div %num, %362
ret %363
}
}
%GeometrySchlickGGX = func(%NdotV:f32, %roughness_1:f32):f32 -> %b35 { # %roughness_1: 'roughness'
%b35 = block {
%r:f32 = add %roughness_1, 1.0f
%368:f32 = mul %r, %r
%k:f32 = div %368, 8.0f
%num_1:f32 = let %NdotV # %num_1: 'num'
%371:f32 = sub 1.0f, %k
%372:f32 = mul %NdotV, %371
%denom_1:f32 = add %372, %k # %denom_1: 'denom'
%374:f32 = div %num_1, %denom_1
ret %374
}
}
%GeometrySmith = func(%N_1:vec3<f32>, %V:vec3<f32>, %L:vec3<f32>, %roughness_2:f32):f32 -> %b36 { # %N_1: 'N', %roughness_2: 'roughness'
%b36 = block {
%380:f32 = dot %N_1, %V
%NdotV_1:f32 = max %380, 0.0f # %NdotV_1: 'NdotV'
%382:f32 = dot %N_1, %L
%NdotL:f32 = max %382, 0.0f
%ggx2:f32 = call %GeometrySchlickGGX, %NdotV_1, %roughness_2
%ggx1:f32 = call %GeometrySchlickGGX, %NdotL, %roughness_2
%386:f32 = mul %ggx1, %ggx2
ret %386
}
}
%lightAttenuation = func(%light:PuctualLight):f32 -> %b37 {
%b37 = block {
%389:u32 = access %light, 0u
%390:bool = eq %389, 2u
if %390 [t: %b38] { # if_13
%b38 = block { # true
ret 1.0f
}
}
%391:vec3<f32> = access %light, 1u
%distance:f32 = length %391
%393:f32 = access %light, 2u
%394:bool = lte %393, 0.0f
if %394 [t: %b39] { # if_14
%b39 = block { # true
%395:f32 = pow %distance, 2.0f
%396:f32 = div 1.0f, %395
ret %396
}
}
%397:f32 = access %light, 2u
%398:f32 = div %distance, %397
%399:f32 = pow %398, 4.0f
%400:f32 = sub 1.0f, %399
%401:f32 = clamp %400, 0.0f, 1.0f
%402:f32 = pow %distance, 2.0f
%403:f32 = div %401, %402
ret %403
}
}
%lightRadiance = func(%light_1:PuctualLight, %surface_1:SurfaceInfo):vec3<f32> -> %b40 { # %light_1: 'light', %surface_1: 'surface'
%b40 = block {
%407:vec3<f32> = access %light_1, 1u
%L_1:vec3<f32> = normalize %407 # %L_1: 'L'
%409:vec3<f32> = access %surface_1, 8u
%410:vec3<f32> = add %409, %L_1
%H_1:vec3<f32> = normalize %410 # %H_1: 'H'
%412:vec3<f32> = access %surface_1, 4u
%413:f32 = access %surface_1, 3u
%NDF:f32 = call %DistributionGGX, %412, %H_1, %413
%415:vec3<f32> = access %surface_1, 4u
%416:vec3<f32> = access %surface_1, 8u
%417:f32 = access %surface_1, 3u
%G:f32 = call %GeometrySmith, %415, %416, %L_1, %417
%419:vec3<f32> = access %surface_1, 8u
%420:f32 = dot %H_1, %419
%421:f32 = max %420, 0.0f
%422:vec3<f32> = access %surface_1, 5u
%F:vec3<f32> = call %FresnelSchlick, %421, %422
%424:vec3<f32> = sub vec3<f32>(1.0f), %F
%425:f32 = access %surface_1, 2u
%426:f32 = sub 1.0f, %425
%kD:vec3<f32> = mul %424, %426
%428:vec3<f32> = access %surface_1, 4u
%429:f32 = dot %428, %L_1
%NdotL_1:f32 = max %429, 0.0f # %NdotL_1: 'NdotL'
%431:f32 = mul %NDF, %G
%numerator:vec3<f32> = mul %431, %F
%433:vec3<f32> = access %surface_1, 4u
%434:vec3<f32> = access %surface_1, 8u
%435:f32 = dot %433, %434
%436:f32 = max %435, 0.0f
%437:f32 = mul 4.0f, %436
%438:f32 = mul %437, %NdotL_1
%denominator:f32 = max %438, 0.00100000004749745131f
%440:vec3<f32> = construct %denominator
%specular:vec3<f32> = div %numerator, %440
%442:vec3<f32> = access %light_1, 3u
%443:f32 = access %light_1, 4u
%444:vec3<f32> = mul %442, %443
%445:f32 = call %lightAttenuation, %light_1
%radiance:vec3<f32> = mul %444, %445
%447:vec3<f32> = access %surface_1, 1u
%448:vec3<f32> = mul %kD, %447
%449:vec3<f32> = div %448, vec3<f32>(3.14159274101257324219f)
%450:vec3<f32> = add %449, %specular
%451:vec3<f32> = mul %450, %radiance
%452:vec3<f32> = mul %451, %NdotL_1
ret %452
}
}
%fragmentMain = @fragment func(%input_1:VertexOutput):FragmentOutput -> %b41 { # %input_1: 'input'
%b41 = block {
%surface_2:SurfaceInfo = call %GetSurfaceInfo, %input_1 # %surface_2: 'surface'
%Lo:ptr<function, vec3<f32>, read_write> = var, vec3<f32>(0.0f)
%457:ptr<storage, f32, read> = access %globalLights, 2u
%458:f32 = load %457
%459:bool = gt %458, 0.0f
if %459 [t: %b42] { # if_15
%b42 = block { # true
%light_2:ptr<function, PuctualLight, read_write> = var # %light_2: 'light'
%461:ptr<function, u32, read_write> = access %light_2, 0u
store %461, 2u
%462:ptr<function, vec3<f32>, read_write> = access %light_2, 1u
%463:ptr<storage, vec3<f32>, read> = access %globalLights, 3u
%464:vec3<f32> = load %463
store %462, %464
%465:ptr<function, vec3<f32>, read_write> = access %light_2, 3u
%466:ptr<storage, vec3<f32>, read> = access %globalLights, 1u
%467:vec3<f32> = load %466
store %465, %467
%468:ptr<function, f32, read_write> = access %light_2, 4u
%469:ptr<storage, f32, read> = access %globalLights, 2u
%470:f32 = load %469
store %468, %470
%471:vec3<f32> = access %input_1, 1u
%lightVis:f32 = call %dirLightVisibility, %471
%473:vec3<f32> = load %Lo
%474:PuctualLight = load %light_2
%475:vec3<f32> = call %lightRadiance, %474, %surface_2
%476:vec3<f32> = mul %475, %lightVis
%477:vec3<f32> = add %473, %476
store %Lo, %477
exit_if # if_15
}
}
%478:vec4<f32> = access %input_1, 0u
%clusterIndex:u32 = call %getClusterIndex, %478
%480:ptr<storage, u32, read> = access %clusterLights, 1u, %clusterIndex, 0u
%lightOffset:u32 = load %480
%482:ptr<storage, u32, read> = access %clusterLights, 1u, %clusterIndex, 1u
%lightCount:u32 = load %482
loop [i: %b43, b: %b44, c: %b45] { # loop_3
%b43 = block { # initializer
%lightIndex_1:ptr<function, u32, read_write> = var, 0u # %lightIndex_1: 'lightIndex'
next_iteration %b44
}
%b44 = block { # body
%485:u32 = load %lightIndex_1
%486:bool = lt %485, %lightCount
if %486 [t: %b46, f: %b47] { # if_16
%b46 = block { # true
exit_if # if_16
}
%b47 = block { # false
exit_loop # loop_3
}
}
%487:u32 = load %lightIndex_1
%488:u32 = add %lightOffset, %487
%489:ptr<storage, u32, read> = access %clusterLights, 2u, %488
%i_2:u32 = load %489 # %i_2: 'i'
%light_3:ptr<function, PuctualLight, read_write> = var # %light_3: 'light'
%492:ptr<function, u32, read_write> = access %light_3, 0u
store %492, 0u
%493:ptr<function, vec3<f32>, read_write> = access %light_3, 1u
%494:ptr<storage, vec3<f32>, read> = access %globalLights, 5u, %i_2, 0u
%495:vec3<f32> = load %494
%496:vec3<f32> = swizzle %495, xyz
%497:vec3<f32> = access %input_1, 1u
%498:vec3<f32> = sub %496, %497
store %493, %498
%499:ptr<function, f32, read_write> = access %light_3, 2u
%500:ptr<storage, f32, read> = access %globalLights, 5u, %i_2, 1u
%501:f32 = load %500
store %499, %501
%502:ptr<function, vec3<f32>, read_write> = access %light_3, 3u
%503:ptr<storage, vec3<f32>, read> = access %globalLights, 5u, %i_2, 2u
%504:vec3<f32> = load %503
store %502, %504
%505:ptr<function, f32, read_write> = access %light_3, 4u
%506:ptr<storage, f32, read> = access %globalLights, 5u, %i_2, 3u
%507:f32 = load %506
store %505, %507
%508:vec3<f32> = access %input_1, 1u
%509:ptr<function, vec3<f32>, read_write> = access %light_3, 1u
%510:vec3<f32> = load %509
%lightVis_1:f32 = call %pointLightVisibility, %i_2, %508, %510 # %lightVis_1: 'lightVis'
%512:vec3<f32> = load %Lo
%513:PuctualLight = load %light_3
%514:vec3<f32> = call %lightRadiance, %513, %surface_2
%515:vec3<f32> = mul %514, %lightVis_1
%516:vec3<f32> = add %512, %515
store %Lo, %516
continue %b45
}
%b45 = block { # continuing
%517:u32 = load %lightIndex_1
%518:u32 = add %517, 1u
store %lightIndex_1, %518
next_iteration %b44
}
}
%519:vec4<f32> = access %input_1, 0u
%520:vec2<f32> = swizzle %519, xy
%521:texture_2d<f32> = load %ssaoTexture
%522:vec2<u32> = textureDimensions %521
%523:vec2<u32> = swizzle %522, xy
%524:vec2<f32> = convert %523
%ssaoCoord:vec2<f32> = div %520, %524
%526:texture_2d<f32> = load %ssaoTexture
%527:sampler = load %defaultSampler
%528:vec4<f32> = textureSample %526, %527, %ssaoCoord
%ssaoFactor:f32 = access %528, 0u
%530:ptr<storage, vec3<f32>, read> = access %globalLights, 0u
%531:vec3<f32> = load %530
%532:vec3<f32> = access %surface_2, 1u
%533:vec3<f32> = mul %531, %532
%534:f32 = access %surface_2, 6u
%535:vec3<f32> = mul %533, %534
%ambient:vec3<f32> = mul %535, %ssaoFactor
%537:vec3<f32> = load %Lo
%538:vec3<f32> = add %537, %ambient
%539:vec3<f32> = access %surface_2, 7u
%540:vec3<f32> = add %538, %539
%color:vec3<f32> = call %linearTosRGB, %540
%out:ptr<function, FragmentOutput, read_write> = var
%543:ptr<function, vec4<f32>, read_write> = access %out, 0u
%544:f32 = access %surface_2, 0u, 3u
%545:vec4<f32> = construct %color, %544
store %543, %545
%546:ptr<function, vec4<f32>, read_write> = access %out, 1u
%547:vec3<f32> = access %surface_2, 7u
%548:f32 = access %surface_2, 0u, 3u
%549:vec4<f32> = construct %547, %548
store %546, %549
%550:FragmentOutput = load %out
ret %550
}
}
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. *
********************************************************************