Home | History | Annotate | Download | only in memory
      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