Correctly passthrough plane format and modifiers when importing VA surface

This commit is contained in:
Cameron Gutman
2024-01-02 21:33:14 -06:00
parent 52e5662dd9
commit beb51cc925
2 changed files with 17 additions and 13 deletions

View File

@@ -560,21 +560,25 @@ namespace egl {
std::optional<nv12_t> std::optional<nv12_t>
import_target(display_t::pointer egl_display, std::array<file_t, nv12_img_t::num_fds> &&fds, const surface_descriptor_t &r8, const surface_descriptor_t &gr88) { import_target(display_t::pointer egl_display, std::array<file_t, nv12_img_t::num_fds> &&fds, const surface_descriptor_t &r8, const surface_descriptor_t &gr88) {
EGLAttrib img_attr_planes[2][13] { EGLAttrib img_attr_planes[2][17] {
{ EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_R8, { EGL_LINUX_DRM_FOURCC_EXT, r8.fourcc,
EGL_WIDTH, r8.width, EGL_WIDTH, r8.width,
EGL_HEIGHT, r8.height, EGL_HEIGHT, r8.height,
EGL_DMA_BUF_PLANE0_FD_EXT, r8.fds[0], EGL_DMA_BUF_PLANE0_FD_EXT, r8.fds[0],
EGL_DMA_BUF_PLANE0_OFFSET_EXT, r8.offsets[0], EGL_DMA_BUF_PLANE0_OFFSET_EXT, r8.offsets[0],
EGL_DMA_BUF_PLANE0_PITCH_EXT, r8.pitches[0], EGL_DMA_BUF_PLANE0_PITCH_EXT, r8.pitches[0],
EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, (EGLAttrib) (r8.modifier & 0xFFFFFFFF),
EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT, (EGLAttrib) (r8.modifier >> 32),
EGL_NONE }, EGL_NONE },
{ EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_GR88, { EGL_LINUX_DRM_FOURCC_EXT, gr88.fourcc,
EGL_WIDTH, gr88.width, EGL_WIDTH, gr88.width,
EGL_HEIGHT, gr88.height, EGL_HEIGHT, gr88.height,
EGL_DMA_BUF_PLANE0_FD_EXT, r8.fds[0], EGL_DMA_BUF_PLANE0_FD_EXT, gr88.fds[0],
EGL_DMA_BUF_PLANE0_OFFSET_EXT, gr88.offsets[0], EGL_DMA_BUF_PLANE0_OFFSET_EXT, gr88.offsets[0],
EGL_DMA_BUF_PLANE0_PITCH_EXT, gr88.pitches[0], EGL_DMA_BUF_PLANE0_PITCH_EXT, gr88.pitches[0],
EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, (EGLAttrib) (gr88.modifier & 0xFFFFFFFF),
EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT, (EGLAttrib) (gr88.modifier >> 32),
EGL_NONE }, EGL_NONE },
}; };

View File

@@ -37,7 +37,7 @@ extern "C" struct AVBufferRef;
namespace va { namespace va {
constexpr auto SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2 = 0x40000000; constexpr auto SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2 = 0x40000000;
constexpr auto EXPORT_SURFACE_WRITE_ONLY = 0x0002; constexpr auto EXPORT_SURFACE_WRITE_ONLY = 0x0002;
constexpr auto EXPORT_SURFACE_COMPOSED_LAYERS = 0x0008; constexpr auto EXPORT_SURFACE_SEPARATE_LAYERS = 0x0004;
using VADisplay = void *; using VADisplay = void *;
using VAStatus = int; using VAStatus = int;
@@ -350,7 +350,7 @@ namespace va {
this->va_display, this->va_display,
surface, surface,
va::SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, va::SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
va::EXPORT_SURFACE_WRITE_ONLY | va::EXPORT_SURFACE_COMPOSED_LAYERS, va::EXPORT_SURFACE_WRITE_ONLY | va::EXPORT_SURFACE_SEPARATE_LAYERS,
&prime); &prime);
if (status) { if (status) {
BOOST_LOG(error) << "Couldn't export va surface handle: ["sv << (int) surface << "]: "sv << va::errorStr(status); BOOST_LOG(error) << "Couldn't export va surface handle: ["sv << (int) surface << "]: "sv << va::errorStr(status);
@@ -370,17 +370,17 @@ namespace va {
{ (int) prime.width, { (int) prime.width,
(int) prime.height, (int) prime.height,
{ prime.objects[prime.layers[0].object_index[0]].fd, -1, -1, -1 }, { prime.objects[prime.layers[0].object_index[0]].fd, -1, -1, -1 },
0, prime.layers[0].drm_format,
0, prime.objects[prime.layers[0].object_index[0]].drm_format_modifier,
{ prime.layers[0].pitch[0] }, { prime.layers[0].pitch[0] },
{ prime.layers[0].offset[0] } }, { prime.layers[0].offset[0] } },
{ (int) prime.width / 2, { (int) prime.width / 2,
(int) prime.height / 2, (int) prime.height / 2,
{ prime.objects[prime.layers[0].object_index[1]].fd, -1, -1, -1 }, { prime.objects[prime.layers[1].object_index[0]].fd, -1, -1, -1 },
0, prime.layers[1].drm_format,
0, prime.objects[prime.layers[1].object_index[0]].drm_format_modifier,
{ prime.layers[0].pitch[1] }, { prime.layers[1].pitch[0] },
{ prime.layers[0].offset[1] } }); { prime.layers[1].offset[0] } });
if (!nv12_opt) { if (!nv12_opt) {
return -1; return -1;