1 /**************************************************************************** 2 * Copyright (C) 2014-2015 Intel Corporation. All Rights Reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 * 23 * @file tilingtraits.h 24 * 25 * @brief Tiling traits. 26 * 27 ******************************************************************************/ 28 #pragma once 29 30 #include "core/state.h" 31 #include "common/simdintrin.h" 32 33 template<SWR_TILE_MODE mode, int> 34 struct TilingTraits 35 { 36 static const SWR_TILE_MODE TileMode{ mode }; 37 static UINT GetCu() { SWR_ASSERT(0); return 0; } 38 static UINT GetCv() { SWR_ASSERT(0); return 0; } 39 static UINT GetCr() { SWR_ASSERT(0); return 0; } 40 static UINT GetTileIDShift() { SWR_ASSERT(0); return 0; } 41 42 /// @todo correct pdep shifts for all rastertile dims. Unused for now 43 static UINT GetPdepX() { SWR_ASSERT(0); return 0x37; } 44 static UINT GetPdepY() { SWR_ASSERT(0); return 0xC8; } 45 }; 46 47 template<int X> struct TilingTraits <SWR_TILE_NONE, X> 48 { 49 static const SWR_TILE_MODE TileMode{ SWR_TILE_NONE }; 50 static UINT GetCu() { return 0; } 51 static UINT GetCv() { return 0; } 52 static UINT GetCr() { return 0; } 53 static UINT GetTileIDShift() { return 0; } 54 static UINT GetPdepX() { return 0x00; } 55 static UINT GetPdepY() { return 0x00; } 56 }; 57 58 template<> struct TilingTraits <SWR_TILE_SWRZ, 8> 59 { 60 static const SWR_TILE_MODE TileMode{ SWR_TILE_SWRZ }; 61 static UINT GetCu() { return KNOB_TILE_X_DIM_SHIFT; } 62 static UINT GetCv() { return KNOB_TILE_Y_DIM_SHIFT; } 63 static UINT GetCr() { return 0; } 64 static UINT GetTileIDShift() { return KNOB_TILE_X_DIM_SHIFT + KNOB_TILE_Y_DIM_SHIFT; } 65 66 /// @todo correct pdep shifts for all rastertile dims. Unused for now 67 static UINT GetPdepX() { SWR_ASSERT(0); return 0x00; } 68 static UINT GetPdepY() { SWR_ASSERT(0); return 0x00; } 69 }; 70 71 template<> struct TilingTraits <SWR_TILE_SWRZ, 32> 72 { 73 static const SWR_TILE_MODE TileMode{ SWR_TILE_SWRZ }; 74 static UINT GetCu() { return KNOB_TILE_X_DIM_SHIFT + 2; } 75 static UINT GetCv() { return KNOB_TILE_Y_DIM_SHIFT; } 76 static UINT GetCr() { return 0; } 77 static UINT GetTileIDShift() { return KNOB_TILE_X_DIM_SHIFT + KNOB_TILE_Y_DIM_SHIFT + 2; } 78 79 static UINT GetPdepX() { return 0x37; } 80 static UINT GetPdepY() { return 0xC8; } 81 }; 82 83 template<> struct TilingTraits <SWR_TILE_SWRZ, 128> 84 { 85 static const SWR_TILE_MODE TileMode{ SWR_TILE_SWRZ }; 86 static UINT GetCu() { return KNOB_TILE_X_DIM_SHIFT + 4; } 87 static UINT GetCv() { return KNOB_TILE_Y_DIM_SHIFT; } 88 static UINT GetCr() { return 0; } 89 static UINT GetTileIDShift() { return KNOB_TILE_X_DIM_SHIFT + KNOB_TILE_Y_DIM_SHIFT + 4; } 90 91 /// @todo correct pdep shifts for all rastertile dims. Unused for now 92 static UINT GetPdepX() { SWR_ASSERT(0); return 0x37; } 93 static UINT GetPdepY() { SWR_ASSERT(0); return 0xC8; } 94 }; 95 96 // y-major tiling layout unaffected by element size 97 template<int X> struct TilingTraits <SWR_TILE_MODE_YMAJOR, X> 98 { 99 static const SWR_TILE_MODE TileMode{ SWR_TILE_MODE_YMAJOR }; 100 static UINT GetCu() { return 7; } 101 static UINT GetCv() { return 5; } 102 static UINT GetCr() { return 0; } 103 static UINT GetTileIDShift() { return 12; } 104 105 static UINT GetPdepX() { return 0xe0f; } 106 static UINT GetPdepY() { return 0x1f0; } 107 }; 108 109 // x-major tiling layout unaffected by element size 110 template<int X> struct TilingTraits <SWR_TILE_MODE_XMAJOR, X> 111 { 112 static const SWR_TILE_MODE TileMode{ SWR_TILE_MODE_XMAJOR }; 113 static UINT GetCu() { return 9; } 114 static UINT GetCv() { return 3; } 115 static UINT GetCr() { return 0; } 116 static UINT GetTileIDShift() { return 12; } 117 118 static UINT GetPdepX() { return 0x1ff; } 119 static UINT GetPdepY() { return 0xe00; } 120 }; 121 122 template<int X> struct TilingTraits <SWR_TILE_MODE_WMAJOR, X> 123 { 124 static const SWR_TILE_MODE TileMode{ SWR_TILE_MODE_WMAJOR }; 125 static UINT GetCu() { return 6; } 126 static UINT GetCv() { return 6; } 127 static UINT GetCr() { return 0; } 128 static UINT GetTileIDShift() { return 12; } 129 130 static UINT GetPdepX() { return 0xe15; } 131 static UINT GetPdepY() { return 0x1ea; } 132 }; 133 134 ////////////////////////////////////////////////////////////////////////// 135 /// @brief Computes the tileID for 2D tiled surfaces 136 /// @param pitch - surface pitch in bytes 137 /// @param tileX - x offset in tiles 138 /// @param tileY - y offset in tiles 139 template<typename TTraits> 140 INLINE UINT ComputeTileOffset2D(UINT pitch, UINT tileX, UINT tileY) 141 { 142 UINT tileID = tileY * (pitch >> TTraits::GetCu()) + tileX; 143 return tileID << TTraits::GetTileIDShift(); 144 } 145 146 ////////////////////////////////////////////////////////////////////////// 147 /// @brief Computes the tileID for 3D tiled surfaces 148 /// @param qpitch - surface qpitch in rows 149 /// @param pitch - surface pitch in bytes 150 /// @param tileX - x offset in tiles 151 /// @param tileY - y offset in tiles 152 /// @param tileZ - y offset in tiles 153 template<typename TTraits> 154 INLINE UINT ComputeTileOffset3D(UINT qpitch, UINT pitch, UINT tileX, UINT tileY, UINT tileZ) 155 { 156 UINT tileID = (tileZ * (qpitch >> TTraits::GetCv()) + tileY) * (pitch >> TTraits::GetCu()) + tileX; 157 return tileID << TTraits::GetTileIDShift(); 158 } 159 160 ////////////////////////////////////////////////////////////////////////// 161 /// @brief Computes the byte offset for 2D tiled surfaces 162 /// @param pitch - surface pitch in bytes 163 /// @param x - x offset in bytes 164 /// @param y - y offset in rows 165 template<typename TTraits> 166 INLINE UINT ComputeOffset2D(UINT pitch, UINT x, UINT y) 167 { 168 UINT tileID = ComputeTileOffset2D<TTraits>(pitch, x >> TTraits::GetCu(), y >> TTraits::GetCv()); 169 UINT xSwizzle = pdep_u32(x, TTraits::GetPdepX()); 170 UINT ySwizzle = pdep_u32(y, TTraits::GetPdepY()); 171 return (tileID | xSwizzle | ySwizzle); 172 } 173 174 #if KNOB_ARCH <= KNOB_ARCH_AVX 175 ////////////////////////////////////////////////////////////////////////// 176 /// @brief Computes the byte offset for 2D tiled surfaces. Specialization 177 /// for tile-y surfaces that uses bit twiddling instead of pdep emulation. 178 /// @param pitch - surface pitch in bytes 179 /// @param x - x offset in bytes 180 /// @param y - y offset in rows 181 template<> 182 INLINE UINT ComputeOffset2D<TilingTraits<SWR_TILE_MODE_YMAJOR, 32> >(UINT pitch, UINT x, UINT y) 183 { 184 typedef TilingTraits<SWR_TILE_MODE_YMAJOR, 32> TTraits; 185 186 UINT tileID = ComputeTileOffset2D<TTraits>(pitch, x >> TTraits::GetCu(), y >> TTraits::GetCv()); 187 UINT xSwizzle = ((x << 5) & 0xe00) | (x & 0xf); 188 UINT ySwizzle = (y << 4) & 0x1f0; 189 return (tileID | xSwizzle | ySwizzle); 190 } 191 #endif 192 193 ////////////////////////////////////////////////////////////////////////// 194 /// @brief Computes the byte offset for 3D tiled surfaces 195 /// @param qpitch - depth pitch in rows 196 /// @param pitch - surface pitch in bytes 197 /// @param x - x offset in bytes 198 /// @param y - y offset in rows 199 /// @param z - y offset in slices 200 template<typename TTraits> 201 INLINE UINT ComputeOffset3D(UINT qpitch, UINT pitch, UINT x, UINT y, UINT z) 202 { 203 UINT tileID = ComputeTileOffset3D<TTraits>(qpitch, pitch, x >> TTraits::GetCu(), y >> TTraits::GetCv(), z >> TTraits::GetCr()); 204 UINT xSwizzle = pdep_u32(x, TTraits::GetPdepX()); 205 UINT ySwizzle = pdep_u32(y, TTraits::GetPdepY()); 206 return (tileID | xSwizzle | ySwizzle); 207 } 208