softpipe: Include missing header in sp_flush.c.
[mesa.git] / src / gallium / drivers / i965 / brw_pipe_depth.c
index 33fe517e0b81e5f414df85884271a7d2b553118e..31c2c343d89489dbfb813176d11513f7f70955ec 100644 (file)
@@ -5,6 +5,10 @@
 #include "brw_context.h"
 #include "brw_defines.h"
 
+/* XXX: Fixme - include this to get IZ_ defines
+ */
+#include "brw_wm.h"
+
 static unsigned brw_translate_compare_func(unsigned func)
 {
    switch (func) {
@@ -55,13 +59,9 @@ static unsigned translate_stencil_op(unsigned op)
    }
 }
 
-
-static void *
-brw_create_depth_stencil_state( struct pipe_context *pipe,
-                               const struct pipe_depth_stencil_alpha_state *templ )
+static void create_bcc_state( struct brw_depth_stencil_state *zstencil,
+                             const struct pipe_depth_stencil_alpha_state *templ )
 {
-   struct brw_depth_stencil_state *zstencil = CALLOC_STRUCT(brw_depth_stencil_state);
-
    if (templ->stencil[0].enabled) {
       zstencil->cc0.stencil_enable = 1;
       zstencil->cc0.stencil_func =
@@ -72,7 +72,6 @@ brw_create_depth_stencil_state( struct pipe_context *pipe,
         translate_stencil_op(templ->stencil[0].zfail_op);
       zstencil->cc0.stencil_pass_depth_pass_op =
         translate_stencil_op(templ->stencil[0].zpass_op);
-      zstencil->cc1.stencil_ref = templ->stencil[0].ref_value;
       zstencil->cc1.stencil_write_mask = templ->stencil[0].writemask;
       zstencil->cc1.stencil_test_mask = templ->stencil[0].valuemask;
 
@@ -86,7 +85,6 @@ brw_create_depth_stencil_state( struct pipe_context *pipe,
            translate_stencil_op(templ->stencil[1].zfail_op);
         zstencil->cc0.bf_stencil_pass_depth_pass_op =
            translate_stencil_op(templ->stencil[1].zpass_op);
-        zstencil->cc1.bf_stencil_ref = templ->stencil[1].ref_value;
         zstencil->cc2.bf_stencil_write_mask = templ->stencil[1].writemask;
         zstencil->cc2.bf_stencil_test_mask = templ->stencil[1].valuemask;
       }
@@ -108,6 +106,36 @@ brw_create_depth_stencil_state( struct pipe_context *pipe,
       zstencil->cc2.depth_test_function = brw_translate_compare_func(templ->depth.func);
       zstencil->cc2.depth_write_enable = templ->depth.writemask;
    }
+}
+
+static void create_wm_iz_state( struct brw_depth_stencil_state *zstencil )
+{
+   if (zstencil->cc3.alpha_test)
+      zstencil->iz_lookup |= IZ_PS_KILL_ALPHATEST_BIT;
+
+   if (zstencil->cc2.depth_test)
+      zstencil->iz_lookup |= IZ_DEPTH_TEST_ENABLE_BIT;
+
+   if (zstencil->cc2.depth_write_enable)
+      zstencil->iz_lookup |= IZ_DEPTH_WRITE_ENABLE_BIT;
+
+   if (zstencil->cc0.stencil_enable)
+      zstencil->iz_lookup |= IZ_STENCIL_TEST_ENABLE_BIT;
+
+   if (zstencil->cc0.stencil_write_enable)
+      zstencil->iz_lookup |= IZ_STENCIL_WRITE_ENABLE_BIT;
+
+}
+
+
+static void *
+brw_create_depth_stencil_state( struct pipe_context *pipe,
+                               const struct pipe_depth_stencil_alpha_state *templ )
+{
+   struct brw_depth_stencil_state *zstencil = CALLOC_STRUCT(brw_depth_stencil_state);
+
+   create_bcc_state( zstencil, templ );
+   create_wm_iz_state( zstencil );
 
    return (void *)zstencil;
 }
@@ -129,12 +157,29 @@ static void brw_delete_depth_stencil_state(struct pipe_context *pipe,
    FREE(cso);
 }
 
+static void brw_set_stencil_ref(struct pipe_context *pipe,
+                                const struct pipe_stencil_ref *stencil_ref)
+{
+   struct brw_context *brw = brw_context(pipe);
+   brw->curr.cc1_stencil_ref.stencil_ref = stencil_ref->ref_value[0];
+   brw->curr.cc1_stencil_ref.bf_stencil_ref = stencil_ref->ref_value[1];
+
+   brw->state.dirty.mesa |= PIPE_NEW_DEPTH_STENCIL_ALPHA;
+}
+
+static void
+brw_set_sample_mask(struct pipe_context *pipe,
+                    unsigned sample_mask)
+{
+}
 
 void brw_pipe_depth_stencil_init( struct brw_context *brw )
 {
+   brw->base.set_stencil_ref = brw_set_stencil_ref;
    brw->base.create_depth_stencil_alpha_state = brw_create_depth_stencil_state;
    brw->base.bind_depth_stencil_alpha_state = brw_bind_depth_stencil_state;
    brw->base.delete_depth_stencil_alpha_state = brw_delete_depth_stencil_state;
+   brw->base.set_sample_mask = brw_set_sample_mask;
 }
 
 void brw_pipe_depth_stencil_cleanup( struct brw_context *brw )