Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / auxiliary / util / u_index_modify.c
1 /*
2  * Copyright 2010 Marek Olšák <maraeo@gmail.com>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * on the rights to use, copy, modify, merge, publish, distribute, sub
8  * license, and/or sell copies of the Software, and to permit persons to whom
9  * the Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21  * USE OR OTHER DEALINGS IN THE SOFTWARE. */
22
23 #include "pipe/p_context.h"
24 #include "util/u_index_modify.h"
25 #include "util/u_inlines.h"
26
27 /* Ubyte indices. */
28
29 void util_shorten_ubyte_elts_to_userptr(struct pipe_context *context,
30                                         struct pipe_resource *elts,
31                                         int index_bias,
32                                         unsigned start,
33                                         unsigned count,
34                                         void *out)
35 {
36     struct pipe_transfer *src_transfer;
37     unsigned char *in_map;
38     unsigned short *out_map = out;
39     unsigned i;
40
41     in_map = pipe_buffer_map(context, elts,
42                              PIPE_TRANSFER_READ |
43                              PIPE_TRANSFER_UNSYNCHRONIZED,
44                              &src_transfer);
45     in_map += start;
46
47     for (i = 0; i < count; i++) {
48         *out_map = (unsigned short)(*in_map + index_bias);
49         in_map++;
50         out_map++;
51     }
52
53     pipe_buffer_unmap(context, src_transfer);
54 }
55
56 void util_shorten_ubyte_elts(struct pipe_context *context,
57                              struct pipe_resource **elts,
58                              int index_bias,
59                              unsigned start,
60                              unsigned count)
61 {
62     struct pipe_resource* new_elts;
63     unsigned short *out_map;
64     struct pipe_transfer *dst_transfer;
65
66     new_elts = pipe_buffer_create(context->screen,
67                                   PIPE_BIND_INDEX_BUFFER,
68                                   PIPE_USAGE_STATIC,
69                                   2 * count);
70
71     out_map = pipe_buffer_map(context, new_elts, PIPE_TRANSFER_WRITE,
72                               &dst_transfer);
73     util_shorten_ubyte_elts_to_userptr(context, *elts, index_bias,
74                                        start, count, out_map);
75     pipe_buffer_unmap(context, dst_transfer);
76
77     *elts = new_elts;
78 }
79
80
81 /* Ushort indices. */
82
83 void util_rebuild_ushort_elts_to_userptr(struct pipe_context *context,
84                                          struct pipe_resource *elts,
85                                          int index_bias,
86                                          unsigned start, unsigned count,
87                                          void *out)
88 {
89     struct pipe_transfer *in_transfer = NULL;
90     unsigned short *in_map;
91     unsigned short *out_map = out;
92     unsigned i;
93
94     in_map = pipe_buffer_map(context, elts,
95                              PIPE_TRANSFER_READ |
96                              PIPE_TRANSFER_UNSYNCHRONIZED,
97                              &in_transfer);
98     in_map += start;
99
100     for (i = 0; i < count; i++) {
101         *out_map = (unsigned short)(*in_map + index_bias);
102         in_map++;
103         out_map++;
104     }
105
106     pipe_buffer_unmap(context, in_transfer);
107 }
108
109 void util_rebuild_ushort_elts(struct pipe_context *context,
110                               struct pipe_resource **elts,
111                               int index_bias,
112                               unsigned start, unsigned count)
113 {
114     struct pipe_transfer *out_transfer = NULL;
115     struct pipe_resource *new_elts;
116     unsigned short *out_map;
117
118     new_elts = pipe_buffer_create(context->screen,
119                                   PIPE_BIND_INDEX_BUFFER,
120                                   PIPE_USAGE_STATIC,
121                                   2 * count);
122
123     out_map = pipe_buffer_map(context, new_elts,
124                               PIPE_TRANSFER_WRITE, &out_transfer);
125     util_rebuild_ushort_elts_to_userptr(context, *elts, index_bias,
126                                         start, count, out_map);
127     pipe_buffer_unmap(context, out_transfer);
128
129     *elts = new_elts;
130 }
131
132
133 /* Uint indices. */
134
135 void util_rebuild_uint_elts_to_userptr(struct pipe_context *context,
136                                        struct pipe_resource *elts,
137                                        int index_bias,
138                                        unsigned start, unsigned count,
139                                        void *out)
140 {
141     struct pipe_transfer *in_transfer = NULL;
142     unsigned int *in_map;
143     unsigned int *out_map = out;
144     unsigned i;
145
146     in_map = pipe_buffer_map(context, elts,
147                              PIPE_TRANSFER_READ |
148                              PIPE_TRANSFER_UNSYNCHRONIZED,
149                              &in_transfer);
150     in_map += start;
151
152     for (i = 0; i < count; i++) {
153         *out_map = (unsigned int)(*in_map + index_bias);
154         in_map++;
155         out_map++;
156     }
157
158     pipe_buffer_unmap(context, in_transfer);
159 }
160
161 void util_rebuild_uint_elts(struct pipe_context *context,
162                             struct pipe_resource **elts,
163                             int index_bias,
164                             unsigned start, unsigned count)
165 {
166     struct pipe_transfer *out_transfer = NULL;
167     struct pipe_resource *new_elts;
168     unsigned int *out_map;
169
170     new_elts = pipe_buffer_create(context->screen,
171                                   PIPE_BIND_INDEX_BUFFER,
172                                   PIPE_USAGE_STATIC,
173                                   2 * count);
174
175     out_map = pipe_buffer_map(context, new_elts,
176                               PIPE_TRANSFER_WRITE, &out_transfer);
177     util_rebuild_uint_elts_to_userptr(context, *elts, index_bias,
178                                       start, count, out_map);
179     pipe_buffer_unmap(context, out_transfer);
180
181     *elts = new_elts;
182 }