I've applied this to libdrm master. Thanks, Dave. On Mon, 26 Oct 2020 at 23:27, Paul Gofman <pgofman@xxxxxxxxxxxxxxx> wrote: > > log() is affected by FP control word and can provide inaccurate result. > > Fixes Killer Instinct under Wine not being able to find AMD vulkan > device. > > Signed-off-by: Paul Gofman <pgofman@xxxxxxxxxxxxxxx> > --- > With the rounding mode the application sets (unsigned int)log2(4) is 1. > The log2_int() implemetation is copied from radeon/radeon_surface.c. > > xf86drm.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-) > > diff --git a/xf86drm.c b/xf86drm.c > index 50a6f092..dbb7c14b 100644 > --- a/xf86drm.c > +++ b/xf86drm.c > @@ -124,6 +124,22 @@ static drmServerInfoPtr drm_server_info; > static bool drmNodeIsDRM(int maj, int min); > static char *drmGetMinorNameForFD(int fd, int type); > > +static unsigned log2_int(unsigned x) > +{ > + unsigned l; > + > + if (x < 2) { > + return 0; > + } > + for (l = 2; ; l++) { > + if ((unsigned)(1 << l) > x) { > + return l - 1; > + } > + } > + return 0; > +} > + > + > drm_public void drmSetServerInfo(drmServerInfoPtr info) > { > drm_server_info = info; > @@ -4001,7 +4017,7 @@ static void drmFoldDuplicatedDevices(drmDevicePtr local_devices[], int count) > for (j = i + 1; j < count; j++) { > if (drmDevicesEqual(local_devices[i], local_devices[j])) { > local_devices[i]->available_nodes |= local_devices[j]->available_nodes; > - node_type = log2(local_devices[j]->available_nodes); > + node_type = log2_int(local_devices[j]->available_nodes); > memcpy(local_devices[i]->nodes[node_type], > local_devices[j]->nodes[node_type], drmGetMaxNodeName()); > drmFreeDevice(&local_devices[j]); > -- > 2.26.2 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel