Răsfoiți Sursa

sokol_gfx.h Metal: handle currentDrawable == nil (fixes #504)

- presentDrawable is skipped if the drawable_cb returns nil
- moved the completion handler block up into the first begin-pass
  of a frame, this should make a difference, but it's similar now
  to the Xcode Metal example project.
- tested by returning nil from
  sapp_metal_get_renderpass_descriptor() and/or sapp_metal_get_drawable()
Andre Weissflog 4 ani în urmă
părinte
comite
0c5bc3a7f0
1 a modificat fișierele cu 8 adăugiri și 5 ștergeri
  1. 8 5
      sokol_gfx.h

+ 8 - 5
sokol_gfx.h

@@ -10578,6 +10578,11 @@ _SOKOL_PRIVATE void _sg_mtl_begin_pass(_sg_pass_t* pass, const sg_pass_action* a
         /* block until the oldest frame in flight has finished */
         dispatch_semaphore_wait(_sg.mtl.sem, DISPATCH_TIME_FOREVER);
         _sg.mtl.cmd_buffer = [_sg.mtl.cmd_queue commandBufferWithUnretainedReferences];
+        [_sg.mtl.cmd_buffer addCompletedHandler:^(id<MTLCommandBuffer> cmd_buffer) {
+            // NOTE: this code is called on a different thread!
+            _SOKOL_UNUSED(cmd_buffer);
+            dispatch_semaphore_signal(_sg.mtl.sem);
+        }];
     }
 
     /* if this is first pass in frame, get uniform buffer base pointer */
@@ -10724,11 +10729,9 @@ _SOKOL_PRIVATE void _sg_mtl_commit(void) {
     else {
         cur_drawable = (__bridge id<MTLDrawable>) _sg.mtl.drawable_userdata_cb(_sg.mtl.user_data);
     }
-    [_sg.mtl.cmd_buffer presentDrawable:cur_drawable];
-    [_sg.mtl.cmd_buffer addCompletedHandler:^(id<MTLCommandBuffer> cmd_buffer) {
-        _SOKOL_UNUSED(cmd_buffer);
-        dispatch_semaphore_signal(_sg.mtl.sem);
-    }];
+    if (nil != cur_drawable) {
+        [_sg.mtl.cmd_buffer presentDrawable:cur_drawable];
+    }
     [_sg.mtl.cmd_buffer commit];
 
     /* garbage-collect resources pending for release */