Merge branch 'draw-instanced'
[mesa.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, PIPE_TRANSFER_READ, &src_transfer);
42 in_map += start;
43
44 for (i = 0; i < count; i++) {
45 *out_map = (unsigned short)(*in_map + index_bias);
46 in_map++;
47 out_map++;
48 }
49
50 pipe_buffer_unmap(context, src_transfer);
51 }
52
53 void util_shorten_ubyte_elts(struct pipe_context *context,
54 struct pipe_resource **elts,
55 int index_bias,
56 unsigned start,
57 unsigned count)
58 {
59 struct pipe_resource* new_elts;
60 unsigned short *out_map;
61 struct pipe_transfer *dst_transfer;
62
63 new_elts = pipe_buffer_create(context->screen,
64 PIPE_BIND_INDEX_BUFFER,
65 2 * count);
66
67 out_map = pipe_buffer_map(context, new_elts, PIPE_TRANSFER_WRITE,
68 &dst_transfer);
69 util_shorten_ubyte_elts_to_userptr(context, *elts, index_bias,
70 start, count, out_map);
71 pipe_buffer_unmap(context, dst_transfer);
72
73 *elts = new_elts;
74 }
75
76
77 /* Ushort indices. */
78
79 void util_rebuild_ushort_elts_to_userptr(struct pipe_context *context,
80 struct pipe_resource *elts,
81 int index_bias,
82 unsigned start, unsigned count,
83 void *out)
84 {
85 struct pipe_transfer *in_transfer = NULL;
86 unsigned short *in_map;
87 unsigned short *out_map = out;
88 unsigned i;
89
90 in_map = pipe_buffer_map(context, elts, PIPE_TRANSFER_READ, &in_transfer);
91 in_map += start;
92
93 for (i = 0; i < count; i++) {
94 *out_map = (unsigned short)(*in_map + index_bias);
95 in_map++;
96 out_map++;
97 }
98
99 pipe_buffer_unmap(context, in_transfer);
100 }
101
102 void util_rebuild_ushort_elts(struct pipe_context *context,
103 struct pipe_resource **elts,
104 int index_bias,
105 unsigned start, unsigned count)
106 {
107 struct pipe_transfer *out_transfer = NULL;
108 struct pipe_resource *new_elts;
109 unsigned short *out_map;
110
111 new_elts = pipe_buffer_create(context->screen,
112 PIPE_BIND_INDEX_BUFFER,
113 2 * count);
114
115 out_map = pipe_buffer_map(context, new_elts,
116 PIPE_TRANSFER_WRITE, &out_transfer);
117 util_rebuild_ushort_elts_to_userptr(context, *elts, index_bias,
118 start, count, out_map);
119 pipe_buffer_unmap(context, out_transfer);
120
121 *elts = new_elts;
122 }
123
124
125 /* Uint indices. */
126
127 void util_rebuild_uint_elts_to_userptr(struct pipe_context *context,
128 struct pipe_resource *elts,
129 int index_bias,
130 unsigned start, unsigned count,
131 void *out)
132 {
133 struct pipe_transfer *in_transfer = NULL;
134 unsigned int *in_map;
135 unsigned int *out_map = out;
136 unsigned i;
137
138 in_map = pipe_buffer_map(context, elts, PIPE_TRANSFER_READ, &in_transfer);
139 in_map += start;
140
141 for (i = 0; i < count; i++) {
142 *out_map = (unsigned int)(*in_map + index_bias);
143 in_map++;
144 out_map++;
145 }
146
147 pipe_buffer_unmap(context, in_transfer);
148 }
149
150 void util_rebuild_uint_elts(struct pipe_context *context,
151 struct pipe_resource **elts,
152 int index_bias,
153 unsigned start, unsigned count)
154 {
155 struct pipe_transfer *out_transfer = NULL;
156 struct pipe_resource *new_elts;
157 unsigned int *out_map;
158
159 new_elts = pipe_buffer_create(context->screen,
160 PIPE_BIND_INDEX_BUFFER,
161 2 * count);
162
163 out_map = pipe_buffer_map(context, new_elts,
164 PIPE_TRANSFER_WRITE, &out_transfer);
165 util_rebuild_uint_elts_to_userptr(context, *elts, index_bias,
166 start, count, out_map);
167 pipe_buffer_unmap(context, out_transfer);
168
169 *elts = new_elts;
170 }