http://aras-p.info/texts/D3D9GPUHacks.html
Direct3D9 GPU Hacks
I've been trying to catch up what hacks GPU vendors have exposed in Direct3D9, and turns out there's a lot of them!
If you know more hacks or more details, please let me know! (mail or comment on my blog post).
Most hacks are exposed as custom ("FOURCC") formats. So to check for that, you do
CheckDeviceFormat
. Here's the list (Usage column codes: DS=DepthStencil, RT=RenderTarget; Resource column codes: tex=texture, surf=surface). More green = more hardware support.
Format | Usage | Resource | Description | NVIDIA GeForce | ATI Radeon | Intel |
---|---|---|---|---|---|---|
Shadow mapping | ||||||
D3DFMT_D16 | DS | tex | Sample depth buffer directly as shadow map. | 3+ | HD 2xxx+ | ? |
D3DFMT_D24X8 | DS | tex | 3+ | HD 2xxx+ | ? | |
Depth Buffer As Texture | ||||||
DF16 | DS | tex | Read depth buffer as texture. | 9500+ | ? | |
DF24 | DS | tex | X1300+ | ? | ||
INTZ | DS | tex | 8+ | HD 4xxx+ | ? | |
RAWZ | DS | tex | 6 & 7 | ? | ||
Anti-Aliasing related | ||||||
RESZ | RT | surf | Resolve MSAA'd depth stencil surface into non-MSAA'd depth texture. | HD 4xxx+ | ? | |
ATOC | surf | Transparency anti-aliasing. | 7+ | ? | ||
SSAA | surf | 7+ | ? | |||
All ATI SM2.0+ hardware | 9500+ | ? | ||||
n/a | Coverage Sampled Anti-Aliasing[6] | 8+ | ? | |||
Texturing | ||||||
ATI1 | tex | ATI1n & ATI2n texture compression formats. | 8+ | X1300+ | ? | |
ATI2 | tex | 6+ | 9500+ | ? | ||
DF24 | DS | tex | Fetch 4: when sampling 1 channel texture, return four touched texel values[1]. Check for DF24 support. | X1300+ | ? | |
Misc | ||||||
NULL | RT | surf | Dummy render target surface that does not consume video memory. | 6+ | HD 4xxx+ | ? |
NVDB | surf | Depth Bounds Test. | 6+ | ? | ||
R2VB | surf | Render into vertex buffer. | 6 & 7 | 9500+ | ? | |
INST | surf | Geometry Instancing on pre-SM3.0 hardware. | 9500+ | ? |
Native Shadow Mapping
Native support for shadow map sampling & filtering was introduced ages ago by NVIDIA. Turns out ATI also implemented the same feature for it's DX10 level cards. Yay!
The usage is quite simple; just create a texture with regular depth/stencil format and render into it. When reading from the texture, one extra component in texture coordiantes will be the depth to compare with. Compared & filtered result will be returned.
Also useful:
- Creating NULL color surface to keep D3D runtime happy and save on video memory.
Depth Buffer as Texture
For some rendering schemes (anything with "deferred") or some effects (SSAO, depth of field, volumetric fog, ...) having access to a depth buffer is needed. If native depth buffer can be read as a texture, this saves both memory and a rendering pass or extra output for MRTs.
Depending on hardware, this can be achieved via INTZ, RAWZ, DF16 or DF24 formats:
- INTZ is for recent hardawre from both NVIDIA and ATI. According to ATI [1], it also allows using stencil buffer while rendering. Also allows reading from depth texture while it's still being used for depth testing (but not depth writing). Not sure if those capabilities apply to NVIDIA.
- RAWZ is for GeForce 6 & 7 series only. Depth is specially encoded into four channels of returned value.
- DF16 and DF24 is for ATI cards, including older cards that don't support INTZ.
Also useful when using depth textures:
- Creating NULL color surface to keep D3D runtime happy and save on video memory.
- RESZ allows resolving multisampled depth surfaces into non-multisampled depth textures (result will be sample zero for each pixel).
Depth Bounds Test
Direct equivalent of GL_EXT_depth_bounds_test OpenGL extension. See [3] for more information.
Transparency Anti-Aliasing
NVIDIA exposes two controls: transparency multisampling (ATOC) and transparency supersampling (SSAA) [5]. ATI says that all Radeons since 9500 support "alpha to coverage" [1].
Render Into Vertex Buffer
Similar to "stream out" or "memexport" in other APIs/platforms. See [2] for more information. Apparently some NVIDIA GPUs (or drivers?) support this as well.
Geometry Instancing
Instancing is supported on all Shader Model 3.0 hardware by Direct3D 9.0c, so there's no extra hacks necessary there. ATI has exposed a capability to enable instancing on their Shader Model 2.0 hardware as well. Check for "INST" support, and do dev->SetRenderState (D3DRS_POINTSIZE, kFourccINST); at startup to enable instancing.
I can't find any document on instancing from AMD now. Other references: [7] and [8].
References
All this information gathered mostly from:
- Advanced DX9 Capabilities for ATI Radeon Cards (pdf)
- ATI R2VB Programming (pdf)
- NVIDIA GPU Programming Guide (pdf)
- ATI Tesselation
- NVIDIA Transparency AA
- NVIDIA Coverage Sampled AA
- Humus' Instancing Demo
- Arseny's article on particles
Changelog
- 2009 11 21: Added instancing on SM2.0 hardware.
- 2009 11 20: Added Fetch-4, CSAA.
- 2009 11 20: Initial version.