sokol icon indicating copy to clipboard operation
sokol copied to clipboard

gfx proposal: support for floating point depth buffer with a stencil component

Open kcbanner opened this issue 1 year ago • 2 comments

Currently, both SG_PIXELFORMAT_DEPTH and SG_PIXELFORMAT_DEPTH_STENCIL are supported, with the former being a 32 bit floating point depth buffer, and the latter being a 24 bit unsigned depth buffer and 8 bit stencil.

OpenGL 4.3 and ES 3.0 have: DEPTH32F_STENCIL8
D3D11 has: DXGI_FORMAT_D32_FLOAT_S8X24_UINT Metal has: MTLPixelFormatDepth32Float_Stencil8 (https://developer.apple.com/documentation/metal/mtlpixelformat/mtlpixelformatdepth32float_stencil8)

Is there room for an SG_PIXELFORMAT that maps to this format, if so what would it be called? I'm not sure how it would map onto the current naming convention.

I'm happy to implement this, although I won't be able to test the Metal version.

kcbanner avatar Oct 14 '24 04:10 kcbanner

Hmm, yeah, I tiptoed around being able to select a specific depth- or depth-stencil format, and tbh, I would like to allow some wiggle room in the future too (at least for the 'basic' DEPTH and DEPTH_STENCIL pixelformats which don't explicitly specify a precision).

For instance in WebGPU the float32+stencil8 format is behind a feature flag because it's not supported everywhere.

In general, we should use the WebGPU naming convention for explicit depth- and depth-stencil formats (because I also used WebGPU as reference for the entire pixel formats list in sokol-gfx), converted to the sokol-gfx style it would be:

  • SG_PIXELFORMAT_DEPTH32F_STENCIL8

...and if we want other explicit formats too:

  • SG_PIXELFORMAT_DEPTH24PLUS
  • SG_PIXELFORMAT_DEPTH24PLUS_STENCIL8
  • SG_PIXELFORMAT_DEPTH32F

...I think we can leave out WebGPU's depth16unorm and stencil8 formats, since 16-bit depth is hopefully irrelevant by now, and a stencil8 without depth seems fairly exotic.

The 'flexible' SG_PIXELFORMAT_DEPTH and SG_PIXELFORMAT_DEPTH_STENCIL should stay though which allows us to provide a 'recommended' explicit format for a specific backend / target platform.

floooh avatar Oct 14 '24 09:10 floooh

That all sounds good to me, I'll take a look at implementing this.

kcbanner avatar Oct 14 '24 17:10 kcbanner