diff options
author | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2016-09-14 09:45:37 +0200 |
---|---|---|
committer | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2016-09-16 15:39:26 +0200 |
commit | c1ba2a2e834d8a3765549b82647e9e3bac14a969 (patch) | |
tree | f40674a7d740dc60979a457965f85f8bef1d2823 | |
parent | e058b050240f8f6fe8fe04bc02c9259c0a9ec584 (diff) |
radeonsi: add si_get_shader_buffers/get_pipe_constant_buffers
These functions extract the pipe state structure from the current
descriptors, for state saving.
-rw-r--r-- | src/gallium/drivers/radeonsi/si_descriptors.c | 46 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.h | 5 |
2 files changed, 51 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index b1a8594c87..d82910cec4 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -837,6 +837,27 @@ static void si_buffer_resources_begin_new_cs(struct si_context *sctx, } } +static void si_get_buffer_from_descriptors(struct si_buffer_resources *buffers, + struct si_descriptors *descs, + unsigned idx, struct pipe_resource **buf, + unsigned *offset, unsigned *size) +{ + pipe_resource_reference(buf, buffers->buffers[idx]); + if (*buf) { + struct r600_resource *res = (struct r600_resource *)buf; + const uint32_t *desc = descs->list + idx * 4; + uint64_t va; + + *size = desc[2]; + + assert(G_008F04_STRIDE(desc[1]) == 0); + va = ((uint64_t)desc[1] << 32) | desc[0]; + + assert(va >= res->gpu_address && va + *size <= res->gpu_address + res->bo_size); + *offset = va - res->gpu_address; + } +} + /* VERTEX BUFFERS */ static void si_vertex_buffers_begin_new_cs(struct si_context *sctx) @@ -1062,6 +1083,16 @@ static void si_pipe_set_constant_buffer(struct pipe_context *ctx, slot, input); } +void si_get_pipe_constant_buffer(struct si_context *sctx, uint shader, + uint slot, struct pipe_constant_buffer *cbuf) +{ + cbuf->user_buffer = NULL; + si_get_buffer_from_descriptors( + &sctx->const_buffers[shader], + si_const_buffer_descriptors(sctx, shader), + slot, &cbuf->buffer, &cbuf->buffer_offset, &cbuf->buffer_size); +} + /* SHADER BUFFERS */ static unsigned @@ -1132,6 +1163,21 @@ static void si_set_shader_buffers(struct pipe_context *ctx, } } +void si_get_shader_buffers(struct si_context *sctx, uint shader, + uint start_slot, uint count, + struct pipe_shader_buffer *sbuf) +{ + struct si_buffer_resources *buffers = &sctx->shader_buffers[shader]; + struct si_descriptors *descs = si_shader_buffer_descriptors(sctx, shader); + + for (unsigned i = 0; i < count; ++i) { + si_get_buffer_from_descriptors( + buffers, descs, start_slot + i, + &sbuf[i].buffer, &sbuf[i].buffer_offset, + &sbuf[i].buffer_size); + } +} + /* RING BUFFERS */ void si_set_ring_buffer(struct pipe_context *ctx, uint slot, diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h index e83b428430..3ebf578e59 100644 --- a/src/gallium/drivers/radeonsi/si_state.h +++ b/src/gallium/drivers/radeonsi/si_state.h @@ -281,6 +281,11 @@ void si_set_mutable_tex_desc_fields(struct r600_texture *tex, unsigned base_level, unsigned first_level, unsigned block_width, bool is_stencil, uint32_t *state); +void si_get_pipe_constant_buffer(struct si_context *sctx, uint shader, + uint slot, struct pipe_constant_buffer *cbuf); +void si_get_shader_buffers(struct si_context *sctx, uint shader, + uint start_slot, uint count, + struct pipe_shader_buffer *sbuf); void si_set_ring_buffer(struct pipe_context *ctx, uint slot, struct pipe_resource *buffer, unsigned stride, unsigned num_records, |