Re: [Mesa-dev] [PATCH 1/5] etnaviv: add support for user index buffers

2017-02-21 Thread Nicolai Hähnle

On 20.02.2017 19:03, Marek Olšák wrote:

From: Marek Olšák 

v2: fix a bug in u_helpers


Would've been nice to be more specific here. Anyway, the change is fine:

Reviewed-by: Nicolai Hähnle 


---
 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..e195576 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(>buffer, src->buffer);
   memcpy(dst, src, sizeof(*dst));
}
else {
   pipe_resource_reference(>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,
+ _ib.offset, _ib.buffer);
+   if (!new_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, _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..d5bf106 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);

Re: [Mesa-dev] [PATCH 1/5] etnaviv: add support for user index buffers

2017-02-17 Thread Marek Olšák
On Fri, Feb 17, 2017 at 11:27 AM, Marek Olšák  wrote:
> From: Marek Olšák 
>
> ---
>  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(>buffer, src->buffer);
>memcpy(dst, src, sizeof(*dst));
> }
> else {
>pipe_resource_reference(>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,
> + _ib.offset, _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, _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,