€•4ªŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ3/translations/zh_CN/gpu/amdgpu/display/mpo-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/zh_TW/gpu/amdgpu/display/mpo-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/it_IT/gpu/amdgpu/display/mpo-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ja_JP/gpu/amdgpu/display/mpo-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ko_KR/gpu/amdgpu/display/mpo-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/pt_BR/gpu/amdgpu/display/mpo-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/sp_SP/gpu/amdgpu/display/mpo-overview”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒMultiplane Overlay (MPO)”h]”hŒMultiplane Overlay (MPO)”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒM/var/lib/git/docbuild/linux/Documentation/gpu/amdgpu/display/mpo-overview.rst”h´KubhŒnote”“”)�”}”(hŒrYou will get more from this page if you have already read the 'Documentation/gpu/amdgpu/display/dcn-overview.rst'.”h]”hŒ paragraph”“”)�”}”(hŒrYou will get more from this page if you have already read the 'Documentation/gpu/amdgpu/display/dcn-overview.rst'.”h]”hŒvYou will get more from this page if you have already read the ‘Documentation/gpu/amdgpu/display/dcn-overview.rst’.”…”�”}”(hhÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KhhÍubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³hÊh´NubhÒ)�”}”(hX`Multiplane Overlay (MPO) allows for multiple framebuffers to be composited via fixed-function hardware in the display controller rather than using graphics or compute shaders for composition. This can yield some power savings if it means the graphics/compute pipelines can be put into low-power states. In summary, MPO can bring the following benefits:”h]”hX`Multiplane Overlay (MPO) allows for multiple framebuffers to be composited via fixed-function hardware in the display controller rather than using graphics or compute shaders for composition. This can yield some power savings if it means the graphics/compute pipelines can be put into low-power states. In summary, MPO can bring the following benefits:”…”�”}”(hhçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K hh·h²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒqDecreased GPU and CPU workload - no composition shaders needed, no extra buffer copy needed, GPU can remain idle.”h]”hÒ)�”}”(hŒqDecreased GPU and CPU workload - no composition shaders needed, no extra buffer copy needed, GPU can remain idle.”h]”hŒqDecreased GPU and CPU workload - no composition shaders needed, no extra buffer copy needed, GPU can remain idle.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Khhüubah}”(h]”h ]”h"]”h$]”h&]”uh1húhh÷h²hh³hÊh´Nubhû)�”}”(hŒ„Plane independent page flips - No need to be tied to global compositor page-flip present rate, reduced latency, independent timing. ”h]”hÒ)�”}”(hŒƒPlane independent page flips - No need to be tied to global compositor page-flip present rate, reduced latency, independent timing.”h]”hŒƒPlane independent page flips - No need to be tied to global compositor page-flip present rate, reduced latency, independent timing.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1húhh÷h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1hõh³hÊh´Khh·h²hubhÌ)�”}”(hŒÚKeep in mind that MPO is all about power-saving; if you want to learn more about power-save in the display context, check the link: `Power `__.”h]”hÒ)�”}”(hŒÚKeep in mind that MPO is all about power-saving; if you want to learn more about power-save in the display context, check the link: `Power `__.”h]”(hŒ„Keep in mind that MPO is all about power-saving; if you want to learn more about power-save in the display context, check the link: ”…”�”}”(hj8h²hh³Nh´NubhŒ reference”“”)�”}”(hŒU`Power `__”h]”hŒPower”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒPower”Œrefuri”ŒIhttps://gitlab.freedesktop.org/pq/color-and-hdr/-/blob/main/doc/power.rst”uh1j@hj8ubhŒ.”…”�”}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Khj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³hÊh´NubhÒ)�”}”(hX¼Multiplane Overlay is only available using the DRM atomic model. The atomic model only uses a single userspace IOCTL for configuring the display hardware (modesetting, page-flipping, etc) - drmModeAtomicCommit. To query hardware resources and limitations userspace also calls into drmModeGetResources which reports back the number of planes, CRTCs, and connectors. There are three types of DRM planes that the driver can register and work with:”h]”hX¼Multiplane Overlay is only available using the DRM atomic model. The atomic model only uses a single userspace IOCTL for configuring the display hardware (modesetting, page-flipping, etc) - drmModeAtomicCommit. To query hardware resources and limitations userspace also calls into drmModeGetResources which reports back the number of planes, CRTCs, and connectors. There are three types of DRM planes that the driver can register and work with:”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Khh·h²hubhö)�”}”(hhh]”(hû)�”}”(hŒ¨``DRM_PLANE_TYPE_PRIMARY``: Primary planes represent a "main" plane for a CRTC, primary planes are the planes operated upon by CRTC modesetting and flipping operations.”h]”hÒ)�”}”(hŒ¨``DRM_PLANE_TYPE_PRIMARY``: Primary planes represent a "main" plane for a CRTC, primary planes are the planes operated upon by CRTC modesetting and flipping operations.”h]”(hŒliteral”“”)�”}”(hŒ``DRM_PLANE_TYPE_PRIMARY``”h]”hŒDRM_PLANE_TYPE_PRIMARY”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjyubhŒ’: Primary planes represent a “mainâ€� plane for a CRTC, primary planes are the planes operated upon by CRTC modesetting and flipping operations.”…”�”}”(hjyh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Khjuubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjrh²hh³hÊh´Nubhû)�”}”(hŒ�``DRM_PLANE_TYPE_CURSOR``: Cursor planes represent a "cursor" plane for a CRTC. Cursor planes are the planes operated upon by the cursor IOCTLs”h]”hÒ)�”}”(hŒ�``DRM_PLANE_TYPE_CURSOR``: Cursor planes represent a "cursor" plane for a CRTC. Cursor planes are the planes operated upon by the cursor IOCTLs”h]”(j~)�”}”(hŒ``DRM_PLANE_TYPE_CURSOR``”h]”hŒDRM_PLANE_TYPE_CURSOR”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hj¡ubhŒz: Cursor planes represent a “cursorâ€� plane for a CRTC. Cursor planes are the planes operated upon by the cursor IOCTLs”…”�”}”(hj¡h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K"hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjrh²hh³hÊh´Nubhû)�”}”(hŒž``DRM_PLANE_TYPE_OVERLAY``: Overlay planes represent all non-primary, non-cursor planes. Some drivers refer to these types of planes as "sprites" internally. ”h]”hÒ)�”}”(hŒ�``DRM_PLANE_TYPE_OVERLAY``: Overlay planes represent all non-primary, non-cursor planes. Some drivers refer to these types of planes as "sprites" internally.”h]”(j~)�”}”(hŒ``DRM_PLANE_TYPE_OVERLAY``”h]”hŒDRM_PLANE_TYPE_OVERLAY”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjÇubhŒ‡: Overlay planes represent all non-primary, non-cursor planes. Some drivers refer to these types of planes as “spritesâ€� internally.”…”�”}”(hjÇh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K$hjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjrh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´Khh·h²hubhÒ)�”}”(hŒiTo illustrate how it works, let's take a look at a device that exposes the following planes to userspace:”h]”hŒkTo illustrate how it works, let’s take a look at a device that exposes the following planes to userspace:”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K(hh·h²hubhö)�”}”(hhh]”(hû)�”}”(hŒ4 Primary planes (1 per CRTC).”h]”hÒ)�”}”(hjh]”hŒ4 Primary planes (1 per CRTC).”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K+hjubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjýh²hh³hÊh´Nubhû)�”}”(hŒ4 Cursor planes (1 per CRTC).”h]”hÒ)�”}”(hjh]”hŒ4 Cursor planes (1 per CRTC).”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K,hjubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjýh²hh³hÊh´Nubhû)�”}”(hŒ&1 Overlay plane (shared among CRTCs). ”h]”hÒ)�”}”(hŒ%1 Overlay plane (shared among CRTCs).”h]”hŒ%1 Overlay plane (shared among CRTCs).”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K-hj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjýh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´K+hh·h²hubhÌ)�”}”(hŒGKeep in mind that different ASICs might expose other numbers of planes.”h]”hÒ)�”}”(hŒGKeep in mind that different ASICs might expose other numbers of planes.”h]”hŒGKeep in mind that different ASICs might expose other numbers of planes.”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K/hjLubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³hÊh´NubhÒ)�”}”(hX/For this hardware example, we have 4 pipes (if you don't know what AMD pipe means, look at 'Documentation/gpu/amdgpu/display/dcn-overview.rst', section "AMD Hardware Pipeline"). Typically most AMD devices operate in a pipe-split configuration for optimal single display output (e.g., 2 pipes per plane).”h]”hX9For this hardware example, we have 4 pipes (if you don’t know what AMD pipe means, look at ‘Documentation/gpu/amdgpu/display/dcn-overview.rst’, section “AMD Hardware Pipelineâ€�). Typically most AMD devices operate in a pipe-split configuration for optimal single display output (e.g., 2 pipes per plane).”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K2hh·h²hubhÒ)�”}”(hŒ~A typical MPO configuration from userspace - 1 primary + 1 overlay on a single display - will see 4 pipes in use, 2 per plane.”h]”hŒ~A typical MPO configuration from userspace - 1 primary + 1 overlay on a single display - will see 4 pipes in use, 2 per plane.”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K7hh·h²hubhÒ)�”}”(hX�At least 1 pipe must be used per plane (primary and overlay), so for this hypothetical hardware that we are using as an example, we have an absolute limit of 4 planes across all CRTCs. Atomic commits will be rejected for display configurations using more than 4 planes. Again, it is important to stress that every DCN has different restrictions; here, we are just trying to provide the concept idea.”h]”hX�At least 1 pipe must be used per plane (primary and overlay), so for this hypothetical hardware that we are using as an example, we have an absolute limit of 4 planes across all CRTCs. Atomic commits will be rejected for display configurations using more than 4 planes. Again, it is important to stress that every DCN has different restrictions; here, we are just trying to provide the concept idea.”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K:hh·h²hubh¶)�”}”(hhh]”(h»)�”}”(hŒPlane Restrictions”h]”hŒPlane Restrictions”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjŽh²hh³hÊh´KBubhÒ)�”}”(hŒCAMDGPU imposes restrictions on the use of DRM planes in the driver.”h]”hŒCAMDGPU imposes restrictions on the use of DRM planes in the driver.”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KDhjŽh²hubhÒ)�”}”(hŒSAtomic commits will be rejected for commits which do not follow these restrictions:”h]”hŒSAtomic commits will be rejected for commits which do not follow these restrictions:”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KFhjŽh²hubhö)�”}”(hhh]”(hû)�”}”(hŒ5Overlay planes must be in ARGB8888 or XRGB8888 format”h]”hÒ)�”}”(hjÀh]”hŒ5Overlay planes must be in ARGB8888 or XRGB8888 format”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KIhj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhj»h²hh³hÊh´Nubhû)�”}”(hŒAPlanes cannot be placed outside of the CRTC destination rectangle”h]”hÒ)�”}”(hj×h]”hŒAPlanes cannot be placed outside of the CRTC destination rectangle”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KJhjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1húhj»h²hh³hÊh´Nubhû)�”}”(hŒAPlanes cannot be downscaled more than 1/4x of their original size”h]”hÒ)�”}”(hjîh]”hŒAPlanes cannot be downscaled more than 1/4x of their original size”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KKhjìubah}”(h]”h ]”h"]”h$]”h&]”uh1húhj»h²hh³hÊh´Nubhû)�”}”(hŒ?Planes cannot be upscaled more than 16x of their original size ”h]”hÒ)�”}”(hŒ>Planes cannot be upscaled more than 16x of their original size”h]”hŒ>Planes cannot be upscaled more than 16x of their original size”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KLhjubah}”(h]”h ]”h"]”h$]”h&]”uh1húhj»h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´KIhjŽh²hubhÒ)�”}”(hŒ/Not every property is available on every plane:”h]”hŒ/Not every property is available on every plane:”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KNhjŽh²hubhö)�”}”(hhh]”(hû)�”}”(hŒ?Only primary planes have color-space and non-RGB format support”h]”hÒ)�”}”(hj4h]”hŒ?Only primary planes have color-space and non-RGB format support”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KPhj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhj/h²hh³hÊh´Nubhû)�”}”(hŒ0Only overlay planes have alpha blending support ”h]”hÒ)�”}”(hŒ/Only overlay planes have alpha blending support”h]”hŒ/Only overlay planes have alpha blending support”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KQhjIubah}”(h]”h ]”h"]”h$]”h&]”uh1húhj/h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´KPhjŽh²hubeh}”(h]”Œplane-restrictions”ah ]”h"]”Œplane restrictions”ah$]”h&]”uh1hµhh·h²hh³hÊh´KBubh¶)�”}”(hhh]”(h»)�”}”(hŒCursor Restrictions”h]”hŒCursor Restrictions”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjoh²hh³hÊh´KTubhÒ)�”}”(hŒYBefore we start to describe some restrictions around cursor and MPO, see the below image:”h]”hŒYBefore we start to describe some restrictions around cursor and MPO, see the below image:”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KVhjoh²hubŒkfigure”Œ kernel_figure”“”)�”}”(hhh]”hŒfigure”“”)�”}”(hhh]”hŒimage”“”)�”}”(hŒ".. kernel-figure:: mpo-cursor.svg ”h]”h}”(h]”h ]”h"]”h$]”h&]”Œuri”Œ!gpu/amdgpu/display/mpo-cursor.svg”Œ candidates”}”j3j¦suh1j™hj–h³hÊh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�hjoh²hh³hÊh´KZubhÒ)�”}”(hXwThe image on the left side represents how DRM expects the cursor and planes to be blended. However, AMD hardware handles cursors differently, as you can see on the right side; basically, our cursor cannot be drawn outside its associated plane as it is being treated as part of the plane. Another consequence of that is that cursors inherit the color and scale from the plane.”h]”hXwThe image on the left side represents how DRM expects the cursor and planes to be blended. However, AMD hardware handles cursors differently, as you can see on the right side; basically, our cursor cannot be drawn outside its associated plane as it is being treated as part of the plane. Another consequence of that is that cursors inherit the color and scale from the plane.”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K[hjoh²hubhÒ)�”}”(hŒžAs a result of the above behavior, do not use legacy API to set up the cursor plane when working with MPO; otherwise, you might encounter unexpected behavior.”h]”hŒžAs a result of the above behavior, do not use legacy API to set up the cursor plane when working with MPO; otherwise, you might encounter unexpected behavior.”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kahjoh²hubhÒ)�”}”(hŒ¤In short, AMD HW has no dedicated cursor planes. A cursor is attached to another plane and therefore inherits any scaling or color processing from its parent plane.”h]”hŒ¤In short, AMD HW has no dedicated cursor planes. A cursor is attached to another plane and therefore inherits any scaling or color processing from its parent plane.”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kehjoh²hubeh}”(h]”Œcursor-restrictions”ah ]”h"]”Œcursor restrictions”ah$]”h&]”uh1hµhh·h²hh³hÊh´KTubh¶)�”}”(hhh]”(h»)�”}”(hŒ Use Cases”h]”hŒ Use Cases”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjçh²hh³hÊh´Kjubh¶)�”}”(hhh]”(h»)�”}”(hŒ5Picture-in-Picture (PIP) playback - Underlay strategy”h]”hŒ5Picture-in-Picture (PIP) playback - Underlay strategy”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjøh²hh³hÊh´KmubhÒ)�”}”(hŒsVideo playback should be done using the "primary plane as underlay" MPO strategy. This is a 2 planes configuration:”h]”hŒwVideo playback should be done using the “primary plane as underlayâ€� MPO strategy. This is a 2 planes configuration:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kohjøh²hubhö)�”}”(hhh]”(hû)�”}”(hŒ)1 YUV DRM Primary Plane (e.g. NV12 Video)”h]”hÒ)�”}”(hjh]”hŒ)1 YUV DRM Primary Plane (e.g. NV12 Video)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Krhjubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjh²hh³hÊh´Nubhû)�”}”(hX1 RGBA DRM Overlay Plane (e.g. ARGB8888 desktop). The compositor should prepare the framebuffers for the planes as follows: - The overlay plane contains general desktop UI, video player controls, and video subtitles - Primary plane contains one or more videos ”h]”hÒ)�”}”(hX1 RGBA DRM Overlay Plane (e.g. ARGB8888 desktop). The compositor should prepare the framebuffers for the planes as follows: - The overlay plane contains general desktop UI, video player controls, and video subtitles - Primary plane contains one or more videos”h]”hX1 RGBA DRM Overlay Plane (e.g. ARGB8888 desktop). The compositor should prepare the framebuffers for the planes as follows: - The overlay plane contains general desktop UI, video player controls, and video subtitles - Primary plane contains one or more videos”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kshj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´Krhjøh²hubhÌ)�”}”(hŒÄKeep in mind that we could extend this configuration to more planes, but that is currently not supported by our driver yet (maybe if we have a userspace request in the future, we can change that).”h]”hÒ)�”}”(hŒÄKeep in mind that we could extend this configuration to more planes, but that is currently not supported by our driver yet (maybe if we have a userspace request in the future, we can change that).”h]”hŒÄKeep in mind that we could extend this configuration to more planes, but that is currently not supported by our driver yet (maybe if we have a userspace request in the future, we can change that).”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KxhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhjøh²hh³hÊh´NubhÒ)�”}”(hŒ!See below a single-video example:”h]”hŒ!See below a single-video example:”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K|hjøh²hubj�)�”}”(hhh]”j•)�”}”(hhh]”jš)�”}”(hŒ*.. kernel-figure:: single-display-mpo.svg ”h]”h}”(h]”h ]”h"]”h$]”h&]”Œuri”Œ)gpu/amdgpu/display/single-display-mpo.svg”j§}”j3j†suh1j™hjxh³hÊh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjuubah}”(h]”h ]”h"]”h$]”h&]”uh1j�hjøh²hh³hÊh´KubhÌ)�”}”(hŒ`We could extend this behavior to more planes, but that is currently not supported by our driver.”h]”hÒ)�”}”(hŒ`We could extend this behavior to more planes, but that is currently not supported by our driver.”h]”hŒ`We could extend this behavior to more planes, but that is currently not supported by our driver.”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K€hj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhjøh²hh³hÊh´NubhÒ)�”}”(hX"The video buffer should be used directly for the primary plane. The video can be scaled and positioned for the desktop using the properties: CRTC_X, CRTC_Y, CRTC_W, and CRTC_H. The primary plane should also have the color encoding and color range properties set based on the source content:”h]”hX"The video buffer should be used directly for the primary plane. The video can be scaled and positioned for the desktop using the properties: CRTC_X, CRTC_Y, CRTC_W, and CRTC_H. The primary plane should also have the color encoding and color range properties set based on the source content:”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kƒhjøh²hubhö)�”}”(hhh]”hû)�”}”(hŒ$``COLOR_RANGE``, ``COLOR_ENCODING`` ”h]”hÒ)�”}”(hŒ#``COLOR_RANGE``, ``COLOR_ENCODING``”h]”(j~)�”}”(hŒ``COLOR_RANGE``”h]”hŒ COLOR_RANGE”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjÁubhŒ, ”…”�”}”(hjÁh²hh³Nh´Nubj~)�”}”(hŒ``COLOR_ENCODING``”h]”hŒCOLOR_ENCODING”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjÁubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kˆhj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjºh²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´Kˆhjøh²hubhÒ)�”}”(hXyThe overlay plane should be the native size of the CRTC. The compositor must draw a transparent cutout for where the video should be placed on the desktop (i.e., set the alpha to zero). The primary plane video will be visible through the underlay. The overlay plane's buffer may remain static while the primary plane's framebuffer is used for standard double-buffered playback.”h]”hX}The overlay plane should be the native size of the CRTC. The compositor must draw a transparent cutout for where the video should be placed on the desktop (i.e., set the alpha to zero). The primary plane video will be visible through the underlay. The overlay plane’s buffer may remain static while the primary plane’s framebuffer is used for standard double-buffered playback.”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KŠhjøh²hubhÒ)�”}”(hX©The compositor should create a YUV buffer matching the native size of the CRTC. Each video buffer should be composited onto this YUV buffer for direct YUV scanout. The primary plane should have the color encoding and color range properties set based on the source content: ``COLOR_RANGE``, ``COLOR_ENCODING``. However, be mindful that the source color space and encoding match for each video since it affect the entire plane.”h]”(hXThe compositor should create a YUV buffer matching the native size of the CRTC. Each video buffer should be composited onto this YUV buffer for direct YUV scanout. The primary plane should have the color encoding and color range properties set based on the source content: ”…”�”}”(hjh²hh³Nh´Nubj~)�”}”(hŒ``COLOR_RANGE``”h]”hŒ COLOR_RANGE”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjubhŒ, ”…”�”}”(hjh²hh³Nh´Nubj~)�”}”(hŒ``COLOR_ENCODING``”h]”hŒCOLOR_ENCODING”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjubhŒu. However, be mindful that the source color space and encoding match for each video since it affect the entire plane.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K�hjøh²hubhÒ)�”}”(hXxThe overlay plane should be the native size of the CRTC. The compositor must draw a transparent cutout for where each video should be placed on the desktop (i.e., set the alpha to zero). The primary plane videos will be visible through the underlay. The overlay plane's buffer may remain static while compositing operations for video playback will be done on the video buffer.”h]”hXzThe overlay plane should be the native size of the CRTC. The compositor must draw a transparent cutout for where each video should be placed on the desktop (i.e., set the alpha to zero). The primary plane videos will be visible through the underlay. The overlay plane’s buffer may remain static while compositing operations for video playback will be done on the video buffer.”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K—hjøh²hubhÒ)�”}”(hŒÔThis kernel interface is validated using IGT GPU Tools. The following tests can be run to validate positioning, blending, scaling under a variety of sequences and interactions with operations such as DPMS and S3:”h]”hŒÔThis kernel interface is validated using IGT GPU Tools. The following tests can be run to validate positioning, blending, scaling under a variety of sequences and interactions with operations such as DPMS and S3:”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K�hjøh²hubhö)�”}”(hhh]”(hû)�”}”(hŒ6``kms_plane@plane-panning-bottom-right-pipe-*-planes``”h]”hÒ)�”}”(hjXh]”j~)�”}”(hjXh]”hŒ2kms_plane@plane-panning-bottom-right-pipe-*-planes”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K¡hjVubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ8``kms_plane@plane-panning-bottom-right-suspend-pipe-*-``”h]”hÒ)�”}”(hjxh]”j~)�”}”(hjxh]”hŒ4kms_plane@plane-panning-bottom-right-suspend-pipe-*-”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K¢hjvubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ,``kms_plane@plane-panning-top-left-pipe-*-``”h]”hÒ)�”}”(hj˜h]”j~)�”}”(hj˜h]”hŒ(kms_plane@plane-panning-top-left-pipe-*-”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjšubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K£hj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ,``kms_plane@plane-position-covered-pipe-*-``”h]”hÒ)�”}”(hj¸h]”j~)�”}”(hj¸h]”hŒ(kms_plane@plane-position-covered-pipe-*-”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjºubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K¤hj¶ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ.``kms_plane@plane-position-hole-dpms-pipe-*-``”h]”hÒ)�”}”(hjØh]”j~)�”}”(hjØh]”hŒ*kms_plane@plane-position-hole-dpms-pipe-*-”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K¥hjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ)``kms_plane@plane-position-hole-pipe-*-``”h]”hÒ)�”}”(hjøh]”j~)�”}”(hjøh]”hŒ%kms_plane@plane-position-hole-pipe-*-”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjúubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K¦hjöubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ,``kms_plane_multiple@atomic-pipe-*-tiling-``”h]”hÒ)�”}”(hjh]”j~)�”}”(hjh]”hŒ(kms_plane_multiple@atomic-pipe-*-tiling-”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K§hjubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ*``kms_plane_scaling@pipe-*-plane-scaling``”h]”hÒ)�”}”(hj8h]”j~)�”}”(hj8h]”hŒ&kms_plane_scaling@pipe-*-plane-scaling”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K¨hj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ,``kms_plane_alpha_blend@pipe-*-alpha-basic``”h]”hÒ)�”}”(hjXh]”j~)�”}”(hjXh]”hŒ(kms_plane_alpha_blend@pipe-*-alpha-basic”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K©hjVubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ5``kms_plane_alpha_blend@pipe-*-alpha-transparant-fb``”h]”hÒ)�”}”(hjxh]”j~)�”}”(hjxh]”hŒ1kms_plane_alpha_blend@pipe-*-alpha-transparant-fb”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kªhjvubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ0``kms_plane_alpha_blend@pipe-*-alpha-opaque-fb``”h]”hÒ)�”}”(hj˜h]”j~)�”}”(hj˜h]”hŒ,kms_plane_alpha_blend@pipe-*-alpha-opaque-fb”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjšubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K«hj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ3``kms_plane_alpha_blend@pipe-*-constant-alpha-min``”h]”hÒ)�”}”(hj¸h]”j~)�”}”(hj¸h]”hŒ/kms_plane_alpha_blend@pipe-*-constant-alpha-min”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjºubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K¬hj¶ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ3``kms_plane_alpha_blend@pipe-*-constant-alpha-mid``”h]”hÒ)�”}”(hjØh]”j~)�”}”(hjØh]”hŒ/kms_plane_alpha_blend@pipe-*-constant-alpha-mid”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K­hjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubhû)�”}”(hŒ4``kms_plane_alpha_blend@pipe-*-constant-alpha-max`` ”h]”hÒ)�”}”(hŒ3``kms_plane_alpha_blend@pipe-*-constant-alpha-max``”h]”j~)�”}”(hjüh]”hŒ/kms_plane_alpha_blend@pipe-*-constant-alpha-max”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjúubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K®hjöubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjSh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j2Œ-”uh1hõh³hÊh´K¡hjøh²hubeh}”(h]”Œ1picture-in-picture-pip-playback-underlay-strategy”ah ]”h"]”Œ5picture-in-picture (pip) playback - underlay strategy”ah$]”h&]”uh1hµhjçh²hh³hÊh´Kmubh¶)�”}”(hhh]”(h»)�”}”(hŒMultiple Display MPO”h]”hŒMultiple Display MPO”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj&h²hh³hÊh´K±ubhÒ)�”}”(hXJAMDGPU supports display MPO when using multiple displays; however, this feature behavior heavily relies on the compositor implementation. Keep in mind that userspace can define different policies. For example, some OSes can use MPO to protect the plane that handles the video playback; notice that we don't have many limitations for a single display. Nonetheless, this manipulation can have many more restrictions for a multi-display scenario. The below example shows a video playback in the middle of two displays, and it is up to the compositor to define a policy on how to handle it:”h]”hXLAMDGPU supports display MPO when using multiple displays; however, this feature behavior heavily relies on the compositor implementation. Keep in mind that userspace can define different policies. For example, some OSes can use MPO to protect the plane that handles the video playback; notice that we don’t have many limitations for a single display. Nonetheless, this manipulation can have many more restrictions for a multi-display scenario. The below example shows a video playback in the middle of two displays, and it is up to the compositor to define a policy on how to handle it:”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K³hj&h²hubj�)�”}”(hhh]”j•)�”}”(hhh]”jš)�”}”(hŒ... kernel-figure:: multi-display-hdcp-mpo.svg ”h]”h}”(h]”h ]”h"]”h$]”h&]”Œuri”Œ-gpu/amdgpu/display/multi-display-hdcp-mpo.svg”j§}”j3jVsuh1j™hjHh³hÊh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjEubah}”(h]”h ]”h"]”h$]”h&]”uh1j�hj&h²hh³hÊh´K½ubhÒ)�”}”(hŒ`Let's discuss some of the hardware limitations we have when dealing with multi-display with MPO.”h]”hŒbLet’s discuss some of the hardware limitations we have when dealing with multi-display with MPO.”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´K¾hj&h²hubh¶)�”}”(hhh]”(h»)�”}”(hŒ Limitations”h]”hŒ Limitations”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjrh²hh³hÊh´KÂubhÒ)�”}”(hŒÁFor simplicity's sake, for discussing the hardware limitation, this documentation supposes an example where we have two displays and video playback that will be moved around different displays.”h]”hŒÃFor simplicity’s sake, for discussing the hardware limitation, this documentation supposes an example where we have two displays and video playback that will be moved around different displays.”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÄhjrh²hubhö)�”}”(hhh]”hû)�”}”(hŒ**Hardware limitations** ”h]”hÒ)�”}”(hŒ**Hardware limitations**”h]”hŒstrong”“”)�”}”(hjšh]”hŒHardware limitations”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jœhj˜ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÈhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhj‘h²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´KÈhjrh²hubhÒ)�”}”(hŒõFrom the DCN overview page, each display requires at least one pipe and each MPO plane needs another pipe. As a result, when the video is in the middle of the two displays, we need to use 2 pipes. See the example below where we avoid pipe split:”h]”hŒõFrom the DCN overview page, each display requires at least one pipe and each MPO plane needs another pipe. As a result, when the video is in the middle of the two displays, we need to use 2 pipes. See the example below where we avoid pipe split:”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÊhjrh²hubhö)�”}”(hhh]”(hû)�”}”(hŒ81 display (1 pipe) + MPO (1 pipe), we will use two pipes”h]”hÒ)�”}”(hjÐh]”hŒ81 display (1 pipe) + MPO (1 pipe), we will use two pipes”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÏhjÎubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjËh²hh³hÊh´Nubhû)�”}”(hŒn2 displays (2 pipes) + MPO (1-2 pipes); we will use 4 pipes. MPO in the middle of both displays needs 2 pipes.”h]”hÒ)�”}”(hŒn2 displays (2 pipes) + MPO (1-2 pipes); we will use 4 pipes. MPO in the middle of both displays needs 2 pipes.”h]”hŒn2 displays (2 pipes) + MPO (1-2 pipes); we will use 4 pipes. MPO in the middle of both displays needs 2 pipes.”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÐhjåubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjËh²hh³hÊh´Nubhû)�”}”(hŒ93 Displays (3 pipes) + MPO (1-2 pipes), we need 5 pipes. ”h]”hÒ)�”}”(hŒ83 Displays (3 pipes) + MPO (1-2 pipes), we need 5 pipes.”h]”hŒ83 Displays (3 pipes) + MPO (1-2 pipes), we need 5 pipes.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÒhjýubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjËh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j2juh1hõh³hÊh´KÏhjrh²hubhÒ)�”}”(hŒîIf we use MPO with multiple displays, the userspace has to decide to enable multiple MPO by the price of limiting the number of external displays supported or disable it in favor of multiple displays; it is a policy decision. For example:”h]”hŒîIf we use MPO with multiple displays, the userspace has to decide to enable multiple MPO by the price of limiting the number of external displays supported or disable it in favor of multiple displays; it is a policy decision. For example:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÔhjrh²hubhö)�”}”(hhh]”(hû)�”}”(hŒGWhen ASIC has 3 pipes, AMD hardware can NOT support 2 displays with MPO”h]”hÒ)�”}”(hj.h]”hŒGWhen ASIC has 3 pipes, AMD hardware can NOT support 2 displays with MPO”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÙhj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhj)h²hh³hÊh´Nubhû)�”}”(hŒHWhen ASIC has 4 pipes, AMD hardware can NOT support 3 displays with MPO ”h]”hÒ)�”}”(hŒGWhen ASIC has 4 pipes, AMD hardware can NOT support 3 displays with MPO”h]”hŒGWhen ASIC has 4 pipes, AMD hardware can NOT support 3 displays with MPO”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÚhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1húhj)h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´KÙhjrh²hubhÒ)�”}”(hŒ‡Let's briefly explore how userspace can handle these two display configurations on an ASIC that only supports three pipes. We can have:”h]”hŒ‰Let’s briefly explore how userspace can handle these two display configurations on an ASIC that only supports three pipes. We can have:”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KÜhjrh²hubj�)�”}”(hhh]”j•)�”}”(hhh]”jš)�”}”(hŒ;.. kernel-figure:: multi-display-hdcp-mpo-less-pipe-ex.svg ”h]”h}”(h]”h ]”h"]”h$]”h&]”Œuri”Œ:gpu/amdgpu/display/multi-display-hdcp-mpo-less-pipe-ex.svg”j§}”j3j€suh1j™hjrh³hÊh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjoubah}”(h]”h ]”h"]”h$]”h&]”uh1j�hjrh²hh³hÊh´Kàubhö)�”}”(hhh]”(hû)�”}”(hŒTotal pipes are 3”h]”hÒ)�”}”(hj“h]”hŒTotal pipes are 3”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Káhj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjŽh²hh³hÊh´Nubhû)�”}”(hŒ5User lights up 2 displays (2 out of 3 pipes are used)”h]”hÒ)�”}”(hjªh]”hŒ5User lights up 2 displays (2 out of 3 pipes are used)”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kâhj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjŽh²hh³hÊh´Nubhû)�”}”(hŒ)User launches video (1 pipe used for MPO)”h]”hÒ)�”}”(hjÁh]”hŒ)User launches video (1 pipe used for MPO)”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kãhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjŽh²hh³hÊh´Nubhû)�”}”(hŒNow, if the user moves the video in the middle of 2 displays, one part of the video won't be MPO since we have used 3/3 pipes. ”h]”hÒ)�”}”(hŒ~Now, if the user moves the video in the middle of 2 displays, one part of the video won't be MPO since we have used 3/3 pipes.”h]”hŒ€Now, if the user moves the video in the middle of 2 displays, one part of the video won’t be MPO since we have used 3/3 pipes.”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KähjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjŽh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j2juh1hõh³hÊh´Káhjrh²hubhö)�”}”(hhh]”hû)�”}”(hŒ**Scaling limitation** ”h]”hÒ)�”}”(hŒ**Scaling limitation**”h]”j�)�”}”(hjýh]”hŒScaling limitation”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jœhjûubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kçhj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjôh²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´Kçhjrh²hubhÒ)�”}”(hŒHMPO cannot handle scaling less than 0.25 and more than x16. For example:”h]”hŒHMPO cannot handle scaling less than 0.25 and more than x16. For example:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kéhjrh²hubhÒ)�”}”(hŒvIf 4k video (3840x2160) is playing in windowed mode, the physical size of the window cannot be smaller than (960x540).”h]”hŒvIf 4k video (3840x2160) is playing in windowed mode, the physical size of the window cannot be smaller than (960x540).”…”�”}”(hj, h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Këhjrh²hubhÌ)�”}”(hŒ7These scaling limitations might vary from ASIC to ASIC.”h]”hÒ)�”}”(hj< h]”hŒ7These scaling limitations might vary from ASIC to ASIC.”…”�”}”(hj> h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kîhj: ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhjrh²hh³hÊh´Nubhö)�”}”(hhh]”hû)�”}”(hŒ**Size Limitation** ”h]”hÒ)�”}”(hŒ**Size Limitation**”h]”j�)�”}”(hjZ h]”hŒSize Limitation”…”�”}”(hj\ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jœhjX ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´KðhjT ubah}”(h]”h ]”h"]”h$]”h&]”uh1húhjQ h²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”j2j3uh1hõh³hÊh´Kðhjrh²hubhÒ)�”}”(hŒThe minimum MPO size is 12px.”h]”hŒThe minimum MPO size is 12px.”…”�”}”(hj{ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑh³hÊh´Kòhjrh²hubeh}”(h]”Œ limitations”ah ]”h"]”Œ limitations”ah$]”h&]”uh1hµhj&h²hh³hÊh´KÂubeh}”(h]”Œmultiple-display-mpo”ah ]”h"]”Œmultiple display mpo”ah$]”h&]”uh1hµhjçh²hh³hÊh´K±ubeh}”(h]”Œ use-cases”ah ]”h"]”Œ use cases”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kjubeh}”(h]”Œmultiplane-overlay-mpo”ah ]”h"]”Œmultiplane overlay (mpo)”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jÌ Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j¦ j£ jljijäjájž j› j#j j– j“ jŽ j‹ uŒ nametypes”}”(j¦ ‰jl‰jä‰jž ‰j#‰j– ‰jŽ ‰uh}”(j£ h·jijŽjájoj› jçj jøj“ j&j‹ jruŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.