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:
@@ -639,6 +639,8 @@ static void blitter_draw_rectangle(struct blitter_context *blitter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
|
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,
|
util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
|
||||||
PIPE_PRIM_TRIANGLE_FAN, 4, 2);
|
PIPE_PRIM_TRIANGLE_FAN, 4, 2);
|
||||||
}
|
}
|
||||||
@@ -867,6 +869,8 @@ void util_blitter_copy_region(struct blitter_context *blitter,
|
|||||||
|
|
||||||
/* Draw. */
|
/* Draw. */
|
||||||
blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
|
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,
|
util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
|
||||||
PIPE_PRIM_TRIANGLE_FAN, 4, 2);
|
PIPE_PRIM_TRIANGLE_FAN, 4, 2);
|
||||||
break;
|
break;
|
||||||
|
@@ -112,3 +112,10 @@ void u_default_transfer_destroy(struct pipe_context *pipe,
|
|||||||
FREE(transfer);
|
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);
|
||||||
|
}
|
||||||
|
@@ -136,11 +136,9 @@ void u_transfer_inline_write_vtbl( struct pipe_context *rm_ctx,
|
|||||||
unsigned stride,
|
unsigned stride,
|
||||||
unsigned layer_stride);
|
unsigned layer_stride);
|
||||||
|
|
||||||
|
void u_default_redefine_user_buffer(struct pipe_context *ctx,
|
||||||
|
struct pipe_resource *resource,
|
||||||
|
unsigned offset,
|
||||||
|
unsigned size);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -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
|
``transfer_flush_region``. Flush ranges are relative to the mapped range, not
|
||||||
the beginning of the resource.
|
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:
|
||||||
|
|
||||||
PIPE_TRANSFER
|
PIPE_TRANSFER
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
#include "cell_state.h"
|
#include "cell_state.h"
|
||||||
|
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
#include "draw/draw_context.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.create_vertex_elements_state = cell_create_vertex_elements_state;
|
||||||
cell->pipe.bind_vertex_elements_state = cell_bind_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.delete_vertex_elements_state = cell_delete_vertex_elements_state;
|
||||||
|
cell->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
|
|
||||||
#include "fo_context.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.set_constant_buffer = failover_set_constant_buffer;
|
||||||
failover->pipe.create_sampler_view = failover_create_sampler_view;
|
failover->pipe.create_sampler_view = failover_create_sampler_view;
|
||||||
failover->pipe.sampler_view_destroy = failover_sampler_view_destroy;
|
failover->pipe.sampler_view_destroy = failover_sampler_view_destroy;
|
||||||
|
failover->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
@@ -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 *
|
struct pipe_context *
|
||||||
galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
|
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_unmap = galahad_context_transfer_unmap;
|
||||||
glhd_pipe->base.transfer_flush_region = galahad_context_transfer_flush_region;
|
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.transfer_inline_write = galahad_context_transfer_inline_write;
|
||||||
|
glhd_pipe->base.redefine_user_buffer = galahad_redefine_user_buffer;
|
||||||
|
|
||||||
glhd_pipe->pipe = pipe;
|
glhd_pipe->pipe = pipe;
|
||||||
|
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
#include "util/u_math.h"
|
#include "util/u_math.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
#include "tgsi/tgsi_parse.h"
|
#include "tgsi/tgsi_parse.h"
|
||||||
|
|
||||||
#include "i915_context.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_viewport_state = i915_set_viewport_state;
|
||||||
i915->base.set_vertex_buffers = i915_set_vertex_buffers;
|
i915->base.set_vertex_buffers = i915_set_vertex_buffers;
|
||||||
i915->base.set_index_buffer = i915_set_index_buffer;
|
i915->base.set_index_buffer = i915_set_index_buffer;
|
||||||
|
i915->base.redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
#include "util/u_format.h"
|
#include "util/u_format.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
|
|
||||||
|
|
||||||
static unsigned brw_translate_surface_format( unsigned id )
|
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.create_vertex_elements_state = brw_create_vertex_elements_state;
|
||||||
brw->base.bind_vertex_elements_state = brw_bind_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.delete_vertex_elements_state = brw_delete_vertex_elements_state;
|
||||||
|
brw->base.redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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 *
|
struct pipe_context *
|
||||||
identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
|
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_unmap = identity_context_transfer_unmap;
|
||||||
id_pipe->base.transfer_flush_region = identity_context_transfer_flush_region;
|
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.transfer_inline_write = identity_context_transfer_inline_write;
|
||||||
|
id_pipe->base.redefine_user_buffer = identity_redefine_user_buffer;
|
||||||
|
|
||||||
id_pipe->pipe = pipe;
|
id_pipe->pipe = pipe;
|
||||||
|
|
||||||
|
@@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
#include "draw/draw_context.h"
|
#include "draw/draw_context.h"
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
|
|
||||||
|
|
||||||
static void *
|
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_vertex_buffers = llvmpipe_set_vertex_buffers;
|
||||||
llvmpipe->pipe.set_index_buffer = llvmpipe_set_index_buffer;
|
llvmpipe->pipe.set_index_buffer = llvmpipe_set_index_buffer;
|
||||||
|
|
||||||
|
llvmpipe->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#include <pipe/p_screen.h>
|
#include <pipe/p_screen.h>
|
||||||
#include <util/u_memory.h>
|
#include <util/u_memory.h>
|
||||||
#include <util/u_inlines.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)
|
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->sampler_view_destroy = noop_sampler_view_destroy;
|
||||||
ctx->surface_destroy = noop_surface_destroy;
|
ctx->surface_destroy = noop_surface_destroy;
|
||||||
ctx->draw_vbo = noop_draw_vbo;
|
ctx->draw_vbo = noop_draw_vbo;
|
||||||
|
ctx->redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
#include "pipe/p_state.h"
|
#include "pipe/p_state.h"
|
||||||
#include "pipe/p_defines.h"
|
#include "pipe/p_defines.h"
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
|
|
||||||
#include "tgsi/tgsi_parse.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_vertex_buffers = nv50_set_vertex_buffers;
|
||||||
nv50->pipe.set_index_buffer = nv50_set_index_buffer;
|
nv50->pipe.set_index_buffer = nv50_set_index_buffer;
|
||||||
|
nv50->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include "pipe/p_defines.h"
|
#include "pipe/p_defines.h"
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
|
|
||||||
#include "tgsi/tgsi_parse.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.delete_stream_output_state = nvc0_tfb_state_delete;
|
||||||
nvc0->pipe.bind_stream_output_state = nvc0_tfb_state_bind;
|
nvc0->pipe.bind_stream_output_state = nvc0_tfb_state_bind;
|
||||||
nvc0->pipe.set_stream_output_buffers = nvc0_set_transform_feedback_buffers;
|
nvc0->pipe.set_stream_output_buffers = nvc0_set_transform_feedback_buffers;
|
||||||
|
|
||||||
|
nvc0->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
#include "pipe/p_state.h"
|
#include "pipe/p_state.h"
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
#include "util/u_format.h"
|
#include "util/u_format.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
#include "translate/translate.h"
|
#include "translate/translate.h"
|
||||||
|
|
||||||
#include "nvfx_context.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.create_vertex_elements_state = nvfx_vtxelts_state_create;
|
||||||
nvfx->pipe.delete_vertex_elements_state = nvfx_vtxelts_state_delete;
|
nvfx->pipe.delete_vertex_elements_state = nvfx_vtxelts_state_delete;
|
||||||
nvfx->pipe.bind_vertex_elements_state = nvfx_vtxelts_state_bind;
|
nvfx->pipe.bind_vertex_elements_state = nvfx_vtxelts_state_bind;
|
||||||
|
|
||||||
|
nvfx->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#include "util/u_mm.h"
|
#include "util/u_mm.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
#include "util/u_pack_color.h"
|
#include "util/u_pack_color.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
|
|
||||||
#include "tgsi/tgsi_parse.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_vertex_buffers = r300_set_vertex_buffers;
|
||||||
r300->context.set_index_buffer = r300_set_index_buffer;
|
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.create_vertex_elements_state = r300_create_vertex_elements_state;
|
||||||
r300->context.bind_vertex_elements_state = r300_bind_vertex_elements_state;
|
r300->context.bind_vertex_elements_state = r300_bind_vertex_elements_state;
|
||||||
|
@@ -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_vertex_sampler_views = evergreen_set_vs_sampler_view;
|
||||||
rctx->context.set_viewport_state = evergreen_set_viewport_state;
|
rctx->context.set_viewport_state = evergreen_set_viewport_state;
|
||||||
rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
|
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)
|
void evergreen_init_config(struct r600_pipe_context *rctx)
|
||||||
|
@@ -37,6 +37,7 @@
|
|||||||
#include <util/u_memory.h>
|
#include <util/u_memory.h>
|
||||||
#include <util/u_inlines.h>
|
#include <util/u_inlines.h>
|
||||||
#include <util/u_framebuffer.h>
|
#include <util/u_framebuffer.h>
|
||||||
|
#include "util/u_transfer.h"
|
||||||
#include <pipebuffer/pb_buffer.h>
|
#include <pipebuffer/pb_buffer.h>
|
||||||
#include "r600.h"
|
#include "r600.h"
|
||||||
#include "r600d.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_vertex_sampler_views = r600_set_vs_sampler_view;
|
||||||
rctx->context.set_viewport_state = r600_set_viewport_state;
|
rctx->context.set_viewport_state = r600_set_viewport_state;
|
||||||
rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
|
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)
|
void r600_init_config(struct r600_pipe_context *rctx)
|
||||||
|
@@ -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 *
|
struct pipe_context *
|
||||||
rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
|
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_unmap = rbug_context_transfer_unmap;
|
||||||
rb_pipe->base.transfer_flush_region = rbug_context_transfer_flush_region;
|
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.transfer_inline_write = rbug_context_transfer_inline_write;
|
||||||
|
rb_pipe->base.redefine_user_buffer = rbug_redefine_user_buffer;
|
||||||
|
|
||||||
rb_pipe->pipe = pipe;
|
rb_pipe->pipe = pipe;
|
||||||
|
|
||||||
|
@@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
#include "draw/draw_context.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_vertex_buffers = softpipe_set_vertex_buffers;
|
||||||
pipe->set_index_buffer = softpipe_set_index_buffer;
|
pipe->set_index_buffer = softpipe_set_index_buffer;
|
||||||
|
pipe->redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
#include "pipe/p_defines.h"
|
#include "pipe/p_defines.h"
|
||||||
#include "util/u_math.h"
|
#include "util/u_math.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
|
#include "util/u_transfer.h"
|
||||||
#include "tgsi/tgsi_parse.h"
|
#include "tgsi/tgsi_parse.h"
|
||||||
|
|
||||||
#include "svga_screen.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.create_vertex_elements_state = svga_create_vertex_elements_state;
|
||||||
svga->pipe.bind_vertex_elements_state = svga_bind_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.delete_vertex_elements_state = svga_delete_vertex_elements_state;
|
||||||
|
svga->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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[] = {
|
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_unmap = trace_context_transfer_unmap;
|
||||||
tr_ctx->base.transfer_flush_region = trace_context_transfer_flush_region;
|
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.transfer_inline_write = trace_context_transfer_inline_write;
|
||||||
|
tr_ctx->base.redefine_user_buffer = trace_redefine_user_buffer;
|
||||||
|
|
||||||
tr_ctx->pipe = pipe;
|
tr_ctx->pipe = pipe;
|
||||||
|
|
||||||
|
@@ -399,6 +399,14 @@ struct pipe_context {
|
|||||||
unsigned stride,
|
unsigned stride,
|
||||||
unsigned layer_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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -203,6 +203,11 @@ static void st_destroy_context_priv( struct st_context *st )
|
|||||||
st_destroy_drawpix(st);
|
st_destroy_drawpix(st);
|
||||||
st_destroy_drawtex(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++) {
|
for (i = 0; i < Elements(st->state.sampler_views); i++) {
|
||||||
pipe_sampler_view_reference(&st->state.sampler_views[i], NULL);
|
pipe_sampler_view_reference(&st->state.sampler_views[i], NULL);
|
||||||
}
|
}
|
||||||
|
@@ -185,6 +185,11 @@ struct st_context
|
|||||||
|
|
||||||
int force_msaa;
|
int force_msaa;
|
||||||
void *winsys_drawable_handle;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -330,6 +330,11 @@ setup_interleaved_attribs(struct gl_context *ctx,
|
|||||||
stride * (max_index + 1),
|
stride * (max_index + 1),
|
||||||
PIPE_BIND_VERTEX_BUFFER);
|
PIPE_BIND_VERTEX_BUFFER);
|
||||||
vbuffer->buffer_offset = 0;
|
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 */
|
vbuffer->stride = stride; /* in bytes */
|
||||||
}
|
}
|
||||||
@@ -405,6 +410,11 @@ setup_non_interleaved_attribs(struct gl_context *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
vbuffer[attr].buffer_offset = 0;
|
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 */
|
/* common-case setup */
|
||||||
@@ -538,12 +548,20 @@ st_validate_varrays(struct gl_context *ctx,
|
|||||||
struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS];
|
struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS];
|
||||||
unsigned num_vbuffers, num_velements;
|
unsigned num_vbuffers, num_velements;
|
||||||
GLuint attr;
|
GLuint attr;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
/* must get these after state validation! */
|
/* must get these after state validation! */
|
||||||
vp = st->vp;
|
vp = st->vp;
|
||||||
vpv = st->vp_variant;
|
vpv = st->vp_variant;
|
||||||
|
|
||||||
memset(velements, 0, sizeof(struct pipe_vertex_element) * vpv->num_inputs);
|
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.
|
* Setup the vbuffer[] and velements[] arrays.
|
||||||
*/
|
*/
|
||||||
@@ -646,6 +664,26 @@ st_draw_vbo(struct gl_context *ctx,
|
|||||||
#endif
|
#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);
|
setup_index_buffer(ctx, ib, &ibuffer);
|
||||||
pipe->set_index_buffer(pipe, &ibuffer);
|
pipe->set_index_buffer(pipe, &ibuffer);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user