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