Home | History | Annotate | Download | only in memory
      1 /****************************************************************************
      2 * Copyright (C) 2014-2016 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 LoadTile.cpp
     24 *
     25 * @brief Functionality for Load
     26 *
     27 ******************************************************************************/
     28 #include "LoadTile.h"
     29 
     30 
     31 static void BUCKETS_START(UINT id)
     32 {
     33 #ifdef KNOB_ENABLE_RDTSC
     34     gBucketMgr.StartBucket(id);
     35 #endif
     36 }
     37 
     38 static void BUCKETS_STOP(UINT id)
     39 {
     40 #ifdef KNOB_ENABLE_RDTSC
     41     gBucketMgr.StopBucket(id);
     42 #endif
     43 }
     44 
     45 // on demand buckets for load tiles
     46 static std::vector<int> sBuckets(NUM_SWR_FORMATS, -1);
     47 static std::mutex sBucketMutex;
     48 
     49 //////////////////////////////////////////////////////////////////////////
     50 /// @brief Loads a full hottile from a render surface
     51 /// @param hPrivateContext - Handle to private DC
     52 /// @param dstFormat - Format for hot tile.
     53 /// @param renderTargetIndex - Index to src render target
     54 /// @param x, y - Coordinates to raster tile.
     55 /// @param pDstHotTile - Pointer to Hot Tile
     56 void LoadHotTile(
     57     const SWR_SURFACE_STATE *pSrcSurface,
     58     SWR_FORMAT dstFormat,
     59     SWR_RENDERTARGET_ATTACHMENT renderTargetIndex,
     60     uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex,
     61     uint8_t *pDstHotTile)
     62 {
     63     PFN_LOAD_TILES pfnLoadTiles = NULL;
     64 
     65     // don't need to load null surfaces
     66     if (pSrcSurface->type == SURFACE_NULL)
     67     {
     68         return;
     69     }
     70 
     71     // force 0 if requested renderTargetArrayIndex is OOB
     72     if (renderTargetArrayIndex >= pSrcSurface->depth)
     73     {
     74         renderTargetArrayIndex = 0;
     75     }
     76 
     77     if (renderTargetIndex < SWR_ATTACHMENT_DEPTH)
     78     {
     79         switch (pSrcSurface->tileMode)
     80         {
     81         case SWR_TILE_NONE:
     82             pfnLoadTiles = sLoadTilesColorTable_SWR_TILE_NONE[pSrcSurface->format];
     83             break;
     84         case SWR_TILE_MODE_YMAJOR:
     85             pfnLoadTiles = sLoadTilesColorTable_SWR_TILE_MODE_YMAJOR[pSrcSurface->format];
     86             break;
     87         case SWR_TILE_MODE_XMAJOR:
     88             pfnLoadTiles = sLoadTilesColorTable_SWR_TILE_MODE_XMAJOR[pSrcSurface->format];
     89             break;
     90         case SWR_TILE_MODE_WMAJOR:
     91             SWR_ASSERT(pSrcSurface->format == R8_UINT);
     92             pfnLoadTiles = LoadMacroTile<TilingTraits<SWR_TILE_MODE_WMAJOR, 8>, R8_UINT, R8_UINT>::Load;
     93             break;
     94         default:
     95             SWR_ASSERT(0, "Unsupported tiling mode");
     96             break;
     97         }
     98     }
     99     else if (renderTargetIndex == SWR_ATTACHMENT_DEPTH)
    100     {
    101         // Currently depth can map to linear and tile-y.
    102         switch (pSrcSurface->tileMode)
    103         {
    104         case SWR_TILE_NONE:
    105             pfnLoadTiles = sLoadTilesDepthTable_SWR_TILE_NONE[pSrcSurface->format];
    106             break;
    107         case SWR_TILE_MODE_YMAJOR:
    108             pfnLoadTiles = sLoadTilesDepthTable_SWR_TILE_MODE_YMAJOR[pSrcSurface->format];
    109             break;
    110         default:
    111             SWR_ASSERT(0, "Unsupported tiling mode");
    112             break;
    113         }
    114     }
    115     else
    116     {
    117         SWR_ASSERT(renderTargetIndex == SWR_ATTACHMENT_STENCIL);
    118         SWR_ASSERT(pSrcSurface->format == R8_UINT);
    119         switch (pSrcSurface->tileMode)
    120         {
    121         case SWR_TILE_NONE:
    122             pfnLoadTiles = LoadMacroTile<TilingTraits<SWR_TILE_NONE, 8>, R8_UINT, R8_UINT>::Load;
    123             break;
    124         case SWR_TILE_MODE_WMAJOR:
    125             pfnLoadTiles = LoadMacroTile<TilingTraits<SWR_TILE_MODE_WMAJOR, 8>, R8_UINT, R8_UINT>::Load;
    126             break;
    127         default:
    128             SWR_ASSERT(0, "Unsupported tiling mode");
    129             break;
    130         }
    131     }
    132 
    133     if (pfnLoadTiles == nullptr)
    134     {
    135         SWR_ASSERT(false, "Unsupported format for load tile");
    136         return;
    137     }
    138 
    139     // Load a macro tile.
    140 #ifdef KNOB_ENABLE_RDTSC
    141     if (sBuckets[pSrcSurface->format] == -1)
    142     {
    143         // guard sBuckets update since storetiles is called by multiple threads
    144         sBucketMutex.lock();
    145         if (sBuckets[pSrcSurface->format] == -1)
    146         {
    147             const SWR_FORMAT_INFO& info = GetFormatInfo(pSrcSurface->format);
    148             BUCKET_DESC desc{ info.name, "", false, 0xffffffff };
    149             sBuckets[pSrcSurface->format] = gBucketMgr.RegisterBucket(desc);
    150         }
    151         sBucketMutex.unlock();
    152     }
    153 #endif
    154 
    155     BUCKETS_START(sBuckets[pSrcSurface->format]);
    156     pfnLoadTiles(pSrcSurface, pDstHotTile, x, y, renderTargetArrayIndex);
    157     BUCKETS_STOP(sBuckets[pSrcSurface->format]);
    158 }
    159 
    160 
    161 void InitSimLoadTilesTable()
    162 {
    163     InitLoadTilesTable_Linear();
    164     InitLoadTilesTable_XMajor();
    165     InitLoadTilesTable_YMajor();
    166 }
    167