gallium: use pipe_texture_reference() in a few places (fixes refcounting bugs)
authorBrian <brian.paul@tungstengraphics.com>
Mon, 24 Mar 2008 22:26:45 +0000 (16:26 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 24 Mar 2008 22:35:25 +0000 (16:35 -0600)
src/gallium/auxiliary/draw/draw_aaline.c
src/gallium/auxiliary/draw/draw_pstipple.c

index 6742f7f4b9665c6448d7f4f3c16fea06d245fef0..cc1873abada63a4146fdee1a1e79c1ae2898a98b 100644 (file)
@@ -621,7 +621,7 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)
    bind_aaline_fragment_shader(aaline);
 
    aaline->state.sampler[num] = aaline->sampler_cso;
-   aaline->state.texture[num] = aaline->texture;
+   pipe_texture_reference(&aaline->state.texture[num], aaline->texture);
 
    aaline->driver_bind_sampler_states(pipe, num + 1, aaline->state.sampler);
    aaline->driver_set_sampler_textures(pipe, num + 1, aaline->state.texture);
@@ -769,9 +769,14 @@ aaline_set_sampler_textures(struct pipe_context *pipe,
                             unsigned num, struct pipe_texture **texture)
 {
    struct aaline_stage *aaline = aaline_stage_from_pipe(pipe);
+   uint i;
+
    /* save current */
-   memcpy(aaline->state.texture, texture, num * sizeof(struct pipe_texture *));
+   for (i = 0; i < num; i++) {
+      pipe_texture_reference(&aaline->state.texture[i], texture[i]);
+   }
    aaline->num_textures = num;
+
    /* pass-through */
    aaline->driver_set_sampler_textures(aaline->pipe, num, texture);
 }
index bd8d3a76ae57de4368964cc08f5baa9e64454927..f00b23959bef8c21940663044dceafeb41d55d94 100644 (file)
@@ -398,6 +398,7 @@ pstip_create_texture(struct pstip_stage *pstip)
    texTemp.cpp = 1;
 
    pstip->texture = screen->texture_create(screen, &texTemp);
+   assert(pstip->texture->refcount == 1);
 
    //pstip_update_texture(pstip);
 }
@@ -492,7 +493,8 @@ pstip_first_tri(struct draw_stage *stage, struct prim_header *header)
 
    /* plug in our sampler, texture */
    pstip->state.samplers[pstip->sampler_unit] = pstip->sampler_cso;
-   pstip->state.textures[pstip->sampler_unit] = pstip->texture;
+   pipe_texture_reference(&pstip->state.textures[pstip->sampler_unit],
+                          pstip->texture);
 
    pstip->driver_bind_sampler_states(pipe, num_samplers, pstip->state.samplers);
    pstip->driver_set_sampler_textures(pipe, num_samplers, pstip->state.textures);
@@ -624,6 +626,7 @@ pstip_bind_sampler_states(struct pipe_context *pipe,
                           unsigned num, void **sampler)
 {
    struct pstip_stage *pstip = pstip_stage_from_pipe(pipe);
+
    /* save current */
    memcpy(pstip->state.samplers, sampler, num * sizeof(void *));
    pstip->num_samplers = num;
@@ -637,9 +640,14 @@ pstip_set_sampler_textures(struct pipe_context *pipe,
                            unsigned num, struct pipe_texture **texture)
 {
    struct pstip_stage *pstip = pstip_stage_from_pipe(pipe);
+   uint i;
+
    /* save current */
-   memcpy(pstip->state.textures, texture, num * sizeof(struct pipe_texture *));
+   for (i = 0; i < num; i++) {
+      pipe_texture_reference(&pstip->state.textures[i], texture[i]);
+   }
    pstip->num_textures = num;
+
    /* pass-through */
    pstip->driver_set_sampler_textures(pstip->pipe, num, texture);
 }