return NULL;
}
- dri_image =
- dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
- attrs.Width,
- attrs.Height,
- format,
- name,
- pitch,
- NULL);
+ if (dri2_dpy->image->base.version >= 18) {
+ unsigned use = 0;
+
+ if (attrs.ImageFlushExternal)
+ use |= __DRI_IMAGE_USE_FLUSH_EXTERNAL;
+
+ dri_image =
+ dri2_dpy->image->createImageFromName2(dri2_dpy->dri_screen,
+ attrs.Width, attrs.Height,
+ format, name, pitch, use,
+ NULL);
+ } else {
+ dri_image =
+ dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
+ attrs.Width,
+ attrs.Height,
+ format,
+ name,
+ pitch,
+ NULL);
+ }
return dri2_create_image_from_dri(disp, dri_image);
}
has_modifier = true;
}
- if (has_modifier) {
+ if (dri2_dpy->image->base.version >= 18) {
+ unsigned use = 0;
+
+ if (attrs.ImageFlushExternal)
+ use |= __DRI_IMAGE_USE_FLUSH_EXTERNAL;
+
+ if (!has_modifier)
+ modifier = DRM_FORMAT_MOD_INVALID;
+
+ dri_image =
+ dri2_dpy->image->createImageFromDmaBufs3(dri2_dpy->dri_screen,
+ attrs.Width, attrs.Height, attrs.DMABufFourCC.Value,
+ modifier, use, fds, num_fds, pitches, offsets,
+ attrs.DMABufYuvColorSpaceHint.Value,
+ attrs.DMABufSampleRangeHint.Value,
+ attrs.DMABufChromaHorizontalSiting.Value,
+ attrs.DMABufChromaVerticalSiting.Value,
+ &error,
+ NULL);
+ } else if (has_modifier) {
if (dri2_dpy->image->base.version < 15 ||
dri2_dpy->image->createImageFromDmaBufs2 == NULL) {
_eglError(EGL_BAD_MATCH, "unsupported dma_buf format modifier");
attrs.DMABufChromaVerticalSiting.Value,
&error,
NULL);
- }
- else {
+ } else {
dri_image =
dri2_dpy->image->createImageFromDmaBufs(dri2_dpy->dri_screen,
attrs.Width, attrs.Height, attrs.DMABufFourCC.Value,
dri_use |= __DRI_IMAGE_USE_SCANOUT;
if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_CURSOR_MESA)
dri_use |= __DRI_IMAGE_USE_CURSOR;
+ if (attrs.ImageFlushExternal)
+ dri_use |= __DRI_IMAGE_USE_FLUSH_EXTERNAL;
dri2_img = malloc(sizeof *dri2_img);
if (!dri2_img) {
return EGL_SUCCESS;
}
+static EGLint
+_eglParseEXTImageFlushExternalAttribs(_EGLImageAttribs *attrs,
+ _EGLDisplay *disp,
+ EGLint attr, EGLint val)
+{
+ if (!disp->Extensions.EXT_image_flush_external)
+ return EGL_BAD_PARAMETER;
+
+ switch (attr) {
+ case EGL_IMAGE_EXTERNAL_FLUSH_EXT:
+ attrs->ImageFlushExternal = val;
+ break;
+ default:
+ return EGL_BAD_PARAMETER;
+ }
+
+ return EGL_SUCCESS;
+}
+
/**
* Parse the list of image attributes.
*
EGLint attr = attrib_list[i++];
EGLint val = attrib_list[i];
+ err = _eglParseEXTImageFlushExternalAttribs(attrs, disp, attr, val);
+ if (err == EGL_SUCCESS)
+ continue;
+
err = _eglParseKHRImageAttribs(attrs, disp, attr, val);
if (err == EGL_SUCCESS)
continue;