diff options
Diffstat (limited to 'src/gallium')
| -rw-r--r-- | src/gallium/auxiliary/Makefile | 1 | ||||
| -rw-r--r-- | src/gallium/auxiliary/SConscript | 1 | ||||
| -rw-r--r-- | src/gallium/auxiliary/util/u_index_modify.c | 127 | ||||
| -rw-r--r-- | src/gallium/auxiliary/util/u_index_modify.h | 41 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_render_translate.c | 112 | 
5 files changed, 174 insertions, 108 deletions
diff --git a/src/gallium/auxiliary/Makefile b/src/gallium/auxiliary/Makefile index 2de764c4ee..c339f72fe2 100644 --- a/src/gallium/auxiliary/Makefile +++ b/src/gallium/auxiliary/Makefile @@ -121,6 +121,7 @@ C_SOURCES = \  	util/u_handle_table.c \  	util/u_hash.c \  	util/u_hash_table.c \ +	util/u_index_modify.c \  	util/u_keymap.c \  	util/u_linear.c \  	util/u_linkage.c \ diff --git a/src/gallium/auxiliary/SConscript b/src/gallium/auxiliary/SConscript index 294df30094..144d929f68 100644 --- a/src/gallium/auxiliary/SConscript +++ b/src/gallium/auxiliary/SConscript @@ -170,6 +170,7 @@ source = [      'util/u_handle_table.c',      'util/u_hash.c',      'util/u_hash_table.c', +    'util/u_index_modify.c',      'util/u_keymap.c',      'util/u_linear.c',      'util/u_linkage.c', diff --git a/src/gallium/auxiliary/util/u_index_modify.c b/src/gallium/auxiliary/util/u_index_modify.c new file mode 100644 index 0000000000..65b079ed53 --- /dev/null +++ b/src/gallium/auxiliary/util/u_index_modify.c @@ -0,0 +1,127 @@ +/* + * Copyright 2010 Marek Olšák <maraeo@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) 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 "pipe/p_context.h" +#include "util/u_index_modify.h" +#include "util/u_inlines.h" + +void util_shorten_ubyte_elts(struct pipe_context *context, +			     struct pipe_resource **elts, +			     int index_bias, +			     unsigned start, +			     unsigned count) +{ +    struct pipe_screen* screen = context->screen; +    struct pipe_resource* new_elts; +    unsigned char *in_map; +    unsigned short *out_map; +    struct pipe_transfer *src_transfer, *dst_transfer; +    unsigned i; + +    new_elts = pipe_buffer_create(screen, +                                  PIPE_BIND_INDEX_BUFFER, +                                  2 * count); + +    in_map = pipe_buffer_map(context, *elts, PIPE_TRANSFER_READ, &src_transfer); +    out_map = pipe_buffer_map(context, new_elts, PIPE_TRANSFER_WRITE, &dst_transfer); + +    in_map += start; + +    for (i = 0; i < count; i++) { +        *out_map = (unsigned short)(*in_map + index_bias); +        in_map++; +        out_map++; +    } + +    pipe_buffer_unmap(context, *elts, src_transfer); +    pipe_buffer_unmap(context, new_elts, dst_transfer); + +    *elts = new_elts; +} + +void util_rebuild_ushort_elts(struct pipe_context *context, +			      struct pipe_resource **elts, +			      int index_bias, +			      unsigned start, unsigned count) +{ +    struct pipe_transfer *in_transfer = NULL; +    struct pipe_transfer *out_transfer = NULL; +    struct pipe_resource *new_elts; +    unsigned short *in_map; +    unsigned short *out_map; +    unsigned i; + +    new_elts = pipe_buffer_create(context->screen, +                                  PIPE_BIND_INDEX_BUFFER, +                                  2 * count); + +    in_map = pipe_buffer_map(context, *elts, +                             PIPE_TRANSFER_READ, &in_transfer); +    out_map = pipe_buffer_map(context, new_elts, +                              PIPE_TRANSFER_WRITE, &out_transfer); + +    in_map += start; +    for (i = 0; i < count; i++) { +        *out_map = (unsigned short)(*in_map + index_bias); +        in_map++; +        out_map++; +    } + +    pipe_buffer_unmap(context, *elts, in_transfer); +    pipe_buffer_unmap(context, new_elts, out_transfer); + +    *elts = new_elts; +} + +void util_rebuild_uint_elts(struct pipe_context *context, +			    struct pipe_resource **elts, +			    int index_bias, +			    unsigned start, unsigned count) +{ +    struct pipe_transfer *in_transfer = NULL; +    struct pipe_transfer *out_transfer = NULL; +    struct pipe_resource *new_elts; +    unsigned int *in_map; +    unsigned int *out_map; +    unsigned i; + +    new_elts = pipe_buffer_create(context->screen, +                                  PIPE_BIND_INDEX_BUFFER, +                                  2 * count); + +    in_map = pipe_buffer_map(context, *elts, +                             PIPE_TRANSFER_READ, &in_transfer); +    out_map = pipe_buffer_map(context, new_elts, +                              PIPE_TRANSFER_WRITE, &out_transfer); + +    in_map += start; +    for (i = 0; i < count; i++) { +        *out_map = (unsigned int)(*in_map + index_bias); +        in_map++; +        out_map++; +    } + +    pipe_buffer_unmap(context, *elts, in_transfer); +    pipe_buffer_unmap(context, new_elts, out_transfer); + +    *elts = new_elts; +} diff --git a/src/gallium/auxiliary/util/u_index_modify.h b/src/gallium/auxiliary/util/u_index_modify.h new file mode 100644 index 0000000000..01a6cae94f --- /dev/null +++ b/src/gallium/auxiliary/util/u_index_modify.h @@ -0,0 +1,41 @@ +/* + * Copyright 2010 Marek Olšák <maraeo@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) 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. */ + +#ifndef UTIL_INDEX_MODIFY_H +#define UTIL_INDEX_MODIFY_H + +void util_shorten_ubyte_elts(struct pipe_context *context, +			     struct pipe_resource **elts, +			     int index_bias, +			     unsigned start, +			     unsigned count); + +void util_rebuild_ushort_elts(struct pipe_context *context, +			      struct pipe_resource **elts, +			      int index_bias, +			      unsigned start, unsigned count); + +void util_rebuild_uint_elts(struct pipe_context *context, +			    struct pipe_resource **elts, +			    int index_bias, +			    unsigned start, unsigned count); +#endif diff --git a/src/gallium/drivers/r300/r300_render_translate.c b/src/gallium/drivers/r300/r300_render_translate.c index 0ea11e5bfc..9247064508 100644 --- a/src/gallium/drivers/r300/r300_render_translate.c +++ b/src/gallium/drivers/r300/r300_render_translate.c @@ -29,6 +29,7 @@  #include "r300_context.h"  #include "translate/translate.h" +#include "util/u_index_modify.h"  void r300_begin_vertex_translate(struct r300_context *r300)  { @@ -188,111 +189,6 @@ void r300_end_vertex_translate(struct r300_context *r300)                              NULL);  } -static void r300_shorten_ubyte_elts(struct r300_context* r300, -                                    struct pipe_resource** elts, -                                    int index_bias, -                                    unsigned start, -                                    unsigned count) -{ -    struct pipe_context* context = &r300->context; -    struct pipe_screen* screen = r300->context.screen; -    struct pipe_resource* new_elts; -    unsigned char *in_map; -    unsigned short *out_map; -    struct pipe_transfer *src_transfer, *dst_transfer; -    unsigned i; - -    new_elts = pipe_buffer_create(screen, -                                  PIPE_BIND_INDEX_BUFFER, -                                  2 * count); - -    in_map = pipe_buffer_map(context, *elts, PIPE_TRANSFER_READ, &src_transfer); -    out_map = pipe_buffer_map(context, new_elts, PIPE_TRANSFER_WRITE, &dst_transfer); - -    in_map += start; - -    for (i = 0; i < count; i++) { -        *out_map = (unsigned short)(*in_map + index_bias); -        in_map++; -        out_map++; -    } - -    pipe_buffer_unmap(context, *elts, src_transfer); -    pipe_buffer_unmap(context, new_elts, dst_transfer); - -    *elts = new_elts; -} - -static void r300_rebuild_ushort_elts(struct r300_context *r300, -                                     struct pipe_resource **elts, -                                     int index_bias, -                                     unsigned start, unsigned count) -{ -    struct pipe_context *context = &r300->context; -    struct pipe_transfer *in_transfer = NULL; -    struct pipe_transfer *out_transfer = NULL; -    struct pipe_resource *new_elts; -    unsigned short *in_map; -    unsigned short *out_map; -    unsigned i; - -    new_elts = pipe_buffer_create(context->screen, -                                  PIPE_BIND_INDEX_BUFFER, -                                  2 * count); - -    in_map = pipe_buffer_map(context, *elts, -                             PIPE_TRANSFER_READ, &in_transfer); -    out_map = pipe_buffer_map(context, new_elts, -                              PIPE_TRANSFER_WRITE, &out_transfer); - -    in_map += start; -    for (i = 0; i < count; i++) { -        *out_map = (unsigned short)(*in_map + index_bias); -        in_map++; -        out_map++; -    } - -    pipe_buffer_unmap(context, *elts, in_transfer); -    pipe_buffer_unmap(context, new_elts, out_transfer); - -    *elts = new_elts; -} - -static void r300_rebuild_uint_elts(struct r300_context *r300, -                                   struct pipe_resource **elts, -                                   int index_bias, -                                   unsigned start, unsigned count) -{ -    struct pipe_context *context = &r300->context; -    struct pipe_transfer *in_transfer = NULL; -    struct pipe_transfer *out_transfer = NULL; -    struct pipe_resource *new_elts; -    unsigned int *in_map; -    unsigned int *out_map; -    unsigned i; - -    new_elts = pipe_buffer_create(context->screen, -                                  PIPE_BIND_INDEX_BUFFER, -                                  2 * count); - -    in_map = pipe_buffer_map(context, *elts, -                             PIPE_TRANSFER_READ, &in_transfer); -    out_map = pipe_buffer_map(context, new_elts, -                              PIPE_TRANSFER_WRITE, &out_transfer); - -    in_map += start; -    for (i = 0; i < count; i++) { -        *out_map = (unsigned int)(*in_map + index_bias); -        in_map++; -        out_map++; -    } - -    pipe_buffer_unmap(context, *elts, in_transfer); -    pipe_buffer_unmap(context, new_elts, out_transfer); - -    *elts = new_elts; -} -  void r300_translate_index_buffer(struct r300_context *r300,                                   struct pipe_resource **index_buffer,                                   unsigned *index_size, unsigned index_offset, @@ -300,21 +196,21 @@ void r300_translate_index_buffer(struct r300_context *r300,  {      switch (*index_size) {          case 1: -            r300_shorten_ubyte_elts(r300, index_buffer, index_offset, *start, count); +            util_shorten_ubyte_elts(&r300->context, index_buffer, index_offset, *start, count);              *index_size = 2;              *start = 0;              break;          case 2:              if (*start % 2 != 0 || index_offset) { -                r300_rebuild_ushort_elts(r300, index_buffer, index_offset, *start, count); +                util_rebuild_ushort_elts(&r300->context, index_buffer, index_offset, *start, count);                  *start = 0;              }              break;          case 4:              if (index_offset) { -                r300_rebuild_uint_elts(r300, index_buffer, index_offset, *start, count); +                util_rebuild_uint_elts(&r300->context, index_buffer, index_offset, *start, count);                  *start = 0;              }              break;  | 
