Skip to content
Commits on Source (9)
......@@ -2,12 +2,15 @@ add_subdirectory (egl-1.4)
add_subdirectory (egl_ext_client_extensions)
add_subdirectory (egl_ext_device_query)
add_subdirectory (egl_ext_device_enumeration)
add_subdirectory (egl_ext_device_drm)
add_subdirectory (egl_ext_platform_device)
add_subdirectory (egl_ext_image_dma_buf_import_modifiers)
add_subdirectory (egl_khr_create_context)
add_subdirectory (egl_khr_get_all_proc_addresses)
add_subdirectory (egl_khr_gl_image)
add_subdirectory (egl_khr_fence_sync)
add_subdirectory (egl_khr_surfaceless_context)
add_subdirectory (egl_mesa_device_software)
add_subdirectory (egl_mesa_platform_surfaceless)
if (PIGLIT_HAS_X11)
......
link_libraries(
piglitutil
)
piglit_add_executable(egl_ext_device_drm egl_ext_device_drm.c)
# vim: ft=cmake:
/*
* Copyright © 2016 Red Hat, Inc.
* Copyright 2015 Intel Corporation
* Copyright 2018 Collabora, Ltd.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include "piglit-util.h"
#include "piglit-util-egl.h"
#define NDEVS 1024
int
main(void)
{
EGLDisplay dpy1, dpy2, dpy3;
enum piglit_result result = PIGLIT_PASS;
EGLDeviceEXT devs[NDEVS];
EGLint i, numdevs, drmdevs;
EGLDeviceEXT device = EGL_NO_DEVICE_EXT;
EGLAttrib attr;
const char *devstring = NULL;
PFNEGLQUERYDEVICESEXTPROC queryDevices;
PFNEGLQUERYDISPLAYATTRIBEXTPROC queryDisplayAttrib;
PFNEGLQUERYDEVICESTRINGEXTPROC queryDeviceString;
PFNEGLQUERYDEVICEATTRIBEXTPROC queryDeviceAttrib;
PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay;
const char *client_exts = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
bool has_client_ext =
client_exts &&
((piglit_is_extension_in_string(client_exts,
"EGL_EXT_device_query") &&
piglit_is_extension_in_string(client_exts,
"EGL_EXT_device_enumeration")) ||
piglit_is_extension_in_string(client_exts,
"EGL_EXT_device_base"));
if (!has_client_ext) {
printf("EGL_EXT_device_query not supported\n");
piglit_report_result(PIGLIT_SKIP);
}
queryDevices = (void *)eglGetProcAddress("eglQueryDevicesEXT");
queryDisplayAttrib =
(void *)eglGetProcAddress("eglQueryDisplayAttribEXT");
queryDeviceString =
(void *)eglGetProcAddress("eglQueryDeviceStringEXT");
queryDeviceAttrib =
(void *)eglGetProcAddress("eglQueryDeviceAttribEXT");
if (!queryDevices||
!queryDisplayAttrib || !queryDeviceString || !queryDeviceAttrib) {
printf("No device query/enumeration entrypoints\n");
piglit_report_result(PIGLIT_SKIP);
}
bool has_platform_dev_ext =
client_exts &&
(piglit_is_extension_in_string(client_exts,
"EGL_EXT_platform_device"));
if (has_platform_dev_ext) {
getPlatformDisplay = (void *)eglGetProcAddress("eglGetPlatformDisplayEXT");
if (!getPlatformDisplay) {
has_platform_dev_ext = false;
printf("No platform display entrypoint\n");
result = PIGLIT_WARN;
}
}
if (!queryDevices(0, NULL, &numdevs)) {
printf("Failed to get device count\n");
piglit_report_result(PIGLIT_FAIL);
}
if (numdevs > NDEVS) {
printf("More than %d devices, please fix this test\n", NDEVS);
result = PIGLIT_WARN;
numdevs = NDEVS;
}
memset(devs, 0, sizeof devs);
if (!queryDevices(numdevs, devs, &numdevs)) {
printf("Failed to enumerate devices\n");
piglit_report_result(PIGLIT_FAIL);
}
if (!numdevs) {
printf("Zero devices enumerated\n");
piglit_report_result(PIGLIT_FAIL);
}
for (i = 0; i < numdevs; i++) {
device = devs[i];
devstring = queryDeviceString(device, EGL_EXTENSIONS);
if (devstring == NULL) {
printf("Empty device extension string\n");
result = PIGLIT_WARN;
continue;
}
if (!piglit_is_extension_in_string(devstring,
"EGL_EXT_device_drm")) {
printf("Device is not a DRM one\n");
continue;
}
drmdevs++;
/* Extension defines only a single string token. */
queryDeviceAttrib(device, 0xbad1dea, &attr);
if (!piglit_check_egl_error(EGL_BAD_ATTRIBUTE))
piglit_report_result(PIGLIT_FAIL);
#ifndef EGL_DRM_DEVICE_FILE_EXT
#define EGL_DRM_DEVICE_FILE_EXT 0x3233
#endif
devstring = queryDeviceString(device, EGL_DRM_DEVICE_FILE_EXT);
if (devstring == NULL)
piglit_report_result(PIGLIT_FAIL);
if (!has_platform_dev_ext)
continue;
dpy1 = getPlatformDisplay(EGL_PLATFORM_DEVICE_EXT,
device, NULL);
if (!dpy1) {
printf("failed to get EGLDisplay\n");
piglit_report_result(PIGLIT_FAIL);
}
if (!eglInitialize(dpy1, NULL, NULL)) {
printf("eglInitialize failed\n");
piglit_report_result(PIGLIT_FAIL);
}
int fd = open(devstring, O_RDWR | O_CLOEXEC);
if (fd < 0) {
printf("Failed to open drm device file %s: %s\n",
devstring, strerror(errno));
piglit_report_result(PIGLIT_FAIL);
}
#ifndef EGL_DRM_MASTER_FD_EXT
#define EGL_DRM_MASTER_FD_EXT 0x333C
#endif
const EGLint attr[] = { EGL_DRM_MASTER_FD_EXT, fd, EGL_NONE};
dpy2 = getPlatformDisplay(EGL_PLATFORM_DEVICE_EXT,
device, attr);
if (!dpy2) {
printf("failed to get EGLDisplay\n");
piglit_report_result(PIGLIT_FAIL);
}
/* From the spec.
*
* Calls to eglGetPlatformDeviceEXT() with the same values
* for <platform> and <native_display> but distinct
* EGL_DRM_MASTER_FD_EXT values will return separate EGLDisplays.
*/
if (dpy1 == dpy2) {
printf("failed to provide separate displays\n");
piglit_report_result(PIGLIT_FAIL);
}
dpy3 = getPlatformDisplay(EGL_PLATFORM_DEVICE_EXT,
device, attr);
if (!dpy3) {
printf("failed to get EGLDisplay\n");
piglit_report_result(PIGLIT_FAIL);
}
/* Do the inverse as well - identical EGLdisplay should be
* returned when the FD is the same.
*/
if (dpy2 != dpy3) {
printf("failed to provide identical displays\n");
piglit_report_result(PIGLIT_FAIL);
}
/* From the spec.
*
* If EGL requires the use of the DRM file descriptor
* beyond the duration of the call to eglGetPlatformDispay(),
* it will duplicate it.
*
* Close the fd for now, if needed by eglInitialize/others, the
* driver will dup it.
*/
close(fd);
if (!eglInitialize(dpy2, NULL, NULL)) {
printf("eglInitialize failed\n");
piglit_report_result(PIGLIT_FAIL);
}
device = EGL_NO_DEVICE_EXT;
if (!queryDisplayAttrib(dpy1, EGL_DEVICE_EXT, (EGLAttrib *)&device)) {
printf("Failed to query display\n");
piglit_report_result(PIGLIT_FAIL);
}
if (device != devs[i]) {
printf("Query display returns incorrect device\n");
piglit_report_result(PIGLIT_FAIL);
}
device = EGL_NO_DEVICE_EXT;
if (!queryDisplayAttrib(dpy2, EGL_DEVICE_EXT, (EGLAttrib *)&device)) {
printf("Failed to query display\n");
piglit_report_result(PIGLIT_FAIL);
}
if (device != devs[i]) {
printf("Query display returns incorrect device\n");
piglit_report_result(PIGLIT_FAIL);
}
eglTerminate(dpy2);
eglTerminate(dpy1);
}
/* SKIP if we fetched all devices with none supporting the extension */
if (result == PIGLIT_PASS && !drmdevs)
result = PIGLIT_SKIP;
piglit_report_result(result);
}
......@@ -79,6 +79,11 @@ main(void)
piglit_report_result(PIGLIT_FAIL);
}
if (!numdevs) {
printf("Zero devices enumerated\n");
piglit_report_result(PIGLIT_FAIL);
}
for (i = 0; i < numdevs; i++)
if (devs[i] == NULL) {
printf("Enumerated device slot not initialized\n");
......
......@@ -29,7 +29,6 @@ int
main(void)
{
EGLDisplay dpy;
EGLint egl_major, egl_minor;
EGLDeviceEXT device = EGL_NO_DEVICE_EXT;
EGLAttrib attr;
const char *devstring = NULL;
......@@ -65,46 +64,62 @@ main(void)
dpy = eglGetDisplay(NULL);
if (!dpy) {
printf("failed to get EGLDisplay\n");
piglit_report_result(PIGLIT_SKIP);
piglit_report_result(PIGLIT_WARN);
}
queryDisplayAttrib(dpy, EGL_DEVICE_EXT, (EGLAttrib *)&device);
if (!piglit_check_egl_error(EGL_NOT_INITIALIZED))
piglit_report_result(PIGLIT_FAIL);
if (!eglInitialize(dpy, &egl_major, &egl_minor)) {
if (!eglInitialize(dpy, NULL, NULL)) {
printf("eglInitialize failed\n");
piglit_report_result(PIGLIT_FAIL);
}
queryDisplayAttrib(dpy, 0xbad1dea, (EGLAttrib *)&device);
if (!piglit_check_egl_error(EGL_BAD_ATTRIBUTE))
if (!piglit_check_egl_error(EGL_BAD_ATTRIBUTE)) {
eglTerminate(dpy);
piglit_report_result(PIGLIT_FAIL);
}
if (!queryDisplayAttrib(dpy, EGL_DEVICE_EXT, (EGLAttrib *)&device)) {
printf("Failed to query display\n");
eglTerminate(dpy);
piglit_report_result(PIGLIT_FAIL);
}
if (device == EGL_NO_DEVICE_EXT) {
printf("Got no device handle\n");
eglTerminate(dpy);
piglit_report_result(PIGLIT_FAIL);
}
queryDeviceAttrib(device, 0xbad1dea, &attr);
if (!piglit_check_egl_error(EGL_BAD_ATTRIBUTE))
if (!piglit_check_egl_error(EGL_BAD_ATTRIBUTE)) {
eglTerminate(dpy);
piglit_report_result(PIGLIT_FAIL);
}
devstring = queryDeviceString(device, 0xbad1dea);
if (!piglit_check_egl_error(EGL_BAD_PARAMETER))
if (!piglit_check_egl_error(EGL_BAD_PARAMETER)) {
eglTerminate(dpy);
piglit_report_result(PIGLIT_FAIL);
}
devstring = queryDeviceString(EGL_NO_DEVICE_EXT, EGL_EXTENSIONS);
if (!piglit_check_egl_error(EGL_BAD_DEVICE_EXT)) {
eglTerminate(dpy);
piglit_report_result(PIGLIT_FAIL);
}
devstring = queryDeviceString(device, EGL_EXTENSIONS);
if (devstring == NULL) {
printf("Empty device extension string\n");
eglTerminate(dpy);
piglit_report_result(PIGLIT_WARN);
}
eglTerminate(dpy);
printf("Device extension string: %s\n", devstring);
piglit_report_result(PIGLIT_PASS);
}
link_libraries(
piglitutil
)
piglit_add_executable(egl_ext_platform_device egl_ext_platform_device.c)
# vim: ft=cmake:
/*
* Copyright 2018 Collabora, Ltd.
*
* Based on ext_mesa_platform_surfaceless.c which has
* Copyright 2016 Google
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/* Note that this test is a mere copy with the following changes:
* - s/MESA_platform_surfaceless/EXT_platform_device/g
* - entrypoint handling - eglQueryDeviceStringEXT, eglQueryDevicesEXT and eglGetPlatformDisplayEXT
* - custom GetDisplay, based on eglQueryDevicesEXT
* - couple of s/PIGLIT_SKIP/PIGLIT_FAIL/
*/
#include "piglit-util.h"
#include "piglit-util-egl.h"
/* Extension function pointers.
*
* Use prefix 'pegl' (piglit egl) instead of 'egl' to avoid collisions with
* prototypes in eglext.h. */
EGLSurface (*peglCreatePlatformPixmapSurfaceEXT)(EGLDisplay display, EGLConfig config,
void *native_pixmap, const EGLint *attrib_list);
EGLSurface (*peglCreatePlatformWindowSurfaceEXT)(EGLDisplay display, EGLConfig config,
void *native_window, const EGLint *attrib_list);
const char *(*peglQueryDeviceStringEXT)(EGLDeviceEXT device, EGLint name);
EGLBoolean (*peglQueryDevicesEXT)(EGLint max_devices, EGLDeviceEXT *devices,
EGLint *num_devices);
EGLDisplay (*peglGetPlatformDisplayEXT)(EGLenum platform, void *native_display,
const EGLint *attrib_list);
static void
init_egl_extension_funcs(void)
{
peglCreatePlatformPixmapSurfaceEXT = (void*)
eglGetProcAddress("eglCreatePlatformPixmapSurfaceEXT");
peglCreatePlatformWindowSurfaceEXT = (void*)
eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
peglQueryDeviceStringEXT = (void *)eglGetProcAddress("eglQueryDeviceStringEXT");
peglQueryDevicesEXT = (void *)eglGetProcAddress("eglQueryDevicesEXT");
peglGetPlatformDisplayEXT = (void *)eglGetProcAddress("eglGetPlatformDisplayEXT");
}
static EGLDisplay *
get_device_display(void)
{
#define NDEVS 1024
EGLDeviceEXT devices[NDEVS];
EGLint i, num_devices;
const char *devstring;
if (!peglQueryDevicesEXT(NDEVS, devices, &num_devices)) {
printf("Failed to get egl device\n");
piglit_report_result(PIGLIT_FAIL);
}
/* Use a DRM device, as the software one has some issues. */
for (i = 0; i < num_devices; i++) {
devstring = peglQueryDeviceStringEXT(devices[i], EGL_EXTENSIONS);
if (piglit_is_extension_in_string(devstring,
"EGL_EXT_device_drm")) {
return peglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,
devices[i], NULL);
}
}
printf("Failed to get a drm backed, egl device\n");
piglit_report_result(PIGLIT_SKIP);
}
static void
test_setup(EGLDisplay *dpy)
{
EGLint egl_major, egl_minor;
piglit_require_egl_extension(EGL_NO_DISPLAY, "EGL_EXT_platform_device");
*dpy = get_device_display();
if (*dpy == EGL_NO_DISPLAY) {
printf("failed to get EGLDisplay\n");
piglit_report_result(PIGLIT_FAIL);
}
if (!eglInitialize(*dpy, &egl_major, &egl_minor)) {
printf("eglInitialize failed\n");
piglit_report_result(PIGLIT_FAIL);
}
}
static enum piglit_result
test_initialize_display(void *test_data)
{
EGLDisplay dpy;
test_setup(&dpy);
eglTerminate(dpy);
return PIGLIT_PASS;
}
/* Test that eglCreatePlatformWindowSurface fails with EGL_BAD_NATIVE_WINDOW.
*
* From the EGL_MESA_platform_surfaceless spec (v1):
*
* eglCreatePlatformWindowSurface fails when called with a <display>
* that belongs to the surfaceless platform. It returns
* EGL_NO_SURFACE and generates EGL_BAD_NATIVE_WINDOW. The
* justification for this unconditional failure is that the
* surfaceless platform has no native windows, and therefore the
* <native_window> parameter is always invalid.
*/
static enum piglit_result
test_create_window(void *test_data)
{
EGLDisplay dpy;
EGLSurface surf;
test_setup(&dpy);
surf = peglCreatePlatformWindowSurfaceEXT(dpy, EGL_NO_CONFIG_KHR,
/*native_window*/ NULL,
/*attrib_list*/ NULL);
if (surf) {
printf("eglCreatePlatformWindowSurface incorrectly succeeded\n");
return PIGLIT_FAIL;
}
if (!piglit_check_egl_error(EGL_BAD_NATIVE_WINDOW))
return PIGLIT_FAIL;
eglTerminate(dpy);
return PIGLIT_PASS;
}
/* Test that eglCreatePlatformPixmapSurface fails with EGL_BAD_NATIVE_PIXMAP.
*
* From the EGL_MESA_platform_surfaceless spec (v1):
*
* [Like eglCreatePlatformWindowSurface,] eglCreatePlatformPixmapSurface
* also fails when called with a <display> that belongs to the surfaceless
* platform. It returns EGL_NO_SURFACE and generates
* EGL_BAD_NATIVE_PIXMAP.
*/
static enum piglit_result
test_create_pixmap(void *test_data)
{
EGLDisplay dpy;
EGLSurface surf;
test_setup(&dpy);
surf = peglCreatePlatformPixmapSurfaceEXT(dpy, EGL_NO_CONFIG_KHR,
/*native_pixmap*/ NULL,
/*attrib_list*/ NULL);
if (surf) {
printf("eglCreatePlatformPixmapSurface incorrectly succeeded\n");
return PIGLIT_FAIL;
}
if (!piglit_check_egl_error(EGL_BAD_NATIVE_PIXMAP))
return PIGLIT_FAIL;
eglTerminate(dpy);
return PIGLIT_PASS;
}
/* Test that eglCreatePbufferSurface succeeds if given an EGLConfig with
* EGL_PBUFFER_BIT.
*
* From the EGL_MESA_platform_surfaceless spec (v1):
*
* The surfaceless platform imposes no platform-specific restrictions on the
* creation of pbuffers, as eglCreatePbufferSurface has no native surface
* parameter. [...] Specifically, if the EGLDisplay advertises an EGLConfig
* whose EGL_SURFACE_TYPE attribute contains EGL_PBUFFER_BIT, then the
* EGLDisplay permits the creation of pbuffers.
*/
static enum piglit_result
test_create_pbuffer(void *test_data)
{
EGLDisplay dpy = EGL_NO_DISPLAY;
EGLConfig config = EGL_NO_CONFIG_KHR;
EGLint num_configs = 9999;
EGLSurface surf;
const EGLint config_attrs[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_RED_SIZE, EGL_DONT_CARE,
EGL_GREEN_SIZE, EGL_DONT_CARE,
EGL_BLUE_SIZE, EGL_DONT_CARE,
EGL_ALPHA_SIZE, EGL_DONT_CARE,
EGL_DEPTH_SIZE, EGL_DONT_CARE,
EGL_STENCIL_SIZE, EGL_DONT_CARE,
/* This is a bitmask that selects the rendering API (such as
* EGL_OPENGL_BIT and EGL_OPENGL_ES2_BIT). Accept any API,
* because we don't care.
*/
EGL_RENDERABLE_TYPE, ~0,
EGL_NONE,
};
test_setup(&dpy);
if (!eglChooseConfig(dpy, config_attrs, &config, 1, &num_configs)) {
printf("eglChooseConfig failed\n");
return PIGLIT_FAIL;
}
if (num_configs == 0) {
printf("found no EGLConfig with EGL_PBUFFER_BIT\n");
return PIGLIT_FAIL;
}
surf = eglCreatePbufferSurface(dpy, config, /*attribs*/ NULL);
if (!surf) {
printf("eglCreatePbufferSurface failed\n");
return PIGLIT_FAIL;
}
eglDestroySurface(dpy, surf);
eglTerminate(dpy);
return PIGLIT_PASS;
}
static const struct piglit_subtest subtests[] = {
{ "initialize_display", "initialize_display", test_initialize_display },
{ "create_window", "create_window", test_create_window },
{ "create_pixmap", "create_pixmap", test_create_pixmap },
{ "create_pbuffer", "create_pbuffer", test_create_pbuffer },
{ 0 },
};
int
main(int argc, char **argv)
{
enum piglit_result result = PIGLIT_SKIP;
const char **selected_names = NULL;
size_t num_selected = 0;
/* Strip common piglit args. */
piglit_strip_arg(&argc, argv, "-fbo");
piglit_strip_arg(&argc, argv, "-auto");
piglit_parse_subtest_args(&argc, argv, subtests, &selected_names,
&num_selected);
if (argc > 1) {
fprintf(stderr, "usage error\n");
piglit_report_result(PIGLIT_FAIL);
}
init_egl_extension_funcs();
result = piglit_run_selected_subtests(subtests, selected_names,
num_selected, result);
piglit_report_result(result);
}
link_libraries(
piglitutil
)
piglit_add_executable(egl_mesa_device_software egl_mesa_device_software.c)
# vim: ft=cmake:
/*
* Copyright © 2016 Red Hat, Inc.
* Copyright 2015 Intel Corporation
* Copyright 2018 Collabora, Ltd.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#include "piglit-util.h"
#include "piglit-util-egl.h"
#define NDEVS 1024
int
main(void)
{
enum piglit_result result = PIGLIT_PASS;
EGLDeviceEXT devs[NDEVS];
EGLint i, numdevs, swdevs;
EGLDeviceEXT device = EGL_NO_DEVICE_EXT;
EGLAttrib attr;
const char *devstring = NULL;
PFNEGLQUERYDEVICESEXTPROC queryDevices;
PFNEGLQUERYDEVICESTRINGEXTPROC queryDeviceString;
PFNEGLQUERYDEVICEATTRIBEXTPROC queryDeviceAttrib;
const char *client_exts = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
bool has_client_ext =
client_exts &&
((piglit_is_extension_in_string(client_exts,
"EGL_EXT_device_query") &&
piglit_is_extension_in_string(client_exts,
"EGL_EXT_device_enumeration")) ||
piglit_is_extension_in_string(client_exts,
"EGL_EXT_device_base"));
if (!has_client_ext) {
printf("EGL_EXT_device_query not supported\n");
piglit_report_result(PIGLIT_SKIP);
}
queryDevices = (void *)eglGetProcAddress("eglQueryDevicesEXT");
queryDeviceString =
(void *)eglGetProcAddress("eglQueryDeviceStringEXT");
queryDeviceAttrib =
(void *)eglGetProcAddress("eglQueryDeviceAttribEXT");
if (!queryDevices|| !queryDeviceString || !queryDeviceAttrib) {
printf("No device query/enumeration entrypoints\n");
piglit_report_result(PIGLIT_SKIP);
}
if (!queryDevices(0, NULL, &numdevs)) {
printf("Failed to get device count\n");
piglit_report_result(PIGLIT_FAIL);
}
if (numdevs > NDEVS) {
printf("More than %d devices, please fix this test\n", NDEVS);
result = PIGLIT_WARN;
numdevs = NDEVS;
}
memset(devs, 0, sizeof devs);
if (!queryDevices(numdevs, devs, &numdevs)) {
printf("Failed to enumerate devices\n");
piglit_report_result(PIGLIT_FAIL);
}
if (!numdevs) {
printf("Zero devices enumerated\n");
piglit_report_result(PIGLIT_FAIL);
}
for (i = 0; i < numdevs; i++) {
device = devs[i];
devstring = queryDeviceString(device, EGL_EXTENSIONS);
if (devstring == NULL) {
printf("Empty device extension string\n");
continue;
}
if (!piglit_is_extension_in_string(devstring,
"EGL_MESA_device_software")) {
printf("Device is not a software one\n");
continue;
}
swdevs++;
/* Extension does not define any attrib/string tokens.
*
* Double-check we don't expose claim to support other
* extension's tokens
*/
queryDeviceAttrib(device, 0xbad1dea, &attr);
if (!piglit_check_egl_error(EGL_BAD_ATTRIBUTE))
piglit_report_result(PIGLIT_FAIL);
#ifndef EGL_DRM_DEVICE_FILE_EXT
#define EGL_DRM_DEVICE_FILE_EXT 0x3233
#endif
devstring = queryDeviceString(device, EGL_DRM_DEVICE_FILE_EXT);
if (!piglit_check_egl_error(EGL_BAD_PARAMETER))
piglit_report_result(PIGLIT_FAIL);
}
/* SKIP if we fetched all devices with none supporting the extension */
if (result == PIGLIT_PASS && !swdevs)
result = PIGLIT_SKIP;
piglit_report_result(result);
}
......@@ -68,6 +68,7 @@ test_initialize_display(void *test_data)
test_setup(&dpy);
eglTerminate(dpy);
return PIGLIT_PASS;
}
......@@ -101,6 +102,7 @@ test_create_window(void *test_data)
if (!piglit_check_egl_error(EGL_BAD_NATIVE_WINDOW))
return PIGLIT_FAIL;
eglTerminate(dpy);
return PIGLIT_PASS;
}
......@@ -132,6 +134,7 @@ test_create_pixmap(void *test_data)
if (!piglit_check_egl_error(EGL_BAD_NATIVE_PIXMAP))
return PIGLIT_FAIL;
eglTerminate(dpy);
return PIGLIT_PASS;
}
......@@ -192,7 +195,7 @@ test_create_pbuffer(void *test_data)
}
eglDestroySurface(dpy, surf);
eglTerminate(dpy);
return PIGLIT_PASS;
}
......
......@@ -4583,6 +4583,24 @@ with profile.test_list.group_manager(
exclude_platforms=['glx']) as g:
g(['egl_ext_device_enumeration'], 'conformance')
with profile.test_list.group_manager(
PiglitGLTest,
grouptools.join('spec', 'egl_ext_device_drm'),
exclude_platforms=['glx']) as g:
g(['egl_ext_device_drm'], 'conformance')
with profile.test_list.group_manager(
PiglitGLTest,
grouptools.join('spec', 'egl_ext_platform_device'),
exclude_platforms=['glx']) as g:
g(['egl_ext_platform_device'], 'conformance')
with profile.test_list.group_manager(
PiglitGLTest,
grouptools.join('spec', 'egl_mesa_device_software'),
exclude_platforms=['glx']) as g:
g(['egl_mesa_device_software'], 'conformance')
with profile.test_list.group_manager(
PiglitGLTest,
grouptools.join('spec', 'egl_mesa_platform_surfaceless'),
......