mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-11-23 10:14:13 +08:00
docs/isl: Add detailed documentation about tiling on Intel GPUs
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11366>
This commit is contained in:
parent
0f6ebd2b73
commit
6b15ce9fa2
@ -11,6 +11,7 @@ Chery.
|
||||
|
||||
units
|
||||
formats
|
||||
tiling
|
||||
|
||||
The core representation of a surface in ISL is :cpp:struct:`isl_surf`.
|
||||
|
||||
|
512
docs/isl/tiling-basic.svg
Normal file
512
docs/isl/tiling-basic.svg
Normal file
@ -0,0 +1,512 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="800"
|
||||
height="402"
|
||||
viewBox="0 0 800 401.99999"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="tiling-basic.svg">
|
||||
<defs
|
||||
id="defs4" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.979899"
|
||||
inkscape:cx="236.80681"
|
||||
inkscape:cy="190.0918"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1379"
|
||||
inkscape:window-height="1132"
|
||||
inkscape:window-x="479"
|
||||
inkscape:window-y="232"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3336"
|
||||
originx="-9"
|
||||
originy="-330.00001" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-9,-320.36214)">
|
||||
<rect
|
||||
style="fill:#fbff00;fill-opacity:0.4;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4152"
|
||||
width="400"
|
||||
height="400"
|
||||
x="10"
|
||||
y="321.36209" />
|
||||
<rect
|
||||
style="fill:#aff48e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4154"
|
||||
width="371"
|
||||
height="331.00006"
|
||||
x="10"
|
||||
y="321.36209" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 110,321.36214 0,400"
|
||||
id="path4140"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 210,321.36214 0,400 0,0"
|
||||
id="path4142"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 310,321.36214 0,400"
|
||||
id="path4144"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 10,421.36214 400,0 0,0"
|
||||
id="path4146"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 10,521.36214 400,0"
|
||||
id="path4148"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 10,621.36214 400,0"
|
||||
id="path4150"
|
||||
inkscape:connector-curvature="0" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="51"
|
||||
y="382.36209"
|
||||
id="text4156"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158"
|
||||
x="51"
|
||||
y="382.36209">0</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="151"
|
||||
y="382.36209"
|
||||
id="text4156-3"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-6"
|
||||
x="151"
|
||||
y="382.36209">1</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="251"
|
||||
y="382.36209"
|
||||
id="text4156-7"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-5"
|
||||
x="251"
|
||||
y="382.36209">2</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="351"
|
||||
y="382.36209"
|
||||
id="text4156-35"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-62"
|
||||
x="351"
|
||||
y="382.36209">3</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="51"
|
||||
y="482.36209"
|
||||
id="text4156-9"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-1"
|
||||
x="51"
|
||||
y="482.36209">4</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="151"
|
||||
y="482.36209"
|
||||
id="text4156-2"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-7"
|
||||
x="151"
|
||||
y="482.36209">5</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="251"
|
||||
y="482.36209"
|
||||
id="text4156-0"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-9"
|
||||
x="251"
|
||||
y="482.36209">6</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="351"
|
||||
y="482.36209"
|
||||
id="text4156-36"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0"
|
||||
x="351"
|
||||
y="482.36209">7</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="51"
|
||||
y="582.36212"
|
||||
id="text4156-6"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-2"
|
||||
x="51"
|
||||
y="582.36212">8</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="149"
|
||||
y="582.36212"
|
||||
id="text4156-61"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-8"
|
||||
x="149"
|
||||
y="582.36212">9</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="241"
|
||||
y="582.36212"
|
||||
id="text4156-79"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-20"
|
||||
x="241"
|
||||
y="582.36212">10</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="341"
|
||||
y="582.36212"
|
||||
id="text4156-23"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-75"
|
||||
x="341"
|
||||
y="582.36212">11</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="41"
|
||||
y="682.36212"
|
||||
id="text4156-92"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-28"
|
||||
x="41"
|
||||
y="682.36212">12</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="141"
|
||||
y="682.36212"
|
||||
id="text4156-97"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-3"
|
||||
x="141"
|
||||
y="682.36212">13</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="241"
|
||||
y="682.36212"
|
||||
id="text4156-612"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-93"
|
||||
x="241"
|
||||
y="682.36212">14</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="341"
|
||||
y="682.36212"
|
||||
id="text4156-1"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-94"
|
||||
x="341"
|
||||
y="682.36212">15</tspan></text>
|
||||
<rect
|
||||
style="fill:#aff48e;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4290"
|
||||
width="300"
|
||||
height="240.00006"
|
||||
x="509"
|
||||
y="412.36209" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 509,452.36216 300,0"
|
||||
id="path4308"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 509,652.36216 0,-240 300,0"
|
||||
id="path4310"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 589,412.36216 0,240"
|
||||
id="path4314"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 669,412.36216 0,240"
|
||||
id="path4316"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 749,412.36216 0,240"
|
||||
id="path4318"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 509,492.36216 299.28572,0"
|
||||
id="path4320"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 509,532.36216 300,0"
|
||||
id="path4322"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="541.27283"
|
||||
y="442.10953"
|
||||
id="text4156-36-7"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8"
|
||||
x="541.27283"
|
||||
y="442.10953">0</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="620.51526"
|
||||
y="441.85696"
|
||||
id="text4156-36-7-4"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-5"
|
||||
x="620.51526"
|
||||
y="441.85696">1</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="701.77789"
|
||||
y="441.60452"
|
||||
id="text4156-36-7-0"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-3"
|
||||
x="701.77789"
|
||||
y="441.60452">2</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="524.71429"
|
||||
y="480.9335"
|
||||
id="text4156-36-7-06"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-32"
|
||||
x="524.71429"
|
||||
y="480.9335">128</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="604.80835"
|
||||
y="481.35196"
|
||||
id="text4156-36-7-061"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-55"
|
||||
x="604.80835"
|
||||
y="481.35196">129</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="525.31348"
|
||||
y="521.60455"
|
||||
id="text4156-36-7-5"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-69"
|
||||
x="525.31348"
|
||||
y="521.60455">256</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="605.9079"
|
||||
y="521.85699"
|
||||
id="text4156-36-7-3"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-7"
|
||||
x="605.9079"
|
||||
y="521.85699">257</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="685.15027"
|
||||
y="521.60455"
|
||||
id="text4156-36-7-45"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-2"
|
||||
x="685.15027"
|
||||
y="521.60455">258</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="684.30328"
|
||||
y="481.35196"
|
||||
id="text4156-36-7-061-5"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-55-4"
|
||||
x="684.30328"
|
||||
y="481.35196">130</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="766.14288"
|
||||
y="434.50491"
|
||||
id="text4156-36-7-0-7"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-3-4"
|
||||
x="766.14288"
|
||||
y="434.50491">...</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="766.14288"
|
||||
y="474.50491"
|
||||
id="text4156-36-7-0-7-4"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-3-4-3"
|
||||
x="766.14288"
|
||||
y="474.50491">...</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="766.14288"
|
||||
y="514.50494"
|
||||
id="text4156-36-7-0-7-0"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-3-4-7"
|
||||
x="766.14288"
|
||||
y="514.50494">...</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="533.28577"
|
||||
y="563.79071"
|
||||
id="text4156-36-7-0-7-8"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-3-4-6"
|
||||
x="533.28577"
|
||||
y="563.79071">...</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="616.14288"
|
||||
y="564.50494"
|
||||
id="text4156-36-7-0-7-88"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-3-4-4"
|
||||
x="616.14288"
|
||||
y="564.50494">...</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:30px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="696.14288"
|
||||
y="564.50494"
|
||||
id="text4156-36-7-0-7-3"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4158-0-8-3-4-1"
|
||||
x="696.14288"
|
||||
y="564.50494">...</tspan></text>
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 111,322.36216 808.77664,411.352"
|
||||
id="path4510"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 11,422.36216 509.7868,651.352"
|
||||
id="path4512"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 23 KiB |
288
docs/isl/tiling.rst
Normal file
288
docs/isl/tiling.rst
Normal file
@ -0,0 +1,288 @@
|
||||
Tiling
|
||||
======
|
||||
|
||||
The naive view of an image in memory is that the pixels are stored one after
|
||||
another in memory usually in an X-major order. An image that is arranged in
|
||||
this way is called "linear". Linear images, while easy to reason about, can
|
||||
have very bad cache locality. Graphics operations tend to act on pixels that
|
||||
are close together in 2-D euclidean space. If you move one pixel to the right
|
||||
or left in a linear image, you only move a few bytes to one side or the other
|
||||
in memory. However, if you move one pixel up or down you can end up kilobytes
|
||||
or even megabytes away.
|
||||
|
||||
Tiling (sometimes referred to as swizzling) is a method of re-arranging the
|
||||
pixels of a surface so that pixels which are close in 2-D euclidean space are
|
||||
likely to be close in memory.
|
||||
|
||||
Basics
|
||||
------
|
||||
|
||||
The basic idea of a tiled image is that the image is first divided into
|
||||
two-dimensional blocks or tiles. Each tile takes up a chunk of contiguous
|
||||
memory and the tiles are arranged like pixels in linear surface. This is best
|
||||
demonstrated with a specific example. Suppose we have a RGBA8888 X-tiled
|
||||
surface on Intel graphics. Then the surface is divided into 128x8 pixel tiles
|
||||
each of which is 4KB of memory. Within each tile, the pixels are laid out like
|
||||
a 128x8 linear image. The tiles themselves are laid out row-major in memory
|
||||
like giant pixels. This means that, as long as you don't leave your 128x8
|
||||
tile, you can move in both dimensions without leaving the same 4K page in
|
||||
memory.
|
||||
|
||||
.. image:: tiling-basic.svg
|
||||
:alt: Example of an X-tiled image
|
||||
|
||||
You can, however do even better than this. Suppose that same image is,
|
||||
instead, Y-tiled. Then the surface is divided into 32x32 pixel tiles each of
|
||||
which is 4KB of memory. Within a tile, each 64B cache line corresponds to 4x4
|
||||
pixel region of the image (you can think of it as a tile within a tile). This
|
||||
means that very small deviations don't even leave the cache line. This added
|
||||
bit of pixel shuffling is known to have a substantial performance impact in
|
||||
most real-world applications.
|
||||
|
||||
Intel graphics has several different tiling formats that we'll discuss in
|
||||
detail in later sections. The most commonly used as of the writing of this
|
||||
chapter is Y-tiling. In all tiling formats the basic principal is the same:
|
||||
The image is divided into tiles of a particular size and, within those tiles,
|
||||
the data is re-arranged (or swizzled) based on a particular pattern. A tile
|
||||
size will always be specified in bytes by rows and the actual X-dimension of
|
||||
the tile in elements depends on the size of the element in bytes.
|
||||
|
||||
Bit-6 Swizzling
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
On some hardware, there is an additional address swizzle that is applied on top
|
||||
of the tiling format. Whether or not swizzling is enabled depends on the memory
|
||||
configuration of the system. In general, systems with dual-channel RAM have
|
||||
swizzling enabled and single-channel do not. Supposedly, this swizzling allows
|
||||
for better balancing between the two memory channels and increases performance.
|
||||
Because it depends on the memory configuration which may change from one boot
|
||||
to the next, it requires a run-time check.
|
||||
|
||||
The best documentation for bit-6 swizzling can be found in the Haswell PRM Vol.
|
||||
5 "Memory Views" in the section entitled "Address Swizzling for Tiled-Y
|
||||
Surfaces".
|
||||
|
||||
ISL Representation
|
||||
------------------
|
||||
|
||||
The structure of any given tiling format is represented by ISL using the
|
||||
:cpp:enum:`isl_tiling` enum and the :cpp:struct:`isl_tile_info` structure:
|
||||
|
||||
.. doxygenenum:: isl_tiling
|
||||
|
||||
.. doxygenfunction:: isl_tiling_get_info
|
||||
|
||||
.. doxygenstruct:: isl_tile_info
|
||||
:members:
|
||||
|
||||
The `isl_tile_info` structure has two different sizes for a tile: a logical
|
||||
size in surface elements and a physical size in bytes. In order to determine
|
||||
the proper logical size, the bits-per-block of the underlying format has to be
|
||||
passed into `isl_tiling_get_info`. The proper way to compute the size of an
|
||||
image in bytes given a width and height in elements is as follows:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
uint32_t width_tl = DIV_ROUND_UP(width_el * (format_bpb / tile_info.format_bpb),
|
||||
tile_info.logical_extent_el.w);
|
||||
uint32_t height_tl = DIV_ROUND_UP(height_el, tile_info.logical_extent_el.h);
|
||||
uint32_t row_pitch = width_tl * tile_info.phys_extent_el.w;
|
||||
uint32_t size = height_tl * tile_info.phys_extent_el.h * row_pitch;
|
||||
|
||||
It is very important to note that there is no direct conversion between
|
||||
:cpp:member:`isl_tile_info::logical_extent_el` and
|
||||
:cpp:member:`isl_tile_info::phys_extent_B`. It is tempting to assume that the
|
||||
logical and physical heights are the same and simply divide the width of
|
||||
:cpp:member:`isl_tile_info::phys_extent_B` by the size of the format (which is
|
||||
what the PRM does) to get :cpp:member:`isl_tile_info::logical_extent_el` but
|
||||
this is not at all correct. Some tiling formats have logical and physical
|
||||
heights that differ and so no such calculation will work in general. The
|
||||
easiest case study for this is W-tiling. From the Sky Lake PRM Vol. 2d,
|
||||
"RENDER_SURFACE_STATE" (p. 427):
|
||||
|
||||
If the surface is a stencil buffer (and thus has Tile Mode set to
|
||||
TILEMODE_WMAJOR), the pitch must be set to 2x the value computed based on
|
||||
width, as the stencil buffer is stored with two rows interleaved.
|
||||
|
||||
What does this mean? Why are we multiplying the pitch by two? What does it
|
||||
mean that "the stencil buffer is stored with two rows interleaved"? The
|
||||
explanation for all these questions is that a W-tile (which is only used for
|
||||
stencil) has a logical size of 64el x 64el but a physical size of 128B
|
||||
x 32rows. In memory, a W-tile has the same footprint as a Y-tile (128B
|
||||
x 32rows) but every pair of rows in the stencil buffer is interleaved into
|
||||
a single row of bytes yielding a two-dimensional area of 64el x 64el. You can
|
||||
consider this as its own tiling format or as a modification of Y-tiling. The
|
||||
interpretation in the PRMs vary by hardware generation; on Sandy Bridge they
|
||||
simply said it was Y-tiled but by Sky Lake there is almost no mention of
|
||||
Y-tiling in connection with stencil buffers and they are always W-tiled. This
|
||||
mismatch between logical and physical tile sizes are also relevant for
|
||||
hierarchical depth buffers as well as single-channel MCS and CCS buffers.
|
||||
|
||||
X-tiling
|
||||
--------
|
||||
|
||||
The simplest tiling format available on Intel graphics (which has been
|
||||
available since gen4) is X-tiling. An X-tile is 512B x 8rows and, within the
|
||||
tile, the data is arranged in an X-major linear fashion. You can also look at
|
||||
X-tiling as being an 8x8 cache line grid where the cache lines are arranged
|
||||
X-major as follows:
|
||||
|
||||
===== ===== ===== ===== ===== ===== ===== =====
|
||||
===== ===== ===== ===== ===== ===== ===== =====
|
||||
0x000 0x040 0x080 0x0c0 0x100 0x140 0x180 0x1c0
|
||||
0x200 0x240 0x280 0x2c0 0x300 0x340 0x380 0x3c0
|
||||
0x400 0x440 0x480 0x4c0 0x500 0x540 0x580 0x5c0
|
||||
0x600 0x640 0x680 0x6c0 0x700 0x740 0x780 0x7c0
|
||||
0x800 0x840 0x880 0x8c0 0x900 0x940 0x980 0x9c0
|
||||
0xa00 0xa40 0xa80 0xac0 0xb00 0xb40 0xb80 0xbc0
|
||||
0xc00 0xc40 0xc80 0xcc0 0xd00 0xd40 0xd80 0xdc0
|
||||
0xe00 0xe40 0xe80 0xec0 0xf00 0xf40 0xf80 0xfc0
|
||||
===== ===== ===== ===== ===== ===== ===== =====
|
||||
|
||||
Each cache line represents a piece of a single row of pixels within the image.
|
||||
The memory locations of two vertically adjacent pixels within the same X-tile
|
||||
always differs by 512B or 8 cache lines.
|
||||
|
||||
As mentioned above, X-tiling is slower than Y-tiling (though still faster than
|
||||
linear). However, until Sky Lake, the display scan-out hardware could only do
|
||||
X-tiling so we have historically used X-tiling for all window-system buffers
|
||||
(because X or a Wayland compositor may want to put it in a plane).
|
||||
|
||||
Bit-6 Swizzling
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
When bit-6 swizzling is enabled, bits 9 and 10 are XOR'd in with bit 6 of the
|
||||
tiled address:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
addr[6] ^= addr[9] ^ addr[10];
|
||||
|
||||
Y-tiling
|
||||
--------
|
||||
|
||||
The Y-tiling format, also available since gen4, is substantially different from
|
||||
X-tiling and performs much better in practice. Each Y-tile is an 8x8 grid of cache lines arranged Y-major as follows:
|
||||
|
||||
===== ===== ===== ===== ===== ===== ===== =====
|
||||
===== ===== ===== ===== ===== ===== ===== =====
|
||||
0x000 0x200 0x400 0x600 0x800 0xa00 0xc00 0xe00
|
||||
0x040 0x240 0x440 0x640 0x840 0xa40 0xc40 0xe40
|
||||
0x080 0x280 0x480 0x680 0x880 0xa80 0xc80 0xe80
|
||||
0x0c0 0x2c0 0x4c0 0x6c0 0x8c0 0xac0 0xcc0 0xec0
|
||||
0x100 0x300 0x500 0x700 0x900 0xb00 0xd00 0xf00
|
||||
0x140 0x340 0x540 0x740 0x940 0xb40 0xd40 0xf40
|
||||
0x180 0x380 0x580 0x780 0x980 0xb80 0xd80 0xf80
|
||||
0x1c0 0x3c0 0x5c0 0x7c0 0x9c0 0xbc0 0xdc0 0xfc0
|
||||
===== ===== ===== ===== ===== ===== ===== =====
|
||||
|
||||
Each 64B cache line within the tile is laid out as 4 rows of 16B each:
|
||||
|
||||
==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
|
||||
==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
|
||||
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
|
||||
0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f
|
||||
0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2a 0x2b 0x2c 0x2d 0x2e 0x2f
|
||||
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3a 0x3b 0x3c 0x3d 0x3e 0x3f
|
||||
==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
|
||||
|
||||
Y-tiling is widely regarded as being substantially faster than X-tiling so it
|
||||
is generally preferred. However, prior to Sky Lake, Y-tiling was not available
|
||||
for scanout so X tiling was used for any sort of window-system buffers.
|
||||
Starting with Sky Lake, we can scan out from Y-tiled buffers.
|
||||
|
||||
Bit-6 Swizzling
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
When bit-6 swizzling is enabled, bit 9 is XOR'd in with bit 6 of the tiled
|
||||
address:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
addr[6] ^= addr[9];
|
||||
|
||||
W-tiling
|
||||
--------
|
||||
|
||||
W-tiling is a new tiling format added on Sandy Bridge for use in stencil
|
||||
buffers. W-tiling is similar to Y-tiling in that it's arranged as an 8x8
|
||||
Y-major grid of cache lines. The bytes within each cache line are arranged as
|
||||
follows:
|
||||
|
||||
==== ==== ==== ==== ==== ==== ==== ====
|
||||
==== ==== ==== ==== ==== ==== ==== ====
|
||||
0x00 0x01 0x04 0x05 0x10 0x11 0x14 0x15
|
||||
0x02 0x03 0x06 0x07 0x12 0x13 0x16 0x17
|
||||
0x08 0x09 0x0c 0x0d 0x18 0x19 0x1c 0x1d
|
||||
0x0a 0x0b 0x0e 0x0f 0x1a 0x1b 0x1e 0x1f
|
||||
0x20 0x21 0x24 0x25 0x30 0x31 0x34 0x35
|
||||
0x22 0x23 0x26 0x27 0x32 0x33 0x36 0x37
|
||||
0x28 0x29 0x2c 0x2d 0x38 0x39 0x3c 0x3d
|
||||
0x2a 0x2b 0x2e 0x2f 0x3a 0x3b 0x3e 0x3f
|
||||
==== ==== ==== ==== ==== ==== ==== ====
|
||||
|
||||
While W-tiling has been required for stencil all the way back to Sandy Bridge,
|
||||
the docs are somewhat confused as to whether stencil buffers are W or Y-tiled.
|
||||
This seems to stem from the fact that the hardware seems to implement W-tiling
|
||||
as a sort of modified Y-tiling. One example of this is the somewhat odd
|
||||
requirement that W-tiled buffers have their pitch multiplied by 2. From the
|
||||
Sky Lake PRM Vol. 2d, "RENDER_SURFACE_STATE" (p. 427):
|
||||
|
||||
If the surface is a stencil buffer (and thus has Tile Mode set to
|
||||
TILEMODE_WMAJOR), the pitch must be set to 2x the value computed based on
|
||||
width, as the stencil buffer is stored with two rows interleaved.
|
||||
|
||||
The last phrase holds the key here: "the stencil buffer is stored with two rows
|
||||
interleaved". More accurately, a W-tiled buffer can be viewed as a Y-tiled
|
||||
buffer with each set of 4 W-tiled lines interleaved to form 2 Y-tiled lines. In
|
||||
ISL, we represent a W-tile as a tiling with a logical dimension of 64el x 64el
|
||||
but a physical size of 128B x 32rows. This cleanly takes care of the pitch
|
||||
issue above and seems to nicely model the hardware.
|
||||
|
||||
Tiling as a bit pattern
|
||||
-----------------------
|
||||
|
||||
There is one more important angle on tiling that should be discussed before we
|
||||
finish. Every tiling can be described by three things:
|
||||
|
||||
1. A logical width and height in elements
|
||||
2. A physical width in bytes and height in rows
|
||||
3. A mapping from logical elements to physical bytes within the tile
|
||||
|
||||
We have spent a good deal of time on the first two because this is what you
|
||||
really need for doing surface layout calculations. However, there are cases in
|
||||
which the map from logical to physical elements is critical. One example is
|
||||
W-tiling where we have code to do W-tiled encoding and decoding in the shader
|
||||
for doing stencil blits because the hardware does not allow us to render to
|
||||
W-tiled surfaces.
|
||||
|
||||
There are many ways to mathematically describe the mapping from logical
|
||||
elements to physical bytes. In the PRMs they give a very complicated set of
|
||||
formulas involving lots of multiplication, modulus, and sums that show you how
|
||||
to compute the mapping. With a little creativity, you can easily reduce those
|
||||
to a set of bit shifts and ORs. By far the simplest formulation, however, is
|
||||
as a mapping from the bits of the texture coordinates to bits in the address.
|
||||
Suppose that :math:`(u, v)` is location of a 1-byte element within a tile. If
|
||||
you represent :math:`u` as :math:`u_n u_{n-1} \cdots u_2 u_1 u_0` where
|
||||
:math:`u_0` is the LSB and :math:`u_n` is the MSB of :math:`u` and similarly
|
||||
:math:`v = v_m v_{m-1} \cdots v_2 v_1 v_0`, then the bits of the address within
|
||||
the tile are given by the table below:
|
||||
|
||||
=========================================== =========== =========== =========== =========== =========== =========== =========== =========== =========== =========== =========== ===========
|
||||
Tiling 11 10 9 8 7 6 5 4 3 2 1 0
|
||||
=========================================== =========== =========== =========== =========== =========== =========== =========== =========== =========== =========== =========== ===========
|
||||
:cpp:enumerator:`isl_tiling::ISL_TILING_X` :math:`v_3` :math:`v_2` :math:`v_1` :math:`v_0` :math:`u_7` :math:`u_6` :math:`u_5` :math:`u_4` :math:`u_3` :math:`u_2` :math:`u_1` :math:`u_0`
|
||||
:cpp:enumerator:`isl_tiling::ISL_TILING_Y0` :math:`u_6` :math:`u_5` :math:`u_4` :math:`v_4` :math:`v_3` :math:`v_2` :math:`v_1` :math:`v_0` :math:`u_3` :math:`u_2` :math:`u_1` :math:`u_0`
|
||||
:cpp:enumerator:`isl_tiling::ISL_TILING_W` :math:`u_5` :math:`u_4` :math:`u_3` :math:`v_5` :math:`v_4` :math:`v_3` :math:`v_2` :math:`u_2` :math:`v_1` :math:`u_1` :math:`v_0` :math:`u_0`
|
||||
=========================================== =========== =========== =========== =========== =========== =========== =========== =========== =========== =========== =========== ===========
|
||||
|
||||
Constructing the mapping this way makes a lot of sense when you think about
|
||||
hardware. It may seem complex on paper but "simple" things such as addition
|
||||
are relatively expensive in hardware while interleaving bits in a well-defined
|
||||
pattern is practically free. For a format that has more than one byte per
|
||||
element, you simply chop bits off the bottom of the pattern, hard-code them to
|
||||
0, and adjust bit indices as needed. For a 128-bit format, for instance, the
|
||||
Y-tiled pattern becomes u_2 u_1 u_0 v_4 v_3 v_2 v_1 v_0. The Sky Lake PRM
|
||||
Vol. 5 in the section "2D Surfaces" contains an expanded version of the above
|
||||
table (which we will not repeat here) that also includes the bit patterns for
|
||||
the Ys and Yf tiling formats.
|
@ -306,9 +306,12 @@ isl_device_get_sample_counts(struct isl_device *dev)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an isl_tile_info representation of the given isl_tiling when
|
||||
* combined with a format of the given size.
|
||||
*
|
||||
* @param[out] info is written only on success
|
||||
*/
|
||||
static void
|
||||
void
|
||||
isl_tiling_get_info(enum isl_tiling tiling,
|
||||
uint32_t format_bpb,
|
||||
struct isl_tile_info *tile_info)
|
||||
|
@ -558,18 +558,22 @@ enum isl_txc {
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Hardware tile mode
|
||||
* Describes the memory tiling of a surface
|
||||
*
|
||||
* WARNING: These values differ from the hardware enum values, which are
|
||||
* unstable across hardware generations.
|
||||
* This differs from the HW enum values used to represent tiling. The bits
|
||||
* used by hardware have varried significantly over the years from the
|
||||
* "Tile Walk" bit on old pre-Broadwell parts to the "Tile Mode" enum on
|
||||
* Broadwell to the combination of "Tile Mode" and "Tiled Resource Mode" on
|
||||
* Skylake. This enum represents them all in a consistent manner and in one
|
||||
* place.
|
||||
*
|
||||
* Note that legacy Y tiling is ISL_TILING_Y0 instead of ISL_TILING_Y, to
|
||||
* clearly distinguish it from Yf and Ys.
|
||||
*/
|
||||
enum isl_tiling {
|
||||
ISL_TILING_LINEAR = 0,
|
||||
ISL_TILING_W,
|
||||
ISL_TILING_X,
|
||||
ISL_TILING_LINEAR = 0, /**< Linear, or no tiling */
|
||||
ISL_TILING_W, /**< W tiling */
|
||||
ISL_TILING_X, /**< X tiling */
|
||||
ISL_TILING_Y0, /**< Legacy Y tiling */
|
||||
ISL_TILING_Yf, /**< Standard 4K tiling. The 'f' means "four". */
|
||||
ISL_TILING_Ys, /**< Standard 64K tiling. The 's' means "sixty-four". */
|
||||
@ -1244,9 +1248,11 @@ struct isl_format_layout {
|
||||
};
|
||||
|
||||
struct isl_tile_info {
|
||||
/** Tiling represented by this isl_tile_info */
|
||||
enum isl_tiling tiling;
|
||||
|
||||
/* The size (in bits per block) of a single surface element
|
||||
/**
|
||||
* The size (in bits per block) of a single surface element
|
||||
*
|
||||
* For surfaces with power-of-two formats, this is the same as
|
||||
* isl_format_layout::bpb. For non-power-of-two formats it may be smaller.
|
||||
@ -1265,7 +1271,8 @@ struct isl_tile_info {
|
||||
*/
|
||||
uint32_t format_bpb;
|
||||
|
||||
/** The logical size of the tile in units of format_bpb size elements
|
||||
/**
|
||||
* The logical size of the tile in units of format_bpb size elements
|
||||
*
|
||||
* This field determines how a given surface is cut up into tiles. It is
|
||||
* used to compute the size of a surface in tiles and can be used to
|
||||
@ -1275,7 +1282,8 @@ struct isl_tile_info {
|
||||
*/
|
||||
struct isl_extent4d logical_extent_el;
|
||||
|
||||
/** The physical size of the tile in bytes and rows of bytes
|
||||
/**
|
||||
* The physical size of the tile in bytes and rows of bytes
|
||||
*
|
||||
* This field determines how the tiles of a surface are physically layed
|
||||
* out in memory. The logical and physical tile extent are frequently the
|
||||
@ -1877,6 +1885,11 @@ bool
|
||||
isl_has_matching_typed_storage_image_format(const struct intel_device_info *devinfo,
|
||||
enum isl_format fmt);
|
||||
|
||||
void
|
||||
isl_tiling_get_info(enum isl_tiling tiling,
|
||||
uint32_t format_bpb,
|
||||
struct isl_tile_info *tile_info);
|
||||
|
||||
static inline enum isl_tiling
|
||||
isl_tiling_flag_to_enum(isl_tiling_flags_t flag)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user