Advertisement
AxelDavy

Experimental Prime Wayland patch (intel/r600/radeonsi)

Aug 3rd, 2013
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.27 KB | None | 0 0
  1. diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
  2. index 1bce314..7e9b683 100644
  3. --- a/src/egl/drivers/dri2/egl_dri2.c
  4. +++ b/src/egl/drivers/dri2/egl_dri2.c
  5. @@ -1573,7 +1573,7 @@ dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
  6. (int(*)(void *, uint32_t)) dri2_dpy->authenticate;
  7.  
  8. ret = drmGetCap(dri2_dpy->fd, DRM_CAP_PRIME, &cap);
  9. - if (ret == 0 && cap == (DRM_PRIME_CAP_IMPORT | DRM_PRIME_CAP_EXPORT) &&
  10. + if (ret == 0 && (cap & DRM_PRIME_CAP_IMPORT) &&
  11. dri2_dpy->image->base.version >= 7 &&
  12. dri2_dpy->image->createImageFromFds != NULL)
  13. flags |= WAYLAND_DRM_PRIME;
  14. diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
  15. index 6dfdf94..aff39b2 100644
  16. --- a/src/egl/drivers/dri2/egl_dri2.h
  17. +++ b/src/egl/drivers/dri2/egl_dri2.h
  18. @@ -133,6 +133,8 @@ struct dri2_egl_display
  19. int authenticated;
  20. int formats;
  21. uint32_t capabilities;
  22. + int use_prime;
  23. + int wanted_id;
  24. #endif
  25.  
  26. int (*authenticate) (_EGLDisplay *disp, uint32_t id);
  27. diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
  28. index 1d417bb..b285ea9 100644
  29. --- a/src/egl/drivers/dri2/platform_wayland.c
  30. +++ b/src/egl/drivers/dri2/platform_wayland.c
  31. @@ -461,9 +461,14 @@ create_wl_buffer(struct dri2_egl_surface *dri2_surf)
  32. if (dri2_surf->current->wl_buffer != NULL)
  33. return;
  34.  
  35. - if (dri2_dpy->capabilities & WL_DRM_CAPABILITY_PRIME) {
  36. + if (dri2_dpy->use_prime) {
  37. + __DRIimage* image = dri2_surf->current->dri_image;
  38. + uint32_t handle;
  39. + int res;
  40. dri2_dpy->image->queryImage(dri2_surf->current->dri_image,
  41. - __DRI_IMAGE_ATTRIB_FD, &fd);
  42. + __DRI_IMAGE_ATTRIB_HANDLE,&handle);
  43. + res=drmPrimeHandleToFD(dri2_dpy->fd,handle,DRM_CLOEXEC,&fd);
  44. + _eglLog(_EGL_WARNING,"res %i:fd: %i, handle: %i",res,fd,handle);
  45.  
  46. dri2_surf->current->wl_buffer =
  47. wl_drm_create_prime_buffer(dri2_dpy->wl_drm,
  48. @@ -632,16 +637,19 @@ dri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
  49. return EGL_TRUE;
  50. }
  51.  
  52. +
  53. +
  54. static void
  55. drm_handle_device(void *data, struct wl_drm *drm, const char *device)
  56. {
  57. struct dri2_egl_display *dri2_dpy = data;
  58. drm_magic_t magic;
  59. -
  60. + if(dri2_dpy->wanted_id != 0)
  61. + return;
  62. dri2_dpy->device_name = strdup(device);
  63. if (!dri2_dpy->device_name)
  64. return;
  65. -
  66. + _eglLog(_EGL_WARNING, "using main card: %s", device);
  67. #ifdef O_CLOEXEC
  68. dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR | O_CLOEXEC);
  69. if (dri2_dpy->fd == -1 && errno == EINVAL)
  70. @@ -691,13 +699,49 @@ drm_handle_authenticated(void *data, struct wl_drm *drm)
  71. struct dri2_egl_display *dri2_dpy = data;
  72.  
  73. dri2_dpy->authenticated = 1;
  74. + if (dri2_dpy->wanted_id != 0)
  75. + dri2_dpy->use_prime = 1;
  76. + else
  77. + dri2_dpy->use_prime = 0;
  78. +}
  79. +
  80. +static void
  81. +drm_handle_prime_device(void *data, struct wl_drm *drm, const char *device, uint32_t id)
  82. +{
  83. + struct dri2_egl_display *dri2_dpy = data;
  84. + drm_magic_t magic;
  85. + if(dri2_dpy->wanted_id != id)
  86. + return;
  87. + dri2_dpy->device_name = strdup(device);
  88. + if (!dri2_dpy->device_name)
  89. + return;
  90. + _eglLog(_EGL_WARNING, "using card: %s", device);
  91. +#ifdef O_CLOEXEC
  92. + dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR | O_CLOEXEC);
  93. + if (dri2_dpy->fd == -1 && errno == EINVAL)
  94. +#endif
  95. + {
  96. + dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR);
  97. + if (dri2_dpy->fd != -1)
  98. + fcntl(dri2_dpy->fd, F_SETFD, fcntl(dri2_dpy->fd, F_GETFD) |
  99. + FD_CLOEXEC);
  100. + }
  101. + if (dri2_dpy->fd == -1) {
  102. + _eglLog(_EGL_WARNING, "wayland-egl: could not open %s (%s)",
  103. + dri2_dpy->device_name, strerror(errno));
  104. + return;
  105. + }
  106. +
  107. + drmGetMagic(dri2_dpy->fd, &magic);
  108. + wl_drm_authenticate(dri2_dpy->wl_drm, magic);
  109. }
  110.  
  111. static const struct wl_drm_listener drm_listener = {
  112. drm_handle_device,
  113. drm_handle_format,
  114. drm_handle_authenticated,
  115. - drm_handle_capabilities
  116. + drm_handle_capabilities,
  117. + drm_handle_prime_device
  118. };
  119.  
  120. static void
  121. @@ -706,8 +750,8 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t name,
  122. {
  123. struct dri2_egl_display *dri2_dpy = data;
  124.  
  125. - if (version > 1)
  126. - version = 2;
  127. + if (version > 2)
  128. + version = 3;
  129. if (strcmp(interface, "wl_drm") == 0) {
  130. dri2_dpy->wl_drm =
  131. wl_registry_bind(registry, name, &wl_drm_interface, version);
  132. @@ -757,7 +801,16 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
  133. } else {
  134. dri2_dpy->wl_dpy = disp->PlatformDisplay;
  135. }
  136. -
  137. +
  138. + dri2_dpy->wanted_id=0;
  139. + {
  140. + char *prime = getenv("DRI_PRIME");
  141. + if (prime)
  142. + {
  143. + dri2_dpy->wanted_id=1; //TODO: if fails, do a second loop with id = 0. (no corresponding id)
  144. + }
  145. + }
  146. +
  147. dri2_dpy->wl_queue = wl_display_create_queue(dri2_dpy->wl_dpy);
  148.  
  149. if (dri2_dpy->own_device)
  150. diff --git a/src/egl/wayland/wayland-drm/Makefile.am b/src/egl/wayland/wayland-drm/Makefile.am
  151. index 4b2aeb3..66f7a08 100644
  152. --- a/src/egl/wayland/wayland-drm/Makefile.am
  153. +++ b/src/egl/wayland/wayland-drm/Makefile.am
  154. @@ -1,6 +1,8 @@
  155. AM_CFLAGS = -I$(top_srcdir)/src/egl/main \
  156. -I$(top_srcdir)/include \
  157. $(DEFINES) \
  158. + $(LIBDRM_CFLAGS) \
  159. + $(LIBUDEV_CFLAGS) \
  160. $(WAYLAND_CFLAGS)
  161.  
  162. noinst_LTLIBRARIES = libwayland-drm.la
  163. diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c
  164. index 7e2073a..d9a7b46 100644
  165. --- a/src/egl/wayland/wayland-drm/wayland-drm.c
  166. +++ b/src/egl/wayland/wayland-drm/wayland-drm.c
  167. @@ -25,6 +25,7 @@
  168. * Authors:
  169. * Kristian Høgsberg <krh@bitplanet.net>
  170. * Benjamin Franzke <benjaminfranzke@googlemail.com>
  171. + * Axel Davy
  172. */
  173.  
  174. #include <stdio.h>
  175. @@ -32,21 +33,133 @@
  176. #include <string.h>
  177. #include <stddef.h>
  178. #include <unistd.h>
  179. +#include <errno.h>
  180. +#include <c99/stdbool.h>
  181. +#include <xf86drm.h>
  182. +#include <fcntl.h>
  183. +#include <dlfcn.h>
  184.  
  185. #include <wayland-server.h>
  186. #include "wayland-drm.h"
  187. #include "wayland-drm-server-protocol.h"
  188.  
  189. +
  190. +struct prime_device{
  191. + char* device_name;
  192. + uint32_t id;
  193. + int fd;
  194. + bool opened;
  195. + bool is_master;
  196. + struct prime_device* next_prime_device;
  197. + struct prime_device* prec_prime_device; //doubly linked list
  198. +};
  199. +
  200. struct wl_drm {
  201. struct wl_display *display;
  202.  
  203. void *user_data;
  204. - char *device_name;
  205. - uint32_t flags;
  206. + char *main_device_name;
  207. + uint32_t main_device_flags;
  208. +
  209. + struct prime_device *prime_devices;
  210.  
  211. struct wayland_drm_callbacks *callbacks;
  212. };
  213.  
  214. +static bool device_be_master(struct prime_device *prime_device) // assumes device is open
  215. +{
  216. + if(drmSetMaster(prime_device->fd)==0) // will work if we are already master
  217. + {
  218. + prime_device->is_master=true;
  219. + return true;
  220. + }
  221. + return false;
  222. +
  223. +}
  224. +
  225. +static int hashBusid(char* str)
  226. +{
  227. + return 1; //TODO
  228. +}
  229. +
  230. +
  231. +
  232. +static bool open_device(struct prime_device *prime_device)
  233. +{
  234. + uint64_t cap;
  235. + #ifdef O_CLOEXEC
  236. + prime_device->fd = open(prime_device->device_name, O_RDWR | O_CLOEXEC);
  237. + if (prime_device->fd == -1 && errno == EINVAL)
  238. + #endif
  239. + {
  240. + prime_device->fd = open(prime_device->device_name, O_RDWR);
  241. + if (prime_device->fd != -1)
  242. + fcntl(prime_device->fd, F_SETFD, fcntl(prime_device->fd, F_GETFD) |
  243. + FD_CLOEXEC);
  244. + }
  245. +
  246. + if (prime_device->fd == -1)
  247. + return false;
  248. +
  249. +
  250. + drmGetCap(prime_device->fd, DRM_CAP_PRIME, &cap); // maybe should test if it fails (old kernel)
  251. + if (!(cap & DRM_PRIME_CAP_EXPORT))
  252. + {
  253. + close(prime_device->fd);
  254. + return false;
  255. + }
  256. + prime_device->opened = true;
  257. + prime_device->id = hashBusid(drmGetBusid(prime_device->fd));
  258. + return true; // we don't become master of the device yet, we will do it only when required.
  259. +}
  260. +
  261. +
  262. +static void discover_prime_devices(struct wl_drm *drm)
  263. +{
  264. +//TODO
  265. + // ADD main_device. already master. already opened.
  266. + drm->prime_devices = (struct prime_device*) malloc(sizeof(struct prime_device));
  267. + drm->prime_devices->device_name = strdup(drm->main_device_name);
  268. + drm->prime_devices->id = 0; //TODO
  269. + drm->prime_devices->fd = -1;//drm->fd;
  270. + drm->prime_devices->opened = true;
  271. + drm->prime_devices->is_master = true;
  272. + drm->prime_devices->next_prime_device = NULL;
  273. + drm->prime_devices->prec_prime_device = NULL;
  274. +
  275. + //ADD other devices
  276. + struct prime_device* p = (struct prime_device*) malloc(sizeof(struct prime_device));
  277. + if (strcmp("/dev/dri/card0",drm->main_device_name) == 0)
  278. + p->device_name = strdup("/dev/dri/card1");
  279. + else
  280. + p->device_name = strdup("/dev/dri/card0");
  281. + p->opened = false;
  282. + p->is_master = false;
  283. + p->next_prime_device = NULL;
  284. + p->prec_prime_device = drm->prime_devices;
  285. + if (open_device(p))
  286. + drm->prime_devices->next_prime_device = p;
  287. + else
  288. + {
  289. + free(p->device_name);
  290. + free(p);
  291. + }
  292. + return;
  293. +
  294. +}
  295. +
  296. +static bool authenticate_prime_devices(struct prime_device *prime_devices, uint32_t id)
  297. +{
  298. + struct prime_device * p = prime_devices;
  299. + while (p!=NULL)
  300. + {
  301. + if ((p->id !=0) && (p->opened || open_device(p) ) && (p->is_master || device_be_master(p)) && (drmAuthMagic(p->fd,id)==0))
  302. + return true;
  303. + p = p->next_prime_device;
  304. + }
  305. +return false;
  306. +}
  307. +
  308. static void
  309. destroy_buffer(struct wl_resource *resource)
  310. {
  311. @@ -67,6 +180,7 @@ const static struct wl_buffer_interface drm_buffer_interface = {
  312. buffer_destroy
  313. };
  314.  
  315. +
  316. static void
  317. create_buffer(struct wl_client *client, struct wl_resource *resource,
  318. uint32_t id, uint32_t name, int fd,
  319. @@ -180,13 +294,15 @@ drm_create_prime_buffer(struct wl_client *client,
  320. close(fd);
  321. }
  322.  
  323. +
  324. +
  325. static void
  326. drm_authenticate(struct wl_client *client,
  327. struct wl_resource *resource, uint32_t id)
  328. {
  329. struct wl_drm *drm = resource->data;
  330.  
  331. - if (drm->callbacks->authenticate(drm->user_data, id) < 0)
  332. + if (drm->callbacks->authenticate(drm->user_data, id) < 0 && !(authenticate_prime_devices(drm->prime_devices,id)))
  333. wl_resource_post_error(resource,
  334. WL_DRM_ERROR_AUTHENTICATE_FAIL,
  335. "authenicate failed");
  336. @@ -194,6 +310,8 @@ drm_authenticate(struct wl_client *client,
  337. wl_resource_post_event(resource, WL_DRM_AUTHENTICATED);
  338. }
  339.  
  340. +
  341. +
  342. const static struct wl_drm_interface drm_interface = {
  343. drm_authenticate,
  344. drm_create_buffer,
  345. @@ -210,7 +328,7 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id)
  346.  
  347. resource = wl_client_add_object(client, &wl_drm_interface,
  348. &drm_interface, id, data);
  349. - wl_resource_post_event(resource, WL_DRM_DEVICE, drm->device_name);
  350. + wl_resource_post_event(resource, WL_DRM_DEVICE, drm->main_device_name);
  351. wl_resource_post_event(resource, WL_DRM_FORMAT,
  352. WL_DRM_FORMAT_ARGB8888);
  353. wl_resource_post_event(resource, WL_DRM_FORMAT,
  354. @@ -225,8 +343,20 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id)
  355. wl_resource_post_event(resource, WL_DRM_FORMAT, WL_DRM_FORMAT_YUYV);
  356.  
  357. capabilities = 0;
  358. - if (drm->flags & WAYLAND_DRM_PRIME)
  359. - capabilities |= WL_DRM_CAPABILITY_PRIME;
  360. + if (drm->main_device_flags & WAYLAND_DRM_PRIME)
  361. + {
  362. + capabilities |= WL_DRM_CAPABILITY_PRIME;
  363. + if (version >= 3)
  364. + {
  365. + struct prime_device* p = drm->prime_devices;
  366. + while (p!=NULL)
  367. + {
  368. + if(p->id!=0) // fix: already advertised main device
  369. + wl_resource_post_event(resource, WL_DRM_PRIME_DEVICE, p->device_name, p->id);
  370. + p = p->next_prime_device;
  371. + }
  372. + }
  373. + }
  374.  
  375. if (version >= 2)
  376. wl_resource_post_event(resource, WL_DRM_CAPABILITIES, capabilities);
  377. @@ -242,10 +372,12 @@ wayland_drm_init(struct wl_display *display, char *device_name,
  378. drm = malloc(sizeof *drm);
  379.  
  380. drm->display = display;
  381. - drm->device_name = strdup(device_name);
  382. + drm->main_device_name = strdup(device_name);
  383. drm->callbacks = callbacks;
  384. drm->user_data = user_data;
  385. - drm->flags = flags;
  386. + drm->main_device_flags = flags; //drmGetCap(fd,DRM_CAP_PRIME,&p) DRM_PRIME_CAP_IMPORT
  387. + if (flags & WAYLAND_DRM_PRIME)
  388. + discover_prime_devices(drm);
  389.  
  390. wl_display_add_global(display, &wl_drm_interface, drm, bind_drm);
  391.  
  392. @@ -255,8 +387,28 @@ wayland_drm_init(struct wl_display *display, char *device_name,
  393. void
  394. wayland_drm_uninit(struct wl_drm *drm)
  395. {
  396. - free(drm->device_name);
  397. -
  398. + free(drm->main_device_name);
  399. + struct prime_device * p = drm->prime_devices;
  400. + struct prime_device * p_last = drm->prime_devices;
  401. + while (p!=NULL)
  402. + {
  403. + if (p->opened && p->id !=0) // do not close main_device todo
  404. + {
  405. + if (p->is_master)
  406. + drmDropMaster(p->fd);
  407. + close(p->fd);
  408. + }
  409. + free(p->device_name);
  410. + p_last = p;
  411. + p = p->next_prime_device;
  412. + }
  413. + while (p_last!=NULL)
  414. + {
  415. + struct prime_device * p_temp = p->prec_prime_device;
  416. + free(p_last);
  417. + p_last = p_temp;
  418. + }
  419. +
  420. /* FIXME: need wl_display_del_{object,global} */
  421.  
  422. free(drm);
  423. diff --git a/src/egl/wayland/wayland-drm/wayland-drm.h b/src/egl/wayland/wayland-drm/wayland-drm.h
  424. index 335073a..1450ea4 100644
  425. --- a/src/egl/wayland/wayland-drm/wayland-drm.h
  426. +++ b/src/egl/wayland/wayland-drm/wayland-drm.h
  427. @@ -2,6 +2,8 @@
  428. #define WAYLAND_DRM_H
  429.  
  430. #include <wayland-server.h>
  431. +#include <c99/stdbool.h>
  432. +
  433.  
  434. #ifndef WL_DRM_FORMAT_ENUM
  435. #define WL_DRM_FORMAT_ENUM
  436. @@ -68,6 +70,7 @@ enum wl_drm_format {
  437. #endif /* WL_DRM_FORMAT_ENUM */
  438.  
  439. struct wl_drm;
  440. +struct prime_device;
  441.  
  442. struct wl_drm_buffer {
  443. struct wl_buffer buffer;
  444. @@ -79,6 +82,7 @@ struct wl_drm_buffer {
  445. void *driver_buffer;
  446. };
  447.  
  448. +
  449. struct wayland_drm_callbacks {
  450. int (*authenticate)(void *user_data, uint32_t id);
  451.  
  452. @@ -88,7 +92,8 @@ struct wayland_drm_callbacks {
  453. void (*release_buffer)(void *user_data, struct wl_drm_buffer *buffer);
  454. };
  455.  
  456. -enum { WAYLAND_DRM_PRIME = 0x01 };
  457. +enum { WAYLAND_DRM_PRIME = 0x01};
  458. +
  459.  
  460. struct wl_drm *
  461. wayland_drm_init(struct wl_display *display, char *device_name,
  462. @@ -107,4 +112,9 @@ wayland_drm_buffer_get_format(struct wl_buffer *buffer_base);
  463. void *
  464. wayland_drm_buffer_get_buffer(struct wl_buffer *buffer);
  465.  
  466. +static bool open_device(struct prime_device *prime_device);
  467. +static void discover_prime_devices(struct wl_drm *drm);
  468. +static int hashBusid(char* str);
  469. +static bool authenticate_prime_devices(struct prime_device *prime_devices, uint32_t id);
  470. +
  471. #endif
  472. diff --git a/src/egl/wayland/wayland-drm/wayland-drm.xml b/src/egl/wayland/wayland-drm/wayland-drm.xml
  473. index 8a3ad69..64987a6 100644
  474. --- a/src/egl/wayland/wayland-drm/wayland-drm.xml
  475. +++ b/src/egl/wayland/wayland-drm/wayland-drm.xml
  476. @@ -29,7 +29,7 @@
  477.  
  478. <!-- drm support. This object is created by the server and published
  479. using the display's global event. -->
  480. - <interface name="wl_drm" version="2">
  481. + <interface name="wl_drm" version="3">
  482. <enum name="error">
  483. <entry name="authenticate_fail" value="0"/>
  484. <entry name="invalid_format" value="1"/>
  485. @@ -150,16 +150,17 @@
  486. <arg name="offset2" type="int"/>
  487. <arg name="stride2" type="int"/>
  488. </request>
  489. -
  490. +
  491. <!-- Notification of the path of the drm device which is used by
  492. the server. The client should use this device for creating
  493. local buffers. Only buffers created from this device should
  494. be be passed to the server using this drm object's
  495. create_buffer request. -->
  496. +
  497. <event name="device">
  498. <arg name="name" type="string"/>
  499. </event>
  500. -
  501. +
  502. <event name="format">
  503. <arg name="format" type="uint"/>
  504. </event>
  505. @@ -177,6 +178,11 @@
  506. <event name="capabilities">
  507. <arg name="value" type="uint"/>
  508. </event>
  509. +
  510. + <event name="prime_device">
  511. + <arg name="name" type="string"/>
  512. + <arg name="id" type="uint"/>
  513. + </event>
  514. </interface>
  515.  
  516. </protocol>
  517. diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
  518. index 36cca17..c5eb95c 100644
  519. --- a/src/gallium/drivers/r600/r600_texture.c
  520. +++ b/src/gallium/drivers/r600/r600_texture.c
  521. @@ -609,6 +609,7 @@ struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
  522. * because 422 formats are used for videos, which prefer linear buffers
  523. * for fast uploads anyway. */
  524. if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER) &&
  525. + !(templ->bind & PIPE_BIND_SHARED) &&
  526. desc->layout != UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
  527. if (templ->flags & R600_RESOURCE_FLAG_FORCE_TILING) {
  528. array_mode = V_038000_ARRAY_2D_TILED_THIN1;
  529. diff --git a/src/gallium/drivers/radeonsi/r600_texture.c b/src/gallium/drivers/radeonsi/r600_texture.c
  530. index 282d4f2..3cbe34b 100644
  531. --- a/src/gallium/drivers/radeonsi/r600_texture.c
  532. +++ b/src/gallium/drivers/radeonsi/r600_texture.c
  533. @@ -528,7 +528,7 @@ struct pipe_resource *si_texture_create(struct pipe_screen *screen,
  534. int r;
  535.  
  536. if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER) &&
  537. - !(templ->bind & PIPE_BIND_SCANOUT)) {
  538. + !(templ->bind & (PIPE_BIND_SCANOUT| PIPE_BIND_SHARED))) {
  539. if (util_format_is_compressed(templ->format)) {
  540. array_mode = V_009910_ARRAY_1D_TILED_THIN1;
  541. } else {
  542. diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
  543. index 1dcc1f7..7ef8d15 100644
  544. --- a/src/gallium/state_trackers/dri/drm/dri2.c
  545. +++ b/src/gallium/state_trackers/dri/drm/dri2.c
  546. @@ -627,7 +627,7 @@ dri2_create_image(__DRIscreen *_screen,
  547. if (use & __DRI_IMAGE_USE_SCANOUT)
  548. tex_usage |= PIPE_BIND_SCANOUT;
  549. if (use & __DRI_IMAGE_USE_SHARE)
  550. - tex_usage |= PIPE_BIND_SHARED;
  551. + tex_usage |= PIPE_BIND_SHARED ;
  552. if (use & __DRI_IMAGE_USE_CURSOR) {
  553. if (width != 64 || height != 64)
  554. return NULL;
  555. @@ -721,6 +721,13 @@ dri2_query_image(__DRIimage *image, int attrib, int *value)
  556. return GL_FALSE;
  557. *value = image->dri_components;
  558. return GL_TRUE;
  559. + /* case __DRI_IMAGE_ATTRIB_FD:
  560. + whandle.type = DRM_API_HANDLE_TYPE_KMS;
  561. + image->texture->screen->resource_get_handle(image->texture->screen,
  562. + image->texture, &whandle);
  563. + if(drmPrimeHandleToFD(dri2_dpy->fd,whandle.handle,DRM_CLOEXEC,value)==0)
  564. + return GL_TRUE;
  565. + return GL_FALSE;*/
  566. default:
  567. return GL_FALSE;
  568. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement