gallium/util: factor out primitive-restart rewriting logic
Reviewed-by: Gert Wollny <gert.wollny@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5976>
This commit is contained in:
parent
b6ebf6eba9
commit
0c85d6c523
|
@ -57,6 +57,38 @@ read_indirect_elements(struct pipe_context *context, struct pipe_draw_indirect_i
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
util_translate_prim_restart_data(unsigned index_size,
|
||||||
|
void *src_map, void *dst_map,
|
||||||
|
unsigned count, unsigned restart_index)
|
||||||
|
{
|
||||||
|
if (index_size == 1) {
|
||||||
|
uint8_t *src = (uint8_t *) src_map;
|
||||||
|
uint16_t *dst = (uint16_t *) dst_map;
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
dst[i] = (src[i] == restart_index) ? 0xffff : src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (index_size == 2) {
|
||||||
|
uint16_t *src = (uint16_t *) src_map;
|
||||||
|
uint16_t *dst = (uint16_t *) dst_map;
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
dst[i] = (src[i] == restart_index) ? 0xffff : src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uint32_t *src = (uint32_t *) src_map;
|
||||||
|
uint32_t *dst = (uint32_t *) dst_map;
|
||||||
|
unsigned i;
|
||||||
|
assert(index_size == 4);
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
dst[i] = (src[i] == restart_index) ? 0xffffffff : src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Translate an index buffer for primitive restart.
|
* Translate an index buffer for primitive restart.
|
||||||
* Create a new index buffer which is a copy of the original index buffer
|
* Create a new index buffer which is a copy of the original index buffer
|
||||||
|
@ -113,32 +145,8 @@ util_translate_prim_restart_ib(struct pipe_context *context,
|
||||||
if (!src_map)
|
if (!src_map)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (src_index_size == 1 && dst_index_size == 2) {
|
util_translate_prim_restart_data(src_index_size, src_map, dst_map,
|
||||||
uint8_t *src = (uint8_t *) src_map;
|
info->count, info->restart_index);
|
||||||
uint16_t *dst = (uint16_t *) dst_map;
|
|
||||||
unsigned i;
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
dst[i] = (src[i] == info->restart_index) ? 0xffff : src[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (src_index_size == 2 && dst_index_size == 2) {
|
|
||||||
uint16_t *src = (uint16_t *) src_map;
|
|
||||||
uint16_t *dst = (uint16_t *) dst_map;
|
|
||||||
unsigned i;
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
dst[i] = (src[i] == info->restart_index) ? 0xffff : src[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uint32_t *src = (uint32_t *) src_map;
|
|
||||||
uint32_t *dst = (uint32_t *) dst_map;
|
|
||||||
unsigned i;
|
|
||||||
assert(src_index_size == 4);
|
|
||||||
assert(dst_index_size == 4);
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
dst[i] = (src[i] == info->restart_index) ? 0xffffffff : src[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (src_transfer)
|
if (src_transfer)
|
||||||
pipe_buffer_unmap(context, src_transfer);
|
pipe_buffer_unmap(context, src_transfer);
|
||||||
|
|
|
@ -41,6 +41,10 @@ struct pipe_draw_info;
|
||||||
union pipe_index_binding;
|
union pipe_index_binding;
|
||||||
struct pipe_resource;
|
struct pipe_resource;
|
||||||
|
|
||||||
|
void
|
||||||
|
util_translate_prim_restart_data(unsigned index_size,
|
||||||
|
void *src_map, void *dst_map,
|
||||||
|
unsigned count, unsigned restart_index);
|
||||||
|
|
||||||
enum pipe_error
|
enum pipe_error
|
||||||
util_translate_prim_restart_ib(struct pipe_context *context,
|
util_translate_prim_restart_ib(struct pipe_context *context,
|
||||||
|
|
Loading…
Reference in New Issue