egl: wire up EGL_EXT_surface_compression extension

Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27109>
This commit is contained in:
Louis-Francis Ratté-Boulianne
2023-10-31 15:49:27 -04:00
committed by Marge Bot
parent f5d85365a7
commit 6f852cb6ed
7 changed files with 63 additions and 0 deletions

View File

@@ -246,5 +246,8 @@ EGL_FUNCTIONS = (
_eglFunc("eglGLInteropQueryDeviceInfoMESA", "display"),
_eglFunc("eglGLInteropExportObjectMESA", "display"),
_eglFunc("eglGLInteropFlushObjectsMESA", "display"),
# EGL_EXT_surface_compression
_eglFunc("eglQuerySupportedCompressionRatesEXT", "display"),
)

View File

@@ -555,6 +555,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
_EGL_CHECK_EXTENSION(EXT_protected_content);
_EGL_CHECK_EXTENSION(EXT_protected_surface);
_EGL_CHECK_EXTENSION(EXT_query_reset_notification_strategy);
_EGL_CHECK_EXTENSION(EXT_surface_compression);
_EGL_CHECK_EXTENSION(EXT_surface_CTA861_3_metadata);
_EGL_CHECK_EXTENSION(EXT_surface_SMPTE2086_metadata);
_EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage);
@@ -2699,6 +2700,34 @@ eglQueryDmaBufModifiersEXT(EGLDisplay dpy, EGLint format, EGLint max_modifiers,
RETURN_EGL_EVAL(disp, ret);
}
static EGLBoolean EGLAPIENTRY
eglQuerySupportedCompressionRatesEXT(EGLDisplay dpy, EGLConfig config,
const EGLAttrib *attrib_list,
EGLint *rates, EGLint rate_size,
EGLint *num_rates)
{
_EGLDisplay *disp = _eglLockDisplay(dpy);
_EGLConfig *conf = _eglLookupConfig(config, disp);
EGLBoolean ret = EGL_FALSE;
_EGL_FUNC_START(NULL, EGL_NONE, NULL);
_EGL_CHECK_DISPLAY(disp, EGL_FALSE);
_EGL_CHECK_CONFIG(disp, conf, EGL_FALSE);
egl_relax (disp) {
if (disp->Driver->QuerySupportedCompressionRatesEXT) {
ret = disp->Driver->QuerySupportedCompressionRatesEXT(
disp, conf, attrib_list, rates, rate_size, num_rates);
} else {
*num_rates = 0;
ret = EGL_TRUE;
}
}
RETURN_EGL_EVAL(disp, ret);
}
static void EGLAPIENTRY
eglSetBlobCacheFuncsANDROID(EGLDisplay *dpy, EGLSetBlobFuncANDROID set,
EGLGetBlobFuncANDROID get)

View File

@@ -111,6 +111,7 @@ struct _egl_extensions {
EGLBoolean EXT_protected_content;
EGLBoolean EXT_protected_surface;
EGLBoolean EXT_query_reset_notification_strategy;
EGLBoolean EXT_surface_compression;
EGLBoolean EXT_surface_CTA861_3_metadata;
EGLBoolean EXT_surface_SMPTE2086_metadata;
EGLBoolean EXT_swap_buffers_with_damage;

View File

@@ -224,6 +224,14 @@ struct _egl_driver {
void (*SetBlobCacheFuncsANDROID)(_EGLDisplay *disp,
EGLSetBlobFuncANDROID set,
EGLGetBlobFuncANDROID get);
/* for EGL_EXT_surface_compression */
EGLBoolean (*QuerySupportedCompressionRatesEXT)(_EGLDisplay *disp,
_EGLConfig *config,
const EGLAttrib *attr_list,
EGLint *rates,
EGLint rate_size,
EGLint *num_rates);
};
#ifdef __cplusplus

View File

@@ -70,6 +70,7 @@ EGL_ENTRYPOINT(eglQueryDisplayAttribEXT)
EGL_ENTRYPOINT(eglQueryDmaBufFormatsEXT)
EGL_ENTRYPOINT(eglQueryDmaBufModifiersEXT)
EGL_ENTRYPOINT(eglQueryString)
EGL_ENTRYPOINT(eglQuerySupportedCompressionRatesEXT)
EGL_ENTRYPOINT(eglQuerySurface)
EGL_ENTRYPOINT(eglQueryWaylandBufferWL)
EGL_ENTRYPOINT(eglReleaseTexImage)

View File

@@ -240,6 +240,18 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
}
surf->PostSubBufferSupportedNV = val;
break;
case EGL_SURFACE_COMPRESSION_EXT:
if (type != EGL_WINDOW_BIT) {
err = EGL_BAD_ATTRIBUTE;
break;
}
if (val < EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT ||
val > EGL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT) {
err = EGL_BAD_PARAMETER;
break;
}
surf->CompressionRate = val;
break;
/* pbuffer surface attributes */
case EGL_WIDTH:
if (type != EGL_PBUFFER_BIT) {
@@ -408,6 +420,7 @@ _eglInitSurface(_EGLSurface *surf, _EGLDisplay *disp, EGLint type,
surf->GLColorspace = EGL_GL_COLORSPACE_LINEAR_KHR;
surf->ProtectedContent = EGL_FALSE;
surf->PresentOpaque = EGL_FALSE;
surf->CompressionRate = EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT;
surf->MipmapLevel = 0;
surf->MultisampleResolve = EGL_MULTISAMPLE_RESOLVE_DEFAULT;
@@ -625,6 +638,9 @@ _eglQuerySurface(_EGLDisplay *disp, _EGLSurface *surface, EGLint attribute,
return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
*value = surface->PresentOpaque;
break;
case EGL_SURFACE_COMPRESSION_EXT:
*value = surface->CompressionRate;
break;
default:
return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
}

View File

@@ -135,6 +135,11 @@ struct _egl_surface {
EGLenum VGColorspace;
EGLenum GLColorspace;
/* EGL_EXT_surface_compression
* Value of EGL_SURFACE_COMPRESSION_EXT attribute selected at creation.
*/
EGLint CompressionRate;
/* attributes set by eglSurfaceAttrib */
EGLint MipmapLevel;
EGLenum MultisampleResolve;