[Mesa-dev] [PATCH 1/5] etnaviv: add support for user index buffers
Marek Olšák
maraeo at gmail.com
Fri Feb 17 12:38:16 UTC 2017
On Fri, Feb 17, 2017 at 11:27 AM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> src/gallium/auxiliary/util/u_helpers.c | 29 +++++++++++++++++++++++++++
> src/gallium/auxiliary/util/u_helpers.h | 5 +++++
> src/gallium/drivers/etnaviv/etnaviv_context.c | 12 +++++++++++
> src/gallium/drivers/etnaviv/etnaviv_screen.c | 2 +-
> 4 files changed, 47 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/auxiliary/util/u_helpers.c b/src/gallium/auxiliary/util/u_helpers.c
> index 09020b0..85e7fb0 100644
> --- a/src/gallium/auxiliary/util/u_helpers.c
> +++ b/src/gallium/auxiliary/util/u_helpers.c
> @@ -20,20 +20,21 @@
> * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> * IN NO EVENT SHALL THE AUTHORS AND/OR THEIR SUPPLIERS BE LIABLE FOR
> * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> *
> **************************************************************************/
>
> #include "util/u_helpers.h"
> #include "util/u_inlines.h"
> +#include "util/u_upload_mgr.h"
>
> /**
> * This function is used to copy an array of pipe_vertex_buffer structures,
> * while properly referencing the pipe_vertex_buffer::buffer member.
> *
> * enabled_buffers is updated such that the bits corresponding to the indices
> * of disabled buffers are set to 0 and the enabled ones are set to 1.
> *
> * \sa util_copy_framebuffer_state
> */
> @@ -102,10 +103,38 @@ util_set_index_buffer(struct pipe_index_buffer *dst,
> {
> if (src) {
> pipe_resource_reference(&dst->buffer, src->buffer);
> memcpy(dst, src, sizeof(*dst));
> }
> else {
> pipe_resource_reference(&dst->buffer, NULL);
> memset(dst, 0, sizeof(*dst));
> }
> }
> +
> +/**
> + * Given a user index buffer, save the structure to "saved", and upload it.
> + */
> +bool
> +util_save_and_upload_index_buffer(struct pipe_context *pipe,
> + const struct pipe_draw_info *info,
> + const struct pipe_index_buffer *ib,
> + struct pipe_index_buffer *out_saved)
> +{
> + struct pipe_index_buffer new_ib = {0};
> + unsigned start_offset = info->start * ib->index_size;
> +
> + u_upload_data(pipe->stream_uploader, start_offset,
> + info->count * ib->index_size, 4,
> + (char*)ib->user_buffer + start_offset,
> + &new_ib.offset, &new_ib.buffer);
> + if (!ib->buffer)
> + return false;
> + u_upload_unmap(pipe->stream_uploader);
> +
> + new_ib.offset -= start_offset;
> + new_ib.index_size = ib->index_size;
> +
> + util_set_index_buffer(out_saved, ib);
> + pipe->set_index_buffer(pipe, &new_ib);
> + return true;
> +}
> diff --git a/src/gallium/auxiliary/util/u_helpers.h b/src/gallium/auxiliary/util/u_helpers.h
> index a9a53e4..7de960b 100644
> --- a/src/gallium/auxiliary/util/u_helpers.h
> +++ b/src/gallium/auxiliary/util/u_helpers.h
> @@ -40,15 +40,20 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
> unsigned start_slot, unsigned count);
>
> void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
> unsigned *dst_count,
> const struct pipe_vertex_buffer *src,
> unsigned start_slot, unsigned count);
>
> void util_set_index_buffer(struct pipe_index_buffer *dst,
> const struct pipe_index_buffer *src);
>
> +bool util_save_and_upload_index_buffer(struct pipe_context *pipe,
> + const struct pipe_draw_info *info,
> + const struct pipe_index_buffer *ib,
> + struct pipe_index_buffer *out_saved);
> +
> #ifdef __cplusplus
> }
> #endif
>
> #endif
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c
> index 62297a0..d22939a 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_context.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c
> @@ -40,20 +40,21 @@
> #include "etnaviv_state.h"
> #include "etnaviv_surface.h"
> #include "etnaviv_texture.h"
> #include "etnaviv_transfer.h"
> #include "etnaviv_translate.h"
> #include "etnaviv_zsa.h"
>
> #include "pipe/p_context.h"
> #include "pipe/p_state.h"
> #include "util/u_blitter.h"
> +#include "util/u_helpers.h"
> #include "util/u_memory.h"
> #include "util/u_prim.h"
> #include "util/u_upload_mgr.h"
>
> #include "hw/common.xml.h"
>
> static void
> etna_context_destroy(struct pipe_context *pctx)
> {
> struct etna_context *ctx = etna_context(pctx);
> @@ -130,20 +131,29 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
> DBG("Invalid draw primitive mode=%i or no primitives to be drawn", info->mode);
> return;
> }
>
> draw_mode = translate_draw_mode(info->mode);
> if (draw_mode == ETNA_NO_MATCH) {
> BUG("Unsupported draw mode");
> return;
> }
>
> + /* Upload a user index buffer. */
> + struct pipe_index_buffer ibuffer_saved = {};
> + if (info->indexed && ctx->index_buffer.ib.user_buffer &&
> + !util_save_and_upload_index_buffer(pctx, info, &ctx->index_buffer,
This should be &ctx->index_buffer.ib. Fixed locally.
Marek
More information about the mesa-dev
mailing list