Re: [Mesa-dev] [PATCH 1/5] etnaviv: add support for user index buffers
On 20.02.2017 19:03, Marek Olšák wrote: From: Marek Olšákv2: 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
On Fri, Feb 17, 2017 at 11:27 AM, Marek Olšákwrote: > 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,