diff --git a/test/testffmpeg.c b/test/testffmpeg.c index 4c3ef85b9..cad60bfb7 100644 --- a/test/testffmpeg.c +++ b/test/testffmpeg.c @@ -73,6 +73,7 @@ static SDL_bool software_only; static SDL_bool has_eglCreateImage; #ifdef HAVE_EGL static SDL_bool has_EGL_EXT_image_dma_buf_import; +static SDL_bool has_EGL_EXT_image_dma_buf_import_modifiers; static PFNGLACTIVETEXTUREARBPROC glActiveTextureARBFunc; static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOESFunc; #endif @@ -137,11 +138,32 @@ static SDL_bool CreateWindowAndRenderer(Uint32 window_flags, const char *driver) #ifdef HAVE_EGL if (useEGL) { - const char *extensions = eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS); - if (SDL_strstr(extensions, "EGL_EXT_image_dma_buf_import") != NULL) { - has_EGL_EXT_image_dma_buf_import = SDL_TRUE; + const char *egl_extensions = eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS); + if (!egl_extensions) { + return SDL_FALSE; } + char *extensions = SDL_strdup(egl_extensions); + if (!extensions) { + return SDL_FALSE; + } + + char *saveptr, *token; + token = SDL_strtok_r(extensions, " ", &saveptr); + if (!token) { + free(extensions); + return SDL_FALSE; + } + do { + if (SDL_strcmp(token, "EGL_EXT_image_dma_buf_import") == 0) { + has_EGL_EXT_image_dma_buf_import = SDL_TRUE; + } else if (SDL_strcmp(token, "EGL_EXT_image_dma_buf_import_modifiers") == 0) { + has_EGL_EXT_image_dma_buf_import_modifiers = SDL_TRUE; + } + } while ((token = SDL_strtok_r(NULL, " ", &saveptr)) != NULL); + + free(extensions); + if (SDL_GL_ExtensionSupported("GL_OES_EGL_image")) { glEGLImageTargetTexture2DOESFunc = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress("glEGLImageTargetTexture2DOES"); } @@ -609,16 +631,39 @@ static SDL_bool GetTextureForDRMFrame(AVFrame *frame, SDL_Texture **texture) static const uint32_t formats[ 2 ] = { DRM_FORMAT_R8, DRM_FORMAT_GR88 }; const AVDRMPlaneDescriptor *plane = &layer->planes[j]; const AVDRMObjectDescriptor *object = &desc->objects[plane->object_index]; - EGLAttrib img_attr[] = { - EGL_LINUX_DRM_FOURCC_EXT, formats[i], - EGL_WIDTH, frame->width / ( image_index + 1 ), /* half size for chroma */ - EGL_HEIGHT, frame->height / ( image_index + 1 ), - EGL_DMA_BUF_PLANE0_FD_EXT, object->fd, - EGL_DMA_BUF_PLANE0_OFFSET_EXT, plane->offset, - EGL_DMA_BUF_PLANE0_PITCH_EXT, plane->pitch, - EGL_NONE - }; - EGLImage pImage = eglCreateImage(display, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, img_attr); + + EGLAttrib attr[32]; + size_t k = 0; + + attr[k++] = EGL_LINUX_DRM_FOURCC_EXT; + attr[k++] = formats[i]; + + attr[k++] = EGL_WIDTH; + attr[k++] = frame->width / ( image_index + 1 ); /* half size for chroma */ + + attr[k++] = EGL_HEIGHT; + attr[k++] = frame->height / ( image_index + 1 ); + + attr[k++] = EGL_DMA_BUF_PLANE0_FD_EXT; + attr[k++] = object->fd; + + attr[k++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT; + attr[k++] = plane->offset; + + attr[k++] = EGL_DMA_BUF_PLANE0_PITCH_EXT; + attr[k++] = plane->pitch; + + if (has_EGL_EXT_image_dma_buf_import_modifiers) { + attr[k++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT; + attr[k++] = (object->format_modifier >> 0) & 0xFFFFFFFF; + + attr[k++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT; + attr[k++] = (object->format_modifier >> 32) & 0xFFFFFFFF; + } + + attr[k++] = EGL_NONE; + + EGLImage pImage = eglCreateImage(display, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, attr); glActiveTextureARBFunc(GL_TEXTURE0_ARB + image_index); glBindTexture(GL_TEXTURE_2D, textures[image_index]);