E.x - 1 < srcBoundary.x) { mask &= 0xff00ffffu; v[2] = textureLoadGeneral(src_tex, coordE - vec3u(1, 0, 0), params.mipLevel).r; } if (coordE.x >= 2) { if (coordE.x - 2 < srcBoundary.x) { mask &= 0xffff00ffu; v[1] = textureLoadGeneral(src_tex, coordE - vec3u(2, 0, 0), params.mipLevel).r; } if (coordE.x >= 3) { if (coordE.x - 3 < srcBoundary.x) { mask &= 0xffffff00u; v[0] = textureLoadGeneral(src_tex, coordE - vec3u(3, 0, 0), params.mipLevel).r; } } } } } if (coordE.x < srcBoundary.x) { mask &= 0x00ffffffu; v[3] = textureLoadGeneral(src_tex, coordE, params.mipLevel).r; } else { // coordE is not used // dstBuf value is used for later part. // end of buffer (last thread) / end of non-compact row + x boundary check if (coordE.x - 2 < srcBoundary.x) { mask &= 0xffff00ffu; v[1] = textureLoadGeneral(src_tex, coordE - vec3u(2, 0, 0), params.mipLevel).r; if (coordE.x - 1 < srcBoundary.x) { mask &= 0xff00ffffu; v[2] = textureLoadGeneral(src_tex, coordE - vec3u(1, 0, 0), params.mipLevel).r; } } } if (readDstBufAtStart || readDstBufAtEnd) { let original: u32 = dst_buf[dstOffset]; result = (original & mask) | (encodeVectorInU32General(v) & ~mask); } else { var coord1: vec3u; var coord2: vec3u; if (coordS.x < coordE.x) { // middle of row coord1 = coordE - vec3u(2, 0, 0); coord2 = coordE - vec3u(1, 0, 0); } else { // start of row switch params.shift { case 0: { coord1 = coordS + vec3u(1, 0, 0); coord2 = coordS + vec3u(2, 0, 0); } case 1: { coord1 = coordE - vec3u(2, 0, 0); coord2 = coordE - vec3u(1, 0, 0); } case 2: { coord1 = coordS + vec3u(1, 0, 0); coord2 = coordE - vec3u(1, 0, 0); } case 3: { coord1 = coordS + vec3u(1, 0, 0); coord2 = coordS + vec3u(2, 0, 0); } default: { return; // unreachable when shift == 0 } } } if (coord1.x < srcBoundary.x) { mask &= 0xffff00ffu; v[1] = textureLoadGeneral(src_tex, coord1, params.mipLevel).r; } if (coord2.x < srcBoundary.x) { mask &= 0xff00ffffu; v[2] = textureLoadGeneral(src_tex, coord2, params.mipLevel).r; } let readDstBufAtMid: bool = (params.srcExtent.x + params.shift > params.bytesPerRow) && (params.srcExtent.x < params.bytesPerRow); if (readDstBufAtMid && id.x == 0) { let original: u32 = dst_buf[dstOffset]; result = (original & mask) | (encodeVectorInU32General(v) & ~mask); } else { result = encodeVectorInU32General(v); } }