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:
Jason Ekstrand 2021-06-15 16:20:14 -05:00 committed by Marge Bot
parent 0f6ebd2b73
commit 6b15ce9fa2
5 changed files with 827 additions and 10 deletions

View File

@ -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
View 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
View 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.

View File

@ -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)

View File

@ -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)
{