drisw: Fix build on Android Nougat, which lacks shm (v2)
In commitcf54bd5e8, dri_sw_winsys.c began using <sys/shm.h> to support the new functions putImageShm, getImageShm in DRI_SWRastLoader. But Android began supporting System V shared memory only in Oreo. Nougat has no shm headers. Fix the build by ifdef'ing out the shm code on Nougat. Fixes:cf54bd5e8"drisw: use shared memory when possible" Reviewed-by: Dave Airlie <airlied@redhat.com> Cc: Marc-André Lureau <marcandre.lureau@gmail.com>
This commit is contained in:
@@ -26,8 +26,12 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#if !defined(ANDROID) || ANDROID_API_LEVEL >= 26
|
||||
/* Android's libc began supporting shm in Oreo */
|
||||
#define HAVE_SHM
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#endif
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "pipe/p_format.h"
|
||||
@@ -83,6 +87,7 @@ dri_sw_is_displaytarget_format_supported( struct sw_winsys *ws,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef HAVE_SHM
|
||||
static char *
|
||||
alloc_shm(struct dri_sw_displaytarget *dri_sw_dt, unsigned size)
|
||||
{
|
||||
@@ -101,6 +106,7 @@ alloc_shm(struct dri_sw_displaytarget *dri_sw_dt, unsigned size)
|
||||
|
||||
return addr;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct sw_displaytarget *
|
||||
dri_sw_displaytarget_create(struct sw_winsys *winsys,
|
||||
@@ -131,8 +137,11 @@ dri_sw_displaytarget_create(struct sw_winsys *winsys,
|
||||
size = dri_sw_dt->stride * nblocksy;
|
||||
|
||||
dri_sw_dt->shmid = -1;
|
||||
|
||||
#ifdef HAVE_SHM
|
||||
if (ws->lf->put_image_shm)
|
||||
dri_sw_dt->data = alloc_shm(dri_sw_dt, size);
|
||||
#endif
|
||||
|
||||
if(!dri_sw_dt->data)
|
||||
dri_sw_dt->data = align_malloc(size, alignment);
|
||||
@@ -156,8 +165,10 @@ dri_sw_displaytarget_destroy(struct sw_winsys *ws,
|
||||
struct dri_sw_displaytarget *dri_sw_dt = dri_sw_displaytarget(dt);
|
||||
|
||||
if (dri_sw_dt->shmid >= 0) {
|
||||
#ifdef HAVE_SHM
|
||||
shmdt(dri_sw_dt->data);
|
||||
shmctl(dri_sw_dt->shmid, IPC_RMID, 0);
|
||||
#endif
|
||||
} else {
|
||||
align_free(dri_sw_dt->data);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user