瀏覽代碼

gallium: drivers should reference vertex buffers

So that a state tracker can unreference them after set_vertex_buffers.
tags/android-x86-2.2-r2
Marek Olšák 14 年之前
父節點
當前提交
3c9aa3a7b1

+ 8
- 2
src/gallium/auxiliary/draw/draw_context.c 查看文件

@@ -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);
}



+ 5
- 13
src/gallium/auxiliary/util/u_blitter.h 查看文件

@@ -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

+ 18
- 0
src/gallium/auxiliary/util/u_inlines.h 查看文件

@@ -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

+ 6
- 0
src/gallium/drivers/cell/ppu/cell_context.c 查看文件

@@ -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);


+ 3
- 2
src/gallium/drivers/cell/ppu/cell_state_vertex.c 查看文件

@@ -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;


+ 6
- 0
src/gallium/drivers/failover/fo_context.c 查看文件

@@ -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 );
}

+ 3
- 3
src/gallium/drivers/failover/fo_state.c 查看文件

@@ -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 );
}

+ 4
- 0
src/gallium/drivers/i915/i915_context.c 查看文件

@@ -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);

+ 3
- 2
src/gallium/drivers/i915/i915_state.c 查看文件

@@ -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);

+ 7
- 13
src/gallium/drivers/i965/brw_pipe_vertex.c 查看文件

@@ -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
*/

+ 4
- 0
src/gallium/drivers/llvmpipe/lp_context.c 查看文件

@@ -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 );

+ 4
- 2
src/gallium/drivers/llvmpipe/lp_state_vertex.c 查看文件

@@ -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;


+ 4
- 0
src/gallium/drivers/nv50/nv50_context.c 查看文件

@@ -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;

+ 3
- 2
src/gallium/drivers/nv50/nv50_state.c 查看文件

@@ -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;
}

+ 3
- 11
src/gallium/drivers/nvfx/nvfx_vbo.c 查看文件

@@ -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;
}

+ 4
- 0
src/gallium/drivers/softpipe/sp_context.c 查看文件

@@ -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 );

+ 4
- 2
src/gallium/drivers/softpipe/sp_state_vertex.c 查看文件

@@ -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;


Loading…
取消
儲存