101e04c3fSmrg/*
201e04c3fSmrg * mesa 3-D graphics library
301e04c3fSmrg *
401e04c3fSmrg * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
501e04c3fSmrg *
601e04c3fSmrg * Permission is hereby granted, free of charge, to any person obtaining a
701e04c3fSmrg * copy of this software and associated documentation files (the "Software"),
801e04c3fSmrg * to deal in the Software without restriction, including without limitation
901e04c3fSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1001e04c3fSmrg * and/or sell copies of the Software, and to permit persons to whom the
1101e04c3fSmrg * Software is furnished to do so, subject to the following conditions:
1201e04c3fSmrg *
1301e04c3fSmrg * The above copyright notice and this permission notice shall be included
1401e04c3fSmrg * in all copies or substantial portions of the Software.
1501e04c3fSmrg *
1601e04c3fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1701e04c3fSmrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1801e04c3fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1901e04c3fSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
2001e04c3fSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
2101e04c3fSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2201e04c3fSmrg * OTHER DEALINGS IN THE SOFTWARE.
2301e04c3fSmrg */
2401e04c3fSmrg
2501e04c3fSmrg
2601e04c3fSmrg/**
2701e04c3fSmrg * Types, functions, etc which are private to the VBO module.
2801e04c3fSmrg */
2901e04c3fSmrg
3001e04c3fSmrg
3101e04c3fSmrg#ifndef VBO_PRIVATE_H
3201e04c3fSmrg#define VBO_PRIVATE_H
3301e04c3fSmrg
3401e04c3fSmrg
3501e04c3fSmrg#include "vbo/vbo_attrib.h"
3601e04c3fSmrg#include "vbo/vbo_exec.h"
3701e04c3fSmrg#include "vbo/vbo_save.h"
3801e04c3fSmrg#include "main/varray.h"
397ec681f3Smrg#include "main/macros.h"
4001e04c3fSmrg
4101e04c3fSmrg
4201e04c3fSmrgstruct _glapi_table;
4301e04c3fSmrg
447ec681f3Smrgstatic inline struct vbo_context *
457ec681f3Smrgvbo_context(struct gl_context *ctx)
467ec681f3Smrg{
477ec681f3Smrg   return &ctx->vbo_context;
487ec681f3Smrg}
4901e04c3fSmrg
5001e04c3fSmrg
517ec681f3Smrgstatic inline const struct vbo_context *
527ec681f3Smrgvbo_context_const(const struct gl_context *ctx)
537ec681f3Smrg{
547ec681f3Smrg   return &ctx->vbo_context;
557ec681f3Smrg}
5601e04c3fSmrg
5701e04c3fSmrg
587ec681f3Smrgstatic inline struct gl_context *
597ec681f3Smrggl_context_from_vbo_exec(struct vbo_exec_context *exec)
607ec681f3Smrg{
617ec681f3Smrg   return container_of(exec, struct gl_context, vbo_context.exec);
627ec681f3Smrg}
6301e04c3fSmrg
647ec681f3Smrg
657ec681f3Smrgstatic inline const struct gl_context *
667ec681f3Smrggl_context_from_vbo_exec_const(const struct vbo_exec_context *exec)
6701e04c3fSmrg{
687ec681f3Smrg   return container_of(exec, struct gl_context, vbo_context.exec);
6901e04c3fSmrg}
7001e04c3fSmrg
7101e04c3fSmrg
727ec681f3Smrgstatic inline struct gl_context *
737ec681f3Smrggl_context_from_vbo_save(struct vbo_save_context *save)
7401e04c3fSmrg{
757ec681f3Smrg   return container_of(save, struct gl_context, vbo_context.save);
7601e04c3fSmrg}
7701e04c3fSmrg
7801e04c3fSmrg
7901e04c3fSmrg/**
8001e04c3fSmrg * Array to apply the fixed function material aliasing map to
8101e04c3fSmrg * an attribute value used in vbo processing inputs to an attribute
8201e04c3fSmrg * as they appear in the vao.
8301e04c3fSmrg */
8401e04c3fSmrgextern const GLubyte
8501e04c3fSmrg_vbo_attribute_alias_map[VP_MODE_MAX][VERT_ATTRIB_MAX];
8601e04c3fSmrg
8701e04c3fSmrg
8801e04c3fSmrg/**
8901e04c3fSmrg * Return if format is integer. The immediate mode commands only emit floats
9001e04c3fSmrg * for non-integer types, thus everything else is integer.
9101e04c3fSmrg */
9201e04c3fSmrgstatic inline GLboolean
9301e04c3fSmrgvbo_attrtype_to_integer_flag(GLenum format)
9401e04c3fSmrg{
9501e04c3fSmrg   switch (format) {
9601e04c3fSmrg   case GL_FLOAT:
9701e04c3fSmrg   case GL_DOUBLE:
9801e04c3fSmrg      return GL_FALSE;
9901e04c3fSmrg   case GL_INT:
10001e04c3fSmrg   case GL_UNSIGNED_INT:
10101e04c3fSmrg   case GL_UNSIGNED_INT64_ARB:
10201e04c3fSmrg      return GL_TRUE;
10301e04c3fSmrg   default:
10401e04c3fSmrg      unreachable("Bad vertex attribute type");
10501e04c3fSmrg      return GL_FALSE;
10601e04c3fSmrg   }
10701e04c3fSmrg}
10801e04c3fSmrg
10901e04c3fSmrgstatic inline GLboolean
11001e04c3fSmrgvbo_attrtype_to_double_flag(GLenum format)
11101e04c3fSmrg{
11201e04c3fSmrg   switch (format) {
11301e04c3fSmrg   case GL_FLOAT:
11401e04c3fSmrg   case GL_INT:
11501e04c3fSmrg   case GL_UNSIGNED_INT:
11601e04c3fSmrg      return GL_FALSE;
11701e04c3fSmrg   case GL_UNSIGNED_INT64_ARB:
11801e04c3fSmrg   case GL_DOUBLE:
11901e04c3fSmrg      return GL_TRUE;
12001e04c3fSmrg   default:
12101e04c3fSmrg      unreachable("Bad vertex attribute type");
12201e04c3fSmrg      return GL_FALSE;
12301e04c3fSmrg   }
12401e04c3fSmrg}
12501e04c3fSmrg
12601e04c3fSmrg
1278a1362adSmayastatic inline void
1288a1362adSmayavbo_set_vertex_format(struct gl_vertex_format* vertex_format,
1298a1362adSmaya                      GLubyte size, GLenum16 type)
1308a1362adSmaya{
1318a1362adSmaya   _mesa_set_vertex_format(vertex_format, size, type, GL_RGBA, GL_FALSE,
1328a1362adSmaya                           vbo_attrtype_to_integer_flag(type),
1338a1362adSmaya                           vbo_attrtype_to_double_flag(type));
1348a1362adSmaya}
1358a1362adSmaya
1368a1362adSmaya
13701e04c3fSmrg/**
13801e04c3fSmrg * Return default component values for the given format.
13901e04c3fSmrg * The return type is an array of fi_types, because that's how we declare
14001e04c3fSmrg * the vertex storage : floats , integers or unsigned integers.
14101e04c3fSmrg */
14201e04c3fSmrgstatic inline const fi_type *
14301e04c3fSmrgvbo_get_default_vals_as_union(GLenum format)
14401e04c3fSmrg{
14501e04c3fSmrg   static const GLfloat default_float[4] = { 0, 0, 0, 1 };
14601e04c3fSmrg   static const GLint default_int[4] = { 0, 0, 0, 1 };
1477ec681f3Smrg   static const GLdouble default_double[4] = { 0, 0, 0, 1 };
1487ec681f3Smrg   static const uint64_t default_uint64[4] = { 0, 0, 0, 1 };
14901e04c3fSmrg
15001e04c3fSmrg   switch (format) {
15101e04c3fSmrg   case GL_FLOAT:
15201e04c3fSmrg      return (fi_type *)default_float;
15301e04c3fSmrg   case GL_INT:
15401e04c3fSmrg   case GL_UNSIGNED_INT:
15501e04c3fSmrg      return (fi_type *)default_int;
1567ec681f3Smrg   case GL_DOUBLE:
1577ec681f3Smrg      return (fi_type *)default_double;
1587ec681f3Smrg   case GL_UNSIGNED_INT64_ARB:
1597ec681f3Smrg      return (fi_type *)default_uint64;
16001e04c3fSmrg   default:
16101e04c3fSmrg      unreachable("Bad vertex format");
16201e04c3fSmrg      return NULL;
16301e04c3fSmrg   }
16401e04c3fSmrg}
16501e04c3fSmrg
16601e04c3fSmrg
16701e04c3fSmrg/**
16801e04c3fSmrg * Compute the max number of vertices which can be stored in
16901e04c3fSmrg * a vertex buffer, given the current vertex size, and the amount
17001e04c3fSmrg * of space already used.
17101e04c3fSmrg */
17201e04c3fSmrgstatic inline unsigned
17301e04c3fSmrgvbo_compute_max_verts(const struct vbo_exec_context *exec)
17401e04c3fSmrg{
1757ec681f3Smrg   unsigned n = (gl_context_from_vbo_exec_const(exec)->Const.glBeginEndBufferSize -
1767ec681f3Smrg                 exec->vtx.buffer_used) /
1777ec681f3Smrg                (exec->vtx.vertex_size * sizeof(GLfloat));
17801e04c3fSmrg   if (n == 0)
17901e04c3fSmrg      return 0;
18001e04c3fSmrg   /* Subtract one so we're always sure to have room for an extra
18101e04c3fSmrg    * vertex for GL_LINE_LOOP -> GL_LINE_STRIP conversion.
18201e04c3fSmrg    */
18301e04c3fSmrg   n--;
18401e04c3fSmrg   return n;
18501e04c3fSmrg}
18601e04c3fSmrg
18701e04c3fSmrg
18801e04c3fSmrgvoid
1897ec681f3Smrgvbo_try_prim_conversion(GLubyte *mode, unsigned *count);
19001e04c3fSmrg
19101e04c3fSmrgbool
1927ec681f3Smrgvbo_merge_draws(struct gl_context *ctx, bool in_dlist,
1937ec681f3Smrg                GLubyte mode0, GLubyte mode1,
1947ec681f3Smrg                unsigned start0, unsigned start1,
1957ec681f3Smrg                unsigned *count0, unsigned count1,
1967ec681f3Smrg                unsigned basevertex0, unsigned basevertex1,
1977ec681f3Smrg                bool *end0, bool begin1, bool end1);
1987ec681f3Smrg
1997ec681f3Smrgunsigned
2007ec681f3Smrgvbo_copy_vertices(struct gl_context *ctx,
2017ec681f3Smrg                  GLenum mode,
2027ec681f3Smrg                  unsigned start, unsigned *count, bool begin,
2037ec681f3Smrg                  unsigned vertex_size,
2047ec681f3Smrg                  bool in_dlist,
2057ec681f3Smrg                  fi_type *dst,
2067ec681f3Smrg                  const fi_type *src);
20701e04c3fSmrg
20801e04c3fSmrg/**
20901e04c3fSmrg * Get the filter mask for vbo draws depending on the vertex_processing_mode.
21001e04c3fSmrg */
21101e04c3fSmrgstatic inline GLbitfield
21201e04c3fSmrg_vbo_get_vao_filter(gl_vertex_processing_mode vertex_processing_mode)
21301e04c3fSmrg{
21401e04c3fSmrg   if (vertex_processing_mode == VP_MODE_FF) {
21501e04c3fSmrg      /* The materials mapped into the generic arrays */
21601e04c3fSmrg      return VERT_BIT_FF_ALL | VERT_BIT_MAT_ALL;
21701e04c3fSmrg   } else {
21801e04c3fSmrg      return VERT_BIT_ALL;
21901e04c3fSmrg   }
22001e04c3fSmrg}
22101e04c3fSmrg
22201e04c3fSmrg
22301e04c3fSmrg/**
22401e04c3fSmrg * Translate the bitmask of VBO_ATTRIB_BITs to VERT_ATTRIB_BITS.
22501e04c3fSmrg * Note that position/generic0 attribute aliasing is done
22601e04c3fSmrg * generically in the VAO.
22701e04c3fSmrg */
22801e04c3fSmrgstatic inline GLbitfield
22901e04c3fSmrg_vbo_get_vao_enabled_from_vbo(gl_vertex_processing_mode vertex_processing_mode,
23001e04c3fSmrg                              GLbitfield64 enabled)
23101e04c3fSmrg{
23201e04c3fSmrg   if (vertex_processing_mode == VP_MODE_FF) {
23301e04c3fSmrg      /* The materials mapped into the generic arrays */
23401e04c3fSmrg      return (((GLbitfield)enabled) & VERT_BIT_FF_ALL)
23501e04c3fSmrg         | (((GLbitfield)(enabled >> VBO_MATERIAL_SHIFT)) & VERT_BIT_MAT_ALL);
23601e04c3fSmrg   } else {
23701e04c3fSmrg      return ((GLbitfield)enabled) & VERT_BIT_ALL;
23801e04c3fSmrg   }
23901e04c3fSmrg}
24001e04c3fSmrg
24101e04c3fSmrg
24201e04c3fSmrg/**
24301e04c3fSmrg * Set the vertex attrib for vbo draw use.
24401e04c3fSmrg */
24501e04c3fSmrgstatic inline void
24601e04c3fSmrg_vbo_set_attrib_format(struct gl_context *ctx,
24701e04c3fSmrg                       struct gl_vertex_array_object *vao,
24801e04c3fSmrg                       gl_vert_attrib attr, GLintptr buffer_offset,
24901e04c3fSmrg                       GLubyte size, GLenum16 type, GLuint offset)
25001e04c3fSmrg{
25101e04c3fSmrg   const GLboolean integer = vbo_attrtype_to_integer_flag(type);
25201e04c3fSmrg   const GLboolean doubles = vbo_attrtype_to_double_flag(type);
25301e04c3fSmrg
25401e04c3fSmrg   if (doubles)
25501e04c3fSmrg      size /= 2;
25601e04c3fSmrg   _mesa_update_array_format(ctx, vao, attr, size, type, GL_RGBA,
25701e04c3fSmrg                             GL_FALSE, integer, doubles, offset);
2587ec681f3Smrg   vao->NewArrays |= vao->Enabled & VERT_BIT(attr);
25901e04c3fSmrg   vao->VertexAttrib[attr].Ptr = ADD_POINTERS(buffer_offset, offset);
26001e04c3fSmrg}
26101e04c3fSmrg
26201e04c3fSmrg
26301e04c3fSmrg#endif /* VBO_PRIVATE_H */
264