1/* 2 * Copyright (C) 2018-2021 Intel Corporation 3 * 4 * SPDX-License-Identifier: MIT 5 * 6 */ 7 8#include "shared/source/helpers/ptr_math.h" 9 10#include <array> 11 12namespace NEO { 13 14bool isCompatibleWithLayoutForImages(const std::array<uint16_t, 3> &localWorkgroupSize, const std::array<uint8_t, 3> &dimensionsOrder, uint16_t simd) { 15 uint8_t xMask = simd == 8u ? 0b1 : 0b11; 16 uint8_t yMask = 0b11; 17 return dimensionsOrder.at(0) == 0 && 18 dimensionsOrder.at(1) == 1 && 19 (localWorkgroupSize.at(0) & xMask) == 0 && 20 (localWorkgroupSize.at(1) & yMask) == 0 && 21 localWorkgroupSize.at(2) == 1u; 22} 23 24inline void generateLocalIDsWithLayoutForImages(void *b, const std::array<uint16_t, 3> &localWorkgroupSize, uint16_t simd) { 25 uint8_t rowWidth = simd == 32u ? 32u : 16u; 26 uint8_t xDelta = simd == 8u ? 2u : 4u; // difference between corresponding values in consecutive X rows 27 uint8_t yDelta = (simd == 8u || localWorkgroupSize.at(1) == 4u) ? 4u : rowWidth / xDelta; // difference between corresponding values in consecutive Y rows 28 29 auto buffer = reinterpret_cast<uint16_t *>(b); 30 uint16_t offset = 0u; 31 auto numGrfs = (localWorkgroupSize.at(0) * localWorkgroupSize.at(1) * localWorkgroupSize.at(2) + (simd - 1)) / simd; 32 uint8_t xMask = simd == 8u ? 0b1 : 0b11; 33 uint16_t x = 0u; 34 uint16_t y = 0u; 35 for (auto grfId = 0; grfId < numGrfs; grfId++) { 36 auto rowX = buffer + offset; 37 auto rowY = buffer + offset + rowWidth; 38 auto rowZ = buffer + offset + 2 * rowWidth; 39 uint16_t extraX = 0u; 40 uint16_t extraY = 0u; 41 42 for (uint8_t i = 0u; i < simd; i++) { 43 if (i > 0) { 44 extraX++; 45 if (extraX == xDelta) { 46 extraX = 0u; 47 } 48 if ((i & xMask) == 0) { 49 extraY++; 50 if (y + extraY == localWorkgroupSize.at(1)) { 51 extraY = 0; 52 x += xDelta; 53 } 54 } 55 } 56 if (x == localWorkgroupSize.at(0)) { 57 x = 0u; 58 y += yDelta; 59 if (y >= localWorkgroupSize.at(1)) { 60 y = 0u; 61 } 62 } 63 rowX[i] = x + extraX; 64 rowY[i] = y + extraY; 65 rowZ[i] = 0u; 66 } 67 x += xDelta; 68 offset += 3 * rowWidth; 69 } 70} 71 72void generateLocalIDsForSimdOne(void *b, const std::array<uint16_t, 3> &localWorkgroupSize, 73 const std::array<uint8_t, 3> &dimensionsOrder, uint32_t grfSize) { 74 uint32_t xDimNum = dimensionsOrder[0]; 75 uint32_t yDimNum = dimensionsOrder[1]; 76 uint32_t zDimNum = dimensionsOrder[2]; 77 78 for (int i = 0; i < localWorkgroupSize[zDimNum]; i++) { 79 for (int j = 0; j < localWorkgroupSize[yDimNum]; j++) { 80 for (int k = 0; k < localWorkgroupSize[xDimNum]; k++) { 81 static_cast<uint16_t *>(b)[0] = k; 82 static_cast<uint16_t *>(b)[1] = j; 83 static_cast<uint16_t *>(b)[2] = i; 84 b = ptrOffset(b, grfSize); 85 } 86 } 87 } 88} 89 90} // namespace NEO 91