diff --git a/0000-saa-Build-compatibility-with-xserver-1.20.patch b/0000-saa-Build-compatibility-with-xserver-1.20.patch new file mode 100644 index 0000000000000000000000000000000000000000..924add873c153db28daf2742927d0e2655c52667 --- /dev/null +++ b/0000-saa-Build-compatibility-with-xserver-1.20.patch @@ -0,0 +1,32 @@ +From 7e5237dd08f2a469d0bc699cbcde763cc93c7407 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Tue, 7 Nov 2017 15:42:59 -0500 +Subject: [PATCH xf86-video-vmware] saa: Build compatibility with xserver 1.20 + +fbGetRotatedPixmap went away with 24bpp support, just treat it as NULL +and we'll do the right thing. + +Signed-off-by: Adam Jackson +--- + saa/saa.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/saa/saa.c b/saa/saa.c +index be9520e..d956853 100644 +--- a/saa/saa.c ++++ b/saa/saa.c +@@ -370,6 +370,11 @@ saa_op_reads_destination(CARD8 op) + } + } + ++/* compatibility with xserver >= 1.20 */ ++#ifndef fbGetRotatedPixmap ++#define fbGetRotatedPixmap(pGC) NULL ++#endif ++ + static void + saa_validate_gc(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable) + { +-- +2.16.2 + diff --git a/0001-vmwgfx-Fix-XVideo-memory-leaks.patch b/0001-vmwgfx-Fix-XVideo-memory-leaks.patch new file mode 100644 index 0000000000000000000000000000000000000000..30b111f4304afc480eb711104c965a3853d39f88 --- /dev/null +++ b/0001-vmwgfx-Fix-XVideo-memory-leaks.patch @@ -0,0 +1,162 @@ +From 4ec3d67da829f4e7a35ab08427002b9d7e4e5f4b Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom +Date: Tue, 27 Nov 2018 16:20:32 +0100 +Subject: [PATCH 02/11] vmwgfx: Fix XVideo memory leaks + +We were not properly freeing the port privates. +In order to access those at CloseScreen time, don't free the adaptor pointers +at XV screen init, but hold on to them until CloseScreen. + +Also properly free the new_adaptors pointer. + +Signed-off-by: Thomas Hellstrom +Reviewed-by: Brian Paul +--- + vmwgfx/vmwgfx_driver.c | 2 ++ + vmwgfx/vmwgfx_driver.h | 9 +++++++- + vmwgfx/vmwgfx_overlay.c | 11 ++++------ + vmwgfx/vmwgfx_tex_video.c | 44 ++++++++++++++++++++++++++------------- + 4 files changed, 44 insertions(+), 22 deletions(-) + +diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c +index 665f620..ccddb6f 100644 +--- a/vmwgfx/vmwgfx_driver.c ++++ b/vmwgfx/vmwgfx_driver.c +@@ -1327,6 +1327,8 @@ drv_close_screen(CLOSE_SCREEN_ARGS_DECL) + pScrn->LeaveVT(VT_FUNC_ARGS); + + vmwgfx_uevent_fini(pScrn, ms); ++ vmw_xv_close(pScreen); ++ + pScrn->vtSema = FALSE; + + vmwgfx_unwrap(ms, pScrn, EnterVT); +diff --git a/vmwgfx/vmwgfx_driver.h b/vmwgfx/vmwgfx_driver.h +index 05abebe..cfd2ed2 100644 +--- a/vmwgfx/vmwgfx_driver.h ++++ b/vmwgfx/vmwgfx_driver.h +@@ -157,6 +157,11 @@ typedef struct _modesettingRec + Bool xa_dri3; + Bool dri3_available; + #endif ++ ++ /* Video */ ++ XF86VideoAdaptorPtr overlay; ++ XF86VideoAdaptorPtr textured; ++ + } modesettingRec, *modesettingPtr; + + #define modesettingPTR(p) ((modesettingPtr)((p)->driverPrivate)) +@@ -231,7 +236,9 @@ xorg_xv_init(ScreenPtr pScreen); + XF86VideoAdaptorPtr + vmw_video_init_adaptor(ScrnInfoPtr pScrn); + void +-vmw_video_free_adaptor(XF86VideoAdaptorPtr adaptor, Bool free_ports); ++vmw_video_free_adaptor(XF86VideoAdaptorPtr adaptor); ++void ++vmw_xv_close(ScreenPtr pScreen); + + void + vmw_ctrl_ext_init(ScrnInfoPtr pScrn); +diff --git a/vmwgfx/vmwgfx_overlay.c b/vmwgfx/vmwgfx_overlay.c +index c35cebd..94d738c 100644 +--- a/vmwgfx/vmwgfx_overlay.c ++++ b/vmwgfx/vmwgfx_overlay.c +@@ -258,15 +258,12 @@ vmwgfx_overlay_port_create(int drm_fd, ScreenPtr pScreen) + } + + void +-vmw_video_free_adaptor(XF86VideoAdaptorPtr adaptor, Bool free_ports) ++vmw_video_free_adaptor(XF86VideoAdaptorPtr adaptor) + { +- if (free_ports) { +- int i; ++ int i; + +- for(i=0; inPorts; ++i) { +- free(adaptor->pPortPrivates[i].ptr); +- } +- } ++ for (i = 0; i < adaptor->nPorts; ++i) ++ free(adaptor->pPortPrivates[i].ptr); + + free(adaptor->pPortPrivates); + xf86XVFreeVideoAdaptorRec(adaptor); +diff --git a/vmwgfx/vmwgfx_tex_video.c b/vmwgfx/vmwgfx_tex_video.c +index e42a4c6..acc2b56 100644 +--- a/vmwgfx/vmwgfx_tex_video.c ++++ b/vmwgfx/vmwgfx_tex_video.c +@@ -904,15 +904,12 @@ port_priv_create(struct xa_tracker *xat, struct xa_context *r, + } + + static void +-vmwgfx_free_textured_adaptor(XF86VideoAdaptorPtr adaptor, Bool free_ports) ++vmwgfx_free_textured_adaptor(XF86VideoAdaptorPtr adaptor) + { +- if (free_ports) { +- int i; ++ int i; + +- for(i=0; inPorts; ++i) { +- free(adaptor->pPortPrivates[i].ptr); +- } +- } ++ for (i = 0; i < adaptor->nPorts; ++i) ++ free(adaptor->pPortPrivates[i].ptr); + + free(adaptor->pAttributes); + free(adaptor->pPortPrivates); +@@ -986,6 +983,23 @@ xorg_setup_textured_adapter(ScreenPtr pScreen) + return adapt; + } + ++void ++vmw_xv_close(ScreenPtr pScreen) ++{ ++ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ++ modesettingPtr ms = modesettingPTR(pScrn); ++ ++ if (ms->overlay) { ++ vmw_video_free_adaptor(ms->overlay); ++ ms->overlay = NULL; ++ } ++ ++ if (ms->textured) { ++ vmwgfx_free_textured_adaptor(ms->textured); ++ ms->textured = NULL; ++ } ++} ++ + void + xorg_xv_init(ScreenPtr pScreen) + { +@@ -1025,17 +1039,19 @@ xorg_xv_init(ScreenPtr pScreen) + adaptors[num_adaptors++] = overlay_adaptor; + + if (num_adaptors) { +- Bool ret; +- ret = xf86XVScreenInit(pScreen, adaptors, num_adaptors); +- if (textured_adapter) +- vmwgfx_free_textured_adaptor(textured_adapter, !ret); +- if (overlay_adaptor) +- vmw_video_free_adaptor(overlay_adaptor, !ret); +- if (!ret) ++ if (xf86XVScreenInit(pScreen, adaptors, num_adaptors)) { ++ ms->overlay = overlay_adaptor; ++ ms->textured = textured_adapter; ++ } else { ++ ms->overlay = NULL; ++ ms->textured = NULL; + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to initialize Xv.\n"); ++ } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Disabling Xv because no adaptors could be initialized.\n"); + } ++ ++ free(new_adaptors); + } +-- +2.23.0 + diff --git a/0002-vmwgfx-Fix-a-memory-leak.patch b/0002-vmwgfx-Fix-a-memory-leak.patch new file mode 100644 index 0000000000000000000000000000000000000000..13c3b175c4a25979975a3e4245efc15a25c2d1e4 --- /dev/null +++ b/0002-vmwgfx-Fix-a-memory-leak.patch @@ -0,0 +1,28 @@ +From 0b34df288f0e163750962e0e59f5e329642ca457 Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom +Date: Tue, 27 Nov 2018 16:36:21 +0100 +Subject: [PATCH 03/11] vmwgfx: Fix a memory leak + +We were leaking a pointer to a drm encoder. + +Signed-off-by: Thomas Hellstrom +Reviewed-by: Brian Paul +--- + vmwgfx/vmwgfx_output.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/vmwgfx/vmwgfx_output.c b/vmwgfx/vmwgfx_output.c +index ec31e2c..f589226 100644 +--- a/vmwgfx/vmwgfx_output.c ++++ b/vmwgfx/vmwgfx_output.c +@@ -642,6 +642,7 @@ xorg_output_init(ScrnInfoPtr pScrn) + if (drm_encoder) { + output->possible_crtcs = drm_encoder->possible_crtcs; + output->possible_clones = drm_encoder->possible_clones; ++ drmModeFreeEncoder(drm_encoder); + } else { + output->possible_crtcs = 0; + output->possible_clones = 0; +-- +2.23.0 + diff --git a/0003-vmwgfx-Fix-invalid-memory-accesses-in-CloseScreen.patch b/0003-vmwgfx-Fix-invalid-memory-accesses-in-CloseScreen.patch new file mode 100644 index 0000000000000000000000000000000000000000..f70a56c4be940bc3b803419407ad29b83b9ff1b6 --- /dev/null +++ b/0003-vmwgfx-Fix-invalid-memory-accesses-in-CloseScreen.patch @@ -0,0 +1,44 @@ +From d31e8e77e1453c26a02f24b26d96b4660d29e1df Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom +Date: Tue, 27 Nov 2018 08:37:13 +0100 +Subject: [PATCH 06/11] vmwgfx: Fix invalid memory accesses in CloseScreen + +Some of the CloseScreen callbacks were referencing XA objects so move the +destruction of the XA state tracker to the end of drv_close_screen to avoid +referencing freed resources. + +Signed-off-by: Thomas Hellstrom +Reviewed-by: Deepak Rawat +--- + vmwgfx/vmwgfx_driver.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c +index ccddb6f..e5f0caf 100644 +--- a/vmwgfx/vmwgfx_driver.c ++++ b/vmwgfx/vmwgfx_driver.c +@@ -1314,6 +1314,7 @@ drv_close_screen(CLOSE_SCREEN_ARGS_DECL) + { + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); + modesettingPtr ms = modesettingPTR(pScrn); ++ Bool ret; + + if (ms->cursor) { + FreeCursor(ms->cursor, None); +@@ -1339,10 +1340,12 @@ drv_close_screen(CLOSE_SCREEN_ARGS_DECL) + vmwgfx_unwrap(ms, pScreen, BlockHandler); + vmwgfx_unwrap(ms, pScreen, CreateScreenResources); + ++ ret = (*pScreen->CloseScreen) (CLOSE_SCREEN_ARGS); ++ + if (ms->xat) + xa_tracker_destroy(ms->xat); + +- return (*pScreen->CloseScreen) (CLOSE_SCREEN_ARGS); ++ return ret; + } + + static ModeStatus +-- +2.23.0 + diff --git a/1000-fix-build-gcc-12.patch b/1000-fix-build-gcc-12.patch new file mode 100644 index 0000000000000000000000000000000000000000..770f23ef0770b9cad1fa1f3e62e55e0c9fdfbcd6 --- /dev/null +++ b/1000-fix-build-gcc-12.patch @@ -0,0 +1,25 @@ +From c656ebe5ca535bf34a146c1fa44982660da0e8ab Mon Sep 17 00:00:00 2001 +From: happy_orange +Date: Fri, 22 Apr 2022 04:34:17 -0400 +Subject: [PATCH] fix build gcc 12 +issue: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vmware/-/issues/9 +--- + vmwgfx/vmwgfx_tex_video.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vmwgfx/vmwgfx_tex_video.c b/vmwgfx/vmwgfx_tex_video.c +index acc2b56..480a5f1 100644 +--- a/vmwgfx/vmwgfx_tex_video.c ++++ b/vmwgfx/vmwgfx_tex_video.c +@@ -237,7 +237,7 @@ stop_video(ScrnInfoPtr pScrn, pointer data, Bool shutdown) + + for (i=0; i<3; ++i) { + for (j=0; j<2; ++j) { +- if (priv->yuv[i]) { ++ if (priv->yuv[j][i]) { + xa_surface_destroy(priv->yuv[j][i]); + priv->yuv[j][i] = NULL; + } +-- +2.27.0 + diff --git a/xf86-video-vmware-13.3.0.tar.bz2 b/xf86-video-vmware-13.3.0.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..39e60fdba5c648f557e257e8a18f1a035356ac6d Binary files /dev/null and b/xf86-video-vmware-13.3.0.tar.bz2 differ diff --git a/xorg-x11-drv-vmware.spec b/xorg-x11-drv-vmware.spec new file mode 100644 index 0000000000000000000000000000000000000000..d618c8881c17c0bc96550056f388c0c47ae05fa2 --- /dev/null +++ b/xorg-x11-drv-vmware.spec @@ -0,0 +1,54 @@ +%define anolis_release 1 +%undefine _hardened_build +%global moduledir %(pkg-config xorg-server --variable=moduledir ) +%global driverdir %{moduledir}/drivers + +Name: xorg-x11-drv-vmware +Version: 13.3.0 +Release: %{anolis_release}%{?dist} +Summary: Xorg X11 vmware video driver + +License: MIT +URL: http://www.x.org +Source0: https://ftp.x.org/pub/individual/driver/xf86-video-vmware-%{version}.tar.bz2 + +Patch0: 0000-saa-Build-compatibility-with-xserver-1.20.patch +Patch1: 0001-vmwgfx-Fix-XVideo-memory-leaks.patch +Patch2: 0002-vmwgfx-Fix-a-memory-leak.patch +Patch3: 0003-vmwgfx-Fix-invalid-memory-accesses-in-CloseScreen.patch +Patch1000: 1000-fix-build-gcc-12.patch + +ExclusiveArch: x86_64 + +BuildRequires: make +BuildRequires: autoconf automake libtool +BuildRequires: xorg-x11-server-devel >= 1.10.99.902 +BuildRequires: libdrm-devel pkgconfig(xext) pkgconfig(x11) +BuildRequires: mesa-libxatracker-devel >= 8.0.1 +BuildRequires: systemd-devel +Requires: Xorg %(xserver-sdk-abi-requires ansic) +Requires: Xorg %(xserver-sdk-abi-requires videodrv) +Requires: libxatracker >= 8.0.1 + +%description +X.Org X11 vmware video driver. + +%prep +%autosetup -n xf86-video-vmware-%{version} -p1 + +%build +autoreconf -v --install || exit 1 +%configure --disable-static +make %{?_smp_mflags} + +%install +%make_install +find $RPM_BUILD_ROOT -regex ".*\.la$" | xargs rm -f -- + +%files +%{driverdir}/vmware_drv.so +%{_mandir}/man4/vmware.4* + +%changelog +* Fri Apr 22 2022 happy_orange - 13.3.0-1 +- Init package from upstream