NVMTLDriver (2.5.3): cursor lag and slow drags during screen capture - IOSurface re-imports and tiny-surface re-uploads (measurements + patch)
Maintainers usually reply within 2 days
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 25/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- macos, objective-c
- Domain
- performance
Research direction
Start with the proposed changes in plugin/NVMTLDevice.m and compare them with the v2.5.3 implementation. Review the shared IOSurface VRAM import lifecycle and the small surface-in seed and tag checks; the report gives measurements and a caveat that the shadow skip was not shown to cause the upload reduction. Done means validating the changes under the stated screen capture repro and confirming image correctness and the reported performance gains.
Written by the indexing model from the issue text.
Description
Machine: RTX 5080, macOS 26.7.1, NullMoth 2.5.3. Displays: 5120x1440 @ 144 Hz (DP, the captured one) and a 2560x1440 @ 540 Hz (HDMI).
Repro: share the whole 5120x1440 display in Discord (ScreenCaptureKit), then move the cursor / drag a browser tab.
What was wrong
During a capture, window drags on the captured display fell to 36-52 presents/s (110-140 without a capture) and the cursor lagged; cursor updates run on WindowServer's main thread between display updates. NVRMFB's present stats were clean (0 late, longest completion wait ~7.4 ms), so the time went into WindowServer's main thread, in two places in NVMTLDriver:
- IOSurface VRAM re-imports. CoreAnimation wraps the same IOSurfaces again on every frame during a capture (
CA::OGL::FlattenNode::retain_surfaceand friends). Each-newTextureWithDescriptor:iosurface:plane:over family VRAM was a new RM import (nvk_AllocateMemory->nvkmd_nvrm_import_dma_buf), because the per-device cache keeps only private images (if (key && !t->_vramOn) [cache setObject:t forKey:key];). dtrace: 1518 wraps of about a dozen surfaces in 10 s, every one an import; spindump: 139 of 1001 main-thread samples. - A tiny CPU-written surface re-uploaded every frame. With (1) fixed, a long share still kept WindowServer at 75-100% CPU. dtrace on
-[NVMTLTexture nvmtlSurfaceIn]: one 8x8 surface uploaded 1926 times in 12 s, each throughnvmtl_vk_image_write_host(host import, map, submit_wait, unmap, free), ~1.4 ms per upload, ~1.5 s of the 12 s.
What changes (diff below, against v2.5.3; plugin only)
- Shared VRAM imports (
nvmtl_surfvram_get/put/sweep, used innvmtl_surface_image_create): a texture over a surface's VRAM takes a reference to that surface's import (keyed by IOSurfaceRef, ID, plane, size). The import outlives its textures until the surface is gone (only the cache retains it) or it is the least recently used unreferenced entry (256 entries). A surface is admitted on its second import within a 512-entry ring, so one-off surfaces (video frames) pass through. Each texture still builds its own image and does its own seed/tag sync. Relies ondebug.nvaccel_vm_sticky=1(the default, #200); off otherwise, andNVMTL_NO_SURFVRAM_CACHE=1turns it off. - Small surface-in (surfaces of at most 64 KB,
-nvmtlSurfaceIn): a shadow of the bytes last uploaded lives on the IOSurface object (associated object, since WindowServer wraps the surface in a new texture on most frames), with the surface's VRAM tag generation. A new seed over identical bytes is synced without an upload: for shared VRAM only while the tag generation is unchanged, for a private image only for the texture that was uploaded into. A real change goes through the staging copy instead of the page import. The shadow is dropped in-nvmtlSurfaceOutDirtied:.
Results (same machine, same full-screen Discord share, measured after a restart each time)
| stock 2.5.3 | with this patch | |
|---|---|---|
| VRAM imports per IOSurface wrap | every wrap | 19 for 2046 wraps in 15 s (with a Firefox video playing: 961 for 4930) |
| 8x8 surface uploads in 12 s | 1926 | 0 |
| time in surface-in, 12 s | ~1.5 s | 0.15 s |
| WindowServer CPU during a long share | 75-100% | ~42% |
| tab drags on the captured display | 36-52 presents/s | 83-111 presents/s, cursor no longer lags |
Desktop, Dock, menus and windows look normal with it (no stale or garbled content). Built like build/build_plugin_release.sh (x86_64, minos 15.0, -DNVMTL_RELEASE=1).
One caveat on change 2: in the measured run the shadow skip itself did not fire; the 8x8 surface no longer reached the upload at all (the existing seed/tag check returned first). So the traffic is gone, but which part removed it isn't proven; my guess is that the host-import path itself made the surface look changed again. Worth a look on your side.
Not addressed: -[NVMTLCommandBuffer dealloc] -> objc_sync_enter waits on a lock the nvmtl.execution worker holds (60 of 1001 main-thread samples during a capture).
Patch (git diff v2.5.3, plugin/)
diff --git a/plugin/NVMTLDevice.m b/plugin/NVMTLDevice.m
index 90205a1..8783455 100644
--- a/plugin/NVMTLDevice.m
+++ b/plugin/NVMTLDevice.m
@@ -918,16 +918,126 @@ static void nvmtl_vram_tag_set(IOSurfaceRef surf, NSUInteger plane, uint32_t see
CFDataRef d = CFDataCreate(NULL, (const UInt8 *)&t, sizeof t); CFStringRef k = nvmtl_vram_tag_key(plane);
IOSurfaceSetValue(surf, k, d); CFRelease(k); CFRelease(d);
}
+// Shared VRAM imports (surfcache). WindowServer wraps the same few IOSurfaces again and again: a 10 s dtrace during a
+// Discord screen capture saw 1518 -newTextureWithDescriptor:iosurface:plane: calls for about a dozen surfaces, each
+// one an RM import (nvk_AllocateMemory -> nvkmd_nvrm_import_dma_buf) because the per-device surface cache keeps only
+// private images (a VRAM wrapper is dropped with its last texture, after one use). Here the import itself is kept and
+// shared: a texture over a surface's VRAM takes a reference to the surface's import, and the import outlives its
+// textures until the surface is gone (only this cache still retains it), the cache is full, or it is evicted as the
+// least recently used. Each texture still makes its own image over the buffer and does its own seed/tag sync, as
+// before. The VRAM stays the surface's own across page-off because NVAccel parks and hands it back
+// (debug.nvaccel_vm_sticky=1); with sticky off the cache stays off. NVMTL_NO_SURFVRAM_CACHE=1 turns it off.
+typedef struct nvmtl_surfvram {
+ IOSurfaceRef surf; uint32_t id, plane; size_t need;
+ nvk_buffer vb; uint32_t refs; uint64_t used;
+} nvmtl_surfvram;
+#define NVMTL_SURFVRAM_N 256 // a desktop under capture cycles ~70 surfaces per frame (dtrace, 2026-10-22)
+static nvmtl_surfvram g_svc[NVMTL_SURFVRAM_N];
+static pthread_mutex_t g_svc_lock = PTHREAD_MUTEX_INITIALIZER;
+static uint64_t g_svc_clock, g_svc_hits, g_svc_miss, g_svc_evict, g_svc_once;
+#define NVMTL_SURFVRAM_SEEN 512
+static uintptr_t g_svc_seen[NVMTL_SURFVRAM_SEEN]; static unsigned g_svc_seen_at;
+static int nvmtl_surfvram_on(void)
+{
+ static int on = -1;
+ if (on < 0) {
+ const char *e = getenv("NVMTL_NO_SURFVRAM_CACHE");
+ int sticky = 0; size_t n = sizeof sticky;
+ if (sysctlbyname("debug.nvaccel_vm_sticky", &sticky, &n, NULL, 0)) sticky = 0;
+ on = !(e && e[0] == '1') && sticky == 1;
+ nvlog("surfcache: shared IOSurface VRAM imports %s (vm_sticky %d, NVMTL_NO_SURFVRAM_CACHE=%s)", on ? "ON" : "off", sticky, e ?: "unset");
+ }
+ return on;
+}
+// an unused entry (no texture holds it) whose surface only this cache still retains, or any unused one when forced
+static void nvmtl_surfvram_drop_locked(nvmtl_surfvram *e, nvk_buffer *dead, IOSurfaceRef *deadSurf)
+{
+ *dead = e->vb; *deadSurf = e->surf; g_svc_evict++;
+ memset(e, 0, sizeof *e);
+}
+static void nvmtl_surfvram_sweep(int needSlot)
+{
+ nvk_buffer dead[NVMTL_SURFVRAM_N]; IOSurfaceRef deadSurf[NVMTL_SURFVRAM_N]; unsigned nd = 0;
+ pthread_mutex_lock(&g_svc_lock);
+ int freeSlot = 0;
+ for (unsigned i = 0; i < NVMTL_SURFVRAM_N; i++) {
+ nvmtl_surfvram *e = &g_svc[i];
+ if (!e->surf) { freeSlot = 1; continue; }
+ if (!e->refs && CFGetRetainCount(e->surf) <= 1) { nvmtl_surfvram_drop_locked(e, &dead[nd], &deadSurf[nd]); nd++; freeSlot = 1; }
+ }
+ if (needSlot && !freeSlot) {
+ nvmtl_surfvram *lru = NULL;
+ for (unsigned i = 0; i < NVMTL_SURFVRAM_N; i++)
+ if (g_svc[i].surf && !g_svc[i].refs && (!lru || g_svc[i].used < lru->used)) lru = &g_svc[i];
+ if (lru) { nvmtl_surfvram_drop_locked(lru, &dead[nd], &deadSurf[nd]); nd++; }
+ }
+ pthread_mutex_unlock(&g_svc_lock);
+ for (unsigned k = 0; k < nd; k++) { nvmtl_vk_buffer_destroy(&dead[k]); CFRelease(deadSurf[k]); }
+}
+// 0 and *out/*share filled: the texture uses the surface's shared import; -1: import refused (caller goes private)
+static int nvmtl_surfvram_get(IOSurfaceRef surf, uint32_t plane, size_t need, nvk_buffer *out, void **share)
+{
+ *share = NULL;
+ if (!nvmtl_surfvram_on()) return nvmtl_vk_surface_vram(IOSurfaceGetID(surf), plane, need, out);
+ const uint32_t id = IOSurfaceGetID(surf);
+ pthread_mutex_lock(&g_svc_lock);
+ for (unsigned i = 0; i < NVMTL_SURFVRAM_N; i++) {
+ nvmtl_surfvram *e = &g_svc[i];
+ if (e->surf == surf && e->id == id && e->plane == plane && e->need == need) {
+ e->refs++; e->used = ++g_svc_clock; g_svc_hits++;
+ *out = e->vb; out->imported = 1; *share = e;
+ const int sweep = (g_svc_hits & 255) == 0;
+ pthread_mutex_unlock(&g_svc_lock);
+ if (sweep) nvmtl_surfvram_sweep(0); // let go of surfaces the app has freed even when nothing misses
+ return 0;
+ }
+ }
+ g_svc_miss++;
+ const uint64_t miss = g_svc_miss, hits = g_svc_hits, ev = g_svc_evict;
+ // Admission: a surface is cached from its second import while it is still in the recent ring. Video frames and
+ // other surfaces an app makes once (Firefox playing a video made ~1400 2 MB surfaces in 6 s) pass straight through
+ // and no longer evict the surfaces CoreAnimation re-wraps every frame.
+ const uintptr_t tag = (uintptr_t)surf ^ ((uintptr_t)id << 32) ^ (uintptr_t)need;
+ int admit = 0;
+ for (unsigned i = 0; i < NVMTL_SURFVRAM_SEEN && !admit; i++) admit = g_svc_seen[i] == tag;
+ if (!admit) { g_svc_seen[g_svc_seen_at++ % NVMTL_SURFVRAM_SEEN] = tag; g_svc_once++; }
+ pthread_mutex_unlock(&g_svc_lock);
+ if (!admit) return nvmtl_vk_surface_vram(id, plane, need, out); // first sight: this texture owns its import
+ if (miss <= 4 || miss % 500 == 0)
+ nvlog("surfcache: %llu hits, %llu imports, %llu evicted", (unsigned long long)hits, (unsigned long long)miss, (unsigned long long)ev);
+ nvk_buffer vb;
+ if (nvmtl_vk_surface_vram(id, plane, need, &vb)) return -1;
+ nvmtl_surfvram_sweep(1);
+ pthread_mutex_lock(&g_svc_lock);
+ nvmtl_surfvram *slot = NULL;
+ for (unsigned i = 0; i < NVMTL_SURFVRAM_N && !slot; i++) if (!g_svc[i].surf) slot = &g_svc[i];
+ if (!slot) { pthread_mutex_unlock(&g_svc_lock); *out = vb; return 0; } // every entry in use: this texture owns its import
+ CFRetain(surf);
+ slot->surf = surf; slot->id = id; slot->plane = plane; slot->need = need; slot->vb = vb;
+ slot->refs = 1; slot->used = ++g_svc_clock;
+ *out = vb; *share = slot;
+ pthread_mutex_unlock(&g_svc_lock);
+ return 0;
+}
+static void nvmtl_surfvram_put(void *share)
+{
+ if (!share) return;
+ pthread_mutex_lock(&g_svc_lock);
+ nvmtl_surfvram *e = (nvmtl_surfvram *)share;
+ if (e->refs) e->refs--;
+ pthread_mutex_unlock(&g_svc_lock);
+}
+
static int nvmtl_surface_image_create(NVMTLTexture *t, IOSurfaceRef surf, NSUInteger plane, uint32_t w, uint32_t h,
uint32_t vkf, uint32_t bpp, int a8, int stex)
{
if (surf && plane == 0 && IOSurfaceGetPlaneCount(surf) <= 1 && nvmtl_vk_surface_share_on()) {
size_t row = IOSurfaceGetBytesPerRow(surf), sh = IOSurfaceGetHeight(surf);
if ((size_t)w * (bpp ? bpp : 4) <= row && h <= sh && row % 32 == 0) {
- nvk_buffer vb;
- if (!nvmtl_vk_surface_vram(IOSurfaceGetID(surf), 0, row * h, &vb)) {
+ nvk_buffer vb; void *share = NULL;
+ if (!nvmtl_surfvram_get(surf, 0, row * h, &vb, &share)) {
if (!nvmtl_vk_image_create_buffer_alias(w, h, vkf, bpp, a8, stex, 1, &vb, 0, row, &t->_i)) {
- t->_vramBuf = vb; t->_vramOn = YES; g_surf_vram++;
+ t->_vramBuf = vb; t->_vramOn = YES; t->_vramShare = share; g_surf_vram++;
uint32_t seed = IOSurfaceGetSeed(surf);
int current = nvmtl_vram_tag_current(surf, 0, seed);
if (current) { t->_surfSeed = seed; t->_surfSynced = YES; }
@@ -936,7 +1046,8 @@ static int nvmtl_surface_image_create(NVMTLTexture *t, IOSurfaceRef surf, NSUInt
w, h, row, current ? ", already current (no upload)" : "", g_surf_vram, g_surf_private);
return 0;
}
- nvmtl_vk_buffer_destroy(&vb);
+ if (share) nvmtl_surfvram_put(share); // the shared import stays for the next wrapper
+ else nvmtl_vk_buffer_destroy(&vb);
}
}
}
@@ -2129,6 +2240,17 @@ - (NSUInteger)gpuCoreCount { uint32_t sm = 0; nvmtl_vk_limits(NULL, NULL, NULL,
#import "NVMTLDevice_contract.m"
+// surface-in shadow (see -[NVMTLTexture nvmtlSurfaceIn])
+#define NVMTL_SURFIN_SHADOW_MAX (64u * 1024u)
+// The shadow belongs to the IOSurface object (an associated object), not to a texture: WindowServer wraps the same
+// surface in a new texture on most frames. gen is the surface's VRAM tag generation when the shadow was taken (0 for
+// private images).
+@interface NVMTLSurfShadow : NSObject { @public NSData *_bytes; uint32_t _gen; __weak id _owner; } @end // _owner: the texture whose private image holds the bytes
+@implementation NVMTLSurfShadow @end
+static char nvmtl_surfin_shadow_key;
+static NVMTLSurfShadow *nvmtl_surfin_shadow(IOSurfaceRef s) { return objc_getAssociatedObject((__bridge id)s, &nvmtl_surfin_shadow_key); }
+static void nvmtl_surfin_shadow_set(IOSurfaceRef s, NVMTLSurfShadow *v) {
+ objc_setAssociatedObject((__bridge id)s, &nvmtl_surfin_shadow_key, v, OBJC_ASSOCIATION_RETAIN); }
#import "NVMTLObjects.m"
#import "NVMTLForward.m"
#import "NVMTLLibraryLoad.m"
diff --git a/plugin/NVMTLObjects.h b/plugin/NVMTLObjects.h
index 0524ba9..545b14b 100644
--- a/plugin/NVMTLObjects.h
+++ b/plugin/NVMTLObjects.h
@@ -45,7 +45,7 @@ static inline void *nvmtl_buf_cpu(NVMTLBuffer *b) { nvmtl_buf_settle(b); return
uint32_t _viewType, _viewSlices, _relativeLevel, _relativeSlice;
uint32_t _baseSlice, _baseLevel;
uint32_t _surfSeed, _surfGen; BOOL _surfSynced, _surfOwned;
- nvk_buffer _vramBuf; BOOL _vramOn;
+ nvk_buffer _vramBuf; BOOL _vramOn; void *_vramShare;
BOOL _stex;
uint64_t _resid;
NSUInteger _usage;
diff --git a/plugin/NVMTLObjects.m b/plugin/NVMTLObjects.m
index 01f018b..2fb9c88 100644
--- a/plugin/NVMTLObjects.m
+++ b/plugin/NVMTLObjects.m
@@ -1169,7 +1169,10 @@ - (void)dealloc {
if (!_parent && _bparkable && _backBuf && _i.img) nvmtl_bpark_put(_backBuf, &_i, _pkey);
if (!_parent) nvmtl_vk_image_destroy(&_i);
if (_stTwin.img) nvmtl_vk_image_destroy(&_stTwin);
- if (!_parent && _vramOn) { nvmtl_vk_buffer_destroy(&_vramBuf); _vramOn = NO; }
+ if (!_parent && _vramOn) {
+ if (_vramShare) { nvmtl_surfvram_put(_vramShare); _vramShare = NULL; memset(&_vramBuf, 0, sizeof _vramBuf); }
+ else nvmtl_vk_buffer_destroy(&_vramBuf);
+ _vramOn = NO; }
if (_surfOwned && _surf) CFRelease(_surf);
if (_subHeap) { NVMTLHeap *h = _subHeap; NSUInteger c = _subCharge; _subHeap = nil; _subCharge = 0;
if (_subPlaced && c) { _subPlaced = NO; [h nvmtlGiveRange:_heapOffset length:c]; }
@@ -1240,8 +1243,26 @@ - (void)nvmtlSurfaceIn {
if (IOSurfaceLock(r->_surf, kIOSurfaceLockReadOnly, &seed) != kIOReturnSuccess) { nvlog("G13 surface-in: IOSurfaceLock FAILED"); return; }
void *base = IOSurfaceGetBaseAddressOfPlane(r->_surf, (uint32_t)r->_plane);
size_t row = IOSurfaceGetBytesPerRowOfPlane(r->_surf, (uint32_t)r->_plane);
+ // Small surfaces: during a screen capture WindowServer re-uploaded one 8x8 surface ~127 times a second at ~1.4 ms
+ // each (host import, map, submit, wait, unmap, free), about 17% of its main thread. The bytes last uploaded are kept;
+ // a new seed over the same bytes is synced without an upload, and a real change is copied through the staging path
+ // (no page import). The shadow is dropped whenever the GPU writes the surface (-nvmtlSurfaceOutDirtied:).
+ const size_t span = (base && row) ? (size_t)r->_i.h * row : 0;
+ const bool small = span && span <= NVMTL_SURFIN_SHADOW_MAX;
+ // shared VRAM can be written by another process's GPU: its tag generation (bumped on every GPU write, in any
+ // process) must be the one recorded when the shadow was taken
+ NVMTLSurfShadow *shadow = small ? nvmtl_surfin_shadow(r->_surf) : nil;
+ // shared VRAM holds the bytes for every texture over the surface; a private image only for the texture uploaded into
+ if (shadow && shadow->_bytes.length == span && (r->_vramOn ? shadow->_gen == nvmtl_vram_gen(r->_surf, r->_plane) : shadow->_owner == r)
+ && !memcmp(shadow->_bytes.bytes, base, span)) {
+ IOSurfaceUnlock(r->_surf, kIOSurfaceLockReadOnly, NULL);
+ r->_surfSeed = seed; r->_surfSynced = YES; r->_surfGen = vgen; g_surfin_skip++;
+ if (r->_vramOn) nvmtl_vram_tag_set(r->_surf, r->_plane, seed);
+ return;
+ }
+ NSData *taken = small ? [NSData dataWithBytes:base length:span] : nil; // read under the lock; kept only if the upload succeeds
int rc = -1;
- if (base && row && nvmtl_surfin_import()) {
+ if (base && row && !small && nvmtl_surfin_import()) {
const size_t off = (size_t)((uint8_t *)base - (uint8_t *)IOSurfaceGetBaseAddress(r->_surf));
rc = nvmtl_vk_image_write_host(r->_q, &r->_i, base, row, IOSurfaceGetAllocSize(r->_surf) - off);
}
@@ -1251,6 +1272,8 @@ - (void)nvmtlSurfaceIn {
if (rc) { nvlog("G13 surface-in: upload FAILED (%ux%u) — retried at the next use", r->_i.w, r->_i.h); return; }
r->_surfSeed = seed; r->_surfSynced = YES; r->_surfGen = vgen;
g_surfin_copy++; if (r->_vramOn) nvmtl_vram_tag_set(r->_surf, r->_plane, seed);
+ if (taken) { NVMTLSurfShadow *v = [NVMTLSurfShadow new]; v->_bytes = taken; v->_gen = r->_vramOn ? nvmtl_vram_gen(r->_surf, r->_plane) : 0; v->_owner = r;
+ nvmtl_surfin_shadow_set(r->_surf, v); }
static unsigned n; if (n++ < 6 || n % 2000 == 0) nvlog("G13 surface-in #%u: %ux%u surface %p seed %u uploaded", n, r->_i.w, r->_i.h, (void *)r->_surf, seed);
}
}
@@ -1288,6 +1311,7 @@ - (BOOL)nvmtlSurfaceOutDirtied:(BOOL)dirtied {
NVMTLTexture *r = _parent ? _parent : self;
if (!r->_surf) return YES;
@synchronized (nvmtl_surface_sync(r)) {
+ if (nvmtl_surfin_shadow(r->_surf)) nvmtl_surfin_shadow_set(r->_surf, nil); // the GPU wrote it: the next CPU seed uploads
if (![r nvmtlSurfaceCopyable]) { nvtrace("SURFOUT surf %u %ux%u NOT copyable", (unsigned)IOSurfaceGetID(r->_surf), r->_i.w, r->_i.h); return NO; }
nvtrace("SURFOUT surf %u %ux%u vramOn %d t=%llu", (unsigned)IOSurfaceGetID(r->_surf), r->_i.w, r->_i.h, (int)r->_vramOn,
(unsigned long long)(clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1000));
- Dominant language
- Rust
- Stars
- 2.5k
- Forks
- 233
- Avg merge
- 21h 20m
- Merged PRs (30d)
- 3
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from nullmoth/nvidia-macos-driver
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
nullmoth/nvidia-macos-driver#141 · 1 comment ·
Maintainers usually reply within 2 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 73/100
nullmoth/nvidia-macos-driver#28 ·
Maintainers usually reply within 2 days
-
bug
Difficulty 4/5 3-5 days Newbie friendliness 43/100
nullmoth/nvidia-macos-driver#364 ·
Maintainers usually reply within 2 days
-
bug
Difficulty 5/5 Over a week Newbie friendliness 35/100
nullmoth/nvidia-macos-driver#363 ·
Maintainers usually reply within 2 days
-
[Bug] Same here on RTX 4060 Ti (desktop, DisplayPort), macOS 15.8.1, 1401 / NVIDIA driver 2.5.3.Openbug
Difficulty 5/5 Over a week Newbie friendliness 25/100
nullmoth/nvidia-macos-driver#361 ·
Maintainers usually reply within 2 days
All issues in nullmoth/nvidia-macos-driver
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
foxglove/mcap#1907 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 66/100
Maintainers usually reply within 1 day
-
good first issue help wanted r-feature
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
servo/rust-smallvec#792 ·
Maintainers usually reply within 1 day
-
A-Unicode C-bug P-low
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
rust-lang/rustfmt#7210 · 1 comment ·
Maintainers usually reply within 1 day
-
callTracer with withLog: true includes logs from a reverted top-level call (diverges from geth)Open
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
paradigmxyz/revm-inspectors#570 ·
Maintainers usually reply within 1 day