| 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. * |
| ******************************************************************** |