gallium: notify drivers about possible changes in user buffer contents

Also implement the redefine_user_buffer hook in the drivers.
This commit is contained in:
Marek Olšák 2011-02-09 01:10:11 +01:00
parent 2a904fd6a0
commit 588fa884d2
26 changed files with 182 additions and 6 deletions

View File

@ -639,6 +639,8 @@ static void blitter_draw_rectangle(struct blitter_context *blitter,
}
blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf,
0, ctx->vbuf->width0);
util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
PIPE_PRIM_TRIANGLE_FAN, 4, 2);
}
@ -867,6 +869,8 @@ void util_blitter_copy_region(struct blitter_context *blitter,
/* Draw. */
blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
ctx->base.pipe->redefine_user_buffer(ctx->base.pipe, ctx->vbuf,
0, ctx->vbuf->width0);
util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
PIPE_PRIM_TRIANGLE_FAN, 4, 2);
break;

View File

@ -112,3 +112,10 @@ void u_default_transfer_destroy(struct pipe_context *pipe,
FREE(transfer);
}
void u_default_redefine_user_buffer(struct pipe_context *ctx,
struct pipe_resource *resource,
unsigned offset,
unsigned size)
{
resource->width0 = MAX2(resource->width0, offset + size);
}

View File

@ -136,11 +136,9 @@ void u_transfer_inline_write_vtbl( struct pipe_context *rm_ctx,
unsigned stride,
unsigned layer_stride);
void u_default_redefine_user_buffer(struct pipe_context *ctx,
struct pipe_resource *resource,
unsigned offset,
unsigned size);
#endif

View File

@ -392,6 +392,22 @@ be flushed on write or unmap. Flushes must be requested with
``transfer_flush_region``. Flush ranges are relative to the mapped range, not
the beginning of the resource.
.. _redefine_user_buffer:
redefine_user_buffer
%%%%%%%%%%%%%%%%%%%%
This function notifies a driver that the user buffer content has been changed.
The updated region starts at ``offset`` and is ``size`` bytes large.
The ``offset`` is relative to the pointer specified in ``user_buffer_create``.
While uploading the user buffer, the driver is allowed not to upload
the memory outside of this region.
The width0 is redefined to ``MAX2(width0, offset+size)``.
.. _pipe_transfer:
PIPE_TRANSFER

View File

@ -33,6 +33,7 @@
#include "cell_state.h"
#include "util/u_memory.h"
#include "util/u_transfer.h"
#include "draw/draw_context.h"
@ -115,4 +116,5 @@ cell_init_vertex_functions(struct cell_context *cell)
cell->pipe.create_vertex_elements_state = cell_create_vertex_elements_state;
cell->pipe.bind_vertex_elements_state = cell_bind_vertex_elements_state;
cell->pipe.delete_vertex_elements_state = cell_delete_vertex_elements_state;
cell->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -30,6 +30,7 @@
#include "util/u_inlines.h"
#include "util/u_memory.h"
#include "util/u_transfer.h"
#include "fo_context.h"
@ -656,4 +657,5 @@ failover_init_state_functions( struct failover_context *failover )
failover->pipe.set_constant_buffer = failover_set_constant_buffer;
failover->pipe.create_sampler_view = failover_create_sampler_view;
failover->pipe.sampler_view_destroy = failover_sampler_view_destroy;
failover->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -962,6 +962,19 @@ galahad_context_transfer_inline_write(struct pipe_context *_context,
}
static void galahad_redefine_user_buffer(struct pipe_context *_context,
struct pipe_resource *_resource,
unsigned offset, unsigned size)
{
struct galahad_context *glhd_context = galahad_context(_context);
struct galahad_resource *glhd_resource = galahad_resource(_resource);
struct pipe_context *context = glhd_context->pipe;
struct pipe_resource *resource = glhd_resource->resource;
context->redefine_user_buffer(context, resource, offset, size);
}
struct pipe_context *
galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
{
@ -1036,6 +1049,7 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
glhd_pipe->base.transfer_unmap = galahad_context_transfer_unmap;
glhd_pipe->base.transfer_flush_region = galahad_context_transfer_flush_region;
glhd_pipe->base.transfer_inline_write = galahad_context_transfer_inline_write;
glhd_pipe->base.redefine_user_buffer = galahad_redefine_user_buffer;
glhd_pipe->pipe = pipe;

View File

@ -33,6 +33,7 @@
#include "util/u_inlines.h"
#include "util/u_math.h"
#include "util/u_memory.h"
#include "util/u_transfer.h"
#include "tgsi/tgsi_parse.h"
#include "i915_context.h"
@ -895,4 +896,5 @@ i915_init_state_functions( struct i915_context *i915 )
i915->base.set_viewport_state = i915_set_viewport_state;
i915->base.set_vertex_buffers = i915_set_vertex_buffers;
i915->base.set_index_buffer = i915_set_index_buffer;
i915->base.redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -4,6 +4,7 @@
#include "util/u_memory.h"
#include "util/u_format.h"
#include "util/u_transfer.h"
static unsigned brw_translate_surface_format( unsigned id )
@ -302,6 +303,7 @@ brw_pipe_vertex_init( struct brw_context *brw )
brw->base.create_vertex_elements_state = brw_create_vertex_elements_state;
brw->base.bind_vertex_elements_state = brw_bind_vertex_elements_state;
brw->base.delete_vertex_elements_state = brw_delete_vertex_elements_state;
brw->base.redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -855,6 +855,19 @@ identity_context_transfer_inline_write(struct pipe_context *_context,
}
static void identity_redefine_user_buffer(struct pipe_context *_context,
struct pipe_resource *_resource,
unsigned offset, unsigned size)
{
struct identity_context *id_context = identity_context(_context);
struct identity_resource *id_resource = identity_resource(_resource);
struct pipe_context *context = id_context->pipe;
struct pipe_resource *resource = id_resource->resource;
context->redefine_user_buffer(context, resource, offset, size);
}
struct pipe_context *
identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
{
@ -929,6 +942,7 @@ identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
id_pipe->base.transfer_unmap = identity_context_transfer_unmap;
id_pipe->base.transfer_flush_region = identity_context_transfer_flush_region;
id_pipe->base.transfer_inline_write = identity_context_transfer_inline_write;
id_pipe->base.redefine_user_buffer = identity_redefine_user_buffer;
id_pipe->pipe = pipe;

View File

@ -34,6 +34,7 @@
#include "draw/draw_context.h"
#include "util/u_inlines.h"
#include "util/u_transfer.h"
static void *
@ -114,4 +115,6 @@ llvmpipe_init_vertex_funcs(struct llvmpipe_context *llvmpipe)
llvmpipe->pipe.set_vertex_buffers = llvmpipe_set_vertex_buffers;
llvmpipe->pipe.set_index_buffer = llvmpipe_set_index_buffer;
llvmpipe->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -28,6 +28,7 @@
#include <pipe/p_screen.h>
#include <util/u_memory.h>
#include <util/u_inlines.h>
#include "util/u_transfer.h"
static void noop_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
{
@ -287,4 +288,5 @@ void noop_init_state_functions(struct pipe_context *ctx)
ctx->sampler_view_destroy = noop_sampler_view_destroy;
ctx->surface_destroy = noop_surface_destroy;
ctx->draw_vbo = noop_draw_vbo;
ctx->redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -23,6 +23,7 @@
#include "pipe/p_state.h"
#include "pipe/p_defines.h"
#include "util/u_inlines.h"
#include "util/u_transfer.h"
#include "tgsi/tgsi_parse.h"
@ -886,5 +887,6 @@ nv50_init_state_functions(struct nv50_context *nv50)
nv50->pipe.set_vertex_buffers = nv50_set_vertex_buffers;
nv50->pipe.set_index_buffer = nv50_set_index_buffer;
nv50->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -22,6 +22,7 @@
#include "pipe/p_defines.h"
#include "util/u_inlines.h"
#include "util/u_transfer.h"
#include "tgsi/tgsi_parse.h"
@ -934,5 +935,7 @@ nvc0_init_state_functions(struct nvc0_context *nvc0)
nvc0->pipe.delete_stream_output_state = nvc0_tfb_state_delete;
nvc0->pipe.bind_stream_output_state = nvc0_tfb_state_bind;
nvc0->pipe.set_stream_output_buffers = nvc0_set_transform_feedback_buffers;
nvc0->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -2,6 +2,7 @@
#include "pipe/p_state.h"
#include "util/u_inlines.h"
#include "util/u_format.h"
#include "util/u_transfer.h"
#include "translate/translate.h"
#include "nvfx_context.h"
@ -631,4 +632,6 @@ nvfx_init_vbo_functions(struct nvfx_context *nvfx)
nvfx->pipe.create_vertex_elements_state = nvfx_vtxelts_state_create;
nvfx->pipe.delete_vertex_elements_state = nvfx_vtxelts_state_delete;
nvfx->pipe.bind_vertex_elements_state = nvfx_vtxelts_state_bind;
nvfx->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -28,6 +28,7 @@
#include "util/u_mm.h"
#include "util/u_memory.h"
#include "util/u_pack_color.h"
#include "util/u_transfer.h"
#include "tgsi/tgsi_parse.h"
@ -1843,6 +1844,7 @@ void r300_init_state_functions(struct r300_context* r300)
r300->context.set_vertex_buffers = r300_set_vertex_buffers;
r300->context.set_index_buffer = r300_set_index_buffer;
r300->context.redefine_user_buffer = u_default_redefine_user_buffer;
r300->context.create_vertex_elements_state = r300_create_vertex_elements_state;
r300->context.bind_vertex_elements_state = r300_bind_vertex_elements_state;

View File

@ -905,6 +905,7 @@ void evergreen_init_state_functions(struct r600_pipe_context *rctx)
rctx->context.set_vertex_sampler_views = evergreen_set_vs_sampler_view;
rctx->context.set_viewport_state = evergreen_set_viewport_state;
rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
rctx->context.redefine_user_buffer = u_default_redefine_user_buffer;
}
void evergreen_init_config(struct r600_pipe_context *rctx)

View File

@ -37,6 +37,7 @@
#include <util/u_memory.h>
#include <util/u_inlines.h>
#include <util/u_framebuffer.h>
#include "util/u_transfer.h"
#include <pipebuffer/pb_buffer.h>
#include "r600.h"
#include "r600d.h"
@ -941,6 +942,7 @@ void r600_init_state_functions(struct r600_pipe_context *rctx)
rctx->context.set_vertex_sampler_views = r600_set_vs_sampler_view;
rctx->context.set_viewport_state = r600_set_viewport_state;
rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
rctx->context.redefine_user_buffer = u_default_redefine_user_buffer;
}
void r600_init_config(struct r600_pipe_context *rctx)

View File

@ -987,6 +987,19 @@ rbug_context_transfer_inline_write(struct pipe_context *_context,
}
static void rbug_redefine_user_buffer(struct pipe_context *_context,
struct pipe_resource *_resource,
unsigned offset, unsigned size)
{
struct rbug_context *rb_pipe = rbug_context(_context);
struct rbug_resource *rb_resource = rbug_resource(_resource);
struct pipe_context *context = rb_pipe->pipe;
struct pipe_resource *resource = rb_resource->resource;
context->redefine_user_buffer(context, resource, offset, size);
}
struct pipe_context *
rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
{
@ -1072,6 +1085,7 @@ rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
rb_pipe->base.transfer_unmap = rbug_context_transfer_unmap;
rb_pipe->base.transfer_flush_region = rbug_context_transfer_flush_region;
rb_pipe->base.transfer_inline_write = rbug_context_transfer_inline_write;
rb_pipe->base.redefine_user_buffer = rbug_redefine_user_buffer;
rb_pipe->pipe = pipe;

View File

@ -34,6 +34,7 @@
#include "util/u_memory.h"
#include "util/u_inlines.h"
#include "util/u_transfer.h"
#include "draw/draw_context.h"
@ -119,4 +120,5 @@ softpipe_init_vertex_funcs(struct pipe_context *pipe)
pipe->set_vertex_buffers = softpipe_set_vertex_buffers;
pipe->set_index_buffer = softpipe_set_index_buffer;
pipe->redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -27,6 +27,7 @@
#include "pipe/p_defines.h"
#include "util/u_math.h"
#include "util/u_memory.h"
#include "util/u_transfer.h"
#include "tgsi/tgsi_parse.h"
#include "svga_screen.h"
@ -131,6 +132,7 @@ void svga_init_vertex_functions( struct svga_context *svga )
svga->pipe.create_vertex_elements_state = svga_create_vertex_elements_state;
svga->pipe.bind_vertex_elements_state = svga_bind_vertex_elements_state;
svga->pipe.delete_vertex_elements_state = svga_delete_vertex_elements_state;
svga->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
}

View File

@ -1419,6 +1419,28 @@ trace_context_transfer_inline_write(struct pipe_context *_context,
}
static void trace_redefine_user_buffer(struct pipe_context *_context,
struct pipe_resource *_resource,
unsigned offset, unsigned size)
{
struct trace_context *tr_context = trace_context(_context);
struct trace_resource *tr_tex = trace_resource(_resource);
struct pipe_context *context = tr_context->pipe;
struct pipe_resource *resource = tr_tex->resource;
assert(resource->screen == context->screen);
trace_dump_call_begin("pipe_context", "redefine_user_buffer");
trace_dump_arg(ptr, context);
trace_dump_arg(ptr, resource);
trace_dump_arg(uint, offset);
trace_dump_arg(uint, size);
trace_dump_call_end();
context->redefine_user_buffer(context, resource, offset, size);
}
static const struct debug_named_value rbug_blocker_flags[] = {
@ -1506,6 +1528,7 @@ trace_context_create(struct trace_screen *tr_scr,
tr_ctx->base.transfer_unmap = trace_context_transfer_unmap;
tr_ctx->base.transfer_flush_region = trace_context_transfer_flush_region;
tr_ctx->base.transfer_inline_write = trace_context_transfer_inline_write;
tr_ctx->base.redefine_user_buffer = trace_redefine_user_buffer;
tr_ctx->pipe = pipe;

View File

@ -399,6 +399,14 @@ struct pipe_context {
unsigned stride,
unsigned layer_stride);
/* Notify a driver that a content of a user buffer has been changed.
* The changed range is [offset, offset+size-1].
* The new width0 of the buffer is offset+size. */
void (*redefine_user_buffer)(struct pipe_context *,
struct pipe_resource *,
unsigned offset,
unsigned size);
};

View File

@ -203,6 +203,11 @@ static void st_destroy_context_priv( struct st_context *st )
st_destroy_drawpix(st);
st_destroy_drawtex(st);
/* Unreference any user vertex buffers. */
for (i = 0; i < st->num_user_vbs; i++) {
pipe_resource_reference(&st->user_vb[i], NULL);
}
for (i = 0; i < Elements(st->state.sampler_views); i++) {
pipe_sampler_view_reference(&st->state.sampler_views[i], NULL);
}

View File

@ -185,6 +185,11 @@ struct st_context
int force_msaa;
void *winsys_drawable_handle;
/* User vertex buffers. */
struct pipe_resource *user_vb[PIPE_MAX_ATTRIBS];
unsigned user_vb_stride[PIPE_MAX_ATTRIBS];
unsigned num_user_vbs;
};

View File

@ -330,6 +330,11 @@ setup_interleaved_attribs(struct gl_context *ctx,
stride * (max_index + 1),
PIPE_BIND_VERTEX_BUFFER);
vbuffer->buffer_offset = 0;
/* Track user vertex buffers. */
pipe_resource_reference(&st->user_vb[0], vbuffer->buffer);
st->user_vb_stride[0] = stride;
st->num_user_vbs = 1;
}
vbuffer->stride = stride; /* in bytes */
}
@ -405,6 +410,11 @@ setup_non_interleaved_attribs(struct gl_context *ctx,
}
vbuffer[attr].buffer_offset = 0;
/* Track user vertex buffers. */
pipe_resource_reference(&st->user_vb[attr], vbuffer->buffer);
st->user_vb_stride[attr] = stride;
st->num_user_vbs = MAX2(st->num_user_vbs, attr+1);
}
/* common-case setup */
@ -538,12 +548,20 @@ st_validate_varrays(struct gl_context *ctx,
struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS];
unsigned num_vbuffers, num_velements;
GLuint attr;
unsigned i;
/* must get these after state validation! */
vp = st->vp;
vpv = st->vp_variant;
memset(velements, 0, sizeof(struct pipe_vertex_element) * vpv->num_inputs);
/* Unreference any user vertex buffers. */
for (i = 0; i < st->num_user_vbs; i++) {
pipe_resource_reference(&st->user_vb[i], NULL);
}
st->num_user_vbs = 0;
/*
* Setup the vbuffer[] and velements[] arrays.
*/
@ -646,6 +664,26 @@ st_draw_vbo(struct gl_context *ctx,
#endif
}
/* Notify the driver that the content of user buffers may have been
* changed. */
if (!new_array && st->num_user_vbs) {
for (i = 0; i < st->num_user_vbs; i++) {
if (st->user_vb[i]) {
unsigned stride = st->user_vb_stride[i];
if (stride) {
pipe->redefine_user_buffer(pipe, st->user_vb[i],
min_index * stride,
(max_index + 1 - min_index) * stride);
} else {
/* stride == 0 */
pipe->redefine_user_buffer(pipe, st->user_vb[i],
0, st->user_vb[i]->width0);
}
}
}
}
setup_index_buffer(ctx, ib, &ibuffer);
pipe->set_index_buffer(pipe, &ibuffer);