From: Marek Olšák <marek.ol...@amd.com> v3: split from the etnaviv patch; fix new_ib.buffer leak --- src/gallium/auxiliary/util/u_helpers.c | 30 ++++++++++++++++++++++++++++++ src/gallium/auxiliary/util/u_helpers.h | 5 +++++ 2 files changed, 35 insertions(+)
diff --git a/src/gallium/auxiliary/util/u_helpers.c b/src/gallium/auxiliary/util/u_helpers.c index 09020b0..35cca82 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,39 @@ 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 (!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, &new_ib); + pipe_resource_reference(&new_ib.buffer, NULL); + 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 -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev