@@ -124,8 +124,7 @@ static char *xstartup = NULL;
124
124
125
125
typedef struct {
126
126
LorieBuffer * buffer ;
127
- AHardwareBuffer * ahb ;
128
- uint8_t flipped ;
127
+ bool flipped , imported ;
129
128
void * locked ;
130
129
void * mem ;
131
130
} LoriePixmapPriv ;
@@ -806,11 +805,10 @@ void *lorieCreatePixmap(__unused ScreenPtr pScreen, int width, int height, __unu
806
805
void lorieExaDestroyPixmap (__unused ScreenPtr pScreen , void * driverPriv ) {
807
806
LoriePixmapPriv * priv = driverPriv ;
808
807
if (priv -> buffer ) {
809
- LorieBuffer_unlock (priv -> buffer );
808
+ if (!priv -> imported )
809
+ LorieBuffer_unlock (priv -> buffer );
810
810
LorieBuffer_release (priv -> buffer );
811
811
}
812
- if (priv -> ahb )
813
- AHardwareBuffer_release (priv -> ahb );
814
812
free (priv );
815
813
}
816
814
@@ -826,8 +824,8 @@ Bool loriePrepareAccess(PixmapPtr pPix, int index) {
826
824
if (index == EXA_PREPARE_DEST && pScreenPtr -> GetScreenPixmap (pScreenPtr ) == pPix )
827
825
lorie_mutex_lock (& pvfb -> state -> lock , & pvfb -> state -> lockingPid );
828
826
829
- if (priv -> ahb ) {
830
- if (AHardwareBuffer_lock (priv -> ahb , AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN , -1 , NULL , & pPix -> devPrivate .ptr ))
827
+ if (priv -> imported ) {
828
+ if (LorieBuffer_lock (priv -> buffer , & pPix -> devPrivate .ptr ))
831
829
return FALSE;
832
830
} else
833
831
pPix -> devPrivate .ptr = priv -> locked ?: priv -> mem ?: priv + 1 ;
@@ -839,8 +837,8 @@ void lorieFinishAccess(PixmapPtr pPix, int index) {
839
837
if (index == EXA_PREPARE_DEST && pScreenPtr -> GetScreenPixmap (pScreenPtr ) == pPix )
840
838
lorie_mutex_unlock (& pvfb -> state -> lock , & pvfb -> state -> lockingPid );
841
839
842
- if (priv -> ahb )
843
- AHardwareBuffer_unlock (priv -> ahb , NULL );
840
+ if (priv -> imported )
841
+ LorieBuffer_unlock (priv -> buffer );
844
842
}
845
843
846
844
static ExaDriverRec lorieExa = {
@@ -863,7 +861,6 @@ static PixmapPtr loriePixmapFromFds(ScreenPtr screen, CARD8 num_fds, const int *
863
861
AHardwareBuffer_Desc desc = {0 };
864
862
PixmapPtr pixmap = NullPixmap ;
865
863
LoriePixmapPriv * priv = NULL ;
866
- void * addr = NULL ;
867
864
868
865
check (num_fds > 1 , "DRI3: More than 1 fd" );
869
866
check (modifier != RAW_MMAPPABLE_FD && modifier != AHARDWAREBUFFER_SOCKET_FD && modifier != AHARDWAREBUFFER_FLIPPED_SOCKET_FD &&
@@ -875,14 +872,16 @@ static PixmapPtr loriePixmapFromFds(ScreenPtr screen, CARD8 num_fds, const int *
875
872
priv = exaGetPixmapDriverPrivate (pixmap );
876
873
check (!priv , "DRI3: failed to obtain pixmap private" );
877
874
875
+ priv -> imported = true;
876
+
878
877
if (modifier == DRM_FORMAT_MOD_INVALID || modifier == RAW_MMAPPABLE_FD ) {
879
- addr = mmap (NULL , strides [0 ] * height , PROT_READ , MAP_SHARED , fds [0 ], offsets [0 ]);
880
- check (!addr || addr == MAP_FAILED , "DRI3: RAW_MMAPPABLE_FD: mmap failed" );
881
- screen -> ModifyPixmapHeader (pixmap , width , height , 0 , 0 , strides [0 ], addr );
878
+ check (!(priv -> buffer = LorieBuffer_wrapFileDescriptor (width , height , AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM , fds [0 ], offsets [0 ])), "DRI3: LorieBuffer_wrapAHardwareBuffer failed." );
879
+ screen -> ModifyPixmapHeader (pixmap , width , height , 0 , 0 , strides [0 ], NULL );
882
880
return pixmap ;
883
881
}
884
882
885
883
if (modifier == AHARDWAREBUFFER_SOCKET_FD || modifier == AHARDWAREBUFFER_FLIPPED_SOCKET_FD ) {
884
+ AHardwareBuffer * buffer ;
886
885
struct stat info ;
887
886
uint8_t buf = 1 ;
888
887
int r ;
@@ -892,27 +891,22 @@ static PixmapPtr loriePixmapFromFds(ScreenPtr screen, CARD8 num_fds, const int *
892
891
check (!S_ISSOCK (info .st_mode ), "DRI3: modifier is AHARDWAREBUFFER_SOCKET_FD but fd is not a socket" );
893
892
// Sending signal to other end of socket to send buffer.
894
893
check (write (fds [0 ], & buf , 1 ) != 1 , "DRI3: AHARDWAREBUFFER_SOCKET_FD: failed to write to socket: %s" , strerror (errno ));
895
- check ((r = AHardwareBuffer_recvHandleFromUnixSocket (fds [0 ], & priv -> ahb )) != 0 ,
894
+ check ((r = AHardwareBuffer_recvHandleFromUnixSocket (fds [0 ], & buffer )) != 0 ,
896
895
"DRI3: AHARDWAREBUFFER_SOCKET_FD: failed to obtain AHardwareBuffer from socket: %d" , r );
897
- check (!priv -> ahb , "DRI3: AHARDWAREBUFFER_SOCKET_FD: did not receive AHardwareSocket from buffer" );
898
- AHardwareBuffer_describe (priv -> ahb , & desc );
896
+ check (!buffer , "DRI3: AHARDWAREBUFFER_SOCKET_FD: did not receive AHardwareSocket from buffer" );
897
+ AHardwareBuffer_describe (buffer , & desc );
899
898
check (desc .format != AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM
900
899
&& desc .format != AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM
901
900
&& desc .format != AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM ,
902
901
"DRI3: AHARDWAREBUFFER_SOCKET_FD: wrong format of AHardwareBuffer. Must be one of: AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM (stands for 5)." );
902
+ check (!(priv -> buffer = LorieBuffer_wrapAHardwareBuffer (buffer )), "DRI3: LorieBuffer_wrapAHardwareBuffer failed." );
903
903
904
904
screen -> ModifyPixmapHeader (pixmap , desc .width , desc .height , 0 , 0 , desc .stride * 4 , NULL );
905
905
}
906
906
907
907
return pixmap ;
908
908
909
909
fail :
910
- if (priv && priv -> ahb ) {
911
- AHardwareBuffer_release (priv -> ahb );
912
- priv -> ahb = NULL ;
913
- }
914
- if (addr )
915
- munmap (addr , strides [0 ] * height );
916
910
if (pixmap )
917
911
screen -> DestroyPixmap (pixmap );
918
912
0 commit comments