[Mesa-dev] [PATCH 05/16] loader: reimplement loader_get_user_preferred_fd via libdrm
Emil Velikov
emil.l.velikov at gmail.com
Wed Oct 12 17:15:43 UTC 2016
On 11 October 2016 at 19:54, Axel Davy <axel.davy at ens.fr> wrote:
> On 11/10/2016 20:31, Emil Velikov wrote:
>>
>> - udev = udev_new();
>> - if (!udev)
>> - goto prime_clean;
>> + if (drmGetDevice(default_fd, &device) != 0)
>> + goto err;
>> - default_device_id_path_tag = get_id_path_tag_from_fd(udev,
>> default_fd);
>> - if (!default_device_id_path_tag)
>> - goto udev_clean;
>> -
>> - is_different_device = 1;
>> /* two format are supported:
>> * "1": choose any other card than the card used by default.
>> * id_path_tag: (for example "pci-0000_02_00_0") choose the card
>> * with this id_path_tag.
>> */
>> if (!strcmp(prime,"1")) {
>> - free(prime);
>> - prime = strdup(default_device_id_path_tag);
>> - /* request a card with a different card than the default card */
>> - another_tag = 1;
>> - } else if (!strcmp(default_device_id_path_tag, prime))
>> - /* we are to get a new fd (render-node) of the same device */
>> - is_different_device = 0;
>> + /* Hmm... detection for 2-7 seems to be broken. Nicely done. */
>
> For DRI2, DRI_PRIME takes a number corresponding to the device number as
> configured in xorg (and you have xrandr commands to configure the
> behaviour). This doesn't work with the DRI3 scheme. However for
> retrocompatibility, after several discussions, we decided to let DRI2's most
> used command 'DRI_PRIME=1' to still sorta work on DRI3, but the meaning
> changed: DRI_PRIME=1 => 'give me any device that is not the compositor/xorg
> device'
No argument/objection against DRI_PRIME with DRI3, yet the current
hard coded DRI_PRIME=1 _only_ check is iffy. As per the spec there can
be 8 devices (0-8) with 0 always being the xorg/compositor one and 1-7
as 'other' devices. Yet here we only consider 1 and ignore everything
else :-\
>>
>> + is_different_device = 1;
>> + } else {
>> + default_tag = drm_construct_id_path_tag(device);
>> + if (default_tag == NULL)
>> + goto err;
>> - device_name = get_render_node_from_id_path_tag(udev,
>> - prime,
>> - another_tag);
>> - if (device_name == NULL) {
>> + if (strcmp(default_tag, prime) != 0) {
>> + free(default_tag);
>> + goto err;
>> + }
>> +
>> + free(default_tag);
>> + /* we are to get a new fd (render-node) of the same device */
>> is_different_device = 0;
>> - goto default_device_clean;
>> + // XXX: WTF ^^ so one uses the new model only to point to the exact
>> same
>> + // device and not the other more/less powerful GPU ?
>
> This case if when one has in his configuration file that the app should run
> on device XXX, which happens to be the one in use by the compositor.
> This case needed to be handled, and while it may not very seem useful now,
> it could be in the future an interesting case (On wayland, you could have
> the compositor use a card on some screens, and another card on the other,
> etc. In this case it makes sense for the user to specify the card, and it
> may or may not be the card used for the given screen).
>
There's something lost in the translation here:
Currently in case of non DRI_PRIME (i.e. path tag) we dive into
get_render_node_from_id_path_tag(), loop and trigger on !another_tag
&& !strcmp(id_path_tag, id_path_tag_tmp) (another_tag is zero here).
Or in other words the function returns the render node, of the exact
_same_ device. Which makes the whole new method of using pci-...
dubious since one cannot select the 'other' device :-\
That is unless I'm missing something ?
-Emil
More information about the mesa-dev
mailing list