[Mesa-stable] [PATCH] st/dri: implement the __DRI_DRIVER_VTABLE extension
Eric Anholt
eric at anholt.net
Wed Sep 5 17:01:37 UTC 2018
Emil Velikov <emil.l.velikov at gmail.com> writes:
> Hi Eric,
>
> On 24 August 2018 at 14:11, Emil Velikov <emil.l.velikov at gmail.com> wrote:
>> From: Emil Velikov <emil.velikov at collabora.com>
>>
>> As the comment above globalDriverAPI (in dri_util.c) says, if the loader
>> is unaware of createNewScreen2 there is a race condition.
>>
>> In which globalDriverAPI, will be set in the driver driDriverGetExtensions*
>> function and used in createNewScreen(). If we call another drivers'
>> driDriverGetExtensions, the createNewScreen will use the latter's API
>> instead of the former.
>>
>> To make it more convoluting, the driver _must_ also expose
>> __DRI_DRIVER_VTABLE, as that one exposes the correct API.
>>
>> The race also occurs, for loaders which use the pre megadrivers
>> driDriverGetExtensions entrypoint.
>>
>> Cc: mesa-stable at lists.freedesktop.org
>> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
>> ---
>> src/gallium/state_trackers/dri/dri2.c | 21 +++++++++++++++++++++
>> src/gallium/state_trackers/dri/dri_screen.h | 1 +
>> src/gallium/state_trackers/dri/drisw.c | 6 ++++++
>> src/gallium/targets/dri/target.c | 2 +-
>> 4 files changed, 29 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
>> index 3cbca4e5dc3..b21e6815796 100644
>> --- a/src/gallium/state_trackers/dri/dri2.c
>> +++ b/src/gallium/state_trackers/dri/dri2.c
>> @@ -2318,11 +2318,32 @@ const struct __DriverAPIRec dri_kms_driver_api = {
>> .ReleaseBuffer = dri2_release_buffer,
>> };
>>
>> +static const struct __DRIDriverVtableExtensionRec gallium_drm_vtable = {
>> + .base = { __DRI_DRIVER_VTABLE, 1 },
>> + .vtable = &galliumdrm_driver_api,
>> +};
>> +
>> +static const struct __DRIDriverVtableExtensionRec dri_kms_vtable = {
>> + .base = { __DRI_DRIVER_VTABLE, 1 },
>> + .vtable = &dri_kms_driver_api,
>> +};
>> +
>> /* This is the table of extensions that the loader will dlsym() for. */
>> const __DRIextension *galliumdrm_driver_extensions[] = {
>> &driCoreExtension.base,
>> &driImageDriverExtension.base,
>> &driDRI2Extension.base,
>> + &gallium_drm_vtable.base,
>> + &gallium_config_options.base,
>> + NULL
>> +};
>> +
>> +/* This is the table of extensions that the loader will dlsym() for. */
>> +const __DRIextension *dri_kms_driver_extensions[] = {
>> + &driCoreExtension.base,
>> + &driImageDriverExtension.base,
>> + &driDRI2Extension.base,
>> + &dri_kms_vtable.base,
>> &gallium_config_options.base,
>> NULL
>> };
>> diff --git a/src/gallium/state_trackers/dri/dri_screen.h b/src/gallium/state_trackers/dri/dri_screen.h
>> index 8d2d9c02892..fde3b4088a7 100644
>> --- a/src/gallium/state_trackers/dri/dri_screen.h
>> +++ b/src/gallium/state_trackers/dri/dri_screen.h
>> @@ -147,6 +147,7 @@ void
>> dri_destroy_screen(__DRIscreen * sPriv);
>>
>> extern const struct __DriverAPIRec dri_kms_driver_api;
>> +extern const __DRIextension *dri_kms_driver_extensions[];
>>
>> extern const struct __DriverAPIRec galliumdrm_driver_api;
>> extern const __DRIextension *galliumdrm_driver_extensions[];
>> diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c
>> index 1fba71bdd97..76a06b36664 100644
>> --- a/src/gallium/state_trackers/dri/drisw.c
>> +++ b/src/gallium/state_trackers/dri/drisw.c
>> @@ -513,11 +513,17 @@ const struct __DriverAPIRec galliumsw_driver_api = {
>> .CopySubBuffer = drisw_copy_sub_buffer,
>> };
>>
>> +static const struct __DRIDriverVtableExtensionRec galliumsw_vtable = {
>> + .base = { __DRI_DRIVER_VTABLE, 1 },
>> + .vtable = &galliumsw_driver_api,
>> +};
>> +
>> /* This is the table of extensions that the loader will dlsym() for. */
>> const __DRIextension *galliumsw_driver_extensions[] = {
>> &driCoreExtension.base,
>> &driSWRastExtension.base,
>> &driCopySubBufferExtension.base,
>> + &galliumsw_vtable.base,
>> &gallium_config_options.base,
>> NULL
>> };
>> diff --git a/src/gallium/targets/dri/target.c b/src/gallium/targets/dri/target.c
>> index 835d125f21e..e943cae6a16 100644
>> --- a/src/gallium/targets/dri/target.c
>> +++ b/src/gallium/targets/dri/target.c
>> @@ -28,7 +28,7 @@ const __DRIextension **__driDriverGetExtensions_kms_swrast(void);
>> PUBLIC const __DRIextension **__driDriverGetExtensions_kms_swrast(void)
>> {
>> globalDriverAPI = &dri_kms_driver_api;
>> - return galliumdrm_driver_extensions;
>> + return dri_kms_driver_extensions;
>> }
>>
> Can you please skim through the above?
>
> Seems like I forgot to implement this while making the gallium mega-drivers.
> I did not notice any issues in practise, but with EGLDevice this will
> become more likely to hit.
With having a new baby, I'm getting maybe an hour a day for software
stuff. I won't have time to review this.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-stable/attachments/20180905/d42ee952/attachment.sig>
More information about the mesa-stable
mailing list