about summary refs log tree commit diff
path: root/pkgs/development/libraries/mesa
diff options
context:
space:
mode:
authorK900 <me@0upti.me>2023-12-15 17:24:14 +0300
committerK900 <me@0upti.me>2023-12-15 20:41:39 +0300
commitad7141efd07eff2acf24cf7586b0ed5f7ff9c6b5 (patch)
treee1f9e224a9c53a1883d0d4b0d09f1143536d0dc8 /pkgs/development/libraries/mesa
parent8ed005a63f786bdd8738259a27bf488ae1002127 (diff)
mesa: backport patches to fix build on Darwin and 32-bit platforms
Diffstat (limited to 'pkgs/development/libraries/mesa')
-rw-r--r--pkgs/development/libraries/mesa/backports/0001-dri-added-build-dependencies-for-systems-using-non-s.patch56
-rw-r--r--pkgs/development/libraries/mesa/backports/0002-util-Update-util-libdrm.h-stubs-to-allow-loader.c-to.patch103
-rw-r--r--pkgs/development/libraries/mesa/backports/0003-glx-fix-automatic-zink-fallback-loading-between-hw-a.patch53
-rw-r--r--pkgs/development/libraries/mesa/backports/0004-d3d12-Fix-AV1-video-encode-32-bits-build.patch270
-rw-r--r--pkgs/development/libraries/mesa/default.nix20
5 files changed, 492 insertions, 10 deletions
diff --git a/pkgs/development/libraries/mesa/backports/0001-dri-added-build-dependencies-for-systems-using-non-s.patch b/pkgs/development/libraries/mesa/backports/0001-dri-added-build-dependencies-for-systems-using-non-s.patch
new file mode 100644
index 0000000000000..c0b239c925981
--- /dev/null
+++ b/pkgs/development/libraries/mesa/backports/0001-dri-added-build-dependencies-for-systems-using-non-s.patch
@@ -0,0 +1,56 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: "duncan.hopkins" <duncan.hopkins@foundry.com>
+Date: Tue, 17 Oct 2023 09:34:31 +0100
+Subject: [PATCH] dri: added build dependencies for systems using non-standard
+ prefixed X11 libs.
+
+To get MacOS to build, some extra dependencies need to be added to a couple of build targets.
+This mainly shows up when not installing the dependencies in the default prefix locations.
+On MacOS, this happens when using a custom build of brew to install the dependencies to 'odd' locations.
+
+Reviewed-by: Adam Jackson <ajax@redhat.com>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25992>
+---
+ src/gallium/targets/dri/meson.build | 2 +-
+ src/glx/meson.build                 | 2 +-
+ src/loader/meson.build              | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/gallium/targets/dri/meson.build b/src/gallium/targets/dri/meson.build
+index 66619bba0db..6d3ef197e74 100644
+--- a/src/gallium/targets/dri/meson.build
++++ b/src/gallium/targets/dri/meson.build
+@@ -49,7 +49,7 @@ libgallium_dri = shared_library(
+   link_depends : gallium_dri_link_depends,
+   link_with : [
+     libdri, libmesa, libgalliumvl,
+-    libgallium, libglapi, libpipe_loader_static, libws_null, libwsw, libswdri,
++    libgallium, libglapi, libloader, libpipe_loader_static, libws_null, libwsw, libswdri,
+     libswkmsdri,
+   ],
+   dependencies : [
+diff --git a/src/glx/meson.build b/src/glx/meson.build
+index 7ec3e3e0d88..1a5e9833956 100644
+--- a/src/glx/meson.build
++++ b/src/glx/meson.build
+@@ -136,7 +136,7 @@ libglx = static_library(
+   ],
+   dependencies : [
+     idep_mesautil, idep_xmlconfig,
+-    dep_libdrm, dep_dri2proto, dep_glproto, dep_x11, dep_glvnd, dep_xxf86vm, dep_xshmfence
++    dep_libdrm, dep_dri2proto, dep_glproto, dep_x11, dep_xext, dep_glvnd, dep_xxf86vm, dep_xshmfence
+   ],
+ )
+ 
+diff --git a/src/loader/meson.build b/src/loader/meson.build
+index 35f9991ba2f..043cc852112 100644
+--- a/src/loader/meson.build
++++ b/src/loader/meson.build
+@@ -47,6 +47,6 @@ libloader = static_library(
+   c_args : loader_c_args,
+   gnu_symbol_visibility : 'hidden',
+   include_directories : [inc_include, inc_src, inc_util],
+-  dependencies : [dep_libdrm, dep_thread, dep_xcb_xrandr],
++  dependencies : [dep_libdrm, dep_thread, dep_xcb, dep_xcb_xrandr],
+   build_by_default : false,
+ )
diff --git a/pkgs/development/libraries/mesa/backports/0002-util-Update-util-libdrm.h-stubs-to-allow-loader.c-to.patch b/pkgs/development/libraries/mesa/backports/0002-util-Update-util-libdrm.h-stubs-to-allow-loader.c-to.patch
new file mode 100644
index 0000000000000..5a48ace8fbbcb
--- /dev/null
+++ b/pkgs/development/libraries/mesa/backports/0002-util-Update-util-libdrm.h-stubs-to-allow-loader.c-to.patch
@@ -0,0 +1,103 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: "duncan.hopkins" <duncan.hopkins@foundry.com>
+Date: Tue, 17 Oct 2023 14:36:39 +0100
+Subject: [PATCH] util: Update util/libdrm.h stubs to allow loader.c to compile
+ on MacOS.
+
+MacOS does not have the libdrm libraries so is missing xf86drm.h.
+util/libdrm.h already has a collection of stubs for systems that do not support the libraries.
+
+A compile on MacOS will fail with the source that uses newer drm functions and structures.
+Update adds in missing items that MacOS code needs to compile and run.
+New code is copied from the public repository: https://gitlab.freedesktop.org/mesa/drm/-/blob/main/xf86drm.h
+
+Reviewed-by: Adam Jackson <ajax@redhat.com>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25992>
+---
+ src/util/libdrm.h | 57 +++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 57 insertions(+)
+
+diff --git a/src/util/libdrm.h b/src/util/libdrm.h
+index cc153cf88ab..e3af494b8d1 100644
+--- a/src/util/libdrm.h
++++ b/src/util/libdrm.h
+@@ -44,22 +44,79 @@
+ #define DRM_BUS_PLATFORM  2
+ #define DRM_BUS_HOST1X    3
+ 
++typedef struct _drmPciDeviceInfo {
++    uint16_t vendor_id;
++    uint16_t device_id;
++    uint16_t subvendor_id;
++    uint16_t subdevice_id;
++    uint8_t revision_id;
++} drmPciDeviceInfo, *drmPciDeviceInfoPtr;
++
++#define DRM_PLATFORM_DEVICE_NAME_LEN 512
++
++typedef struct _drmPlatformBusInfo {
++    char fullname[DRM_PLATFORM_DEVICE_NAME_LEN];
++} drmPlatformBusInfo, *drmPlatformBusInfoPtr;
++
++typedef struct _drmPlatformDeviceInfo {
++    char **compatible; /* NULL terminated list of compatible strings */
++} drmPlatformDeviceInfo, *drmPlatformDeviceInfoPtr;
++
++#define DRM_HOST1X_DEVICE_NAME_LEN 512
++
++typedef struct _drmHost1xBusInfo {
++    char fullname[DRM_HOST1X_DEVICE_NAME_LEN];
++} drmHost1xBusInfo, *drmHost1xBusInfoPtr;
++
++typedef struct _drmPciBusInfo {
++   uint16_t domain;
++   uint8_t bus;
++   uint8_t dev;
++   uint8_t func;
++} drmPciBusInfo, *drmPciBusInfoPtr;
++
+ typedef struct _drmDevice {
+     char **nodes; /* DRM_NODE_MAX sized array */
+     int available_nodes; /* DRM_NODE_* bitmask */
+     int bustype;
++    union {
++       drmPciBusInfoPtr pci;
++       drmPlatformBusInfoPtr platform;
++       drmHost1xBusInfoPtr host1x;
++    } businfo;
++    union {
++        drmPciDeviceInfoPtr pci;
++    } deviceinfo;
+     /* ... */
+ } drmDevice, *drmDevicePtr;
+ 
++static inline int
++drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
++{
++   return -ENOENT;
++}
++
+ static inline int
+ drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
+ {
+    return -ENOENT;
+ }
+ 
++static inline int
++drmGetDeviceFromDevId(dev_t dev_id, uint32_t flags, drmDevicePtr *device)
++{
++   return -ENOENT;
++}
++
++static inline void
++drmFreeDevice(drmDevicePtr *device) {}
++
+ static inline void
+ drmFreeDevices(drmDevicePtr devices[], int count) {}
+ 
++static inline char*
++drmGetDeviceNameFromFd2(int fd) { return NULL;}
++
+ typedef struct _drmVersion {
+     int     version_major;        /**< Major version */
+     int     version_minor;        /**< Minor version */
diff --git a/pkgs/development/libraries/mesa/backports/0003-glx-fix-automatic-zink-fallback-loading-between-hw-a.patch b/pkgs/development/libraries/mesa/backports/0003-glx-fix-automatic-zink-fallback-loading-between-hw-a.patch
new file mode 100644
index 0000000000000..c7bde6411d8e4
--- /dev/null
+++ b/pkgs/development/libraries/mesa/backports/0003-glx-fix-automatic-zink-fallback-loading-between-hw-a.patch
@@ -0,0 +1,53 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: "duncan.hopkins" <duncan.hopkins@foundry.com>
+Date: Wed, 1 Nov 2023 11:31:13 +0000
+Subject: [PATCH] glx: fix automatic zink fallback loading between hw and sw
+ drivers on MacOS
+
+The combination of defines used when compile the code on MacOS is hiding variables.
+Patch allows basic MacOS build to compile and run.
+
+Reviewed-by: Adam Jackson <ajax@redhat.com>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25992>
+---
+ src/glx/glxext.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/src/glx/glxext.c b/src/glx/glxext.c
+index 7712e54c1d6..454f2c36a77 100644
+--- a/src/glx/glxext.c
++++ b/src/glx/glxext.c
+@@ -878,12 +878,16 @@ __glXInitialize(Display * dpy)
+ 
+    dpyPriv->glXDrawHash = __glxHashCreate();
+ 
++   Bool zink = False;
++   Bool try_zink = False;
++
+ #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
+    Bool glx_direct = !debug_get_bool_option("LIBGL_ALWAYS_INDIRECT", false);
+    Bool glx_accel = !debug_get_bool_option("LIBGL_ALWAYS_SOFTWARE", false);
+    const char *env = getenv("MESA_LOADER_DRIVER_OVERRIDE");
+-   Bool zink = env && !strcmp(env, "zink");
+-   Bool try_zink = False;
++
++   zink = env && !strcmp(env, "zink");
++   try_zink = False;
+ 
+    dpyPriv->drawHash = __glxHashCreate();
+ 
+@@ -928,12 +932,14 @@ __glXInitialize(Display * dpy)
+ 
+    if (!AllocAndFetchScreenConfigs(dpy, dpyPriv, zink | try_zink)) {
+       Bool fail = True;
++#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
+       if (try_zink) {
+          free(dpyPriv->screens);
+          dpyPriv->driswDisplay->destroyDisplay(dpyPriv->driswDisplay);
+          dpyPriv->driswDisplay = driswCreateDisplay(dpy, false);
+          fail = !AllocAndFetchScreenConfigs(dpy, dpyPriv, False);
+       }
++#endif
+       if (fail) {
+          free(dpyPriv);
+          return NULL;
diff --git a/pkgs/development/libraries/mesa/backports/0004-d3d12-Fix-AV1-video-encode-32-bits-build.patch b/pkgs/development/libraries/mesa/backports/0004-d3d12-Fix-AV1-video-encode-32-bits-build.patch
new file mode 100644
index 0000000000000..6152ad7c174ed
--- /dev/null
+++ b/pkgs/development/libraries/mesa/backports/0004-d3d12-Fix-AV1-video-encode-32-bits-build.patch
@@ -0,0 +1,270 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Sil Vilerino <sivileri@microsoft.com>
+Date: Wed, 6 Dec 2023 20:09:44 -0500
+Subject: [PATCH] d3d12: Fix AV1 video encode 32 bits build
+
+Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26573>
+---
+ .../drivers/d3d12/d3d12_video_enc_av1.cpp     | 58 +++++++++----------
+ ...12_video_encoder_bitstream_builder_av1.cpp | 10 ++--
+ ...2_video_encoder_references_manager_av1.cpp |  2 +-
+ 3 files changed, 35 insertions(+), 35 deletions(-)
+
+diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc_av1.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc_av1.cpp
+index 2c1964aa274..a5e2a2e3d39 100644
+--- a/src/gallium/drivers/d3d12/d3d12_video_enc_av1.cpp
++++ b/src/gallium/drivers/d3d12/d3d12_video_enc_av1.cpp
+@@ -2189,7 +2189,7 @@ d3d12_video_encoder_build_post_encode_codec_bitstream_av1(struct d3d12_video_enc
+          writtenTemporalDelimBytes                      // Bytes Written AFTER placingPositionStart arg above
+       );
+       assert(pD3D12Enc->m_BitstreamHeadersBuffer.size() == writtenTemporalDelimBytes);
+-      debug_printf("Written OBU_TEMPORAL_DELIMITER bytes: %" PRIu64 "\n", writtenTemporalDelimBytes);
++      debug_printf("Written OBU_TEMPORAL_DELIMITER bytes: %" PRIu64 "\n", static_cast<uint64_t>(writtenTemporalDelimBytes));
+    }
+ 
+    size_t writtenSequenceBytes = 0;
+@@ -2208,7 +2208,7 @@ d3d12_video_encoder_build_post_encode_codec_bitstream_av1(struct d3d12_video_enc
+          writtenSequenceBytes   // Bytes Written AFTER placingPositionStart arg above
+       );
+       assert(pD3D12Enc->m_BitstreamHeadersBuffer.size() == (writtenSequenceBytes + writtenTemporalDelimBytes));
+-      debug_printf("Written OBU_SEQUENCE_HEADER bytes: %" PRIu64 "\n", writtenSequenceBytes);
++      debug_printf("Written OBU_SEQUENCE_HEADER bytes: %" PRIu64 "\n", static_cast<uint64_t>(writtenSequenceBytes));
+    }
+ 
+    // Only supported bitstream format is with obu_size for now.
+@@ -2254,14 +2254,14 @@ d3d12_video_encoder_build_post_encode_codec_bitstream_av1(struct d3d12_video_enc
+          writtenFrameBytes               // Bytes Written AFTER placingPositionStart arg above
+       );
+ 
+-      debug_printf("Written OBU_FRAME bytes: %" PRIu64 "\n", writtenFrameBytes);
++      debug_printf("Written OBU_FRAME bytes: %" PRIu64 "\n", static_cast<uint64_t>(writtenFrameBytes));
+ 
+       assert(pD3D12Enc->m_BitstreamHeadersBuffer.size() ==
+              (writtenSequenceBytes + writtenTemporalDelimBytes + writtenFrameBytes));
+ 
+       debug_printf("Uploading %" PRIu64
+                    " bytes from OBU sequence and/or picture headers to comp_bit_destination %p at offset 0\n",
+-                   pD3D12Enc->m_BitstreamHeadersBuffer.size(),
++                   static_cast<uint64_t>(pD3D12Enc->m_BitstreamHeadersBuffer.size()),
+                    associatedMetadata.comp_bit_destination);
+ 
+       // Upload headers to the finalized compressed bitstream buffer
+@@ -2330,13 +2330,13 @@ d3d12_video_encoder_build_post_encode_codec_bitstream_av1(struct d3d12_video_enc
+                                                writtenFrameBytes   // Bytes Written AFTER placingPositionStart arg above
+       );
+ 
+-      debug_printf("Written OBU_FRAME_HEADER bytes: %" PRIu64 "\n", writtenFrameBytes);
++      debug_printf("Written OBU_FRAME_HEADER bytes: %" PRIu64 "\n", static_cast<uint64_t>(writtenFrameBytes));
+ 
+       assert(pD3D12Enc->m_BitstreamHeadersBuffer.size() ==
+              (writtenSequenceBytes + writtenTemporalDelimBytes + writtenFrameBytes));
+ 
+       debug_printf("Uploading %" PRIu64 " bytes from OBU headers to comp_bit_destination %p at offset 0\n",
+-                   pD3D12Enc->m_BitstreamHeadersBuffer.size(),
++                   static_cast<uint64_t>(pD3D12Enc->m_BitstreamHeadersBuffer.size()),
+                    associatedMetadata.comp_bit_destination);
+ 
+       // Upload headers to the finalized compressed bitstream buffer
+@@ -2361,7 +2361,7 @@ d3d12_video_encoder_build_post_encode_codec_bitstream_av1(struct d3d12_video_enc
+          debug_printf("Uploading tile group %d to comp_bit_destination %p at offset %" PRIu64 "\n",
+                       tg_idx,
+                       associatedMetadata.comp_bit_destination,
+-                      comp_bitstream_offset);
++                      static_cast<uint64_t>(comp_bitstream_offset));
+ 
+          size_t tile_group_obu_size = 0;
+          size_t decode_tile_elements_size = 0;
+@@ -2387,9 +2387,9 @@ d3d12_video_encoder_build_post_encode_codec_bitstream_av1(struct d3d12_video_enc
+ 
+          debug_printf("Written %" PRIu64 " bytes for OBU_TILE_GROUP open_bitstream_unit() prefix with obu_header() and "
+                       "obu_size to staging_bitstream_buffer %p at offset %" PRIu64 "\n",
+-                      writtenTileObuPrefixBytes,
++                      static_cast<uint64_t>(writtenTileObuPrefixBytes),
+                       associatedMetadata.m_StagingBitstreamConstruction.data(),
+-                      staging_bitstream_buffer_offset);
++                      static_cast<uint64_t>(staging_bitstream_buffer_offset));
+ 
+          writtenTileBytes += writtenTileObuPrefixBytes;
+ 
+@@ -2404,10 +2404,10 @@ d3d12_video_encoder_build_post_encode_codec_bitstream_av1(struct d3d12_video_enc
+ 
+          debug_printf("Uploading %" PRIu64 " bytes for OBU_TILE_GROUP open_bitstream_unit() prefix with obu_header() "
+                       "and obu_size: %" PRIu64 " to comp_bit_destination %p at offset %" PRIu64 "\n",
+-                      writtenTileObuPrefixBytes,
+-                      tile_group_obu_size,
++                      static_cast<uint64_t>(writtenTileObuPrefixBytes),
++                      static_cast<uint64_t>(tile_group_obu_size),
+                       associatedMetadata.comp_bit_destination,
+-                      comp_bitstream_offset);
++                      static_cast<uint64_t>(comp_bitstream_offset));
+ 
+          staging_bitstream_buffer_offset += writtenTileObuPrefixBytes;
+ 
+@@ -2517,7 +2517,7 @@ d3d12_video_encoder_build_post_encode_codec_bitstream_av1(struct d3d12_video_enc
+             // Add current pending frame being processed in the loop
+             extra_show_existing_frame_payload_bytes += writtenTemporalDelimBytes;
+ 
+-            debug_printf("Written OBU_TEMPORAL_DELIMITER bytes: %" PRIu64 "\n", writtenTemporalDelimBytes);
++            debug_printf("Written OBU_TEMPORAL_DELIMITER bytes: %" PRIu64 "\n", static_cast<uint64_t>(writtenTemporalDelimBytes));
+ 
+             size_t writtenShowExistingFrameBytes = 0;
+             av1_pic_header_t showExistingPicHdr = {};
+@@ -2561,7 +2561,7 @@ d3d12_video_encoder_build_post_encode_codec_bitstream_av1(struct d3d12_video_enc
+                          "in current frame ref_frame_idx[%" PRIu32 "]) bytes: %" PRIu64 "\n",
+                          *pendingFrameIt /*PictureIndex*/,
+                          showExistingPicHdr.frame_to_show_map_idx,
+-                         writtenShowExistingFrameBytes);
++                         static_cast<uint64_t>(writtenShowExistingFrameBytes));
+ 
+             // Remove it from the list of pending frames
+             pendingFrameIt =
+@@ -2628,7 +2628,7 @@ upload_tile_group_obu(struct d3d12_video_encoder *pD3D12Enc,
+                 tileGroup.tg_start,
+                 tileGroup.tg_end,
+                 comp_bit_destination,
+-                comp_bit_destination_offset);
++                static_cast<uint64_t>(comp_bit_destination_offset));
+ 
+    debug_printf("[Tile group start %d to end %d] Using staging_bitstream_buffer %p at offset %" PRIu64
+                 " to write the tile_obu_group() prefix syntax: tile_start_and_end_present_flag, tg_start, tg_end and "
+@@ -2636,7 +2636,7 @@ upload_tile_group_obu(struct d3d12_video_encoder *pD3D12Enc,
+                 tileGroup.tg_start,
+                 tileGroup.tg_end,
+                 staging_bitstream_buffer.data(),
+-                staging_bitstream_buffer_offset);
++                static_cast<uint64_t>(staging_bitstream_buffer_offset));
+ 
+    // Reserve space upfront in the scratch storage
+    // Do not modify anything before staging_bitstream_buffer_offset
+@@ -2673,9 +2673,9 @@ upload_tile_group_obu(struct d3d12_video_encoder *pD3D12Enc,
+                 " for tile_obu_group() prefix syntax: tile_start_and_end_present_flag, tg_start, tg_end\n",
+                 tileGroup.tg_start,
+                 tileGroup.tg_end,
+-                bitstream_tile_group_obu_bytes,
++                static_cast<uint64_t>(bitstream_tile_group_obu_bytes),
+                 staging_bitstream_buffer.data(),
+-                staging_bitstream_buffer_offset);
++                static_cast<uint64_t>(staging_bitstream_buffer_offset));
+ 
+ 
+    // Save this to compare the final written destination byte size against the expected tile_group_obu_size
+@@ -2699,11 +2699,11 @@ upload_tile_group_obu(struct d3d12_video_encoder *pD3D12Enc,
+                    " to comp_bit_destination %p at offset %" PRIu64 "\n",
+                    tileGroup.tg_start,
+                    tileGroup.tg_end,
+-                   bitstream_tile_group_obu_bytes,
++                   static_cast<uint64_t>(bitstream_tile_group_obu_bytes),
+                    staging_bitstream_buffer.data(),
+-                   staging_bitstream_buffer_offset,
++                   static_cast<uint64_t>(staging_bitstream_buffer_offset),
+                    comp_bit_destination,
+-                   comp_bit_destination_offset);
++                   static_cast<uint64_t>(comp_bit_destination_offset));
+ 
+       comp_bit_destination_offset += bitstream_tile_group_obu_bytes;
+       written_bytes_to_staging_bitstream_buffer += bitstream_tile_group_obu_bytes;
+@@ -2729,9 +2729,9 @@ upload_tile_group_obu(struct d3d12_video_encoder *pD3D12Enc,
+                       tileGroup.tg_start,
+                       tileGroup.tg_end,
+                       TileIdx,
+-                      TileSizeBytes,
++                      static_cast<uint64_t>(TileSizeBytes),
+                       staging_bitstream_buffer.data(),
+-                      (written_bytes_to_staging_bitstream_buffer + staging_bitstream_buffer_offset));
++                      static_cast<uint64_t>(written_bytes_to_staging_bitstream_buffer + staging_bitstream_buffer_offset));
+ 
+          // Upload current tile_size_minus_1
+          // Note: The buffer_subdata is queued in pD3D12Enc->base.context but doesn't execute immediately
+@@ -2751,11 +2751,11 @@ upload_tile_group_obu(struct d3d12_video_encoder *pD3D12Enc,
+                       tileGroup.tg_start,
+                       tileGroup.tg_end,
+                       TileIdx,
+-                      TileSizeBytes,
++                      static_cast<uint64_t>(TileSizeBytes),
+                       staging_bitstream_buffer.data(),
+-                      (written_bytes_to_staging_bitstream_buffer + staging_bitstream_buffer_offset),
++                      static_cast<uint64_t>(written_bytes_to_staging_bitstream_buffer + staging_bitstream_buffer_offset),
+                       comp_bit_destination,
+-                      comp_bit_destination_offset);
++                      static_cast<uint64_t>(comp_bit_destination_offset));
+ 
+          comp_bit_destination_offset += TileSizeBytes;
+          written_bytes_to_staging_bitstream_buffer += TileSizeBytes;
+@@ -2788,11 +2788,11 @@ upload_tile_group_obu(struct d3d12_video_encoder *pD3D12Enc,
+                    tileGroup.tg_start,
+                    tileGroup.tg_end,
+                    TileIdx,
+-                   tile_size,
++                   static_cast<uint64_t>(tile_size),
+                    src_driver_bitstream,
+-                   src_buf_tile_position,
++                   static_cast<uint64_t>(src_buf_tile_position),
+                    comp_bit_destination,
+-                   comp_bit_destination_offset);
++                   static_cast<uint64_t>(comp_bit_destination_offset));
+ 
+       comp_bit_destination_offset += tile_size;
+    }
+diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_bitstream_builder_av1.cpp b/src/gallium/drivers/d3d12/d3d12_video_encoder_bitstream_builder_av1.cpp
+index 25550a2b4fb..96b7e32eb8e 100644
+--- a/src/gallium/drivers/d3d12/d3d12_video_encoder_bitstream_builder_av1.cpp
++++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_bitstream_builder_av1.cpp
+@@ -153,7 +153,7 @@ d3d12_video_bitstream_builder_av1::write_temporal_delimiter_obu(std::vector<uint
+       write_obu_header(&bitstream_full_obu, OBU_TEMPORAL_DELIMITER, obu_extension_flag, temporal_id, spatial_id);
+ 
+       // Write the data size
+-      const size_t obu_size_in_bytes = 0;
++      const uint64_t obu_size_in_bytes = 0;
+       debug_printf("obu_size: %" PRIu64 " (temporal_delimiter_obu() has empty payload as per AV1 codec spec)\n",
+                    obu_size_in_bytes);
+       pack_obu_header_size(&bitstream_full_obu, obu_size_in_bytes);
+@@ -197,7 +197,7 @@ d3d12_video_bitstream_builder_av1::write_sequence_header(const av1_seq_header_t
+       write_obu_header(&bitstream_full_obu, OBU_SEQUENCE_HEADER, obu_extension_flag, temporal_id, spatial_id);
+ 
+       // Write the data size
+-      const size_t obu_size_in_bytes = static_cast<size_t>(bitstream_seq.get_byte_count());
++      const uint64_t obu_size_in_bytes = bitstream_seq.get_byte_count();
+       debug_printf("obu_size: %" PRIu64 "\n", obu_size_in_bytes);
+       pack_obu_header_size(&bitstream_full_obu, obu_size_in_bytes);
+ 
+@@ -802,7 +802,7 @@ d3d12_video_bitstream_builder_av1::write_frame_header(const av1_seq_header_t *pS
+       debug_printf("frame_header_obu() bytes (without OBU_FRAME nor OBU_FRAME_HEADER alignment padding): %" PRId32 "\n",
+                    bitstream_pic.get_byte_count());   // May be bit unaligned at this point (see padding below)
+       debug_printf("extra_obu_size_bytes (ie. tile_group_obu_size if writing OBU_FRAME ): %" PRIu64 "\n",
+-                   extra_obu_size_bytes);
++                   static_cast<uint64_t>(extra_obu_size_bytes));
+ 
+       // Write the obu_header
+       constexpr uint32_t obu_extension_flag = 0;
+@@ -825,7 +825,7 @@ d3d12_video_bitstream_builder_av1::write_frame_header(const av1_seq_header_t *pS
+       bitstream_pic.flush();
+ 
+       // Write the obu_size element
+-      const size_t obu_size_in_bytes = bitstream_pic.get_byte_count() + extra_obu_size_bytes;
++      const uint64_t obu_size_in_bytes = bitstream_pic.get_byte_count() + extra_obu_size_bytes;
+       debug_printf("obu_size: %" PRIu64 "\n", obu_size_in_bytes);
+       pack_obu_header_size(&bitstream_full_obu, obu_size_in_bytes);
+ 
+@@ -913,7 +913,7 @@ d3d12_video_bitstream_builder_av1::write_obu_tile_group_header(size_t tile_group
+ 
+    // Write the obu_size element
+    pack_obu_header_size(&bitstream_full_obu, tile_group_obu_size);
+-   debug_printf("obu_size: %" PRIu64 "\n", tile_group_obu_size);
++   debug_printf("obu_size: %" PRIu64 "\n", static_cast<uint64_t>(tile_group_obu_size));
+ 
+    bitstream_full_obu.flush();
+ 
+diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.cpp b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.cpp
+index 49892338984..2f4bcf0e1eb 100644
+--- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.cpp
++++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.cpp
+@@ -213,7 +213,7 @@ d3d12_video_encoder_references_manager_av1::print_virtual_dpb_entries()
+                 "Number of DPB virtual entries is %" PRIu64 " entries for frame with OrderHint "
+                 "%d (PictureIndex %d) are: \n%s \n",
+                 m_PhysicalAllocationsStorage.get_number_of_pics_in_dpb(),
+-                m_CurrentFrameReferencesData.pVirtualDPBEntries.size(),
++                static_cast<uint64_t>(m_CurrentFrameReferencesData.pVirtualDPBEntries.size()),
+                 m_CurrentFramePicParams.OrderHint,
+                 m_CurrentFramePicParams.PictureIndex,
+                 dpbContents.c_str());
diff --git a/pkgs/development/libraries/mesa/default.nix b/pkgs/development/libraries/mesa/default.nix
index 4d8df1d9f0788..d28b5434e8459 100644
--- a/pkgs/development/libraries/mesa/default.nix
+++ b/pkgs/development/libraries/mesa/default.nix
@@ -121,17 +121,17 @@ self = stdenv.mkDerivation {
 
     ./opencl.patch
     ./disk_cache-include-dri-driver-path-in-cache-key.patch
-  ] ++ lib.optionals stdenv.isDarwin [
+
+    # Backports to fix build
+    # FIXME: remove when applied upstream
+
     # Fix build on macOS
-    # Last two commits from https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25992
-    (fetchpatch {
-      url = "https://gitlab.freedesktop.org/mesa/mesa/-/commit/c8b64452c076c1768beb23280de25faf2bcbe2c8.diff";
-      hash = "sha256-mqivdzyoLtkfkAb+r57gjPwg8d7whgFAahiUhGVOOvo=";
-    })
-    (fetchpatch {
-      url = "https://gitlab.freedesktop.org/mesa/mesa/-/commit/96d55d784cb4f047a4b58cd08330f42208641ea7.diff";
-      hash = "sha256-SkWdvqltfByFiKlhr9YILA6qWQxuyKz/YTanVp/NMzg=";
-    })
+    ./backports/0001-dri-added-build-dependencies-for-systems-using-non-s.patch
+    ./backports/0002-util-Update-util-libdrm.h-stubs-to-allow-loader.c-to.patch
+    ./backports/0003-glx-fix-automatic-zink-fallback-loading-between-hw-a.patch
+
+    # Fix build on i686
+    ./backports/0004-d3d12-Fix-AV1-video-encode-32-bits-build.patch
   ];
 
   postPatch = ''