I want to address the missing or incomplete DirectX calls from D3DMetal and Game Porting Toolkit 3. These missing calls have in part caused issue with our porting process and we are reconsidering.
Missing or Incomplete Calls
-
DXGI_FEATURE_PRESENT_ALLOW_TEARING — IDXGIFactory5::CheckFeatureSupport — this calls has to do with how VSync is handled and some modern games require it to initialize. Currently D3DMetal return 0 maybe by design but most likely because it’s not integrated. Adding a stub that returns 1 can fix this. I’m my use case I simply Noped the check and forced it to continue.
-
D3D12_FEATURE_D3D12_OPTIONS2.DepthBoundsTestSupported — this call is also not present. Which causes games to not initialize rendering. Thankfully this was fixed by once again skipping the check. But this is essential for water rendering. This could be one reason currently water is not rendering in our game.
-
IDXGIOutput6::GetDesc1().ColorSpace — returns DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 (SDR) on external HDR compatible displays. We were able to fix this by forcing HDR to be enabled. It should return HDR support.
These calls may exist but they need to be updated to return the correct values. Specifically for depth bound test you can reference MoltenVK which sets it up on top of Metal since it’s not a native feature. The water issue could be also an issue with how the shaders are compiled. But I’m unable to check because of the closed source nature of GPTK and its debuggers.
What is a better way we can debug our game to see why the water isn’t rendering. Does D3DMetal have some debug options or something similar?
Feedback Number
FB22330617 - Missing DirectX Calls for Tearing and Depth Bound Test in D3DMetal and GPTK 3
We hope these issues are resolved quickly because we were thinking of a simultaneous release with our Windows version, but we can't ship with such large bugs.
Thanks for the detailed report and for filing FB22330617.
A couple of clarifications on the specific items:
For D3D12_FEATURE_D3D12_OPTIONS2.DepthBoundsTestSupported — depth bounds testing is not supported on all Apple Silicon hardware. If your hardware doesn't support it, D3DMetal is returning the correct value. Your game should have a code path that handles hardware where this feature isn't available.
For IDXGIOutput6::GetDesc1().ColorSpace returning SDR on an HDR-capable display — can you clarify whether you're seeing this on the built-in display, an external display, or both? That distinction affects the diagnosis.
For debugging the water rendering issue, Xcode's GPU frame capture is the recommended approach. Capture a frame while the issue is visible and inspect the draw calls, shader inputs, and render targets to identify where the geometry or shader output diverges from what you expect. Given that you're seeing the water placed at an extreme Y position, the frame capture should help narrow down whether it's a vertex shader translation issue or something else.