u_vbuf.c revision f94d390213308d4aca1515c75acc6865ebb45796
1975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák/**************************************************************************
2975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák *
3975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * Copyright 2011 Marek Olšák <maraeo@gmail.com>
4975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * All Rights Reserved.
5975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák *
6975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining a
7975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * copy of this software and associated documentation files (the
8975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * "Software"), to deal in the Software without restriction, including
9975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * without limitation the rights to use, copy, modify, merge, publish,
10975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * distribute, sub license, and/or sell copies of the Software, and to
11975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * permit persons to whom the Software is furnished to do so, subject to
12975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * the following conditions:
13975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák *
14975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * The above copyright notice and this permission notice (including the
15975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * next paragraph) shall be included in all copies or substantial portions
16975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * of the Software.
17975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák *
18975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * IN NO EVENT SHALL AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR
22975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák *
26975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák **************************************************************************/
27975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
28fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšák#include "util/u_vbuf.h"
29975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
30975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák#include "util/u_format.h"
31975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák#include "util/u_inlines.h"
32975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák#include "util/u_memory.h"
33975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák#include "util/u_upload_mgr.h"
34975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák#include "translate/translate.h"
35975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák#include "translate/translate_cache.h"
36975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
3728fb79891101c23c75982726c81112caa96f9275Marek Olšákstruct u_vbuf_elements {
38975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   unsigned count;
39975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   struct pipe_vertex_element ve[PIPE_MAX_ATTRIBS];
40975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
4151095f74cf92d3cada7366ce898ade7693570b48Marek Olšák   unsigned src_format_size[PIPE_MAX_ATTRIBS];
4251095f74cf92d3cada7366ce898ade7693570b48Marek Olšák
4351095f74cf92d3cada7366ce898ade7693570b48Marek Olšák   /* If (velem[i].src_format != native_format[i]), the vertex buffer
44975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák    * referenced by the vertex element cannot be used for rendering and
4551095f74cf92d3cada7366ce898ade7693570b48Marek Olšák    * its vertex data must be translated to native_format[i]. */
46975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   enum pipe_format native_format[PIPE_MAX_ATTRIBS];
47975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   unsigned native_format_size[PIPE_MAX_ATTRIBS];
48975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
49975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* This might mean two things:
50975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák    * - src_format != native_format, as discussed above.
51975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák    * - src_offset % 4 != 0 (if the caps don't allow such an offset). */
52975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   boolean incompatible_layout;
53df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák   /* Per-element flags. */
54df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák   boolean incompatible_layout_elem[PIPE_MAX_ATTRIBS];
55975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák};
56975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
5728fb79891101c23c75982726c81112caa96f9275Marek Olšákstruct u_vbuf_priv {
58fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšák   struct u_vbuf b;
59975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   struct pipe_context *pipe;
60975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   struct translate_cache *translate_cache;
61975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
62b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák   /* Vertex element state bound by the state tracker. */
63b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák   void *saved_ve;
64b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák   /* and its associated helper structure for this module. */
6528fb79891101c23c75982726c81112caa96f9275Marek Olšák   struct u_vbuf_elements *ve;
66df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák
67df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák   /* Vertex elements used for the translate fallback. */
68df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák   struct pipe_vertex_element fallback_velems[PIPE_MAX_ATTRIBS];
69b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák   /* If non-NULL, this is a vertex element state used for the translate
70b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák    * fallback and therefore used for rendering too. */
71b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák   void *fallback_ve;
72b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák   /* The vertex buffer slot index where translated vertices have been
73b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák    * stored in. */
741e53a26b9c2aab0d6ed75856b7e3d08b5590d0a2Marek Olšák   unsigned fallback_vb_slot;
75b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák   /* When binding the fallback vertex element state, we don't want to
76b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák    * change saved_ve and ve. This is set to TRUE in such cases. */
77975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   boolean ve_binding_lock;
78975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
791e53a26b9c2aab0d6ed75856b7e3d08b5590d0a2Marek Olšák   /* Whether there is any user buffer. */
801e53a26b9c2aab0d6ed75856b7e3d08b5590d0a2Marek Olšák   boolean any_user_vbs;
81b5b7cc19d82c8761a6b56268aecdccbc1ed2f911Marek Olšák   /* Whether there is a buffer with a non-native layout. */
82975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   boolean incompatible_vb_layout;
83df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák   /* Per-buffer flags. */
84df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák   boolean incompatible_vb[PIPE_MAX_ATTRIBS];
85975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák};
86975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
8728fb79891101c23c75982726c81112caa96f9275Marek Olšákstatic void u_vbuf_init_format_caps(struct u_vbuf_priv *mgr)
88975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
89975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   struct pipe_screen *screen = mgr->pipe->screen;
90975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
91e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák   mgr->b.caps.format_fixed32 =
92975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      screen->is_format_supported(screen, PIPE_FORMAT_R32_FIXED, PIPE_BUFFER,
93e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                  0, PIPE_BIND_VERTEX_BUFFER);
94975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
95e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák   mgr->b.caps.format_float16 =
96975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      screen->is_format_supported(screen, PIPE_FORMAT_R16_FLOAT, PIPE_BUFFER,
97e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                  0, PIPE_BIND_VERTEX_BUFFER);
98975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
99e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák   mgr->b.caps.format_float64 =
100975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      screen->is_format_supported(screen, PIPE_FORMAT_R64_FLOAT, PIPE_BUFFER,
101e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                  0, PIPE_BIND_VERTEX_BUFFER);
102975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
103e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák   mgr->b.caps.format_norm32 =
104975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      screen->is_format_supported(screen, PIPE_FORMAT_R32_UNORM, PIPE_BUFFER,
105e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                  0, PIPE_BIND_VERTEX_BUFFER) &&
106975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      screen->is_format_supported(screen, PIPE_FORMAT_R32_SNORM, PIPE_BUFFER,
107e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                  0, PIPE_BIND_VERTEX_BUFFER);
108975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
109e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák   mgr->b.caps.format_scaled32 =
110975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      screen->is_format_supported(screen, PIPE_FORMAT_R32_USCALED, PIPE_BUFFER,
111e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                  0, PIPE_BIND_VERTEX_BUFFER) &&
112975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      screen->is_format_supported(screen, PIPE_FORMAT_R32_SSCALED, PIPE_BUFFER,
113e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                  0, PIPE_BIND_VERTEX_BUFFER);
114975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
115975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
116fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšákstruct u_vbuf *
11728fb79891101c23c75982726c81112caa96f9275Marek Olšáku_vbuf_create(struct pipe_context *pipe,
11828fb79891101c23c75982726c81112caa96f9275Marek Olšák              unsigned upload_buffer_size,
11928fb79891101c23c75982726c81112caa96f9275Marek Olšák              unsigned upload_buffer_alignment,
12028fb79891101c23c75982726c81112caa96f9275Marek Olšák              unsigned upload_buffer_bind,
12128fb79891101c23c75982726c81112caa96f9275Marek Olšák              enum u_fetch_alignment fetch_alignment)
122975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
12328fb79891101c23c75982726c81112caa96f9275Marek Olšák   struct u_vbuf_priv *mgr = CALLOC_STRUCT(u_vbuf_priv);
124975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
125975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->pipe = pipe;
126975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->translate_cache = translate_cache_create();
1271e53a26b9c2aab0d6ed75856b7e3d08b5590d0a2Marek Olšák   mgr->fallback_vb_slot = ~0;
128975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
129f53cbf8bb0e542a114b76467fe715ceb977411abMarek Olšák   mgr->b.uploader = u_upload_create(pipe, upload_buffer_size,
130f53cbf8bb0e542a114b76467fe715ceb977411abMarek Olšák                                     upload_buffer_alignment,
1311ee71bdc8a8471357cee6a1cf2fbaac6a70bb86cMarek Olšák                                     upload_buffer_bind);
132975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
133e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák   mgr->b.caps.fetch_dword_unaligned =
134975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         fetch_alignment == U_VERTEX_FETCH_BYTE_ALIGNED;
135975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
13628fb79891101c23c75982726c81112caa96f9275Marek Olšák   u_vbuf_init_format_caps(mgr);
137975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
138975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   return &mgr->b;
139975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
140975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
141fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšákvoid u_vbuf_destroy(struct u_vbuf *mgrb)
142975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
14328fb79891101c23c75982726c81112caa96f9275Marek Olšák   struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
144975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   unsigned i;
145975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
1460b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák   for (i = 0; i < mgr->b.nr_vertex_buffers; i++) {
147975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      pipe_resource_reference(&mgr->b.vertex_buffer[i].buffer, NULL);
1480b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák   }
1490b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák   for (i = 0; i < mgr->b.nr_real_vertex_buffers; i++) {
1500b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák      pipe_resource_reference(&mgr->b.real_vertex_buffer[i].buffer, NULL);
151975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
152975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
153975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   translate_cache_destroy(mgr->translate_cache);
154f53cbf8bb0e542a114b76467fe715ceb977411abMarek Olšák   u_upload_destroy(mgr->b.uploader);
155975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   FREE(mgr);
156975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
157975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
158975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
159611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšákstatic unsigned u_vbuf_get_free_real_vb_slot(struct u_vbuf_priv *mgr)
160611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák{
161611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   unsigned i, nr = mgr->ve->count;
162611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   boolean used_vb[PIPE_MAX_ATTRIBS] = {0};
163611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák
164611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   for (i = 0; i < nr; i++) {
165611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      if (!mgr->ve->incompatible_layout_elem[i]) {
166611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         unsigned index = mgr->ve->ve[i].vertex_buffer_index;
167611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák
168611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         if (!mgr->incompatible_vb[index]) {
169611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák            used_vb[index] = TRUE;
170611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         }
171611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      }
172611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   }
173611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák
174611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
175611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      if (!used_vb[i]) {
176611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         if (i >= mgr->b.nr_real_vertex_buffers) {
177611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák            mgr->b.nr_real_vertex_buffers = i+1;
178611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         }
179611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         return i;
180611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      }
181611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   }
182611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   return ~0;
183611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák}
184611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák
185315300e4443f7a2177f2d8c4435f30c9bf95504dMarek Olšákstatic void
18628fb79891101c23c75982726c81112caa96f9275Marek Olšáku_vbuf_translate_begin(struct u_vbuf_priv *mgr,
187d1f66a9424d087f81d0040aafde033bd5cb1ca72Marek Olšák                       int min_index, int max_index)
188975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
1895d236d71c84075d79349218be7b427366bc7406bBrian Paul   struct translate_key key;
190975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   struct translate_element *te;
191728695b4353c8b74b30310cd2d87071f662fdb63Fabian Bieler   unsigned tr_elem_index[PIPE_MAX_ATTRIBS];
192975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   struct translate *tr;
193975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   boolean vb_translated[PIPE_MAX_ATTRIBS] = {0};
1941146441a2dd0a47e51e9762a014fca4b15d9fe97Marek Olšák   uint8_t *out_map;
195975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   struct pipe_transfer *vb_transfer[PIPE_MAX_ATTRIBS] = {0};
196975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   struct pipe_resource *out_buffer = NULL;
197f430f794ace50022b1b81408a3721b8e0b2519bbMarek Olšák   unsigned i, out_offset, num_verts = max_index + 1 - min_index;
198975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
1995d236d71c84075d79349218be7b427366bc7406bBrian Paul   memset(&key, 0, sizeof(key));
200728695b4353c8b74b30310cd2d87071f662fdb63Fabian Bieler   memset(tr_elem_index, 0xff, sizeof(tr_elem_index));
2015d236d71c84075d79349218be7b427366bc7406bBrian Paul
202611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   /* Get a new vertex buffer slot. */
203611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   mgr->fallback_vb_slot = u_vbuf_get_free_real_vb_slot(mgr);
204611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák
205611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   if (mgr->fallback_vb_slot == ~0) {
206611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      return; /* XXX error, not enough attribs */
207611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   }
208611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák
209c4f51b225b7ec9ce231d140b1abf8637f37a33c7Marek Olšák   /* Initialize the description of how vertices should be translated. */
210975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   for (i = 0; i < mgr->ve->count; i++) {
211975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      enum pipe_format output_format = mgr->ve->native_format[i];
212975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      unsigned output_format_size = mgr->ve->native_format_size[i];
213975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
214975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      /* Check for support. */
215df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák      if (!mgr->ve->incompatible_layout_elem[i] &&
216df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák          !mgr->incompatible_vb[mgr->ve->ve[i].vertex_buffer_index]) {
217975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         continue;
218975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
219975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
220fb0aa34fab77fe8a7fc3253d5ecf635ce37a21c7Marek Olšák      assert(translate_is_output_format_supported(output_format));
221975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
222975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      /* Add this vertex element. */
223975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      te = &key.element[key.nr_elements];
224611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      te->type = TRANSLATE_ELEMENT_NORMAL;
225611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      te->instance_divisor = 0;
226975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      te->input_buffer = mgr->ve->ve[i].vertex_buffer_index;
227975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      te->input_format = mgr->ve->ve[i].src_format;
228975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      te->input_offset = mgr->ve->ve[i].src_offset;
229975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      te->output_format = output_format;
230975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      te->output_offset = key.output_stride;
231975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
232975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      key.output_stride += output_format_size;
233975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      vb_translated[mgr->ve->ve[i].vertex_buffer_index] = TRUE;
234975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      tr_elem_index[i] = key.nr_elements;
235975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      key.nr_elements++;
236975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
237975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
238975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Get a translate object. */
239975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   tr = translate_cache_find(mgr->translate_cache, &key);
240975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
241975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Map buffers we want to translate. */
242975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   for (i = 0; i < mgr->b.nr_vertex_buffers; i++) {
243975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      if (vb_translated[i]) {
244975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         struct pipe_vertex_buffer *vb = &mgr->b.vertex_buffer[i];
245c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák         unsigned offset = vb->buffer_offset + vb->stride * min_index;
246c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák         unsigned size = vb->stride ? num_verts * vb->stride
247c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák                                    : vb->buffer->width0 - offset;
248c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák         uint8_t *map;
249c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák
250c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák         if (u_vbuf_resource(vb->buffer)->user_ptr) {
251c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák            map = u_vbuf_resource(vb->buffer)->user_ptr + offset;
252c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák         } else {
253c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák            map = pipe_buffer_map_range(mgr->pipe, vb->buffer, offset, size,
254c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák                                        PIPE_TRANSFER_READ, &vb_transfer[i]);
255c727cc175bcbf96f12f27c46819667948d5ebbe2Marek Olšák         }
256975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
257f430f794ace50022b1b81408a3721b8e0b2519bbMarek Olšák         tr->set_buffer(tr, i, map, vb->stride, ~0);
258975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
259975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
260975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
261975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Create and map the output buffer. */
262f53cbf8bb0e542a114b76467fe715ceb977411abMarek Olšák   u_upload_alloc(mgr->b.uploader,
263975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák                  key.output_stride * min_index,
264975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák                  key.output_stride * num_verts,
265f94d390213308d4aca1515c75acc6865ebb45796Marek Olšák                  &out_offset, &out_buffer,
266975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák                  (void**)&out_map);
267975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
268975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   out_offset -= key.output_stride * min_index;
269975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
270975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Translate. */
271975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   tr->run(tr, 0, num_verts, 0, out_map);
272975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
273975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Unmap all buffers. */
274975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   for (i = 0; i < mgr->b.nr_vertex_buffers; i++) {
275f430f794ace50022b1b81408a3721b8e0b2519bbMarek Olšák      if (vb_transfer[i]) {
276975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         pipe_buffer_unmap(mgr->pipe, vb_transfer[i]);
277975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
278975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
279975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
280611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   /* Setup the new vertex buffer. */
281611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   mgr->b.real_vertex_buffer[mgr->fallback_vb_slot].buffer_offset = out_offset;
282611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   mgr->b.real_vertex_buffer[mgr->fallback_vb_slot].stride = key.output_stride;
283975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
284611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   /* Move the buffer reference. */
285611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   pipe_resource_reference(
286611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      &mgr->b.real_vertex_buffer[mgr->fallback_vb_slot].buffer, NULL);
287611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   mgr->b.real_vertex_buffer[mgr->fallback_vb_slot].buffer = out_buffer;
288611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   out_buffer = NULL;
289975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
290611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   /* Setup new vertex elements. */
291611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   for (i = 0; i < mgr->ve->count; i++) {
292611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      if (tr_elem_index[i] < key.nr_elements) {
293611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         te = &key.element[tr_elem_index[i]];
294611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         mgr->fallback_velems[i].instance_divisor = mgr->ve->ve[i].instance_divisor;
295611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         mgr->fallback_velems[i].src_format = te->output_format;
296611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         mgr->fallback_velems[i].src_offset = te->output_offset;
297611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         mgr->fallback_velems[i].vertex_buffer_index = mgr->fallback_vb_slot;
298611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      } else {
299611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák         memcpy(&mgr->fallback_velems[i], &mgr->ve->ve[i],
300611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák                sizeof(struct pipe_vertex_element));
301975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
302611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   }
303975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
304975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
305611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   mgr->fallback_ve =
306611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák      mgr->pipe->create_vertex_elements_state(mgr->pipe, mgr->ve->count,
307611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák                                              mgr->fallback_velems);
308975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
309611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   /* Preserve saved_ve. */
310611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   mgr->ve_binding_lock = TRUE;
311611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   mgr->pipe->bind_vertex_elements_state(mgr->pipe, mgr->fallback_ve);
312611a8b82e3827dd7c256edd5c014f4d48cb045f0Marek Olšák   mgr->ve_binding_lock = FALSE;
313975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
314975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
31528fb79891101c23c75982726c81112caa96f9275Marek Olšákstatic void u_vbuf_translate_end(struct u_vbuf_priv *mgr)
316975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
317975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   if (mgr->fallback_ve == NULL) {
318975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      return;
319975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
320975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
321975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Restore vertex elements. */
322975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Note that saved_ve will be overwritten in bind_vertex_elements_state. */
323975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->pipe->bind_vertex_elements_state(mgr->pipe, mgr->saved_ve);
324975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->pipe->delete_vertex_elements_state(mgr->pipe, mgr->fallback_ve);
325975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->fallback_ve = NULL;
326975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
327975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Delete the now-unused VBO. */
3281e53a26b9c2aab0d6ed75856b7e3d08b5590d0a2Marek Olšák   pipe_resource_reference(&mgr->b.real_vertex_buffer[mgr->fallback_vb_slot].buffer,
329975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák                           NULL);
3301e53a26b9c2aab0d6ed75856b7e3d08b5590d0a2Marek Olšák   mgr->fallback_vb_slot = ~0;
331975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->b.nr_real_vertex_buffers = mgr->b.nr_vertex_buffers;
332975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
333975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
334975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák#define FORMAT_REPLACE(what, withwhat) \
335975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák    case PIPE_FORMAT_##what: format = PIPE_FORMAT_##withwhat; break
336975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
33728fb79891101c23c75982726c81112caa96f9275Marek Olšákstruct u_vbuf_elements *
338fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšáku_vbuf_create_vertex_elements(struct u_vbuf *mgrb,
33928fb79891101c23c75982726c81112caa96f9275Marek Olšák                              unsigned count,
34028fb79891101c23c75982726c81112caa96f9275Marek Olšák                              const struct pipe_vertex_element *attribs,
34128fb79891101c23c75982726c81112caa96f9275Marek Olšák                              struct pipe_vertex_element *native_attribs)
342975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
34328fb79891101c23c75982726c81112caa96f9275Marek Olšák   struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
344975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   unsigned i;
34528fb79891101c23c75982726c81112caa96f9275Marek Olšák   struct u_vbuf_elements *ve = CALLOC_STRUCT(u_vbuf_elements);
346975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
347975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   ve->count = count;
348975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
349975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   if (!count) {
350975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      return ve;
351975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
352975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
353975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   memcpy(ve->ve, attribs, sizeof(struct pipe_vertex_element) * count);
354975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   memcpy(native_attribs, attribs, sizeof(struct pipe_vertex_element) * count);
355975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
356975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Set the best native format in case the original format is not
357975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák    * supported. */
358975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   for (i = 0; i < count; i++) {
359975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      enum pipe_format format = ve->ve[i].src_format;
360975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
36151095f74cf92d3cada7366ce898ade7693570b48Marek Olšák      ve->src_format_size[i] = util_format_get_blocksize(format);
36251095f74cf92d3cada7366ce898ade7693570b48Marek Olšák
363975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      /* Choose a native format.
364975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák       * For now we don't care about the alignment, that's going to
365975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák       * be sorted out later. */
366e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák      if (!mgr->b.caps.format_fixed32) {
367975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         switch (format) {
368975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32_FIXED,           R32_FLOAT);
369975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32_FIXED,        R32G32_FLOAT);
370975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32_FIXED,     R32G32B32_FLOAT);
371975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32A32_FIXED,  R32G32B32A32_FLOAT);
372975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            default:;
373975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         }
374975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
375e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák      if (!mgr->b.caps.format_float16) {
376975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         switch (format) {
377975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R16_FLOAT,           R32_FLOAT);
378975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R16G16_FLOAT,        R32G32_FLOAT);
379975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R16G16B16_FLOAT,     R32G32B32_FLOAT);
380975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R16G16B16A16_FLOAT,  R32G32B32A32_FLOAT);
381975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            default:;
382975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         }
383975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
384e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák      if (!mgr->b.caps.format_float64) {
385975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         switch (format) {
386975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R64_FLOAT,           R32_FLOAT);
387975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R64G64_FLOAT,        R32G32_FLOAT);
388975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R64G64B64_FLOAT,     R32G32B32_FLOAT);
389975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R64G64B64A64_FLOAT,  R32G32B32A32_FLOAT);
390975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            default:;
391975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         }
392975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
393e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák      if (!mgr->b.caps.format_norm32) {
394975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         switch (format) {
395975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32_UNORM,           R32_FLOAT);
396975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32_UNORM,        R32G32_FLOAT);
397975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32_UNORM,     R32G32B32_FLOAT);
398975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32A32_UNORM,  R32G32B32A32_FLOAT);
399975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32_SNORM,           R32_FLOAT);
400975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32_SNORM,        R32G32_FLOAT);
401975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32_SNORM,     R32G32B32_FLOAT);
402975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32A32_SNORM,  R32G32B32A32_FLOAT);
403975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            default:;
404975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         }
405975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
406e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák      if (!mgr->b.caps.format_scaled32) {
407975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         switch (format) {
408975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32_USCALED,         R32_FLOAT);
409975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32_USCALED,      R32G32_FLOAT);
410975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32_USCALED,   R32G32B32_FLOAT);
411975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32A32_USCALED,R32G32B32A32_FLOAT);
412975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32_SSCALED,         R32_FLOAT);
413975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32_SSCALED,      R32G32_FLOAT);
414975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32_SSCALED,   R32G32B32_FLOAT);
415975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            FORMAT_REPLACE(R32G32B32A32_SSCALED,R32G32B32A32_FLOAT);
416975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            default:;
417975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         }
418975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
419975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
420975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      native_attribs[i].src_format = format;
421975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      ve->native_format[i] = format;
422975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      ve->native_format_size[i] =
423975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            util_format_get_blocksize(ve->native_format[i]);
424975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
425df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák      ve->incompatible_layout_elem[i] =
426975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            ve->ve[i].src_format != ve->native_format[i] ||
427e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák            (!mgr->b.caps.fetch_dword_unaligned && ve->ve[i].src_offset % 4 != 0);
428df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák      ve->incompatible_layout =
429df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák            ve->incompatible_layout ||
430df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák            ve->incompatible_layout_elem[i];
431975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
432975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
433975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Align the formats to the size of DWORD if needed. */
434e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák   if (!mgr->b.caps.fetch_dword_unaligned) {
435975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      for (i = 0; i < count; i++) {
436975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         ve->native_format_size[i] = align(ve->native_format_size[i], 4);
437975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
438975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
439975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
440975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   return ve;
441975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
442975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
443fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšákvoid u_vbuf_bind_vertex_elements(struct u_vbuf *mgrb,
44428fb79891101c23c75982726c81112caa96f9275Marek Olšák                                 void *cso,
44528fb79891101c23c75982726c81112caa96f9275Marek Olšák                                 struct u_vbuf_elements *ve)
446975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
44728fb79891101c23c75982726c81112caa96f9275Marek Olšák   struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
448975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
449975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   if (!cso) {
450975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      return;
451975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
452975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
453975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   if (!mgr->ve_binding_lock) {
454975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      mgr->saved_ve = cso;
455975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      mgr->ve = ve;
456975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
457975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
458975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
459fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšákvoid u_vbuf_destroy_vertex_elements(struct u_vbuf *mgr,
46028fb79891101c23c75982726c81112caa96f9275Marek Olšák                                    struct u_vbuf_elements *ve)
461975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
462975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   FREE(ve);
463975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
464975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
465fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšákvoid u_vbuf_set_vertex_buffers(struct u_vbuf *mgrb,
46628fb79891101c23c75982726c81112caa96f9275Marek Olšák                               unsigned count,
46728fb79891101c23c75982726c81112caa96f9275Marek Olšák                               const struct pipe_vertex_buffer *bufs)
468975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
46928fb79891101c23c75982726c81112caa96f9275Marek Olšák   struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
470975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   unsigned i;
471975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
472975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->any_user_vbs = FALSE;
473975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->incompatible_vb_layout = FALSE;
474df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák   memset(mgr->incompatible_vb, 0, sizeof(mgr->incompatible_vb));
475975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
476e3be51311834217cf35be9186e7dc9f57a10d44bMarek Olšák   if (!mgr->b.caps.fetch_dword_unaligned) {
477975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      /* Check if the strides and offsets are aligned to the size of DWORD. */
478975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      for (i = 0; i < count; i++) {
479975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         if (bufs[i].buffer) {
480975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            if (bufs[i].stride % 4 != 0 ||
481975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák                bufs[i].buffer_offset % 4 != 0) {
482975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák               mgr->incompatible_vb_layout = TRUE;
483df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák               mgr->incompatible_vb[i] = TRUE;
484975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák            }
485975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         }
486975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
487975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
488975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
489975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   for (i = 0; i < count; i++) {
490975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      const struct pipe_vertex_buffer *vb = &bufs[i];
491975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
492975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      pipe_resource_reference(&mgr->b.vertex_buffer[i].buffer, vb->buffer);
4930b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák
4940b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák      mgr->b.real_vertex_buffer[i].buffer_offset =
4950b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák      mgr->b.vertex_buffer[i].buffer_offset = vb->buffer_offset;
4960b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák
4970b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák      mgr->b.real_vertex_buffer[i].stride =
4980b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák      mgr->b.vertex_buffer[i].stride = vb->stride;
499975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
500498e86e414dbf9b2f7d2f18cca908217ee644710Marek Olšák      if (!vb->buffer ||
501498e86e414dbf9b2f7d2f18cca908217ee644710Marek Olšák          mgr->incompatible_vb[i]) {
50285c151f3d9baca0bb8384a5083e9997dbb4da364Marek Olšák         pipe_resource_reference(&mgr->b.real_vertex_buffer[i].buffer, NULL);
503975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         continue;
504975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
505975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
50651095f74cf92d3cada7366ce898ade7693570b48Marek Olšák      if (u_vbuf_resource(vb->buffer)->user_ptr) {
50785c151f3d9baca0bb8384a5083e9997dbb4da364Marek Olšák         pipe_resource_reference(&mgr->b.real_vertex_buffer[i].buffer, NULL);
50851095f74cf92d3cada7366ce898ade7693570b48Marek Olšák         mgr->any_user_vbs = TRUE;
509975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák         continue;
510975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
511975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
5120b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák      pipe_resource_reference(&mgr->b.real_vertex_buffer[i].buffer, vb->buffer);
513975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
514975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
5150b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák   for (i = count; i < mgr->b.nr_vertex_buffers; i++) {
516975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      pipe_resource_reference(&mgr->b.vertex_buffer[i].buffer, NULL);
517975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
5180b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák   for (i = count; i < mgr->b.nr_real_vertex_buffers; i++) {
5190b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák      pipe_resource_reference(&mgr->b.real_vertex_buffer[i].buffer, NULL);
5200b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák   }
521975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
522975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->b.nr_vertex_buffers = count;
523975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   mgr->b.nr_real_vertex_buffers = count;
524975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
525975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
526fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšákvoid u_vbuf_set_index_buffer(struct u_vbuf *mgr,
5274cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák                             const struct pipe_index_buffer *ib)
5284cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák{
5294cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák   if (ib && ib->buffer) {
5304cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák      assert(ib->offset % ib->index_size == 0);
5314cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák      pipe_resource_reference(&mgr->index_buffer.buffer, ib->buffer);
5324cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák      mgr->index_buffer.offset = ib->offset;
5334cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák      mgr->index_buffer.index_size = ib->index_size;
5344cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák   } else {
5354cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák      pipe_resource_reference(&mgr->index_buffer.buffer, NULL);
5364cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák   }
5374cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák}
5384cfc8c775c751dd2b2b43f3ca58ae9798a84c0f1Marek Olšák
539315300e4443f7a2177f2d8c4435f30c9bf95504dMarek Olšákstatic void
54028fb79891101c23c75982726c81112caa96f9275Marek Olšáku_vbuf_upload_buffers(struct u_vbuf_priv *mgr,
541d1f66a9424d087f81d0040aafde033bd5cb1ca72Marek Olšák                      int min_index, int max_index,
542d1f66a9424d087f81d0040aafde033bd5cb1ca72Marek Olšák                      unsigned instance_count)
543975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
544cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   unsigned i;
545975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   unsigned count = max_index + 1 - min_index;
546cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   unsigned nr_velems = mgr->ve->count;
547cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   unsigned nr_vbufs = mgr->b.nr_vertex_buffers;
548df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák   struct pipe_vertex_element *velems =
549df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák         mgr->fallback_ve ? mgr->fallback_velems : mgr->ve->ve;
550cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   unsigned start_offset[PIPE_MAX_ATTRIBS];
551cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   unsigned end_offset[PIPE_MAX_ATTRIBS] = {0};
552cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák
553cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   /* Determine how much data needs to be uploaded. */
554cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   for (i = 0; i < nr_velems; i++) {
555df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák      struct pipe_vertex_element *velem = &velems[i];
556cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      unsigned index = velem->vertex_buffer_index;
557975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      struct pipe_vertex_buffer *vb = &mgr->b.vertex_buffer[index];
55821f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      unsigned instance_div, first, size;
559975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
560df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák      /* Skip the buffer generated by translate. */
5611e53a26b9c2aab0d6ed75856b7e3d08b5590d0a2Marek Olšák      if (index == mgr->fallback_vb_slot) {
562df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák         continue;
563df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák      }
564df49b0ce9009e867f6d44fd48e31a16e5a933c64Marek Olšák
565cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      assert(vb->buffer);
566cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák
567cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      if (!u_vbuf_resource(vb->buffer)->user_ptr) {
568cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         continue;
569cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      }
570975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
57121f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      instance_div = velem->instance_divisor;
572cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      first = vb->buffer_offset + velem->src_offset;
573975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
574cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      if (!vb->stride) {
575cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         /* Constant attrib. */
576cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         size = mgr->ve->src_format_size[i];
577cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      } else if (instance_div) {
578cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         /* Per-instance attrib. */
579cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         unsigned count = (instance_count + instance_div - 1) / instance_div;
580cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         size = vb->stride * (count - 1) + mgr->ve->src_format_size[i];
581cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      } else {
582cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         /* Per-vertex attrib. */
583cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         first += vb->stride * min_index;
584cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         size = vb->stride * (count - 1) + mgr->ve->src_format_size[i];
585cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      }
586975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
587cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      /* Update offsets. */
588cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      if (!end_offset[index]) {
589cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         start_offset[index] = first;
590cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         end_offset[index] = first + size;
591975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      } else {
592cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         if (first < start_offset[index])
593cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák            start_offset[index] = first;
594cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         if (first + size > end_offset[index])
595cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák            end_offset[index] = first + size;
596975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      }
597975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
598cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák
599cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   /* Upload buffers. */
600cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   for (i = 0; i < nr_vbufs; i++) {
60121f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      unsigned start, end = end_offset[i];
60221f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      struct pipe_vertex_buffer *real_vb;
60321f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      uint8_t *ptr;
604cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák
605cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      if (!end) {
606cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák         continue;
607cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      }
60821f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák
60921f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      start = start_offset[i];
610cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák      assert(start < end);
611cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák
61221f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      real_vb = &mgr->b.real_vertex_buffer[i];
61321f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      ptr = u_vbuf_resource(mgr->b.vertex_buffer[i].buffer)->user_ptr;
61421f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák
61521f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      u_upload_data(mgr->b.uploader, start, end - start, ptr + start,
616f94d390213308d4aca1515c75acc6865ebb45796Marek Olšák                    &real_vb->buffer_offset, &real_vb->buffer);
617cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák
61821f71b6c050f8a746f6a671e57afc8e5500c5e77Marek Olšák      real_vb->buffer_offset -= start;
619cd9bbb3935320fd838c9b64236ccef865782a248Marek Olšák   }
620975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
621975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
622fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšákunsigned u_vbuf_draw_max_vertex_count(struct u_vbuf *mgrb)
62351095f74cf92d3cada7366ce898ade7693570b48Marek Olšák{
62403df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák   struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
62551095f74cf92d3cada7366ce898ade7693570b48Marek Olšák   unsigned i, nr = mgr->ve->count;
62603df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák   struct pipe_vertex_element *velems =
62703df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák         mgr->fallback_ve ? mgr->fallback_velems : mgr->ve->ve;
62803df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák   unsigned result = ~0;
62951095f74cf92d3cada7366ce898ade7693570b48Marek Olšák
63051095f74cf92d3cada7366ce898ade7693570b48Marek Olšák   for (i = 0; i < nr; i++) {
63151095f74cf92d3cada7366ce898ade7693570b48Marek Olšák      struct pipe_vertex_buffer *vb =
63203df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák            &mgr->b.real_vertex_buffer[velems[i].vertex_buffer_index];
63303df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      unsigned size, max_count, value;
63451095f74cf92d3cada7366ce898ade7693570b48Marek Olšák
63503df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      /* We're not interested in constant and per-instance attribs. */
63651095f74cf92d3cada7366ce898ade7693570b48Marek Olšák      if (!vb->buffer ||
63751095f74cf92d3cada7366ce898ade7693570b48Marek Olšák          !vb->stride ||
63803df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák          velems[i].instance_divisor) {
63951095f74cf92d3cada7366ce898ade7693570b48Marek Olšák         continue;
64051095f74cf92d3cada7366ce898ade7693570b48Marek Olšák      }
64151095f74cf92d3cada7366ce898ade7693570b48Marek Olšák
64203df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      size = vb->buffer->width0;
643390196ecc73cd5d6bed48bf460d1abf70deb0eb4Marek Olšák
64403df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      /* Subtract buffer_offset. */
64503df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      value = vb->buffer_offset;
64603df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      if (value >= size) {
64703df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák         return 0;
648390196ecc73cd5d6bed48bf460d1abf70deb0eb4Marek Olšák      }
64903df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      size -= value;
65051095f74cf92d3cada7366ce898ade7693570b48Marek Olšák
65103df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      /* Subtract src_offset. */
65203df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      value = velems[i].src_offset;
65303df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      if (value >= size) {
65403df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák         return 0;
65503df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      }
65603df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      size -= value;
65703df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák
65803df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      /* Subtract format_size. */
65903df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      value = mgr->ve->native_format_size[i];
66003df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      if (value >= size) {
66103df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák         return 0;
66203df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      }
66303df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      size -= value;
66451095f74cf92d3cada7366ce898ade7693570b48Marek Olšák
66503df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      /* Compute the max count. */
66603df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      max_count = 1 + size / vb->stride;
66703df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák      result = MIN2(result, max_count);
66851095f74cf92d3cada7366ce898ade7693570b48Marek Olšák   }
66903df791c6f0881e45a65106c22ccd28f77018fb3Marek Olšák   return result;
67051095f74cf92d3cada7366ce898ade7693570b48Marek Olšák}
67151095f74cf92d3cada7366ce898ade7693570b48Marek Olšák
67272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšákstatic boolean u_vbuf_need_minmax_index(struct u_vbuf_priv *mgr)
67372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák{
67472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   unsigned i, nr = mgr->ve->count;
67572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
67672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   for (i = 0; i < nr; i++) {
67772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      struct pipe_vertex_buffer *vb;
67872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      unsigned index;
67972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
68072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      /* Per-instance attribs don't need min/max_index. */
68172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      if (mgr->ve->ve[i].instance_divisor) {
68272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         continue;
68372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      }
68472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
68572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      index = mgr->ve->ve[i].vertex_buffer_index;
68672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      vb = &mgr->b.vertex_buffer[index];
68772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
68872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      /* Constant attribs don't need min/max_index. */
68972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      if (!vb->stride) {
69072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         continue;
69172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      }
69272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
69372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      /* Per-vertex attribs need min/max_index. */
69472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      if (u_vbuf_resource(vb->buffer)->user_ptr ||
69572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák          mgr->ve->incompatible_layout_elem[i] ||
69672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák          mgr->incompatible_vb[index]) {
69772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         return TRUE;
69872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      }
69972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   }
70072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
70172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   return FALSE;
70272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák}
70372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
70472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšákstatic void u_vbuf_get_minmax_index(struct pipe_context *pipe,
70572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák                                    struct pipe_index_buffer *ib,
70672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák                                    const struct pipe_draw_info *info,
70772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák                                    int *out_min_index,
70872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák                                    int *out_max_index)
70972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák{
71072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   struct pipe_transfer *transfer = NULL;
71172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   const void *indices;
71272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   unsigned i;
71372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   unsigned restart_index = info->restart_index;
71472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
71572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   if (u_vbuf_resource(ib->buffer)->user_ptr) {
71672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      indices = u_vbuf_resource(ib->buffer)->user_ptr +
71772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák                ib->offset + info->start * ib->index_size;
71872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   } else {
71972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      indices = pipe_buffer_map_range(pipe, ib->buffer,
72072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák                                      ib->offset + info->start * ib->index_size,
72172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák                                      info->count * ib->index_size,
72272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák                                      PIPE_TRANSFER_READ, &transfer);
72372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   }
72472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
72572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   switch (ib->index_size) {
72672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   case 4: {
72772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      const unsigned *ui_indices = (const unsigned*)indices;
72872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      unsigned max_ui = 0;
72972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      unsigned min_ui = ~0U;
73072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      if (info->primitive_restart) {
73172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         for (i = 0; i < info->count; i++) {
73272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            if (ui_indices[i] != restart_index) {
73372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák               if (ui_indices[i] > max_ui) max_ui = ui_indices[i];
73472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák               if (ui_indices[i] < min_ui) min_ui = ui_indices[i];
73572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            }
73672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         }
73772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      }
73872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      else {
73972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         for (i = 0; i < info->count; i++) {
74072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            if (ui_indices[i] > max_ui) max_ui = ui_indices[i];
74172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            if (ui_indices[i] < min_ui) min_ui = ui_indices[i];
74272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         }
74372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      }
74472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      *out_min_index = min_ui;
74572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      *out_max_index = max_ui;
74672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      break;
74772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   }
74872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   case 2: {
74972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      const unsigned short *us_indices = (const unsigned short*)indices;
75072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      unsigned max_us = 0;
75172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      unsigned min_us = ~0U;
75272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      if (info->primitive_restart) {
75372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         for (i = 0; i < info->count; i++) {
75472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            if (us_indices[i] != restart_index) {
75572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák               if (us_indices[i] > max_us) max_us = us_indices[i];
75672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák               if (us_indices[i] < min_us) min_us = us_indices[i];
75772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            }
75872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         }
75972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      }
76072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      else {
76172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         for (i = 0; i < info->count; i++) {
76272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            if (us_indices[i] > max_us) max_us = us_indices[i];
76372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            if (us_indices[i] < min_us) min_us = us_indices[i];
76472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         }
76572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      }
76672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      *out_min_index = min_us;
76772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      *out_max_index = max_us;
76872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      break;
76972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   }
77072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   case 1: {
77172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      const unsigned char *ub_indices = (const unsigned char*)indices;
77272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      unsigned max_ub = 0;
77372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      unsigned min_ub = ~0U;
77472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      if (info->primitive_restart) {
77572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         for (i = 0; i < info->count; i++) {
77672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            if (ub_indices[i] != restart_index) {
77772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák               if (ub_indices[i] > max_ub) max_ub = ub_indices[i];
77872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák               if (ub_indices[i] < min_ub) min_ub = ub_indices[i];
77972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            }
78072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         }
78172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      }
78272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      else {
78372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         for (i = 0; i < info->count; i++) {
78472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            if (ub_indices[i] > max_ub) max_ub = ub_indices[i];
78572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák            if (ub_indices[i] < min_ub) min_ub = ub_indices[i];
78672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         }
78772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      }
78872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      *out_min_index = min_ub;
78972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      *out_max_index = max_ub;
79072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      break;
79172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   }
79272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   default:
79372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      assert(0);
794de93347d482a96f88c898622c9620f03e677e386Vinson Lee      *out_min_index = 0;
795de93347d482a96f88c898622c9620f03e677e386Vinson Lee      *out_max_index = 0;
79672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   }
79772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
79872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   if (transfer) {
79972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      pipe_buffer_unmap(pipe, transfer);
80072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   }
80172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák}
80272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
803d1f66a9424d087f81d0040aafde033bd5cb1ca72Marek Olšákenum u_vbuf_return_flags
804fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšáku_vbuf_draw_begin(struct u_vbuf *mgrb,
80528fb79891101c23c75982726c81112caa96f9275Marek Olšák                  const struct pipe_draw_info *info)
806975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
80728fb79891101c23c75982726c81112caa96f9275Marek Olšák   struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
808975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   int min_index, max_index;
809975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
81072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   if (!mgr->incompatible_vb_layout &&
81172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák       !mgr->ve->incompatible_layout &&
81272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák       !mgr->any_user_vbs) {
81372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      return 0;
81472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   }
81572e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák
81660a77cf316a90cb5be4f73495c2545b3d49e5ca1Marek Olšák   if (info->indexed) {
81772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      if (info->max_index != ~0) {
81872e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         min_index = info->min_index + info->index_bias;
81972e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         max_index = info->max_index + info->index_bias;
82072e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák      } else if (u_vbuf_need_minmax_index(mgr)) {
82172e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         u_vbuf_get_minmax_index(mgr->pipe, &mgr->b.index_buffer, info,
82272e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák                                 &min_index, &max_index);
82372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         min_index += info->index_bias;
82472e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         max_index += info->index_bias;
82560a77cf316a90cb5be4f73495c2545b3d49e5ca1Marek Olšák      } else {
82672e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         min_index = 0;
82772e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák         max_index = 0;
82860a77cf316a90cb5be4f73495c2545b3d49e5ca1Marek Olšák      }
829a0d154dc1385d92a31dca8e65e50d958bdf6d532Marek Olšák   } else {
83060a77cf316a90cb5be4f73495c2545b3d49e5ca1Marek Olšák      min_index = info->start;
83160a77cf316a90cb5be4f73495c2545b3d49e5ca1Marek Olšák      max_index = info->start + info->count - 1;
832a0d154dc1385d92a31dca8e65e50d958bdf6d532Marek Olšák   }
833975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
834975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Translate vertices with non-native layouts or formats. */
835975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   if (mgr->incompatible_vb_layout || mgr->ve->incompatible_layout) {
836315300e4443f7a2177f2d8c4435f30c9bf95504dMarek Olšák      u_vbuf_translate_begin(mgr, min_index, max_index);
837975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
838975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
839975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   /* Upload user buffers. */
840975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   if (mgr->any_user_vbs) {
841315300e4443f7a2177f2d8c4435f30c9bf95504dMarek Olšák      u_vbuf_upload_buffers(mgr, min_index, max_index, info->instance_count);
842975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
84372e1117e489986783dd5b27a3ad781b86c2d5d67Marek Olšák   return U_VBUF_BUFFERS_UPDATED;
844975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
845975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
846fba685a0995e76f86af5920163297e5c3b32fb4bMarek Olšákvoid u_vbuf_draw_end(struct u_vbuf *mgrb)
847975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák{
84828fb79891101c23c75982726c81112caa96f9275Marek Olšák   struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
849975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák
850975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   if (mgr->fallback_ve) {
851975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák      u_vbuf_translate_end(mgr);
852975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák   }
853975320ab76f5c247f6ed4dab80627173845200d0Marek Olšák}
854