gallium: drivers should reference vertex buffers
So that a state tracker can unreference them after set_vertex_buffers.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
util_copy_vertex_buffers(nvfx->vtxbuf,
|
||||
&nvfx->vtxbuf_nr,
|
||||
vb, count);
|
||||
|
||||
for(unsigned i = count; i < nvfx->vtxbuf_nr; ++i)
|
||||
pipe_resource_reference(&nvfx->vtxbuf[i].buffer, 0);
|
||||
|
||||
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;
|
||||
|
||||
|
Reference in New Issue
Block a user