import mesa-21.1.5-1.el8
This commit is contained in:
		
							parent
							
								
									b0700a1057
								
							
						
					
					
						commit
						0b8855520b
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | |||||||
| SOURCES/mesa-21.1.3.tar.xz | SOURCES/mesa-21.1.5.tar.xz | ||||||
|  | |||||||
| @ -1 +1 @@ | |||||||
| 48cd1218edf4efab3fa447a5db41163dc59253a8 SOURCES/mesa-21.1.3.tar.xz | 6962198a822b83195065611e253cde98f627e904 SOURCES/mesa-21.1.5.tar.xz | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| VERSION ?= 21.1.3 | VERSION ?= 21.1.5 | ||||||
| SANITIZE ?= 1 | SANITIZE ?= 1 | ||||||
| 
 | 
 | ||||||
| DIRNAME = mesa-${VERSION} | DIRNAME = mesa-${VERSION} | ||||||
|  | |||||||
							
								
								
									
										403
									
								
								SOURCES/mesa-vk-wsi-sw-fixes.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										403
									
								
								SOURCES/mesa-vk-wsi-sw-fixes.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,403 @@ | |||||||
|  | diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
 | ||||||
|  | index e2a7d337ecf..bc4d87611e0 100644
 | ||||||
|  | --- a/src/vulkan/wsi/wsi_common_wayland.c
 | ||||||
|  | +++ b/src/vulkan/wsi/wsi_common_wayland.c
 | ||||||
|  | @@ -31,6 +31,7 @@
 | ||||||
|  |  #include <string.h> | ||||||
|  |  #include <pthread.h> | ||||||
|  |  #include <poll.h> | ||||||
|  | +#include <sys/mman.h>
 | ||||||
|  |   | ||||||
|  |  #include "drm-uapi/drm_fourcc.h" | ||||||
|  |   | ||||||
|  | @@ -44,9 +45,15 @@
 | ||||||
|  |  #include <util/hash_table.h> | ||||||
|  |  #include <util/timespec.h> | ||||||
|  |  #include <util/u_vector.h> | ||||||
|  | +#include <util/anon_file.h>
 | ||||||
|  |   | ||||||
|  |  struct wsi_wayland; | ||||||
|  |   | ||||||
|  | +struct wsi_wl_display_swrast {
 | ||||||
|  | +   struct wl_shm *                              wl_shm;
 | ||||||
|  | +   struct u_vector                              formats;
 | ||||||
|  | +};
 | ||||||
|  | +
 | ||||||
|  |  struct wsi_wl_display_drm { | ||||||
|  |     struct wl_drm *                              wl_drm; | ||||||
|  |     struct u_vector                              formats; | ||||||
|  | @@ -69,6 +76,7 @@ struct wsi_wl_display {
 | ||||||
|  |     struct wl_display *                          wl_display_wrapper; | ||||||
|  |     struct wl_event_queue *                      queue; | ||||||
|  |   | ||||||
|  | +   struct wsi_wl_display_swrast                 swrast;
 | ||||||
|  |     struct wsi_wl_display_drm                    drm; | ||||||
|  |     struct wsi_wl_display_dmabuf                 dmabuf; | ||||||
|  |   | ||||||
|  | @@ -79,6 +87,8 @@ struct wsi_wl_display {
 | ||||||
|  |   | ||||||
|  |     /* Only used for displays created by wsi_wl_display_create */ | ||||||
|  |     uint32_t                                     refcount; | ||||||
|  | +
 | ||||||
|  | +   bool sw;
 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  struct wsi_wayland { | ||||||
|  | @@ -183,6 +193,40 @@ wsi_wl_display_add_wl_format(struct wsi_wl_display *display,
 | ||||||
|  |     } | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static void
 | ||||||
|  | +wsi_wl_display_add_wl_shm_format(struct wsi_wl_display *display,
 | ||||||
|  | +                                 struct u_vector *formats,
 | ||||||
|  | +                                 uint32_t wl_shm_format)
 | ||||||
|  | +{
 | ||||||
|  | +   switch (wl_shm_format) {
 | ||||||
|  | +   case WL_SHM_FORMAT_XBGR8888:
 | ||||||
|  | +      wsi_wl_display_add_vk_format(display, formats,
 | ||||||
|  | +                                   VK_FORMAT_R8G8B8_SRGB);
 | ||||||
|  | +      wsi_wl_display_add_vk_format(display, formats,
 | ||||||
|  | +                                   VK_FORMAT_R8G8B8_UNORM);
 | ||||||
|  | +      FALLTHROUGH;
 | ||||||
|  | +   case WL_SHM_FORMAT_ABGR8888:
 | ||||||
|  | +      wsi_wl_display_add_vk_format(display, formats,
 | ||||||
|  | +                                   VK_FORMAT_R8G8B8A8_SRGB);
 | ||||||
|  | +      wsi_wl_display_add_vk_format(display, formats,
 | ||||||
|  | +                                   VK_FORMAT_R8G8B8A8_UNORM);
 | ||||||
|  | +      break;
 | ||||||
|  | +   case WL_SHM_FORMAT_XRGB8888:
 | ||||||
|  | +      wsi_wl_display_add_vk_format(display, formats,
 | ||||||
|  | +                                   VK_FORMAT_B8G8R8_SRGB);
 | ||||||
|  | +      wsi_wl_display_add_vk_format(display, formats,
 | ||||||
|  | +                                   VK_FORMAT_B8G8R8_UNORM);
 | ||||||
|  | +      FALLTHROUGH;
 | ||||||
|  | +   case WL_SHM_FORMAT_ARGB8888:
 | ||||||
|  | +      wsi_wl_display_add_vk_format(display, formats,
 | ||||||
|  | +                                   VK_FORMAT_B8G8R8A8_SRGB);
 | ||||||
|  | +      wsi_wl_display_add_vk_format(display, formats,
 | ||||||
|  | +                                   VK_FORMAT_B8G8R8A8_UNORM);
 | ||||||
|  | +      break;
 | ||||||
|  | +   }
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +
 | ||||||
|  |  static void | ||||||
|  |  drm_handle_device(void *data, struct wl_drm *drm, const char *name) | ||||||
|  |  { | ||||||
|  | @@ -232,6 +276,23 @@ wl_drm_format_for_vk_format(VkFormat vk_format, bool alpha)
 | ||||||
|  |     } | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static uint32_t
 | ||||||
|  | +wl_shm_format_for_vk_format(VkFormat vk_format, bool alpha)
 | ||||||
|  | +{
 | ||||||
|  | +   switch (vk_format) {
 | ||||||
|  | +   case VK_FORMAT_R8G8B8A8_UNORM:
 | ||||||
|  | +   case VK_FORMAT_R8G8B8A8_SRGB:
 | ||||||
|  | +      return alpha ? WL_SHM_FORMAT_ABGR8888 : WL_SHM_FORMAT_XBGR8888;
 | ||||||
|  | +   case VK_FORMAT_B8G8R8A8_UNORM:
 | ||||||
|  | +   case VK_FORMAT_B8G8R8A8_SRGB:
 | ||||||
|  | +      return alpha ? WL_SHM_FORMAT_ARGB8888 : WL_SHM_FORMAT_XRGB8888;
 | ||||||
|  | +
 | ||||||
|  | +   default:
 | ||||||
|  | +      assert(!"Unsupported Vulkan format");
 | ||||||
|  | +      return 0;
 | ||||||
|  | +   }
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  static void | ||||||
|  |  drm_handle_format(void *data, struct wl_drm *drm, uint32_t wl_format) | ||||||
|  |  { | ||||||
|  | @@ -311,12 +372,34 @@ static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener = {
 | ||||||
|  |     dmabuf_handle_modifier, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +static void
 | ||||||
|  | +shm_handle_format(void *data, struct wl_shm *shm, uint32_t format)
 | ||||||
|  | +{
 | ||||||
|  | +   struct wsi_wl_display *display = data;
 | ||||||
|  | +   if (display->swrast.formats.element_size == 0)
 | ||||||
|  | +      return;
 | ||||||
|  | +
 | ||||||
|  | +   wsi_wl_display_add_wl_shm_format(display, &display->swrast.formats, format);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +static const struct wl_shm_listener shm_listener = {
 | ||||||
|  | +   .format = shm_handle_format
 | ||||||
|  | +};
 | ||||||
|  | +
 | ||||||
|  |  static void | ||||||
|  |  registry_handle_global(void *data, struct wl_registry *registry, | ||||||
|  |                         uint32_t name, const char *interface, uint32_t version) | ||||||
|  |  { | ||||||
|  |     struct wsi_wl_display *display = data; | ||||||
|  |   | ||||||
|  | +   if (display->sw) {
 | ||||||
|  | +      if (strcmp(interface, "wl_shm") == 0) {
 | ||||||
|  | +         display->swrast.wl_shm = wl_registry_bind(registry, name, &wl_shm_interface, 1);
 | ||||||
|  | +         wl_shm_add_listener(display->swrast.wl_shm, &shm_listener, display);
 | ||||||
|  | +      }
 | ||||||
|  | +      return;
 | ||||||
|  | +   }
 | ||||||
|  | +
 | ||||||
|  |     if (strcmp(interface, "wl_drm") == 0) { | ||||||
|  |        assert(display->drm.wl_drm == NULL); | ||||||
|  |   | ||||||
|  | @@ -348,10 +431,13 @@ wsi_wl_display_finish(struct wsi_wl_display *display)
 | ||||||
|  |  { | ||||||
|  |     assert(display->refcount == 0); | ||||||
|  |   | ||||||
|  | +   u_vector_finish(&display->swrast.formats);
 | ||||||
|  |     u_vector_finish(&display->drm.formats); | ||||||
|  |     u_vector_finish(&display->dmabuf.formats); | ||||||
|  |     u_vector_finish(&display->dmabuf.modifiers.argb8888); | ||||||
|  |     u_vector_finish(&display->dmabuf.modifiers.xrgb8888); | ||||||
|  | +   if (display->swrast.wl_shm)
 | ||||||
|  | +      wl_shm_destroy(display->swrast.wl_shm);
 | ||||||
|  |     if (display->drm.wl_drm) | ||||||
|  |        wl_drm_destroy(display->drm.wl_drm); | ||||||
|  |     if (display->dmabuf.wl_dmabuf) | ||||||
|  | @@ -366,16 +452,18 @@ static VkResult
 | ||||||
|  |  wsi_wl_display_init(struct wsi_wayland *wsi_wl, | ||||||
|  |                      struct wsi_wl_display *display, | ||||||
|  |                      struct wl_display *wl_display, | ||||||
|  | -                    bool get_format_list)
 | ||||||
|  | +                    bool get_format_list, bool sw)
 | ||||||
|  |  { | ||||||
|  |     VkResult result = VK_SUCCESS; | ||||||
|  |     memset(display, 0, sizeof(*display)); | ||||||
|  |   | ||||||
|  |     display->wsi_wl = wsi_wl; | ||||||
|  |     display->wl_display = wl_display; | ||||||
|  | +   display->sw = sw;
 | ||||||
|  |   | ||||||
|  |     if (get_format_list) { | ||||||
|  | -      if (!u_vector_init(&display->drm.formats, sizeof(VkFormat), 8) ||
 | ||||||
|  | +      if (!u_vector_init(&display->swrast.formats, sizeof(VkFormat), 8) ||
 | ||||||
|  | +          !u_vector_init(&display->drm.formats, sizeof(VkFormat), 8) ||
 | ||||||
|  |            !u_vector_init(&display->dmabuf.formats, sizeof(VkFormat), 8) || | ||||||
|  |            !u_vector_init(&display->dmabuf.modifiers.argb8888, | ||||||
|  |                           sizeof(uint64_t), 32) || | ||||||
|  | @@ -414,7 +502,7 @@ wsi_wl_display_init(struct wsi_wayland *wsi_wl,
 | ||||||
|  |     wl_display_roundtrip_queue(display->wl_display, display->queue); | ||||||
|  |   | ||||||
|  |     /* Round-trip again to get formats, modifiers and capabilities */ | ||||||
|  | -   if (display->drm.wl_drm || display->dmabuf.wl_dmabuf)
 | ||||||
|  | +   if (display->drm.wl_drm || display->dmabuf.wl_dmabuf || display->swrast.wl_shm)
 | ||||||
|  |        wl_display_roundtrip_queue(display->wl_display, display->queue); | ||||||
|  |   | ||||||
|  |     if (wsi_wl->wsi->force_bgra8_unorm_first) { | ||||||
|  | @@ -432,8 +520,10 @@ wsi_wl_display_init(struct wsi_wayland *wsi_wl,
 | ||||||
|  |        } | ||||||
|  |     } | ||||||
|  |   | ||||||
|  | +   if (display->sw)
 | ||||||
|  | +      display->formats = &display->swrast.formats;
 | ||||||
|  |     /* We need prime support for wl_drm */ | ||||||
|  | -   if (display->drm.wl_drm &&
 | ||||||
|  | +   else if (display->drm.wl_drm &&
 | ||||||
|  |         (display->drm.capabilities & WL_DRM_CAPABILITY_PRIME)) { | ||||||
|  |        display->formats = &display->drm.formats; | ||||||
|  |     } else if (display->dmabuf.wl_dmabuf) { | ||||||
|  | @@ -463,6 +553,7 @@ fail:
 | ||||||
|  |   | ||||||
|  |  static VkResult | ||||||
|  |  wsi_wl_display_create(struct wsi_wayland *wsi, struct wl_display *wl_display, | ||||||
|  | +                      bool sw,
 | ||||||
|  |                        struct wsi_wl_display **display_out) | ||||||
|  |  { | ||||||
|  |     struct wsi_wl_display *display = | ||||||
|  | @@ -471,7 +562,8 @@ wsi_wl_display_create(struct wsi_wayland *wsi, struct wl_display *wl_display,
 | ||||||
|  |     if (!display) | ||||||
|  |        return VK_ERROR_OUT_OF_HOST_MEMORY; | ||||||
|  |   | ||||||
|  | -   VkResult result = wsi_wl_display_init(wsi, display, wl_display, true);
 | ||||||
|  | +   VkResult result = wsi_wl_display_init(wsi, display, wl_display, true,
 | ||||||
|  | +                                         sw);
 | ||||||
|  |     if (result != VK_SUCCESS) { | ||||||
|  |        vk_free(wsi->alloc, display); | ||||||
|  |        return result; | ||||||
|  | @@ -509,7 +601,8 @@ wsi_wl_get_presentation_support(struct wsi_device *wsi_device,
 | ||||||
|  |        (struct wsi_wayland *)wsi_device->wsi[VK_ICD_WSI_PLATFORM_WAYLAND]; | ||||||
|  |   | ||||||
|  |     struct wsi_wl_display display; | ||||||
|  | -   VkResult ret = wsi_wl_display_init(wsi, &display, wl_display, false);
 | ||||||
|  | +   VkResult ret = wsi_wl_display_init(wsi, &display, wl_display, false,
 | ||||||
|  | +                                      wsi_device->sw);
 | ||||||
|  |     if (ret == VK_SUCCESS) | ||||||
|  |        wsi_wl_display_finish(&display); | ||||||
|  |   | ||||||
|  | @@ -612,7 +705,8 @@ wsi_wl_surface_get_formats(VkIcdSurfaceBase *icd_surface,
 | ||||||
|  |        (struct wsi_wayland *)wsi_device->wsi[VK_ICD_WSI_PLATFORM_WAYLAND]; | ||||||
|  |   | ||||||
|  |     struct wsi_wl_display display; | ||||||
|  | -   if (wsi_wl_display_init(wsi, &display, surface->display, true))
 | ||||||
|  | +   if (wsi_wl_display_init(wsi, &display, surface->display, true,
 | ||||||
|  | +                           wsi_device->sw))
 | ||||||
|  |        return VK_ERROR_SURFACE_LOST_KHR; | ||||||
|  |   | ||||||
|  |     VK_OUTARRAY_MAKE(out, pSurfaceFormats, pSurfaceFormatCount); | ||||||
|  | @@ -642,7 +736,8 @@ wsi_wl_surface_get_formats2(VkIcdSurfaceBase *icd_surface,
 | ||||||
|  |        (struct wsi_wayland *)wsi_device->wsi[VK_ICD_WSI_PLATFORM_WAYLAND]; | ||||||
|  |   | ||||||
|  |     struct wsi_wl_display display; | ||||||
|  | -   if (wsi_wl_display_init(wsi, &display, surface->display, true))
 | ||||||
|  | +   if (wsi_wl_display_init(wsi, &display, surface->display, true,
 | ||||||
|  | +                           wsi_device->sw))
 | ||||||
|  |        return VK_ERROR_SURFACE_LOST_KHR; | ||||||
|  |   | ||||||
|  |     VK_OUTARRAY_MAKE(out, pSurfaceFormats, pSurfaceFormatCount); | ||||||
|  | @@ -722,10 +817,12 @@ struct wsi_wl_image {
 | ||||||
|  |     struct wsi_image                             base; | ||||||
|  |     struct wl_buffer *                           buffer; | ||||||
|  |     bool                                         busy; | ||||||
|  | +   void *                                       data_ptr;
 | ||||||
|  | +   uint32_t                                     data_size;
 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  struct wsi_wl_swapchain { | ||||||
|  | -   struct wsi_swapchain                        base;
 | ||||||
|  | +   struct wsi_swapchain                         base;
 | ||||||
|  |   | ||||||
|  |     struct wsi_wl_display                        *display; | ||||||
|  |   | ||||||
|  | @@ -742,6 +839,7 @@ struct wsi_wl_swapchain {
 | ||||||
|  |     VkExtent2D                                   extent; | ||||||
|  |     VkFormat                                     vk_format; | ||||||
|  |     uint32_t                                     drm_format; | ||||||
|  | +   uint32_t                                     shm_format;
 | ||||||
|  |   | ||||||
|  |     uint32_t                                     num_drm_modifiers; | ||||||
|  |     const uint64_t *                             drm_modifiers; | ||||||
|  | @@ -859,6 +957,23 @@ wsi_wl_swapchain_queue_present(struct wsi_swapchain *wsi_chain,
 | ||||||
|  |  { | ||||||
|  |     struct wsi_wl_swapchain *chain = (struct wsi_wl_swapchain *)wsi_chain; | ||||||
|  |   | ||||||
|  | +   if (chain->display->sw) {
 | ||||||
|  | +      struct wsi_wl_image *image = &chain->images[image_index];
 | ||||||
|  | +      void *dptr = image->data_ptr;
 | ||||||
|  | +      void *sptr;
 | ||||||
|  | +      chain->base.wsi->MapMemory(chain->base.device,
 | ||||||
|  | +                                 image->base.memory,
 | ||||||
|  | +                                 0, 0, 0, &sptr);
 | ||||||
|  | +
 | ||||||
|  | +      for (unsigned r = 0; r < chain->extent.height; r++) {
 | ||||||
|  | +         memcpy(dptr, sptr, image->base.row_pitches[0]);
 | ||||||
|  | +         dptr += image->base.row_pitches[0];
 | ||||||
|  | +         sptr += image->base.row_pitches[0];
 | ||||||
|  | +      }
 | ||||||
|  | +      chain->base.wsi->UnmapMemory(chain->base.device,
 | ||||||
|  | +                                   image->base.memory);
 | ||||||
|  | +
 | ||||||
|  | +   }
 | ||||||
|  |     if (chain->base.present_mode == VK_PRESENT_MODE_FIFO_KHR) { | ||||||
|  |        while (!chain->fifo_ready) { | ||||||
|  |           int ret = wl_display_dispatch_queue(chain->display->wl_display, | ||||||
|  | @@ -928,7 +1043,31 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
 | ||||||
|  |     if (result != VK_SUCCESS) | ||||||
|  |        return result; | ||||||
|  |   | ||||||
|  | -   if (!chain->drm_wrapper) {
 | ||||||
|  | +   if (display->sw) {
 | ||||||
|  | +      int fd, stride;
 | ||||||
|  | +
 | ||||||
|  | +      stride = image->base.row_pitches[0];
 | ||||||
|  | +      image->data_size = stride * chain->extent.height;
 | ||||||
|  | +
 | ||||||
|  | +      /* Create a shareable buffer */
 | ||||||
|  | +      fd = os_create_anonymous_file(image->data_size, NULL);
 | ||||||
|  | +      if (fd < 0)
 | ||||||
|  | +         goto fail_image;
 | ||||||
|  | +
 | ||||||
|  | +      image->data_ptr = mmap(NULL, image->data_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
 | ||||||
|  | +      if (image->data_ptr == MAP_FAILED) {
 | ||||||
|  | +         close(fd);
 | ||||||
|  | +         goto fail_image;
 | ||||||
|  | +      }
 | ||||||
|  | +      /* Share it in a wl_buffer */
 | ||||||
|  | +      struct wl_shm_pool *pool = wl_shm_create_pool(display->swrast.wl_shm, fd, image->data_size);
 | ||||||
|  | +      wl_proxy_set_queue((struct wl_proxy *)pool, display->queue);
 | ||||||
|  | +      image->buffer = wl_shm_pool_create_buffer(pool, 0, chain->extent.width,
 | ||||||
|  | +                                                chain->extent.height, stride,
 | ||||||
|  | +                                                chain->shm_format);
 | ||||||
|  | +      wl_shm_pool_destroy(pool);
 | ||||||
|  | +      close(fd);
 | ||||||
|  | +   } else if (!chain->drm_wrapper) {
 | ||||||
|  |        /* Only request modifiers if we have dmabuf, else it must be implicit. */ | ||||||
|  |        assert(display->dmabuf.wl_dmabuf); | ||||||
|  |        assert(image->base.drm_modifier != DRM_FORMAT_MOD_INVALID); | ||||||
|  | @@ -995,6 +1134,8 @@ wsi_wl_swapchain_destroy(struct wsi_swapchain *wsi_chain,
 | ||||||
|  |        if (chain->images[i].buffer) { | ||||||
|  |           wl_buffer_destroy(chain->images[i].buffer); | ||||||
|  |           wsi_destroy_image(&chain->base, &chain->images[i].base); | ||||||
|  | +         if (chain->images[i].data_ptr)
 | ||||||
|  | +            munmap(chain->images[i].data_ptr, chain->images[i].data_size);
 | ||||||
|  |        } | ||||||
|  |     } | ||||||
|  |   | ||||||
|  | @@ -1049,8 +1190,10 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
 | ||||||
|  |     /* Mark a bunch of stuff as NULL.  This way we can just call | ||||||
|  |      * destroy_swapchain for cleanup. | ||||||
|  |      */ | ||||||
|  | -   for (uint32_t i = 0; i < num_images; i++)
 | ||||||
|  | +   for (uint32_t i = 0; i < num_images; i++) {
 | ||||||
|  |        chain->images[i].buffer = NULL; | ||||||
|  | +      chain->images[i].data_ptr = NULL;
 | ||||||
|  | +   }
 | ||||||
|  |     chain->surface = NULL; | ||||||
|  |     chain->drm_wrapper = NULL; | ||||||
|  |     chain->frame = NULL; | ||||||
|  | @@ -1066,7 +1209,10 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
 | ||||||
|  |     chain->base.image_count = num_images; | ||||||
|  |     chain->extent = pCreateInfo->imageExtent; | ||||||
|  |     chain->vk_format = pCreateInfo->imageFormat; | ||||||
|  | -   chain->drm_format = wl_drm_format_for_vk_format(chain->vk_format, alpha);
 | ||||||
|  | +   if (wsi_device->sw)
 | ||||||
|  | +      chain->shm_format = wl_shm_format_for_vk_format(chain->vk_format, alpha);
 | ||||||
|  | +   else
 | ||||||
|  | +      chain->drm_format = wl_drm_format_for_vk_format(chain->vk_format, alpha);
 | ||||||
|  |   | ||||||
|  |     if (pCreateInfo->oldSwapchain) { | ||||||
|  |        /* If we have an oldSwapchain parameter, copy the display struct over | ||||||
|  | @@ -1076,7 +1222,8 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
 | ||||||
|  |        chain->display = wsi_wl_display_ref(old_chain->display); | ||||||
|  |     } else { | ||||||
|  |        chain->display = NULL; | ||||||
|  | -      result = wsi_wl_display_create(wsi, surface->display, &chain->display);
 | ||||||
|  | +      result = wsi_wl_display_create(wsi, surface->display,
 | ||||||
|  | +                                     wsi_device->sw, &chain->display);
 | ||||||
|  |        if (result != VK_SUCCESS) | ||||||
|  |           goto fail; | ||||||
|  |     } | ||||||
|  | diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
 | ||||||
|  | index 54769b81ccc..fa0c3d997dc 100644
 | ||||||
|  | --- a/src/vulkan/wsi/wsi_common_x11.c
 | ||||||
|  | +++ b/src/vulkan/wsi/wsi_common_x11.c
 | ||||||
|  | @@ -439,8 +439,10 @@ VkBool32 wsi_get_physical_device_xcb_presentation_support(
 | ||||||
|  |     if (!wsi_conn) | ||||||
|  |        return false; | ||||||
|  |   | ||||||
|  | -   if (!wsi_x11_check_for_dri3(wsi_conn))
 | ||||||
|  | -      return false;
 | ||||||
|  | +   if (!wsi_device->sw) {
 | ||||||
|  | +      if (!wsi_x11_check_for_dri3(wsi_conn))
 | ||||||
|  | +         return false;
 | ||||||
|  | +   }
 | ||||||
|  |   | ||||||
|  |     unsigned visual_depth; | ||||||
|  |     if (!connection_get_visualtype(connection, visual_id, &visual_depth)) | ||||||
|  | @@ -484,9 +486,11 @@ x11_surface_get_support(VkIcdSurfaceBase *icd_surface,
 | ||||||
|  |     if (!wsi_conn) | ||||||
|  |        return VK_ERROR_OUT_OF_HOST_MEMORY; | ||||||
|  |   | ||||||
|  | -   if (!wsi_x11_check_for_dri3(wsi_conn)) {
 | ||||||
|  | -      *pSupported = false;
 | ||||||
|  | -      return VK_SUCCESS;
 | ||||||
|  | +   if (!wsi_device->sw) {
 | ||||||
|  | +      if (!wsi_x11_check_for_dri3(wsi_conn)) {
 | ||||||
|  | +         *pSupported = false;
 | ||||||
|  | +         return VK_SUCCESS;
 | ||||||
|  | +      }
 | ||||||
|  |     } | ||||||
|  |   | ||||||
|  |     unsigned visual_depth; | ||||||
| @ -39,7 +39,7 @@ | |||||||
| 
 | 
 | ||||||
| Name:           mesa | Name:           mesa | ||||||
| Summary:        Mesa graphics libraries | Summary:        Mesa graphics libraries | ||||||
| Version:        21.1.3 | Version:        21.1.5 | ||||||
| Release:        1%{?rctag:.%{rctag}}%{?dist} | Release:        1%{?rctag:.%{rctag}}%{?dist} | ||||||
| 
 | 
 | ||||||
| License:        MIT | License:        MIT | ||||||
| @ -55,6 +55,7 @@ Source3:        Makefile | |||||||
| Source4:        Mesa-MLAA-License-Clarification-Email.txt | Source4:        Mesa-MLAA-License-Clarification-Email.txt | ||||||
| 
 | 
 | ||||||
| Patch0:	lavapipe-disable-env-var.patch | Patch0:	lavapipe-disable-env-var.patch | ||||||
|  | Patch1: mesa-vk-wsi-sw-fixes.patch | ||||||
| 
 | 
 | ||||||
| BuildRequires:  gcc | BuildRequires:  gcc | ||||||
| BuildRequires:  gcc-c++ | BuildRequires:  gcc-c++ | ||||||
| @ -546,6 +547,9 @@ done | |||||||
| %endif | %endif | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Thu Jul 22 2021 Dave Airlie <airlied@redhat.com> - 21.1.5-1 | ||||||
|  | - Fix vulkan sw with wayland, pull in .4 + .5 fixes | ||||||
|  | 
 | ||||||
| * Sat Jun 19 2021 Dave Airlie <airlied@redhat.com> - 21.1.3-1 | * Sat Jun 19 2021 Dave Airlie <airlied@redhat.com> - 21.1.3-1 | ||||||
| - rebase to 21.1.3 | - rebase to 21.1.3 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user