[Mesa-dev] [PATCH] r600, compute: create vtx buffer for text + rodata
Tom Stellard
tom at stellard.net
Wed May 4 00:43:02 UTC 2016
On Mon, May 02, 2016 at 01:11:18AM -0400, Jan Vesely wrote:
> From: Jan Vesely <jan.vesely at rutgers.edu>
>
> reserve buffer id 2
>
>
> Signed-off-by: Jan Vesely <jan.vesely at rutgers.edu>
> ---
> needs llvm patches to be of use:
> https://github.com/jvesely/llvm/tree/eg-const
>
> passes program-scope-arrays piglit and fixes all builtin functions that
> are implemented using large tables (AMD Turks)
>
> src/gallium/drivers/r600/evergreen_compute.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
> index 334897e..f498007 100644
> --- a/src/gallium/drivers/r600/evergreen_compute.c
> +++ b/src/gallium/drivers/r600/evergreen_compute.c
> @@ -259,9 +259,11 @@ static void *evergreen_create_compute_state(struct pipe_context *ctx,
> radeon_elf_read(code, header->num_bytes, &shader->binary);
> r600_create_shader(&shader->bc, &shader->binary, &use_kill);
>
> + /* Upload code + ROdata */
> shader->code_bo = r600_compute_buffer_alloc_vram(rctx->screen,
> shader->bc.ndw * 4);
> p = r600_buffer_map_sync_with_rings(&rctx->b, shader->code_bo, PIPE_TRANSFER_WRITE);
> + //TODO: use util_memcpy_cpu_to_le32 ?
> memcpy(p, shader->bc.bytecode, shader->bc.ndw * 4);
> rctx->b.ws->buffer_unmap(shader->code_bo->buf);
> #endif
> @@ -612,9 +614,9 @@ static void evergreen_set_compute_resources(struct pipe_context *ctx,
> start, count);
>
> for (unsigned i = 0; i < count; i++) {
> - /* The First two vertex buffers are reserved for parameters and
> + /* The First three vertex buffers are reserved for parameters and
> * global buffers. */
> - unsigned vtx_id = 2 + i;
> + unsigned vtx_id = 3 + i;
> if (resources[i]) {
> struct r600_resource_global *buffer =
> (struct r600_resource_global*)
> @@ -681,9 +683,15 @@ static void evergreen_set_global_binding(struct pipe_context *ctx,
> *(handles[i]) = util_cpu_to_le32(handle);
> }
>
> + /* globals for writing */
> evergreen_set_rat(rctx->cs_shader_state.shader, 0, pool->bo, 0, pool->size_in_dw * 4);
> + /* globals for reading */
> evergreen_cs_set_vertex_buffer(rctx, 1, 0,
> (struct pipe_resource*)pool->bo);
> +
> + /* constants for reading, LLVM puts them in text segment */
> + evergreen_cs_set_vertex_buffer(rctx, 2, 0,
> + (struct pipe_resource*)rctx->cs_shader_state.shader->code_bo);
I see now you are binding the whole shader to the vertex buffer rather
than just the readonly data, which is why you need to emit the
GlobalAddress in LLVM.
If you were to just bind the read-only data you could generate better
code in LLVM, because all the global address would just be constant
offsets from the start of the buffer and they could be folded into
other instructions.
However, this would be a little more involved because you would have
to change llvm to emit the read-only data fro R600 into a separate
section.
I think your approach is fine, since it is what radeonsi is doing, and
that makes it easier to share code for this in LLVM. If you want to
optimize this in the future you always do it in a follow up commit.
Reviewed-by: Tom Stellard <thomas.stellard at amd.com>
> }
>
> /**
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list