1) ) , params.srcExtent.y, params.srcExtent.z); if (any(id >= idBoundary)) { return; } let byteOffset = params.offset + id.x * gOutputUnitSize + id.y * params.bytesPerRow + id.z * params.bytesPerRow * params.rowsPerImage; let dstOffset = byteOffset / gOutputUnitSize; let srcBoundary = params.srcOrigin + params.srcExtent; // Start coord, End coord var coordS = vec3u(id.x * params.packTexelCount, id.y, id.z) + params.srcOrigin; var coordE = coordS; coordE.x += params.packTexelCount - 1; if (params.shift > 0) { // Adjust coordS if (id.x == 0) { // Front of a row if (readPreviousRow) { // Needs reading from previous row coordS.x += params.bytesPerRow / params.texelSize - params.shift; if (id.y == 0) { // Front of a layer if (isCompactImage) { // Needs reading from previous layer coordS.y += params.srcExtent.y - 1; if (id.z > 0) { coordS.z -= 1; } } } else { coordS.y -= 1; } } } else { coordS.x -= params.shift; } coordE.x -= params.shift; } let readDstBufAtStart: bool = params.shift > 0 && ( all(id == vec3u(0u)) // start of buffer || (id.x == 0 && (!readPreviousRow // start of non-compact row || (id.y == 0 && !isCompactImage) // start of non-compact image ))); let readDstBufAtEnd: bool = coordE.x >= srcBoundary.x;