Am 30.01.2014 17:50, schrieb Marek Olšák: > On Thu, Jan 30, 2014 at 5:31 PM, Roland Scheidegger <srol...@vmware.com> > wrote: >> Am 30.01.2014 02:20, schrieb Marek Olšák: >>> From: Marek Olšák <marek.ol...@amd.com> >>> >>> Required for ARB_buffer_storage. >>> --- >>> src/gallium/docs/source/context.rst | 22 ++++++++++++++++++++++ >>> src/gallium/docs/source/screen.rst | 3 +++ >>> src/gallium/drivers/trace/tr_context.c | 16 ++++++++++++++++ >>> src/gallium/include/pipe/p_context.h | 7 ++++++- >>> src/gallium/include/pipe/p_defines.h | 31 +++++++++++++++++++++++++++++-- >>> 5 files changed, 76 insertions(+), 3 deletions(-) >>> >>> diff --git a/src/gallium/docs/source/context.rst >>> b/src/gallium/docs/source/context.rst >>> index 1037162..4258e43 100644 >>> --- a/src/gallium/docs/source/context.rst >>> +++ b/src/gallium/docs/source/context.rst >>> @@ -520,6 +520,16 @@ invalidates all read caches of the currently-set >>> samplers. >>> >>> >>> >>> +.. _memory_barrier: >>> + >>> +memory_barrier >>> +%%%%%%%%%%%%%%% >>> + >>> +This function flushes caches according to which of the PIPE_BARRIER_* flags >>> +are set. >>> + >>> + >>> + >>> .. _pipe_transfer: >>> >>> PIPE_TRANSFER >>> @@ -557,6 +567,18 @@ These flags control the behavior of a transfer object. >>> Written ranges will be notified later with :ref:`transfer_flush_region`. >>> Cannot be used with ``PIPE_TRANSFER_READ``. >>> >>> +``PIPE_TRANSFER_PERSISTENT`` >>> + Allows the resource to be used for rendering while mapped. >>> + PIPE_RESOURCE_FLAG_TRANSFER_PERSISTENT must be set when creating >>> + the resource. >>> + If COHERENT is not set, memory_barrier(PIPE_BARRIER_MAPPED_BUFFER) >>> + must be called to ensure the device can see what the CPU has written. >>> + >>> +``PIPE_TRANSFER_COHERENT`` >>> + If PERSISTENT is set, this ensures any writes done by the device are >>> + immediately visible to the CPU and vice versa. >>> + PIPE_RESOURCE_FLAG_TRANSFER_COHERENT must be set when creating >>> + the resource. >>> >>> Compute kernel execution >>> ^^^^^^^^^^^^^^^^^^^^^^^^ >>> diff --git a/src/gallium/docs/source/screen.rst >>> b/src/gallium/docs/source/screen.rst >>> index ed8e832..cbb07d6 100644 >>> --- a/src/gallium/docs/source/screen.rst >>> +++ b/src/gallium/docs/source/screen.rst >>> @@ -176,6 +176,9 @@ The integer capabilities: >>> ARB_framebuffer_object is provided. >>> * ``PIPE_CAP_TGSI_VS_LAYER``: Whether TGSI_SEMANTIC_LAYER is supported >>> as a vertex shader output. >>> +* ``PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT``: Whether >>> + PIPE_TRANSFER_PERSISTENT and PIPE_TRANSFER_COHERENT are supported >>> + for buffers. >>> >>> >>> .. _pipe_capf: >>> diff --git a/src/gallium/drivers/trace/tr_context.c >>> b/src/gallium/drivers/trace/tr_context.c >>> index 60ebea4..c10e010 100644 >>> --- a/src/gallium/drivers/trace/tr_context.c >>> +++ b/src/gallium/drivers/trace/tr_context.c >>> @@ -1489,6 +1489,21 @@ static void trace_context_texture_barrier(struct >>> pipe_context *_context) >>> } >>> >>> >>> +static void trace_context_memory_barrier(struct pipe_context *_context, >>> + unsigned flags) >>> +{ >>> + struct trace_context *tr_context = trace_context(_context); >>> + struct pipe_context *context = tr_context->pipe; >>> + >>> + trace_dump_call_begin("pipe_context", "memory_barrier"); >>> + trace_dump_arg(ptr, context); >>> + trace_dump_arg(uint, flags); >>> + trace_dump_call_end(); >>> + >>> + context->memory_barrier(context, flags); >>> +} >>> + >>> + >>> static const struct debug_named_value rbug_blocker_flags[] = { >>> {"before", 1, NULL}, >>> {"after", 2, NULL}, >>> @@ -1577,6 +1592,7 @@ trace_context_create(struct trace_screen *tr_scr, >>> TR_CTX_INIT(clear_depth_stencil); >>> TR_CTX_INIT(flush); >>> TR_CTX_INIT(texture_barrier); >>> + TR_CTX_INIT(memory_barrier); >>> >>> TR_CTX_INIT(transfer_map); >>> TR_CTX_INIT(transfer_unmap); >>> diff --git a/src/gallium/include/pipe/p_context.h >>> b/src/gallium/include/pipe/p_context.h >>> index 8ef6e27..93f4c57 100644 >>> --- a/src/gallium/include/pipe/p_context.h >>> +++ b/src/gallium/include/pipe/p_context.h >>> @@ -406,7 +406,12 @@ struct pipe_context { >>> * Flush any pending framebuffer writes and invalidate texture caches. >>> */ >>> void (*texture_barrier)(struct pipe_context *); >>> - >>> + >>> + /** >>> + * Flush caches according to flags. >>> + */ >>> + void (*memory_barrier)(struct pipe_context *, unsigned flags); >>> + >>> /** >>> * Creates a video codec for a specific video format/profile >>> */ >>> diff --git a/src/gallium/include/pipe/p_defines.h >>> b/src/gallium/include/pipe/p_defines.h >>> index 8d08a90..31a9c72 100644 >>> --- a/src/gallium/include/pipe/p_defines.h >>> +++ b/src/gallium/include/pipe/p_defines.h >>> @@ -295,8 +295,27 @@ enum pipe_transfer_usage { >>> * - D3D10 DDI's D3D10_DDI_MAP_WRITE_DISCARD flag >>> * - D3D10's D3D10_MAP_WRITE_DISCARD flag. >>> */ >>> - PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE = (1 << 12) >>> + PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE = (1 << 12), >>> >>> + /** >>> + * Allows the resource to be used for rendering while mapped. >>> + * >>> + * PIPE_RESOURCE_FLAG_TRANSFER_PERSISTENT must be set when creating >>> + * the resource. >>> + * >>> + * If COHERENT is not set, memory_barrier(PIPE_BARRIER_MAPPED_BUFFER) >>> + * must be called to ensure the device can see what the CPU has written. >>> + */ >>> + PIPE_TRANSFER_PERSISTENT = (1 << 13), >>> + >>> + /** >>> + * If PERSISTENT is set, this ensures any writes done by the device are >>> + * immediately visible to the CPU and vice versa. >>> + * >>> + * PIPE_RESOURCE_FLAG_TRANSFER_COHERENT must be set when creating >>> + * the resource. >>> + */ >>> + PIPE_TRANSFER_COHERENT = (1 << 14) >> Here and in docs, what's the effect if persistent isn't set? Does that >> just have no effect? > > Yes, it has no effect. > >> >> >>> }; >>> >>> /** >>> @@ -306,6 +325,11 @@ enum pipe_flush_flags { >>> PIPE_FLUSH_END_OF_FRAME = (1 << 0) >>> }; >>> >>> +/** >>> + * Flags for pipe_context::memory_barrier. >>> + */ >>> +#define PIPE_BARRIER_MAPPED_BUFFER (1 << 0) >>> + >>> /* >>> * Resource binding flags -- state tracker must specify in advance all >>> * the ways a resource might be used. >>> @@ -353,6 +377,8 @@ enum pipe_flush_flags { >>> /* Flags for the driver about resource behaviour: >>> */ >>> #define PIPE_RESOURCE_FLAG_GEN_MIPS (1 << 0) /* Driver performs >>> autogen mips */ >>> +#define PIPE_RESOURCE_FLAG_TRANSFER_PERSISTENT (1 << 1) >>> +#define PIPE_RESOURCE_FLAG_TRANSFER_COHERENT (1 << 2) >>> #define PIPE_RESOURCE_FLAG_DRV_PRIV (1 << 16) /* driver/winsys private >>> */ >>> #define PIPE_RESOURCE_FLAG_ST_PRIV (1 << 24) /* state-tracker/winsys >>> private */ >>> >>> @@ -521,7 +547,8 @@ enum pipe_cap { >>> PIPE_CAP_MAX_VIEWPORTS = 84, >>> PIPE_CAP_ENDIANNESS = 85, >>> PIPE_CAP_MIXED_FRAMEBUFFER_SIZES = 86, >>> - PIPE_CAP_TGSI_VS_LAYER = 87 >>> + PIPE_CAP_TGSI_VS_LAYER = 87, >>> + PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT = 88 >>> }; >>> >>> #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0) >>> >> >> Other than that, this interface change looks alright to me. I guess the >> "transfer" name is a bit of a misnomer since transfer objects could be >> copies, which doesn't make much sense with persistent and coherent >> objects, but I can't see how you could change that. > > I guess I could change the names to: > PIPE_RESOURCE_FLAG_MAP_PERSISTENT > PIPE_RESOURCE_FLAG_MAP_COHERENT > PIPE_CAP_MAP_BUFFER_PERSISTENT_COHERENT > > Marek >
Maybe it would be better. You still have to get a "transfer" object first though, but you can't change that. I dunno either way is fine by me. Roland _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev