cell: Fix depth read / write for s8z24.
authorIan Romanick <idr@us.ibm.com>
Tue, 18 Mar 2008 18:47:37 +0000 (11:47 -0700)
committerIan Romanick <idr@us.ibm.com>
Tue, 18 Mar 2008 18:47:37 +0000 (11:47 -0700)
Stencil is still broken.

src/gallium/drivers/cell/spu/spu_main.c
src/gallium/drivers/cell/spu/spu_per_fragment_op.c

index 122cf337a6815a9fe5b150e5483607bb832677d9..937962285d07a772a6e4979bdd872029f12f9a16 100644 (file)
@@ -221,6 +221,7 @@ cmd_state_framebuffer(const struct cell_command_framebuffer *cmd)
    switch (spu.fb.depth_format) {
    case PIPE_FORMAT_Z32_UNORM:
    case PIPE_FORMAT_Z24S8_UNORM:
+   case PIPE_FORMAT_S8Z24_UNORM:
       spu.fb.zsize = 4;
       break;
    case PIPE_FORMAT_Z16_UNORM:
index d42b522b41d95d18b4559c1530f45d16fe06c9db..06d68f5604bba998fb34ed26aaea59060f82af48 100644 (file)
@@ -76,6 +76,16 @@ read_ds_quad(tile_t *buffer, unsigned x, unsigned y,
       
 
    case PIPE_FORMAT_Z24S8_UNORM: {
+      qword *ptr = (qword *) &buffer->ui4[iy][ix];
+      qword mask = si_fsmbi(0xEEEE);
+
+      *depth = si_rotmai(si_and(*ptr, mask), -8);
+      *stencil = si_andc(*ptr, mask);
+      break;
+   }
+
+
+   case PIPE_FORMAT_S8Z24_UNORM: {
       qword *ptr = (qword *) &buffer->ui4[iy][ix];
       qword mask = si_fsmbi(0x7777);
 
@@ -124,10 +134,20 @@ write_ds_quad(tile_t *buffer, unsigned x, unsigned y,
 
 
    case PIPE_FORMAT_Z24S8_UNORM: {
+      qword *ptr = (qword *) &buffer->ui4[iy][ix];
+      qword mask = si_fsmbi(0xEEEE);
+
+      depth = si_shli(depth, 8);
+      *ptr = si_selb(stencil, depth, mask);
+      break;
+   }
+
+
+   case PIPE_FORMAT_S8Z24_UNORM: {
       qword *ptr = (qword *) &buffer->ui4[iy][ix];
       qword mask = si_fsmbi(0x7777);
 
-      stencil = si_rotmai(stencil, 24);
+      stencil = si_shli(stencil, 24);
       *ptr = si_selb(stencil, depth, mask);
       break;
    }
@@ -167,11 +187,12 @@ spu_do_depth_stencil(int x, int y,
       frag_depth = si_cfltu(frag_depth, 0);
       break;
    case PIPE_FORMAT_Z24S8_UNORM:
+   case PIPE_FORMAT_S8Z24_UNORM:
       frag_depth = si_fm(frag_depth, (qword)spu_splats((float)(0x00ffffffu)));
       frag_depth = si_cfltu(frag_depth, 0);
       break;
    default:
-      assert(0);
+      ASSERT(0);
       break;
    }