[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