gallium/util: add new helpers for user index buffer uploading

v3: split from the etnaviv patch; fix new_ib.buffer leak

Reviewed-by: Brian Paul <brianp@vmware.com>
Tested-by: Brian Paul <brianp@vmware.com>  (VMware driver only)
This commit is contained in:
Marek Olšák 2017-02-22 20:52:49 +01:00
parent b10197e3a4
commit f139b6fb4f
2 changed files with 35 additions and 0 deletions

View file

@ -27,6 +27,7 @@
#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,
@ -109,3 +110,32 @@ util_set_index_buffer(struct pipe_index_buffer *dst,
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;
}

View file

@ -47,6 +47,11 @@ void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
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