// Automatically generated from files in pathfinder/shaders/. Do not edit! #pragma clang diagnostic ignored "-Wmissing-prototypes" #include #include using namespace metal; struct bFirstTileMap { int iFirstTileMap[1]; }; struct bTiles { uint iTiles[1]; }; constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(16u, 4u, 1u); constant float3 _1081 = {}; // Implementation of the GLSL mod() function, which is slightly different than Metal fmod() template inline Tx mod(Tx x, Ty y) { return x - y * floor(x / y); } static inline __attribute__((always_inline)) int2 toImageCoords(thread const int2& coords, thread float2 uFramebufferSize) { return int2(coords.x, int(uFramebufferSize.y - float(coords.y))); } static inline __attribute__((always_inline)) float4 fetchUnscaled(thread const texture2d srcTexture, thread const sampler srcTextureSmplr, thread const float2& scale, thread const float2& originCoord, thread const int& entry) { return srcTexture.sample(srcTextureSmplr, (((originCoord + float2(0.5)) + float2(float(entry), 0.0)) * scale), level(0.0)); } static inline __attribute__((always_inline)) void computeTileVaryings(thread const float2& position, thread const int& colorEntry, thread const texture2d textureMetadata, thread const sampler textureMetadataSmplr, thread const int2& textureMetadataSize, thread float2& outColorTexCoord0, thread float4& outBaseColor, thread float4& outFilterParams0, thread float4& outFilterParams1, thread float4& outFilterParams2, thread int& outCtrl) { float2 metadataScale = float2(1.0) / float2(textureMetadataSize); float2 metadataEntryCoord = float2(float((colorEntry % 128) * 8), float(colorEntry / 128)); float2 param = metadataScale; float2 param_1 = metadataEntryCoord; int param_2 = 0; float4 colorTexMatrix0 = fetchUnscaled(textureMetadata, textureMetadataSmplr, param, param_1, param_2); float2 param_3 = metadataScale; float2 param_4 = metadataEntryCoord; int param_5 = 1; float4 colorTexOffsets = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_3, param_4, param_5); float2 param_6 = metadataScale; float2 param_7 = metadataEntryCoord; int param_8 = 2; float4 baseColor = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_6, param_7, param_8); float2 param_9 = metadataScale; float2 param_10 = metadataEntryCoord; int param_11 = 3; float4 filterParams0 = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_9, param_10, param_11); float2 param_12 = metadataScale; float2 param_13 = metadataEntryCoord; int param_14 = 4; float4 filterParams1 = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_12, param_13, param_14); float2 param_15 = metadataScale; float2 param_16 = metadataEntryCoord; int param_17 = 5; float4 filterParams2 = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_15, param_16, param_17); float2 param_18 = metadataScale; float2 param_19 = metadataEntryCoord; int param_20 = 6; float4 extra = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_18, param_19, param_20); outColorTexCoord0 = (float2x2(float2(colorTexMatrix0.xy), float2(colorTexMatrix0.zw)) * position) + colorTexOffsets.xy; outBaseColor = baseColor; outFilterParams0 = filterParams0; outFilterParams1 = filterParams1; outFilterParams2 = filterParams2; outCtrl = int(extra.x); } static inline __attribute__((always_inline)) float sampleMask(thread const float& maskAlpha, thread const texture2d maskTexture, thread const sampler maskTextureSmplr, thread const float2& maskTextureSize, thread const float3& maskTexCoord, thread const int& maskCtrl) { if (maskCtrl == 0) { return maskAlpha; } int2 maskTexCoordI = int2(floor(maskTexCoord.xy)); float4 texel = maskTexture.sample(maskTextureSmplr, ((float2(maskTexCoordI / int2(1, 4)) + float2(0.5)) / maskTextureSize), level(0.0)); float coverage = texel[maskTexCoordI.y % 4] + maskTexCoord.z; if ((maskCtrl & 1) != 0) { coverage = abs(coverage); } else { coverage = 1.0 - abs(1.0 - mod(coverage, 2.0)); } return fast::min(maskAlpha, coverage); } static inline __attribute__((always_inline)) float4 filterRadialGradient(thread const float2& colorTexCoord, thread const texture2d colorTexture, thread const sampler colorTextureSmplr, thread const float2& colorTextureSize, thread const float2& fragCoord, thread const float2& framebufferSize, thread const float4& filterParams0, thread const float4& filterParams1) { float2 lineFrom = filterParams0.xy; float2 lineVector = filterParams0.zw; float2 radii = filterParams1.xy; float2 uvOrigin = filterParams1.zw; float2 dP = colorTexCoord - lineFrom; float2 dC = lineVector; float dR = radii.y - radii.x; float a = dot(dC, dC) - (dR * dR); float b = dot(dP, dC) + (radii.x * dR); float c = dot(dP, dP) - (radii.x * radii.x); float discrim = (b * b) - (a * c); float4 color = float4(0.0); if (abs(discrim) >= 9.9999997473787516355514526367188e-06) { float2 ts = float2((float2(1.0, -1.0) * sqrt(discrim)) + float2(b)) / float2(a); if (ts.x > ts.y) { ts = ts.yx; } float _595; if (ts.x >= 0.0) { _595 = ts.x; } else { _595 = ts.y; } float t = _595; color = colorTexture.sample(colorTextureSmplr, (uvOrigin + float2(t, 0.0)), level(0.0)); } return color; } static inline __attribute__((always_inline)) float4 filterBlur(thread const float2& colorTexCoord, thread const texture2d colorTexture, thread const sampler colorTextureSmplr, thread const float2& colorTextureSize, thread const float4& filterParams0, thread const float4& filterParams1) { float2 srcOffsetScale = filterParams0.xy / colorTextureSize; int support = int(filterParams0.z); float3 gaussCoeff = filterParams1.xyz; float gaussSum = gaussCoeff.x; float4 color = colorTexture.sample(colorTextureSmplr, colorTexCoord, level(0.0)) * gaussCoeff.x; float2 _639 = gaussCoeff.xy * gaussCoeff.yz; gaussCoeff = float3(_639.x, _639.y, gaussCoeff.z); for (int i = 1; i <= support; i += 2) { float gaussPartialSum = gaussCoeff.x; float2 _659 = gaussCoeff.xy * gaussCoeff.yz; gaussCoeff = float3(_659.x, _659.y, gaussCoeff.z); gaussPartialSum += gaussCoeff.x; float2 srcOffset = srcOffsetScale * (float(i) + (gaussCoeff.x / gaussPartialSum)); color += ((colorTexture.sample(colorTextureSmplr, (colorTexCoord - srcOffset), level(0.0)) + colorTexture.sample(colorTextureSmplr, (colorTexCoord + srcOffset), level(0.0))) * gaussPartialSum); gaussSum += (2.0 * gaussPartialSum); float2 _699 = gaussCoeff.xy * gaussCoeff.yz; gaussCoeff = float3(_699.x, _699.y, gaussCoeff.z); } return color / float4(gaussSum); } static inline __attribute__((always_inline)) float filterTextSample1Tap(thread const float& offset, thread const texture2d colorTexture, thread const sampler colorTextureSmplr, thread const float2& colorTexCoord) { return colorTexture.sample(colorTextureSmplr, (colorTexCoord + float2(offset, 0.0)), level(0.0)).x; } static inline __attribute__((always_inline)) void filterTextSample9Tap(thread float4& outAlphaLeft, thread float& outAlphaCenter, thread float4& outAlphaRight, thread const texture2d colorTexture, thread const sampler colorTextureSmplr, thread const float2& colorTexCoord, thread const float4& kernel0, thread const float& onePixel) { bool wide = kernel0.x > 0.0; float _276; if (wide) { float param = (-4.0) * onePixel; float2 param_1 = colorTexCoord; _276 = filterTextSample1Tap(param, colorTexture, colorTextureSmplr, param_1); } else { _276 = 0.0; } float param_2 = (-3.0) * onePixel; float2 param_3 = colorTexCoord; float param_4 = (-2.0) * onePixel; float2 param_5 = colorTexCoord; float param_6 = (-1.0) * onePixel; float2 param_7 = colorTexCoord; outAlphaLeft = float4(_276, filterTextSample1Tap(param_2, colorTexture, colorTextureSmplr, param_3), filterTextSample1Tap(param_4, colorTexture, colorTextureSmplr, param_5), filterTextSample1Tap(param_6, colorTexture, colorTextureSmplr, param_7)); float param_8 = 0.0; float2 param_9 = colorTexCoord; outAlphaCenter = filterTextSample1Tap(param_8, colorTexture, colorTextureSmplr, param_9); float param_10 = 1.0 * onePixel; float2 param_11 = colorTexCoord; float param_12 = 2.0 * onePixel; float2 param_13 = colorTexCoord; float param_14 = 3.0 * onePixel; float2 param_15 = colorTexCoord; float _336; if (wide) { float param_16 = 4.0 * onePixel; float2 param_17 = colorTexCoord; _336 = filterTextSample1Tap(param_16, colorTexture, colorTextureSmplr, param_17); } else { _336 = 0.0; } outAlphaRight = float4(filterTextSample1Tap(param_10, colorTexture, colorTextureSmplr, param_11), filterTextSample1Tap(param_12, colorTexture, colorTextureSmplr, param_13), filterTextSample1Tap(param_14, colorTexture, colorTextureSmplr, param_15), _336); } static inline __attribute__((always_inline)) float filterTextConvolve7Tap(thread const float4& alpha0, thread const float3& alpha1, thread const float4& kernel0) { return dot(alpha0, kernel0) + dot(alpha1, kernel0.zyx); } static inline __attribute__((always_inline)) float filterTextGammaCorrectChannel(thread const float& bgColor, thread const float& fgColor, thread const texture2d gammaLUT, thread const sampler gammaLUTSmplr) { return gammaLUT.sample(gammaLUTSmplr, float2(fgColor, 1.0 - bgColor), level(0.0)).x; } static inline __attribute__((always_inline)) float3 filterTextGammaCorrect(thread const float3& bgColor, thread const float3& fgColor, thread const texture2d gammaLUT, thread const sampler gammaLUTSmplr) { float param = bgColor.x; float param_1 = fgColor.x; float param_2 = bgColor.y; float param_3 = fgColor.y; float param_4 = bgColor.z; float param_5 = fgColor.z; return float3(filterTextGammaCorrectChannel(param, param_1, gammaLUT, gammaLUTSmplr), filterTextGammaCorrectChannel(param_2, param_3, gammaLUT, gammaLUTSmplr), filterTextGammaCorrectChannel(param_4, param_5, gammaLUT, gammaLUTSmplr)); } static inline __attribute__((always_inline)) float4 filterText(thread const float2& colorTexCoord, thread const texture2d colorTexture, thread const sampler colorTextureSmplr, thread const texture2d gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2) { float4 kernel0 = filterParams0; float3 bgColor = filterParams1.xyz; float3 fgColor = filterParams2.xyz; bool gammaCorrectionEnabled = filterParams2.w != 0.0; float3 alpha; if (kernel0.w == 0.0) { alpha = colorTexture.sample(colorTextureSmplr, colorTexCoord, level(0.0)).xxx; } else { float2 param_3 = colorTexCoord; float4 param_4 = kernel0; float param_5 = 1.0 / colorTextureSize.x; float4 param; float param_1; float4 param_2; filterTextSample9Tap(param, param_1, param_2, colorTexture, colorTextureSmplr, param_3, param_4, param_5); float4 alphaLeft = param; float alphaCenter = param_1; float4 alphaRight = param_2; float4 param_6 = alphaLeft; float3 param_7 = float3(alphaCenter, alphaRight.xy); float4 param_8 = kernel0; float r = filterTextConvolve7Tap(param_6, param_7, param_8); float4 param_9 = float4(alphaLeft.yzw, alphaCenter); float3 param_10 = alphaRight.xyz; float4 param_11 = kernel0; float g = filterTextConvolve7Tap(param_9, param_10, param_11); float4 param_12 = float4(alphaLeft.zw, alphaCenter, alphaRight.x); float3 param_13 = alphaRight.yzw; float4 param_14 = kernel0; float b = filterTextConvolve7Tap(param_12, param_13, param_14); alpha = float3(r, g, b); } if (gammaCorrectionEnabled) { float3 param_15 = bgColor; float3 param_16 = alpha; alpha = filterTextGammaCorrect(param_15, param_16, gammaLUT, gammaLUTSmplr); } return float4(mix(bgColor, fgColor, alpha), 1.0); } static inline __attribute__((always_inline)) float4 sampleColor(thread const texture2d colorTexture, thread const sampler colorTextureSmplr, thread const float2& colorTexCoord) { return colorTexture.sample(colorTextureSmplr, colorTexCoord, level(0.0)); } static inline __attribute__((always_inline)) float4 filterNone(thread const float2& colorTexCoord, thread const texture2d colorTexture, thread const sampler colorTextureSmplr) { float2 param = colorTexCoord; return sampleColor(colorTexture, colorTextureSmplr, param); } static inline __attribute__((always_inline)) float4 filterColor(thread const float2& colorTexCoord, thread const texture2d colorTexture, thread const sampler colorTextureSmplr, thread const texture2d gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize, thread const float2& fragCoord, thread const float2& framebufferSize, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const int& colorFilter) { switch (colorFilter) { case 1: { float2 param = colorTexCoord; float2 param_1 = colorTextureSize; float2 param_2 = fragCoord; float2 param_3 = framebufferSize; float4 param_4 = filterParams0; float4 param_5 = filterParams1; return filterRadialGradient(param, colorTexture, colorTextureSmplr, param_1, param_2, param_3, param_4, param_5); } case 3: { float2 param_6 = colorTexCoord; float2 param_7 = colorTextureSize; float4 param_8 = filterParams0; float4 param_9 = filterParams1; return filterBlur(param_6, colorTexture, colorTextureSmplr, param_7, param_8, param_9); } case 2: { float2 param_10 = colorTexCoord; float2 param_11 = colorTextureSize; float4 param_12 = filterParams0; float4 param_13 = filterParams1; float4 param_14 = filterParams2; return filterText(param_10, colorTexture, colorTextureSmplr, gammaLUT, gammaLUTSmplr, param_11, param_12, param_13, param_14); } } float2 param_15 = colorTexCoord; return filterNone(param_15, colorTexture, colorTextureSmplr); } static inline __attribute__((always_inline)) float4 combineColor0(thread const float4& destColor, thread const float4& srcColor, thread const int& op) { switch (op) { case 1: { return float4(srcColor.xyz, srcColor.w * destColor.w); } case 2: { return float4(destColor.xyz, srcColor.w * destColor.w); } } return destColor; } static inline __attribute__((always_inline)) float3 compositeScreen(thread const float3& destColor, thread const float3& srcColor) { return (destColor + srcColor) - (destColor * srcColor); } static inline __attribute__((always_inline)) float3 compositeSelect(thread const bool3& cond, thread const float3& ifTrue, thread const float3& ifFalse) { float _765; if (cond.x) { _765 = ifTrue.x; } else { _765 = ifFalse.x; } float _776; if (cond.y) { _776 = ifTrue.y; } else { _776 = ifFalse.y; } float _787; if (cond.z) { _787 = ifTrue.z; } else { _787 = ifFalse.z; } return float3(_765, _776, _787); } static inline __attribute__((always_inline)) float3 compositeHardLight(thread const float3& destColor, thread const float3& srcColor) { float3 param = destColor; float3 param_1 = (float3(2.0) * srcColor) - float3(1.0); bool3 param_2 = srcColor <= float3(0.5); float3 param_3 = (destColor * float3(2.0)) * srcColor; float3 param_4 = compositeScreen(param, param_1); return compositeSelect(param_2, param_3, param_4); } static inline __attribute__((always_inline)) float3 compositeColorDodge(thread const float3& destColor, thread const float3& srcColor) { bool3 destZero = destColor == float3(0.0); bool3 srcOne = srcColor == float3(1.0); bool3 param = srcOne; float3 param_1 = float3(1.0); float3 param_2 = destColor / (float3(1.0) - srcColor); bool3 param_3 = destZero; float3 param_4 = float3(0.0); float3 param_5 = compositeSelect(param, param_1, param_2); return compositeSelect(param_3, param_4, param_5); } static inline __attribute__((always_inline)) float3 compositeSoftLight(thread const float3& destColor, thread const float3& srcColor) { bool3 param = destColor <= float3(0.25); float3 param_1 = ((((float3(16.0) * destColor) - float3(12.0)) * destColor) + float3(4.0)) * destColor; float3 param_2 = sqrt(destColor); float3 darkenedDestColor = compositeSelect(param, param_1, param_2); bool3 param_3 = srcColor <= float3(0.5); float3 param_4 = destColor * (float3(1.0) - destColor); float3 param_5 = darkenedDestColor - destColor; float3 factor = compositeSelect(param_3, param_4, param_5); return destColor + (((srcColor * 2.0) - float3(1.0)) * factor); } static inline __attribute__((always_inline)) float compositeDivide(thread const float& num, thread const float& denom) { float _801; if (denom != 0.0) { _801 = num / denom; } else { _801 = 0.0; } return _801; } static inline __attribute__((always_inline)) float3 compositeRGBToHSL(thread const float3& rgb) { float v = fast::max(fast::max(rgb.x, rgb.y), rgb.z); float xMin = fast::min(fast::min(rgb.x, rgb.y), rgb.z); float c = v - xMin; float l = mix(xMin, v, 0.5); float3 _907; if (rgb.x == v) { _907 = float3(0.0, rgb.yz); } else { float3 _920; if (rgb.y == v) { _920 = float3(2.0, rgb.zx); } else { _920 = float3(4.0, rgb.xy); } _907 = _920; } float3 terms = _907; float param = ((terms.x * c) + terms.y) - terms.z; float param_1 = c; float h = 1.0471975803375244140625 * compositeDivide(param, param_1); float param_2 = c; float param_3 = v; float s = compositeDivide(param_2, param_3); return float3(h, s, l); } static inline __attribute__((always_inline)) float3 compositeHSL(thread const float3& destColor, thread const float3& srcColor, thread const int& op) { switch (op) { case 12: { return float3(srcColor.x, destColor.y, destColor.z); } case 13: { return float3(destColor.x, srcColor.y, destColor.z); } case 14: { return float3(srcColor.x, srcColor.y, destColor.z); } default: { return float3(destColor.x, destColor.y, srcColor.z); } } } static inline __attribute__((always_inline)) float3 compositeHSLToRGB(thread const float3& hsl) { float a = hsl.y * fast::min(hsl.z, 1.0 - hsl.z); float3 ks = mod(float3(0.0, 8.0, 4.0) + float3(hsl.x * 1.90985929965972900390625), float3(12.0)); return hsl.zzz - (fast::clamp(fast::min(ks - float3(3.0), float3(9.0) - ks), float3(-1.0), float3(1.0)) * a); } static inline __attribute__((always_inline)) float3 compositeRGB(thread const float3& destColor, thread const float3& srcColor, thread const int& op) { switch (op) { case 1: { return destColor * srcColor; } case 2: { float3 param = destColor; float3 param_1 = srcColor; return compositeScreen(param, param_1); } case 3: { float3 param_2 = srcColor; float3 param_3 = destColor; return compositeHardLight(param_2, param_3); } case 4: { return fast::min(destColor, srcColor); } case 5: { return fast::max(destColor, srcColor); } case 6: { float3 param_4 = destColor; float3 param_5 = srcColor; return compositeColorDodge(param_4, param_5); } case 7: { float3 param_6 = float3(1.0) - destColor; float3 param_7 = float3(1.0) - srcColor; return float3(1.0) - compositeColorDodge(param_6, param_7); } case 8: { float3 param_8 = destColor; float3 param_9 = srcColor; return compositeHardLight(param_8, param_9); } case 9: { float3 param_10 = destColor; float3 param_11 = srcColor; return compositeSoftLight(param_10, param_11); } case 10: { return abs(destColor - srcColor); } case 11: { return (destColor + srcColor) - ((float3(2.0) * destColor) * srcColor); } case 12: case 13: case 14: case 15: { float3 param_12 = destColor; float3 param_13 = srcColor; float3 param_14 = compositeRGBToHSL(param_12); float3 param_15 = compositeRGBToHSL(param_13); int param_16 = op; float3 param_17 = compositeHSL(param_14, param_15, param_16); return compositeHSLToRGB(param_17); } } return srcColor; } static inline __attribute__((always_inline)) float4 composite(thread const float4& srcColor, thread const texture2d destTexture, thread const sampler destTextureSmplr, thread const float2& destTextureSize, thread const float2& fragCoord, thread const int& op) { if (op == 0) { return srcColor; } float2 destTexCoord = fragCoord / destTextureSize; float4 destColor = destTexture.sample(destTextureSmplr, destTexCoord, level(0.0)); float3 param = destColor.xyz; float3 param_1 = srcColor.xyz; int param_2 = op; float3 blendedRGB = compositeRGB(param, param_1, param_2); return float4(((srcColor.xyz * (srcColor.w * (1.0 - destColor.w))) + (blendedRGB * (srcColor.w * destColor.w))) + (destColor.xyz * (1.0 - srcColor.w)), 1.0); } static inline __attribute__((always_inline)) float4 calculateColor(thread const float2& fragCoord, thread const texture2d colorTexture0, thread const sampler colorTexture0Smplr, thread const texture2d maskTexture0, thread const sampler maskTexture0Smplr, thread const texture2d destTexture, thread const sampler destTextureSmplr, thread const texture2d gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize0, thread const float2& maskTextureSize0, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const float2& framebufferSize, thread const int& ctrl, thread const float3& maskTexCoord0, thread const float2& colorTexCoord0, thread const float4& baseColor, thread const int& tileCtrl) { int maskCtrl0 = (tileCtrl >> 0) & 3; float maskAlpha = 1.0; float param = maskAlpha; float2 param_1 = maskTextureSize0; float3 param_2 = maskTexCoord0; int param_3 = maskCtrl0; maskAlpha = sampleMask(param, maskTexture0, maskTexture0Smplr, param_1, param_2, param_3); float4 color = baseColor; int color0Combine = (ctrl >> 6) & 3; if (color0Combine != 0) { int color0Filter = (ctrl >> 4) & 3; float2 param_4 = colorTexCoord0; float2 param_5 = colorTextureSize0; float2 param_6 = fragCoord; float2 param_7 = framebufferSize; float4 param_8 = filterParams0; float4 param_9 = filterParams1; float4 param_10 = filterParams2; int param_11 = color0Filter; float4 color0 = filterColor(param_4, colorTexture0, colorTexture0Smplr, gammaLUT, gammaLUTSmplr, param_5, param_6, param_7, param_8, param_9, param_10, param_11); float4 param_12 = color; float4 param_13 = color0; int param_14 = color0Combine; color = combineColor0(param_12, param_13, param_14); } color.w *= maskAlpha; int compositeOp = (ctrl >> 8) & 15; float4 param_15 = color; float2 param_16 = framebufferSize; float2 param_17 = fragCoord; int param_18 = compositeOp; color = composite(param_15, destTexture, destTextureSmplr, param_16, param_17, param_18); float3 _1363 = color.xyz * color.w; color = float4(_1363.x, _1363.y, _1363.z, color.w); return color; } kernel void main0(constant int2& uFramebufferTileSize [[buffer(3)]], constant int& uLoadAction [[buffer(4)]], constant int2& uTextureMetadataSize [[buffer(7)]], constant float2& uFramebufferSize [[buffer(0)]], constant float2& uTileSize [[buffer(1)]], constant float4& uClearColor [[buffer(5)]], constant float2& uColorTextureSize0 [[buffer(8)]], constant float2& uMaskTextureSize0 [[buffer(9)]], const device bFirstTileMap& _1509 [[buffer(2)]], const device bTiles& _1602 [[buffer(6)]], texture2d uDestImage [[texture(0)]], texture2d uTextureMetadata [[texture(1)]], texture2d uColorTexture0 [[texture(2)]], texture2d uMaskTexture0 [[texture(3)]], texture2d uGammaLUT [[texture(4)]], sampler uTextureMetadataSmplr [[sampler(0)]], sampler uColorTexture0Smplr [[sampler(1)]], sampler uMaskTexture0Smplr [[sampler(2)]], sampler uGammaLUTSmplr [[sampler(3)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { int2 tileCoord = int2(gl_WorkGroupID.xy); int2 firstTileSubCoord = int2(gl_LocalInvocationID.xy) * int2(1, 4); int2 firstFragCoord = (tileCoord * int2(uTileSize)) + firstTileSubCoord; int tileIndex = _1509.iFirstTileMap[tileCoord.x + (uFramebufferTileSize.x * tileCoord.y)]; if ((tileIndex < 0) && (uLoadAction != 0)) { return; } float4x4 destColors; for (int subY = 0; subY < 4; subY++) { if (uLoadAction == 0) { destColors[subY] = uClearColor; } else { int2 param = firstFragCoord + int2(0, subY); int2 imageCoords = toImageCoords(param, uFramebufferSize); destColors[subY] = uDestImage.read(uint2(imageCoords)); } } int backdrop; uint2 maskTileCoord; float2 param_4; float4 param_5; float4 param_6; float4 param_7; float4 param_8; int param_9; while (tileIndex >= 0) { for (int subY_1 = 0; subY_1 < 4; subY_1++) { int2 tileSubCoord = firstTileSubCoord + int2(0, subY_1); float2 fragCoord = float2(firstFragCoord + int2(0, subY_1)) + float2(0.5); int alphaTileIndex = int(_1602.iTiles[(tileIndex * 4) + 2] << uint(8)) >> 8; uint tileControlWord = _1602.iTiles[(tileIndex * 4) + 3]; uint colorEntry = tileControlWord & 65535u; int tileCtrl = int((tileControlWord >> uint(16)) & 255u); if (alphaTileIndex >= 0) { backdrop = 0; maskTileCoord = uint2(uint(alphaTileIndex & 255), uint(alphaTileIndex >> 8)) * uint2(uTileSize); } else { backdrop = int(tileControlWord) >> 24; maskTileCoord = uint2(0u); tileCtrl &= (-4); } float3 maskTexCoord0 = float3(float2(int2(maskTileCoord) + tileSubCoord), float(backdrop)); float2 param_1 = fragCoord; int param_2 = int(colorEntry); int2 param_3 = uTextureMetadataSize; computeTileVaryings(param_1, param_2, uTextureMetadata, uTextureMetadataSmplr, param_3, param_4, param_5, param_6, param_7, param_8, param_9); float2 colorTexCoord0 = param_4; float4 baseColor = param_5; float4 filterParams0 = param_6; float4 filterParams1 = param_7; float4 filterParams2 = param_8; int ctrl = param_9; float2 param_10 = fragCoord; float2 param_11 = uColorTextureSize0; float2 param_12 = uMaskTextureSize0; float4 param_13 = filterParams0; float4 param_14 = filterParams1; float4 param_15 = filterParams2; float2 param_16 = uFramebufferSize; int param_17 = ctrl; float3 param_18 = maskTexCoord0; float2 param_19 = colorTexCoord0; float4 param_20 = baseColor; int param_21 = tileCtrl; float4 srcColor = calculateColor(param_10, uColorTexture0, uColorTexture0Smplr, uMaskTexture0, uMaskTexture0Smplr, uColorTexture0, uColorTexture0Smplr, uGammaLUT, uGammaLUTSmplr, param_11, param_12, param_13, param_14, param_15, param_16, param_17, param_18, param_19, param_20, param_21); destColors[subY_1] = (destColors[subY_1] * (1.0 - srcColor.w)) + srcColor; } tileIndex = int(_1602.iTiles[(tileIndex * 4) + 0]); } for (int subY_2 = 0; subY_2 < 4; subY_2++) { int2 param_22 = firstFragCoord + int2(0, subY_2); uDestImage.write(destColors[subY_2], uint2(toImageCoords(param_22, uFramebufferSize))); } }