nouveau: make stateobjs start off with refcount of 1
authorBen Skeggs <bskeggs@redhat.com>
Sat, 7 Mar 2009 07:14:24 +0000 (17:14 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Sat, 7 Mar 2009 07:49:09 +0000 (17:49 +1000)
26 files changed:
src/gallium/drivers/nouveau/nouveau_stateobj.h
src/gallium/drivers/nv30/nv30_fragprog.c
src/gallium/drivers/nv30/nv30_fragtex.c
src/gallium/drivers/nv30/nv30_state.c
src/gallium/drivers/nv30/nv30_state_blend.c
src/gallium/drivers/nv30/nv30_state_fb.c
src/gallium/drivers/nv30/nv30_state_scissor.c
src/gallium/drivers/nv30/nv30_state_stipple.c
src/gallium/drivers/nv30/nv30_state_viewport.c
src/gallium/drivers/nv30/nv30_vbo.c
src/gallium/drivers/nv30/nv30_vertprog.c
src/gallium/drivers/nv40/nv40_fragprog.c
src/gallium/drivers/nv40/nv40_fragtex.c
src/gallium/drivers/nv40/nv40_state.c
src/gallium/drivers/nv40/nv40_state_blend.c
src/gallium/drivers/nv40/nv40_state_fb.c
src/gallium/drivers/nv40/nv40_state_scissor.c
src/gallium/drivers/nv40/nv40_state_viewport.c
src/gallium/drivers/nv40/nv40_vbo.c
src/gallium/drivers/nv40/nv40_vertprog.c
src/gallium/drivers/nv50/nv50_program.c
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/drivers/nv50/nv50_state.c
src/gallium/drivers/nv50/nv50_state_validate.c
src/gallium/drivers/nv50/nv50_tex.c
src/gallium/drivers/nv50/nv50_vbo.c

index 666e061ac38b07501a532dc5037a5f12974018bb..97859110b5fa33c0d46da06d3c866bc105d97c78 100644 (file)
@@ -32,7 +32,7 @@ so_new(unsigned push, unsigned reloc)
        struct nouveau_stateobj *so;
 
        so = MALLOC(sizeof(struct nouveau_stateobj));
-       pipe_reference_init(&so->reference, 0);
+       pipe_reference_init(&so->reference, 1);
        so->push = MALLOC(sizeof(unsigned) * push);
        so->reloc = MALLOC(sizeof(struct nouveau_stateobj_reloc) * reloc);
 
index 0da392fed338813fdba38a39aa458cccdc0b1ec1..bdfe1425d24628042bdb048136b5a2b57598b5aa 100644 (file)
@@ -865,6 +865,7 @@ nv30_fragprog_validate(struct nv30_context *nv30)
        so_method(so, nv30->screen->rankine, NV34TCL_TX_UNITS_ENABLE, 1);
        so_data  (so, fp->samplers);
        so_ref(so, &fp->so);
+       so_ref(NULL, &so);
 
 update_constants:
        if (fp->nr_consts) {
index b1d2663af38267caa5cf9310156fce2c86092f35..8b6ab992d16887ac2abf13f8e522ed1cd90795c5 100644 (file)
@@ -137,6 +137,7 @@ nv30_fragtex_validate(struct nv30_context *nv30)
                so_method(so, nv30->screen->rankine, NV34TCL_TX_ENABLE(unit), 1);
                so_data  (so, 0);
                so_ref(so, &nv30->state.hw[NV30_STATE_FRAGTEX0 + unit]);
+               so_ref(NULL, &so);
                state->dirty |= (1ULL << (NV30_STATE_FRAGTEX0 + unit));
        }
 
@@ -147,6 +148,7 @@ nv30_fragtex_validate(struct nv30_context *nv30)
 
                so = nv30_fragtex_build(nv30, unit);
                so_ref(so, &nv30->state.hw[NV30_STATE_FRAGTEX0 + unit]);
+               so_ref(NULL, &so);
                state->dirty |= (1ULL << (NV30_STATE_FRAGTEX0 + unit));
        }
 
index 26147565a5317dd6b266c31b1e45dc5b43abf5fa..b91e972c12336783abd0910564f87e011eaf7b31 100644 (file)
@@ -51,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;
 }
@@ -404,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;
 }
@@ -477,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;
 }
index 44d43e132a52fa6d294210f00b355050e7b83f57..64cf9ae93a0a6018262be11a7b715900acc145b6 100644 (file)
@@ -28,6 +28,7 @@ nv30_state_blend_colour_validate(struct nv30_context *nv30)
                       (float_to_ubyte(bcol->color[2]) <<  0)));
 
        so_ref(so, &nv30->state.hw[NV30_STATE_BCOL]);
+       so_ref(NULL, &so);
        return TRUE;
 }
 
index ee0326011ca8905165ce91893f05b897ee08a63b..fdc1cade905124a164245084771870338b71a771 100644 (file)
@@ -132,6 +132,7 @@ nv30_state_framebuffer_validate(struct nv30_context *nv30)
        so_data  (so, 0);
 
        so_ref(so, &nv30->state.hw[NV30_STATE_FB]);
+       so_ref(NULL, &so);
        return TRUE;
 }
 
index 1db9bc1795547d063ea0b1e0282d1a46ec446881..3ac7a8471eae26df8cc040e144c098bbca69121f 100644 (file)
@@ -23,6 +23,7 @@ nv30_state_scissor_validate(struct nv30_context *nv30)
        }
 
        so_ref(so, &nv30->state.hw[NV30_STATE_SCISSOR]);
+       so_ref(NULL, &so);
        return TRUE;
 }
 
index 41b42813b496c505aafb1a1271976f3c6c68bbea..d0c791ac0821648337f0b367bf45b189410211f5 100644 (file)
@@ -27,6 +27,7 @@ nv30_state_stipple_validate(struct nv30_context *nv30)
        }
 
        so_ref(so, &nv30->state.hw[NV30_STATE_STIPPLE]);
+       so_ref(NULL, &so);
        return TRUE;
 }
 
index 951d40ebfdd44df1232d921d690ad4cc404af418..4b8300d21c48928d28d99af9c1eb22476949b109 100644 (file)
@@ -58,6 +58,7 @@ nv30_state_viewport_validate(struct nv30_context *nv30)
        so_data  (so, 1);
 
        so_ref(so, &nv30->state.hw[NV30_STATE_VIEWPORT]);
+       so_ref(NULL, &so);
        return TRUE;
 }
 
index 2d6d48ac161f3034601e7abb20210e9c33fdf876..990a8763824ad5974143ce3d7825151161a1a768 100644 (file)
@@ -539,10 +539,13 @@ nv30_vbo_validate(struct nv30_context *nv30)
        so_data  (vtxbuf, 0);
 
        so_ref(vtxbuf, &nv30->state.hw[NV30_STATE_VTXBUF]);
+       so_ref(NULL, &vtxbuf);
        nv30->state.dirty |= (1ULL << NV30_STATE_VTXBUF);
        so_ref(vtxfmt, &nv30->state.hw[NV30_STATE_VTXFMT]);
+       so_ref(NULL, &vtxfmt);
        nv30->state.dirty |= (1ULL << NV30_STATE_VTXFMT);
        so_ref(sattr, &nv30->state.hw[NV30_STATE_VTXATTR]);
+       so_ref(NULL, &sattr);
        nv30->state.dirty |= (1ULL << NV30_STATE_VTXATTR);
        return FALSE;
 }
index d26272505705b96fc45843e071ef16ee3a4e74d7..eaf543b8f791568cbf78a43c3ed796505c1d5feb 100644 (file)
@@ -685,6 +685,7 @@ nv30_vertprog_validate(struct nv30_context *nv30)
                so_method(so, rankine, NV34TCL_VP_START_FROM_ID, 1);
                so_data  (so, vp->exec->start);
                so_ref(so, &vp->so);
+               so_ref(NULL, &so);
 
                upload_code = TRUE;
        }
index 1031e87e970aa245befe5e4617a0a8ace9796020..16e40889ec302fc1f1cbd71028b68ef859e1f7d3 100644 (file)
@@ -944,6 +944,7 @@ nv40_fragprog_validate(struct nv40_context *nv40)
        so_method(so, nv40->screen->curie, NV40TCL_FP_CONTROL, 1);
        so_data  (so, fp->fp_control);
        so_ref(so, &fp->so);
+       so_ref(NULL, &so);
 
 update_constants:
        if (fp->nr_consts) {
index 0227d22620d405c840604b845433caec178afc50..eb3002dc05387bfbab4153a6bedcf13e353f9e84 100644 (file)
@@ -151,6 +151,7 @@ nv40_fragtex_validate(struct nv40_context *nv40)
 
                so = nv40_fragtex_build(nv40, unit);
                so_ref(so, &nv40->state.hw[NV40_STATE_FRAGTEX0 + unit]);
+               so_ref(NULL, &so);
                state->dirty |= (1ULL << (NV40_STATE_FRAGTEX0 + unit));
        }
 
index 2eff25aa836afd5b6738a37698687156219c17f6..c3ee4d234537d1dc317649dff573316899c46f94 100644 (file)
@@ -52,6 +52,7 @@ nv40_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;
 }
@@ -414,6 +415,7 @@ nv40_rasterizer_state_create(struct pipe_context *pipe,
        }
 
        so_ref(so, &rsso->so);
+       so_ref(NULL, &so);
        rsso->pipe = *cso;
        return (void *)rsso;
 }
@@ -487,6 +489,7 @@ nv40_depth_stencil_alpha_state_create(struct pipe_context *pipe,
        }
 
        so_ref(so, &zsaso->so);
+       so_ref(NULL, &so);
        zsaso->pipe = *cso;
        return (void *)zsaso;
 }
index 95e6d7394f466330452b988b6d73878b78528603..8cd05ce66ef858f138d0c9d064b9cbf2ed8e7af3 100644 (file)
@@ -28,6 +28,7 @@ nv40_state_blend_colour_validate(struct nv40_context *nv40)
                       (float_to_ubyte(bcol->color[2]) <<  0)));
 
        so_ref(so, &nv40->state.hw[NV40_STATE_BCOL]);
+       so_ref(NULL, &so);
        return TRUE;
 }
 
index 5ebd3a1a56b56b278e1bbb53e6663448a00609d3..be618a306bf739d49e7546687c9818f04e4b5dee 100644 (file)
@@ -150,6 +150,7 @@ nv40_state_framebuffer_validate(struct nv40_context *nv40)
        so_data  (so, (1 << 12) | h);
 
        so_ref(so, &nv40->state.hw[NV40_STATE_FB]);
+       so_ref(NULL, &so);
        return TRUE;
 }
 
index 285239ef419f715e257f91e69b5ed0703f4bc56d..cf58d33906a9629c134f673ac8aaf6f937ac821f 100644 (file)
@@ -23,6 +23,7 @@ nv40_state_scissor_validate(struct nv40_context *nv40)
        }
 
        so_ref(so, &nv40->state.hw[NV40_STATE_SCISSOR]);
+       so_ref(NULL, &so);
        return TRUE;
 }
 
index 869a55b40536d9d59718f9f970ba6a08e1e75657..3d14d203081f1c1b55e568d48e12ae78ecfeb6b4 100644 (file)
@@ -55,6 +55,7 @@ nv40_state_viewport_validate(struct nv40_context *nv40)
        }
 
        so_ref(so, &nv40->state.hw[NV40_STATE_VIEWPORT]);
+       so_ref(NULL, &so);
        return TRUE;
 }
 
index 8f1834628f7a010dfc234283b1355a97ce5efef2..f3518b2e4fe31323df6008b82a5f5b0cca482485 100644 (file)
@@ -537,10 +537,13 @@ nv40_vbo_validate(struct nv40_context *nv40)
        so_data  (vtxbuf, 0);
 
        so_ref(vtxbuf, &nv40->state.hw[NV40_STATE_VTXBUF]);
+       so_ref(NULL, &vtxbuf);
        nv40->state.dirty |= (1ULL << NV40_STATE_VTXBUF);
        so_ref(vtxfmt, &nv40->state.hw[NV40_STATE_VTXFMT]);
+       so_ref(NULL, &vtxfmt);
        nv40->state.dirty |= (1ULL << NV40_STATE_VTXFMT);
        so_ref(sattr, &nv40->state.hw[NV40_STATE_VTXATTR]);
+       so_ref(NULL, &sattr);
        nv40->state.dirty |= (1ULL << NV40_STATE_VTXATTR);
        return FALSE;
 }
index 0862386638cb553cde1a755c87fcfd0b7ebcb756..7df9a4d3264a9d14e8613d13ba6fcea44faebaf7 100644 (file)
@@ -916,6 +916,7 @@ check_gpu_resources:
                so_method(so, curie,  NV40TCL_CLIP_PLANE_ENABLE, 1);
                so_data  (so, vp->clip_ctrl);
                so_ref(so, &vp->so);
+               so_ref(NULL, &so);
 
                upload_code = TRUE;
        }
index 308eb34784c1bcac257974c66ed6e322d28c7b65..2d15868ae8439f4abcf2f178acd9b3c69a9813f5 100644 (file)
@@ -1719,6 +1719,7 @@ nv50_vertprog_validate(struct nv50_context *nv50)
        so_method(so, tesla, 0x140c, 1);
        so_data  (so, 0); /* program start offset */
        so_ref(so, &nv50->state.vertprog);
+       so_ref(NULL, &so);
 }
 
 void
@@ -1758,6 +1759,7 @@ nv50_fragprog_validate(struct nv50_context *nv50)
        so_method(so, tesla, 0x1414, 1);
        so_data  (so, 0); /* program start offset */
        so_ref(so, &nv50->state.fragprog);
+       so_ref(NULL, &so);
 }
 
 void
index 9bf5e8c7b3fcf064ebd802f4adb669b6504afc9b..d0348ec29c328ba752cdc6bcb10cb8e185732825 100644 (file)
@@ -366,7 +366,8 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        so_data  (so, 1);
 
        so_emit(nvws, so);
-       so_ref(so, &screen->static_init);
+       so_ref (so, &screen->static_init);
+       so_ref (NULL, &so);
        nvws->push_flush(nvws, 0, NULL);
 
        return &screen->pipe;
index 787ff958ec7003c695f7923a87029e32a61f9c50..ba852194cddde7f6e5b417d566a722c27e1a2f59 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;
 }
 
@@ -352,6 +353,7 @@ nv50_rasterizer_state_create(struct pipe_context *pipe,
 
        rso->pipe = *cso;
        so_ref(so, &rso->so);
+       so_ref(NULL, &so);
        return (void *)rso;
 }
 
@@ -438,6 +440,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;
 }
 
index 948112ffa9febe16da781591cff5c916a7340a15..b7958f19bc8bc5cb950e8cc99f03b8a83b0527ee 100644 (file)
@@ -124,6 +124,7 @@ nv50_state_validate_fb(struct nv50_context *nv50)
        so_data  (so, h);
 
        so_ref(so, &nv50->state.fb);
+       so_ref(NULL, &so);
 }
 
 static void
@@ -214,6 +215,7 @@ nv50_state_validate(struct nv50_context *nv50)
                so_data  (so, fui(nv50->blend_colour.color[2]));
                so_data  (so, fui(nv50->blend_colour.color[3]));
                so_ref(so, &nv50->state.blend_colour);
+               so_ref(NULL, &so);
        }
 
        if (nv50->dirty & NV50_NEW_STIPPLE) {
@@ -222,6 +224,7 @@ nv50_state_validate(struct nv50_context *nv50)
                for (i = 0; i < 32; i++)
                        so_data(so, nv50->stipple.stipple[i]);
                so_ref(so, &nv50->state.stipple);
+               so_ref(NULL, &so);
        }
 
        if (nv50->dirty & (NV50_NEW_SCISSOR | NV50_NEW_RASTERIZER)) {
@@ -243,6 +246,7 @@ nv50_state_validate(struct nv50_context *nv50)
                        so_data(so, (8192 << 16));
                }
                so_ref(so, &nv50->state.scissor);
+               so_ref(NULL, &so);
                nv50->state.dirty |= NV50_NEW_SCISSOR;
        }
 scissor_uptodate:
@@ -283,6 +287,7 @@ scissor_uptodate:
                }
 
                so_ref(so, &nv50->state.viewport);
+               so_ref(NULL, &so);
        }
 viewport_uptodate:
 
@@ -296,6 +301,7 @@ viewport_uptodate:
                for (i = 0; i < nv50->sampler_nr; i++)
                        so_datap (so, nv50->sampler[i], 8);
                so_ref(so, &nv50->state.tsc_upload);
+               so_ref(NULL, &so);
        }
 
        if (nv50->dirty & NV50_NEW_TEXTURE)
index 31bf59675ecd58912f21746bfc50e5bfa5ca1cbf..223c8a3a456197bf04931e817c6ba0b1470456e2 100644 (file)
@@ -152,5 +152,6 @@ nv50_tex_validate(struct nv50_context *nv50)
        }
 
        so_ref(so, &nv50->state.tic_upload);
+       so_ref(NULL, &so);
 }
 
index 08d751dddbd82f382340879639fc8907399ebe3e..0749c906914859c3c9b01f9e34d91271afc52ce8 100644 (file)
@@ -250,5 +250,7 @@ nv50_vbo_validate(struct nv50_context *nv50)
 
        so_ref (vtxfmt, &nv50->state.vtxfmt);
        so_ref (vtxbuf, &nv50->state.vtxbuf);
+       so_ref (NULL, &vtxbuf);
+       so_ref (NULL, &vtxfmt);
 }