#include "main/state.h"
#include "main/varray.h"
#include "util/bitscan.h"
+#include "util/u_memory.h"
#include "vbo_noop.h"
#include "vbo_private.h"
const fi_type * src_buffer)
{
struct vbo_save_context *save = &vbo_context(ctx)->save;
- const struct _mesa_prim *prim = &node->prims[node->prim_count - 1];
- GLuint nr = prim->count;
+ struct _mesa_prim *prim = &node->prims[node->prim_count - 1];
GLuint sz = save->vertex_size;
const fi_type *src = src_buffer + prim->start * sz;
fi_type *dst = save->copied.buffer;
- GLuint ovf, i;
if (prim->end)
return 0;
- switch (prim->mode) {
- case GL_POINTS:
- return 0;
- case GL_LINES:
- ovf = nr & 1;
- for (i = 0; i < ovf; i++)
- memcpy(dst + i * sz, src + (nr - ovf + i) * sz,
- sz * sizeof(GLfloat));
- return i;
- case GL_TRIANGLES:
- ovf = nr % 3;
- for (i = 0; i < ovf; i++)
- memcpy(dst + i * sz, src + (nr - ovf + i) * sz,
- sz * sizeof(GLfloat));
- return i;
- case GL_QUADS:
- ovf = nr & 3;
- for (i = 0; i < ovf; i++)
- memcpy(dst + i * sz, src + (nr - ovf + i) * sz,
- sz * sizeof(GLfloat));
- return i;
- case GL_LINE_STRIP:
- if (nr == 0)
- return 0;
- else {
- memcpy(dst, src + (nr - 1) * sz, sz * sizeof(GLfloat));
- return 1;
- }
- case GL_LINE_LOOP:
- case GL_TRIANGLE_FAN:
- case GL_POLYGON:
- if (nr == 0)
- return 0;
- else if (nr == 1) {
- memcpy(dst, src + 0, sz * sizeof(GLfloat));
- return 1;
- }
- else {
- memcpy(dst, src + 0, sz * sizeof(GLfloat));
- memcpy(dst + sz, src + (nr - 1) * sz, sz * sizeof(GLfloat));
- return 2;
- }
- case GL_TRIANGLE_STRIP:
- case GL_QUAD_STRIP:
- switch (nr) {
- case 0:
- ovf = 0;
- break;
- case 1:
- ovf = 1;
- break;
- default:
- ovf = 2 + (nr & 1);
- break;
- }
- for (i = 0; i < ovf; i++)
- memcpy(dst + i * sz, src + (nr - ovf + i) * sz,
- sz * sizeof(GLfloat));
- return i;
- default:
- unreachable("Unexpected primitive type");
- return 0;
- }
+ return vbo_copy_vertices(ctx, prim->mode, prim, sz, true, dst, src);
}
* previous prim.
*/
static void
-merge_prims(struct _mesa_prim *prim_list,
+merge_prims(struct gl_context *ctx, struct _mesa_prim *prim_list,
GLuint *prim_count)
{
GLuint i;
vbo_try_prim_conversion(this_prim);
- if (vbo_can_merge_prims(prev_prim, this_prim)) {
+ if (vbo_merge_draws(ctx, true, prev_prim, this_prim)) {
/* We've found a prim that just extend the previous one. Tack it
* onto the previous one, and let this primitive struct get dropped.
*/
- vbo_merge_prims(prev_prim, this_prim);
continue;
}
*/
/* Bind the buffer object at binding point 0 */
- _mesa_bind_vertex_buffer(ctx, *vao, 0, bo, buffer_offset, stride);
+ _mesa_bind_vertex_buffer(ctx, *vao, 0, bo, buffer_offset, stride, false,
+ false);
/* Retrieve the mapping from VBO_ATTRIB to VERT_ATTRIB space
* Note that the position/generic0 aliasing is done in the VAO.
convert_line_loop_to_strip(save, node);
}
- merge_prims(node->prims, &node->prim_count);
+ merge_prims(ctx, node->prims, &node->prim_count);
/* Correct the primitive starts, we can only do this here as copy_vertices
* and convert_line_loop_to_strip above consume the uncorrected starts.
save->prims[0].end = 0;
save->prims[0].start = 0;
save->prims[0].count = 0;
- save->prims[0].num_instances = 1;
- save->prims[0].base_instance = 0;
save->prim_count = 1;
}
switch (save->attrsz[i]) {
case 4:
save->attrptr[i][3] = save->current[i][3];
+ /* fallthrough */
case 3:
save->attrptr[i][2] = save->current[i][2];
+ /* fallthrough */
case 2:
save->attrptr[i][1] = save->current[i][1];
+ /* fallthrough */
case 1:
save->attrptr[i][0] = save->current[i][0];
break;
save->prims[i].end = 0;
save->prims[i].start = save->vert_count;
save->prims[i].count = 0;
- save->prims[i].num_instances = 1;
- save->prims[i].base_instance = 0;
save->no_current_update = no_current_update;
* then we call PrimitiveRestartNV and return.
*/
if (ctx->Array._PrimitiveRestart &&
- elt == _mesa_primitive_restart_index(ctx, index_size)) {
+ elt == ctx->Array._RestartIndex[index_size - 1]) {
CALL_PrimitiveRestartNV(GET_DISPATCH(), ());
return;
}
_mesa_vao_map(ctx, vao, GL_MAP_READ_BIT);
- if (_mesa_is_bufferobj(indexbuf))
+ if (indexbuf)
indices =
ADD_POINTERS(indexbuf->Mappings[MAP_INTERNAL].Pointer, indices);