Apply RK3588 compatibility patches to EGL and PanVK
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

- EGL: 64-bit gralloc usage, API level guard removal, buffer dequeue optimization
- PanVK: SHA1 cache UUID, legacy scanout LINEAR default

Copyright (C) 2026 Brendan Szymanski <hello@bscubed.dev>
This commit is contained in:
Brendan Szymanski 2026-07-10 22:40:41 -04:00
parent 2162a00496
commit e23fdcbdfe
4 changed files with 36 additions and 27 deletions

View file

@ -292,7 +292,7 @@ struct dri2_egl_display {
#ifdef HAVE_ANDROID_PLATFORM
struct u_gralloc *gralloc;
/* gralloc vendor usage bit for front rendering */
uint32_t front_rendering_usage;
uint64_t front_rendering_usage;
bool has_native_fence_fd;
bool pure_swrast;
#endif
@ -379,7 +379,7 @@ struct dri2_egl_surface {
struct ANativeWindowBuffer *buffer;
int age;
} *color_buffers, *back;
uint32_t gralloc_usage;
uint64_t gralloc_usage;
#endif
/* surfaceless and device */

View file

@ -230,7 +230,6 @@ droid_window_cancel_buffer(struct dri2_egl_surface *dri2_surf)
static bool
droid_set_shared_buffer_mode(_EGLDisplay *disp, _EGLSurface *surf, bool mode)
{
#if ANDROID_API_LEVEL >= 24
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
struct ANativeWindow *window = dri2_surf->window;
@ -261,11 +260,6 @@ droid_set_shared_buffer_mode(_EGLDisplay *disp, _EGLSurface *surf, bool mode)
}
return true;
#else
_eglLog(_EGL_FATAL, "%s:%d: internal error: unreachable", __FILE__,
__LINE__);
return false;
#endif
}
static _EGLSurface *
@ -672,6 +666,12 @@ droid_swap_buffers(_EGLDisplay *disp, _EGLSurface *draw)
draw->ActiveRenderBuffer = draw->RequestedRenderBuffer;
}
/* Optimization: Dequeue the buffer for a next frame:
* This reduces CPU time spent by next frame on a road
* from start-of-frame event to GPU job-submit event.
*/
update_buffers(dri2_surf);
return EGL_TRUE;
}
@ -1245,7 +1245,6 @@ dri2_initialize_android(_EGLDisplay *disp)
disp->Extensions.KHR_image = EGL_TRUE;
dri2_dpy->front_rendering_usage = 0;
#if ANDROID_API_LEVEL >= 24
if (!dri2_dpy->swrast_not_kms &&
dri2_dpy->loader_extensions == droid_image_loader_extensions &&
/* In big GL, front rendering is done at the core API level by directly
@ -1259,6 +1258,12 @@ dri2_initialize_android(_EGLDisplay *disp)
*/
(disp->ClientAPIs & ~(EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT |
EGL_OPENGL_ES3_BIT_KHR)) == 0) {
#if ANDROID_API_LEVEL >= 33
/* align with BufferUsage::FRONT_BUFFER */
dri2_dpy->front_rendering_usage = 1UL << 32;
disp->Extensions.KHR_mutable_render_buffer = EGL_TRUE;
#else
/* For cros gralloc, if the front rendering query is supported, then all
* available window surface configs support front rendering because:
*
@ -1280,8 +1285,8 @@ dri2_initialize_android(_EGLDisplay *disp)
dri2_dpy->front_rendering_usage = front_rendering_usage;
disp->Extensions.KHR_mutable_render_buffer = EGL_TRUE;
}
}
#endif
}
/* Create configs *after* enabling extensions because presence of DRI
* driver extensions can affect the capabilities of EGLConfigs.

View file

@ -223,6 +223,10 @@ panvk_image_get_mod(struct panvk_image *image,
assert(!"Missing modifier info");
}
/* legacy scanout (images without any external modifier info) should default to LINEAR. */
if (image->vk.wsi_legacy_scanout)
return DRM_FORMAT_MOD_LINEAR;
return panvk_image_get_mod_from_list(image, NULL, 0);
}

View file

@ -12,7 +12,7 @@
#include <sys/stat.h>
#include <sys/sysinfo.h>
#include "util/disk_cache.h"
#include "util/mesa-sha1.h"
#include "git_sha1.h"
#include "vk_device.h"
@ -132,20 +132,24 @@ get_drm_device_ids(struct panvk_physical_device *device,
return VK_SUCCESS;
}
static int
get_cache_uuid(uint16_t family, void *uuid)
static void
get_cache_sha1(struct panvk_physical_device *device,
const struct panvk_instance *instance)
{
uint32_t mesa_timestamp;
uint16_t f = family;
struct mesa_sha1 sha_ctx;
_mesa_sha1_init(&sha_ctx);
if (!disk_cache_get_function_timestamp(get_cache_uuid, &mesa_timestamp))
return -1;
_mesa_sha1_update(&sha_ctx, instance->driver_build_sha,
sizeof(instance->driver_build_sha));
memset(uuid, 0, VK_UUID_SIZE);
memcpy(uuid, &mesa_timestamp, 4);
memcpy((char *)uuid + 4, &f, 2);
snprintf((char *)uuid + 6, VK_UUID_SIZE - 10, "pan");
return 0;
_mesa_sha1_update(&sha_ctx, &device->kmod.props.gpu_id,
sizeof(device->kmod.props.gpu_id));
unsigned char sha[SHA1_DIGEST_LENGTH];
_mesa_sha1_final(&sha_ctx, sha);
STATIC_ASSERT(VK_UUID_SIZE <= SHA1_DIGEST_LENGTH);
memcpy(device->cache_uuid, sha, VK_UUID_SIZE);
}
static VkResult
@ -301,11 +305,7 @@ panvk_physical_device_init(struct panvk_physical_device *device,
memset(device->name, 0, sizeof(device->name));
sprintf(device->name, "%s", device->model->name);
if (get_cache_uuid(device->kmod.props.gpu_id, device->cache_uuid)) {
result = panvk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
"cannot generate UUID");
goto fail;
}
get_cache_sha1(device, instance);
result = get_core_masks(device, instance);
if (result != VK_SUCCESS)