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