st/nine: Implement fallback for D3DFMT_D24S8, D3DFMT_D24X8 and D3DFMT_INTZ
authorAxel Davy <axel.davy@ens.fr>
Sat, 10 Jan 2015 14:11:30 +0000 (15:11 +0100)
committerAxel Davy <axel.davy@ens.fr>
Thu, 5 Feb 2015 23:07:18 +0000 (00:07 +0100)
Some drivers support PIPE_FORMAT_S8_UINT_Z24_UNORM,
some others PIPE_FORMAT_Z24_UNORM_S8_UINT, some both.

It doesn't matter which one we use, since the d3d formats
they map to aren't lockable (app can read it directly).

Reviewed-by: Tiziano Bacocco <tizbac2@gmail.com>
Signed-off-by: Axel Davy <axel.davy@ens.fr>
src/gallium/state_trackers/nine/nine_pipe.h

index 405ca1dfe8a7307836f80a7bd2b3b47bc41dcf36..6e4ee43f5a580eda9fc9a7f8bcc2e35fa16c278f 100644 (file)
@@ -181,7 +181,7 @@ d3d9_to_pipe_format_internal(D3DFORMAT format)
     if (format <= D3DFMT_A2B10G10R10_XR_BIAS)
         return nine_d3d9_to_pipe_format_map[format];
     switch (format) {
-    case D3DFMT_INTZ: return PIPE_FORMAT_Z24_UNORM_S8_UINT;
+    case D3DFMT_INTZ: return PIPE_FORMAT_S8_UINT_Z24_UNORM;
     case D3DFMT_DXT1: return PIPE_FORMAT_DXT1_RGBA;
     case D3DFMT_DXT2: return PIPE_FORMAT_DXT3_RGBA; /* XXX */
     case D3DFMT_DXT3: return PIPE_FORMAT_DXT3_RGBA;
@@ -234,6 +234,25 @@ d3d9_to_pipe_format_checked(struct pipe_screen *screen,
 
     if (format_check_internal(result))
         return result;
+
+    /* fallback to another format for formats
+     * that match several pipe_format */
+    switch(format) {
+        /* depth buffer formats are not lockable (except those for which it
+         * is precised in the name), so it is ok to match to another similar
+         * format. In all cases, if the app reads the texture with a shader,
+         * it gets depth on r and doesn't get stencil.*/
+        case D3DFMT_INTZ:
+        case D3DFMT_D24S8:
+            if (format_check_internal(PIPE_FORMAT_Z24_UNORM_S8_UINT))
+                return PIPE_FORMAT_Z24_UNORM_S8_UINT;
+            break;
+        case D3DFMT_D24X8:
+            if (format_check_internal(PIPE_FORMAT_Z24X8_UNORM))
+                return PIPE_FORMAT_Z24X8_UNORM;
+        default:
+            break;
+    }
     return PIPE_FORMAT_NONE;
 }