diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/vbo/vbo.h | 9 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_context.c | 19 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_context.h | 158 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_exec.c | 1 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_exec_api.c | 1 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_exec_array.c | 1 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_exec_draw.c | 1 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_primitive_restart.c | 2 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_private.h | 197 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_save.c | 1 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_save_api.c | 1 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_save_draw.c | 1 |
12 files changed, 227 insertions, 165 deletions
diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h index 7fc7c550857..146d4cd3116 100644 --- a/src/mesa/vbo/vbo.h +++ b/src/mesa/vbo/vbo.h @@ -181,15 +181,6 @@ void vbo_set_indirect_draw_func(struct gl_context *ctx, vbo_indirect_draw_func func); void -vbo_try_prim_conversion(struct _mesa_prim *p); - -bool -vbo_can_merge_prims(const struct _mesa_prim *p0, const struct _mesa_prim *p1); - -void -vbo_merge_prims(struct _mesa_prim *p0, const struct _mesa_prim *p1); - -void vbo_sw_primitive_restart(struct gl_context *ctx, const struct _mesa_prim *prim, GLuint nr_prims, diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c index 3d3f838c4f5..34c7d59bb1a 100644 --- a/src/mesa/vbo/vbo_context.c +++ b/src/mesa/vbo/vbo_context.c @@ -31,6 +31,7 @@ #include "main/vtxfmt.h" #include "vbo.h" #include "vbo_context.h" +#include "vbo_private.h" static GLuint @@ -191,6 +192,24 @@ _vbo_install_exec_vtxfmt(struct gl_context *ctx) } +void +vbo_exec_invalidate_state(struct gl_context *ctx) +{ + struct vbo_context *vbo = vbo_context(ctx); + struct vbo_exec_context *exec = &vbo->exec; + + if (ctx->NewState & (_NEW_PROGRAM | _NEW_ARRAY)) { + if (!exec->validating) + exec->array.recalculate_inputs = GL_TRUE; + + _ae_invalidate_state(ctx); + } + + if (ctx->NewState & _NEW_EVAL) + exec->eval.recalculate_maps = GL_TRUE; +} + + GLboolean _vbo_CreateContext(struct gl_context *ctx) { diff --git a/src/mesa/vbo/vbo_context.h b/src/mesa/vbo/vbo_context.h index 2eac0198b80..a723a6aba3a 100644 --- a/src/mesa/vbo/vbo_context.h +++ b/src/mesa/vbo/vbo_context.h @@ -86,168 +86,14 @@ struct vbo_context { }; -static inline struct vbo_context *vbo_context(struct gl_context *ctx) -{ - return ctx->vbo_context; -} - - -static inline void -vbo_exec_invalidate_state(struct gl_context *ctx) -{ - struct vbo_context *vbo = vbo_context(ctx); - struct vbo_exec_context *exec = &vbo->exec; - - if (ctx->NewState & (_NEW_PROGRAM | _NEW_ARRAY)) { - if (!exec->validating) - exec->array.recalculate_inputs = GL_TRUE; - - _ae_invalidate_state(ctx); - } - - if (ctx->NewState & _NEW_EVAL) - exec->eval.recalculate_maps = GL_TRUE; -} +void +vbo_exec_invalidate_state(struct gl_context *ctx); void _vbo_install_exec_vtxfmt(struct gl_context *ctx); -/** - * Return VP_x token to indicate whether we're running fixed-function - * vertex transformation, an NV vertex program or ARB vertex program/shader. - */ -static inline enum vp_mode -get_program_mode( struct gl_context *ctx ) -{ - if (!ctx->VertexProgram._Current) - return VP_NONE; - else if (ctx->VertexProgram._Current == ctx->VertexProgram._TnlProgram) - return VP_NONE; - else - return VP_ARB; -} - - -/** - * This is called by glBegin, glDrawArrays and glDrawElements (and - * variations of those calls). When we transition from immediate mode - * drawing to array drawing we need to invalidate the array state. - * - * glBegin/End builds vertex arrays. Those arrays may look identical - * to glDrawArrays arrays except that the position of the elements may - * be different. For example, arrays of (position3v, normal3f) vs. arrays - * of (normal3f, position3f). So we need to make sure we notify drivers - * that arrays may be changing. - */ -static inline void -vbo_draw_method(struct vbo_context *vbo, gl_draw_method method) -{ - struct gl_context *ctx = vbo->exec.ctx; - - if (ctx->Array.DrawMethod != method) { - switch (method) { - case DRAW_ARRAYS: - ctx->Array._DrawArrays = vbo->exec.array.inputs; - break; - case DRAW_BEGIN_END: - ctx->Array._DrawArrays = vbo->exec.vtx.inputs; - break; - case DRAW_DISPLAY_LIST: - ctx->Array._DrawArrays = vbo->save.inputs; - break; - default: - unreachable("Bad VBO drawing method"); - } - - ctx->NewDriverState |= ctx->DriverFlags.NewArray; - ctx->Array.DrawMethod = method; - } -} - -/** - * Return if format is integer. The immediate mode commands only emit floats - * for non-integer types, thus everything else is integer. - */ -static inline GLboolean -vbo_attrtype_to_integer_flag(GLenum format) -{ - switch (format) { - case GL_FLOAT: - case GL_DOUBLE: - return GL_FALSE; - case GL_INT: - case GL_UNSIGNED_INT: - case GL_UNSIGNED_INT64_ARB: - return GL_TRUE; - default: - unreachable("Bad vertex attribute type"); - return GL_FALSE; - } -} - -static inline GLboolean -vbo_attrtype_to_double_flag(GLenum format) -{ - switch (format) { - case GL_FLOAT: - case GL_INT: - case GL_UNSIGNED_INT: - case GL_UNSIGNED_INT64_ARB: - return GL_FALSE; - case GL_DOUBLE: - return GL_TRUE; - default: - unreachable("Bad vertex attribute type"); - return GL_FALSE; - } -} - -/** - * Return default component values for the given format. - * The return type is an array of fi_types, because that's how we declare - * the vertex storage : floats , integers or unsigned integers. - */ -static inline const fi_type * -vbo_get_default_vals_as_union(GLenum format) -{ - static const GLfloat default_float[4] = { 0, 0, 0, 1 }; - static const GLint default_int[4] = { 0, 0, 0, 1 }; - - switch (format) { - case GL_FLOAT: - return (fi_type *)default_float; - case GL_INT: - case GL_UNSIGNED_INT: - return (fi_type *)default_int; - default: - unreachable("Bad vertex format"); - return NULL; - } -} - - -/** - * Compute the max number of vertices which can be stored in - * a vertex buffer, given the current vertex size, and the amount - * of space already used. - */ -static inline unsigned -vbo_compute_max_verts(const struct vbo_exec_context *exec) -{ - unsigned n = (VBO_VERT_BUFFER_SIZE - exec->vtx.buffer_used) / - (exec->vtx.vertex_size * sizeof(GLfloat)); - if (n == 0) - return 0; - /* Subtract one so we're always sure to have room for an extra - * vertex for GL_LINE_LOOP -> GL_LINE_STRIP conversion. - */ - n--; - return n; -} - - #ifdef __cplusplus } // extern "C" #endif diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c index 4320738bd6d..5718c9d6c26 100644 --- a/src/mesa/vbo/vbo_exec.c +++ b/src/mesa/vbo/vbo_exec.c @@ -30,6 +30,7 @@ #include "main/mtypes.h" #include "main/vtxfmt.h" #include "vbo_context.h" +#include "vbo_private.h" diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c index 6f1c550cb6f..3d972b2d3e1 100644 --- a/src/mesa/vbo/vbo_exec_api.c +++ b/src/mesa/vbo/vbo_exec_api.c @@ -46,6 +46,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "vbo_context.h" #include "vbo_noop.h" +#include "vbo_private.h" /** ID/name for immediate-mode VBO */ diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index 507821ee52c..e79ed4660f8 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -40,6 +40,7 @@ #include "main/transformfeedback.h" #include "vbo_context.h" +#include "vbo_private.h" /** diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c index 080d50c10e9..7418a2a2a0a 100644 --- a/src/mesa/vbo/vbo_exec_draw.c +++ b/src/mesa/vbo/vbo_exec_draw.c @@ -36,6 +36,7 @@ #include "vbo_context.h" #include "vbo_noop.h" +#include "vbo_private.h" static void diff --git a/src/mesa/vbo/vbo_primitive_restart.c b/src/mesa/vbo/vbo_primitive_restart.c index 8f04def377c..886362c32fe 100644 --- a/src/mesa/vbo/vbo_primitive_restart.c +++ b/src/mesa/vbo/vbo_primitive_restart.c @@ -35,6 +35,8 @@ #include "vbo.h" #include "vbo_context.h" +#include "vbo_private.h" + #define UPDATE_MIN2(a, b) (a) = MIN2((a), (b)) #define UPDATE_MAX2(a, b) (a) = MAX2((a), (b)) diff --git a/src/mesa/vbo/vbo_private.h b/src/mesa/vbo/vbo_private.h new file mode 100644 index 00000000000..e4c0cbc31a9 --- /dev/null +++ b/src/mesa/vbo/vbo_private.h @@ -0,0 +1,197 @@ +/* + * mesa 3-D graphics library + * + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + + +/** + * Types, functions, etc which are private to the VBO module. + */ + + +#ifndef VBO_PRIVATE_H +#define VBO_PRIVATE_H + + +#include "vbo/vbo_context.h" +#include "main/mtypes.h" + + +struct _glapi_table; +struct _mesa_prim; + + + +static inline struct vbo_context * +vbo_context(struct gl_context *ctx) +{ + return ctx->vbo_context; +} + + +/** + * Return VP_x token to indicate whether we're running fixed-function + * vertex transformation, an NV vertex program or ARB vertex program/shader. + */ +static inline enum vp_mode +get_program_mode( struct gl_context *ctx ) +{ + if (!ctx->VertexProgram._Current) + return VP_NONE; + else if (ctx->VertexProgram._Current == ctx->VertexProgram._TnlProgram) + return VP_NONE; + else + return VP_ARB; +} + + +/** + * This is called by glBegin, glDrawArrays and glDrawElements (and + * variations of those calls). When we transition from immediate mode + * drawing to array drawing we need to invalidate the array state. + * + * glBegin/End builds vertex arrays. Those arrays may look identical + * to glDrawArrays arrays except that the position of the elements may + * be different. For example, arrays of (position3v, normal3f) vs. arrays + * of (normal3f, position3f). So we need to make sure we notify drivers + * that arrays may be changing. + */ +static inline void +vbo_draw_method(struct vbo_context *vbo, gl_draw_method method) +{ + struct gl_context *ctx = vbo->exec.ctx; + + if (ctx->Array.DrawMethod != method) { + switch (method) { + case DRAW_ARRAYS: + ctx->Array._DrawArrays = vbo->exec.array.inputs; + break; + case DRAW_BEGIN_END: + ctx->Array._DrawArrays = vbo->exec.vtx.inputs; + break; + case DRAW_DISPLAY_LIST: + ctx->Array._DrawArrays = vbo->save.inputs; + break; + default: + unreachable("Bad VBO drawing method"); + } + + ctx->NewDriverState |= ctx->DriverFlags.NewArray; + ctx->Array.DrawMethod = method; + } +} + + +/** + * Return if format is integer. The immediate mode commands only emit floats + * for non-integer types, thus everything else is integer. + */ +static inline GLboolean +vbo_attrtype_to_integer_flag(GLenum format) +{ + switch (format) { + case GL_FLOAT: + case GL_DOUBLE: + return GL_FALSE; + case GL_INT: + case GL_UNSIGNED_INT: + case GL_UNSIGNED_INT64_ARB: + return GL_TRUE; + default: + unreachable("Bad vertex attribute type"); + return GL_FALSE; + } +} + +static inline GLboolean +vbo_attrtype_to_double_flag(GLenum format) +{ + switch (format) { + case GL_FLOAT: + case GL_INT: + case GL_UNSIGNED_INT: + case GL_UNSIGNED_INT64_ARB: + return GL_FALSE; + case GL_DOUBLE: + return GL_TRUE; + default: + unreachable("Bad vertex attribute type"); + return GL_FALSE; + } +} + + +/** + * Return default component values for the given format. + * The return type is an array of fi_types, because that's how we declare + * the vertex storage : floats , integers or unsigned integers. + */ +static inline const fi_type * +vbo_get_default_vals_as_union(GLenum format) +{ + static const GLfloat default_float[4] = { 0, 0, 0, 1 }; + static const GLint default_int[4] = { 0, 0, 0, 1 }; + + switch (format) { + case GL_FLOAT: + return (fi_type *)default_float; + case GL_INT: + case GL_UNSIGNED_INT: + return (fi_type *)default_int; + default: + unreachable("Bad vertex format"); + return NULL; + } +} + + +/** + * Compute the max number of vertices which can be stored in + * a vertex buffer, given the current vertex size, and the amount + * of space already used. + */ +static inline unsigned +vbo_compute_max_verts(const struct vbo_exec_context *exec) +{ + unsigned n = (VBO_VERT_BUFFER_SIZE - exec->vtx.buffer_used) / + (exec->vtx.vertex_size * sizeof(GLfloat)); + if (n == 0) + return 0; + /* Subtract one so we're always sure to have room for an extra + * vertex for GL_LINE_LOOP -> GL_LINE_STRIP conversion. + */ + n--; + return n; +} + + +void +vbo_try_prim_conversion(struct _mesa_prim *p); + +bool +vbo_can_merge_prims(const struct _mesa_prim *p0, const struct _mesa_prim *p1); + +void +vbo_merge_prims(struct _mesa_prim *p0, const struct _mesa_prim *p1); + + +#endif /* VBO_PRIVATE_H */ diff --git a/src/mesa/vbo/vbo_save.c b/src/mesa/vbo/vbo_save.c index 9e83b59623c..a91dc2ff4b3 100644 --- a/src/mesa/vbo/vbo_save.c +++ b/src/mesa/vbo/vbo_save.c @@ -31,6 +31,7 @@ #include "main/imports.h" #include "vbo_context.h" +#include "vbo_private.h" /** diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index a411308ea24..d260b1f6e6a 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -83,6 +83,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "vbo_context.h" #include "vbo_noop.h" +#include "vbo_private.h" #ifdef ERROR diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index a63e0674d89..9bac2671f31 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -37,6 +37,7 @@ #include "util/bitscan.h" #include "vbo_context.h" +#include "vbo_private.h" /** |