Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / gallium / drivers / nv50 / nv50_state.c
index 95f9d408b5e45fc709edad3f6620da00c2d5b510..4283808ed93e8476581ff353bd1dea1a17464eee 100644 (file)
@@ -85,6 +85,7 @@ nv50_blend_state_create(struct pipe_context *pipe,
 
        bso->pipe = *cso;
        so_ref(so, &bso->so);
+       so_ref(NULL, &so);
        return (void *)bso;
 }
 
@@ -135,9 +136,11 @@ static void *
 nv50_sampler_state_create(struct pipe_context *pipe,
                          const struct pipe_sampler_state *cso)
 {
-       unsigned *tsc = CALLOC(8, sizeof(unsigned));
+       struct nv50_sampler_stateobj *sso = CALLOC(1, sizeof(*sso));
+       unsigned *tsc = sso->tsc;
+       float limit;
 
-       tsc[0] = (0x00024000 |
+       tsc[0] = (0x00026000 |
                  (wrap_mode(cso->wrap_s) << 0) |
                  (wrap_mode(cso->wrap_t) << 3) |
                  (wrap_mode(cso->wrap_r) << 6));
@@ -175,7 +178,45 @@ nv50_sampler_state_create(struct pipe_context *pipe,
                break;
        }
 
-       return (void *)tsc;
+       if (cso->max_anisotropy >= 16.0)
+               tsc[0] |= (7 << 20);
+       else
+       if (cso->max_anisotropy >= 12.0)
+               tsc[0] |= (6 << 20);
+       else
+       if (cso->max_anisotropy >= 10.0)
+               tsc[0] |= (5 << 20);
+       else
+       if (cso->max_anisotropy >= 8.0)
+               tsc[0] |= (4 << 20);
+       else
+       if (cso->max_anisotropy >= 6.0)
+               tsc[0] |= (3 << 20);
+       else
+       if (cso->max_anisotropy >= 4.0)
+               tsc[0] |= (2 << 20);
+       else
+       if (cso->max_anisotropy >= 2.0)
+               tsc[0] |= (1 << 20);
+
+       if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
+               tsc[0] |= (1 << 8);
+               tsc[0] |= (nvgl_comparison_op(cso->compare_func) & 0x7);
+       }
+
+       limit = CLAMP(cso->lod_bias, -16.0, 15.0);
+       tsc[1] |= ((int)(limit * 256.0) & 0x1fff) << 12;
+
+       tsc[2] |= ((int)CLAMP(cso->max_lod, 0.0, 15.0) << 20) |
+                 ((int)CLAMP(cso->min_lod, 0.0, 15.0) << 8);
+
+       tsc[4] = fui(cso->border_color[0]);
+       tsc[5] = fui(cso->border_color[1]);
+       tsc[6] = fui(cso->border_color[2]);
+       tsc[7] = fui(cso->border_color[3]);
+
+       sso->normalized = cso->normalized_coords;
+       return (void *)sso;
 }
 
 static void
@@ -232,6 +273,8 @@ nv50_rasterizer_state_create(struct pipe_context *pipe,
        so_method(so, tesla, NV50TCL_SHADE_MODEL, 1);
        so_data  (so, cso->flatshade ? NV50TCL_SHADE_MODEL_FLAT :
                                       NV50TCL_SHADE_MODEL_SMOOTH);
+       so_method(so, tesla, 0x1684, 1);
+       so_data  (so, cso->flatshade_first ? 0 : 1);
 
        so_method(so, tesla, NV50TCL_LINE_WIDTH, 1);
        so_data  (so, fui(cso->line_width));
@@ -326,6 +369,7 @@ nv50_rasterizer_state_create(struct pipe_context *pipe,
 
        rso->pipe = *cso;
        so_ref(so, &rso->so);
+       so_ref(NULL, &so);
        return (void *)rso;
 }
 
@@ -367,35 +411,35 @@ nv50_depth_stencil_alpha_state_create(struct pipe_context *pipe,
                so_data  (so, 0);
        }
 
-       /*XXX: yes, I know they're backwards.. header needs fixing */
+       /* XXX: keep hex values until header is updated (names reversed) */
        if (cso->stencil[0].enabled) {
-               so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 5);
+               so_method(so, tesla, 0x1380, 8);
                so_data  (so, 1);
                so_data  (so, nvgl_stencil_op(cso->stencil[0].fail_op));
                so_data  (so, nvgl_stencil_op(cso->stencil[0].zfail_op));
                so_data  (so, nvgl_stencil_op(cso->stencil[0].zpass_op));
                so_data  (so, nvgl_comparison_op(cso->stencil[0].func));
-               so_method(so, tesla, NV50TCL_STENCIL_BACK_FUNC_REF, 3);
                so_data  (so, cso->stencil[0].ref_value);
-               so_data  (so, cso->stencil[0].write_mask);
-               so_data  (so, cso->stencil[0].value_mask);
+               so_data  (so, cso->stencil[0].writemask);
+               so_data  (so, cso->stencil[0].valuemask);
        } else {
-               so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 1);
+               so_method(so, tesla, 0x1380, 1);
                so_data  (so, 0);
        }
 
        if (cso->stencil[1].enabled) {
-               so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 8);
+               so_method(so, tesla, 0x1594, 5);
                so_data  (so, 1);
                so_data  (so, nvgl_stencil_op(cso->stencil[1].fail_op));
                so_data  (so, nvgl_stencil_op(cso->stencil[1].zfail_op));
                so_data  (so, nvgl_stencil_op(cso->stencil[1].zpass_op));
                so_data  (so, nvgl_comparison_op(cso->stencil[1].func));
+               so_method(so, tesla, 0x0f54, 3);
                so_data  (so, cso->stencil[1].ref_value);
-               so_data  (so, cso->stencil[1].write_mask);
-               so_data  (so, cso->stencil[1].value_mask);
+               so_data  (so, cso->stencil[1].writemask);
+               so_data  (so, cso->stencil[1].valuemask);
        } else {
-               so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 1);
+               so_method(so, tesla, 0x1594, 1);
                so_data  (so, 0);
        }
 
@@ -403,7 +447,7 @@ nv50_depth_stencil_alpha_state_create(struct pipe_context *pipe,
                so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
                so_data  (so, 1);
                so_method(so, tesla, NV50TCL_ALPHA_TEST_REF, 2);
-               so_data  (so, fui(cso->alpha.ref));
+               so_data  (so, fui(cso->alpha.ref_value));
                so_data  (so, nvgl_comparison_op(cso->alpha.func));
        } else {
                so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
@@ -412,6 +456,7 @@ nv50_depth_stencil_alpha_state_create(struct pipe_context *pipe,
 
        zsa->pipe = *cso;
        so_ref(so, &zsa->so);
+       so_ref(NULL, &so);
        return (void *)zsa;
 }