summary refs log tree commit diff
path: root/gpu_renderer/src
diff options
context:
space:
mode:
authorDavid Riley <davidriley@chromium.org>2019-07-24 13:07:33 -0700
committerCommit Bot <commit-bot@chromium.org>2019-08-01 19:34:03 +0000
commit62c533c9a3c60a7fcee2d49d987f955b75a67c99 (patch)
treefe87d13b8d5d5d34b27c825551e8722b5d234279 /gpu_renderer/src
parent7cf768d02dd34aee39bf77d3524700cf1b629d8d (diff)
downloadcrosvm-62c533c9a3c60a7fcee2d49d987f955b75a67c99.tar
crosvm-62c533c9a3c60a7fcee2d49d987f955b75a67c99.tar.gz
crosvm-62c533c9a3c60a7fcee2d49d987f955b75a67c99.tar.bz2
crosvm-62c533c9a3c60a7fcee2d49d987f955b75a67c99.tar.lz
crosvm-62c533c9a3c60a7fcee2d49d987f955b75a67c99.tar.xz
crosvm-62c533c9a3c60a7fcee2d49d987f955b75a67c99.tar.zst
crosvm-62c533c9a3c60a7fcee2d49d987f955b75a67c99.zip
gpu_renderer: Make eglDebugMessageControlKHR usage optional.
BUG=chromium:892280
TEST=glxgears with virtio-gpu on kevin and nami

Change-Id: I2158f4fe3411006ce5498b01d12ca627aa985f53
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1717737
Reviewed-by: Zach Reizner <zachr@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Tested-by: David Riley <davidriley@chromium.org>
Commit-Queue: David Riley <davidriley@chromium.org>
Auto-Submit: David Riley <davidriley@chromium.org>
Diffstat (limited to 'gpu_renderer/src')
-rw-r--r--gpu_renderer/src/lib.rs34
1 files changed, 20 insertions, 14 deletions
diff --git a/gpu_renderer/src/lib.rs b/gpu_renderer/src/lib.rs
index 5311c82..908a83a 100644
--- a/gpu_renderer/src/lib.rs
+++ b/gpu_renderer/src/lib.rs
@@ -26,11 +26,12 @@ use data_model::{VolatileMemory, VolatileSlice};
 use sys_util::{GuestAddress, GuestMemory};
 
 use crate::generated::epoxy_egl::{
-    EGLAttrib, EGLBoolean, EGLClientBuffer, EGLConfig, EGLContext, EGLDisplay, EGLImageKHR,
-    EGLNativeDisplayType, EGLSurface, EGLenum, EGLint, EGLuint64KHR, EGLDEBUGPROCKHR,
-    EGL_CONTEXT_CLIENT_VERSION, EGL_DMA_BUF_PLANE0_FD_EXT, EGL_DMA_BUF_PLANE0_OFFSET_EXT,
-    EGL_DMA_BUF_PLANE0_PITCH_EXT, EGL_GL_TEXTURE_2D_KHR, EGL_HEIGHT, EGL_LINUX_DMA_BUF_EXT,
-    EGL_LINUX_DRM_FOURCC_EXT, EGL_NONE, EGL_OPENGL_ES_API, EGL_SURFACE_TYPE, EGL_WIDTH,
+    epoxy_has_egl_extension, EGLAttrib, EGLBoolean, EGLClientBuffer, EGLConfig, EGLContext,
+    EGLDisplay, EGLImageKHR, EGLNativeDisplayType, EGLSurface, EGLenum, EGLint, EGLuint64KHR,
+    EGLDEBUGPROCKHR, EGL_CONTEXT_CLIENT_VERSION, EGL_DMA_BUF_PLANE0_FD_EXT,
+    EGL_DMA_BUF_PLANE0_OFFSET_EXT, EGL_DMA_BUF_PLANE0_PITCH_EXT, EGL_GL_TEXTURE_2D_KHR, EGL_HEIGHT,
+    EGL_LINUX_DMA_BUF_EXT, EGL_LINUX_DRM_FOURCC_EXT, EGL_NONE, EGL_OPENGL_ES_API, EGL_SURFACE_TYPE,
+    EGL_WIDTH,
 };
 use crate::generated::p_defines::{
     PIPE_BIND_RENDER_TARGET, PIPE_BIND_SAMPLER_VIEW, PIPE_TEXTURE_1D, PIPE_TEXTURE_2D,
@@ -230,8 +231,9 @@ struct EGLFunctionsInner {
         buffer: EGLClientBuffer,
         attrib_list: *const EGLint,
     ) -> EGLImageKHR,
-    DebugMessageControlKHR:
+    DebugMessageControlKHR: Option<
         unsafe extern "C" fn(callback: EGLDEBUGPROCKHR, attrib_list: *const EGLAttrib) -> EGLint,
+    >,
     DestroyImageKHR: unsafe extern "C" fn(dpy: EGLDisplay, image: EGLImageKHR) -> EGLBoolean,
     ExportDRMImageMESA: unsafe extern "C" fn(
         dpy: EGLDisplay,
@@ -285,8 +287,7 @@ impl EGLFunctions {
                     .ok_or(Error::MissingEGLFunction("eglCreateContext"))?,
                 CreateImageKHR: epoxy_eglCreateImageKHR
                     .ok_or(Error::MissingEGLFunction("eglCreateImageKHR"))?,
-                DebugMessageControlKHR: epoxy_eglDebugMessageControlKHR
-                    .ok_or(Error::MissingEGLFunction("eglDebugMessageControlKHR"))?,
+                DebugMessageControlKHR: epoxy_eglDebugMessageControlKHR,
                 DestroyImageKHR: epoxy_eglDestroyImageKHR
                     .ok_or(Error::MissingEGLFunction("eglDestroyImageKHR"))?,
                 ExportDRMImageMESA: epoxy_eglExportDRMImageMESA
@@ -319,18 +320,23 @@ impl Deref for EGLFunctions {
 fn init_egl() -> Result<(EGLDisplay, EGLFunctions)> {
     let egl_funcs = EGLFunctions::new()?;
 
-    // Safe because only valid callbacks are given and only one thread can execute this
-    // function.
-    unsafe {
-        (egl_funcs.DebugMessageControlKHR)(Some(error_callback), null());
-    }
-
     // Trivially safe.
     let display = unsafe { (egl_funcs.GetDisplay)(null_mut()) };
     if display.is_null() {
         return Err(Error::EGLGetDisplay);
     }
 
+    // Safe because only valid callbacks are given and only one thread can execute this
+    // function.
+    unsafe {
+        const EXTENSION_NAME: &[u8] = b"EGL_KHR_debug\0";
+        if epoxy_has_egl_extension(display, EXTENSION_NAME.as_ptr() as *const c_char) {
+            if let Some(debug_message_control) = egl_funcs.DebugMessageControlKHR {
+                debug_message_control(Some(error_callback), null());
+            }
+        }
+    }
+
     // Safe because only a valid display is given.
     let ret = unsafe { (egl_funcs.Initialize)(display, null_mut(), null_mut()) };
     if ret == 0 {