So that a state tracker can unreference them after set_vertex_buffers.tags/android-x86-2.2-r2
@@ -35,6 +35,7 @@ | |||
#include "util/u_memory.h" | |||
#include "util/u_math.h" | |||
#include "util/u_cpu_detect.h" | |||
#include "util/u_inlines.h" | |||
#include "draw_context.h" | |||
#include "draw_vs.h" | |||
#include "draw_gs.h" | |||
@@ -164,6 +165,10 @@ void draw_destroy( struct draw_context *draw ) | |||
} | |||
} | |||
for (i = 0; i < draw->pt.nr_vertex_buffers; i++) { | |||
pipe_resource_reference(&draw->pt.vertex_buffer[i].buffer, NULL); | |||
} | |||
/* Not so fast -- we're just borrowing this at the moment. | |||
* | |||
if (draw->render) | |||
@@ -307,8 +312,9 @@ draw_set_vertex_buffers(struct draw_context *draw, | |||
{ | |||
assert(count <= PIPE_MAX_ATTRIBS); | |||
memcpy(draw->pt.vertex_buffer, buffers, count * sizeof(buffers[0])); | |||
draw->pt.nr_vertex_buffers = count; | |||
util_copy_vertex_buffers(draw->pt.vertex_buffer, | |||
&draw->pt.nr_vertex_buffers, | |||
buffers, count); | |||
} | |||
@@ -318,21 +318,13 @@ util_blitter_save_vertex_buffers(struct blitter_context *blitter, | |||
int num_vertex_buffers, | |||
struct pipe_vertex_buffer *vertex_buffers) | |||
{ | |||
unsigned i; | |||
assert(num_vertex_buffers <= Elements(blitter->saved_vertex_buffers)); | |||
blitter->saved_num_vertex_buffers = num_vertex_buffers; | |||
for (i = 0; i < num_vertex_buffers; i++) { | |||
if (vertex_buffers[i].buffer) { | |||
pipe_resource_reference(&blitter->saved_vertex_buffers[i].buffer, | |||
vertex_buffers[i].buffer); | |||
} | |||
} | |||
memcpy(blitter->saved_vertex_buffers, | |||
vertex_buffers, | |||
num_vertex_buffers * sizeof(struct pipe_vertex_buffer)); | |||
blitter->saved_num_vertex_buffers = 0; | |||
util_copy_vertex_buffers(blitter->saved_vertex_buffers, | |||
(unsigned*)&blitter->saved_num_vertex_buffers, | |||
vertex_buffers, | |||
num_vertex_buffers); | |||
} | |||
#ifdef __cplusplus |
@@ -400,6 +400,24 @@ static INLINE boolean util_get_offset( | |||
} | |||
} | |||
static INLINE void util_copy_vertex_buffers(struct pipe_vertex_buffer *dst, | |||
unsigned *dst_count, | |||
const struct pipe_vertex_buffer *src, | |||
unsigned src_count) | |||
{ | |||
unsigned i; | |||
for (i = 0; i < src_count; i++) { | |||
pipe_resource_reference(&dst[i].buffer, src[i].buffer); | |||
} | |||
for (; i < *dst_count; i++) { | |||
pipe_resource_reference(&dst[i].buffer, NULL); | |||
} | |||
*dst_count = src_count; | |||
memcpy(dst, src, src_count * sizeof(struct pipe_vertex_buffer)); | |||
} | |||
#ifdef __cplusplus | |||
} | |||
#endif |
@@ -37,6 +37,7 @@ | |||
#include "pipe/p_format.h" | |||
#include "util/u_memory.h" | |||
#include "pipe/p_screen.h" | |||
#include "util/u_inlines.h" | |||
#include "draw/draw_context.h" | |||
#include "draw/draw_private.h" | |||
@@ -61,6 +62,11 @@ static void | |||
cell_destroy_context( struct pipe_context *pipe ) | |||
{ | |||
struct cell_context *cell = cell_context(pipe); | |||
unsigned i; | |||
for (i = 0; i < cell->num_vertex_buffers; i++) { | |||
pipe_resource_reference(&cell->vertex_buffer[i].buffer, NULL); | |||
} | |||
util_delete_keymap(cell->fragment_ops_cache, NULL); | |||
@@ -82,8 +82,9 @@ cell_set_vertex_buffers(struct pipe_context *pipe, | |||
assert(count <= PIPE_MAX_ATTRIBS); | |||
memcpy(cell->vertex_buffer, buffers, count * sizeof(buffers[0])); | |||
cell->num_vertex_buffers = count; | |||
util_copy_vertex_buffers(cell->vertex_buffer, | |||
&cell->num_vertex_buffers, | |||
buffers, count); | |||
cell->dirty |= CELL_NEW_VERTEX; | |||
@@ -29,6 +29,7 @@ | |||
#include "pipe/p_defines.h" | |||
#include "util/u_memory.h" | |||
#include "pipe/p_context.h" | |||
#include "util/u_inlines.h" | |||
#include "fo_context.h" | |||
#include "fo_winsys.h" | |||
@@ -38,6 +39,11 @@ | |||
static void failover_destroy( struct pipe_context *pipe ) | |||
{ | |||
struct failover_context *failover = failover_context( pipe ); | |||
unsigned i; | |||
for (i = 0; i < failover->num_vertex_buffers; i++) { | |||
pipe_resource_reference(&failover->vertex_buffers[i].buffer, NULL); | |||
} | |||
FREE( failover ); | |||
} |
@@ -574,10 +574,10 @@ failover_set_vertex_buffers(struct pipe_context *pipe, | |||
{ | |||
struct failover_context *failover = failover_context(pipe); | |||
memcpy(failover->vertex_buffers, vertex_buffers, | |||
count * sizeof(vertex_buffers[0])); | |||
util_copy_vertex_buffers(failover->vertex_buffers, | |||
&failover->num_vertex_buffers, | |||
vertex_buffers, count); | |||
failover->dirty |= FO_NEW_VERTEX_BUFFER; | |||
failover->num_vertex_buffers = count; | |||
failover->sw->set_vertex_buffers( failover->sw, count, vertex_buffers ); | |||
failover->hw->set_vertex_buffers( failover->hw, count, vertex_buffers ); | |||
} |
@@ -107,6 +107,10 @@ static void i915_destroy(struct pipe_context *pipe) | |||
if(i915->batch) | |||
i915->iws->batchbuffer_destroy(i915->batch); | |||
for (i = 0; i < i915->num_vertex_buffers; i++) { | |||
pipe_resource_reference(&i915->vertex_buffer[i].buffer, NULL); | |||
} | |||
/* unbind framebuffer */ | |||
for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { | |||
pipe_surface_reference(&i915->framebuffer.cbufs[i], NULL); |
@@ -760,8 +760,9 @@ static void i915_set_vertex_buffers(struct pipe_context *pipe, | |||
*/ | |||
draw_flush(i915->draw); | |||
memcpy(i915->vertex_buffer, buffers, count * sizeof(buffers[0])); | |||
i915->num_vertex_buffers = count; | |||
util_copy_vertex_buffers(i915->vertex_buffer, | |||
&i915->num_vertex_buffers, | |||
buffers, count); | |||
/* pass-through to draw module */ | |||
draw_set_vertex_buffers(i915->draw, count, buffers); |
@@ -248,7 +248,6 @@ static void brw_set_vertex_buffers(struct pipe_context *pipe, | |||
const struct pipe_vertex_buffer *buffers) | |||
{ | |||
struct brw_context *brw = brw_context(pipe); | |||
unsigned i; | |||
/* Check for no change */ | |||
if (count == brw->curr.num_vertex_buffers && | |||
@@ -257,18 +256,9 @@ static void brw_set_vertex_buffers(struct pipe_context *pipe, | |||
count * sizeof buffers[0]) == 0) | |||
return; | |||
/* Adjust refcounts */ | |||
for (i = 0; i < count; i++) | |||
pipe_resource_reference(&brw->curr.vertex_buffer[i].buffer, | |||
buffers[i].buffer); | |||
for ( ; i < brw->curr.num_vertex_buffers; i++) | |||
pipe_resource_reference(&brw->curr.vertex_buffer[i].buffer, | |||
NULL); | |||
/* Copy remaining data */ | |||
memcpy(brw->curr.vertex_buffer, buffers, count * sizeof buffers[0]); | |||
brw->curr.num_vertex_buffers = count; | |||
util_copy_vertex_buffers(brw->curr.vertex_buffer, | |||
&brw->curr.num_vertex_buffers, | |||
buffers, count); | |||
brw->state.dirty.mesa |= PIPE_NEW_VERTEX_BUFFER; | |||
} | |||
@@ -318,9 +308,13 @@ brw_pipe_vertex_init( struct brw_context *brw ) | |||
void | |||
brw_pipe_vertex_cleanup( struct brw_context *brw ) | |||
{ | |||
unsigned i; | |||
/* Release bound pipe vertex_buffers | |||
*/ | |||
for (i = 0; i < brw->curr.num_vertex_buffers; i++) { | |||
pipe_resource_reference(&brw->curr.vertex_buffer[i].buffer, NULL); | |||
} | |||
/* Release some other stuff | |||
*/ |
@@ -125,6 +125,10 @@ static void llvmpipe_destroy( struct pipe_context *pipe ) | |||
} | |||
} | |||
for (i = 0; i < llvmpipe->num_vertex_buffers; i++) { | |||
pipe_resource_reference(&llvmpipe->vertex_buffer[i].buffer, NULL); | |||
} | |||
gallivm_destroy(llvmpipe->gallivm); | |||
align_free( llvmpipe ); |
@@ -33,6 +33,7 @@ | |||
#include "lp_state.h" | |||
#include "draw/draw_context.h" | |||
#include "util/u_inlines.h" | |||
static void * | |||
@@ -80,8 +81,9 @@ llvmpipe_set_vertex_buffers(struct pipe_context *pipe, | |||
assert(count <= PIPE_MAX_ATTRIBS); | |||
memcpy(llvmpipe->vertex_buffer, buffers, count * sizeof(buffers[0])); | |||
llvmpipe->num_vertex_buffers = count; | |||
util_copy_vertex_buffers(llvmpipe->vertex_buffer, | |||
&llvmpipe->num_vertex_buffers, | |||
buffers, count); | |||
llvmpipe->dirty |= LP_NEW_VERTEX; | |||
@@ -49,6 +49,10 @@ nv50_destroy(struct pipe_context *pipe) | |||
struct nv50_context *nv50 = nv50_context(pipe); | |||
int i; | |||
for (i = 0; i < nv50->vtxbuf_nr; i++) { | |||
pipe_resource_reference(&nv50->vtxbuf[i].buffer, NULL); | |||
} | |||
for (i = 0; i < 64; i++) { | |||
if (!nv50->state.hw[i]) | |||
continue; |
@@ -780,8 +780,9 @@ nv50_set_vertex_buffers(struct pipe_context *pipe, unsigned count, | |||
{ | |||
struct nv50_context *nv50 = nv50_context(pipe); | |||
memcpy(nv50->vtxbuf, vb, sizeof(*vb) * count); | |||
nv50->vtxbuf_nr = count; | |||
util_copy_vertex_buffers(nv50->vtxbuf, | |||
&nv50->vtxbuf_nr, | |||
vb, count); | |||
nv50->dirty |= NV50_NEW_ARRAYS; | |||
} |
@@ -591,18 +591,10 @@ nvfx_set_vertex_buffers(struct pipe_context *pipe, unsigned count, | |||
{ | |||
struct nvfx_context *nvfx = nvfx_context(pipe); | |||
for(unsigned i = 0; i < count; ++i) | |||
{ | |||
pipe_resource_reference(&nvfx->vtxbuf[i].buffer, vb[i].buffer); | |||
nvfx->vtxbuf[i].buffer_offset = vb[i].buffer_offset; | |||
nvfx->vtxbuf[i].max_index = vb[i].max_index; | |||
nvfx->vtxbuf[i].stride = vb[i].stride; | |||
} | |||
for(unsigned i = count; i < nvfx->vtxbuf_nr; ++i) | |||
pipe_resource_reference(&nvfx->vtxbuf[i].buffer, 0); | |||
util_copy_vertex_buffers(nvfx->vtxbuf, | |||
&nvfx->vtxbuf_nr, | |||
vb, count); | |||
nvfx->vtxbuf_nr = count; | |||
nvfx->use_vertex_buffers = -1; | |||
nvfx->draw_dirty |= NVFX_NEW_ARRAYS; | |||
} |
@@ -129,6 +129,10 @@ softpipe_destroy( struct pipe_context *pipe ) | |||
} | |||
} | |||
for (i = 0; i < softpipe->num_vertex_buffers; i++) { | |||
pipe_resource_reference(&softpipe->vertex_buffer[i].buffer, NULL); | |||
} | |||
tgsi_exec_machine_destroy(softpipe->fs_machine); | |||
FREE( softpipe ); |
@@ -33,6 +33,7 @@ | |||
#include "sp_state.h" | |||
#include "util/u_memory.h" | |||
#include "util/u_inlines.h" | |||
#include "draw/draw_context.h" | |||
@@ -84,8 +85,9 @@ softpipe_set_vertex_buffers(struct pipe_context *pipe, | |||
assert(count <= PIPE_MAX_ATTRIBS); | |||
memcpy(softpipe->vertex_buffer, buffers, count * sizeof(buffers[0])); | |||
softpipe->num_vertex_buffers = count; | |||
util_copy_vertex_buffers(softpipe->vertex_buffer, | |||
&softpipe->num_vertex_buffers, | |||
buffers, count); | |||
softpipe->dirty |= SP_NEW_VERTEX; | |||