Author: renodr
Date: Wed Jan 29 12:07:07 2020
New Revision: 4056

Log:
Add the vmwgfx patch

Added:
   trunk/mesa/mesa-19.3.3-fix_svga_vmwgfx_segfaults-1.patch

Added: trunk/mesa/mesa-19.3.3-fix_svga_vmwgfx_segfaults-1.patch
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ trunk/mesa/mesa-19.3.3-fix_svga_vmwgfx_segfaults-1.patch    Wed Jan 29 
12:07:07 2020        (r4056)
@@ -0,0 +1,207 @@
+Submitted By:            Douglas R. Reno <renodr at linuxfromscratch dot org>
+Date:                    2020-01-29
+Initial Package Version: 19.3.3
+Origin:                  Upstream (MR 3614) + Self
+Description:             Fixes a Xorg Segmentation Fault when using Xorg under
+                         VMWare Workstation (or any device that uses the SVGA
+                         driver). This also adapts it to driver changes in
+                         Linux 5.3+ for allowing OpenGL 4.5/4.6/Vulkan 1.1 to
+                         function in the VMWare DRM driver. This also fixes
+                         several graphical glitches and bugs that have been
+                         present since Mesa-19.2.0 (with the introduction of
+                         OpenGL-4.5).
+
+diff -Naurp mesa-19.3.3.orig/src/gallium/auxiliary/util/u_debug_flush.c 
mesa-19.3.3/src/gallium/auxiliary/util/u_debug_flush.c
+--- mesa-19.3.3.orig/src/gallium/auxiliary/util/u_debug_flush.c        
2020-01-28 13:07:35.000000000 -0600
++++ mesa-19.3.3/src/gallium/auxiliary/util/u_debug_flush.c     2020-01-29 
12:58:56.174774458 -0600
+@@ -51,7 +51,7 @@
+ #include <stdio.h>
+ 
+ /* Future improvement: Use realloc instead? */
+-#define DEBUG_FLUSH_MAP_DEPTH 16
++#define DEBUG_FLUSH_MAP_DEPTH 32
+ 
+ struct debug_map_item {
+    struct debug_stack_frame *frame;
+diff -Naurp mesa-19.3.3.orig/src/gallium/drivers/svga/svga_format.c 
mesa-19.3.3/src/gallium/drivers/svga/svga_format.c
+--- mesa-19.3.3.orig/src/gallium/drivers/svga/svga_format.c    2020-01-28 
13:07:35.000000000 -0600
++++ mesa-19.3.3/src/gallium/drivers/svga/svga_format.c 2020-01-29 
12:57:54.040459005 -0600
+@@ -207,6 +207,7 @@ static const struct vgpu10_format_entry
+    [ PIPE_FORMAT_L32_SINT ] =              { SVGA3D_FORMAT_INVALID,      
SVGA3D_FORMAT_INVALID,       SVGA3D_R32_SINT,             TF_XXX1 },
+    [ PIPE_FORMAT_L32A32_SINT ] =           { SVGA3D_FORMAT_INVALID,      
SVGA3D_FORMAT_INVALID,       SVGA3D_R32G32_SINT,          TF_XXXY },
+    [ PIPE_FORMAT_R10G10B10A2_UINT ] =      { SVGA3D_R10G10B10A2_UINT,    
SVGA3D_R10G10B10A2_UINT,     SVGA3D_R10G10B10A2_UINT,     0 },
++   [ PIPE_FORMAT_COUNT ] = {SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 
SVGA3D_FORMAT_INVALID, 0},
+ };
+ 
+ 
+diff -Naurp mesa-19.3.3.orig/src/gallium/drivers/svga/svga_pipe_blit.c 
mesa-19.3.3/src/gallium/drivers/svga/svga_pipe_blit.c
+--- mesa-19.3.3.orig/src/gallium/drivers/svga/svga_pipe_blit.c 2020-01-28 
13:07:35.000000000 -0600
++++ mesa-19.3.3/src/gallium/drivers/svga/svga_pipe_blit.c      2020-01-29 
12:57:13.083255804 -0600
+@@ -881,8 +881,10 @@ svga_resource_copy_region(struct pipe_co
+           try_blit(svga, &blit))
+          goto done;
+ 
+-      copy_region_fallback(svga, dst_tex, dst_level, dstx, dsty, dstz,
+-                           src_tex, src_level, src_box);
++      if (!try_cpu_copy_region(svga, &blit)) {
++         if (!try_blit(svga, &blit))
++            debug_printf("Blit failed.\n");
++      }
+    }
+ 
+ done:
+diff -Naurp mesa-19.3.3.orig/src/gallium/drivers/svga/svga_resource_texture.c 
mesa-19.3.3/src/gallium/drivers/svga/svga_resource_texture.c
+--- mesa-19.3.3.orig/src/gallium/drivers/svga/svga_resource_texture.c  
2020-01-28 13:07:35.000000000 -0600
++++ mesa-19.3.3/src/gallium/drivers/svga/svga_resource_texture.c       
2020-01-29 12:59:39.539999310 -0600
+@@ -531,7 +531,7 @@ svga_texture_transfer_map(struct pipe_co
+    struct svga_transfer *st;
+    struct svga_winsys_surface *surf = tex->handle;
+    boolean use_direct_map = svga_have_gb_objects(svga) &&
+-                            !svga_have_gb_dma(svga);
++        (!svga_have_gb_dma(svga) || (usage & PIPE_TRANSFER_WRITE));
+    void *map = NULL;
+    int64_t begin = svga_get_time(svga);
+ 
+diff -Naurp 
mesa-19.3.3.orig/src/gallium/drivers/svga/svga_state_tgsi_transform.c 
mesa-19.3.3/src/gallium/drivers/svga/svga_state_tgsi_transform.c
+--- mesa-19.3.3.orig/src/gallium/drivers/svga/svga_state_tgsi_transform.c      
2020-01-28 13:07:35.000000000 -0600
++++ mesa-19.3.3/src/gallium/drivers/svga/svga_state_tgsi_transform.c   
2020-01-29 12:58:30.420642705 -0600
+@@ -131,7 +131,7 @@ emulate_point_sprite(struct svga_context
+          tgsi_dump(new_tokens, 0);
+       }
+ 
+-      templ.tokens = new_tokens;
++      pipe_shader_state_from_tgsi(&templ, new_tokens);
+       templ.stream_output.num_outputs = 0;
+ 
+       if (streamout) {
+diff -Naurp mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmwgfx_drm.h 
mesa-19.3.3/src/gallium/winsys/svga/drm/vmwgfx_drm.h
+--- mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmwgfx_drm.h  2020-01-28 
13:07:35.000000000 -0600
++++ mesa-19.3.3/src/gallium/winsys/svga/drm/vmwgfx_drm.h       2020-01-29 
13:06:18.679201111 -0600
+@@ -71,6 +71,7 @@ extern "C" {
+ #define DRM_VMW_CREATE_EXTENDED_CONTEXT 26
+ #define DRM_VMW_GB_SURFACE_CREATE_EXT   27
+ #define DRM_VMW_GB_SURFACE_REF_EXT      28
++#define DRM_VMW_MSG                     29
+ 
+ /*************************************************************************/
+ /**
+@@ -1213,6 +1214,22 @@ union drm_vmw_gb_surface_reference_ext_a
+       struct drm_vmw_surface_arg req;
+ };
+ 
++/**
++ * struct drm_vmw_msg_arg
++ *
++ * @send: Pointer to user-space msg string (null terminated).
++ * @receive: Pointer to user-space receive buffer.
++ * @send_only: Boolean for whether this is only sending or receiving too.
++ *
++ * Argument to the DRM_VMW_MSG ioctl.
++ */
++struct drm_vmw_msg_arg {
++   __u64 send;
++   __u64 receive;
++   __s32 send_only;
++   __u32 receive_len;
++};
++
+ #if defined(__cplusplus)
+ }
+ #endif
+diff -Naurp mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmw_msg.c 
mesa-19.3.3/src/gallium/winsys/svga/drm/vmw_msg.c
+--- mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmw_msg.c     2020-01-28 
13:07:35.000000000 -0600
++++ mesa-19.3.3/src/gallium/winsys/svga/drm/vmw_msg.c  2020-01-29 
13:17:24.572151101 -0600
+@@ -31,6 +31,9 @@
+ #include "pipe/p_defines.h"
+ #include "svga_winsys.h"
+ #include "vmw_msg.h"
++#include "vmwgfx_drm.h"
++#include "vmw_screen.h"
++#include "xf86drm.h"
+ 
+ 
+ #define MESSAGE_STATUS_SUCCESS  0x0001
+@@ -424,6 +427,7 @@ void
+ vmw_svga_winsys_host_log(struct svga_winsys_screen *sws, const char *log)
+ {
+    struct rpc_channel channel;
++   struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
+    char *msg;
+    int msg_len;
+    int ret;
+@@ -444,9 +448,20 @@ vmw_svga_winsys_host_log(struct svga_win
+ 
+    sprintf(msg, "log %s", log);
+ 
+-   if (!(ret = vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))) {
+-      ret = vmw_send_msg(&channel, msg);
+-      vmw_close_channel(&channel);
++   if (vws->ioctl.have_drm_2_17) {
++      struct drm_vmw_msg_arg msg_arg;
++
++      memset(&msg_arg, 0, sizeof(msg_arg));
++      msg_arg.send = (uint64_t) (unsigned long) (msg);
++      msg_arg.send_only = 1;
++
++      ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_MSG,
++                                &msg_arg, sizeof(msg_arg));
++   } else {
++      if (!(ret = vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))) {
++         ret = vmw_send_msg(&channel, msg);
++         vmw_close_channel(&channel);
++      }
+    }
+ 
+    if (ret)
+diff -Naurp mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmw_screen.h 
mesa-19.3.3/src/gallium/winsys/svga/drm/vmw_screen.h
+--- mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmw_screen.h  2020-01-28 
13:07:35.000000000 -0600
++++ mesa-19.3.3/src/gallium/winsys/svga/drm/vmw_screen.h       2020-01-29 
13:03:29.288242444 -0600
+@@ -78,6 +78,8 @@ struct vmw_winsys_screen
+       boolean have_drm_2_9;
+       uint32_t drm_execbuf_version;
+       boolean have_drm_2_15;
++      boolean have_drm_2_16;
++      boolean have_drm_2_17;
+    } ioctl;
+ 
+    struct {
+diff -Naurp mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c 
mesa-19.3.3/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c
+--- mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c    
2020-01-28 13:07:35.000000000 -0600
++++ mesa-19.3.3/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c 2020-01-29 
13:04:44.757665966 -0600
+@@ -694,6 +694,7 @@ vmw_ioctl_region_map(struct vmw_region *
+        return NULL;
+       }
+ 
++      (void) madvise(map, region->size, MADV_HUGEPAGE);
+       region->data = map;
+    }
+ 
+@@ -973,7 +974,6 @@ vmw_ioctl_init(struct vmw_winsys_screen
+    drmVersionPtr version;
+    boolean drm_gb_capable;
+    boolean have_drm_2_5;
+-   boolean have_drm_2_16;
+    const char *getenv_val;
+ 
+    VMW_FUNC;
+@@ -990,8 +990,10 @@ vmw_ioctl_init(struct vmw_winsys_screen
+       (version->version_major == 2 && version->version_minor > 8);
+    vws->ioctl.have_drm_2_15 = version->version_major > 2 ||
+       (version->version_major == 2 && version->version_minor > 14);
+-   have_drm_2_16 = version->version_major > 2 ||
++   vws->ioctl.have_drm_2_16 = version->version_major > 2 ||
+       (version->version_major == 2 && version->version_minor > 15);
++   vws->ioctl.have_drm_2_17 = version->version_major > 2 ||
++      (version->version_major == 2 && version->version_minor > 16);
+ 
+    vws->ioctl.drm_execbuf_version = vws->ioctl.have_drm_2_9 ? 2 : 1;
+ 
+@@ -1116,7 +1118,7 @@ vmw_ioctl_init(struct vmw_winsys_screen
+       else
+          vws->ioctl.num_cap_3d = SVGA3D_DEVCAP_MAX;
+ 
+-      if (have_drm_2_16) {
++      if (vws->ioctl.have_drm_2_16) {
+          vws->base.have_coherent = TRUE;
+          getenv_val = getenv("SVGA_FORCE_COHERENT");
+          if (getenv_val && strcmp(getenv_val, "0") != 0)
-- 
http://lists.linuxfromscratch.org/listinfo/patches
FAQ: http://www.linuxfromscratch.org/blfs/faq.html
Unsubscribe: See the above information page

Reply via email to