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