1 /****************************************************************************
2 * Copyright (C) 2014-2015 Intel Corporation. All Rights Reserved.
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:
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
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
25 * @brief Functionality for Load
27 ******************************************************************************/
28 #include "common/os.h"
29 #include "common/formats.h"
30 #include "core/context.h"
31 #include "core/rdtsc_core.h"
32 #include "memory/TilingFunctions.h"
33 #include "memory/tilingtraits.h"
34 #include "memory/Convert.h"
36 typedef void(*PFN_LOAD_TILES
)(SWR_SURFACE_STATE
*, uint8_t*, uint32_t, uint32_t, uint32_t);
38 //////////////////////////////////////////////////////////////////////////
39 /// Load Raster Tile Function Tables.
40 //////////////////////////////////////////////////////////////////////////
41 static PFN_LOAD_TILES sLoadTilesColorTable_SWR_TILE_NONE
[NUM_SWR_FORMATS
];
42 static PFN_LOAD_TILES sLoadTilesDepthTable_SWR_TILE_NONE
[NUM_SWR_FORMATS
];
44 static PFN_LOAD_TILES sLoadTilesColorTable_SWR_TILE_MODE_YMAJOR
[NUM_SWR_FORMATS
];
45 static PFN_LOAD_TILES sLoadTilesColorTable_SWR_TILE_MODE_XMAJOR
[NUM_SWR_FORMATS
];
47 static PFN_LOAD_TILES sLoadTilesDepthTable_SWR_TILE_MODE_YMAJOR
[NUM_SWR_FORMATS
];
49 //////////////////////////////////////////////////////////////////////////
51 //////////////////////////////////////////////////////////////////////////
52 template<typename TTraits
, SWR_FORMAT SrcFormat
, SWR_FORMAT DstFormat
>
55 //////////////////////////////////////////////////////////////////////////
56 /// @brief Retrieve color from hot tile source which is always float.
57 /// @param pSrc - Pointer to raster tile.
58 /// @param x, y - Coordinates to raster tile.
59 /// @param output - output color
60 INLINE
static void SetSwizzledDstColor(
61 const float srcColor
[4],
62 uint32_t x
, uint32_t y
,
65 typedef SimdTile
<DstFormat
, SrcFormat
> SimdT
;
67 SimdT
* pDstSimdTiles
= (SimdT
*)pDst
;
69 // Compute which simd tile we're accessing within 8x8 tile.
70 // i.e. Compute linear simd tile coordinate given (x, y) in pixel coordinates.
71 uint32_t simdIndex
= (y
/ SIMD_TILE_Y_DIM
) * (KNOB_TILE_X_DIM
/ SIMD_TILE_X_DIM
) + (x
/ SIMD_TILE_X_DIM
);
73 SimdT
* pSimdTile
= &pDstSimdTiles
[simdIndex
];
75 uint32_t simdOffset
= (y
% SIMD_TILE_Y_DIM
) * SIMD_TILE_X_DIM
+ (x
% SIMD_TILE_X_DIM
);
77 pSimdTile
->SetSwizzledColor(simdOffset
, srcColor
);
80 //////////////////////////////////////////////////////////////////////////
81 /// @brief Loads an 8x8 raster tile from the src surface.
82 /// @param pSrcSurface - Src surface state
83 /// @param pDst - Destination hot tile pointer
84 /// @param x, y - Coordinates to raster tile.
85 INLINE
static void Load(
86 SWR_SURFACE_STATE
* pSrcSurface
,
88 uint32_t x
, uint32_t y
, uint32_t sampleNum
, uint32_t renderTargetArrayIndex
) // (x, y) pixel coordinate to start of raster tile.
90 uint32_t lodWidth
= (pSrcSurface
->width
== 1) ? 1 : pSrcSurface
->width
>> pSrcSurface
->lod
;
91 uint32_t lodHeight
= (pSrcSurface
->height
== 1) ? 1 : pSrcSurface
->height
>> pSrcSurface
->lod
;
93 // For each raster tile pixel (rx, ry)
94 for (uint32_t ry
= 0; ry
< KNOB_TILE_Y_DIM
; ++ry
)
96 for (uint32_t rx
= 0; rx
< KNOB_TILE_X_DIM
; ++rx
)
98 if (((x
+ rx
) < lodWidth
) &&
99 ((y
+ ry
) < lodHeight
))
101 uint8_t* pSrc
= (uint8_t*)ComputeSurfaceAddress
<false>(x
+ rx
, y
+ ry
, pSrcSurface
->arrayIndex
+ renderTargetArrayIndex
,
102 pSrcSurface
->arrayIndex
+ renderTargetArrayIndex
, sampleNum
,
103 pSrcSurface
->lod
, pSrcSurface
);
106 ConvertPixelToFloat
<SrcFormat
>(srcColor
, pSrc
);
108 // store pixel to hottile
109 SetSwizzledDstColor(srcColor
, rx
, ry
, pDst
);
116 //////////////////////////////////////////////////////////////////////////
117 /// LoadMacroTile - Loads a macro tile which consists of raster tiles.
118 //////////////////////////////////////////////////////////////////////////
119 template<typename TTraits
, SWR_FORMAT SrcFormat
, SWR_FORMAT DstFormat
>
122 //////////////////////////////////////////////////////////////////////////
123 /// @brief Load a macrotile to the destination surface.
124 /// @param pSrc - Pointer to macro tile.
125 /// @param pDstSurface - Destination surface state
126 /// @param x, y - Coordinates to macro tile
128 SWR_SURFACE_STATE
* pSrcSurface
,
129 uint8_t *pDstHotTile
,
130 uint32_t x
, uint32_t y
, uint32_t renderTargetArrayIndex
)
132 // Load each raster tile from the hot tile to the destination surface.
133 for (uint32_t row
= 0; row
< KNOB_MACROTILE_Y_DIM
; row
+= KNOB_TILE_Y_DIM
)
135 for (uint32_t col
= 0; col
< KNOB_MACROTILE_X_DIM
; col
+= KNOB_TILE_X_DIM
)
137 for (uint32_t sampleNum
= 0; sampleNum
< pSrcSurface
->numSamples
; sampleNum
++)
139 LoadRasterTile
<TTraits
, SrcFormat
, DstFormat
>::Load(pSrcSurface
, pDstHotTile
,
140 (x
+ col
), (y
+ row
), sampleNum
, renderTargetArrayIndex
);
141 pDstHotTile
+= KNOB_TILE_X_DIM
* KNOB_TILE_Y_DIM
* (FormatTraits
<DstFormat
>::bpp
/ 8);
148 static void BUCKETS_START(UINT id
)
150 #ifdef KNOB_ENABLE_RDTSC
151 gBucketMgr
.StartBucket(id
);
155 static void BUCKETS_STOP(UINT id
)
157 #ifdef KNOB_ENABLE_RDTSC
158 gBucketMgr
.StopBucket(id
);
162 // on demand buckets for load tiles
163 static std::vector
<int> sBuckets(NUM_SWR_FORMATS
, -1);
164 static std::mutex sBucketMutex
;
166 //////////////////////////////////////////////////////////////////////////
167 /// @brief Loads a full hottile from a render surface
168 /// @param hPrivateContext - Handle to private DC
169 /// @param dstFormat - Format for hot tile.
170 /// @param renderTargetIndex - Index to src render target
171 /// @param x, y - Coordinates to raster tile.
172 /// @param pDstHotTile - Pointer to Hot Tile
174 SWR_SURFACE_STATE
*pSrcSurface
,
175 SWR_FORMAT dstFormat
,
176 SWR_RENDERTARGET_ATTACHMENT renderTargetIndex
,
177 uint32_t x
, uint32_t y
, uint32_t renderTargetArrayIndex
,
178 uint8_t *pDstHotTile
)
180 PFN_LOAD_TILES pfnLoadTiles
= NULL
;
182 // don't need to load null surfaces
183 if (pSrcSurface
->type
== SURFACE_NULL
)
188 // force 0 if requested renderTargetArrayIndex is OOB
189 if (renderTargetArrayIndex
>= pSrcSurface
->depth
)
191 renderTargetArrayIndex
= 0;
194 if (renderTargetIndex
< SWR_ATTACHMENT_DEPTH
)
196 switch (pSrcSurface
->tileMode
)
199 pfnLoadTiles
= sLoadTilesColorTable_SWR_TILE_NONE
[pSrcSurface
->format
];
201 case SWR_TILE_MODE_YMAJOR
:
202 pfnLoadTiles
= sLoadTilesColorTable_SWR_TILE_MODE_YMAJOR
[pSrcSurface
->format
];
204 case SWR_TILE_MODE_XMAJOR
:
205 pfnLoadTiles
= sLoadTilesColorTable_SWR_TILE_MODE_XMAJOR
[pSrcSurface
->format
];
207 case SWR_TILE_MODE_WMAJOR
:
208 SWR_ASSERT(pSrcSurface
->format
== R8_UINT
);
209 pfnLoadTiles
= LoadMacroTile
<TilingTraits
<SWR_TILE_MODE_WMAJOR
, 8>, R8_UINT
, R8_UINT
>::Load
;
212 SWR_ASSERT(0, "Unsupported tiling mode");
216 else if (renderTargetIndex
== SWR_ATTACHMENT_DEPTH
)
218 // Currently depth can map to linear and tile-y.
219 switch (pSrcSurface
->tileMode
)
222 pfnLoadTiles
= sLoadTilesDepthTable_SWR_TILE_NONE
[pSrcSurface
->format
];
224 case SWR_TILE_MODE_YMAJOR
:
225 pfnLoadTiles
= sLoadTilesDepthTable_SWR_TILE_MODE_YMAJOR
[pSrcSurface
->format
];
228 SWR_ASSERT(0, "Unsupported tiling mode");
234 SWR_ASSERT(renderTargetIndex
== SWR_ATTACHMENT_STENCIL
);
235 SWR_ASSERT(pSrcSurface
->format
== R8_UINT
);
236 switch (pSrcSurface
->tileMode
)
239 pfnLoadTiles
= LoadMacroTile
<TilingTraits
<SWR_TILE_NONE
, 8>, R8_UINT
, R8_UINT
>::Load
;
241 case SWR_TILE_MODE_WMAJOR
:
242 pfnLoadTiles
= LoadMacroTile
<TilingTraits
<SWR_TILE_MODE_WMAJOR
, 8>, R8_UINT
, R8_UINT
>::Load
;
245 SWR_ASSERT(0, "Unsupported tiling mode");
250 if (pfnLoadTiles
== nullptr)
252 SWR_ASSERT(false, "Unsupported format for load tile");
256 // Load a macro tile.
257 #ifdef KNOB_ENABLE_RDTSC
258 if (sBuckets
[pSrcSurface
->format
] == -1)
260 // guard sBuckets update since storetiles is called by multiple threads
262 if (sBuckets
[pSrcSurface
->format
] == -1)
264 const SWR_FORMAT_INFO
& info
= GetFormatInfo(pSrcSurface
->format
);
265 BUCKET_DESC desc
{ info
.name
, "", false, 0xffffffff };
266 sBuckets
[pSrcSurface
->format
] = gBucketMgr
.RegisterBucket(desc
);
268 sBucketMutex
.unlock();
272 BUCKETS_START(sBuckets
[pSrcSurface
->format
]);
273 pfnLoadTiles(pSrcSurface
, pDstHotTile
, x
, y
, renderTargetArrayIndex
);
274 BUCKETS_STOP(sBuckets
[pSrcSurface
->format
]);
277 //////////////////////////////////////////////////////////////////////////
278 /// INIT_LOAD_TILES_TABLE - Helper macro for setting up the tables.
279 #define INIT_LOAD_TILES_COLOR_TABLE(tilemode) \
280 memset(sLoadTilesColorTable_##tilemode, 0, sizeof(sLoadTilesColorTable_##tilemode)); \
282 sLoadTilesColorTable_##tilemode[R32G32B32A32_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 128>, R32G32B32A32_FLOAT, R32G32B32A32_FLOAT>::Load; \
283 sLoadTilesColorTable_##tilemode[R32G32B32A32_SINT] = LoadMacroTile<TilingTraits<tilemode, 128>, R32G32B32A32_SINT, R32G32B32A32_FLOAT>::Load; \
284 sLoadTilesColorTable_##tilemode[R32G32B32A32_UINT] = LoadMacroTile<TilingTraits<tilemode, 128>, R32G32B32A32_UINT, R32G32B32A32_FLOAT>::Load; \
285 sLoadTilesColorTable_##tilemode[R32G32B32X32_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 128>, R32G32B32X32_FLOAT, R32G32B32A32_FLOAT>::Load; \
286 sLoadTilesColorTable_##tilemode[R32G32B32_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 96>, R32G32B32_FLOAT, R32G32B32A32_FLOAT>::Load; \
287 sLoadTilesColorTable_##tilemode[R32G32B32_SINT] = LoadMacroTile<TilingTraits<tilemode, 96>, R32G32B32_SINT, R32G32B32A32_FLOAT>::Load; \
288 sLoadTilesColorTable_##tilemode[R32G32B32_UINT] = LoadMacroTile<TilingTraits<tilemode, 96>, R32G32B32_UINT, R32G32B32A32_FLOAT>::Load; \
289 sLoadTilesColorTable_##tilemode[R16G16B16A16_UNORM] = LoadMacroTile<TilingTraits<tilemode, 64>, R16G16B16A16_UNORM, R32G32B32A32_FLOAT>::Load; \
290 sLoadTilesColorTable_##tilemode[R16G16B16A16_SNORM] = LoadMacroTile<TilingTraits<tilemode, 64>, R16G16B16A16_SNORM, R32G32B32A32_FLOAT>::Load; \
291 sLoadTilesColorTable_##tilemode[R16G16B16A16_SINT] = LoadMacroTile<TilingTraits<tilemode, 64>, R16G16B16A16_SINT, R32G32B32A32_FLOAT>::Load; \
292 sLoadTilesColorTable_##tilemode[R16G16B16A16_UINT] = LoadMacroTile<TilingTraits<tilemode, 64>, R16G16B16A16_UINT, R32G32B32A32_FLOAT>::Load; \
293 sLoadTilesColorTable_##tilemode[R16G16B16A16_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 64>, R16G16B16A16_FLOAT, R32G32B32A32_FLOAT>::Load; \
294 sLoadTilesColorTable_##tilemode[R32G32_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 64>, R32G32_FLOAT, R32G32B32A32_FLOAT>::Load; \
295 sLoadTilesColorTable_##tilemode[R32G32_SINT] = LoadMacroTile<TilingTraits<tilemode, 64>, R32G32_SINT, R32G32B32A32_FLOAT>::Load; \
296 sLoadTilesColorTable_##tilemode[R32G32_UINT] = LoadMacroTile<TilingTraits<tilemode, 64>, R32G32_UINT, R32G32B32A32_FLOAT>::Load; \
297 sLoadTilesColorTable_##tilemode[R16G16B16X16_UNORM] = LoadMacroTile<TilingTraits<tilemode, 64>, R16G16B16X16_UNORM, R32G32B32A32_FLOAT>::Load; \
298 sLoadTilesColorTable_##tilemode[R16G16B16X16_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 64>, R16G16B16X16_FLOAT, R32G32B32A32_FLOAT>::Load; \
299 sLoadTilesColorTable_##tilemode[B8G8R8A8_UNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, B8G8R8A8_UNORM, R32G32B32A32_FLOAT>::Load; \
300 sLoadTilesColorTable_##tilemode[B8G8R8A8_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 32>, B8G8R8A8_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
301 sLoadTilesColorTable_##tilemode[R10G10B10A2_UNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, R10G10B10A2_UNORM, R32G32B32A32_FLOAT>::Load; \
302 sLoadTilesColorTable_##tilemode[R10G10B10A2_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 32>, R10G10B10A2_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
303 sLoadTilesColorTable_##tilemode[R10G10B10A2_UINT] = LoadMacroTile<TilingTraits<tilemode, 32>, R10G10B10A2_UINT, R32G32B32A32_FLOAT>::Load; \
304 sLoadTilesColorTable_##tilemode[R8G8B8A8_UNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, R8G8B8A8_UNORM, R32G32B32A32_FLOAT>::Load; \
305 sLoadTilesColorTable_##tilemode[R8G8B8A8_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 32>, R8G8B8A8_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
306 sLoadTilesColorTable_##tilemode[R8G8B8A8_SNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, R8G8B8A8_SNORM, R32G32B32A32_FLOAT>::Load; \
307 sLoadTilesColorTable_##tilemode[R8G8B8A8_SINT] = LoadMacroTile<TilingTraits<tilemode, 32>, R8G8B8A8_SINT, R32G32B32A32_FLOAT>::Load; \
308 sLoadTilesColorTable_##tilemode[R8G8B8A8_UINT] = LoadMacroTile<TilingTraits<tilemode, 32>, R8G8B8A8_UINT, R32G32B32A32_FLOAT>::Load; \
309 sLoadTilesColorTable_##tilemode[R16G16_UNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, R16G16_UNORM, R32G32B32A32_FLOAT>::Load; \
310 sLoadTilesColorTable_##tilemode[R16G16_SNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, R16G16_SNORM, R32G32B32A32_FLOAT>::Load; \
311 sLoadTilesColorTable_##tilemode[R16G16_SINT] = LoadMacroTile<TilingTraits<tilemode, 32>, R16G16_SINT, R32G32B32A32_FLOAT>::Load; \
312 sLoadTilesColorTable_##tilemode[R16G16_UINT] = LoadMacroTile<TilingTraits<tilemode, 32>, R16G16_UINT, R32G32B32A32_FLOAT>::Load; \
313 sLoadTilesColorTable_##tilemode[R16G16_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 32>, R16G16_FLOAT, R32G32B32A32_FLOAT>::Load; \
314 sLoadTilesColorTable_##tilemode[B10G10R10A2_UNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, B10G10R10A2_UNORM, R32G32B32A32_FLOAT>::Load; \
315 sLoadTilesColorTable_##tilemode[B10G10R10A2_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 32>, B10G10R10A2_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
316 sLoadTilesColorTable_##tilemode[R11G11B10_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 32>, R11G11B10_FLOAT, R32G32B32A32_FLOAT>::Load; \
317 sLoadTilesColorTable_##tilemode[R32_SINT] = LoadMacroTile<TilingTraits<tilemode, 32>, R32_SINT, R32G32B32A32_FLOAT>::Load; \
318 sLoadTilesColorTable_##tilemode[R32_UINT] = LoadMacroTile<TilingTraits<tilemode, 32>, R32_UINT, R32G32B32A32_FLOAT>::Load; \
319 sLoadTilesColorTable_##tilemode[R32_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 32>, R32_FLOAT, R32G32B32A32_FLOAT>::Load; \
320 sLoadTilesColorTable_##tilemode[A32_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 32>, A32_FLOAT, R32G32B32A32_FLOAT>::Load; \
321 sLoadTilesColorTable_##tilemode[B8G8R8X8_UNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, B8G8R8X8_UNORM, R32G32B32A32_FLOAT>::Load; \
322 sLoadTilesColorTable_##tilemode[B8G8R8X8_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 32>, B8G8R8X8_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
323 sLoadTilesColorTable_##tilemode[R8G8B8X8_UNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, R8G8B8X8_UNORM, R32G32B32A32_FLOAT>::Load; \
324 sLoadTilesColorTable_##tilemode[R8G8B8X8_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 32>, R8G8B8X8_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
325 sLoadTilesColorTable_##tilemode[B10G10R10X2_UNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, B10G10R10X2_UNORM, R32G32B32A32_FLOAT>::Load; \
326 sLoadTilesColorTable_##tilemode[B5G6R5_UNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, B5G6R5_UNORM, R32G32B32A32_FLOAT>::Load; \
327 sLoadTilesColorTable_##tilemode[B5G6R5_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 16>, B5G6R5_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
328 sLoadTilesColorTable_##tilemode[B5G5R5A1_UNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, B5G5R5A1_UNORM, R32G32B32A32_FLOAT>::Load; \
329 sLoadTilesColorTable_##tilemode[B5G5R5A1_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 16>, B5G5R5A1_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
330 sLoadTilesColorTable_##tilemode[B4G4R4A4_UNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, B4G4R4A4_UNORM, R32G32B32A32_FLOAT>::Load; \
331 sLoadTilesColorTable_##tilemode[B4G4R4A4_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 16>, B4G4R4A4_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
332 sLoadTilesColorTable_##tilemode[R8G8_UNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, R8G8_UNORM, R32G32B32A32_FLOAT>::Load; \
333 sLoadTilesColorTable_##tilemode[R8G8_SNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, R8G8_SNORM, R32G32B32A32_FLOAT>::Load; \
334 sLoadTilesColorTable_##tilemode[R8G8_SINT] = LoadMacroTile<TilingTraits<tilemode, 16>, R8G8_SINT, R32G32B32A32_FLOAT>::Load; \
335 sLoadTilesColorTable_##tilemode[R8G8_UINT] = LoadMacroTile<TilingTraits<tilemode, 16>, R8G8_UINT, R32G32B32A32_FLOAT>::Load; \
336 sLoadTilesColorTable_##tilemode[R16_UNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, R16_UNORM, R32G32B32A32_FLOAT>::Load; \
337 sLoadTilesColorTable_##tilemode[R16_SNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, R16_SNORM, R32G32B32A32_FLOAT>::Load; \
338 sLoadTilesColorTable_##tilemode[R16_SINT] = LoadMacroTile<TilingTraits<tilemode, 16>, R16_SINT, R32G32B32A32_FLOAT>::Load; \
339 sLoadTilesColorTable_##tilemode[R16_UINT] = LoadMacroTile<TilingTraits<tilemode, 16>, R16_UINT, R32G32B32A32_FLOAT>::Load; \
340 sLoadTilesColorTable_##tilemode[R16_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 16>, R16_FLOAT, R32G32B32A32_FLOAT>::Load; \
341 sLoadTilesColorTable_##tilemode[A16_UNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, A16_UNORM, R32G32B32A32_FLOAT>::Load; \
342 sLoadTilesColorTable_##tilemode[A16_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 16>, A16_FLOAT, R32G32B32A32_FLOAT>::Load; \
343 sLoadTilesColorTable_##tilemode[B5G5R5X1_UNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, B5G5R5X1_UNORM, R32G32B32A32_FLOAT>::Load; \
344 sLoadTilesColorTable_##tilemode[B5G5R5X1_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 16>, B5G5R5X1_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
345 sLoadTilesColorTable_##tilemode[R8_UNORM] = LoadMacroTile<TilingTraits<tilemode, 8>, R8_UNORM, R32G32B32A32_FLOAT>::Load; \
346 sLoadTilesColorTable_##tilemode[R8_SNORM] = LoadMacroTile<TilingTraits<tilemode, 8>, R8_SNORM, R32G32B32A32_FLOAT>::Load; \
347 sLoadTilesColorTable_##tilemode[R8_SINT] = LoadMacroTile<TilingTraits<tilemode, 8>, R8_SINT, R32G32B32A32_FLOAT>::Load; \
348 sLoadTilesColorTable_##tilemode[R8_UINT] = LoadMacroTile<TilingTraits<tilemode, 8>, R8_UINT, R32G32B32A32_FLOAT>::Load; \
349 sLoadTilesColorTable_##tilemode[A8_UNORM] = LoadMacroTile<TilingTraits<tilemode, 8>, A8_UNORM, R32G32B32A32_FLOAT>::Load; \
350 sLoadTilesColorTable_##tilemode[BC1_UNORM] = LoadMacroTile<TilingTraits<tilemode, 64>, BC1_UNORM, R32G32B32A32_FLOAT>::Load; \
351 sLoadTilesColorTable_##tilemode[BC2_UNORM] = LoadMacroTile<TilingTraits<tilemode, 128>, BC2_UNORM, R32G32B32A32_FLOAT>::Load; \
352 sLoadTilesColorTable_##tilemode[BC3_UNORM] = LoadMacroTile<TilingTraits<tilemode, 128>, BC3_UNORM, R32G32B32A32_FLOAT>::Load; \
353 sLoadTilesColorTable_##tilemode[BC4_UNORM] = LoadMacroTile<TilingTraits<tilemode, 64>, BC4_UNORM, R32G32B32A32_FLOAT>::Load; \
354 sLoadTilesColorTable_##tilemode[BC5_UNORM] = LoadMacroTile<TilingTraits<tilemode, 128>, BC5_UNORM, R32G32B32A32_FLOAT>::Load; \
355 sLoadTilesColorTable_##tilemode[BC1_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 64>, BC1_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
356 sLoadTilesColorTable_##tilemode[BC2_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 128>, BC2_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
357 sLoadTilesColorTable_##tilemode[BC3_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 128>, BC3_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
358 sLoadTilesColorTable_##tilemode[R8G8B8_UNORM] = LoadMacroTile<TilingTraits<tilemode, 24>, R8G8B8_UNORM, R32G32B32A32_FLOAT>::Load; \
359 sLoadTilesColorTable_##tilemode[R8G8B8_SNORM] = LoadMacroTile<TilingTraits<tilemode, 24>, R8G8B8_SNORM, R32G32B32A32_FLOAT>::Load; \
360 sLoadTilesColorTable_##tilemode[BC4_SNORM] = LoadMacroTile<TilingTraits<tilemode, 64>, BC4_SNORM, R32G32B32A32_FLOAT>::Load; \
361 sLoadTilesColorTable_##tilemode[BC5_SNORM] = LoadMacroTile<TilingTraits<tilemode, 128>, BC5_SNORM, R32G32B32A32_FLOAT>::Load; \
362 sLoadTilesColorTable_##tilemode[R16G16B16_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 48>, R16G16B16_FLOAT, R32G32B32A32_FLOAT>::Load; \
363 sLoadTilesColorTable_##tilemode[R16G16B16_UNORM] = LoadMacroTile<TilingTraits<tilemode, 48>, R16G16B16_UNORM, R32G32B32A32_FLOAT>::Load; \
364 sLoadTilesColorTable_##tilemode[R16G16B16_SNORM] = LoadMacroTile<TilingTraits<tilemode, 48>, R16G16B16_SNORM, R32G32B32A32_FLOAT>::Load; \
365 sLoadTilesColorTable_##tilemode[R8G8B8_UNORM_SRGB] = LoadMacroTile<TilingTraits<tilemode, 24>, R8G8B8_UNORM_SRGB, R32G32B32A32_FLOAT>::Load; \
366 sLoadTilesColorTable_##tilemode[R16G16B16_UINT] = LoadMacroTile<TilingTraits<tilemode, 48>, R16G16B16_UINT, R32G32B32A32_FLOAT>::Load; \
367 sLoadTilesColorTable_##tilemode[R16G16B16_SINT] = LoadMacroTile<TilingTraits<tilemode, 48>, R16G16B16_SINT, R32G32B32A32_FLOAT>::Load; \
368 sLoadTilesColorTable_##tilemode[R10G10B10A2_SNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, R10G10B10A2_SNORM, R32G32B32A32_FLOAT>::Load; \
369 sLoadTilesColorTable_##tilemode[R10G10B10A2_SINT] = LoadMacroTile<TilingTraits<tilemode, 32>, R10G10B10A2_SINT, R32G32B32A32_FLOAT>::Load; \
370 sLoadTilesColorTable_##tilemode[B10G10R10A2_SNORM] = LoadMacroTile<TilingTraits<tilemode, 32>, B10G10R10A2_SNORM, R32G32B32A32_FLOAT>::Load; \
371 sLoadTilesColorTable_##tilemode[B10G10R10A2_UINT] = LoadMacroTile<TilingTraits<tilemode, 32>, B10G10R10A2_UINT, R32G32B32A32_FLOAT>::Load; \
372 sLoadTilesColorTable_##tilemode[B10G10R10A2_SINT] = LoadMacroTile<TilingTraits<tilemode, 32>, B10G10R10A2_SINT, R32G32B32A32_FLOAT>::Load; \
373 sLoadTilesColorTable_##tilemode[R8G8B8_UINT] = LoadMacroTile<TilingTraits<tilemode, 24>, R8G8B8_UINT, R32G32B32A32_FLOAT>::Load; \
374 sLoadTilesColorTable_##tilemode[R8G8B8_SINT] = LoadMacroTile<TilingTraits<tilemode, 24>, R8G8B8_SINT, R32G32B32A32_FLOAT>::Load; \
376 //////////////////////////////////////////////////////////////////////////
377 /// INIT_LOAD_TILES_TABLE - Helper macro for setting up the tables.
378 #define INIT_LOAD_TILES_DEPTH_TABLE(tilemode) \
379 memset(sLoadTilesDepthTable_##tilemode, 0, sizeof(sLoadTilesDepthTable_##tilemode)); \
381 sLoadTilesDepthTable_##tilemode[R16_UNORM] = LoadMacroTile<TilingTraits<tilemode, 16>, R16_UNORM, R32_FLOAT>::Load; \
382 sLoadTilesDepthTable_##tilemode[R32_FLOAT] = LoadMacroTile<TilingTraits<tilemode, 32>, R32_FLOAT, R32_FLOAT>::Load; \
383 sLoadTilesDepthTable_##tilemode[R24_UNORM_X8_TYPELESS] = LoadMacroTile<TilingTraits<tilemode, 32>, R24_UNORM_X8_TYPELESS, R32_FLOAT>::Load; \
385 //////////////////////////////////////////////////////////////////////////
386 /// @brief Sets up tables for LoadTile
387 void InitSimLoadTilesTable()
389 INIT_LOAD_TILES_COLOR_TABLE(SWR_TILE_NONE
);
390 INIT_LOAD_TILES_DEPTH_TABLE(SWR_TILE_NONE
);
392 INIT_LOAD_TILES_COLOR_TABLE(SWR_TILE_MODE_YMAJOR
);
393 INIT_LOAD_TILES_COLOR_TABLE(SWR_TILE_MODE_XMAJOR
);
395 INIT_LOAD_TILES_DEPTH_TABLE(SWR_TILE_MODE_YMAJOR
);