1b8e80941Smrg/* 2b8e80941Smrg * mesa 3-D graphics library 3b8e80941Smrg * 4b8e80941Smrg * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 5b8e80941Smrg * 6b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a 7b8e80941Smrg * copy of this software and associated documentation files (the "Software"), 8b8e80941Smrg * to deal in the Software without restriction, including without limitation 9b8e80941Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10b8e80941Smrg * and/or sell copies of the Software, and to permit persons to whom the 11b8e80941Smrg * Software is furnished to do so, subject to the following conditions: 12b8e80941Smrg * 13b8e80941Smrg * The above copyright notice and this permission notice shall be included 14b8e80941Smrg * in all copies or substantial portions of the Software. 15b8e80941Smrg * 16b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17b8e80941Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18b8e80941Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19b8e80941Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20b8e80941Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21b8e80941Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22b8e80941Smrg * OTHER DEALINGS IN THE SOFTWARE. 23b8e80941Smrg */ 24b8e80941Smrg 25b8e80941Smrg 26b8e80941Smrg/** 27b8e80941Smrg * Types, functions, etc which are private to the VBO module. 28b8e80941Smrg */ 29b8e80941Smrg 30b8e80941Smrg 31b8e80941Smrg#ifndef VBO_PRIVATE_H 32b8e80941Smrg#define VBO_PRIVATE_H 33b8e80941Smrg 34b8e80941Smrg 35b8e80941Smrg#include "vbo/vbo_attrib.h" 36b8e80941Smrg#include "vbo/vbo_exec.h" 37b8e80941Smrg#include "vbo/vbo_save.h" 38b8e80941Smrg#include "main/varray.h" 39b8e80941Smrg 40b8e80941Smrg 41b8e80941Smrgstruct _glapi_table; 42b8e80941Smrgstruct _mesa_prim; 43b8e80941Smrg 44b8e80941Smrg 45b8e80941Smrgstruct vbo_context { 46b8e80941Smrg struct gl_vertex_buffer_binding binding; 47b8e80941Smrg struct gl_array_attributes current[VBO_ATTRIB_MAX]; 48b8e80941Smrg 49b8e80941Smrg struct gl_vertex_array_object *VAO; 50b8e80941Smrg 51b8e80941Smrg struct vbo_exec_context exec; 52b8e80941Smrg struct vbo_save_context save; 53b8e80941Smrg}; 54b8e80941Smrg 55b8e80941Smrg 56b8e80941Smrgstatic inline struct vbo_context * 57b8e80941Smrgvbo_context(struct gl_context *ctx) 58b8e80941Smrg{ 59b8e80941Smrg return ctx->vbo_context; 60b8e80941Smrg} 61b8e80941Smrg 62b8e80941Smrg 63b8e80941Smrgstatic inline const struct vbo_context * 64b8e80941Smrgvbo_context_const(const struct gl_context *ctx) 65b8e80941Smrg{ 66b8e80941Smrg return ctx->vbo_context; 67b8e80941Smrg} 68b8e80941Smrg 69b8e80941Smrg 70b8e80941Smrg/** 71b8e80941Smrg * Array to apply the fixed function material aliasing map to 72b8e80941Smrg * an attribute value used in vbo processing inputs to an attribute 73b8e80941Smrg * as they appear in the vao. 74b8e80941Smrg */ 75b8e80941Smrgextern const GLubyte 76b8e80941Smrg_vbo_attribute_alias_map[VP_MODE_MAX][VERT_ATTRIB_MAX]; 77b8e80941Smrg 78b8e80941Smrg 79b8e80941Smrg/** 80b8e80941Smrg * Return if format is integer. The immediate mode commands only emit floats 81b8e80941Smrg * for non-integer types, thus everything else is integer. 82b8e80941Smrg */ 83b8e80941Smrgstatic inline GLboolean 84b8e80941Smrgvbo_attrtype_to_integer_flag(GLenum format) 85b8e80941Smrg{ 86b8e80941Smrg switch (format) { 87b8e80941Smrg case GL_FLOAT: 88b8e80941Smrg case GL_DOUBLE: 89b8e80941Smrg return GL_FALSE; 90b8e80941Smrg case GL_INT: 91b8e80941Smrg case GL_UNSIGNED_INT: 92b8e80941Smrg case GL_UNSIGNED_INT64_ARB: 93b8e80941Smrg return GL_TRUE; 94b8e80941Smrg default: 95b8e80941Smrg unreachable("Bad vertex attribute type"); 96b8e80941Smrg return GL_FALSE; 97b8e80941Smrg } 98b8e80941Smrg} 99b8e80941Smrg 100b8e80941Smrgstatic inline GLboolean 101b8e80941Smrgvbo_attrtype_to_double_flag(GLenum format) 102b8e80941Smrg{ 103b8e80941Smrg switch (format) { 104b8e80941Smrg case GL_FLOAT: 105b8e80941Smrg case GL_INT: 106b8e80941Smrg case GL_UNSIGNED_INT: 107b8e80941Smrg return GL_FALSE; 108b8e80941Smrg case GL_UNSIGNED_INT64_ARB: 109b8e80941Smrg case GL_DOUBLE: 110b8e80941Smrg return GL_TRUE; 111b8e80941Smrg default: 112b8e80941Smrg unreachable("Bad vertex attribute type"); 113b8e80941Smrg return GL_FALSE; 114b8e80941Smrg } 115b8e80941Smrg} 116b8e80941Smrg 117b8e80941Smrg 118b8e80941Smrgstatic inline void 119b8e80941Smrgvbo_set_vertex_format(struct gl_vertex_format* vertex_format, 120b8e80941Smrg GLubyte size, GLenum16 type) 121b8e80941Smrg{ 122b8e80941Smrg _mesa_set_vertex_format(vertex_format, size, type, GL_RGBA, GL_FALSE, 123b8e80941Smrg vbo_attrtype_to_integer_flag(type), 124b8e80941Smrg vbo_attrtype_to_double_flag(type)); 125b8e80941Smrg} 126b8e80941Smrg 127b8e80941Smrg 128b8e80941Smrg/** 129b8e80941Smrg * Return default component values for the given format. 130b8e80941Smrg * The return type is an array of fi_types, because that's how we declare 131b8e80941Smrg * the vertex storage : floats , integers or unsigned integers. 132b8e80941Smrg */ 133b8e80941Smrgstatic inline const fi_type * 134b8e80941Smrgvbo_get_default_vals_as_union(GLenum format) 135b8e80941Smrg{ 136b8e80941Smrg static const GLfloat default_float[4] = { 0, 0, 0, 1 }; 137b8e80941Smrg static const GLint default_int[4] = { 0, 0, 0, 1 }; 138b8e80941Smrg 139b8e80941Smrg switch (format) { 140b8e80941Smrg case GL_FLOAT: 141b8e80941Smrg return (fi_type *)default_float; 142b8e80941Smrg case GL_INT: 143b8e80941Smrg case GL_UNSIGNED_INT: 144b8e80941Smrg return (fi_type *)default_int; 145b8e80941Smrg default: 146b8e80941Smrg unreachable("Bad vertex format"); 147b8e80941Smrg return NULL; 148b8e80941Smrg } 149b8e80941Smrg} 150b8e80941Smrg 151b8e80941Smrg 152b8e80941Smrg/** 153b8e80941Smrg * Compute the max number of vertices which can be stored in 154b8e80941Smrg * a vertex buffer, given the current vertex size, and the amount 155b8e80941Smrg * of space already used. 156b8e80941Smrg */ 157b8e80941Smrgstatic inline unsigned 158b8e80941Smrgvbo_compute_max_verts(const struct vbo_exec_context *exec) 159b8e80941Smrg{ 160b8e80941Smrg unsigned n = (VBO_VERT_BUFFER_SIZE - exec->vtx.buffer_used) / 161b8e80941Smrg (exec->vtx.vertex_size * sizeof(GLfloat)); 162b8e80941Smrg if (n == 0) 163b8e80941Smrg return 0; 164b8e80941Smrg /* Subtract one so we're always sure to have room for an extra 165b8e80941Smrg * vertex for GL_LINE_LOOP -> GL_LINE_STRIP conversion. 166b8e80941Smrg */ 167b8e80941Smrg n--; 168b8e80941Smrg return n; 169b8e80941Smrg} 170b8e80941Smrg 171b8e80941Smrg 172b8e80941Smrgvoid 173b8e80941Smrgvbo_try_prim_conversion(struct _mesa_prim *p); 174b8e80941Smrg 175b8e80941Smrgbool 176b8e80941Smrgvbo_can_merge_prims(const struct _mesa_prim *p0, const struct _mesa_prim *p1); 177b8e80941Smrg 178b8e80941Smrgvoid 179b8e80941Smrgvbo_merge_prims(struct _mesa_prim *p0, const struct _mesa_prim *p1); 180b8e80941Smrg 181b8e80941Smrg 182b8e80941Smrg/** 183b8e80941Smrg * Get the filter mask for vbo draws depending on the vertex_processing_mode. 184b8e80941Smrg */ 185b8e80941Smrgstatic inline GLbitfield 186b8e80941Smrg_vbo_get_vao_filter(gl_vertex_processing_mode vertex_processing_mode) 187b8e80941Smrg{ 188b8e80941Smrg if (vertex_processing_mode == VP_MODE_FF) { 189b8e80941Smrg /* The materials mapped into the generic arrays */ 190b8e80941Smrg return VERT_BIT_FF_ALL | VERT_BIT_MAT_ALL; 191b8e80941Smrg } else { 192b8e80941Smrg return VERT_BIT_ALL; 193b8e80941Smrg } 194b8e80941Smrg} 195b8e80941Smrg 196b8e80941Smrg 197b8e80941Smrg/** 198b8e80941Smrg * Translate the bitmask of VBO_ATTRIB_BITs to VERT_ATTRIB_BITS. 199b8e80941Smrg * Note that position/generic0 attribute aliasing is done 200b8e80941Smrg * generically in the VAO. 201b8e80941Smrg */ 202b8e80941Smrgstatic inline GLbitfield 203b8e80941Smrg_vbo_get_vao_enabled_from_vbo(gl_vertex_processing_mode vertex_processing_mode, 204b8e80941Smrg GLbitfield64 enabled) 205b8e80941Smrg{ 206b8e80941Smrg if (vertex_processing_mode == VP_MODE_FF) { 207b8e80941Smrg /* The materials mapped into the generic arrays */ 208b8e80941Smrg return (((GLbitfield)enabled) & VERT_BIT_FF_ALL) 209b8e80941Smrg | (((GLbitfield)(enabled >> VBO_MATERIAL_SHIFT)) & VERT_BIT_MAT_ALL); 210b8e80941Smrg } else { 211b8e80941Smrg return ((GLbitfield)enabled) & VERT_BIT_ALL; 212b8e80941Smrg } 213b8e80941Smrg} 214b8e80941Smrg 215b8e80941Smrg 216b8e80941Smrg/** 217b8e80941Smrg * Set the vertex attrib for vbo draw use. 218b8e80941Smrg */ 219b8e80941Smrgstatic inline void 220b8e80941Smrg_vbo_set_attrib_format(struct gl_context *ctx, 221b8e80941Smrg struct gl_vertex_array_object *vao, 222b8e80941Smrg gl_vert_attrib attr, GLintptr buffer_offset, 223b8e80941Smrg GLubyte size, GLenum16 type, GLuint offset) 224b8e80941Smrg{ 225b8e80941Smrg const GLboolean integer = vbo_attrtype_to_integer_flag(type); 226b8e80941Smrg const GLboolean doubles = vbo_attrtype_to_double_flag(type); 227b8e80941Smrg 228b8e80941Smrg if (doubles) 229b8e80941Smrg size /= 2; 230b8e80941Smrg _mesa_update_array_format(ctx, vao, attr, size, type, GL_RGBA, 231b8e80941Smrg GL_FALSE, integer, doubles, offset); 232b8e80941Smrg /* Ptr for userspace arrays. 233b8e80941Smrg * For updating the pointer we would need to add the vao->NewArrays flag 234b8e80941Smrg * to the VAO. But but that is done already unconditionally in 235b8e80941Smrg * _mesa_update_array_format called above. 236b8e80941Smrg */ 237b8e80941Smrg assert((vao->NewArrays | ~vao->Enabled) & VERT_BIT(attr)); 238b8e80941Smrg vao->VertexAttrib[attr].Ptr = ADD_POINTERS(buffer_offset, offset); 239b8e80941Smrg} 240b8e80941Smrg 241b8e80941Smrg 242b8e80941Smrg#endif /* VBO_PRIVATE_H */ 243