Merge branch 'mesa_7_5_branch'
[mesa.git] / src / gallium / drivers / nv30 / nv30_state.c
index 4d6303ebc28c9a2fc0a501c374a2bdbfbae039a1..b91e972c12336783abd0910564f87e011eaf7b31 100644 (file)
@@ -1,8 +1,9 @@
 #include "pipe/p_state.h"
 #include "pipe/p_defines.h"
-#include "pipe/p_util.h"
 #include "pipe/p_inlines.h"
 
+#include "tgsi/tgsi_parse.h"
+
 #include "nv30_context.h"
 #include "nv30_state.h"
 
@@ -22,9 +23,10 @@ nv30_blend_state_create(struct pipe_context *pipe,
                               nvgl_blend_func(cso->rgb_src_factor));
                so_data  (so, nvgl_blend_func(cso->alpha_dst_factor) << 16 |
                              nvgl_blend_func(cso->rgb_dst_factor));
+               /* FIXME: Gallium assumes GL_EXT_blend_func_separate.
+                  It is not the case for NV30 */
                so_method(so, rankine, NV34TCL_BLEND_EQUATION, 1);
-               so_data  (so, nvgl_blend_eqn(cso->alpha_func) << 16 |
-                             nvgl_blend_eqn(cso->rgb_func));
+               so_data  (so, nvgl_blend_eqn(cso->rgb_func));
        } else {
                so_method(so, rankine, NV34TCL_BLEND_FUNC_ENABLE, 1);
                so_data  (so, 0);
@@ -49,6 +51,7 @@ nv30_blend_state_create(struct pipe_context *pipe,
        so_data  (so, cso->dither ? 1 : 0);
 
        so_ref(so, &bso->so);
+       so_ref(NULL, &so);
        bso->pipe = *cso;
        return (void *)bso;
 }
@@ -125,8 +128,10 @@ nv30_sampler_state_create(struct pipe_context *pipe,
           in sampler state structure, and set appropriate format in
           nvxx_fragtex_build()
         */
-       if (!cso->normalized_coords)
-               ps->fmt |= (1<<14) /*NV34TCL_TX_FORMAT_RECT*/;
+       /*NV34TCL_TX_FORMAT_RECT*/
+       /*if (!cso->normalized_coords) {
+               ps->fmt |= (1<<14) ;
+       }*/
 
        ps->wrap = ((wrap_mode(cso->wrap_s) << NV34TCL_TX_WRAP_S_SHIFT) |
                    (wrap_mode(cso->wrap_t) << NV34TCL_TX_WRAP_T_SHIFT) |
@@ -195,10 +200,10 @@ nv30_sampler_state_create(struct pipe_context *pipe,
                ps->filt |= (int)(cso->lod_bias * 256.0) & 0x1fff;
 
                limit = CLAMP(cso->max_lod, 0.0, 15.0);
-               ps->en |= (int)(limit * 256.0) << 7;
+               ps->en |= (int)(limit) << 14 /*NV34TCL_TX_ENABLE_MIPMAP_MAX_LOD_SHIFT*/;
 
                limit = CLAMP(cso->min_lod, 0.0, 15.0);
-               ps->en |= (int)(limit * 256.0) << 19;
+               ps->en |= (int)(limit) << 26 /*NV34TCL_TX_ENABLE_MIPMAP_MIN_LOD_SHIFT*/;
        }
 
        if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
@@ -400,6 +405,7 @@ nv30_rasterizer_state_create(struct pipe_context *pipe,
        }
 
        so_ref(so, &rsso->so);
+       so_ref(NULL, &so);
        rsso->pipe = *cso;
        return (void *)rsso;
 }
@@ -440,15 +446,15 @@ nv30_depth_stencil_alpha_state_create(struct pipe_context *pipe,
        so_method(so, rankine, NV34TCL_ALPHA_FUNC_ENABLE, 3);
        so_data  (so, cso->alpha.enabled ? 1 : 0);
        so_data  (so, nvgl_comparison_op(cso->alpha.func));
-       so_data  (so, float_to_ubyte(cso->alpha.ref));
+       so_data  (so, float_to_ubyte(cso->alpha.ref_value));
 
        if (cso->stencil[0].enabled) {
                so_method(so, rankine, NV34TCL_STENCIL_FRONT_ENABLE, 8);
                so_data  (so, cso->stencil[0].enabled ? 1 : 0);
-               so_data  (so, cso->stencil[0].write_mask);
+               so_data  (so, cso->stencil[0].writemask);
                so_data  (so, nvgl_comparison_op(cso->stencil[0].func));
                so_data  (so, cso->stencil[0].ref_value);
-               so_data  (so, cso->stencil[0].value_mask);
+               so_data  (so, cso->stencil[0].valuemask);
                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));
@@ -460,10 +466,10 @@ nv30_depth_stencil_alpha_state_create(struct pipe_context *pipe,
        if (cso->stencil[1].enabled) {
                so_method(so, rankine, NV34TCL_STENCIL_BACK_ENABLE, 8);
                so_data  (so, cso->stencil[1].enabled ? 1 : 0);
-               so_data  (so, cso->stencil[1].write_mask);
+               so_data  (so, cso->stencil[1].writemask);
                so_data  (so, nvgl_comparison_op(cso->stencil[1].func));
                so_data  (so, cso->stencil[1].ref_value);
-               so_data  (so, cso->stencil[1].value_mask);
+               so_data  (so, cso->stencil[1].valuemask);
                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));
@@ -473,6 +479,7 @@ nv30_depth_stencil_alpha_state_create(struct pipe_context *pipe,
        }
 
        so_ref(so, &zsaso->so);
+       so_ref(NULL, &so);
        zsaso->pipe = *cso;
        return (void *)zsaso;
 }
@@ -503,7 +510,7 @@ nv30_vp_state_create(struct pipe_context *pipe,
        struct nv30_vertex_program *vp;
 
        vp = CALLOC(1, sizeof(struct nv30_vertex_program));
-       vp->pipe = *cso;
+       vp->pipe.tokens = tgsi_dup_tokens(cso->tokens);
        /*vp->draw = draw_create_vertex_shader(nv30->draw, &vp->pipe);*/
 
        return (void *)vp;
@@ -527,6 +534,7 @@ nv30_vp_state_delete(struct pipe_context *pipe, void *hwcso)
 
        /*draw_delete_vertex_shader(nv30->draw, vp->draw);*/
        nv30_vertprog_destroy(nv30, vp);
+       FREE((void*)vp->pipe.tokens);
        FREE(vp);
 }
 
@@ -537,7 +545,7 @@ nv30_fp_state_create(struct pipe_context *pipe,
        struct nv30_fragment_program *fp;
 
        fp = CALLOC(1, sizeof(struct nv30_fragment_program));
-       fp->pipe = *cso;
+       fp->pipe.tokens = tgsi_dup_tokens(cso->tokens);
 
        tgsi_scan_shader(fp->pipe.tokens, &fp->info);
 
@@ -560,6 +568,7 @@ nv30_fp_state_delete(struct pipe_context *pipe, void *hwcso)
        struct nv30_fragment_program *fp = hwcso;
 
        nv30_fragprog_destroy(nv30, fp);
+       FREE((void*)fp->pipe.tokens);
        FREE(fp);
 }
 
@@ -586,7 +595,7 @@ nv30_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
        struct nv30_context *nv30 = nv30_context(pipe);
 
        nv30->constbuf[shader] = buf->buffer;
-       nv30->constbuf_nr[shader] = buf->size / (4 * sizeof(float));
+       nv30->constbuf_nr[shader] = buf->buffer->size / (4 * sizeof(float));
 
        if (shader == PIPE_SHADER_VERTEX) {
                nv30->dirty |= NV30_NEW_VERTPROG;