replace _mesa_logbase2 with util_logbase2
[mesa.git] / src / mesa / state_tracker / st_atom.c
index 45a45960a305d0547147b7bfb1d1fec49e462511..11b0ce6ec55519b425ad6bc33abdcd2229cd28ef 100644 (file)
@@ -27,6 +27,7 @@
 
 
 #include <stdio.h>
+#include "main/arrayobj.h"
 #include "main/glheader.h"
 #include "main/context.h"
 
@@ -35,6 +36,8 @@
 #include "st_atom.h"
 #include "st_program.h"
 #include "st_manager.h"
+#include "st_util.h"
+
 
 typedef void (*update_func_t)(struct st_context *st);
 
@@ -64,11 +67,11 @@ void st_destroy_atoms( struct st_context *st )
 static void check_program_state( struct st_context *st )
 {
    struct gl_context *ctx = st->ctx;
-   struct st_vertex_program *old_vp = st->vp;
-   struct st_common_program *old_tcp = st->tcp;
-   struct st_common_program *old_tep = st->tep;
-   struct st_common_program *old_gp = st->gp;
-   struct st_fragment_program *old_fp = st->fp;
+   struct st_program *old_vp = st->vp;
+   struct st_program *old_tcp = st->tcp;
+   struct st_program *old_tep = st->tep;
+   struct st_program *old_gp = st->gp;
+   struct st_program *old_fp = st->fp;
 
    struct gl_program *new_vp = ctx->VertexProgram._Current;
    struct gl_program *new_tcp = ctx->TessCtrlProgram._Current;
@@ -81,39 +84,39 @@ static void check_program_state( struct st_context *st )
    /* Flag states used by both new and old shaders to unbind shader resources
     * properly when transitioning to shaders that don't use them.
     */
-   if (unlikely(new_vp != &old_vp->Base)) {
+   if (unlikely(new_vp != (old_vp ? &old_vp->Base : NULL))) {
       if (old_vp)
          dirty |= old_vp->affected_states;
       if (new_vp)
-         dirty |= ST_NEW_VERTEX_PROGRAM(st, st_vertex_program(new_vp));
+         dirty |= ST_NEW_VERTEX_PROGRAM(st, st_program(new_vp));
    }
 
    if (unlikely(new_tcp != &old_tcp->Base)) {
       if (old_tcp)
          dirty |= old_tcp->affected_states;
       if (new_tcp)
-         dirty |= st_common_program(new_tcp)->affected_states;
+         dirty |= st_program(new_tcp)->affected_states;
    }
 
    if (unlikely(new_tep != &old_tep->Base)) {
       if (old_tep)
          dirty |= old_tep->affected_states;
       if (new_tep)
-         dirty |= st_common_program(new_tep)->affected_states;
+         dirty |= st_program(new_tep)->affected_states;
    }
 
    if (unlikely(new_gp != &old_gp->Base)) {
       if (old_gp)
          dirty |= old_gp->affected_states;
       if (new_gp)
-         dirty |= st_common_program(new_gp)->affected_states;
+         dirty |= st_program(new_gp)->affected_states;
    }
 
    if (unlikely(new_fp != &old_fp->Base)) {
       if (old_fp)
          dirty |= old_fp->affected_states;
       if (new_fp)
-         dirty |= st_fragment_program(new_fp)->affected_states;
+         dirty |= st_program(new_fp)->affected_states;
    }
 
    /* Find out the number of viewports. This determines how many scissors
@@ -122,7 +125,8 @@ static void check_program_state( struct st_context *st )
    struct gl_program *last_prim_shader = new_gp ? new_gp :
                                          new_tep ? new_tep : new_vp;
    if (last_prim_shader &&
-       last_prim_shader->info.outputs_written & VARYING_BIT_VIEWPORT)
+       last_prim_shader->info.outputs_written & (
+             VARYING_BIT_VIEWPORT | VARYING_BIT_VIEWPORT_MASK))
       num_viewports = ctx->Const.MaxViewports;
 
    if (st->state.num_viewports != num_viewports) {
@@ -138,23 +142,19 @@ static void check_program_state( struct st_context *st )
 
 static void check_attrib_edgeflag(struct st_context *st)
 {
-   const struct gl_vertex_array *arrays = st->ctx->Array._DrawArrays;
-   const struct gl_vertex_buffer_binding *binding;
    GLboolean vertdata_edgeflags, edgeflag_culls_prims, edgeflags_enabled;
    struct gl_program *vp = st->ctx->VertexProgram._Current;
 
-   if (!arrays)
-      return;
-
    edgeflags_enabled = st->ctx->Polygon.FrontMode != GL_FILL ||
                        st->ctx->Polygon.BackMode != GL_FILL;
 
-   binding = arrays[VERT_ATTRIB_EDGEFLAG].BufferBinding;
-   vertdata_edgeflags = edgeflags_enabled && binding->Stride != 0;
+   vertdata_edgeflags = edgeflags_enabled &&
+      _mesa_draw_edge_flag_array_enabled(st->ctx);
+
    if (vertdata_edgeflags != st->vertdata_edgeflags) {
       st->vertdata_edgeflags = vertdata_edgeflags;
       if (vp)
-         st->dirty |= ST_NEW_VERTEX_PROGRAM(st, st_vertex_program(vp));
+         st->dirty |= ST_NEW_VERTEX_PROGRAM(st, st_program(vp));
    }
 
    edgeflag_culls_prims = edgeflags_enabled && !vertdata_edgeflags &&
@@ -220,14 +220,14 @@ void st_validate_state( struct st_context *st, enum st_pipeline pipeline )
       break;
 
    case ST_PIPELINE_COMPUTE: {
-      struct st_compute_program *old_cp = st->cp;
+      struct st_program *old_cp = st->cp;
       struct gl_program *new_cp = ctx->ComputeProgram._Current;
 
       if (new_cp != &old_cp->Base) {
          if (old_cp)
             st->dirty |= old_cp->affected_states;
          assert(new_cp);
-         st->dirty |= st_compute_program(new_cp)->affected_states;
+         st->dirty |= st_program(new_cp)->affected_states;
       }
 
       st->compute_shader_may_be_dirty = false;