From 634d2af2b01f4e7ce8fa3ff65f64a446f859821a Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 1 Jul 2008 08:48:22 -0600 Subject: init machine->Samplers (fixes vertex program texture fetches) --- src/mesa/tnl/t_vb_program.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mesa/tnl/t_vb_program.c b/src/mesa/tnl/t_vb_program.c index addaf761273..f99401ca6d8 100644 --- a/src/mesa/tnl/t_vb_program.c +++ b/src/mesa/tnl/t_vb_program.c @@ -242,6 +242,8 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine) machine->FetchTexelLod = vp_fetch_texel; machine->FetchTexelDeriv = NULL; /* not used by vertex programs */ + + machine->Samplers = ctx->VertexProgram._Current->Base.SamplerUnits; } -- cgit v1.2.3 From 2ce4b985a56fc05ea1f33b68a987bf866ab06d11 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 1 Jul 2008 08:48:48 -0600 Subject: press 'm' to toggle multisample enable/disable --- progs/tests/antialias.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/progs/tests/antialias.c b/progs/tests/antialias.c index 79b5ab75c57..c389bbea3a8 100644 --- a/progs/tests/antialias.c +++ b/progs/tests/antialias.c @@ -16,6 +16,7 @@ static GLfloat Zrot = 0; static GLboolean Anim = GL_TRUE; static GLboolean HaveMultisample = GL_TRUE; +static GLboolean DoMultisample = GL_TRUE; static void @@ -86,7 +87,10 @@ Display( void ) glColor3f(1, 1, 1); if (HaveMultisample) { glRasterPos2f(-3.1, -1.6); - PrintString("MULTISAMPLE"); + if (DoMultisample) + PrintString("MULTISAMPLE"); + else + PrintString("MULTISAMPLE (off)"); } glRasterPos2f(-0.8, -1.6); PrintString("No antialiasing"); @@ -96,7 +100,8 @@ Display( void ) /* multisample */ if (HaveMultisample) { glEnable(GL_DEPTH_TEST); - glEnable(GL_MULTISAMPLE_ARB); + if (DoMultisample) + glEnable(GL_MULTISAMPLE_ARB); glPushMatrix(); glTranslatef(-2.5, 0, 0); glPushMatrix(); @@ -173,6 +178,9 @@ Key( unsigned char key, int x, int y ) else glutIdleFunc(NULL); break; + case 'm': + DoMultisample = !DoMultisample; + break; case 'z': Zrot = (int) (Zrot - step); break; -- cgit v1.2.3 From 011b0e51e47e52ad9e29b31b3b4de1a5b77b3768 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 1 Jul 2008 09:02:10 -0600 Subject: link to DRM 2.3.1 --- docs/install.html | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/docs/install.html b/docs/install.html index 30565a1dc4f..16ef013688a 100644 --- a/docs/install.html +++ b/docs/install.html @@ -25,23 +25,12 @@

1.1 Prerequisites for DRI and Hardware Acceleration

-To build Mesa with DRI-based hardware acceleration you must first have -the right version of DRM. +To build Mesa 7.1 with DRI-based hardware acceleration you must first have +the DRM version 2.3.1.

-For Mesa 7.1 a particular snapshot of -DRM from git is required: -

- -
-git-clone git://anongit.freedesktop.org/git/mesa/drm
-git-checkout (XXXX HASH ID TBD)
-
- - -

-You should also be using Xorg server version 1.4 +You should also be using the Xorg server version 1.4 or 1.5.

-- cgit v1.2.3 From b2247c7d29667047cd34180826a8966675f8be3a Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 1 Jul 2008 11:41:02 -0600 Subject: mesa: add/fix some IrInfo entries for debugging purposes --- src/mesa/shader/slang/slang_ir.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mesa/shader/slang/slang_ir.c b/src/mesa/shader/slang/slang_ir.c index 92e8d0345ee..31ad94183c2 100644 --- a/src/mesa/shader/slang/slang_ir.c +++ b/src/mesa/shader/slang/slang_ir.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.5.3 + * Version: 7.1 * - * Copyright (C) 2005-2007 Brian Paul All Rights Reserved. + * Copyright (C) 2005-2008 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"), @@ -50,6 +50,7 @@ static const slang_ir_info IrInfo[] = { { IR_SLE, "IR_SLE", OPCODE_SLE, 4, 2 }, { IR_SLT, "IR_SLT", OPCODE_SLT, 4, 2 }, { IR_POW, "IR_POW", OPCODE_POW, 1, 2 }, + { IR_EQUAL, "IR_EQUAL", OPCODE_NOP, 1, 2 }, /* unary ops */ { IR_I_TO_F, "IR_I_TO_F", OPCODE_NOP, 1, 1 }, { IR_F_TO_I, "IR_F_TO_I", OPCODE_INT, 4, 1 }, /* 4 floats to 4 ints */ @@ -90,7 +91,8 @@ static const slang_ir_info IrInfo[] = { { IR_FIELD, "IR_FIELD", OPCODE_NOP, 0, 0 }, { IR_ELEMENT, "IR_ELEMENT", OPCODE_NOP, 0, 0 }, { IR_SWIZZLE, "IR_SWIZZLE", OPCODE_NOP, 0, 0 }, - { IR_NOP, NULL, OPCODE_NOP, 0, 0 } + { IR_NOP, "IR_NOP", OPCODE_NOP, 0, 0 }, + { 0, NULL, 0, 0, 0 } }; -- cgit v1.2.3 From 32a5c4033665d51277c733318ac0461e5f85ad09 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 1 Jul 2008 11:41:21 -0600 Subject: mesa: better function inlining in the presence of 'return' statements Before, the presence of a 'return' statement always prevented inlining a function. This was because we didn't want to accidentally return from the _calling_ function. We still need the semantic of 'return' when inlining but we can't always use unconditional branches/jumps (GPUs don't always support arbitrary branching). Now, we allow inlining functions w/ return if the return is the last statement in the function. This fixes the common case of a function that returns a value, such as: vec4 square(const in vec4 x) { return x * x; } which effectively compiles into: vec4 square(const in vec4 x) { __retVal = x * x; return; } The 'return' can be no-op'd now and we can inline the function. --- src/mesa/shader/slang/slang_codegen.c | 128 ++++++++++++++++++++++++++++------ 1 file changed, 105 insertions(+), 23 deletions(-) diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index d19d5a0abb6..821ed119014 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -707,6 +707,64 @@ _slang_find_node_type(slang_operation *oper, slang_operation_type type) } +/** + * Count the number of operations of the given time rooted at 'oper'. + */ +static GLuint +_slang_count_node_type(slang_operation *oper, slang_operation_type type) +{ + GLuint i, count = 0; + if (oper->type == type) { + return 1; + } + for (i = 0; i < oper->num_children; i++) { + count += _slang_count_node_type(&oper->children[i], type); + } + return count; +} + + +/** + * Check if the 'return' statement found under 'oper' is a "tail return" + * that can be no-op'd. For example: + * + * void func(void) + * { + * .. do something .. + * return; // this is a no-op + * } + * + * This is used when determining if a function can be inlined. If the + * 'return' is not the last statement, we can't inline the function since + * we still need the semantic behaviour of the 'return' but we don't want + * to accidentally return from the _calling_ function. We'd need to use an + * unconditional branch, but we don't have such a GPU instruction (not + * always, at least). + */ +static GLboolean +_slang_is_tail_return(const slang_operation *oper) +{ + GLuint k = oper->num_children; + + while (k > 0) { + const slang_operation *last = &oper->children[k - 1]; + if (last->type == SLANG_OPER_RETURN) + return GL_TRUE; + else if (last->type == SLANG_OPER_IDENTIFIER || + last->type == SLANG_OPER_LABEL) + k--; /* try prev child */ + else if (last->type == SLANG_OPER_BLOCK_NO_NEW_SCOPE || + last->type == SLANG_OPER_BLOCK_NEW_SCOPE) + /* try sub-children */ + return _slang_is_tail_return(last); + else + break; + } + + return GL_FALSE; +} + + static void slang_resolve_variable(slang_operation *oper) { @@ -1207,38 +1265,62 @@ _slang_gen_function_call(slang_assemble_ctx *A, slang_function *fun, } else { /* non-assembly function */ + /* We always generate an "inline-able" block of code here. + * We may either: + * 1. insert the inline code + * 2. Generate a call to the "inline" code as a subroutine + */ + + + slang_operation *ret = NULL; + inlined = slang_inline_function_call(A, fun, oper, dest); - if (inlined && _slang_find_node_type(inlined, SLANG_OPER_RETURN)) { - slang_operation *callOper; - /* The function we're calling has one or more 'return' statements. - * So, we can't truly inline this function because we need to - * implement 'return' with RET (and CAL). - * Nevertheless, we performed "inlining" to make a new instance - * of the function body to deal with static register allocation. - * - * XXX check if there's one 'return' and if it's the very last - * statement in the function - we can optimize that case. - */ - assert(inlined->type == SLANG_OPER_BLOCK_NEW_SCOPE || - inlined->type == SLANG_OPER_SEQUENCE); - if (_slang_function_has_return_value(fun) && !dest) { - assert(inlined->children[0].type == SLANG_OPER_VARIABLE_DECL); - assert(inlined->children[2].type == SLANG_OPER_IDENTIFIER); - callOper = &inlined->children[1]; + if (!inlined) + return NULL; + + ret = _slang_find_node_type(inlined, SLANG_OPER_RETURN); + if (ret) { + /* check if this is a "tail" return */ + if (_slang_count_node_type(inlined, SLANG_OPER_RETURN) == 1 && + _slang_is_tail_return(inlined)) { + /* The only RETURN is the last stmt in the function, no-op it + * and inline the function body. + */ + ret->type = SLANG_OPER_NONE; } else { - callOper = inlined; + slang_operation *callOper; + /* The function we're calling has one or more 'return' statements. + * So, we can't truly inline this function because we need to + * implement 'return' with RET (and CAL). + * Nevertheless, we performed "inlining" to make a new instance + * of the function body to deal with static register allocation. + * + * XXX check if there's one 'return' and if it's the very last + * statement in the function - we can optimize that case. + */ + assert(inlined->type == SLANG_OPER_BLOCK_NEW_SCOPE || + inlined->type == SLANG_OPER_SEQUENCE); + + if (_slang_function_has_return_value(fun) && !dest) { + assert(inlined->children[0].type == SLANG_OPER_VARIABLE_DECL); + assert(inlined->children[2].type == SLANG_OPER_IDENTIFIER); + callOper = &inlined->children[1]; + } + else { + callOper = inlined; + } + callOper->type = SLANG_OPER_NON_INLINED_CALL; + callOper->fun = fun; + callOper->label = _slang_label_new_unique((char*) fun->header.a_name); } - callOper->type = SLANG_OPER_NON_INLINED_CALL; - callOper->fun = fun; - callOper->label = _slang_label_new_unique((char*) fun->header.a_name); } } if (!inlined) return NULL; - /* Replace the function call with the inlined block */ + /* Replace the function call with the inlined block (or new CALL stmt) */ slang_operation_destruct(oper); *oper = *inlined; _slang_free(inlined); @@ -3024,7 +3106,7 @@ _slang_codegen_function(slang_assemble_ctx * A, slang_function * fun) if (_mesa_strcmp((char *) fun->header.a_name, "main") != 0) { /* we only really generate code for main, all other functions get - * inlined. + * inlined or codegen'd upon an actual call. */ #if 0 /* do some basic error checking though */ -- cgit v1.2.3 From 9ae4d778d8dd56572b92b7ecaca4f0cabe63d229 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 1 Jul 2008 17:50:14 -0600 Subject: mesa: make _slang_swizzle_swizzle() non-private --- src/mesa/shader/slang/slang_emit.c | 17 ++++++++++------- src/mesa/shader/slang/slang_emit.h | 8 ++++++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c index 93256f8647c..6d79380ab5f 100644 --- a/src/mesa/shader/slang/slang_emit.c +++ b/src/mesa/shader/slang/slang_emit.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 7.0.3 + * Version: 7.1 * - * Copyright (C) 2005-2007 Brian Paul All Rights Reserved. + * Copyright (C) 2005-2008 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"), @@ -110,13 +110,16 @@ writemask_to_swizzle(GLuint writemask) /** * Swizzle a swizzle. That is, return swz2(swz1) */ -static GLuint -swizzle_swizzle(GLuint swz1, GLuint swz2) +GLuint +_slang_swizzle_swizzle(GLuint swz1, GLuint swz2) { GLuint i, swz, s[4]; for (i = 0; i < 4; i++) { GLuint c = GET_SWZ(swz2, i); - s[i] = GET_SWZ(swz1, c); + if (c <= SWIZZLE_W) + s[i] = GET_SWZ(swz1, c); + else + s[i] = c; } swz = MAKE_SWIZZLE4(s[0], s[1], s[2], s[3]); return swz; @@ -1459,8 +1462,8 @@ emit_swizzle(slang_emit_info *emitInfo, slang_ir_node *n) /* apply this swizzle to child's swizzle to get composed swizzle */ swizzle = fix_swizzle(n->Store->Swizzle); /* remove the don't care terms */ - n->Store->Swizzle = swizzle_swizzle(n->Children[0]->Store->Swizzle, - swizzle); + n->Store->Swizzle = _slang_swizzle_swizzle(n->Children[0]->Store->Swizzle, + swizzle); return inst; } diff --git a/src/mesa/shader/slang/slang_emit.h b/src/mesa/shader/slang/slang_emit.h index 13ba6d7d6c7..7d70b3311b8 100644 --- a/src/mesa/shader/slang/slang_emit.h +++ b/src/mesa/shader/slang/slang_emit.h @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.5.3 + * Version: 7.1 * - * Copyright (C) 2005-2007 Brian Paul All Rights Reserved. + * Copyright (C) 2005-2008 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"), @@ -36,6 +36,10 @@ extern void slang_print_ir(const slang_ir_node *n, int indent); +extern GLuint +_slang_swizzle_swizzle(GLuint swz1, GLuint swz2); + + extern slang_ir_storage * _slang_new_ir_storage(enum register_file file, GLint index, GLint size); -- cgit v1.2.3 From e19af171cf013098c35990069225a87c3a04e197 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 1 Jul 2008 17:52:31 -0600 Subject: mesa: move some functions --- src/mesa/shader/slang/slang_codegen.c | 198 +++++++++++++++++----------------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 821ed119014..efeae283fca 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -1394,6 +1394,105 @@ make_writemask(const char *field) } +/** + * Some write-masked assignments are simple, but others are hard. + * Simple example: + * vec3 v; + * v.xy = vec2(a, b); + * Hard example: + * vec3 v; + * v.zy = vec2(a, b); + * this gets transformed/swizzled into: + * v.zy = vec2(a, b).*yx* (* = don't care) + * This function helps to determine simple vs. non-simple. + */ +static GLboolean +_slang_simple_writemask(GLuint writemask, GLuint swizzle) +{ + switch (writemask) { + case WRITEMASK_X: + return GET_SWZ(swizzle, 0) == SWIZZLE_X; + case WRITEMASK_Y: + return GET_SWZ(swizzle, 1) == SWIZZLE_Y; + case WRITEMASK_Z: + return GET_SWZ(swizzle, 2) == SWIZZLE_Z; + case WRITEMASK_W: + return GET_SWZ(swizzle, 3) == SWIZZLE_W; + case WRITEMASK_XY: + return (GET_SWZ(swizzle, 0) == SWIZZLE_X) + && (GET_SWZ(swizzle, 1) == SWIZZLE_Y); + case WRITEMASK_XYZ: + return (GET_SWZ(swizzle, 0) == SWIZZLE_X) + && (GET_SWZ(swizzle, 1) == SWIZZLE_Y) + && (GET_SWZ(swizzle, 2) == SWIZZLE_Z); + case WRITEMASK_XYZW: + return swizzle == SWIZZLE_NOOP; + default: + return GL_FALSE; + } +} + + +/** + * Convert the given swizzle into a writemask. In some cases this + * is trivial, in other cases, we'll need to also swizzle the right + * hand side to put components in the right places. + * \param swizzle the incoming swizzle + * \param writemaskOut returns the writemask + * \param swizzleOut swizzle to apply to the right-hand-side + * \return GL_FALSE for simple writemasks, GL_TRUE for non-simple + */ +static GLboolean +swizzle_to_writemask(GLuint swizzle, + GLuint *writemaskOut, GLuint *swizzleOut) +{ + GLuint mask = 0x0, newSwizzle[4]; + GLint i, size; + + /* make new dst writemask, compute size */ + for (i = 0; i < 4; i++) { + const GLuint swz = GET_SWZ(swizzle, i); + if (swz == SWIZZLE_NIL) { + /* end */ + break; + } + assert(swz >= 0 && swz <= 3); + mask |= (1 << swz); + } + assert(mask <= 0xf); + size = i; /* number of components in mask/swizzle */ + + *writemaskOut = mask; + + /* make new src swizzle, by inversion */ + for (i = 0; i < 4; i++) { + newSwizzle[i] = i; /*identity*/ + } + for (i = 0; i < size; i++) { + const GLuint swz = GET_SWZ(swizzle, i); + newSwizzle[swz] = i; + } + *swizzleOut = MAKE_SWIZZLE4(newSwizzle[0], + newSwizzle[1], + newSwizzle[2], + newSwizzle[3]); + + if (_slang_simple_writemask(mask, *swizzleOut)) { + if (size >= 1) + assert(GET_SWZ(*swizzleOut, 0) == SWIZZLE_X); + if (size >= 2) + assert(GET_SWZ(*swizzleOut, 1) == SWIZZLE_Y); + if (size >= 3) + assert(GET_SWZ(*swizzleOut, 2) == SWIZZLE_Z); + if (size >= 4) + assert(GET_SWZ(*swizzleOut, 3) == SWIZZLE_W); + return GL_TRUE; + } + else + return GL_FALSE; +} + + /** * Generate IR tree for an asm instruction/operation such as: * __asm vec4_dot __retVal.x, v1, v2; @@ -2208,105 +2307,6 @@ _slang_gen_variable(slang_assemble_ctx * A, slang_operation *oper) } -/** - * Some write-masked assignments are simple, but others are hard. - * Simple example: - * vec3 v; - * v.xy = vec2(a, b); - * Hard example: - * vec3 v; - * v.zy = vec2(a, b); - * this gets transformed/swizzled into: - * v.zy = vec2(a, b).*yx* (* = don't care) - * This function helps to determine simple vs. non-simple. - */ -static GLboolean -_slang_simple_writemask(GLuint writemask, GLuint swizzle) -{ - switch (writemask) { - case WRITEMASK_X: - return GET_SWZ(swizzle, 0) == SWIZZLE_X; - case WRITEMASK_Y: - return GET_SWZ(swizzle, 1) == SWIZZLE_Y; - case WRITEMASK_Z: - return GET_SWZ(swizzle, 2) == SWIZZLE_Z; - case WRITEMASK_W: - return GET_SWZ(swizzle, 3) == SWIZZLE_W; - case WRITEMASK_XY: - return (GET_SWZ(swizzle, 0) == SWIZZLE_X) - && (GET_SWZ(swizzle, 1) == SWIZZLE_Y); - case WRITEMASK_XYZ: - return (GET_SWZ(swizzle, 0) == SWIZZLE_X) - && (GET_SWZ(swizzle, 1) == SWIZZLE_Y) - && (GET_SWZ(swizzle, 2) == SWIZZLE_Z); - case WRITEMASK_XYZW: - return swizzle == SWIZZLE_NOOP; - default: - return GL_FALSE; - } -} - - -/** - * Convert the given swizzle into a writemask. In some cases this - * is trivial, in other cases, we'll need to also swizzle the right - * hand side to put components in the right places. - * \param swizzle the incoming swizzle - * \param writemaskOut returns the writemask - * \param swizzleOut swizzle to apply to the right-hand-side - * \return GL_FALSE for simple writemasks, GL_TRUE for non-simple - */ -static GLboolean -swizzle_to_writemask(GLuint swizzle, - GLuint *writemaskOut, GLuint *swizzleOut) -{ - GLuint mask = 0x0, newSwizzle[4]; - GLint i, size; - - /* make new dst writemask, compute size */ - for (i = 0; i < 4; i++) { - const GLuint swz = GET_SWZ(swizzle, i); - if (swz == SWIZZLE_NIL) { - /* end */ - break; - } - assert(swz >= 0 && swz <= 3); - mask |= (1 << swz); - } - assert(mask <= 0xf); - size = i; /* number of components in mask/swizzle */ - - *writemaskOut = mask; - - /* make new src swizzle, by inversion */ - for (i = 0; i < 4; i++) { - newSwizzle[i] = i; /*identity*/ - } - for (i = 0; i < size; i++) { - const GLuint swz = GET_SWZ(swizzle, i); - newSwizzle[swz] = i; - } - *swizzleOut = MAKE_SWIZZLE4(newSwizzle[0], - newSwizzle[1], - newSwizzle[2], - newSwizzle[3]); - - if (_slang_simple_writemask(mask, *swizzleOut)) { - if (size >= 1) - assert(GET_SWZ(*swizzleOut, 0) == SWIZZLE_X); - if (size >= 2) - assert(GET_SWZ(*swizzleOut, 1) == SWIZZLE_Y); - if (size >= 3) - assert(GET_SWZ(*swizzleOut, 2) == SWIZZLE_Z); - if (size >= 4) - assert(GET_SWZ(*swizzleOut, 3) == SWIZZLE_W); - return GL_TRUE; - } - else - return GL_FALSE; -} - - static slang_ir_node * _slang_gen_swizzle(slang_ir_node *child, GLuint swizzle) { -- cgit v1.2.3 From 028739faedd97a67b2348e4561840cc13785b26c Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 1 Jul 2008 17:59:07 -0600 Subject: mesa: fix a GLSL vector subscript/writemask bug This fixes a failure for cases like: vec4 v; v[1] *= 2.0; The v[1] actually acts like a writemask, equivalent to v.y The fix is a bit convoluted, but will do for now. --- src/mesa/shader/slang/slang_codegen.c | 137 ++++++++++++++++++++++------------ 1 file changed, 90 insertions(+), 47 deletions(-) diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index efeae283fca..4846c257f16 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -1355,45 +1355,6 @@ slang_find_asm_info(const char *name) } -static GLuint -make_writemask(const char *field) -{ - GLuint mask = 0x0; - while (*field) { - switch (*field) { - case 'x': - case 's': - case 'r': - mask |= WRITEMASK_X; - break; - case 'y': - case 't': - case 'g': - mask |= WRITEMASK_Y; - break; - case 'z': - case 'p': - case 'b': - mask |= WRITEMASK_Z; - break; - case 'w': - case 'q': - case 'a': - mask |= WRITEMASK_W; - break; - default: - _mesa_problem(NULL, "invalid writemask in make_writemask()"); - return 0; - } - field++; - } - if (mask == 0x0) - return WRITEMASK_XYZW; - else - return mask; -} - - /** * Some write-masked assignments are simple, but others are hard. * Simple example: @@ -1493,6 +1454,88 @@ swizzle_to_writemask(GLuint swizzle, } +/** + * Recursively traverse 'oper' to produce a swizzle mask in the event + * of any vector subscripts and swizzle suffixes. + * Ex: for "vec4 v", "v[2].x" resolves to v.z + */ +static GLuint +resolve_swizzle(const slang_operation *oper) +{ + if (oper->type == SLANG_OPER_FIELD) { + /* writemask from .xyzw suffix */ + slang_swizzle swz; + if (_slang_is_swizzle((char*) oper->a_id, 4, &swz)) { + GLuint swizzle = MAKE_SWIZZLE4(swz.swizzle[0], + swz.swizzle[1], + swz.swizzle[2], + swz.swizzle[3]); + GLuint child_swizzle = resolve_swizzle(&oper->children[0]); + GLuint s = _slang_swizzle_swizzle(child_swizzle, swizzle); + return s; + } + else + return SWIZZLE_XYZW; + } + else if (oper->type == SLANG_OPER_SUBSCRIPT && + oper->children[1].type == SLANG_OPER_LITERAL_INT) { + /* writemask from [index] */ + GLuint child_swizzle = resolve_swizzle(&oper->children[0]); + GLuint i = (GLuint) oper->children[1].literal[0]; + GLuint swizzle; + GLuint s; + switch (i) { + case 0: + swizzle = SWIZZLE_XXXX; + break; + case 1: + swizzle = SWIZZLE_YYYY; + break; + case 2: + swizzle = SWIZZLE_ZZZZ; + break; + case 3: + swizzle = SWIZZLE_WWWW; + break; + default: + swizzle = SWIZZLE_XYZW; + } + s = _slang_swizzle_swizzle(child_swizzle, swizzle); + return s; + } + else { + return SWIZZLE_XYZW; + } +} + + +/** + * As above, but produce a writemask. + */ +static GLuint +resolve_writemask(const slang_operation *oper) +{ + GLuint swizzle = resolve_swizzle(oper); + GLuint writemask, swizzleOut; + swizzle_to_writemask(swizzle, &writemask, &swizzleOut); + return writemask; +} + + +/** + * Recursively descend through swizzle nodes to find the node's storage info. + */ +static slang_ir_storage * +get_store(const slang_ir_node *n) +{ + if (n->Opcode == IR_SWIZZLE) { + return get_store(n->Children[0]); + } + return n->Store; +} + + + /** * Generate IR tree for an asm instruction/operation such as: * __asm vec4_dot __retVal.x, v1, v2; @@ -1547,19 +1590,19 @@ _slang_gen_asm(slang_assemble_ctx *A, slang_operation *oper, slang_ir_node *n0; dest_oper = &oper->children[0]; - while (dest_oper->type == SLANG_OPER_FIELD) { - /* writemask */ - writemask &= make_writemask((char*) dest_oper->a_id); - dest_oper = &dest_oper->children[0]; - } + + writemask = resolve_writemask(dest_oper); n0 = _slang_gen_operation(A, dest_oper); - assert(n0->Var); - assert(n0->Store); + if (!n0) + return NULL; + assert(!n->Store); - n->Store = n0->Store; + n->Store = get_store(n0); n->Writemask = writemask; + assert(n->Store->File != PROGRAM_UNDEFINED); + _slang_free(n0); } -- cgit v1.2.3 From c52d6ad465dd4fddcd40e50e93f66469dcd8ffea Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Tue, 1 Jul 2008 18:20:21 -0700 Subject: VBO: add GLX related annotations --- src/mesa/glapi/gl_API.xml | 88 +++++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/src/mesa/glapi/gl_API.xml b/src/mesa/glapi/gl_API.xml index 12c048f1e62..a571de8da7c 100644 --- a/src/mesa/glapi/gl_API.xml +++ b/src/mesa/glapi/gl_API.xml @@ -7291,27 +7291,57 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + @@ -7323,8 +7353,8 @@ - - + + @@ -7334,8 +7364,8 @@ - - + + @@ -7343,14 +7373,14 @@ - - + + - - + + @@ -7363,7 +7393,7 @@ - + @@ -7377,8 +7407,8 @@ - - + + -- cgit v1.2.3 From 21e0d47514ea16c85342549dc8843be1b9bbc6ef Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Tue, 1 Jul 2008 19:30:32 -0700 Subject: VBO: Add missing functions related to VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB --- src/mesa/glapi/gl_API.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mesa/glapi/gl_API.xml b/src/mesa/glapi/gl_API.xml index a571de8da7c..2d8a967ba79 100644 --- a/src/mesa/glapi/gl_API.xml +++ b/src/mesa/glapi/gl_API.xml @@ -7331,6 +7331,8 @@ + + -- cgit v1.2.3 From abd71144f0c34c071739dbb00378520fb02b5b61 Mon Sep 17 00:00:00 2001 From: Paulo Cesar Pereira de Andrade Date: Wed, 2 Jul 2008 06:22:47 -0700 Subject: Bring over commit 8d4d0b47a07a298a20ffae9fefe96c8c7ca9dccc from xserver tree --- src/mesa/glapi/glapi.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mesa/glapi/glapi.c b/src/mesa/glapi/glapi.c index c4d101aee55..94a804329aa 100644 --- a/src/mesa/glapi/glapi.c +++ b/src/mesa/glapi/glapi.c @@ -63,6 +63,9 @@ #include #include +#ifdef DEBUG +#include +#endif #include "glapi.h" #include "glapioffsets.h" -- cgit v1.2.3 From ea190fe05098d166c38d168d6a3d743c3acfe722 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Wed, 2 Jul 2008 06:26:11 -0700 Subject: VBO: Regenerate files based on recent changes to gl_API.xml Since GL_ARB_vertex_buffer_object protocol isn't supported yet, these changes are innocuous. --- src/mesa/drivers/dri/common/extension_helper.h | 32 +- src/mesa/main/enums.c | 5874 ++++++++++++------------ 2 files changed, 2951 insertions(+), 2955 deletions(-) diff --git a/src/mesa/drivers/dri/common/extension_helper.h b/src/mesa/drivers/dri/common/extension_helper.h index 65e96657b8a..ea5b9973dde 100644 --- a/src/mesa/drivers/dri/common/extension_helper.h +++ b/src/mesa/drivers/dri/common/extension_helper.h @@ -1077,13 +1077,6 @@ static const char AreTexturesResident_names[] = ""; #endif -#if defined(need_GL_EXT_framebuffer_object) -static const char IsRenderbufferEXT_names[] = - "i\0" /* Parameter signature */ - "glIsRenderbufferEXT\0" - ""; -#endif - #if defined(need_GL_VERSION_2_0) || defined(need_GL_ATI_separate_stencil) static const char StencilOpSeparate_names[] = "iiii\0" /* Parameter signature */ @@ -1763,13 +1756,6 @@ static const char DeleteFencesNV_names[] = ""; #endif -#if defined(need_GL_SGIX_polynomial_ffd) -static const char DeformationMap3dSGIX_names[] = - "iddiiddiiddiip\0" /* Parameter signature */ - "glDeformationMap3dSGIX\0" - ""; -#endif - #if defined(need_GL_VERSION_2_0) static const char IsShader_names[] = "i\0" /* Parameter signature */ @@ -2015,6 +2001,13 @@ static const char WeightfvARB_names[] = ""; #endif +#if defined(need_GL_EXT_framebuffer_object) +static const char IsRenderbufferEXT_names[] = + "i\0" /* Parameter signature */ + "glIsRenderbufferEXT\0" + ""; +#endif + #if defined(need_GL_MESA_window_pos) static const char WindowPos4fMESA_names[] = "ffff\0" /* Parameter signature */ @@ -4530,6 +4523,13 @@ static const char Minmax_names[] = ""; #endif +#if defined(need_GL_SGIX_polynomial_ffd) +static const char DeformationMap3dSGIX_names[] = + "iddiiddiiddiip\0" /* Parameter signature */ + "glDeformationMap3dSGIX\0" + ""; +#endif + #if defined(need_GL_VERSION_1_4) || defined(need_GL_EXT_fog_coord) static const char FogCoorddvEXT_names[] = "p\0" /* Parameter signature */ @@ -5319,13 +5319,13 @@ static const struct dri_extension_function GL_EXT_framebuffer_blit_functions[] = #if defined(need_GL_EXT_framebuffer_object) static const struct dri_extension_function GL_EXT_framebuffer_object_functions[] = { { GenerateMipmapEXT_names, GenerateMipmapEXT_remap_index, -1 }, - { IsRenderbufferEXT_names, IsRenderbufferEXT_remap_index, -1 }, { RenderbufferStorageEXT_names, RenderbufferStorageEXT_remap_index, -1 }, { CheckFramebufferStatusEXT_names, CheckFramebufferStatusEXT_remap_index, -1 }, { DeleteRenderbuffersEXT_names, DeleteRenderbuffersEXT_remap_index, -1 }, { FramebufferTexture3DEXT_names, FramebufferTexture3DEXT_remap_index, -1 }, { FramebufferRenderbufferEXT_names, FramebufferRenderbufferEXT_remap_index, -1 }, { FramebufferTexture1DEXT_names, FramebufferTexture1DEXT_remap_index, -1 }, + { IsRenderbufferEXT_names, IsRenderbufferEXT_remap_index, -1 }, { BindFramebufferEXT_names, BindFramebufferEXT_remap_index, -1 }, { GenRenderbuffersEXT_names, GenRenderbuffersEXT_remap_index, -1 }, { IsFramebufferEXT_names, IsFramebufferEXT_remap_index, -1 }, @@ -5965,9 +5965,9 @@ static const struct dri_extension_function GL_SGIX_pixel_texture_functions[] = { #if defined(need_GL_SGIX_polynomial_ffd) static const struct dri_extension_function GL_SGIX_polynomial_ffd_functions[] = { { LoadIdentityDeformationMapSGIX_names, LoadIdentityDeformationMapSGIX_remap_index, -1 }, - { DeformationMap3dSGIX_names, DeformationMap3dSGIX_remap_index, -1 }, { DeformSGIX_names, DeformSGIX_remap_index, -1 }, { DeformationMap3fSGIX_names, DeformationMap3fSGIX_remap_index, -1 }, + { DeformationMap3dSGIX_names, DeformationMap3dSGIX_remap_index, -1 }, { NULL, 0, 0 } }; #endif diff --git a/src/mesa/main/enums.c b/src/mesa/main/enums.c index 6aeb18fa272..a9c102e4f2d 100644 --- a/src/mesa/main/enums.c +++ b/src/mesa/main/enums.c @@ -88,7 +88,6 @@ LONGSTRING static const char enum_string_table[] = "GL_AND_INVERTED\0" "GL_AND_REVERSE\0" "GL_ARRAY_BUFFER\0" - "GL_ARRAY_BUFFER_ARB\0" "GL_ARRAY_BUFFER_BINDING\0" "GL_ARRAY_BUFFER_BINDING_ARB\0" "GL_ATTACHED_SHADERS\0" @@ -456,7 +455,6 @@ LONGSTRING static const char enum_string_table[] = "GL_EDGE_FLAG_ARRAY_POINTER\0" "GL_EDGE_FLAG_ARRAY_STRIDE\0" "GL_ELEMENT_ARRAY_BUFFER\0" - "GL_ELEMENT_ARRAY_BUFFER_ARB\0" "GL_ELEMENT_ARRAY_BUFFER_BINDING\0" "GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB\0" "GL_EMISSION\0" @@ -1787,7 +1785,7 @@ LONGSTRING static const char enum_string_table[] = "GL_ZOOM_Y\0" ; -static const enum_elt all_enums[1750] = +static const enum_elt all_enums[1748] = { { 0, 0x00000600 }, /* GL_2D */ { 6, 0x00001407 }, /* GL_2_BYTES */ @@ -1842,2990 +1840,2988 @@ static const enum_elt all_enums[1750] = { 830, 0x00001504 }, /* GL_AND_INVERTED */ { 846, 0x00001502 }, /* GL_AND_REVERSE */ { 861, 0x00008892 }, /* GL_ARRAY_BUFFER */ - { 877, 0x00008892 }, /* GL_ARRAY_BUFFER_ARB */ - { 897, 0x00008894 }, /* GL_ARRAY_BUFFER_BINDING */ - { 921, 0x00008894 }, /* GL_ARRAY_BUFFER_BINDING_ARB */ - { 949, 0x00008B85 }, /* GL_ATTACHED_SHADERS */ - { 969, 0x00008645 }, /* GL_ATTRIB_ARRAY_POINTER_NV */ - { 996, 0x00008623 }, /* GL_ATTRIB_ARRAY_SIZE_NV */ - { 1020, 0x00008624 }, /* GL_ATTRIB_ARRAY_STRIDE_NV */ - { 1046, 0x00008625 }, /* GL_ATTRIB_ARRAY_TYPE_NV */ - { 1070, 0x00000BB0 }, /* GL_ATTRIB_STACK_DEPTH */ - { 1092, 0x00000D80 }, /* GL_AUTO_NORMAL */ - { 1107, 0x00000409 }, /* GL_AUX0 */ - { 1115, 0x0000040A }, /* GL_AUX1 */ - { 1123, 0x0000040B }, /* GL_AUX2 */ - { 1131, 0x0000040C }, /* GL_AUX3 */ - { 1139, 0x00000C00 }, /* GL_AUX_BUFFERS */ - { 1154, 0x00000405 }, /* GL_BACK */ - { 1162, 0x00000402 }, /* GL_BACK_LEFT */ - { 1175, 0x00000403 }, /* GL_BACK_RIGHT */ - { 1189, 0x000080E0 }, /* GL_BGR */ - { 1196, 0x000080E1 }, /* GL_BGRA */ - { 1204, 0x00001A00 }, /* GL_BITMAP */ - { 1214, 0x00000704 }, /* GL_BITMAP_TOKEN */ - { 1230, 0x00000BE2 }, /* GL_BLEND */ - { 1239, 0x00008005 }, /* GL_BLEND_COLOR */ - { 1254, 0x00008005 }, /* GL_BLEND_COLOR_EXT */ - { 1273, 0x00000BE0 }, /* GL_BLEND_DST */ - { 1286, 0x000080CA }, /* GL_BLEND_DST_ALPHA */ - { 1305, 0x000080C8 }, /* GL_BLEND_DST_RGB */ - { 1322, 0x00008009 }, /* GL_BLEND_EQUATION */ - { 1340, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA */ - { 1364, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA_EXT */ - { 1392, 0x00008009 }, /* GL_BLEND_EQUATION_EXT */ - { 1414, 0x00008009 }, /* GL_BLEND_EQUATION_RGB_EXT */ - { 1440, 0x00000BE1 }, /* GL_BLEND_SRC */ - { 1453, 0x000080CB }, /* GL_BLEND_SRC_ALPHA */ - { 1472, 0x000080C9 }, /* GL_BLEND_SRC_RGB */ - { 1489, 0x00001905 }, /* GL_BLUE */ - { 1497, 0x00000D1B }, /* GL_BLUE_BIAS */ - { 1510, 0x00000D54 }, /* GL_BLUE_BITS */ - { 1523, 0x00000D1A }, /* GL_BLUE_SCALE */ - { 1537, 0x00008B56 }, /* GL_BOOL */ - { 1545, 0x00008B56 }, /* GL_BOOL_ARB */ - { 1557, 0x00008B57 }, /* GL_BOOL_VEC2 */ - { 1570, 0x00008B57 }, /* GL_BOOL_VEC2_ARB */ - { 1587, 0x00008B58 }, /* GL_BOOL_VEC3 */ - { 1600, 0x00008B58 }, /* GL_BOOL_VEC3_ARB */ - { 1617, 0x00008B59 }, /* GL_BOOL_VEC4 */ - { 1630, 0x00008B59 }, /* GL_BOOL_VEC4_ARB */ - { 1647, 0x000088BB }, /* GL_BUFFER_ACCESS */ - { 1664, 0x000088BB }, /* GL_BUFFER_ACCESS_ARB */ - { 1685, 0x000088BC }, /* GL_BUFFER_MAPPED */ - { 1702, 0x000088BC }, /* GL_BUFFER_MAPPED_ARB */ - { 1723, 0x000088BD }, /* GL_BUFFER_MAP_POINTER */ - { 1745, 0x000088BD }, /* GL_BUFFER_MAP_POINTER_ARB */ - { 1771, 0x00008764 }, /* GL_BUFFER_SIZE */ - { 1786, 0x00008764 }, /* GL_BUFFER_SIZE_ARB */ - { 1805, 0x00008765 }, /* GL_BUFFER_USAGE */ - { 1821, 0x00008765 }, /* GL_BUFFER_USAGE_ARB */ - { 1841, 0x00001400 }, /* GL_BYTE */ - { 1849, 0x00002A24 }, /* GL_C3F_V3F */ - { 1860, 0x00002A26 }, /* GL_C4F_N3F_V3F */ - { 1875, 0x00002A22 }, /* GL_C4UB_V2F */ - { 1887, 0x00002A23 }, /* GL_C4UB_V3F */ - { 1899, 0x00000901 }, /* GL_CCW */ - { 1906, 0x00002900 }, /* GL_CLAMP */ - { 1915, 0x0000812D }, /* GL_CLAMP_TO_BORDER */ - { 1934, 0x0000812D }, /* GL_CLAMP_TO_BORDER_ARB */ - { 1957, 0x0000812D }, /* GL_CLAMP_TO_BORDER_SGIS */ - { 1981, 0x0000812F }, /* GL_CLAMP_TO_EDGE */ - { 1998, 0x0000812F }, /* GL_CLAMP_TO_EDGE_SGIS */ - { 2020, 0x00001500 }, /* GL_CLEAR */ - { 2029, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE */ - { 2054, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE_ARB */ - { 2083, 0xFFFFFFFF }, /* GL_CLIENT_ALL_ATTRIB_BITS */ - { 2109, 0x00000BB1 }, /* GL_CLIENT_ATTRIB_STACK_DEPTH */ - { 2138, 0x00000001 }, /* GL_CLIENT_PIXEL_STORE_BIT */ - { 2164, 0x00000002 }, /* GL_CLIENT_VERTEX_ARRAY_BIT */ - { 2191, 0x00003000 }, /* GL_CLIP_PLANE0 */ - { 2206, 0x00003001 }, /* GL_CLIP_PLANE1 */ - { 2221, 0x00003002 }, /* GL_CLIP_PLANE2 */ - { 2236, 0x00003003 }, /* GL_CLIP_PLANE3 */ - { 2251, 0x00003004 }, /* GL_CLIP_PLANE4 */ - { 2266, 0x00003005 }, /* GL_CLIP_PLANE5 */ - { 2281, 0x000080F0 }, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */ - { 2314, 0x00000A00 }, /* GL_COEFF */ - { 2323, 0x00001800 }, /* GL_COLOR */ - { 2332, 0x00008076 }, /* GL_COLOR_ARRAY */ - { 2347, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING */ - { 2377, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING_ARB */ - { 2411, 0x00008090 }, /* GL_COLOR_ARRAY_POINTER */ - { 2434, 0x00008081 }, /* GL_COLOR_ARRAY_SIZE */ - { 2454, 0x00008083 }, /* GL_COLOR_ARRAY_STRIDE */ - { 2476, 0x00008082 }, /* GL_COLOR_ARRAY_TYPE */ - { 2496, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0_EXT */ - { 2521, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10_EXT */ - { 2547, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11_EXT */ - { 2573, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12_EXT */ - { 2599, 0x00008CED }, /* GL_COLOR_ATTACHMENT13_EXT */ - { 2625, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14_EXT */ - { 2651, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15_EXT */ - { 2677, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1_EXT */ - { 2702, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2_EXT */ - { 2727, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3_EXT */ - { 2752, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4_EXT */ - { 2777, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5_EXT */ - { 2802, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6_EXT */ - { 2827, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7_EXT */ - { 2852, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8_EXT */ - { 2877, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9_EXT */ - { 2902, 0x00004000 }, /* GL_COLOR_BUFFER_BIT */ - { 2922, 0x00000C22 }, /* GL_COLOR_CLEAR_VALUE */ - { 2943, 0x00001900 }, /* GL_COLOR_INDEX */ - { 2958, 0x00001603 }, /* GL_COLOR_INDEXES */ - { 2975, 0x00000BF2 }, /* GL_COLOR_LOGIC_OP */ - { 2993, 0x00000B57 }, /* GL_COLOR_MATERIAL */ - { 3011, 0x00000B55 }, /* GL_COLOR_MATERIAL_FACE */ - { 3034, 0x00000B56 }, /* GL_COLOR_MATERIAL_PARAMETER */ - { 3062, 0x000080B1 }, /* GL_COLOR_MATRIX */ - { 3078, 0x000080B1 }, /* GL_COLOR_MATRIX_SGI */ - { 3098, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH */ - { 3126, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH_SGI */ - { 3158, 0x00008458 }, /* GL_COLOR_SUM */ - { 3171, 0x00008458 }, /* GL_COLOR_SUM_ARB */ - { 3188, 0x000080D0 }, /* GL_COLOR_TABLE */ - { 3203, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE */ - { 3229, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_EXT */ - { 3259, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_SGI */ - { 3289, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS */ - { 3309, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS_SGI */ - { 3333, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE */ - { 3358, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_EXT */ - { 3387, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_SGI */ - { 3416, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT */ - { 3438, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_EXT */ - { 3464, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_SGI */ - { 3490, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE */ - { 3516, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_EXT */ - { 3546, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_SGI */ - { 3576, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE */ - { 3606, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_EXT */ - { 3640, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_SGI */ - { 3674, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE */ - { 3704, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_EXT */ - { 3738, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_SGI */ - { 3772, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE */ - { 3796, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_EXT */ - { 3824, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_SGI */ - { 3852, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE */ - { 3873, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE_SGI */ - { 3898, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH */ - { 3919, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_EXT */ - { 3944, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_SGI */ - { 3969, 0x00000C23 }, /* GL_COLOR_WRITEMASK */ - { 3988, 0x00008570 }, /* GL_COMBINE */ - { 3999, 0x00008503 }, /* GL_COMBINE4 */ - { 4011, 0x00008572 }, /* GL_COMBINE_ALPHA */ - { 4028, 0x00008572 }, /* GL_COMBINE_ALPHA_ARB */ - { 4049, 0x00008572 }, /* GL_COMBINE_ALPHA_EXT */ - { 4070, 0x00008570 }, /* GL_COMBINE_ARB */ - { 4085, 0x00008570 }, /* GL_COMBINE_EXT */ - { 4100, 0x00008571 }, /* GL_COMBINE_RGB */ - { 4115, 0x00008571 }, /* GL_COMBINE_RGB_ARB */ - { 4134, 0x00008571 }, /* GL_COMBINE_RGB_EXT */ - { 4153, 0x0000884E }, /* GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT */ - { 4189, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE */ - { 4213, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE_ARB */ - { 4241, 0x00001300 }, /* GL_COMPILE */ - { 4252, 0x00001301 }, /* GL_COMPILE_AND_EXECUTE */ - { 4275, 0x00008B81 }, /* GL_COMPILE_STATUS */ - { 4293, 0x000084E9 }, /* GL_COMPRESSED_ALPHA */ - { 4313, 0x000084E9 }, /* GL_COMPRESSED_ALPHA_ARB */ - { 4337, 0x000084EC }, /* GL_COMPRESSED_INTENSITY */ - { 4361, 0x000084EC }, /* GL_COMPRESSED_INTENSITY_ARB */ - { 4389, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE */ - { 4413, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA */ - { 4443, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA_ARB */ - { 4477, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE_ARB */ - { 4505, 0x000084ED }, /* GL_COMPRESSED_RGB */ - { 4523, 0x000084EE }, /* GL_COMPRESSED_RGBA */ - { 4542, 0x000084EE }, /* GL_COMPRESSED_RGBA_ARB */ - { 4565, 0x000086B1 }, /* GL_COMPRESSED_RGBA_FXT1_3DFX */ - { 4594, 0x000083F1 }, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */ - { 4627, 0x000083F2 }, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */ - { 4660, 0x000083F3 }, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */ - { 4693, 0x000084ED }, /* GL_COMPRESSED_RGB_ARB */ - { 4715, 0x000086B0 }, /* GL_COMPRESSED_RGB_FXT1_3DFX */ - { 4743, 0x000083F0 }, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */ - { 4775, 0x000086A3 }, /* GL_COMPRESSED_TEXTURE_FORMATS */ - { 4805, 0x00008576 }, /* GL_CONSTANT */ - { 4817, 0x00008003 }, /* GL_CONSTANT_ALPHA */ - { 4835, 0x00008003 }, /* GL_CONSTANT_ALPHA_EXT */ - { 4857, 0x00008576 }, /* GL_CONSTANT_ARB */ - { 4873, 0x00001207 }, /* GL_CONSTANT_ATTENUATION */ - { 4897, 0x00008151 }, /* GL_CONSTANT_BORDER_HP */ - { 4919, 0x00008001 }, /* GL_CONSTANT_COLOR */ - { 4937, 0x00008001 }, /* GL_CONSTANT_COLOR_EXT */ - { 4959, 0x00008576 }, /* GL_CONSTANT_EXT */ - { 4975, 0x00008010 }, /* GL_CONVOLUTION_1D */ - { 4993, 0x00008011 }, /* GL_CONVOLUTION_2D */ - { 5011, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR */ - { 5039, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR_HP */ - { 5070, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE */ - { 5097, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE_EXT */ - { 5128, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS */ - { 5155, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS_EXT */ - { 5186, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE */ - { 5214, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE_EXT */ - { 5246, 0x00008017 }, /* GL_CONVOLUTION_FORMAT */ - { 5268, 0x00008017 }, /* GL_CONVOLUTION_FORMAT_EXT */ - { 5294, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT */ - { 5316, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT_EXT */ - { 5342, 0x00008018 }, /* GL_CONVOLUTION_WIDTH */ - { 5363, 0x00008018 }, /* GL_CONVOLUTION_WIDTH_EXT */ - { 5388, 0x00008862 }, /* GL_COORD_REPLACE */ - { 5405, 0x00008862 }, /* GL_COORD_REPLACE_ARB */ - { 5426, 0x00008862 }, /* GL_COORD_REPLACE_NV */ - { 5446, 0x00001503 }, /* GL_COPY */ - { 5454, 0x0000150C }, /* GL_COPY_INVERTED */ - { 5471, 0x00000706 }, /* GL_COPY_PIXEL_TOKEN */ - { 5491, 0x00000B44 }, /* GL_CULL_FACE */ - { 5504, 0x00000B45 }, /* GL_CULL_FACE_MODE */ - { 5522, 0x000081AA }, /* GL_CULL_VERTEX_EXT */ - { 5541, 0x000081AC }, /* GL_CULL_VERTEX_EYE_POSITION_EXT */ - { 5573, 0x000081AB }, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */ - { 5608, 0x00008626 }, /* GL_CURRENT_ATTRIB_NV */ - { 5629, 0x00000001 }, /* GL_CURRENT_BIT */ - { 5644, 0x00000B00 }, /* GL_CURRENT_COLOR */ - { 5661, 0x00008453 }, /* GL_CURRENT_FOG_COORD */ - { 5682, 0x00008453 }, /* GL_CURRENT_FOG_COORDINATE */ - { 5708, 0x00000B01 }, /* GL_CURRENT_INDEX */ - { 5725, 0x00008641 }, /* GL_CURRENT_MATRIX_ARB */ - { 5747, 0x00008845 }, /* GL_CURRENT_MATRIX_INDEX_ARB */ - { 5775, 0x00008641 }, /* GL_CURRENT_MATRIX_NV */ - { 5796, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */ - { 5830, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_NV */ - { 5863, 0x00000B02 }, /* GL_CURRENT_NORMAL */ - { 5881, 0x00008843 }, /* GL_CURRENT_PALETTE_MATRIX_ARB */ - { 5911, 0x00008B8D }, /* GL_CURRENT_PROGRAM */ - { 5930, 0x00008865 }, /* GL_CURRENT_QUERY */ - { 5947, 0x00008865 }, /* GL_CURRENT_QUERY_ARB */ - { 5968, 0x00000B04 }, /* GL_CURRENT_RASTER_COLOR */ - { 5992, 0x00000B09 }, /* GL_CURRENT_RASTER_DISTANCE */ - { 6019, 0x00000B05 }, /* GL_CURRENT_RASTER_INDEX */ - { 6043, 0x00000B07 }, /* GL_CURRENT_RASTER_POSITION */ - { 6070, 0x00000B08 }, /* GL_CURRENT_RASTER_POSITION_VALID */ - { 6103, 0x00000B06 }, /* GL_CURRENT_RASTER_TEXTURE_COORDS */ - { 6136, 0x00008459 }, /* GL_CURRENT_SECONDARY_COLOR */ - { 6163, 0x00000B03 }, /* GL_CURRENT_TEXTURE_COORDS */ - { 6189, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB */ - { 6214, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB_ARB */ - { 6243, 0x000086A8 }, /* GL_CURRENT_WEIGHT_ARB */ - { 6265, 0x00000900 }, /* GL_CW */ - { 6271, 0x0000875B }, /* GL_DEBUG_ASSERT_MESA */ - { 6292, 0x00008759 }, /* GL_DEBUG_OBJECT_MESA */ - { 6313, 0x0000875A }, /* GL_DEBUG_PRINT_MESA */ - { 6333, 0x00002101 }, /* GL_DECAL */ - { 6342, 0x00001E03 }, /* GL_DECR */ - { 6350, 0x00008508 }, /* GL_DECR_WRAP */ - { 6363, 0x00008508 }, /* GL_DECR_WRAP_EXT */ - { 6380, 0x00008B80 }, /* GL_DELETE_STATUS */ - { 6397, 0x00001801 }, /* GL_DEPTH */ - { 6406, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT_EXT */ - { 6430, 0x00000D1F }, /* GL_DEPTH_BIAS */ - { 6444, 0x00000D56 }, /* GL_DEPTH_BITS */ - { 6458, 0x00008891 }, /* GL_DEPTH_BOUNDS_EXT */ - { 6478, 0x00008890 }, /* GL_DEPTH_BOUNDS_TEST_EXT */ - { 6503, 0x00000100 }, /* GL_DEPTH_BUFFER_BIT */ - { 6523, 0x0000864F }, /* GL_DEPTH_CLAMP_NV */ - { 6541, 0x00000B73 }, /* GL_DEPTH_CLEAR_VALUE */ - { 6562, 0x00001902 }, /* GL_DEPTH_COMPONENT */ - { 6581, 0x000081A5 }, /* GL_DEPTH_COMPONENT16 */ - { 6602, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_ARB */ - { 6627, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_SGIX */ - { 6653, 0x000081A6 }, /* GL_DEPTH_COMPONENT24 */ - { 6674, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_ARB */ - { 6699, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_SGIX */ - { 6725, 0x000081A7 }, /* GL_DEPTH_COMPONENT32 */ - { 6746, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_ARB */ - { 6771, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_SGIX */ - { 6797, 0x00000B74 }, /* GL_DEPTH_FUNC */ - { 6811, 0x00000B70 }, /* GL_DEPTH_RANGE */ - { 6826, 0x00000D1E }, /* GL_DEPTH_SCALE */ - { 6841, 0x000084F9 }, /* GL_DEPTH_STENCIL_NV */ - { 6861, 0x0000886F }, /* GL_DEPTH_STENCIL_TO_BGRA_NV */ - { 6889, 0x0000886E }, /* GL_DEPTH_STENCIL_TO_RGBA_NV */ - { 6917, 0x00000B71 }, /* GL_DEPTH_TEST */ - { 6931, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE */ - { 6953, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE_ARB */ - { 6979, 0x00000B72 }, /* GL_DEPTH_WRITEMASK */ - { 6998, 0x00001201 }, /* GL_DIFFUSE */ - { 7009, 0x00000BD0 }, /* GL_DITHER */ - { 7019, 0x00000A02 }, /* GL_DOMAIN */ - { 7029, 0x00001100 }, /* GL_DONT_CARE */ - { 7042, 0x000086AE }, /* GL_DOT3_RGB */ - { 7054, 0x000086AF }, /* GL_DOT3_RGBA */ - { 7067, 0x000086AF }, /* GL_DOT3_RGBA_ARB */ - { 7084, 0x00008741 }, /* GL_DOT3_RGBA_EXT */ - { 7101, 0x000086AE }, /* GL_DOT3_RGB_ARB */ - { 7117, 0x00008740 }, /* GL_DOT3_RGB_EXT */ - { 7133, 0x0000140A }, /* GL_DOUBLE */ - { 7143, 0x00000C32 }, /* GL_DOUBLEBUFFER */ - { 7159, 0x00000C01 }, /* GL_DRAW_BUFFER */ - { 7174, 0x00008825 }, /* GL_DRAW_BUFFER0 */ - { 7190, 0x00008825 }, /* GL_DRAW_BUFFER0_ARB */ - { 7210, 0x00008825 }, /* GL_DRAW_BUFFER0_ATI */ - { 7230, 0x00008826 }, /* GL_DRAW_BUFFER1 */ - { 7246, 0x0000882F }, /* GL_DRAW_BUFFER10 */ - { 7263, 0x0000882F }, /* GL_DRAW_BUFFER10_ARB */ - { 7284, 0x0000882F }, /* GL_DRAW_BUFFER10_ATI */ - { 7305, 0x00008830 }, /* GL_DRAW_BUFFER11 */ - { 7322, 0x00008830 }, /* GL_DRAW_BUFFER11_ARB */ - { 7343, 0x00008830 }, /* GL_DRAW_BUFFER11_ATI */ - { 7364, 0x00008831 }, /* GL_DRAW_BUFFER12 */ - { 7381, 0x00008831 }, /* GL_DRAW_BUFFER12_ARB */ - { 7402, 0x00008831 }, /* GL_DRAW_BUFFER12_ATI */ - { 7423, 0x00008832 }, /* GL_DRAW_BUFFER13 */ - { 7440, 0x00008832 }, /* GL_DRAW_BUFFER13_ARB */ - { 7461, 0x00008832 }, /* GL_DRAW_BUFFER13_ATI */ - { 7482, 0x00008833 }, /* GL_DRAW_BUFFER14 */ - { 7499, 0x00008833 }, /* GL_DRAW_BUFFER14_ARB */ - { 7520, 0x00008833 }, /* GL_DRAW_BUFFER14_ATI */ - { 7541, 0x00008834 }, /* GL_DRAW_BUFFER15 */ - { 7558, 0x00008834 }, /* GL_DRAW_BUFFER15_ARB */ - { 7579, 0x00008834 }, /* GL_DRAW_BUFFER15_ATI */ - { 7600, 0x00008826 }, /* GL_DRAW_BUFFER1_ARB */ - { 7620, 0x00008826 }, /* GL_DRAW_BUFFER1_ATI */ - { 7640, 0x00008827 }, /* GL_DRAW_BUFFER2 */ - { 7656, 0x00008827 }, /* GL_DRAW_BUFFER2_ARB */ - { 7676, 0x00008827 }, /* GL_DRAW_BUFFER2_ATI */ - { 7696, 0x00008828 }, /* GL_DRAW_BUFFER3 */ - { 7712, 0x00008828 }, /* GL_DRAW_BUFFER3_ARB */ - { 7732, 0x00008828 }, /* GL_DRAW_BUFFER3_ATI */ - { 7752, 0x00008829 }, /* GL_DRAW_BUFFER4 */ - { 7768, 0x00008829 }, /* GL_DRAW_BUFFER4_ARB */ - { 7788, 0x00008829 }, /* GL_DRAW_BUFFER4_ATI */ - { 7808, 0x0000882A }, /* GL_DRAW_BUFFER5 */ - { 7824, 0x0000882A }, /* GL_DRAW_BUFFER5_ARB */ - { 7844, 0x0000882A }, /* GL_DRAW_BUFFER5_ATI */ - { 7864, 0x0000882B }, /* GL_DRAW_BUFFER6 */ - { 7880, 0x0000882B }, /* GL_DRAW_BUFFER6_ARB */ - { 7900, 0x0000882B }, /* GL_DRAW_BUFFER6_ATI */ - { 7920, 0x0000882C }, /* GL_DRAW_BUFFER7 */ - { 7936, 0x0000882C }, /* GL_DRAW_BUFFER7_ARB */ - { 7956, 0x0000882C }, /* GL_DRAW_BUFFER7_ATI */ - { 7976, 0x0000882D }, /* GL_DRAW_BUFFER8 */ - { 7992, 0x0000882D }, /* GL_DRAW_BUFFER8_ARB */ - { 8012, 0x0000882D }, /* GL_DRAW_BUFFER8_ATI */ - { 8032, 0x0000882E }, /* GL_DRAW_BUFFER9 */ - { 8048, 0x0000882E }, /* GL_DRAW_BUFFER9_ARB */ - { 8068, 0x0000882E }, /* GL_DRAW_BUFFER9_ATI */ - { 8088, 0x00008CA6 }, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */ - { 8120, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER_EXT */ - { 8144, 0x00000705 }, /* GL_DRAW_PIXEL_TOKEN */ - { 8164, 0x00000304 }, /* GL_DST_ALPHA */ - { 8177, 0x00000306 }, /* GL_DST_COLOR */ - { 8190, 0x000088EA }, /* GL_DYNAMIC_COPY */ - { 8206, 0x000088EA }, /* GL_DYNAMIC_COPY_ARB */ - { 8226, 0x000088E8 }, /* GL_DYNAMIC_DRAW */ - { 8242, 0x000088E8 }, /* GL_DYNAMIC_DRAW_ARB */ - { 8262, 0x000088E9 }, /* GL_DYNAMIC_READ */ - { 8278, 0x000088E9 }, /* GL_DYNAMIC_READ_ARB */ - { 8298, 0x00000B43 }, /* GL_EDGE_FLAG */ - { 8311, 0x00008079 }, /* GL_EDGE_FLAG_ARRAY */ - { 8330, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */ - { 8364, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB */ - { 8402, 0x00008093 }, /* GL_EDGE_FLAG_ARRAY_POINTER */ - { 8429, 0x0000808C }, /* GL_EDGE_FLAG_ARRAY_STRIDE */ - { 8455, 0x00008893 }, /* GL_ELEMENT_ARRAY_BUFFER */ - { 8479, 0x00008893 }, /* GL_ELEMENT_ARRAY_BUFFER_ARB */ - { 8507, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */ - { 8539, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB */ - { 8575, 0x00001600 }, /* GL_EMISSION */ - { 8587, 0x00002000 }, /* GL_ENABLE_BIT */ - { 8601, 0x00000202 }, /* GL_EQUAL */ - { 8610, 0x00001509 }, /* GL_EQUIV */ - { 8619, 0x00010000 }, /* GL_EVAL_BIT */ - { 8631, 0x00000800 }, /* GL_EXP */ - { 8638, 0x00000801 }, /* GL_EXP2 */ - { 8646, 0x00001F03 }, /* GL_EXTENSIONS */ - { 8660, 0x00002400 }, /* GL_EYE_LINEAR */ - { 8674, 0x00002502 }, /* GL_EYE_PLANE */ - { 8687, 0x0000855C }, /* GL_EYE_PLANE_ABSOLUTE_NV */ - { 8712, 0x0000855B }, /* GL_EYE_RADIAL_NV */ - { 8729, 0x00000000 }, /* GL_FALSE */ - { 8738, 0x00001101 }, /* GL_FASTEST */ - { 8749, 0x00001C01 }, /* GL_FEEDBACK */ - { 8761, 0x00000DF0 }, /* GL_FEEDBACK_BUFFER_POINTER */ - { 8788, 0x00000DF1 }, /* GL_FEEDBACK_BUFFER_SIZE */ - { 8812, 0x00000DF2 }, /* GL_FEEDBACK_BUFFER_TYPE */ - { 8836, 0x00001B02 }, /* GL_FILL */ - { 8844, 0x00001D00 }, /* GL_FLAT */ - { 8852, 0x00001406 }, /* GL_FLOAT */ - { 8861, 0x00008B5A }, /* GL_FLOAT_MAT2 */ - { 8875, 0x00008B5A }, /* GL_FLOAT_MAT2_ARB */ - { 8893, 0x00008B5B }, /* GL_FLOAT_MAT3 */ - { 8907, 0x00008B5B }, /* GL_FLOAT_MAT3_ARB */ - { 8925, 0x00008B5C }, /* GL_FLOAT_MAT4 */ - { 8939, 0x00008B5C }, /* GL_FLOAT_MAT4_ARB */ - { 8957, 0x00008B50 }, /* GL_FLOAT_VEC2 */ - { 8971, 0x00008B50 }, /* GL_FLOAT_VEC2_ARB */ - { 8989, 0x00008B51 }, /* GL_FLOAT_VEC3 */ - { 9003, 0x00008B51 }, /* GL_FLOAT_VEC3_ARB */ - { 9021, 0x00008B52 }, /* GL_FLOAT_VEC4 */ - { 9035, 0x00008B52 }, /* GL_FLOAT_VEC4_ARB */ - { 9053, 0x00000B60 }, /* GL_FOG */ - { 9060, 0x00000080 }, /* GL_FOG_BIT */ - { 9071, 0x00000B66 }, /* GL_FOG_COLOR */ - { 9084, 0x00008451 }, /* GL_FOG_COORD */ - { 9097, 0x00008451 }, /* GL_FOG_COORDINATE */ - { 9115, 0x00008457 }, /* GL_FOG_COORDINATE_ARRAY */ - { 9139, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */ - { 9178, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB */ - { 9221, 0x00008456 }, /* GL_FOG_COORDINATE_ARRAY_POINTER */ - { 9253, 0x00008455 }, /* GL_FOG_COORDINATE_ARRAY_STRIDE */ - { 9284, 0x00008454 }, /* GL_FOG_COORDINATE_ARRAY_TYPE */ - { 9313, 0x00008450 }, /* GL_FOG_COORDINATE_SOURCE */ - { 9338, 0x00008457 }, /* GL_FOG_COORD_ARRAY */ - { 9357, 0x0000889D }, /* GL_FOG_COORD_ARRAY_BUFFER_BINDING */ - { 9391, 0x00008456 }, /* GL_FOG_COORD_ARRAY_POINTER */ - { 9418, 0x00008455 }, /* GL_FOG_COORD_ARRAY_STRIDE */ - { 9444, 0x00008454 }, /* GL_FOG_COORD_ARRAY_TYPE */ - { 9468, 0x00008450 }, /* GL_FOG_COORD_SRC */ - { 9485, 0x00000B62 }, /* GL_FOG_DENSITY */ - { 9500, 0x0000855A }, /* GL_FOG_DISTANCE_MODE_NV */ - { 9524, 0x00000B64 }, /* GL_FOG_END */ - { 9535, 0x00000C54 }, /* GL_FOG_HINT */ - { 9547, 0x00000B61 }, /* GL_FOG_INDEX */ - { 9560, 0x00000B65 }, /* GL_FOG_MODE */ - { 9572, 0x00008198 }, /* GL_FOG_OFFSET_SGIX */ - { 9591, 0x00008199 }, /* GL_FOG_OFFSET_VALUE_SGIX */ - { 9616, 0x00000B63 }, /* GL_FOG_START */ - { 9629, 0x00008452 }, /* GL_FRAGMENT_DEPTH */ - { 9647, 0x00008804 }, /* GL_FRAGMENT_PROGRAM_ARB */ - { 9671, 0x00008B30 }, /* GL_FRAGMENT_SHADER */ - { 9690, 0x00008B30 }, /* GL_FRAGMENT_SHADER_ARB */ - { 9713, 0x00008B8B }, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */ - { 9748, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT */ - { 9790, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT */ - { 9832, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT */ - { 9881, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT */ - { 9933, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ - { 9977, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT */ - { 10021, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING_EXT */ - { 10048, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE_EXT */ - { 10076, 0x00008D40 }, /* GL_FRAMEBUFFER_EXT */ - { 10095, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT */ - { 10136, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */ - { 10177, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */ - { 10219, 0x00008CD8 }, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */ - { 10270, 0x00008CDA }, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */ - { 10308, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT */ - { 10357, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */ - { 10399, 0x00008CDE }, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */ - { 10431, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED_EXT */ - { 10462, 0x00000404 }, /* GL_FRONT */ - { 10471, 0x00000408 }, /* GL_FRONT_AND_BACK */ - { 10489, 0x00000B46 }, /* GL_FRONT_FACE */ - { 10503, 0x00000400 }, /* GL_FRONT_LEFT */ - { 10517, 0x00000401 }, /* GL_FRONT_RIGHT */ - { 10532, 0x00008006 }, /* GL_FUNC_ADD */ - { 10544, 0x00008006 }, /* GL_FUNC_ADD_EXT */ - { 10560, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT */ - { 10585, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT_EXT */ - { 10614, 0x0000800A }, /* GL_FUNC_SUBTRACT */ - { 10631, 0x0000800A }, /* GL_FUNC_SUBTRACT_EXT */ - { 10652, 0x00008191 }, /* GL_GENERATE_MIPMAP */ - { 10671, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT */ - { 10695, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT_SGIS */ - { 10724, 0x00008191 }, /* GL_GENERATE_MIPMAP_SGIS */ - { 10748, 0x00000206 }, /* GL_GEQUAL */ - { 10758, 0x00008009 }, /* GL_GL_BLEND_EQUATION_RGB */ - { 10783, 0x00008C4A }, /* GL_GL_COMPRESSED_SLUMINANCE */ - { 10811, 0x00008C4B }, /* GL_GL_COMPRESSED_SLUMINANCE_ALPHA */ - { 10845, 0x00008C48 }, /* GL_GL_COMPRESSED_SRGB */ - { 10867, 0x00008C49 }, /* GL_GL_COMPRESSED_SRGB_ALPHA */ - { 10895, 0x0000845F }, /* GL_GL_CURRENT_RASTER_SECONDARY_COLOR */ - { 10932, 0x00008B65 }, /* GL_GL_FLOAT_MAT2x3 */ - { 10951, 0x00008B66 }, /* GL_GL_FLOAT_MAT2x4 */ - { 10970, 0x00008B67 }, /* GL_GL_FLOAT_MAT3x2 */ - { 10989, 0x00008B68 }, /* GL_GL_FLOAT_MAT3x4 */ - { 11008, 0x00008B69 }, /* GL_GL_FLOAT_MAT4x2 */ - { 11027, 0x00008B6A }, /* GL_GL_FLOAT_MAT4x3 */ - { 11046, 0x000088EB }, /* GL_GL_PIXEL_PACK_BUFFER */ - { 11070, 0x000088ED }, /* GL_GL_PIXEL_PACK_BUFFER_BINDING */ - { 11102, 0x000088EC }, /* GL_GL_PIXEL_UNPACK_BUFFER */ - { 11128, 0x000088EF }, /* GL_GL_PIXEL_UNPACK_BUFFER_BINDING */ - { 11162, 0x00008C46 }, /* GL_GL_SLUMINANCE */ - { 11179, 0x00008C47 }, /* GL_GL_SLUMINANCE8 */ - { 11197, 0x00008C45 }, /* GL_GL_SLUMINANCE8_ALPHA8 */ - { 11222, 0x00008C44 }, /* GL_GL_SLUMINANCE_ALPHA */ - { 11245, 0x00008C40 }, /* GL_GL_SRGB */ - { 11256, 0x00008C41 }, /* GL_GL_SRGB8 */ - { 11268, 0x00008C43 }, /* GL_GL_SRGB8_ALPHA8 */ - { 11287, 0x00008C42 }, /* GL_GL_SRGB_ALPHA */ - { 11304, 0x00000204 }, /* GL_GREATER */ - { 11315, 0x00001904 }, /* GL_GREEN */ - { 11324, 0x00000D19 }, /* GL_GREEN_BIAS */ - { 11338, 0x00000D53 }, /* GL_GREEN_BITS */ - { 11352, 0x00000D18 }, /* GL_GREEN_SCALE */ - { 11367, 0x00008000 }, /* GL_HINT_BIT */ - { 11379, 0x00008024 }, /* GL_HISTOGRAM */ - { 11392, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE */ - { 11416, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE_EXT */ - { 11444, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE */ - { 11467, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE_EXT */ - { 11494, 0x00008024 }, /* GL_HISTOGRAM_EXT */ - { 11511, 0x00008027 }, /* GL_HISTOGRAM_FORMAT */ - { 11531, 0x00008027 }, /* GL_HISTOGRAM_FORMAT_EXT */ - { 11555, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE */ - { 11579, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE_EXT */ - { 11607, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE */ - { 11635, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE_EXT */ - { 11667, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE */ - { 11689, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE_EXT */ - { 11715, 0x0000802D }, /* GL_HISTOGRAM_SINK */ - { 11733, 0x0000802D }, /* GL_HISTOGRAM_SINK_EXT */ - { 11755, 0x00008026 }, /* GL_HISTOGRAM_WIDTH */ - { 11774, 0x00008026 }, /* GL_HISTOGRAM_WIDTH_EXT */ - { 11797, 0x0000862A }, /* GL_IDENTITY_NV */ - { 11812, 0x00008150 }, /* GL_IGNORE_BORDER_HP */ - { 11832, 0x00008B9B }, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */ - { 11872, 0x00008B9A }, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */ - { 11910, 0x00001E02 }, /* GL_INCR */ - { 11918, 0x00008507 }, /* GL_INCR_WRAP */ - { 11931, 0x00008507 }, /* GL_INCR_WRAP_EXT */ - { 11948, 0x00008077 }, /* GL_INDEX_ARRAY */ - { 11963, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING */ - { 11993, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING_ARB */ - { 12027, 0x00008091 }, /* GL_INDEX_ARRAY_POINTER */ - { 12050, 0x00008086 }, /* GL_INDEX_ARRAY_STRIDE */ - { 12072, 0x00008085 }, /* GL_INDEX_ARRAY_TYPE */ - { 12092, 0x00000D51 }, /* GL_INDEX_BITS */ - { 12106, 0x00000C20 }, /* GL_INDEX_CLEAR_VALUE */ - { 12127, 0x00000BF1 }, /* GL_INDEX_LOGIC_OP */ - { 12145, 0x00000C30 }, /* GL_INDEX_MODE */ - { 12159, 0x00000D13 }, /* GL_INDEX_OFFSET */ - { 12175, 0x00000D12 }, /* GL_INDEX_SHIFT */ - { 12190, 0x00000C21 }, /* GL_INDEX_WRITEMASK */ - { 12209, 0x00008B84 }, /* GL_INFO_LOG_LENGTH */ - { 12228, 0x00001404 }, /* GL_INT */ - { 12235, 0x00008049 }, /* GL_INTENSITY */ - { 12248, 0x0000804C }, /* GL_INTENSITY12 */ - { 12263, 0x0000804C }, /* GL_INTENSITY12_EXT */ - { 12282, 0x0000804D }, /* GL_INTENSITY16 */ - { 12297, 0x0000804D }, /* GL_INTENSITY16_EXT */ - { 12316, 0x0000804A }, /* GL_INTENSITY4 */ - { 12330, 0x0000804A }, /* GL_INTENSITY4_EXT */ - { 12348, 0x0000804B }, /* GL_INTENSITY8 */ - { 12362, 0x0000804B }, /* GL_INTENSITY8_EXT */ - { 12380, 0x00008049 }, /* GL_INTENSITY_EXT */ - { 12397, 0x00008575 }, /* GL_INTERPOLATE */ - { 12412, 0x00008575 }, /* GL_INTERPOLATE_ARB */ - { 12431, 0x00008575 }, /* GL_INTERPOLATE_EXT */ - { 12450, 0x00008B53 }, /* GL_INT_VEC2 */ - { 12462, 0x00008B53 }, /* GL_INT_VEC2_ARB */ - { 12478, 0x00008B54 }, /* GL_INT_VEC3 */ - { 12490, 0x00008B54 }, /* GL_INT_VEC3_ARB */ - { 12506, 0x00008B55 }, /* GL_INT_VEC4 */ - { 12518, 0x00008B55 }, /* GL_INT_VEC4_ARB */ - { 12534, 0x00000500 }, /* GL_INVALID_ENUM */ - { 12550, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION_EXT */ - { 12587, 0x00000502 }, /* GL_INVALID_OPERATION */ - { 12608, 0x00000501 }, /* GL_INVALID_VALUE */ - { 12625, 0x0000862B }, /* GL_INVERSE_NV */ - { 12639, 0x0000862D }, /* GL_INVERSE_TRANSPOSE_NV */ - { 12663, 0x0000150A }, /* GL_INVERT */ - { 12673, 0x00001E00 }, /* GL_KEEP */ - { 12681, 0x00000406 }, /* GL_LEFT */ - { 12689, 0x00000203 }, /* GL_LEQUAL */ - { 12699, 0x00000201 }, /* GL_LESS */ - { 12707, 0x00004000 }, /* GL_LIGHT0 */ - { 12717, 0x00004001 }, /* GL_LIGHT1 */ - { 12727, 0x00004002 }, /* GL_LIGHT2 */ - { 12737, 0x00004003 }, /* GL_LIGHT3 */ - { 12747, 0x00004004 }, /* GL_LIGHT4 */ - { 12757, 0x00004005 }, /* GL_LIGHT5 */ - { 12767, 0x00004006 }, /* GL_LIGHT6 */ - { 12777, 0x00004007 }, /* GL_LIGHT7 */ - { 12787, 0x00000B50 }, /* GL_LIGHTING */ - { 12799, 0x00000040 }, /* GL_LIGHTING_BIT */ - { 12815, 0x00000B53 }, /* GL_LIGHT_MODEL_AMBIENT */ - { 12838, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL */ - { 12867, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL_EXT */ - { 12900, 0x00000B51 }, /* GL_LIGHT_MODEL_LOCAL_VIEWER */ - { 12928, 0x00000B52 }, /* GL_LIGHT_MODEL_TWO_SIDE */ - { 12952, 0x00001B01 }, /* GL_LINE */ - { 12960, 0x00002601 }, /* GL_LINEAR */ - { 12970, 0x00001208 }, /* GL_LINEAR_ATTENUATION */ - { 12992, 0x00008170 }, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */ - { 13022, 0x0000844F }, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */ - { 13053, 0x00002703 }, /* GL_LINEAR_MIPMAP_LINEAR */ - { 13077, 0x00002701 }, /* GL_LINEAR_MIPMAP_NEAREST */ - { 13102, 0x00000001 }, /* GL_LINES */ - { 13111, 0x00000004 }, /* GL_LINE_BIT */ - { 13123, 0x00000002 }, /* GL_LINE_LOOP */ - { 13136, 0x00000707 }, /* GL_LINE_RESET_TOKEN */ - { 13156, 0x00000B20 }, /* GL_LINE_SMOOTH */ - { 13171, 0x00000C52 }, /* GL_LINE_SMOOTH_HINT */ - { 13191, 0x00000B24 }, /* GL_LINE_STIPPLE */ - { 13207, 0x00000B25 }, /* GL_LINE_STIPPLE_PATTERN */ - { 13231, 0x00000B26 }, /* GL_LINE_STIPPLE_REPEAT */ - { 13254, 0x00000003 }, /* GL_LINE_STRIP */ - { 13268, 0x00000702 }, /* GL_LINE_TOKEN */ - { 13282, 0x00000B21 }, /* GL_LINE_WIDTH */ - { 13296, 0x00000B23 }, /* GL_LINE_WIDTH_GRANULARITY */ - { 13322, 0x00000B22 }, /* GL_LINE_WIDTH_RANGE */ - { 13342, 0x00008B82 }, /* GL_LINK_STATUS */ - { 13357, 0x00000B32 }, /* GL_LIST_BASE */ - { 13370, 0x00020000 }, /* GL_LIST_BIT */ - { 13382, 0x00000B33 }, /* GL_LIST_INDEX */ - { 13396, 0x00000B30 }, /* GL_LIST_MODE */ - { 13409, 0x00000101 }, /* GL_LOAD */ - { 13417, 0x00000BF1 }, /* GL_LOGIC_OP */ - { 13429, 0x00000BF0 }, /* GL_LOGIC_OP_MODE */ - { 13446, 0x00008CA1 }, /* GL_LOWER_LEFT */ - { 13460, 0x00001909 }, /* GL_LUMINANCE */ - { 13473, 0x00008041 }, /* GL_LUMINANCE12 */ - { 13488, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12 */ - { 13511, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12_EXT */ - { 13538, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4 */ - { 13560, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4_EXT */ - { 13586, 0x00008041 }, /* GL_LUMINANCE12_EXT */ - { 13605, 0x00008042 }, /* GL_LUMINANCE16 */ - { 13620, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16 */ - { 13643, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16_EXT */ - { 13670, 0x00008042 }, /* GL_LUMINANCE16_EXT */ - { 13689, 0x0000803F }, /* GL_LUMINANCE4 */ - { 13703, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4 */ - { 13724, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4_EXT */ - { 13749, 0x0000803F }, /* GL_LUMINANCE4_EXT */ - { 13767, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2 */ - { 13788, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2_EXT */ - { 13813, 0x00008040 }, /* GL_LUMINANCE8 */ - { 13827, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8 */ - { 13848, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8_EXT */ - { 13873, 0x00008040 }, /* GL_LUMINANCE8_EXT */ - { 13891, 0x0000190A }, /* GL_LUMINANCE_ALPHA */ - { 13910, 0x00000D90 }, /* GL_MAP1_COLOR_4 */ - { 13926, 0x00000DD0 }, /* GL_MAP1_GRID_DOMAIN */ - { 13946, 0x00000DD1 }, /* GL_MAP1_GRID_SEGMENTS */ - { 13968, 0x00000D91 }, /* GL_MAP1_INDEX */ - { 13982, 0x00000D92 }, /* GL_MAP1_NORMAL */ - { 13997, 0x00000D93 }, /* GL_MAP1_TEXTURE_COORD_1 */ - { 14021, 0x00000D94 }, /* GL_MAP1_TEXTURE_COORD_2 */ - { 14045, 0x00000D95 }, /* GL_MAP1_TEXTURE_COORD_3 */ - { 14069, 0x00000D96 }, /* GL_MAP1_TEXTURE_COORD_4 */ - { 14093, 0x00000D97 }, /* GL_MAP1_VERTEX_3 */ - { 14110, 0x00000D98 }, /* GL_MAP1_VERTEX_4 */ - { 14127, 0x00008660 }, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */ - { 14155, 0x0000866A }, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */ - { 14184, 0x0000866B }, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */ - { 14213, 0x0000866C }, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */ - { 14242, 0x0000866D }, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */ - { 14271, 0x0000866E }, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */ - { 14300, 0x0000866F }, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */ - { 14329, 0x00008661 }, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */ - { 14357, 0x00008662 }, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */ - { 14385, 0x00008663 }, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */ - { 14413, 0x00008664 }, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */ - { 14441, 0x00008665 }, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */ - { 14469, 0x00008666 }, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */ - { 14497, 0x00008667 }, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */ - { 14525, 0x00008668 }, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */ - { 14553, 0x00008669 }, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */ - { 14581, 0x00000DB0 }, /* GL_MAP2_COLOR_4 */ - { 14597, 0x00000DD2 }, /* GL_MAP2_GRID_DOMAIN */ - { 14617, 0x00000DD3 }, /* GL_MAP2_GRID_SEGMENTS */ - { 14639, 0x00000DB1 }, /* GL_MAP2_INDEX */ - { 14653, 0x00000DB2 }, /* GL_MAP2_NORMAL */ - { 14668, 0x00000DB3 }, /* GL_MAP2_TEXTURE_COORD_1 */ - { 14692, 0x00000DB4 }, /* GL_MAP2_TEXTURE_COORD_2 */ - { 14716, 0x00000DB5 }, /* GL_MAP2_TEXTURE_COORD_3 */ - { 14740, 0x00000DB6 }, /* GL_MAP2_TEXTURE_COORD_4 */ - { 14764, 0x00000DB7 }, /* GL_MAP2_VERTEX_3 */ - { 14781, 0x00000DB8 }, /* GL_MAP2_VERTEX_4 */ - { 14798, 0x00008670 }, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */ - { 14826, 0x0000867A }, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */ - { 14855, 0x0000867B }, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */ - { 14884, 0x0000867C }, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */ - { 14913, 0x0000867D }, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */ - { 14942, 0x0000867E }, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */ - { 14971, 0x0000867F }, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */ - { 15000, 0x00008671 }, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */ - { 15028, 0x00008672 }, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */ - { 15056, 0x00008673 }, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */ - { 15084, 0x00008674 }, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */ - { 15112, 0x00008675 }, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */ - { 15140, 0x00008676 }, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */ - { 15168, 0x00008677 }, /* GL_MAP2_VERTEX_ATTRIB7_4_NV */ - { 15196, 0x00008678 }, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */ - { 15224, 0x00008679 }, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */ - { 15252, 0x00000D10 }, /* GL_MAP_COLOR */ - { 15265, 0x00000D11 }, /* GL_MAP_STENCIL */ - { 15280, 0x000088C0 }, /* GL_MATRIX0_ARB */ - { 15295, 0x00008630 }, /* GL_MATRIX0_NV */ - { 15309, 0x000088CA }, /* GL_MATRIX10_ARB */ - { 15325, 0x000088CB }, /* GL_MATRIX11_ARB */ - { 15341, 0x000088CC }, /* GL_MATRIX12_ARB */ - { 15357, 0x000088CD }, /* GL_MATRIX13_ARB */ - { 15373, 0x000088CE }, /* GL_MATRIX14_ARB */ - { 15389, 0x000088CF }, /* GL_MATRIX15_ARB */ - { 15405, 0x000088D0 }, /* GL_MATRIX16_ARB */ - { 15421, 0x000088D1 }, /* GL_MATRIX17_ARB */ - { 15437, 0x000088D2 }, /* GL_MATRIX18_ARB */ - { 15453, 0x000088D3 }, /* GL_MATRIX19_ARB */ - { 15469, 0x000088C1 }, /* GL_MATRIX1_ARB */ - { 15484, 0x00008631 }, /* GL_MATRIX1_NV */ - { 15498, 0x000088D4 }, /* GL_MATRIX20_ARB */ - { 15514, 0x000088D5 }, /* GL_MATRIX21_ARB */ - { 15530, 0x000088D6 }, /* GL_MATRIX22_ARB */ - { 15546, 0x000088D7 }, /* GL_MATRIX23_ARB */ - { 15562, 0x000088D8 }, /* GL_MATRIX24_ARB */ - { 15578, 0x000088D9 }, /* GL_MATRIX25_ARB */ - { 15594, 0x000088DA }, /* GL_MATRIX26_ARB */ - { 15610, 0x000088DB }, /* GL_MATRIX27_ARB */ - { 15626, 0x000088DC }, /* GL_MATRIX28_ARB */ - { 15642, 0x000088DD }, /* GL_MATRIX29_ARB */ - { 15658, 0x000088C2 }, /* GL_MATRIX2_ARB */ - { 15673, 0x00008632 }, /* GL_MATRIX2_NV */ - { 15687, 0x000088DE }, /* GL_MATRIX30_ARB */ - { 15703, 0x000088DF }, /* GL_MATRIX31_ARB */ - { 15719, 0x000088C3 }, /* GL_MATRIX3_ARB */ - { 15734, 0x00008633 }, /* GL_MATRIX3_NV */ - { 15748, 0x000088C4 }, /* GL_MATRIX4_ARB */ - { 15763, 0x00008634 }, /* GL_MATRIX4_NV */ - { 15777, 0x000088C5 }, /* GL_MATRIX5_ARB */ - { 15792, 0x00008635 }, /* GL_MATRIX5_NV */ - { 15806, 0x000088C6 }, /* GL_MATRIX6_ARB */ - { 15821, 0x00008636 }, /* GL_MATRIX6_NV */ - { 15835, 0x000088C7 }, /* GL_MATRIX7_ARB */ - { 15850, 0x00008637 }, /* GL_MATRIX7_NV */ - { 15864, 0x000088C8 }, /* GL_MATRIX8_ARB */ - { 15879, 0x000088C9 }, /* GL_MATRIX9_ARB */ - { 15894, 0x00008844 }, /* GL_MATRIX_INDEX_ARRAY_ARB */ - { 15920, 0x00008849 }, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */ - { 15954, 0x00008846 }, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */ - { 15985, 0x00008848 }, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */ - { 16018, 0x00008847 }, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */ - { 16049, 0x00000BA0 }, /* GL_MATRIX_MODE */ - { 16064, 0x00008840 }, /* GL_MATRIX_PALETTE_ARB */ - { 16086, 0x00008008 }, /* GL_MAX */ - { 16093, 0x00008073 }, /* GL_MAX_3D_TEXTURE_SIZE */ - { 16116, 0x000088FF }, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */ - { 16148, 0x00000D35 }, /* GL_MAX_ATTRIB_STACK_DEPTH */ - { 16174, 0x00000D3B }, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */ - { 16207, 0x00008177 }, /* GL_MAX_CLIPMAP_DEPTH_SGIX */ - { 16233, 0x00008178 }, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */ - { 16267, 0x00000D32 }, /* GL_MAX_CLIP_PLANES */ - { 16286, 0x00008CDF }, /* GL_MAX_COLOR_ATTACHMENTS_EXT */ - { 16315, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */ - { 16347, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI */ - { 16383, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */ - { 16419, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB */ - { 16459, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT */ - { 16485, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT_EXT */ - { 16515, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH */ - { 16540, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH_EXT */ - { 16569, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */ - { 16598, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB */ - { 16631, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS */ - { 16651, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ARB */ - { 16675, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ATI */ - { 16699, 0x000080E9 }, /* GL_MAX_ELEMENTS_INDICES */ - { 16723, 0x000080E8 }, /* GL_MAX_ELEMENTS_VERTICES */ - { 16748, 0x00000D30 }, /* GL_MAX_EVAL_ORDER */ - { 16766, 0x00008008 }, /* GL_MAX_EXT */ - { 16777, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */ - { 16812, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB */ - { 16851, 0x00000D31 }, /* GL_MAX_LIGHTS */ - { 16865, 0x00000B31 }, /* GL_MAX_LIST_NESTING */ - { 16885, 0x00008841 }, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */ - { 16923, 0x00000D36 }, /* GL_MAX_MODELVIEW_STACK_DEPTH */ - { 16952, 0x00000D37 }, /* GL_MAX_NAME_STACK_DEPTH */ - { 16976, 0x00008842 }, /* GL_MAX_PALETTE_MATRICES_ARB */ - { 17004, 0x00000D34 }, /* GL_MAX_PIXEL_MAP_TABLE */ - { 17027, 0x000088B1 }, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */ - { 17064, 0x0000880B }, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */ - { 17100, 0x000088AD }, /* GL_MAX_PROGRAM_ATTRIBS_ARB */ - { 17127, 0x000088F5 }, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */ - { 17156, 0x000088B5 }, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */ - { 17190, 0x000088F4 }, /* GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ - { 17226, 0x000088F6 }, /* GL_MAX_PROGRAM_IF_DEPTH_NV */ - { 17253, 0x000088A1 }, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */ - { 17285, 0x000088B4 }, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */ - { 17321, 0x000088F8 }, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */ - { 17350, 0x000088F7 }, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */ - { 17379, 0x0000862F }, /* GL_MAX_PROGRAM_MATRICES_ARB */ - { 17407, 0x0000862E }, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */ - { 17445, 0x000088B3 }, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */ - { 17489, 0x0000880E }, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */ - { 17532, 0x000088AF }, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */ - { 17566, 0x000088A3 }, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */ - { 17605, 0x000088AB }, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */ - { 17642, 0x000088A7 }, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */ - { 17680, 0x00008810 }, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */ - { 17723, 0x0000880F }, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */ - { 17766, 0x000088A9 }, /* GL_MAX_PROGRAM_PARAMETERS_ARB */ - { 17796, 0x000088A5 }, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */ - { 17827, 0x0000880D }, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */ - { 17863, 0x0000880C }, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */ - { 17899, 0x00000D38 }, /* GL_MAX_PROJECTION_STACK_DEPTH */ - { 17929, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */ - { 17963, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_NV */ - { 17996, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE_EXT */ - { 18025, 0x00008504 }, /* GL_MAX_SHININESS_NV */ - { 18045, 0x00008505 }, /* GL_MAX_SPOT_EXPONENT_NV */ - { 18069, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS */ - { 18091, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS_ARB */ - { 18117, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS */ - { 18144, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS_ARB */ - { 18175, 0x000084FD }, /* GL_MAX_TEXTURE_LOD_BIAS */ - { 18199, 0x000084FF }, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */ - { 18233, 0x00000D33 }, /* GL_MAX_TEXTURE_SIZE */ - { 18253, 0x00000D39 }, /* GL_MAX_TEXTURE_STACK_DEPTH */ - { 18280, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS */ - { 18301, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS_ARB */ - { 18326, 0x0000862F }, /* GL_MAX_TRACK_MATRICES_NV */ - { 18351, 0x0000862E }, /* GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV */ - { 18386, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS */ - { 18408, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS_ARB */ - { 18434, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS */ - { 18456, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS_ARB */ - { 18482, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */ - { 18516, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ - { 18554, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */ - { 18587, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB */ - { 18624, 0x000086A4 }, /* GL_MAX_VERTEX_UNITS_ARB */ - { 18648, 0x00000D3A }, /* GL_MAX_VIEWPORT_DIMS */ - { 18669, 0x00008007 }, /* GL_MIN */ - { 18676, 0x0000802E }, /* GL_MINMAX */ - { 18686, 0x0000802E }, /* GL_MINMAX_EXT */ - { 18700, 0x0000802F }, /* GL_MINMAX_FORMAT */ - { 18717, 0x0000802F }, /* GL_MINMAX_FORMAT_EXT */ - { 18738, 0x00008030 }, /* GL_MINMAX_SINK */ - { 18753, 0x00008030 }, /* GL_MINMAX_SINK_EXT */ - { 18772, 0x00008007 }, /* GL_MIN_EXT */ - { 18783, 0x00008370 }, /* GL_MIRRORED_REPEAT */ - { 18802, 0x00008370 }, /* GL_MIRRORED_REPEAT_ARB */ - { 18825, 0x00008370 }, /* GL_MIRRORED_REPEAT_IBM */ - { 18848, 0x00008742 }, /* GL_MIRROR_CLAMP_ATI */ - { 18868, 0x00008742 }, /* GL_MIRROR_CLAMP_EXT */ - { 18888, 0x00008912 }, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */ - { 18918, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_ATI */ - { 18946, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */ - { 18974, 0x00001700 }, /* GL_MODELVIEW */ - { 18987, 0x00001700 }, /* GL_MODELVIEW0_ARB */ - { 19005, 0x0000872A }, /* GL_MODELVIEW10_ARB */ - { 19024, 0x0000872B }, /* GL_MODELVIEW11_ARB */ - { 19043, 0x0000872C }, /* GL_MODELVIEW12_ARB */ - { 19062, 0x0000872D }, /* GL_MODELVIEW13_ARB */ - { 19081, 0x0000872E }, /* GL_MODELVIEW14_ARB */ - { 19100, 0x0000872F }, /* GL_MODELVIEW15_ARB */ - { 19119, 0x00008730 }, /* GL_MODELVIEW16_ARB */ - { 19138, 0x00008731 }, /* GL_MODELVIEW17_ARB */ - { 19157, 0x00008732 }, /* GL_MODELVIEW18_ARB */ - { 19176, 0x00008733 }, /* GL_MODELVIEW19_ARB */ - { 19195, 0x0000850A }, /* GL_MODELVIEW1_ARB */ - { 19213, 0x00008734 }, /* GL_MODELVIEW20_ARB */ - { 19232, 0x00008735 }, /* GL_MODELVIEW21_ARB */ - { 19251, 0x00008736 }, /* GL_MODELVIEW22_ARB */ - { 19270, 0x00008737 }, /* GL_MODELVIEW23_ARB */ - { 19289, 0x00008738 }, /* GL_MODELVIEW24_ARB */ - { 19308, 0x00008739 }, /* GL_MODELVIEW25_ARB */ - { 19327, 0x0000873A }, /* GL_MODELVIEW26_ARB */ - { 19346, 0x0000873B }, /* GL_MODELVIEW27_ARB */ - { 19365, 0x0000873C }, /* GL_MODELVIEW28_ARB */ - { 19384, 0x0000873D }, /* GL_MODELVIEW29_ARB */ - { 19403, 0x00008722 }, /* GL_MODELVIEW2_ARB */ - { 19421, 0x0000873E }, /* GL_MODELVIEW30_ARB */ - { 19440, 0x0000873F }, /* GL_MODELVIEW31_ARB */ - { 19459, 0x00008723 }, /* GL_MODELVIEW3_ARB */ - { 19477, 0x00008724 }, /* GL_MODELVIEW4_ARB */ - { 19495, 0x00008725 }, /* GL_MODELVIEW5_ARB */ - { 19513, 0x00008726 }, /* GL_MODELVIEW6_ARB */ - { 19531, 0x00008727 }, /* GL_MODELVIEW7_ARB */ - { 19549, 0x00008728 }, /* GL_MODELVIEW8_ARB */ - { 19567, 0x00008729 }, /* GL_MODELVIEW9_ARB */ - { 19585, 0x00000BA6 }, /* GL_MODELVIEW_MATRIX */ - { 19605, 0x00008629 }, /* GL_MODELVIEW_PROJECTION_NV */ - { 19632, 0x00000BA3 }, /* GL_MODELVIEW_STACK_DEPTH */ - { 19657, 0x00002100 }, /* GL_MODULATE */ - { 19669, 0x00008744 }, /* GL_MODULATE_ADD_ATI */ - { 19689, 0x00008745 }, /* GL_MODULATE_SIGNED_ADD_ATI */ - { 19716, 0x00008746 }, /* GL_MODULATE_SUBTRACT_ATI */ - { 19741, 0x00000103 }, /* GL_MULT */ - { 19749, 0x0000809D }, /* GL_MULTISAMPLE */ - { 19764, 0x000086B2 }, /* GL_MULTISAMPLE_3DFX */ - { 19784, 0x0000809D }, /* GL_MULTISAMPLE_ARB */ - { 19803, 0x20000000 }, /* GL_MULTISAMPLE_BIT */ - { 19822, 0x20000000 }, /* GL_MULTISAMPLE_BIT_3DFX */ - { 19846, 0x20000000 }, /* GL_MULTISAMPLE_BIT_ARB */ - { 19869, 0x00008534 }, /* GL_MULTISAMPLE_FILTER_HINT_NV */ - { 19899, 0x00002A25 }, /* GL_N3F_V3F */ - { 19910, 0x00000D70 }, /* GL_NAME_STACK_DEPTH */ - { 19930, 0x0000150E }, /* GL_NAND */ - { 19938, 0x00002600 }, /* GL_NEAREST */ - { 19949, 0x0000844E }, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */ - { 19980, 0x0000844D }, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */ - { 20012, 0x00002702 }, /* GL_NEAREST_MIPMAP_LINEAR */ - { 20037, 0x00002700 }, /* GL_NEAREST_MIPMAP_NEAREST */ - { 20063, 0x00000200 }, /* GL_NEVER */ - { 20072, 0x00001102 }, /* GL_NICEST */ - { 20082, 0x00000000 }, /* GL_NONE */ - { 20090, 0x00001505 }, /* GL_NOOP */ - { 20098, 0x00001508 }, /* GL_NOR */ - { 20105, 0x00000BA1 }, /* GL_NORMALIZE */ - { 20118, 0x00008075 }, /* GL_NORMAL_ARRAY */ - { 20134, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING */ - { 20165, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING_ARB */ - { 20200, 0x0000808F }, /* GL_NORMAL_ARRAY_POINTER */ - { 20224, 0x0000807F }, /* GL_NORMAL_ARRAY_STRIDE */ - { 20247, 0x0000807E }, /* GL_NORMAL_ARRAY_TYPE */ - { 20268, 0x00008511 }, /* GL_NORMAL_MAP */ - { 20282, 0x00008511 }, /* GL_NORMAL_MAP_ARB */ - { 20300, 0x00008511 }, /* GL_NORMAL_MAP_NV */ - { 20317, 0x00000205 }, /* GL_NOTEQUAL */ - { 20329, 0x00000000 }, /* GL_NO_ERROR */ - { 20341, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */ - { 20375, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB */ - { 20413, 0x00008B89 }, /* GL_OBJECT_ACTIVE_ATTRIBUTES_ARB */ - { 20445, 0x00008B8A }, /* GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB */ - { 20487, 0x00008B86 }, /* GL_OBJECT_ACTIVE_UNIFORMS_ARB */ - { 20517, 0x00008B87 }, /* GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB */ - { 20557, 0x00008B85 }, /* GL_OBJECT_ATTACHED_OBJECTS_ARB */ - { 20588, 0x00008B81 }, /* GL_OBJECT_COMPILE_STATUS_ARB */ - { 20617, 0x00008B80 }, /* GL_OBJECT_DELETE_STATUS_ARB */ - { 20645, 0x00008B84 }, /* GL_OBJECT_INFO_LOG_LENGTH_ARB */ - { 20675, 0x00002401 }, /* GL_OBJECT_LINEAR */ - { 20692, 0x00008B82 }, /* GL_OBJECT_LINK_STATUS_ARB */ - { 20718, 0x00002501 }, /* GL_OBJECT_PLANE */ - { 20734, 0x00008B88 }, /* GL_OBJECT_SHADER_SOURCE_LENGTH_ARB */ - { 20769, 0x00008B4F }, /* GL_OBJECT_SUBTYPE_ARB */ - { 20791, 0x00008B4E }, /* GL_OBJECT_TYPE_ARB */ - { 20810, 0x00008B83 }, /* GL_OBJECT_VALIDATE_STATUS_ARB */ - { 20840, 0x00008165 }, /* GL_OCCLUSION_TEST_HP */ - { 20861, 0x00008166 }, /* GL_OCCLUSION_TEST_RESULT_HP */ - { 20889, 0x00000001 }, /* GL_ONE */ - { 20896, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA */ - { 20924, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA_EXT */ - { 20956, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR */ - { 20984, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR_EXT */ - { 21016, 0x00000305 }, /* GL_ONE_MINUS_DST_ALPHA */ - { 21039, 0x00000307 }, /* GL_ONE_MINUS_DST_COLOR */ - { 21062, 0x00000303 }, /* GL_ONE_MINUS_SRC_ALPHA */ - { 21085, 0x00000301 }, /* GL_ONE_MINUS_SRC_COLOR */ - { 21108, 0x00008598 }, /* GL_OPERAND0_ALPHA */ - { 21126, 0x00008598 }, /* GL_OPERAND0_ALPHA_ARB */ - { 21148, 0x00008598 }, /* GL_OPERAND0_ALPHA_EXT */ - { 21170, 0x00008590 }, /* GL_OPERAND0_RGB */ - { 21186, 0x00008590 }, /* GL_OPERAND0_RGB_ARB */ - { 21206, 0x00008590 }, /* GL_OPERAND0_RGB_EXT */ - { 21226, 0x00008599 }, /* GL_OPERAND1_ALPHA */ - { 21244, 0x00008599 }, /* GL_OPERAND1_ALPHA_ARB */ - { 21266, 0x00008599 }, /* GL_OPERAND1_ALPHA_EXT */ - { 21288, 0x00008591 }, /* GL_OPERAND1_RGB */ - { 21304, 0x00008591 }, /* GL_OPERAND1_RGB_ARB */ - { 21324, 0x00008591 }, /* GL_OPERAND1_RGB_EXT */ - { 21344, 0x0000859A }, /* GL_OPERAND2_ALPHA */ - { 21362, 0x0000859A }, /* GL_OPERAND2_ALPHA_ARB */ - { 21384, 0x0000859A }, /* GL_OPERAND2_ALPHA_EXT */ - { 21406, 0x00008592 }, /* GL_OPERAND2_RGB */ - { 21422, 0x00008592 }, /* GL_OPERAND2_RGB_ARB */ - { 21442, 0x00008592 }, /* GL_OPERAND2_RGB_EXT */ - { 21462, 0x0000859B }, /* GL_OPERAND3_ALPHA_NV */ - { 21483, 0x00008593 }, /* GL_OPERAND3_RGB_NV */ - { 21502, 0x00001507 }, /* GL_OR */ - { 21508, 0x00000A01 }, /* GL_ORDER */ - { 21517, 0x0000150D }, /* GL_OR_INVERTED */ - { 21532, 0x0000150B }, /* GL_OR_REVERSE */ - { 21546, 0x00000505 }, /* GL_OUT_OF_MEMORY */ - { 21563, 0x00000D05 }, /* GL_PACK_ALIGNMENT */ - { 21581, 0x0000806C }, /* GL_PACK_IMAGE_HEIGHT */ - { 21602, 0x00008758 }, /* GL_PACK_INVERT_MESA */ - { 21622, 0x00000D01 }, /* GL_PACK_LSB_FIRST */ - { 21640, 0x00000D02 }, /* GL_PACK_ROW_LENGTH */ - { 21659, 0x0000806B }, /* GL_PACK_SKIP_IMAGES */ - { 21679, 0x00000D04 }, /* GL_PACK_SKIP_PIXELS */ - { 21699, 0x00000D03 }, /* GL_PACK_SKIP_ROWS */ - { 21717, 0x00000D00 }, /* GL_PACK_SWAP_BYTES */ - { 21736, 0x00008B92 }, /* GL_PALETTE4_R5_G6_B5_OES */ - { 21761, 0x00008B94 }, /* GL_PALETTE4_RGB5_A1_OES */ - { 21785, 0x00008B90 }, /* GL_PALETTE4_RGB8_OES */ - { 21806, 0x00008B93 }, /* GL_PALETTE4_RGBA4_OES */ - { 21828, 0x00008B91 }, /* GL_PALETTE4_RGBA8_OES */ - { 21850, 0x00008B97 }, /* GL_PALETTE8_R5_G6_B5_OES */ - { 21875, 0x00008B99 }, /* GL_PALETTE8_RGB5_A1_OES */ - { 21899, 0x00008B95 }, /* GL_PALETTE8_RGB8_OES */ - { 21920, 0x00008B98 }, /* GL_PALETTE8_RGBA4_OES */ - { 21942, 0x00008B96 }, /* GL_PALETTE8_RGBA8_OES */ - { 21964, 0x00000700 }, /* GL_PASS_THROUGH_TOKEN */ - { 21986, 0x00000C50 }, /* GL_PERSPECTIVE_CORRECTION_HINT */ - { 22017, 0x00000C79 }, /* GL_PIXEL_MAP_A_TO_A */ - { 22037, 0x00000CB9 }, /* GL_PIXEL_MAP_A_TO_A_SIZE */ - { 22062, 0x00000C78 }, /* GL_PIXEL_MAP_B_TO_B */ - { 22082, 0x00000CB8 }, /* GL_PIXEL_MAP_B_TO_B_SIZE */ - { 22107, 0x00000C77 }, /* GL_PIXEL_MAP_G_TO_G */ - { 22127, 0x00000CB7 }, /* GL_PIXEL_MAP_G_TO_G_SIZE */ - { 22152, 0x00000C75 }, /* GL_PIXEL_MAP_I_TO_A */ - { 22172, 0x00000CB5 }, /* GL_PIXEL_MAP_I_TO_A_SIZE */ - { 22197, 0x00000C74 }, /* GL_PIXEL_MAP_I_TO_B */ - { 22217, 0x00000CB4 }, /* GL_PIXEL_MAP_I_TO_B_SIZE */ - { 22242, 0x00000C73 }, /* GL_PIXEL_MAP_I_TO_G */ - { 22262, 0x00000CB3 }, /* GL_PIXEL_MAP_I_TO_G_SIZE */ - { 22287, 0x00000C70 }, /* GL_PIXEL_MAP_I_TO_I */ - { 22307, 0x00000CB0 }, /* GL_PIXEL_MAP_I_TO_I_SIZE */ - { 22332, 0x00000C72 }, /* GL_PIXEL_MAP_I_TO_R */ - { 22352, 0x00000CB2 }, /* GL_PIXEL_MAP_I_TO_R_SIZE */ - { 22377, 0x00000C76 }, /* GL_PIXEL_MAP_R_TO_R */ - { 22397, 0x00000CB6 }, /* GL_PIXEL_MAP_R_TO_R_SIZE */ - { 22422, 0x00000C71 }, /* GL_PIXEL_MAP_S_TO_S */ - { 22442, 0x00000CB1 }, /* GL_PIXEL_MAP_S_TO_S_SIZE */ - { 22467, 0x00000020 }, /* GL_PIXEL_MODE_BIT */ - { 22485, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING_EXT */ - { 22518, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER_EXT */ - { 22543, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING_EXT */ - { 22578, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER_EXT */ - { 22605, 0x00001B00 }, /* GL_POINT */ - { 22614, 0x00000000 }, /* GL_POINTS */ - { 22624, 0x00000002 }, /* GL_POINT_BIT */ - { 22637, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION */ - { 22667, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_ARB */ - { 22701, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_EXT */ - { 22735, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_SGIS */ - { 22770, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE */ - { 22799, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_ARB */ - { 22832, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_EXT */ - { 22865, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_SGIS */ - { 22899, 0x00000B11 }, /* GL_POINT_SIZE */ - { 22913, 0x00000B13 }, /* GL_POINT_SIZE_GRANULARITY */ - { 22939, 0x00008127 }, /* GL_POINT_SIZE_MAX */ - { 22957, 0x00008127 }, /* GL_POINT_SIZE_MAX_ARB */ - { 22979, 0x00008127 }, /* GL_POINT_SIZE_MAX_EXT */ - { 23001, 0x00008127 }, /* GL_POINT_SIZE_MAX_SGIS */ - { 23024, 0x00008126 }, /* GL_POINT_SIZE_MIN */ - { 23042, 0x00008126 }, /* GL_POINT_SIZE_MIN_ARB */ - { 23064, 0x00008126 }, /* GL_POINT_SIZE_MIN_EXT */ - { 23086, 0x00008126 }, /* GL_POINT_SIZE_MIN_SGIS */ - { 23109, 0x00000B12 }, /* GL_POINT_SIZE_RANGE */ - { 23129, 0x00000B10 }, /* GL_POINT_SMOOTH */ - { 23145, 0x00000C51 }, /* GL_POINT_SMOOTH_HINT */ - { 23166, 0x00008861 }, /* GL_POINT_SPRITE */ - { 23182, 0x00008861 }, /* GL_POINT_SPRITE_ARB */ - { 23202, 0x00008CA0 }, /* GL_POINT_SPRITE_COORD_ORIGIN */ - { 23231, 0x00008861 }, /* GL_POINT_SPRITE_NV */ - { 23250, 0x00008863 }, /* GL_POINT_SPRITE_R_MODE_NV */ - { 23276, 0x00000701 }, /* GL_POINT_TOKEN */ - { 23291, 0x00000009 }, /* GL_POLYGON */ - { 23302, 0x00000008 }, /* GL_POLYGON_BIT */ - { 23317, 0x00000B40 }, /* GL_POLYGON_MODE */ - { 23333, 0x00008039 }, /* GL_POLYGON_OFFSET_BIAS */ - { 23356, 0x00008038 }, /* GL_POLYGON_OFFSET_FACTOR */ - { 23381, 0x00008037 }, /* GL_POLYGON_OFFSET_FILL */ - { 23404, 0x00002A02 }, /* GL_POLYGON_OFFSET_LINE */ - { 23427, 0x00002A01 }, /* GL_POLYGON_OFFSET_POINT */ - { 23451, 0x00002A00 }, /* GL_POLYGON_OFFSET_UNITS */ - { 23475, 0x00000B41 }, /* GL_POLYGON_SMOOTH */ - { 23493, 0x00000C53 }, /* GL_POLYGON_SMOOTH_HINT */ - { 23516, 0x00000B42 }, /* GL_POLYGON_STIPPLE */ - { 23535, 0x00000010 }, /* GL_POLYGON_STIPPLE_BIT */ - { 23558, 0x00000703 }, /* GL_POLYGON_TOKEN */ - { 23575, 0x00001203 }, /* GL_POSITION */ - { 23587, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */ - { 23619, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI */ - { 23655, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */ - { 23688, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI */ - { 23725, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */ - { 23756, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI */ - { 23791, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */ - { 23823, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI */ - { 23859, 0x000080D2 }, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */ - { 23892, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */ - { 23924, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI */ - { 23960, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */ - { 23993, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI */ - { 24030, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS */ - { 24060, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS_SGI */ - { 24094, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE */ - { 24125, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE_SGI */ - { 24160, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS */ - { 24191, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS_EXT */ - { 24226, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE */ - { 24258, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE_EXT */ - { 24294, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS */ - { 24324, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS_EXT */ - { 24358, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE */ - { 24389, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE_EXT */ - { 24424, 0x000080D1 }, /* GL_POST_CONVOLUTION_COLOR_TABLE */ - { 24456, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS */ - { 24487, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS_EXT */ - { 24522, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE */ - { 24554, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE_EXT */ - { 24590, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS */ - { 24619, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS_EXT */ - { 24652, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE */ - { 24682, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE_EXT */ - { 24716, 0x0000817B }, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */ - { 24755, 0x00008179 }, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */ - { 24788, 0x0000817C }, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */ - { 24828, 0x0000817A }, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */ - { 24862, 0x00008578 }, /* GL_PREVIOUS */ - { 24874, 0x00008578 }, /* GL_PREVIOUS_ARB */ - { 24890, 0x00008578 }, /* GL_PREVIOUS_EXT */ - { 24906, 0x00008577 }, /* GL_PRIMARY_COLOR */ - { 24923, 0x00008577 }, /* GL_PRIMARY_COLOR_ARB */ - { 24944, 0x00008577 }, /* GL_PRIMARY_COLOR_EXT */ - { 24965, 0x000088B0 }, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */ - { 24998, 0x00008805 }, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */ - { 25030, 0x000088AC }, /* GL_PROGRAM_ATTRIBS_ARB */ - { 25053, 0x00008677 }, /* GL_PROGRAM_BINDING_ARB */ - { 25076, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_ARB */ - { 25106, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_NV */ - { 25135, 0x00008874 }, /* GL_PROGRAM_ERROR_STRING_ARB */ - { 25163, 0x00008876 }, /* GL_PROGRAM_FORMAT_ARB */ - { 25185, 0x00008875 }, /* GL_PROGRAM_FORMAT_ASCII_ARB */ - { 25213, 0x000088A0 }, /* GL_PROGRAM_INSTRUCTIONS_ARB */ - { 25241, 0x00008627 }, /* GL_PROGRAM_LENGTH_ARB */ - { 25263, 0x00008627 }, /* GL_PROGRAM_LENGTH_NV */ - { 25284, 0x000088B2 }, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */ - { 25324, 0x00008808 }, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */ - { 25363, 0x000088AE }, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */ - { 25393, 0x000088A2 }, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */ - { 25428, 0x000088AA }, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */ - { 25461, 0x000088A6 }, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */ - { 25495, 0x0000880A }, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */ - { 25534, 0x00008809 }, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */ - { 25573, 0x00008B40 }, /* GL_PROGRAM_OBJECT_ARB */ - { 25595, 0x000088A8 }, /* GL_PROGRAM_PARAMETERS_ARB */ - { 25621, 0x00008644 }, /* GL_PROGRAM_PARAMETER_NV */ - { 25645, 0x00008647 }, /* GL_PROGRAM_RESIDENT_NV */ - { 25668, 0x00008628 }, /* GL_PROGRAM_STRING_ARB */ - { 25690, 0x00008628 }, /* GL_PROGRAM_STRING_NV */ - { 25711, 0x00008646 }, /* GL_PROGRAM_TARGET_NV */ - { 25732, 0x000088A4 }, /* GL_PROGRAM_TEMPORARIES_ARB */ - { 25759, 0x00008807 }, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */ - { 25791, 0x00008806 }, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */ - { 25823, 0x000088B6 }, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */ - { 25858, 0x00001701 }, /* GL_PROJECTION */ - { 25872, 0x00000BA7 }, /* GL_PROJECTION_MATRIX */ - { 25893, 0x00000BA4 }, /* GL_PROJECTION_STACK_DEPTH */ - { 25919, 0x000080D3 }, /* GL_PROXY_COLOR_TABLE */ - { 25940, 0x00008025 }, /* GL_PROXY_HISTOGRAM */ - { 25959, 0x00008025 }, /* GL_PROXY_HISTOGRAM_EXT */ - { 25982, 0x000080D5 }, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */ - { 26021, 0x000080D4 }, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */ - { 26059, 0x00008063 }, /* GL_PROXY_TEXTURE_1D */ - { 26079, 0x00008C19 }, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */ - { 26109, 0x00008063 }, /* GL_PROXY_TEXTURE_1D_EXT */ - { 26133, 0x00008064 }, /* GL_PROXY_TEXTURE_2D */ - { 26153, 0x00008C1B }, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */ - { 26183, 0x00008064 }, /* GL_PROXY_TEXTURE_2D_EXT */ - { 26207, 0x00008070 }, /* GL_PROXY_TEXTURE_3D */ - { 26227, 0x000080BD }, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */ - { 26260, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP */ - { 26286, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP_ARB */ - { 26316, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */ - { 26347, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_NV */ - { 26377, 0x00002003 }, /* GL_Q */ - { 26382, 0x00001209 }, /* GL_QUADRATIC_ATTENUATION */ - { 26407, 0x00000007 }, /* GL_QUADS */ - { 26416, 0x00008614 }, /* GL_QUAD_MESH_SUN */ - { 26433, 0x00000008 }, /* GL_QUAD_STRIP */ - { 26447, 0x00008864 }, /* GL_QUERY_COUNTER_BITS */ - { 26469, 0x00008864 }, /* GL_QUERY_COUNTER_BITS_ARB */ - { 26495, 0x00008866 }, /* GL_QUERY_RESULT */ - { 26511, 0x00008866 }, /* GL_QUERY_RESULT_ARB */ - { 26531, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE */ - { 26557, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE_ARB */ - { 26587, 0x00002002 }, /* GL_R */ - { 26592, 0x00002A10 }, /* GL_R3_G3_B2 */ - { 26604, 0x00019262 }, /* GL_RASTER_POSITION_UNCLIPPED_IBM */ - { 26637, 0x00000C02 }, /* GL_READ_BUFFER */ - { 26652, 0x00008CAA }, /* GL_READ_FRAMEBUFFER_BINDING_EXT */ - { 26684, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER_EXT */ - { 26708, 0x000088B8 }, /* GL_READ_ONLY */ - { 26721, 0x000088B8 }, /* GL_READ_ONLY_ARB */ - { 26738, 0x000088BA }, /* GL_READ_WRITE */ - { 26752, 0x000088BA }, /* GL_READ_WRITE_ARB */ - { 26770, 0x00001903 }, /* GL_RED */ - { 26777, 0x00008016 }, /* GL_REDUCE */ - { 26787, 0x00008016 }, /* GL_REDUCE_EXT */ - { 26801, 0x00000D15 }, /* GL_RED_BIAS */ - { 26813, 0x00000D52 }, /* GL_RED_BITS */ - { 26825, 0x00000D14 }, /* GL_RED_SCALE */ - { 26838, 0x00008512 }, /* GL_REFLECTION_MAP */ - { 26856, 0x00008512 }, /* GL_REFLECTION_MAP_ARB */ - { 26878, 0x00008512 }, /* GL_REFLECTION_MAP_NV */ - { 26899, 0x00001C00 }, /* GL_RENDER */ - { 26909, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING_EXT */ - { 26937, 0x00008D41 }, /* GL_RENDERBUFFER_EXT */ - { 26957, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT_EXT */ - { 26984, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT_EXT */ - { 27020, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH_EXT */ - { 27046, 0x00001F01 }, /* GL_RENDERER */ - { 27058, 0x00000C40 }, /* GL_RENDER_MODE */ - { 27073, 0x00002901 }, /* GL_REPEAT */ - { 27083, 0x00001E01 }, /* GL_REPLACE */ - { 27094, 0x00008062 }, /* GL_REPLACE_EXT */ - { 27109, 0x00008153 }, /* GL_REPLICATE_BORDER_HP */ - { 27132, 0x0000803A }, /* GL_RESCALE_NORMAL */ - { 27150, 0x0000803A }, /* GL_RESCALE_NORMAL_EXT */ - { 27172, 0x00000102 }, /* GL_RETURN */ - { 27182, 0x00001907 }, /* GL_RGB */ - { 27189, 0x00008052 }, /* GL_RGB10 */ - { 27198, 0x00008059 }, /* GL_RGB10_A2 */ - { 27210, 0x00008059 }, /* GL_RGB10_A2_EXT */ - { 27226, 0x00008052 }, /* GL_RGB10_EXT */ - { 27239, 0x00008053 }, /* GL_RGB12 */ - { 27248, 0x00008053 }, /* GL_RGB12_EXT */ - { 27261, 0x00008054 }, /* GL_RGB16 */ - { 27270, 0x00008054 }, /* GL_RGB16_EXT */ - { 27283, 0x0000804E }, /* GL_RGB2_EXT */ - { 27295, 0x0000804F }, /* GL_RGB4 */ - { 27303, 0x0000804F }, /* GL_RGB4_EXT */ - { 27315, 0x000083A1 }, /* GL_RGB4_S3TC */ - { 27328, 0x00008050 }, /* GL_RGB5 */ - { 27336, 0x00008057 }, /* GL_RGB5_A1 */ - { 27347, 0x00008057 }, /* GL_RGB5_A1_EXT */ - { 27362, 0x00008050 }, /* GL_RGB5_EXT */ - { 27374, 0x00008051 }, /* GL_RGB8 */ - { 27382, 0x00008051 }, /* GL_RGB8_EXT */ - { 27394, 0x00001908 }, /* GL_RGBA */ - { 27402, 0x0000805A }, /* GL_RGBA12 */ - { 27412, 0x0000805A }, /* GL_RGBA12_EXT */ - { 27426, 0x0000805B }, /* GL_RGBA16 */ - { 27436, 0x0000805B }, /* GL_RGBA16_EXT */ - { 27450, 0x00008055 }, /* GL_RGBA2 */ - { 27459, 0x00008055 }, /* GL_RGBA2_EXT */ - { 27472, 0x00008056 }, /* GL_RGBA4 */ - { 27481, 0x000083A5 }, /* GL_RGBA4_DXT5_S3TC */ - { 27500, 0x00008056 }, /* GL_RGBA4_EXT */ - { 27513, 0x000083A3 }, /* GL_RGBA4_S3TC */ - { 27527, 0x00008058 }, /* GL_RGBA8 */ - { 27536, 0x00008058 }, /* GL_RGBA8_EXT */ - { 27549, 0x000083A4 }, /* GL_RGBA_DXT5_S3TC */ - { 27567, 0x00000C31 }, /* GL_RGBA_MODE */ - { 27580, 0x000083A2 }, /* GL_RGBA_S3TC */ - { 27593, 0x000083A0 }, /* GL_RGB_S3TC */ - { 27605, 0x00008573 }, /* GL_RGB_SCALE */ - { 27618, 0x00008573 }, /* GL_RGB_SCALE_ARB */ - { 27635, 0x00008573 }, /* GL_RGB_SCALE_EXT */ - { 27652, 0x00000407 }, /* GL_RIGHT */ - { 27661, 0x00002000 }, /* GL_S */ - { 27666, 0x00008B5D }, /* GL_SAMPLER_1D */ - { 27680, 0x00008B61 }, /* GL_SAMPLER_1D_SHADOW */ - { 27701, 0x00008B5E }, /* GL_SAMPLER_2D */ - { 27715, 0x00008B62 }, /* GL_SAMPLER_2D_SHADOW */ - { 27736, 0x00008B5F }, /* GL_SAMPLER_3D */ - { 27750, 0x00008B60 }, /* GL_SAMPLER_CUBE */ - { 27766, 0x000080A9 }, /* GL_SAMPLES */ - { 27777, 0x000086B4 }, /* GL_SAMPLES_3DFX */ - { 27793, 0x000080A9 }, /* GL_SAMPLES_ARB */ - { 27808, 0x00008914 }, /* GL_SAMPLES_PASSED */ - { 27826, 0x00008914 }, /* GL_SAMPLES_PASSED_ARB */ - { 27848, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE */ - { 27876, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE_ARB */ - { 27908, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE */ - { 27931, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE_ARB */ - { 27958, 0x000080A8 }, /* GL_SAMPLE_BUFFERS */ - { 27976, 0x000086B3 }, /* GL_SAMPLE_BUFFERS_3DFX */ - { 27999, 0x000080A8 }, /* GL_SAMPLE_BUFFERS_ARB */ - { 28021, 0x000080A0 }, /* GL_SAMPLE_COVERAGE */ - { 28040, 0x000080A0 }, /* GL_SAMPLE_COVERAGE_ARB */ - { 28063, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT */ - { 28089, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT_ARB */ - { 28119, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE */ - { 28144, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE_ARB */ - { 28173, 0x00080000 }, /* GL_SCISSOR_BIT */ - { 28188, 0x00000C10 }, /* GL_SCISSOR_BOX */ - { 28203, 0x00000C11 }, /* GL_SCISSOR_TEST */ - { 28219, 0x0000845E }, /* GL_SECONDARY_COLOR_ARRAY */ - { 28244, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */ - { 28284, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB */ - { 28328, 0x0000845D }, /* GL_SECONDARY_COLOR_ARRAY_POINTER */ - { 28361, 0x0000845A }, /* GL_SECONDARY_COLOR_ARRAY_SIZE */ - { 28391, 0x0000845C }, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */ - { 28423, 0x0000845B }, /* GL_SECONDARY_COLOR_ARRAY_TYPE */ - { 28453, 0x00001C02 }, /* GL_SELECT */ - { 28463, 0x00000DF3 }, /* GL_SELECTION_BUFFER_POINTER */ - { 28491, 0x00000DF4 }, /* GL_SELECTION_BUFFER_SIZE */ - { 28516, 0x00008012 }, /* GL_SEPARABLE_2D */ - { 28532, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR */ - { 28559, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR_EXT */ - { 28590, 0x0000150F }, /* GL_SET */ - { 28597, 0x00008B48 }, /* GL_SHADER_OBJECT_ARB */ - { 28618, 0x00008B88 }, /* GL_SHADER_SOURCE_LENGTH */ - { 28642, 0x00008B4F }, /* GL_SHADER_TYPE */ - { 28657, 0x00000B54 }, /* GL_SHADE_MODEL */ - { 28672, 0x00008B8C }, /* GL_SHADING_LANGUAGE_VERSION */ - { 28700, 0x000080BF }, /* GL_SHADOW_AMBIENT_SGIX */ - { 28723, 0x000081FB }, /* GL_SHARED_TEXTURE_PALETTE_EXT */ - { 28753, 0x00001601 }, /* GL_SHININESS */ - { 28766, 0x00001402 }, /* GL_SHORT */ - { 28775, 0x000081F9 }, /* GL_SINGLE_COLOR */ - { 28791, 0x000081F9 }, /* GL_SINGLE_COLOR_EXT */ - { 28811, 0x000085CC }, /* GL_SLICE_ACCUM_SUN */ - { 28830, 0x00001D01 }, /* GL_SMOOTH */ - { 28840, 0x00000B23 }, /* GL_SMOOTH_LINE_WIDTH_GRANULARITY */ - { 28873, 0x00000B22 }, /* GL_SMOOTH_LINE_WIDTH_RANGE */ - { 28900, 0x00000B13 }, /* GL_SMOOTH_POINT_SIZE_GRANULARITY */ - { 28933, 0x00000B12 }, /* GL_SMOOTH_POINT_SIZE_RANGE */ - { 28960, 0x00008588 }, /* GL_SOURCE0_ALPHA */ - { 28977, 0x00008588 }, /* GL_SOURCE0_ALPHA_ARB */ - { 28998, 0x00008588 }, /* GL_SOURCE0_ALPHA_EXT */ - { 29019, 0x00008580 }, /* GL_SOURCE0_RGB */ - { 29034, 0x00008580 }, /* GL_SOURCE0_RGB_ARB */ - { 29053, 0x00008580 }, /* GL_SOURCE0_RGB_EXT */ - { 29072, 0x00008589 }, /* GL_SOURCE1_ALPHA */ - { 29089, 0x00008589 }, /* GL_SOURCE1_ALPHA_ARB */ - { 29110, 0x00008589 }, /* GL_SOURCE1_ALPHA_EXT */ - { 29131, 0x00008581 }, /* GL_SOURCE1_RGB */ - { 29146, 0x00008581 }, /* GL_SOURCE1_RGB_ARB */ - { 29165, 0x00008581 }, /* GL_SOURCE1_RGB_EXT */ - { 29184, 0x0000858A }, /* GL_SOURCE2_ALPHA */ - { 29201, 0x0000858A }, /* GL_SOURCE2_ALPHA_ARB */ - { 29222, 0x0000858A }, /* GL_SOURCE2_ALPHA_EXT */ - { 29243, 0x00008582 }, /* GL_SOURCE2_RGB */ - { 29258, 0x00008582 }, /* GL_SOURCE2_RGB_ARB */ - { 29277, 0x00008582 }, /* GL_SOURCE2_RGB_EXT */ - { 29296, 0x0000858B }, /* GL_SOURCE3_ALPHA_NV */ - { 29316, 0x00008583 }, /* GL_SOURCE3_RGB_NV */ - { 29334, 0x00001202 }, /* GL_SPECULAR */ - { 29346, 0x00002402 }, /* GL_SPHERE_MAP */ - { 29360, 0x00001206 }, /* GL_SPOT_CUTOFF */ - { 29375, 0x00001204 }, /* GL_SPOT_DIRECTION */ - { 29393, 0x00001205 }, /* GL_SPOT_EXPONENT */ - { 29410, 0x00008588 }, /* GL_SRC0_ALPHA */ - { 29424, 0x00008580 }, /* GL_SRC0_RGB */ - { 29436, 0x00008589 }, /* GL_SRC1_ALPHA */ - { 29450, 0x00008581 }, /* GL_SRC1_RGB */ - { 29462, 0x0000858A }, /* GL_SRC2_ALPHA */ - { 29476, 0x00008582 }, /* GL_SRC2_RGB */ - { 29488, 0x00000302 }, /* GL_SRC_ALPHA */ - { 29501, 0x00000308 }, /* GL_SRC_ALPHA_SATURATE */ - { 29523, 0x00000300 }, /* GL_SRC_COLOR */ - { 29536, 0x00000503 }, /* GL_STACK_OVERFLOW */ - { 29554, 0x00000504 }, /* GL_STACK_UNDERFLOW */ - { 29573, 0x000088E6 }, /* GL_STATIC_COPY */ - { 29588, 0x000088E6 }, /* GL_STATIC_COPY_ARB */ - { 29607, 0x000088E4 }, /* GL_STATIC_DRAW */ - { 29622, 0x000088E4 }, /* GL_STATIC_DRAW_ARB */ - { 29641, 0x000088E5 }, /* GL_STATIC_READ */ - { 29656, 0x000088E5 }, /* GL_STATIC_READ_ARB */ - { 29675, 0x00001802 }, /* GL_STENCIL */ - { 29686, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT_EXT */ - { 29712, 0x00008801 }, /* GL_STENCIL_BACK_FAIL */ - { 29733, 0x00008801 }, /* GL_STENCIL_BACK_FAIL_ATI */ - { 29758, 0x00008800 }, /* GL_STENCIL_BACK_FUNC */ - { 29779, 0x00008800 }, /* GL_STENCIL_BACK_FUNC_ATI */ - { 29804, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */ - { 29836, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI */ - { 29872, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */ - { 29904, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI */ - { 29940, 0x00008CA3 }, /* GL_STENCIL_BACK_REF */ - { 29960, 0x00008CA4 }, /* GL_STENCIL_BACK_VALUE_MASK */ - { 29987, 0x00008CA5 }, /* GL_STENCIL_BACK_WRITEMASK */ - { 30013, 0x00000D57 }, /* GL_STENCIL_BITS */ - { 30029, 0x00000400 }, /* GL_STENCIL_BUFFER_BIT */ - { 30051, 0x00000B91 }, /* GL_STENCIL_CLEAR_VALUE */ - { 30074, 0x00000B94 }, /* GL_STENCIL_FAIL */ - { 30090, 0x00000B92 }, /* GL_STENCIL_FUNC */ - { 30106, 0x00001901 }, /* GL_STENCIL_INDEX */ - { 30123, 0x00008D49 }, /* GL_STENCIL_INDEX16_EXT */ - { 30146, 0x00008D46 }, /* GL_STENCIL_INDEX1_EXT */ - { 30168, 0x00008D47 }, /* GL_STENCIL_INDEX4_EXT */ - { 30190, 0x00008D48 }, /* GL_STENCIL_INDEX8_EXT */ - { 30212, 0x00008D45 }, /* GL_STENCIL_INDEX_EXT */ - { 30233, 0x00000B95 }, /* GL_STENCIL_PASS_DEPTH_FAIL */ - { 30260, 0x00000B96 }, /* GL_STENCIL_PASS_DEPTH_PASS */ - { 30287, 0x00000B97 }, /* GL_STENCIL_REF */ - { 30302, 0x00000B90 }, /* GL_STENCIL_TEST */ - { 30318, 0x00008910 }, /* GL_STENCIL_TEST_TWO_SIDE_EXT */ - { 30347, 0x00000B93 }, /* GL_STENCIL_VALUE_MASK */ - { 30369, 0x00000B98 }, /* GL_STENCIL_WRITEMASK */ - { 30390, 0x00000C33 }, /* GL_STEREO */ - { 30400, 0x000088E2 }, /* GL_STREAM_COPY */ - { 30415, 0x000088E2 }, /* GL_STREAM_COPY_ARB */ - { 30434, 0x000088E0 }, /* GL_STREAM_DRAW */ - { 30449, 0x000088E0 }, /* GL_STREAM_DRAW_ARB */ - { 30468, 0x000088E1 }, /* GL_STREAM_READ */ - { 30483, 0x000088E1 }, /* GL_STREAM_READ_ARB */ - { 30502, 0x00000D50 }, /* GL_SUBPIXEL_BITS */ - { 30519, 0x000084E7 }, /* GL_SUBTRACT */ - { 30531, 0x000084E7 }, /* GL_SUBTRACT_ARB */ - { 30547, 0x00002001 }, /* GL_T */ - { 30552, 0x00002A2A }, /* GL_T2F_C3F_V3F */ - { 30567, 0x00002A2C }, /* GL_T2F_C4F_N3F_V3F */ - { 30586, 0x00002A29 }, /* GL_T2F_C4UB_V3F */ - { 30602, 0x00002A2B }, /* GL_T2F_N3F_V3F */ - { 30617, 0x00002A27 }, /* GL_T2F_V3F */ - { 30628, 0x00002A2D }, /* GL_T4F_C4F_N3F_V4F */ - { 30647, 0x00002A28 }, /* GL_T4F_V4F */ - { 30658, 0x00008031 }, /* GL_TABLE_TOO_LARGE_EXT */ - { 30681, 0x00001702 }, /* GL_TEXTURE */ - { 30692, 0x000084C0 }, /* GL_TEXTURE0 */ - { 30704, 0x000084C0 }, /* GL_TEXTURE0_ARB */ - { 30720, 0x000084C1 }, /* GL_TEXTURE1 */ - { 30732, 0x000084CA }, /* GL_TEXTURE10 */ - { 30745, 0x000084CA }, /* GL_TEXTURE10_ARB */ - { 30762, 0x000084CB }, /* GL_TEXTURE11 */ - { 30775, 0x000084CB }, /* GL_TEXTURE11_ARB */ - { 30792, 0x000084CC }, /* GL_TEXTURE12 */ - { 30805, 0x000084CC }, /* GL_TEXTURE12_ARB */ - { 30822, 0x000084CD }, /* GL_TEXTURE13 */ - { 30835, 0x000084CD }, /* GL_TEXTURE13_ARB */ - { 30852, 0x000084CE }, /* GL_TEXTURE14 */ - { 30865, 0x000084CE }, /* GL_TEXTURE14_ARB */ - { 30882, 0x000084CF }, /* GL_TEXTURE15 */ - { 30895, 0x000084CF }, /* GL_TEXTURE15_ARB */ - { 30912, 0x000084D0 }, /* GL_TEXTURE16 */ - { 30925, 0x000084D0 }, /* GL_TEXTURE16_ARB */ - { 30942, 0x000084D1 }, /* GL_TEXTURE17 */ - { 30955, 0x000084D1 }, /* GL_TEXTURE17_ARB */ - { 30972, 0x000084D2 }, /* GL_TEXTURE18 */ - { 30985, 0x000084D2 }, /* GL_TEXTURE18_ARB */ - { 31002, 0x000084D3 }, /* GL_TEXTURE19 */ - { 31015, 0x000084D3 }, /* GL_TEXTURE19_ARB */ - { 31032, 0x000084C1 }, /* GL_TEXTURE1_ARB */ - { 31048, 0x000084C2 }, /* GL_TEXTURE2 */ - { 31060, 0x000084D4 }, /* GL_TEXTURE20 */ - { 31073, 0x000084D4 }, /* GL_TEXTURE20_ARB */ - { 31090, 0x000084D5 }, /* GL_TEXTURE21 */ - { 31103, 0x000084D5 }, /* GL_TEXTURE21_ARB */ - { 31120, 0x000084D6 }, /* GL_TEXTURE22 */ - { 31133, 0x000084D6 }, /* GL_TEXTURE22_ARB */ - { 31150, 0x000084D7 }, /* GL_TEXTURE23 */ - { 31163, 0x000084D7 }, /* GL_TEXTURE23_ARB */ - { 31180, 0x000084D8 }, /* GL_TEXTURE24 */ - { 31193, 0x000084D8 }, /* GL_TEXTURE24_ARB */ - { 31210, 0x000084D9 }, /* GL_TEXTURE25 */ - { 31223, 0x000084D9 }, /* GL_TEXTURE25_ARB */ - { 31240, 0x000084DA }, /* GL_TEXTURE26 */ - { 31253, 0x000084DA }, /* GL_TEXTURE26_ARB */ - { 31270, 0x000084DB }, /* GL_TEXTURE27 */ - { 31283, 0x000084DB }, /* GL_TEXTURE27_ARB */ - { 31300, 0x000084DC }, /* GL_TEXTURE28 */ - { 31313, 0x000084DC }, /* GL_TEXTURE28_ARB */ - { 31330, 0x000084DD }, /* GL_TEXTURE29 */ - { 31343, 0x000084DD }, /* GL_TEXTURE29_ARB */ - { 31360, 0x000084C2 }, /* GL_TEXTURE2_ARB */ - { 31376, 0x000084C3 }, /* GL_TEXTURE3 */ - { 31388, 0x000084DE }, /* GL_TEXTURE30 */ - { 31401, 0x000084DE }, /* GL_TEXTURE30_ARB */ - { 31418, 0x000084DF }, /* GL_TEXTURE31 */ - { 31431, 0x000084DF }, /* GL_TEXTURE31_ARB */ - { 31448, 0x000084C3 }, /* GL_TEXTURE3_ARB */ - { 31464, 0x000084C4 }, /* GL_TEXTURE4 */ - { 31476, 0x000084C4 }, /* GL_TEXTURE4_ARB */ - { 31492, 0x000084C5 }, /* GL_TEXTURE5 */ - { 31504, 0x000084C5 }, /* GL_TEXTURE5_ARB */ - { 31520, 0x000084C6 }, /* GL_TEXTURE6 */ - { 31532, 0x000084C6 }, /* GL_TEXTURE6_ARB */ - { 31548, 0x000084C7 }, /* GL_TEXTURE7 */ - { 31560, 0x000084C7 }, /* GL_TEXTURE7_ARB */ - { 31576, 0x000084C8 }, /* GL_TEXTURE8 */ - { 31588, 0x000084C8 }, /* GL_TEXTURE8_ARB */ - { 31604, 0x000084C9 }, /* GL_TEXTURE9 */ - { 31616, 0x000084C9 }, /* GL_TEXTURE9_ARB */ - { 31632, 0x00000DE0 }, /* GL_TEXTURE_1D */ - { 31646, 0x00008C18 }, /* GL_TEXTURE_1D_ARRAY_EXT */ - { 31670, 0x00000DE1 }, /* GL_TEXTURE_2D */ - { 31684, 0x00008C1A }, /* GL_TEXTURE_2D_ARRAY_EXT */ - { 31708, 0x0000806F }, /* GL_TEXTURE_3D */ - { 31722, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE */ - { 31744, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE_EXT */ - { 31770, 0x0000813C }, /* GL_TEXTURE_BASE_LEVEL */ - { 31792, 0x00008068 }, /* GL_TEXTURE_BINDING_1D */ - { 31814, 0x00008C1C }, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */ - { 31846, 0x00008069 }, /* GL_TEXTURE_BINDING_2D */ - { 31868, 0x00008C1D }, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */ - { 31900, 0x0000806A }, /* GL_TEXTURE_BINDING_3D */ - { 31922, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP */ - { 31950, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP_ARB */ - { 31982, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */ - { 32015, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_NV */ - { 32047, 0x00040000 }, /* GL_TEXTURE_BIT */ - { 32062, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE */ - { 32083, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE_EXT */ - { 32108, 0x00001005 }, /* GL_TEXTURE_BORDER */ - { 32126, 0x00001004 }, /* GL_TEXTURE_BORDER_COLOR */ - { 32150, 0x00008171 }, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */ - { 32181, 0x00008176 }, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */ - { 32211, 0x00008172 }, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */ - { 32241, 0x00008175 }, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */ - { 32276, 0x00008173 }, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */ - { 32307, 0x00008174 }, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */ - { 32345, 0x000080BC }, /* GL_TEXTURE_COLOR_TABLE_SGI */ - { 32372, 0x000081EF }, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */ - { 32404, 0x000080BF }, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ - { 32438, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC */ - { 32462, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC_ARB */ - { 32490, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE */ - { 32514, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE_ARB */ - { 32542, 0x0000819B }, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */ - { 32575, 0x0000819A }, /* GL_TEXTURE_COMPARE_SGIX */ - { 32599, 0x00001003 }, /* GL_TEXTURE_COMPONENTS */ - { 32621, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED */ - { 32643, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED_ARB */ - { 32669, 0x000086A3 }, /* GL_TEXTURE_COMPRESSED_FORMATS_ARB */ - { 32703, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */ - { 32736, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB */ - { 32773, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT */ - { 32801, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT_ARB */ - { 32833, 0x00008078 }, /* GL_TEXTURE_COORD_ARRAY */ - { 32856, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */ - { 32894, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB */ - { 32936, 0x00008092 }, /* GL_TEXTURE_COORD_ARRAY_POINTER */ - { 32967, 0x00008088 }, /* GL_TEXTURE_COORD_ARRAY_SIZE */ - { 32995, 0x0000808A }, /* GL_TEXTURE_COORD_ARRAY_STRIDE */ - { 33025, 0x00008089 }, /* GL_TEXTURE_COORD_ARRAY_TYPE */ - { 33053, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP */ - { 33073, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP_ARB */ - { 33097, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */ - { 33128, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB */ - { 33163, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */ - { 33194, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB */ - { 33229, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */ - { 33260, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB */ - { 33295, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */ - { 33326, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB */ - { 33361, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */ - { 33392, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB */ - { 33427, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */ - { 33458, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB */ - { 33493, 0x00008071 }, /* GL_TEXTURE_DEPTH */ - { 33510, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE */ - { 33532, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE_ARB */ - { 33558, 0x00002300 }, /* GL_TEXTURE_ENV */ - { 33573, 0x00002201 }, /* GL_TEXTURE_ENV_COLOR */ - { 33594, 0x00002200 }, /* GL_TEXTURE_ENV_MODE */ - { 33614, 0x00008500 }, /* GL_TEXTURE_FILTER_CONTROL */ - { 33640, 0x00002500 }, /* GL_TEXTURE_GEN_MODE */ - { 33660, 0x00000C63 }, /* GL_TEXTURE_GEN_Q */ - { 33677, 0x00000C62 }, /* GL_TEXTURE_GEN_R */ - { 33694, 0x00000C60 }, /* GL_TEXTURE_GEN_S */ - { 33711, 0x00000C61 }, /* GL_TEXTURE_GEN_T */ - { 33728, 0x0000819D }, /* GL_TEXTURE_GEQUAL_R_SGIX */ - { 33753, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE */ - { 33775, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE_EXT */ - { 33801, 0x00001001 }, /* GL_TEXTURE_HEIGHT */ - { 33819, 0x000080ED }, /* GL_TEXTURE_INDEX_SIZE_EXT */ - { 33845, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE */ - { 33871, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE_EXT */ - { 33901, 0x00001003 }, /* GL_TEXTURE_INTERNAL_FORMAT */ - { 33928, 0x0000819C }, /* GL_TEXTURE_LEQUAL_R_SGIX */ - { 33953, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS */ - { 33973, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS_EXT */ - { 33997, 0x00008190 }, /* GL_TEXTURE_LOD_BIAS_R_SGIX */ - { 34024, 0x0000818E }, /* GL_TEXTURE_LOD_BIAS_S_SGIX */ - { 34051, 0x0000818F }, /* GL_TEXTURE_LOD_BIAS_T_SGIX */ - { 34078, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE */ - { 34104, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE_EXT */ - { 34134, 0x00002800 }, /* GL_TEXTURE_MAG_FILTER */ - { 34156, 0x00000BA8 }, /* GL_TEXTURE_MATRIX */ - { 34174, 0x000084FE }, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */ - { 34204, 0x0000836B }, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */ - { 34232, 0x00008369 }, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */ - { 34260, 0x0000836A }, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */ - { 34288, 0x0000813D }, /* GL_TEXTURE_MAX_LEVEL */ - { 34309, 0x0000813B }, /* GL_TEXTURE_MAX_LOD */ - { 34328, 0x00002801 }, /* GL_TEXTURE_MIN_FILTER */ - { 34350, 0x0000813A }, /* GL_TEXTURE_MIN_LOD */ - { 34369, 0x00008066 }, /* GL_TEXTURE_PRIORITY */ - { 34389, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_ARB */ - { 34414, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_NV */ - { 34438, 0x0000805C }, /* GL_TEXTURE_RED_SIZE */ - { 34458, 0x0000805C }, /* GL_TEXTURE_RED_SIZE_EXT */ - { 34482, 0x00008067 }, /* GL_TEXTURE_RESIDENT */ - { 34502, 0x00000BA5 }, /* GL_TEXTURE_STACK_DEPTH */ - { 34525, 0x00008065 }, /* GL_TEXTURE_TOO_LARGE_EXT */ - { 34550, 0x0000888F }, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */ - { 34584, 0x00001000 }, /* GL_TEXTURE_WIDTH */ - { 34601, 0x00008072 }, /* GL_TEXTURE_WRAP_R */ - { 34619, 0x00002802 }, /* GL_TEXTURE_WRAP_S */ - { 34637, 0x00002803 }, /* GL_TEXTURE_WRAP_T */ - { 34655, 0x000088BF }, /* GL_TIME_ELAPSED_EXT */ - { 34675, 0x00008648 }, /* GL_TRACK_MATRIX_NV */ - { 34694, 0x00008649 }, /* GL_TRACK_MATRIX_TRANSFORM_NV */ - { 34723, 0x00001000 }, /* GL_TRANSFORM_BIT */ - { 34740, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX */ - { 34766, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX_ARB */ - { 34796, 0x000088B7 }, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */ - { 34828, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX */ - { 34858, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX_ARB */ - { 34892, 0x0000862C }, /* GL_TRANSPOSE_NV */ - { 34908, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX */ - { 34939, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX_ARB */ - { 34974, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX */ - { 35002, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX_ARB */ - { 35034, 0x00000004 }, /* GL_TRIANGLES */ - { 35047, 0x00000006 }, /* GL_TRIANGLE_FAN */ - { 35063, 0x00008615 }, /* GL_TRIANGLE_MESH_SUN */ - { 35084, 0x00000005 }, /* GL_TRIANGLE_STRIP */ - { 35102, 0x00000001 }, /* GL_TRUE */ - { 35110, 0x00000CF5 }, /* GL_UNPACK_ALIGNMENT */ - { 35130, 0x0000806E }, /* GL_UNPACK_IMAGE_HEIGHT */ - { 35153, 0x00000CF1 }, /* GL_UNPACK_LSB_FIRST */ - { 35173, 0x00000CF2 }, /* GL_UNPACK_ROW_LENGTH */ - { 35194, 0x0000806D }, /* GL_UNPACK_SKIP_IMAGES */ - { 35216, 0x00000CF4 }, /* GL_UNPACK_SKIP_PIXELS */ - { 35238, 0x00000CF3 }, /* GL_UNPACK_SKIP_ROWS */ - { 35258, 0x00000CF0 }, /* GL_UNPACK_SWAP_BYTES */ - { 35279, 0x00001401 }, /* GL_UNSIGNED_BYTE */ - { 35296, 0x00008362 }, /* GL_UNSIGNED_BYTE_2_3_3_REV */ - { 35323, 0x00008032 }, /* GL_UNSIGNED_BYTE_3_3_2 */ - { 35346, 0x00001405 }, /* GL_UNSIGNED_INT */ - { 35362, 0x00008036 }, /* GL_UNSIGNED_INT_10_10_10_2 */ - { 35389, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_NV */ - { 35413, 0x00008368 }, /* GL_UNSIGNED_INT_2_10_10_10_REV */ - { 35444, 0x00008035 }, /* GL_UNSIGNED_INT_8_8_8_8 */ - { 35468, 0x00008367 }, /* GL_UNSIGNED_INT_8_8_8_8_REV */ - { 35496, 0x00001403 }, /* GL_UNSIGNED_SHORT */ - { 35514, 0x00008366 }, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */ - { 35544, 0x00008033 }, /* GL_UNSIGNED_SHORT_4_4_4_4 */ - { 35570, 0x00008365 }, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */ - { 35600, 0x00008034 }, /* GL_UNSIGNED_SHORT_5_5_5_1 */ - { 35626, 0x00008363 }, /* GL_UNSIGNED_SHORT_5_6_5 */ - { 35650, 0x00008364 }, /* GL_UNSIGNED_SHORT_5_6_5_REV */ - { 35678, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_APPLE */ - { 35706, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_MESA */ - { 35733, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */ - { 35765, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_MESA */ - { 35796, 0x00008CA2 }, /* GL_UPPER_LEFT */ - { 35810, 0x00002A20 }, /* GL_V2F */ - { 35817, 0x00002A21 }, /* GL_V3F */ - { 35824, 0x00008B83 }, /* GL_VALIDATE_STATUS */ - { 35843, 0x00001F00 }, /* GL_VENDOR */ - { 35853, 0x00001F02 }, /* GL_VERSION */ - { 35864, 0x00008074 }, /* GL_VERTEX_ARRAY */ - { 35880, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING_APPLE */ - { 35910, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING */ - { 35941, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING_ARB */ - { 35976, 0x0000808E }, /* GL_VERTEX_ARRAY_POINTER */ - { 36000, 0x0000807A }, /* GL_VERTEX_ARRAY_SIZE */ - { 36021, 0x0000807C }, /* GL_VERTEX_ARRAY_STRIDE */ - { 36044, 0x0000807B }, /* GL_VERTEX_ARRAY_TYPE */ - { 36065, 0x00008650 }, /* GL_VERTEX_ATTRIB_ARRAY0_NV */ - { 36092, 0x0000865A }, /* GL_VERTEX_ATTRIB_ARRAY10_NV */ - { 36120, 0x0000865B }, /* GL_VERTEX_ATTRIB_ARRAY11_NV */ - { 36148, 0x0000865C }, /* GL_VERTEX_ATTRIB_ARRAY12_NV */ - { 36176, 0x0000865D }, /* GL_VERTEX_ATTRIB_ARRAY13_NV */ - { 36204, 0x0000865E }, /* GL_VERTEX_ATTRIB_ARRAY14_NV */ - { 36232, 0x0000865F }, /* GL_VERTEX_ATTRIB_ARRAY15_NV */ - { 36260, 0x00008651 }, /* GL_VERTEX_ATTRIB_ARRAY1_NV */ - { 36287, 0x00008652 }, /* GL_VERTEX_ATTRIB_ARRAY2_NV */ - { 36314, 0x00008653 }, /* GL_VERTEX_ATTRIB_ARRAY3_NV */ - { 36341, 0x00008654 }, /* GL_VERTEX_ATTRIB_ARRAY4_NV */ - { 36368, 0x00008655 }, /* GL_VERTEX_ATTRIB_ARRAY5_NV */ - { 36395, 0x00008656 }, /* GL_VERTEX_ATTRIB_ARRAY6_NV */ - { 36422, 0x00008657 }, /* GL_VERTEX_ATTRIB_ARRAY7_NV */ - { 36449, 0x00008658 }, /* GL_VERTEX_ATTRIB_ARRAY8_NV */ - { 36476, 0x00008659 }, /* GL_VERTEX_ATTRIB_ARRAY9_NV */ - { 36503, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */ - { 36541, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB */ - { 36583, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */ - { 36614, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */ - { 36649, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */ - { 36683, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */ - { 36721, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */ - { 36752, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */ - { 36787, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */ - { 36815, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */ - { 36847, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */ - { 36877, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */ - { 36911, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */ - { 36939, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */ - { 36971, 0x000086A7 }, /* GL_VERTEX_BLEND_ARB */ - { 36991, 0x00008620 }, /* GL_VERTEX_PROGRAM_ARB */ - { 37013, 0x0000864A }, /* GL_VERTEX_PROGRAM_BINDING_NV */ - { 37042, 0x00008620 }, /* GL_VERTEX_PROGRAM_NV */ - { 37063, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE */ - { 37092, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */ - { 37125, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */ - { 37157, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE */ - { 37184, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */ - { 37215, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */ - { 37245, 0x00008B31 }, /* GL_VERTEX_SHADER */ - { 37262, 0x00008B31 }, /* GL_VERTEX_SHADER_ARB */ - { 37283, 0x00008621 }, /* GL_VERTEX_STATE_PROGRAM_NV */ - { 37310, 0x00000BA2 }, /* GL_VIEWPORT */ - { 37322, 0x00000800 }, /* GL_VIEWPORT_BIT */ - { 37338, 0x000086AD }, /* GL_WEIGHT_ARRAY_ARB */ - { 37358, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */ - { 37389, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB */ - { 37424, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_ARB */ - { 37452, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_ARB */ - { 37477, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_ARB */ - { 37504, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_ARB */ - { 37529, 0x000086A6 }, /* GL_WEIGHT_SUM_UNITY_ARB */ - { 37553, 0x000081D4 }, /* GL_WRAP_BORDER_SUN */ - { 37572, 0x000088B9 }, /* GL_WRITE_ONLY */ - { 37586, 0x000088B9 }, /* GL_WRITE_ONLY_ARB */ - { 37604, 0x00001506 }, /* GL_XOR */ - { 37611, 0x000085B9 }, /* GL_YCBCR_422_APPLE */ - { 37630, 0x00008757 }, /* GL_YCBCR_MESA */ - { 37644, 0x00000000 }, /* GL_ZERO */ - { 37652, 0x00000D16 }, /* GL_ZOOM_X */ - { 37662, 0x00000D17 }, /* GL_ZOOM_Y */ + { 877, 0x00008894 }, /* GL_ARRAY_BUFFER_BINDING */ + { 901, 0x00008894 }, /* GL_ARRAY_BUFFER_BINDING_ARB */ + { 929, 0x00008B85 }, /* GL_ATTACHED_SHADERS */ + { 949, 0x00008645 }, /* GL_ATTRIB_ARRAY_POINTER_NV */ + { 976, 0x00008623 }, /* GL_ATTRIB_ARRAY_SIZE_NV */ + { 1000, 0x00008624 }, /* GL_ATTRIB_ARRAY_STRIDE_NV */ + { 1026, 0x00008625 }, /* GL_ATTRIB_ARRAY_TYPE_NV */ + { 1050, 0x00000BB0 }, /* GL_ATTRIB_STACK_DEPTH */ + { 1072, 0x00000D80 }, /* GL_AUTO_NORMAL */ + { 1087, 0x00000409 }, /* GL_AUX0 */ + { 1095, 0x0000040A }, /* GL_AUX1 */ + { 1103, 0x0000040B }, /* GL_AUX2 */ + { 1111, 0x0000040C }, /* GL_AUX3 */ + { 1119, 0x00000C00 }, /* GL_AUX_BUFFERS */ + { 1134, 0x00000405 }, /* GL_BACK */ + { 1142, 0x00000402 }, /* GL_BACK_LEFT */ + { 1155, 0x00000403 }, /* GL_BACK_RIGHT */ + { 1169, 0x000080E0 }, /* GL_BGR */ + { 1176, 0x000080E1 }, /* GL_BGRA */ + { 1184, 0x00001A00 }, /* GL_BITMAP */ + { 1194, 0x00000704 }, /* GL_BITMAP_TOKEN */ + { 1210, 0x00000BE2 }, /* GL_BLEND */ + { 1219, 0x00008005 }, /* GL_BLEND_COLOR */ + { 1234, 0x00008005 }, /* GL_BLEND_COLOR_EXT */ + { 1253, 0x00000BE0 }, /* GL_BLEND_DST */ + { 1266, 0x000080CA }, /* GL_BLEND_DST_ALPHA */ + { 1285, 0x000080C8 }, /* GL_BLEND_DST_RGB */ + { 1302, 0x00008009 }, /* GL_BLEND_EQUATION */ + { 1320, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA */ + { 1344, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA_EXT */ + { 1372, 0x00008009 }, /* GL_BLEND_EQUATION_EXT */ + { 1394, 0x00008009 }, /* GL_BLEND_EQUATION_RGB_EXT */ + { 1420, 0x00000BE1 }, /* GL_BLEND_SRC */ + { 1433, 0x000080CB }, /* GL_BLEND_SRC_ALPHA */ + { 1452, 0x000080C9 }, /* GL_BLEND_SRC_RGB */ + { 1469, 0x00001905 }, /* GL_BLUE */ + { 1477, 0x00000D1B }, /* GL_BLUE_BIAS */ + { 1490, 0x00000D54 }, /* GL_BLUE_BITS */ + { 1503, 0x00000D1A }, /* GL_BLUE_SCALE */ + { 1517, 0x00008B56 }, /* GL_BOOL */ + { 1525, 0x00008B56 }, /* GL_BOOL_ARB */ + { 1537, 0x00008B57 }, /* GL_BOOL_VEC2 */ + { 1550, 0x00008B57 }, /* GL_BOOL_VEC2_ARB */ + { 1567, 0x00008B58 }, /* GL_BOOL_VEC3 */ + { 1580, 0x00008B58 }, /* GL_BOOL_VEC3_ARB */ + { 1597, 0x00008B59 }, /* GL_BOOL_VEC4 */ + { 1610, 0x00008B59 }, /* GL_BOOL_VEC4_ARB */ + { 1627, 0x000088BB }, /* GL_BUFFER_ACCESS */ + { 1644, 0x000088BB }, /* GL_BUFFER_ACCESS_ARB */ + { 1665, 0x000088BC }, /* GL_BUFFER_MAPPED */ + { 1682, 0x000088BC }, /* GL_BUFFER_MAPPED_ARB */ + { 1703, 0x000088BD }, /* GL_BUFFER_MAP_POINTER */ + { 1725, 0x000088BD }, /* GL_BUFFER_MAP_POINTER_ARB */ + { 1751, 0x00008764 }, /* GL_BUFFER_SIZE */ + { 1766, 0x00008764 }, /* GL_BUFFER_SIZE_ARB */ + { 1785, 0x00008765 }, /* GL_BUFFER_USAGE */ + { 1801, 0x00008765 }, /* GL_BUFFER_USAGE_ARB */ + { 1821, 0x00001400 }, /* GL_BYTE */ + { 1829, 0x00002A24 }, /* GL_C3F_V3F */ + { 1840, 0x00002A26 }, /* GL_C4F_N3F_V3F */ + { 1855, 0x00002A22 }, /* GL_C4UB_V2F */ + { 1867, 0x00002A23 }, /* GL_C4UB_V3F */ + { 1879, 0x00000901 }, /* GL_CCW */ + { 1886, 0x00002900 }, /* GL_CLAMP */ + { 1895, 0x0000812D }, /* GL_CLAMP_TO_BORDER */ + { 1914, 0x0000812D }, /* GL_CLAMP_TO_BORDER_ARB */ + { 1937, 0x0000812D }, /* GL_CLAMP_TO_BORDER_SGIS */ + { 1961, 0x0000812F }, /* GL_CLAMP_TO_EDGE */ + { 1978, 0x0000812F }, /* GL_CLAMP_TO_EDGE_SGIS */ + { 2000, 0x00001500 }, /* GL_CLEAR */ + { 2009, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE */ + { 2034, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE_ARB */ + { 2063, 0xFFFFFFFF }, /* GL_CLIENT_ALL_ATTRIB_BITS */ + { 2089, 0x00000BB1 }, /* GL_CLIENT_ATTRIB_STACK_DEPTH */ + { 2118, 0x00000001 }, /* GL_CLIENT_PIXEL_STORE_BIT */ + { 2144, 0x00000002 }, /* GL_CLIENT_VERTEX_ARRAY_BIT */ + { 2171, 0x00003000 }, /* GL_CLIP_PLANE0 */ + { 2186, 0x00003001 }, /* GL_CLIP_PLANE1 */ + { 2201, 0x00003002 }, /* GL_CLIP_PLANE2 */ + { 2216, 0x00003003 }, /* GL_CLIP_PLANE3 */ + { 2231, 0x00003004 }, /* GL_CLIP_PLANE4 */ + { 2246, 0x00003005 }, /* GL_CLIP_PLANE5 */ + { 2261, 0x000080F0 }, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */ + { 2294, 0x00000A00 }, /* GL_COEFF */ + { 2303, 0x00001800 }, /* GL_COLOR */ + { 2312, 0x00008076 }, /* GL_COLOR_ARRAY */ + { 2327, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING */ + { 2357, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING_ARB */ + { 2391, 0x00008090 }, /* GL_COLOR_ARRAY_POINTER */ + { 2414, 0x00008081 }, /* GL_COLOR_ARRAY_SIZE */ + { 2434, 0x00008083 }, /* GL_COLOR_ARRAY_STRIDE */ + { 2456, 0x00008082 }, /* GL_COLOR_ARRAY_TYPE */ + { 2476, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0_EXT */ + { 2501, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10_EXT */ + { 2527, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11_EXT */ + { 2553, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12_EXT */ + { 2579, 0x00008CED }, /* GL_COLOR_ATTACHMENT13_EXT */ + { 2605, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14_EXT */ + { 2631, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15_EXT */ + { 2657, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1_EXT */ + { 2682, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2_EXT */ + { 2707, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3_EXT */ + { 2732, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4_EXT */ + { 2757, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5_EXT */ + { 2782, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6_EXT */ + { 2807, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7_EXT */ + { 2832, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8_EXT */ + { 2857, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9_EXT */ + { 2882, 0x00004000 }, /* GL_COLOR_BUFFER_BIT */ + { 2902, 0x00000C22 }, /* GL_COLOR_CLEAR_VALUE */ + { 2923, 0x00001900 }, /* GL_COLOR_INDEX */ + { 2938, 0x00001603 }, /* GL_COLOR_INDEXES */ + { 2955, 0x00000BF2 }, /* GL_COLOR_LOGIC_OP */ + { 2973, 0x00000B57 }, /* GL_COLOR_MATERIAL */ + { 2991, 0x00000B55 }, /* GL_COLOR_MATERIAL_FACE */ + { 3014, 0x00000B56 }, /* GL_COLOR_MATERIAL_PARAMETER */ + { 3042, 0x000080B1 }, /* GL_COLOR_MATRIX */ + { 3058, 0x000080B1 }, /* GL_COLOR_MATRIX_SGI */ + { 3078, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH */ + { 3106, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH_SGI */ + { 3138, 0x00008458 }, /* GL_COLOR_SUM */ + { 3151, 0x00008458 }, /* GL_COLOR_SUM_ARB */ + { 3168, 0x000080D0 }, /* GL_COLOR_TABLE */ + { 3183, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE */ + { 3209, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_EXT */ + { 3239, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_SGI */ + { 3269, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS */ + { 3289, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS_SGI */ + { 3313, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE */ + { 3338, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_EXT */ + { 3367, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_SGI */ + { 3396, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT */ + { 3418, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_EXT */ + { 3444, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_SGI */ + { 3470, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE */ + { 3496, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_EXT */ + { 3526, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_SGI */ + { 3556, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE */ + { 3586, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_EXT */ + { 3620, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_SGI */ + { 3654, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE */ + { 3684, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_EXT */ + { 3718, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_SGI */ + { 3752, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE */ + { 3776, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_EXT */ + { 3804, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_SGI */ + { 3832, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE */ + { 3853, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE_SGI */ + { 3878, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH */ + { 3899, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_EXT */ + { 3924, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_SGI */ + { 3949, 0x00000C23 }, /* GL_COLOR_WRITEMASK */ + { 3968, 0x00008570 }, /* GL_COMBINE */ + { 3979, 0x00008503 }, /* GL_COMBINE4 */ + { 3991, 0x00008572 }, /* GL_COMBINE_ALPHA */ + { 4008, 0x00008572 }, /* GL_COMBINE_ALPHA_ARB */ + { 4029, 0x00008572 }, /* GL_COMBINE_ALPHA_EXT */ + { 4050, 0x00008570 }, /* GL_COMBINE_ARB */ + { 4065, 0x00008570 }, /* GL_COMBINE_EXT */ + { 4080, 0x00008571 }, /* GL_COMBINE_RGB */ + { 4095, 0x00008571 }, /* GL_COMBINE_RGB_ARB */ + { 4114, 0x00008571 }, /* GL_COMBINE_RGB_EXT */ + { 4133, 0x0000884E }, /* GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT */ + { 4169, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE */ + { 4193, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE_ARB */ + { 4221, 0x00001300 }, /* GL_COMPILE */ + { 4232, 0x00001301 }, /* GL_COMPILE_AND_EXECUTE */ + { 4255, 0x00008B81 }, /* GL_COMPILE_STATUS */ + { 4273, 0x000084E9 }, /* GL_COMPRESSED_ALPHA */ + { 4293, 0x000084E9 }, /* GL_COMPRESSED_ALPHA_ARB */ + { 4317, 0x000084EC }, /* GL_COMPRESSED_INTENSITY */ + { 4341, 0x000084EC }, /* GL_COMPRESSED_INTENSITY_ARB */ + { 4369, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE */ + { 4393, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA */ + { 4423, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA_ARB */ + { 4457, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE_ARB */ + { 4485, 0x000084ED }, /* GL_COMPRESSED_RGB */ + { 4503, 0x000084EE }, /* GL_COMPRESSED_RGBA */ + { 4522, 0x000084EE }, /* GL_COMPRESSED_RGBA_ARB */ + { 4545, 0x000086B1 }, /* GL_COMPRESSED_RGBA_FXT1_3DFX */ + { 4574, 0x000083F1 }, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */ + { 4607, 0x000083F2 }, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */ + { 4640, 0x000083F3 }, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */ + { 4673, 0x000084ED }, /* GL_COMPRESSED_RGB_ARB */ + { 4695, 0x000086B0 }, /* GL_COMPRESSED_RGB_FXT1_3DFX */ + { 4723, 0x000083F0 }, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */ + { 4755, 0x000086A3 }, /* GL_COMPRESSED_TEXTURE_FORMATS */ + { 4785, 0x00008576 }, /* GL_CONSTANT */ + { 4797, 0x00008003 }, /* GL_CONSTANT_ALPHA */ + { 4815, 0x00008003 }, /* GL_CONSTANT_ALPHA_EXT */ + { 4837, 0x00008576 }, /* GL_CONSTANT_ARB */ + { 4853, 0x00001207 }, /* GL_CONSTANT_ATTENUATION */ + { 4877, 0x00008151 }, /* GL_CONSTANT_BORDER_HP */ + { 4899, 0x00008001 }, /* GL_CONSTANT_COLOR */ + { 4917, 0x00008001 }, /* GL_CONSTANT_COLOR_EXT */ + { 4939, 0x00008576 }, /* GL_CONSTANT_EXT */ + { 4955, 0x00008010 }, /* GL_CONVOLUTION_1D */ + { 4973, 0x00008011 }, /* GL_CONVOLUTION_2D */ + { 4991, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR */ + { 5019, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR_HP */ + { 5050, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE */ + { 5077, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE_EXT */ + { 5108, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS */ + { 5135, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS_EXT */ + { 5166, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE */ + { 5194, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE_EXT */ + { 5226, 0x00008017 }, /* GL_CONVOLUTION_FORMAT */ + { 5248, 0x00008017 }, /* GL_CONVOLUTION_FORMAT_EXT */ + { 5274, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT */ + { 5296, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT_EXT */ + { 5322, 0x00008018 }, /* GL_CONVOLUTION_WIDTH */ + { 5343, 0x00008018 }, /* GL_CONVOLUTION_WIDTH_EXT */ + { 5368, 0x00008862 }, /* GL_COORD_REPLACE */ + { 5385, 0x00008862 }, /* GL_COORD_REPLACE_ARB */ + { 5406, 0x00008862 }, /* GL_COORD_REPLACE_NV */ + { 5426, 0x00001503 }, /* GL_COPY */ + { 5434, 0x0000150C }, /* GL_COPY_INVERTED */ + { 5451, 0x00000706 }, /* GL_COPY_PIXEL_TOKEN */ + { 5471, 0x00000B44 }, /* GL_CULL_FACE */ + { 5484, 0x00000B45 }, /* GL_CULL_FACE_MODE */ + { 5502, 0x000081AA }, /* GL_CULL_VERTEX_EXT */ + { 5521, 0x000081AC }, /* GL_CULL_VERTEX_EYE_POSITION_EXT */ + { 5553, 0x000081AB }, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */ + { 5588, 0x00008626 }, /* GL_CURRENT_ATTRIB_NV */ + { 5609, 0x00000001 }, /* GL_CURRENT_BIT */ + { 5624, 0x00000B00 }, /* GL_CURRENT_COLOR */ + { 5641, 0x00008453 }, /* GL_CURRENT_FOG_COORD */ + { 5662, 0x00008453 }, /* GL_CURRENT_FOG_COORDINATE */ + { 5688, 0x00000B01 }, /* GL_CURRENT_INDEX */ + { 5705, 0x00008641 }, /* GL_CURRENT_MATRIX_ARB */ + { 5727, 0x00008845 }, /* GL_CURRENT_MATRIX_INDEX_ARB */ + { 5755, 0x00008641 }, /* GL_CURRENT_MATRIX_NV */ + { 5776, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */ + { 5810, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_NV */ + { 5843, 0x00000B02 }, /* GL_CURRENT_NORMAL */ + { 5861, 0x00008843 }, /* GL_CURRENT_PALETTE_MATRIX_ARB */ + { 5891, 0x00008B8D }, /* GL_CURRENT_PROGRAM */ + { 5910, 0x00008865 }, /* GL_CURRENT_QUERY */ + { 5927, 0x00008865 }, /* GL_CURRENT_QUERY_ARB */ + { 5948, 0x00000B04 }, /* GL_CURRENT_RASTER_COLOR */ + { 5972, 0x00000B09 }, /* GL_CURRENT_RASTER_DISTANCE */ + { 5999, 0x00000B05 }, /* GL_CURRENT_RASTER_INDEX */ + { 6023, 0x00000B07 }, /* GL_CURRENT_RASTER_POSITION */ + { 6050, 0x00000B08 }, /* GL_CURRENT_RASTER_POSITION_VALID */ + { 6083, 0x00000B06 }, /* GL_CURRENT_RASTER_TEXTURE_COORDS */ + { 6116, 0x00008459 }, /* GL_CURRENT_SECONDARY_COLOR */ + { 6143, 0x00000B03 }, /* GL_CURRENT_TEXTURE_COORDS */ + { 6169, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB */ + { 6194, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB_ARB */ + { 6223, 0x000086A8 }, /* GL_CURRENT_WEIGHT_ARB */ + { 6245, 0x00000900 }, /* GL_CW */ + { 6251, 0x0000875B }, /* GL_DEBUG_ASSERT_MESA */ + { 6272, 0x00008759 }, /* GL_DEBUG_OBJECT_MESA */ + { 6293, 0x0000875A }, /* GL_DEBUG_PRINT_MESA */ + { 6313, 0x00002101 }, /* GL_DECAL */ + { 6322, 0x00001E03 }, /* GL_DECR */ + { 6330, 0x00008508 }, /* GL_DECR_WRAP */ + { 6343, 0x00008508 }, /* GL_DECR_WRAP_EXT */ + { 6360, 0x00008B80 }, /* GL_DELETE_STATUS */ + { 6377, 0x00001801 }, /* GL_DEPTH */ + { 6386, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT_EXT */ + { 6410, 0x00000D1F }, /* GL_DEPTH_BIAS */ + { 6424, 0x00000D56 }, /* GL_DEPTH_BITS */ + { 6438, 0x00008891 }, /* GL_DEPTH_BOUNDS_EXT */ + { 6458, 0x00008890 }, /* GL_DEPTH_BOUNDS_TEST_EXT */ + { 6483, 0x00000100 }, /* GL_DEPTH_BUFFER_BIT */ + { 6503, 0x0000864F }, /* GL_DEPTH_CLAMP_NV */ + { 6521, 0x00000B73 }, /* GL_DEPTH_CLEAR_VALUE */ + { 6542, 0x00001902 }, /* GL_DEPTH_COMPONENT */ + { 6561, 0x000081A5 }, /* GL_DEPTH_COMPONENT16 */ + { 6582, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_ARB */ + { 6607, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_SGIX */ + { 6633, 0x000081A6 }, /* GL_DEPTH_COMPONENT24 */ + { 6654, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_ARB */ + { 6679, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_SGIX */ + { 6705, 0x000081A7 }, /* GL_DEPTH_COMPONENT32 */ + { 6726, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_ARB */ + { 6751, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_SGIX */ + { 6777, 0x00000B74 }, /* GL_DEPTH_FUNC */ + { 6791, 0x00000B70 }, /* GL_DEPTH_RANGE */ + { 6806, 0x00000D1E }, /* GL_DEPTH_SCALE */ + { 6821, 0x000084F9 }, /* GL_DEPTH_STENCIL_NV */ + { 6841, 0x0000886F }, /* GL_DEPTH_STENCIL_TO_BGRA_NV */ + { 6869, 0x0000886E }, /* GL_DEPTH_STENCIL_TO_RGBA_NV */ + { 6897, 0x00000B71 }, /* GL_DEPTH_TEST */ + { 6911, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE */ + { 6933, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE_ARB */ + { 6959, 0x00000B72 }, /* GL_DEPTH_WRITEMASK */ + { 6978, 0x00001201 }, /* GL_DIFFUSE */ + { 6989, 0x00000BD0 }, /* GL_DITHER */ + { 6999, 0x00000A02 }, /* GL_DOMAIN */ + { 7009, 0x00001100 }, /* GL_DONT_CARE */ + { 7022, 0x000086AE }, /* GL_DOT3_RGB */ + { 7034, 0x000086AF }, /* GL_DOT3_RGBA */ + { 7047, 0x000086AF }, /* GL_DOT3_RGBA_ARB */ + { 7064, 0x00008741 }, /* GL_DOT3_RGBA_EXT */ + { 7081, 0x000086AE }, /* GL_DOT3_RGB_ARB */ + { 7097, 0x00008740 }, /* GL_DOT3_RGB_EXT */ + { 7113, 0x0000140A }, /* GL_DOUBLE */ + { 7123, 0x00000C32 }, /* GL_DOUBLEBUFFER */ + { 7139, 0x00000C01 }, /* GL_DRAW_BUFFER */ + { 7154, 0x00008825 }, /* GL_DRAW_BUFFER0 */ + { 7170, 0x00008825 }, /* GL_DRAW_BUFFER0_ARB */ + { 7190, 0x00008825 }, /* GL_DRAW_BUFFER0_ATI */ + { 7210, 0x00008826 }, /* GL_DRAW_BUFFER1 */ + { 7226, 0x0000882F }, /* GL_DRAW_BUFFER10 */ + { 7243, 0x0000882F }, /* GL_DRAW_BUFFER10_ARB */ + { 7264, 0x0000882F }, /* GL_DRAW_BUFFER10_ATI */ + { 7285, 0x00008830 }, /* GL_DRAW_BUFFER11 */ + { 7302, 0x00008830 }, /* GL_DRAW_BUFFER11_ARB */ + { 7323, 0x00008830 }, /* GL_DRAW_BUFFER11_ATI */ + { 7344, 0x00008831 }, /* GL_DRAW_BUFFER12 */ + { 7361, 0x00008831 }, /* GL_DRAW_BUFFER12_ARB */ + { 7382, 0x00008831 }, /* GL_DRAW_BUFFER12_ATI */ + { 7403, 0x00008832 }, /* GL_DRAW_BUFFER13 */ + { 7420, 0x00008832 }, /* GL_DRAW_BUFFER13_ARB */ + { 7441, 0x00008832 }, /* GL_DRAW_BUFFER13_ATI */ + { 7462, 0x00008833 }, /* GL_DRAW_BUFFER14 */ + { 7479, 0x00008833 }, /* GL_DRAW_BUFFER14_ARB */ + { 7500, 0x00008833 }, /* GL_DRAW_BUFFER14_ATI */ + { 7521, 0x00008834 }, /* GL_DRAW_BUFFER15 */ + { 7538, 0x00008834 }, /* GL_DRAW_BUFFER15_ARB */ + { 7559, 0x00008834 }, /* GL_DRAW_BUFFER15_ATI */ + { 7580, 0x00008826 }, /* GL_DRAW_BUFFER1_ARB */ + { 7600, 0x00008826 }, /* GL_DRAW_BUFFER1_ATI */ + { 7620, 0x00008827 }, /* GL_DRAW_BUFFER2 */ + { 7636, 0x00008827 }, /* GL_DRAW_BUFFER2_ARB */ + { 7656, 0x00008827 }, /* GL_DRAW_BUFFER2_ATI */ + { 7676, 0x00008828 }, /* GL_DRAW_BUFFER3 */ + { 7692, 0x00008828 }, /* GL_DRAW_BUFFER3_ARB */ + { 7712, 0x00008828 }, /* GL_DRAW_BUFFER3_ATI */ + { 7732, 0x00008829 }, /* GL_DRAW_BUFFER4 */ + { 7748, 0x00008829 }, /* GL_DRAW_BUFFER4_ARB */ + { 7768, 0x00008829 }, /* GL_DRAW_BUFFER4_ATI */ + { 7788, 0x0000882A }, /* GL_DRAW_BUFFER5 */ + { 7804, 0x0000882A }, /* GL_DRAW_BUFFER5_ARB */ + { 7824, 0x0000882A }, /* GL_DRAW_BUFFER5_ATI */ + { 7844, 0x0000882B }, /* GL_DRAW_BUFFER6 */ + { 7860, 0x0000882B }, /* GL_DRAW_BUFFER6_ARB */ + { 7880, 0x0000882B }, /* GL_DRAW_BUFFER6_ATI */ + { 7900, 0x0000882C }, /* GL_DRAW_BUFFER7 */ + { 7916, 0x0000882C }, /* GL_DRAW_BUFFER7_ARB */ + { 7936, 0x0000882C }, /* GL_DRAW_BUFFER7_ATI */ + { 7956, 0x0000882D }, /* GL_DRAW_BUFFER8 */ + { 7972, 0x0000882D }, /* GL_DRAW_BUFFER8_ARB */ + { 7992, 0x0000882D }, /* GL_DRAW_BUFFER8_ATI */ + { 8012, 0x0000882E }, /* GL_DRAW_BUFFER9 */ + { 8028, 0x0000882E }, /* GL_DRAW_BUFFER9_ARB */ + { 8048, 0x0000882E }, /* GL_DRAW_BUFFER9_ATI */ + { 8068, 0x00008CA6 }, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */ + { 8100, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER_EXT */ + { 8124, 0x00000705 }, /* GL_DRAW_PIXEL_TOKEN */ + { 8144, 0x00000304 }, /* GL_DST_ALPHA */ + { 8157, 0x00000306 }, /* GL_DST_COLOR */ + { 8170, 0x000088EA }, /* GL_DYNAMIC_COPY */ + { 8186, 0x000088EA }, /* GL_DYNAMIC_COPY_ARB */ + { 8206, 0x000088E8 }, /* GL_DYNAMIC_DRAW */ + { 8222, 0x000088E8 }, /* GL_DYNAMIC_DRAW_ARB */ + { 8242, 0x000088E9 }, /* GL_DYNAMIC_READ */ + { 8258, 0x000088E9 }, /* GL_DYNAMIC_READ_ARB */ + { 8278, 0x00000B43 }, /* GL_EDGE_FLAG */ + { 8291, 0x00008079 }, /* GL_EDGE_FLAG_ARRAY */ + { 8310, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */ + { 8344, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB */ + { 8382, 0x00008093 }, /* GL_EDGE_FLAG_ARRAY_POINTER */ + { 8409, 0x0000808C }, /* GL_EDGE_FLAG_ARRAY_STRIDE */ + { 8435, 0x00008893 }, /* GL_ELEMENT_ARRAY_BUFFER */ + { 8459, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */ + { 8491, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB */ + { 8527, 0x00001600 }, /* GL_EMISSION */ + { 8539, 0x00002000 }, /* GL_ENABLE_BIT */ + { 8553, 0x00000202 }, /* GL_EQUAL */ + { 8562, 0x00001509 }, /* GL_EQUIV */ + { 8571, 0x00010000 }, /* GL_EVAL_BIT */ + { 8583, 0x00000800 }, /* GL_EXP */ + { 8590, 0x00000801 }, /* GL_EXP2 */ + { 8598, 0x00001F03 }, /* GL_EXTENSIONS */ + { 8612, 0x00002400 }, /* GL_EYE_LINEAR */ + { 8626, 0x00002502 }, /* GL_EYE_PLANE */ + { 8639, 0x0000855C }, /* GL_EYE_PLANE_ABSOLUTE_NV */ + { 8664, 0x0000855B }, /* GL_EYE_RADIAL_NV */ + { 8681, 0x00000000 }, /* GL_FALSE */ + { 8690, 0x00001101 }, /* GL_FASTEST */ + { 8701, 0x00001C01 }, /* GL_FEEDBACK */ + { 8713, 0x00000DF0 }, /* GL_FEEDBACK_BUFFER_POINTER */ + { 8740, 0x00000DF1 }, /* GL_FEEDBACK_BUFFER_SIZE */ + { 8764, 0x00000DF2 }, /* GL_FEEDBACK_BUFFER_TYPE */ + { 8788, 0x00001B02 }, /* GL_FILL */ + { 8796, 0x00001D00 }, /* GL_FLAT */ + { 8804, 0x00001406 }, /* GL_FLOAT */ + { 8813, 0x00008B5A }, /* GL_FLOAT_MAT2 */ + { 8827, 0x00008B5A }, /* GL_FLOAT_MAT2_ARB */ + { 8845, 0x00008B5B }, /* GL_FLOAT_MAT3 */ + { 8859, 0x00008B5B }, /* GL_FLOAT_MAT3_ARB */ + { 8877, 0x00008B5C }, /* GL_FLOAT_MAT4 */ + { 8891, 0x00008B5C }, /* GL_FLOAT_MAT4_ARB */ + { 8909, 0x00008B50 }, /* GL_FLOAT_VEC2 */ + { 8923, 0x00008B50 }, /* GL_FLOAT_VEC2_ARB */ + { 8941, 0x00008B51 }, /* GL_FLOAT_VEC3 */ + { 8955, 0x00008B51 }, /* GL_FLOAT_VEC3_ARB */ + { 8973, 0x00008B52 }, /* GL_FLOAT_VEC4 */ + { 8987, 0x00008B52 }, /* GL_FLOAT_VEC4_ARB */ + { 9005, 0x00000B60 }, /* GL_FOG */ + { 9012, 0x00000080 }, /* GL_FOG_BIT */ + { 9023, 0x00000B66 }, /* GL_FOG_COLOR */ + { 9036, 0x00008451 }, /* GL_FOG_COORD */ + { 9049, 0x00008451 }, /* GL_FOG_COORDINATE */ + { 9067, 0x00008457 }, /* GL_FOG_COORDINATE_ARRAY */ + { 9091, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */ + { 9130, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB */ + { 9173, 0x00008456 }, /* GL_FOG_COORDINATE_ARRAY_POINTER */ + { 9205, 0x00008455 }, /* GL_FOG_COORDINATE_ARRAY_STRIDE */ + { 9236, 0x00008454 }, /* GL_FOG_COORDINATE_ARRAY_TYPE */ + { 9265, 0x00008450 }, /* GL_FOG_COORDINATE_SOURCE */ + { 9290, 0x00008457 }, /* GL_FOG_COORD_ARRAY */ + { 9309, 0x0000889D }, /* GL_FOG_COORD_ARRAY_BUFFER_BINDING */ + { 9343, 0x00008456 }, /* GL_FOG_COORD_ARRAY_POINTER */ + { 9370, 0x00008455 }, /* GL_FOG_COORD_ARRAY_STRIDE */ + { 9396, 0x00008454 }, /* GL_FOG_COORD_ARRAY_TYPE */ + { 9420, 0x00008450 }, /* GL_FOG_COORD_SRC */ + { 9437, 0x00000B62 }, /* GL_FOG_DENSITY */ + { 9452, 0x0000855A }, /* GL_FOG_DISTANCE_MODE_NV */ + { 9476, 0x00000B64 }, /* GL_FOG_END */ + { 9487, 0x00000C54 }, /* GL_FOG_HINT */ + { 9499, 0x00000B61 }, /* GL_FOG_INDEX */ + { 9512, 0x00000B65 }, /* GL_FOG_MODE */ + { 9524, 0x00008198 }, /* GL_FOG_OFFSET_SGIX */ + { 9543, 0x00008199 }, /* GL_FOG_OFFSET_VALUE_SGIX */ + { 9568, 0x00000B63 }, /* GL_FOG_START */ + { 9581, 0x00008452 }, /* GL_FRAGMENT_DEPTH */ + { 9599, 0x00008804 }, /* GL_FRAGMENT_PROGRAM_ARB */ + { 9623, 0x00008B30 }, /* GL_FRAGMENT_SHADER */ + { 9642, 0x00008B30 }, /* GL_FRAGMENT_SHADER_ARB */ + { 9665, 0x00008B8B }, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */ + { 9700, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT */ + { 9742, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT */ + { 9784, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT */ + { 9833, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT */ + { 9885, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ + { 9929, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT */ + { 9973, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING_EXT */ + { 10000, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE_EXT */ + { 10028, 0x00008D40 }, /* GL_FRAMEBUFFER_EXT */ + { 10047, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT */ + { 10088, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */ + { 10129, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */ + { 10171, 0x00008CD8 }, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */ + { 10222, 0x00008CDA }, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */ + { 10260, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT */ + { 10309, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */ + { 10351, 0x00008CDE }, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */ + { 10383, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED_EXT */ + { 10414, 0x00000404 }, /* GL_FRONT */ + { 10423, 0x00000408 }, /* GL_FRONT_AND_BACK */ + { 10441, 0x00000B46 }, /* GL_FRONT_FACE */ + { 10455, 0x00000400 }, /* GL_FRONT_LEFT */ + { 10469, 0x00000401 }, /* GL_FRONT_RIGHT */ + { 10484, 0x00008006 }, /* GL_FUNC_ADD */ + { 10496, 0x00008006 }, /* GL_FUNC_ADD_EXT */ + { 10512, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT */ + { 10537, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT_EXT */ + { 10566, 0x0000800A }, /* GL_FUNC_SUBTRACT */ + { 10583, 0x0000800A }, /* GL_FUNC_SUBTRACT_EXT */ + { 10604, 0x00008191 }, /* GL_GENERATE_MIPMAP */ + { 10623, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT */ + { 10647, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT_SGIS */ + { 10676, 0x00008191 }, /* GL_GENERATE_MIPMAP_SGIS */ + { 10700, 0x00000206 }, /* GL_GEQUAL */ + { 10710, 0x00008009 }, /* GL_GL_BLEND_EQUATION_RGB */ + { 10735, 0x00008C4A }, /* GL_GL_COMPRESSED_SLUMINANCE */ + { 10763, 0x00008C4B }, /* GL_GL_COMPRESSED_SLUMINANCE_ALPHA */ + { 10797, 0x00008C48 }, /* GL_GL_COMPRESSED_SRGB */ + { 10819, 0x00008C49 }, /* GL_GL_COMPRESSED_SRGB_ALPHA */ + { 10847, 0x0000845F }, /* GL_GL_CURRENT_RASTER_SECONDARY_COLOR */ + { 10884, 0x00008B65 }, /* GL_GL_FLOAT_MAT2x3 */ + { 10903, 0x00008B66 }, /* GL_GL_FLOAT_MAT2x4 */ + { 10922, 0x00008B67 }, /* GL_GL_FLOAT_MAT3x2 */ + { 10941, 0x00008B68 }, /* GL_GL_FLOAT_MAT3x4 */ + { 10960, 0x00008B69 }, /* GL_GL_FLOAT_MAT4x2 */ + { 10979, 0x00008B6A }, /* GL_GL_FLOAT_MAT4x3 */ + { 10998, 0x000088EB }, /* GL_GL_PIXEL_PACK_BUFFER */ + { 11022, 0x000088ED }, /* GL_GL_PIXEL_PACK_BUFFER_BINDING */ + { 11054, 0x000088EC }, /* GL_GL_PIXEL_UNPACK_BUFFER */ + { 11080, 0x000088EF }, /* GL_GL_PIXEL_UNPACK_BUFFER_BINDING */ + { 11114, 0x00008C46 }, /* GL_GL_SLUMINANCE */ + { 11131, 0x00008C47 }, /* GL_GL_SLUMINANCE8 */ + { 11149, 0x00008C45 }, /* GL_GL_SLUMINANCE8_ALPHA8 */ + { 11174, 0x00008C44 }, /* GL_GL_SLUMINANCE_ALPHA */ + { 11197, 0x00008C40 }, /* GL_GL_SRGB */ + { 11208, 0x00008C41 }, /* GL_GL_SRGB8 */ + { 11220, 0x00008C43 }, /* GL_GL_SRGB8_ALPHA8 */ + { 11239, 0x00008C42 }, /* GL_GL_SRGB_ALPHA */ + { 11256, 0x00000204 }, /* GL_GREATER */ + { 11267, 0x00001904 }, /* GL_GREEN */ + { 11276, 0x00000D19 }, /* GL_GREEN_BIAS */ + { 11290, 0x00000D53 }, /* GL_GREEN_BITS */ + { 11304, 0x00000D18 }, /* GL_GREEN_SCALE */ + { 11319, 0x00008000 }, /* GL_HINT_BIT */ + { 11331, 0x00008024 }, /* GL_HISTOGRAM */ + { 11344, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE */ + { 11368, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE_EXT */ + { 11396, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE */ + { 11419, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE_EXT */ + { 11446, 0x00008024 }, /* GL_HISTOGRAM_EXT */ + { 11463, 0x00008027 }, /* GL_HISTOGRAM_FORMAT */ + { 11483, 0x00008027 }, /* GL_HISTOGRAM_FORMAT_EXT */ + { 11507, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE */ + { 11531, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE_EXT */ + { 11559, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE */ + { 11587, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE_EXT */ + { 11619, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE */ + { 11641, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE_EXT */ + { 11667, 0x0000802D }, /* GL_HISTOGRAM_SINK */ + { 11685, 0x0000802D }, /* GL_HISTOGRAM_SINK_EXT */ + { 11707, 0x00008026 }, /* GL_HISTOGRAM_WIDTH */ + { 11726, 0x00008026 }, /* GL_HISTOGRAM_WIDTH_EXT */ + { 11749, 0x0000862A }, /* GL_IDENTITY_NV */ + { 11764, 0x00008150 }, /* GL_IGNORE_BORDER_HP */ + { 11784, 0x00008B9B }, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */ + { 11824, 0x00008B9A }, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */ + { 11862, 0x00001E02 }, /* GL_INCR */ + { 11870, 0x00008507 }, /* GL_INCR_WRAP */ + { 11883, 0x00008507 }, /* GL_INCR_WRAP_EXT */ + { 11900, 0x00008077 }, /* GL_INDEX_ARRAY */ + { 11915, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING */ + { 11945, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING_ARB */ + { 11979, 0x00008091 }, /* GL_INDEX_ARRAY_POINTER */ + { 12002, 0x00008086 }, /* GL_INDEX_ARRAY_STRIDE */ + { 12024, 0x00008085 }, /* GL_INDEX_ARRAY_TYPE */ + { 12044, 0x00000D51 }, /* GL_INDEX_BITS */ + { 12058, 0x00000C20 }, /* GL_INDEX_CLEAR_VALUE */ + { 12079, 0x00000BF1 }, /* GL_INDEX_LOGIC_OP */ + { 12097, 0x00000C30 }, /* GL_INDEX_MODE */ + { 12111, 0x00000D13 }, /* GL_INDEX_OFFSET */ + { 12127, 0x00000D12 }, /* GL_INDEX_SHIFT */ + { 12142, 0x00000C21 }, /* GL_INDEX_WRITEMASK */ + { 12161, 0x00008B84 }, /* GL_INFO_LOG_LENGTH */ + { 12180, 0x00001404 }, /* GL_INT */ + { 12187, 0x00008049 }, /* GL_INTENSITY */ + { 12200, 0x0000804C }, /* GL_INTENSITY12 */ + { 12215, 0x0000804C }, /* GL_INTENSITY12_EXT */ + { 12234, 0x0000804D }, /* GL_INTENSITY16 */ + { 12249, 0x0000804D }, /* GL_INTENSITY16_EXT */ + { 12268, 0x0000804A }, /* GL_INTENSITY4 */ + { 12282, 0x0000804A }, /* GL_INTENSITY4_EXT */ + { 12300, 0x0000804B }, /* GL_INTENSITY8 */ + { 12314, 0x0000804B }, /* GL_INTENSITY8_EXT */ + { 12332, 0x00008049 }, /* GL_INTENSITY_EXT */ + { 12349, 0x00008575 }, /* GL_INTERPOLATE */ + { 12364, 0x00008575 }, /* GL_INTERPOLATE_ARB */ + { 12383, 0x00008575 }, /* GL_INTERPOLATE_EXT */ + { 12402, 0x00008B53 }, /* GL_INT_VEC2 */ + { 12414, 0x00008B53 }, /* GL_INT_VEC2_ARB */ + { 12430, 0x00008B54 }, /* GL_INT_VEC3 */ + { 12442, 0x00008B54 }, /* GL_INT_VEC3_ARB */ + { 12458, 0x00008B55 }, /* GL_INT_VEC4 */ + { 12470, 0x00008B55 }, /* GL_INT_VEC4_ARB */ + { 12486, 0x00000500 }, /* GL_INVALID_ENUM */ + { 12502, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION_EXT */ + { 12539, 0x00000502 }, /* GL_INVALID_OPERATION */ + { 12560, 0x00000501 }, /* GL_INVALID_VALUE */ + { 12577, 0x0000862B }, /* GL_INVERSE_NV */ + { 12591, 0x0000862D }, /* GL_INVERSE_TRANSPOSE_NV */ + { 12615, 0x0000150A }, /* GL_INVERT */ + { 12625, 0x00001E00 }, /* GL_KEEP */ + { 12633, 0x00000406 }, /* GL_LEFT */ + { 12641, 0x00000203 }, /* GL_LEQUAL */ + { 12651, 0x00000201 }, /* GL_LESS */ + { 12659, 0x00004000 }, /* GL_LIGHT0 */ + { 12669, 0x00004001 }, /* GL_LIGHT1 */ + { 12679, 0x00004002 }, /* GL_LIGHT2 */ + { 12689, 0x00004003 }, /* GL_LIGHT3 */ + { 12699, 0x00004004 }, /* GL_LIGHT4 */ + { 12709, 0x00004005 }, /* GL_LIGHT5 */ + { 12719, 0x00004006 }, /* GL_LIGHT6 */ + { 12729, 0x00004007 }, /* GL_LIGHT7 */ + { 12739, 0x00000B50 }, /* GL_LIGHTING */ + { 12751, 0x00000040 }, /* GL_LIGHTING_BIT */ + { 12767, 0x00000B53 }, /* GL_LIGHT_MODEL_AMBIENT */ + { 12790, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL */ + { 12819, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL_EXT */ + { 12852, 0x00000B51 }, /* GL_LIGHT_MODEL_LOCAL_VIEWER */ + { 12880, 0x00000B52 }, /* GL_LIGHT_MODEL_TWO_SIDE */ + { 12904, 0x00001B01 }, /* GL_LINE */ + { 12912, 0x00002601 }, /* GL_LINEAR */ + { 12922, 0x00001208 }, /* GL_LINEAR_ATTENUATION */ + { 12944, 0x00008170 }, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */ + { 12974, 0x0000844F }, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */ + { 13005, 0x00002703 }, /* GL_LINEAR_MIPMAP_LINEAR */ + { 13029, 0x00002701 }, /* GL_LINEAR_MIPMAP_NEAREST */ + { 13054, 0x00000001 }, /* GL_LINES */ + { 13063, 0x00000004 }, /* GL_LINE_BIT */ + { 13075, 0x00000002 }, /* GL_LINE_LOOP */ + { 13088, 0x00000707 }, /* GL_LINE_RESET_TOKEN */ + { 13108, 0x00000B20 }, /* GL_LINE_SMOOTH */ + { 13123, 0x00000C52 }, /* GL_LINE_SMOOTH_HINT */ + { 13143, 0x00000B24 }, /* GL_LINE_STIPPLE */ + { 13159, 0x00000B25 }, /* GL_LINE_STIPPLE_PATTERN */ + { 13183, 0x00000B26 }, /* GL_LINE_STIPPLE_REPEAT */ + { 13206, 0x00000003 }, /* GL_LINE_STRIP */ + { 13220, 0x00000702 }, /* GL_LINE_TOKEN */ + { 13234, 0x00000B21 }, /* GL_LINE_WIDTH */ + { 13248, 0x00000B23 }, /* GL_LINE_WIDTH_GRANULARITY */ + { 13274, 0x00000B22 }, /* GL_LINE_WIDTH_RANGE */ + { 13294, 0x00008B82 }, /* GL_LINK_STATUS */ + { 13309, 0x00000B32 }, /* GL_LIST_BASE */ + { 13322, 0x00020000 }, /* GL_LIST_BIT */ + { 13334, 0x00000B33 }, /* GL_LIST_INDEX */ + { 13348, 0x00000B30 }, /* GL_LIST_MODE */ + { 13361, 0x00000101 }, /* GL_LOAD */ + { 13369, 0x00000BF1 }, /* GL_LOGIC_OP */ + { 13381, 0x00000BF0 }, /* GL_LOGIC_OP_MODE */ + { 13398, 0x00008CA1 }, /* GL_LOWER_LEFT */ + { 13412, 0x00001909 }, /* GL_LUMINANCE */ + { 13425, 0x00008041 }, /* GL_LUMINANCE12 */ + { 13440, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12 */ + { 13463, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12_EXT */ + { 13490, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4 */ + { 13512, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4_EXT */ + { 13538, 0x00008041 }, /* GL_LUMINANCE12_EXT */ + { 13557, 0x00008042 }, /* GL_LUMINANCE16 */ + { 13572, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16 */ + { 13595, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16_EXT */ + { 13622, 0x00008042 }, /* GL_LUMINANCE16_EXT */ + { 13641, 0x0000803F }, /* GL_LUMINANCE4 */ + { 13655, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4 */ + { 13676, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4_EXT */ + { 13701, 0x0000803F }, /* GL_LUMINANCE4_EXT */ + { 13719, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2 */ + { 13740, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2_EXT */ + { 13765, 0x00008040 }, /* GL_LUMINANCE8 */ + { 13779, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8 */ + { 13800, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8_EXT */ + { 13825, 0x00008040 }, /* GL_LUMINANCE8_EXT */ + { 13843, 0x0000190A }, /* GL_LUMINANCE_ALPHA */ + { 13862, 0x00000D90 }, /* GL_MAP1_COLOR_4 */ + { 13878, 0x00000DD0 }, /* GL_MAP1_GRID_DOMAIN */ + { 13898, 0x00000DD1 }, /* GL_MAP1_GRID_SEGMENTS */ + { 13920, 0x00000D91 }, /* GL_MAP1_INDEX */ + { 13934, 0x00000D92 }, /* GL_MAP1_NORMAL */ + { 13949, 0x00000D93 }, /* GL_MAP1_TEXTURE_COORD_1 */ + { 13973, 0x00000D94 }, /* GL_MAP1_TEXTURE_COORD_2 */ + { 13997, 0x00000D95 }, /* GL_MAP1_TEXTURE_COORD_3 */ + { 14021, 0x00000D96 }, /* GL_MAP1_TEXTURE_COORD_4 */ + { 14045, 0x00000D97 }, /* GL_MAP1_VERTEX_3 */ + { 14062, 0x00000D98 }, /* GL_MAP1_VERTEX_4 */ + { 14079, 0x00008660 }, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */ + { 14107, 0x0000866A }, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */ + { 14136, 0x0000866B }, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */ + { 14165, 0x0000866C }, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */ + { 14194, 0x0000866D }, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */ + { 14223, 0x0000866E }, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */ + { 14252, 0x0000866F }, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */ + { 14281, 0x00008661 }, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */ + { 14309, 0x00008662 }, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */ + { 14337, 0x00008663 }, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */ + { 14365, 0x00008664 }, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */ + { 14393, 0x00008665 }, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */ + { 14421, 0x00008666 }, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */ + { 14449, 0x00008667 }, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */ + { 14477, 0x00008668 }, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */ + { 14505, 0x00008669 }, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */ + { 14533, 0x00000DB0 }, /* GL_MAP2_COLOR_4 */ + { 14549, 0x00000DD2 }, /* GL_MAP2_GRID_DOMAIN */ + { 14569, 0x00000DD3 }, /* GL_MAP2_GRID_SEGMENTS */ + { 14591, 0x00000DB1 }, /* GL_MAP2_INDEX */ + { 14605, 0x00000DB2 }, /* GL_MAP2_NORMAL */ + { 14620, 0x00000DB3 }, /* GL_MAP2_TEXTURE_COORD_1 */ + { 14644, 0x00000DB4 }, /* GL_MAP2_TEXTURE_COORD_2 */ + { 14668, 0x00000DB5 }, /* GL_MAP2_TEXTURE_COORD_3 */ + { 14692, 0x00000DB6 }, /* GL_MAP2_TEXTURE_COORD_4 */ + { 14716, 0x00000DB7 }, /* GL_MAP2_VERTEX_3 */ + { 14733, 0x00000DB8 }, /* GL_MAP2_VERTEX_4 */ + { 14750, 0x00008670 }, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */ + { 14778, 0x0000867A }, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */ + { 14807, 0x0000867B }, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */ + { 14836, 0x0000867C }, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */ + { 14865, 0x0000867D }, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */ + { 14894, 0x0000867E }, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */ + { 14923, 0x0000867F }, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */ + { 14952, 0x00008671 }, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */ + { 14980, 0x00008672 }, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */ + { 15008, 0x00008673 }, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */ + { 15036, 0x00008674 }, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */ + { 15064, 0x00008675 }, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */ + { 15092, 0x00008676 }, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */ + { 15120, 0x00008677 }, /* GL_MAP2_VERTEX_ATTRIB7_4_NV */ + { 15148, 0x00008678 }, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */ + { 15176, 0x00008679 }, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */ + { 15204, 0x00000D10 }, /* GL_MAP_COLOR */ + { 15217, 0x00000D11 }, /* GL_MAP_STENCIL */ + { 15232, 0x000088C0 }, /* GL_MATRIX0_ARB */ + { 15247, 0x00008630 }, /* GL_MATRIX0_NV */ + { 15261, 0x000088CA }, /* GL_MATRIX10_ARB */ + { 15277, 0x000088CB }, /* GL_MATRIX11_ARB */ + { 15293, 0x000088CC }, /* GL_MATRIX12_ARB */ + { 15309, 0x000088CD }, /* GL_MATRIX13_ARB */ + { 15325, 0x000088CE }, /* GL_MATRIX14_ARB */ + { 15341, 0x000088CF }, /* GL_MATRIX15_ARB */ + { 15357, 0x000088D0 }, /* GL_MATRIX16_ARB */ + { 15373, 0x000088D1 }, /* GL_MATRIX17_ARB */ + { 15389, 0x000088D2 }, /* GL_MATRIX18_ARB */ + { 15405, 0x000088D3 }, /* GL_MATRIX19_ARB */ + { 15421, 0x000088C1 }, /* GL_MATRIX1_ARB */ + { 15436, 0x00008631 }, /* GL_MATRIX1_NV */ + { 15450, 0x000088D4 }, /* GL_MATRIX20_ARB */ + { 15466, 0x000088D5 }, /* GL_MATRIX21_ARB */ + { 15482, 0x000088D6 }, /* GL_MATRIX22_ARB */ + { 15498, 0x000088D7 }, /* GL_MATRIX23_ARB */ + { 15514, 0x000088D8 }, /* GL_MATRIX24_ARB */ + { 15530, 0x000088D9 }, /* GL_MATRIX25_ARB */ + { 15546, 0x000088DA }, /* GL_MATRIX26_ARB */ + { 15562, 0x000088DB }, /* GL_MATRIX27_ARB */ + { 15578, 0x000088DC }, /* GL_MATRIX28_ARB */ + { 15594, 0x000088DD }, /* GL_MATRIX29_ARB */ + { 15610, 0x000088C2 }, /* GL_MATRIX2_ARB */ + { 15625, 0x00008632 }, /* GL_MATRIX2_NV */ + { 15639, 0x000088DE }, /* GL_MATRIX30_ARB */ + { 15655, 0x000088DF }, /* GL_MATRIX31_ARB */ + { 15671, 0x000088C3 }, /* GL_MATRIX3_ARB */ + { 15686, 0x00008633 }, /* GL_MATRIX3_NV */ + { 15700, 0x000088C4 }, /* GL_MATRIX4_ARB */ + { 15715, 0x00008634 }, /* GL_MATRIX4_NV */ + { 15729, 0x000088C5 }, /* GL_MATRIX5_ARB */ + { 15744, 0x00008635 }, /* GL_MATRIX5_NV */ + { 15758, 0x000088C6 }, /* GL_MATRIX6_ARB */ + { 15773, 0x00008636 }, /* GL_MATRIX6_NV */ + { 15787, 0x000088C7 }, /* GL_MATRIX7_ARB */ + { 15802, 0x00008637 }, /* GL_MATRIX7_NV */ + { 15816, 0x000088C8 }, /* GL_MATRIX8_ARB */ + { 15831, 0x000088C9 }, /* GL_MATRIX9_ARB */ + { 15846, 0x00008844 }, /* GL_MATRIX_INDEX_ARRAY_ARB */ + { 15872, 0x00008849 }, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */ + { 15906, 0x00008846 }, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */ + { 15937, 0x00008848 }, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */ + { 15970, 0x00008847 }, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */ + { 16001, 0x00000BA0 }, /* GL_MATRIX_MODE */ + { 16016, 0x00008840 }, /* GL_MATRIX_PALETTE_ARB */ + { 16038, 0x00008008 }, /* GL_MAX */ + { 16045, 0x00008073 }, /* GL_MAX_3D_TEXTURE_SIZE */ + { 16068, 0x000088FF }, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */ + { 16100, 0x00000D35 }, /* GL_MAX_ATTRIB_STACK_DEPTH */ + { 16126, 0x00000D3B }, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */ + { 16159, 0x00008177 }, /* GL_MAX_CLIPMAP_DEPTH_SGIX */ + { 16185, 0x00008178 }, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */ + { 16219, 0x00000D32 }, /* GL_MAX_CLIP_PLANES */ + { 16238, 0x00008CDF }, /* GL_MAX_COLOR_ATTACHMENTS_EXT */ + { 16267, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */ + { 16299, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI */ + { 16335, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */ + { 16371, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB */ + { 16411, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT */ + { 16437, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT_EXT */ + { 16467, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH */ + { 16492, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH_EXT */ + { 16521, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */ + { 16550, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB */ + { 16583, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS */ + { 16603, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ARB */ + { 16627, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ATI */ + { 16651, 0x000080E9 }, /* GL_MAX_ELEMENTS_INDICES */ + { 16675, 0x000080E8 }, /* GL_MAX_ELEMENTS_VERTICES */ + { 16700, 0x00000D30 }, /* GL_MAX_EVAL_ORDER */ + { 16718, 0x00008008 }, /* GL_MAX_EXT */ + { 16729, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */ + { 16764, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB */ + { 16803, 0x00000D31 }, /* GL_MAX_LIGHTS */ + { 16817, 0x00000B31 }, /* GL_MAX_LIST_NESTING */ + { 16837, 0x00008841 }, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */ + { 16875, 0x00000D36 }, /* GL_MAX_MODELVIEW_STACK_DEPTH */ + { 16904, 0x00000D37 }, /* GL_MAX_NAME_STACK_DEPTH */ + { 16928, 0x00008842 }, /* GL_MAX_PALETTE_MATRICES_ARB */ + { 16956, 0x00000D34 }, /* GL_MAX_PIXEL_MAP_TABLE */ + { 16979, 0x000088B1 }, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */ + { 17016, 0x0000880B }, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */ + { 17052, 0x000088AD }, /* GL_MAX_PROGRAM_ATTRIBS_ARB */ + { 17079, 0x000088F5 }, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */ + { 17108, 0x000088B5 }, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */ + { 17142, 0x000088F4 }, /* GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ + { 17178, 0x000088F6 }, /* GL_MAX_PROGRAM_IF_DEPTH_NV */ + { 17205, 0x000088A1 }, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */ + { 17237, 0x000088B4 }, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */ + { 17273, 0x000088F8 }, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */ + { 17302, 0x000088F7 }, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */ + { 17331, 0x0000862F }, /* GL_MAX_PROGRAM_MATRICES_ARB */ + { 17359, 0x0000862E }, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */ + { 17397, 0x000088B3 }, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */ + { 17441, 0x0000880E }, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */ + { 17484, 0x000088AF }, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */ + { 17518, 0x000088A3 }, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */ + { 17557, 0x000088AB }, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */ + { 17594, 0x000088A7 }, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */ + { 17632, 0x00008810 }, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */ + { 17675, 0x0000880F }, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */ + { 17718, 0x000088A9 }, /* GL_MAX_PROGRAM_PARAMETERS_ARB */ + { 17748, 0x000088A5 }, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */ + { 17779, 0x0000880D }, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */ + { 17815, 0x0000880C }, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */ + { 17851, 0x00000D38 }, /* GL_MAX_PROJECTION_STACK_DEPTH */ + { 17881, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */ + { 17915, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_NV */ + { 17948, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE_EXT */ + { 17977, 0x00008504 }, /* GL_MAX_SHININESS_NV */ + { 17997, 0x00008505 }, /* GL_MAX_SPOT_EXPONENT_NV */ + { 18021, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS */ + { 18043, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS_ARB */ + { 18069, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS */ + { 18096, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS_ARB */ + { 18127, 0x000084FD }, /* GL_MAX_TEXTURE_LOD_BIAS */ + { 18151, 0x000084FF }, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */ + { 18185, 0x00000D33 }, /* GL_MAX_TEXTURE_SIZE */ + { 18205, 0x00000D39 }, /* GL_MAX_TEXTURE_STACK_DEPTH */ + { 18232, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS */ + { 18253, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS_ARB */ + { 18278, 0x0000862F }, /* GL_MAX_TRACK_MATRICES_NV */ + { 18303, 0x0000862E }, /* GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV */ + { 18338, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS */ + { 18360, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS_ARB */ + { 18386, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS */ + { 18408, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS_ARB */ + { 18434, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */ + { 18468, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ + { 18506, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */ + { 18539, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB */ + { 18576, 0x000086A4 }, /* GL_MAX_VERTEX_UNITS_ARB */ + { 18600, 0x00000D3A }, /* GL_MAX_VIEWPORT_DIMS */ + { 18621, 0x00008007 }, /* GL_MIN */ + { 18628, 0x0000802E }, /* GL_MINMAX */ + { 18638, 0x0000802E }, /* GL_MINMAX_EXT */ + { 18652, 0x0000802F }, /* GL_MINMAX_FORMAT */ + { 18669, 0x0000802F }, /* GL_MINMAX_FORMAT_EXT */ + { 18690, 0x00008030 }, /* GL_MINMAX_SINK */ + { 18705, 0x00008030 }, /* GL_MINMAX_SINK_EXT */ + { 18724, 0x00008007 }, /* GL_MIN_EXT */ + { 18735, 0x00008370 }, /* GL_MIRRORED_REPEAT */ + { 18754, 0x00008370 }, /* GL_MIRRORED_REPEAT_ARB */ + { 18777, 0x00008370 }, /* GL_MIRRORED_REPEAT_IBM */ + { 18800, 0x00008742 }, /* GL_MIRROR_CLAMP_ATI */ + { 18820, 0x00008742 }, /* GL_MIRROR_CLAMP_EXT */ + { 18840, 0x00008912 }, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */ + { 18870, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_ATI */ + { 18898, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */ + { 18926, 0x00001700 }, /* GL_MODELVIEW */ + { 18939, 0x00001700 }, /* GL_MODELVIEW0_ARB */ + { 18957, 0x0000872A }, /* GL_MODELVIEW10_ARB */ + { 18976, 0x0000872B }, /* GL_MODELVIEW11_ARB */ + { 18995, 0x0000872C }, /* GL_MODELVIEW12_ARB */ + { 19014, 0x0000872D }, /* GL_MODELVIEW13_ARB */ + { 19033, 0x0000872E }, /* GL_MODELVIEW14_ARB */ + { 19052, 0x0000872F }, /* GL_MODELVIEW15_ARB */ + { 19071, 0x00008730 }, /* GL_MODELVIEW16_ARB */ + { 19090, 0x00008731 }, /* GL_MODELVIEW17_ARB */ + { 19109, 0x00008732 }, /* GL_MODELVIEW18_ARB */ + { 19128, 0x00008733 }, /* GL_MODELVIEW19_ARB */ + { 19147, 0x0000850A }, /* GL_MODELVIEW1_ARB */ + { 19165, 0x00008734 }, /* GL_MODELVIEW20_ARB */ + { 19184, 0x00008735 }, /* GL_MODELVIEW21_ARB */ + { 19203, 0x00008736 }, /* GL_MODELVIEW22_ARB */ + { 19222, 0x00008737 }, /* GL_MODELVIEW23_ARB */ + { 19241, 0x00008738 }, /* GL_MODELVIEW24_ARB */ + { 19260, 0x00008739 }, /* GL_MODELVIEW25_ARB */ + { 19279, 0x0000873A }, /* GL_MODELVIEW26_ARB */ + { 19298, 0x0000873B }, /* GL_MODELVIEW27_ARB */ + { 19317, 0x0000873C }, /* GL_MODELVIEW28_ARB */ + { 19336, 0x0000873D }, /* GL_MODELVIEW29_ARB */ + { 19355, 0x00008722 }, /* GL_MODELVIEW2_ARB */ + { 19373, 0x0000873E }, /* GL_MODELVIEW30_ARB */ + { 19392, 0x0000873F }, /* GL_MODELVIEW31_ARB */ + { 19411, 0x00008723 }, /* GL_MODELVIEW3_ARB */ + { 19429, 0x00008724 }, /* GL_MODELVIEW4_ARB */ + { 19447, 0x00008725 }, /* GL_MODELVIEW5_ARB */ + { 19465, 0x00008726 }, /* GL_MODELVIEW6_ARB */ + { 19483, 0x00008727 }, /* GL_MODELVIEW7_ARB */ + { 19501, 0x00008728 }, /* GL_MODELVIEW8_ARB */ + { 19519, 0x00008729 }, /* GL_MODELVIEW9_ARB */ + { 19537, 0x00000BA6 }, /* GL_MODELVIEW_MATRIX */ + { 19557, 0x00008629 }, /* GL_MODELVIEW_PROJECTION_NV */ + { 19584, 0x00000BA3 }, /* GL_MODELVIEW_STACK_DEPTH */ + { 19609, 0x00002100 }, /* GL_MODULATE */ + { 19621, 0x00008744 }, /* GL_MODULATE_ADD_ATI */ + { 19641, 0x00008745 }, /* GL_MODULATE_SIGNED_ADD_ATI */ + { 19668, 0x00008746 }, /* GL_MODULATE_SUBTRACT_ATI */ + { 19693, 0x00000103 }, /* GL_MULT */ + { 19701, 0x0000809D }, /* GL_MULTISAMPLE */ + { 19716, 0x000086B2 }, /* GL_MULTISAMPLE_3DFX */ + { 19736, 0x0000809D }, /* GL_MULTISAMPLE_ARB */ + { 19755, 0x20000000 }, /* GL_MULTISAMPLE_BIT */ + { 19774, 0x20000000 }, /* GL_MULTISAMPLE_BIT_3DFX */ + { 19798, 0x20000000 }, /* GL_MULTISAMPLE_BIT_ARB */ + { 19821, 0x00008534 }, /* GL_MULTISAMPLE_FILTER_HINT_NV */ + { 19851, 0x00002A25 }, /* GL_N3F_V3F */ + { 19862, 0x00000D70 }, /* GL_NAME_STACK_DEPTH */ + { 19882, 0x0000150E }, /* GL_NAND */ + { 19890, 0x00002600 }, /* GL_NEAREST */ + { 19901, 0x0000844E }, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */ + { 19932, 0x0000844D }, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */ + { 19964, 0x00002702 }, /* GL_NEAREST_MIPMAP_LINEAR */ + { 19989, 0x00002700 }, /* GL_NEAREST_MIPMAP_NEAREST */ + { 20015, 0x00000200 }, /* GL_NEVER */ + { 20024, 0x00001102 }, /* GL_NICEST */ + { 20034, 0x00000000 }, /* GL_NONE */ + { 20042, 0x00001505 }, /* GL_NOOP */ + { 20050, 0x00001508 }, /* GL_NOR */ + { 20057, 0x00000BA1 }, /* GL_NORMALIZE */ + { 20070, 0x00008075 }, /* GL_NORMAL_ARRAY */ + { 20086, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING */ + { 20117, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING_ARB */ + { 20152, 0x0000808F }, /* GL_NORMAL_ARRAY_POINTER */ + { 20176, 0x0000807F }, /* GL_NORMAL_ARRAY_STRIDE */ + { 20199, 0x0000807E }, /* GL_NORMAL_ARRAY_TYPE */ + { 20220, 0x00008511 }, /* GL_NORMAL_MAP */ + { 20234, 0x00008511 }, /* GL_NORMAL_MAP_ARB */ + { 20252, 0x00008511 }, /* GL_NORMAL_MAP_NV */ + { 20269, 0x00000205 }, /* GL_NOTEQUAL */ + { 20281, 0x00000000 }, /* GL_NO_ERROR */ + { 20293, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */ + { 20327, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB */ + { 20365, 0x00008B89 }, /* GL_OBJECT_ACTIVE_ATTRIBUTES_ARB */ + { 20397, 0x00008B8A }, /* GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB */ + { 20439, 0x00008B86 }, /* GL_OBJECT_ACTIVE_UNIFORMS_ARB */ + { 20469, 0x00008B87 }, /* GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB */ + { 20509, 0x00008B85 }, /* GL_OBJECT_ATTACHED_OBJECTS_ARB */ + { 20540, 0x00008B81 }, /* GL_OBJECT_COMPILE_STATUS_ARB */ + { 20569, 0x00008B80 }, /* GL_OBJECT_DELETE_STATUS_ARB */ + { 20597, 0x00008B84 }, /* GL_OBJECT_INFO_LOG_LENGTH_ARB */ + { 20627, 0x00002401 }, /* GL_OBJECT_LINEAR */ + { 20644, 0x00008B82 }, /* GL_OBJECT_LINK_STATUS_ARB */ + { 20670, 0x00002501 }, /* GL_OBJECT_PLANE */ + { 20686, 0x00008B88 }, /* GL_OBJECT_SHADER_SOURCE_LENGTH_ARB */ + { 20721, 0x00008B4F }, /* GL_OBJECT_SUBTYPE_ARB */ + { 20743, 0x00008B4E }, /* GL_OBJECT_TYPE_ARB */ + { 20762, 0x00008B83 }, /* GL_OBJECT_VALIDATE_STATUS_ARB */ + { 20792, 0x00008165 }, /* GL_OCCLUSION_TEST_HP */ + { 20813, 0x00008166 }, /* GL_OCCLUSION_TEST_RESULT_HP */ + { 20841, 0x00000001 }, /* GL_ONE */ + { 20848, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA */ + { 20876, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA_EXT */ + { 20908, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR */ + { 20936, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR_EXT */ + { 20968, 0x00000305 }, /* GL_ONE_MINUS_DST_ALPHA */ + { 20991, 0x00000307 }, /* GL_ONE_MINUS_DST_COLOR */ + { 21014, 0x00000303 }, /* GL_ONE_MINUS_SRC_ALPHA */ + { 21037, 0x00000301 }, /* GL_ONE_MINUS_SRC_COLOR */ + { 21060, 0x00008598 }, /* GL_OPERAND0_ALPHA */ + { 21078, 0x00008598 }, /* GL_OPERAND0_ALPHA_ARB */ + { 21100, 0x00008598 }, /* GL_OPERAND0_ALPHA_EXT */ + { 21122, 0x00008590 }, /* GL_OPERAND0_RGB */ + { 21138, 0x00008590 }, /* GL_OPERAND0_RGB_ARB */ + { 21158, 0x00008590 }, /* GL_OPERAND0_RGB_EXT */ + { 21178, 0x00008599 }, /* GL_OPERAND1_ALPHA */ + { 21196, 0x00008599 }, /* GL_OPERAND1_ALPHA_ARB */ + { 21218, 0x00008599 }, /* GL_OPERAND1_ALPHA_EXT */ + { 21240, 0x00008591 }, /* GL_OPERAND1_RGB */ + { 21256, 0x00008591 }, /* GL_OPERAND1_RGB_ARB */ + { 21276, 0x00008591 }, /* GL_OPERAND1_RGB_EXT */ + { 21296, 0x0000859A }, /* GL_OPERAND2_ALPHA */ + { 21314, 0x0000859A }, /* GL_OPERAND2_ALPHA_ARB */ + { 21336, 0x0000859A }, /* GL_OPERAND2_ALPHA_EXT */ + { 21358, 0x00008592 }, /* GL_OPERAND2_RGB */ + { 21374, 0x00008592 }, /* GL_OPERAND2_RGB_ARB */ + { 21394, 0x00008592 }, /* GL_OPERAND2_RGB_EXT */ + { 21414, 0x0000859B }, /* GL_OPERAND3_ALPHA_NV */ + { 21435, 0x00008593 }, /* GL_OPERAND3_RGB_NV */ + { 21454, 0x00001507 }, /* GL_OR */ + { 21460, 0x00000A01 }, /* GL_ORDER */ + { 21469, 0x0000150D }, /* GL_OR_INVERTED */ + { 21484, 0x0000150B }, /* GL_OR_REVERSE */ + { 21498, 0x00000505 }, /* GL_OUT_OF_MEMORY */ + { 21515, 0x00000D05 }, /* GL_PACK_ALIGNMENT */ + { 21533, 0x0000806C }, /* GL_PACK_IMAGE_HEIGHT */ + { 21554, 0x00008758 }, /* GL_PACK_INVERT_MESA */ + { 21574, 0x00000D01 }, /* GL_PACK_LSB_FIRST */ + { 21592, 0x00000D02 }, /* GL_PACK_ROW_LENGTH */ + { 21611, 0x0000806B }, /* GL_PACK_SKIP_IMAGES */ + { 21631, 0x00000D04 }, /* GL_PACK_SKIP_PIXELS */ + { 21651, 0x00000D03 }, /* GL_PACK_SKIP_ROWS */ + { 21669, 0x00000D00 }, /* GL_PACK_SWAP_BYTES */ + { 21688, 0x00008B92 }, /* GL_PALETTE4_R5_G6_B5_OES */ + { 21713, 0x00008B94 }, /* GL_PALETTE4_RGB5_A1_OES */ + { 21737, 0x00008B90 }, /* GL_PALETTE4_RGB8_OES */ + { 21758, 0x00008B93 }, /* GL_PALETTE4_RGBA4_OES */ + { 21780, 0x00008B91 }, /* GL_PALETTE4_RGBA8_OES */ + { 21802, 0x00008B97 }, /* GL_PALETTE8_R5_G6_B5_OES */ + { 21827, 0x00008B99 }, /* GL_PALETTE8_RGB5_A1_OES */ + { 21851, 0x00008B95 }, /* GL_PALETTE8_RGB8_OES */ + { 21872, 0x00008B98 }, /* GL_PALETTE8_RGBA4_OES */ + { 21894, 0x00008B96 }, /* GL_PALETTE8_RGBA8_OES */ + { 21916, 0x00000700 }, /* GL_PASS_THROUGH_TOKEN */ + { 21938, 0x00000C50 }, /* GL_PERSPECTIVE_CORRECTION_HINT */ + { 21969, 0x00000C79 }, /* GL_PIXEL_MAP_A_TO_A */ + { 21989, 0x00000CB9 }, /* GL_PIXEL_MAP_A_TO_A_SIZE */ + { 22014, 0x00000C78 }, /* GL_PIXEL_MAP_B_TO_B */ + { 22034, 0x00000CB8 }, /* GL_PIXEL_MAP_B_TO_B_SIZE */ + { 22059, 0x00000C77 }, /* GL_PIXEL_MAP_G_TO_G */ + { 22079, 0x00000CB7 }, /* GL_PIXEL_MAP_G_TO_G_SIZE */ + { 22104, 0x00000C75 }, /* GL_PIXEL_MAP_I_TO_A */ + { 22124, 0x00000CB5 }, /* GL_PIXEL_MAP_I_TO_A_SIZE */ + { 22149, 0x00000C74 }, /* GL_PIXEL_MAP_I_TO_B */ + { 22169, 0x00000CB4 }, /* GL_PIXEL_MAP_I_TO_B_SIZE */ + { 22194, 0x00000C73 }, /* GL_PIXEL_MAP_I_TO_G */ + { 22214, 0x00000CB3 }, /* GL_PIXEL_MAP_I_TO_G_SIZE */ + { 22239, 0x00000C70 }, /* GL_PIXEL_MAP_I_TO_I */ + { 22259, 0x00000CB0 }, /* GL_PIXEL_MAP_I_TO_I_SIZE */ + { 22284, 0x00000C72 }, /* GL_PIXEL_MAP_I_TO_R */ + { 22304, 0x00000CB2 }, /* GL_PIXEL_MAP_I_TO_R_SIZE */ + { 22329, 0x00000C76 }, /* GL_PIXEL_MAP_R_TO_R */ + { 22349, 0x00000CB6 }, /* GL_PIXEL_MAP_R_TO_R_SIZE */ + { 22374, 0x00000C71 }, /* GL_PIXEL_MAP_S_TO_S */ + { 22394, 0x00000CB1 }, /* GL_PIXEL_MAP_S_TO_S_SIZE */ + { 22419, 0x00000020 }, /* GL_PIXEL_MODE_BIT */ + { 22437, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING_EXT */ + { 22470, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER_EXT */ + { 22495, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING_EXT */ + { 22530, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER_EXT */ + { 22557, 0x00001B00 }, /* GL_POINT */ + { 22566, 0x00000000 }, /* GL_POINTS */ + { 22576, 0x00000002 }, /* GL_POINT_BIT */ + { 22589, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION */ + { 22619, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_ARB */ + { 22653, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_EXT */ + { 22687, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_SGIS */ + { 22722, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE */ + { 22751, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_ARB */ + { 22784, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_EXT */ + { 22817, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_SGIS */ + { 22851, 0x00000B11 }, /* GL_POINT_SIZE */ + { 22865, 0x00000B13 }, /* GL_POINT_SIZE_GRANULARITY */ + { 22891, 0x00008127 }, /* GL_POINT_SIZE_MAX */ + { 22909, 0x00008127 }, /* GL_POINT_SIZE_MAX_ARB */ + { 22931, 0x00008127 }, /* GL_POINT_SIZE_MAX_EXT */ + { 22953, 0x00008127 }, /* GL_POINT_SIZE_MAX_SGIS */ + { 22976, 0x00008126 }, /* GL_POINT_SIZE_MIN */ + { 22994, 0x00008126 }, /* GL_POINT_SIZE_MIN_ARB */ + { 23016, 0x00008126 }, /* GL_POINT_SIZE_MIN_EXT */ + { 23038, 0x00008126 }, /* GL_POINT_SIZE_MIN_SGIS */ + { 23061, 0x00000B12 }, /* GL_POINT_SIZE_RANGE */ + { 23081, 0x00000B10 }, /* GL_POINT_SMOOTH */ + { 23097, 0x00000C51 }, /* GL_POINT_SMOOTH_HINT */ + { 23118, 0x00008861 }, /* GL_POINT_SPRITE */ + { 23134, 0x00008861 }, /* GL_POINT_SPRITE_ARB */ + { 23154, 0x00008CA0 }, /* GL_POINT_SPRITE_COORD_ORIGIN */ + { 23183, 0x00008861 }, /* GL_POINT_SPRITE_NV */ + { 23202, 0x00008863 }, /* GL_POINT_SPRITE_R_MODE_NV */ + { 23228, 0x00000701 }, /* GL_POINT_TOKEN */ + { 23243, 0x00000009 }, /* GL_POLYGON */ + { 23254, 0x00000008 }, /* GL_POLYGON_BIT */ + { 23269, 0x00000B40 }, /* GL_POLYGON_MODE */ + { 23285, 0x00008039 }, /* GL_POLYGON_OFFSET_BIAS */ + { 23308, 0x00008038 }, /* GL_POLYGON_OFFSET_FACTOR */ + { 23333, 0x00008037 }, /* GL_POLYGON_OFFSET_FILL */ + { 23356, 0x00002A02 }, /* GL_POLYGON_OFFSET_LINE */ + { 23379, 0x00002A01 }, /* GL_POLYGON_OFFSET_POINT */ + { 23403, 0x00002A00 }, /* GL_POLYGON_OFFSET_UNITS */ + { 23427, 0x00000B41 }, /* GL_POLYGON_SMOOTH */ + { 23445, 0x00000C53 }, /* GL_POLYGON_SMOOTH_HINT */ + { 23468, 0x00000B42 }, /* GL_POLYGON_STIPPLE */ + { 23487, 0x00000010 }, /* GL_POLYGON_STIPPLE_BIT */ + { 23510, 0x00000703 }, /* GL_POLYGON_TOKEN */ + { 23527, 0x00001203 }, /* GL_POSITION */ + { 23539, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */ + { 23571, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI */ + { 23607, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */ + { 23640, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI */ + { 23677, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */ + { 23708, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI */ + { 23743, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */ + { 23775, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI */ + { 23811, 0x000080D2 }, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */ + { 23844, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */ + { 23876, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI */ + { 23912, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */ + { 23945, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI */ + { 23982, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS */ + { 24012, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS_SGI */ + { 24046, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE */ + { 24077, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE_SGI */ + { 24112, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS */ + { 24143, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS_EXT */ + { 24178, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE */ + { 24210, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE_EXT */ + { 24246, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS */ + { 24276, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS_EXT */ + { 24310, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE */ + { 24341, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE_EXT */ + { 24376, 0x000080D1 }, /* GL_POST_CONVOLUTION_COLOR_TABLE */ + { 24408, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS */ + { 24439, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS_EXT */ + { 24474, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE */ + { 24506, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE_EXT */ + { 24542, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS */ + { 24571, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS_EXT */ + { 24604, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE */ + { 24634, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE_EXT */ + { 24668, 0x0000817B }, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */ + { 24707, 0x00008179 }, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */ + { 24740, 0x0000817C }, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */ + { 24780, 0x0000817A }, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */ + { 24814, 0x00008578 }, /* GL_PREVIOUS */ + { 24826, 0x00008578 }, /* GL_PREVIOUS_ARB */ + { 24842, 0x00008578 }, /* GL_PREVIOUS_EXT */ + { 24858, 0x00008577 }, /* GL_PRIMARY_COLOR */ + { 24875, 0x00008577 }, /* GL_PRIMARY_COLOR_ARB */ + { 24896, 0x00008577 }, /* GL_PRIMARY_COLOR_EXT */ + { 24917, 0x000088B0 }, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */ + { 24950, 0x00008805 }, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */ + { 24982, 0x000088AC }, /* GL_PROGRAM_ATTRIBS_ARB */ + { 25005, 0x00008677 }, /* GL_PROGRAM_BINDING_ARB */ + { 25028, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_ARB */ + { 25058, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_NV */ + { 25087, 0x00008874 }, /* GL_PROGRAM_ERROR_STRING_ARB */ + { 25115, 0x00008876 }, /* GL_PROGRAM_FORMAT_ARB */ + { 25137, 0x00008875 }, /* GL_PROGRAM_FORMAT_ASCII_ARB */ + { 25165, 0x000088A0 }, /* GL_PROGRAM_INSTRUCTIONS_ARB */ + { 25193, 0x00008627 }, /* GL_PROGRAM_LENGTH_ARB */ + { 25215, 0x00008627 }, /* GL_PROGRAM_LENGTH_NV */ + { 25236, 0x000088B2 }, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */ + { 25276, 0x00008808 }, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */ + { 25315, 0x000088AE }, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */ + { 25345, 0x000088A2 }, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */ + { 25380, 0x000088AA }, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */ + { 25413, 0x000088A6 }, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */ + { 25447, 0x0000880A }, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */ + { 25486, 0x00008809 }, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */ + { 25525, 0x00008B40 }, /* GL_PROGRAM_OBJECT_ARB */ + { 25547, 0x000088A8 }, /* GL_PROGRAM_PARAMETERS_ARB */ + { 25573, 0x00008644 }, /* GL_PROGRAM_PARAMETER_NV */ + { 25597, 0x00008647 }, /* GL_PROGRAM_RESIDENT_NV */ + { 25620, 0x00008628 }, /* GL_PROGRAM_STRING_ARB */ + { 25642, 0x00008628 }, /* GL_PROGRAM_STRING_NV */ + { 25663, 0x00008646 }, /* GL_PROGRAM_TARGET_NV */ + { 25684, 0x000088A4 }, /* GL_PROGRAM_TEMPORARIES_ARB */ + { 25711, 0x00008807 }, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */ + { 25743, 0x00008806 }, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */ + { 25775, 0x000088B6 }, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */ + { 25810, 0x00001701 }, /* GL_PROJECTION */ + { 25824, 0x00000BA7 }, /* GL_PROJECTION_MATRIX */ + { 25845, 0x00000BA4 }, /* GL_PROJECTION_STACK_DEPTH */ + { 25871, 0x000080D3 }, /* GL_PROXY_COLOR_TABLE */ + { 25892, 0x00008025 }, /* GL_PROXY_HISTOGRAM */ + { 25911, 0x00008025 }, /* GL_PROXY_HISTOGRAM_EXT */ + { 25934, 0x000080D5 }, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */ + { 25973, 0x000080D4 }, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */ + { 26011, 0x00008063 }, /* GL_PROXY_TEXTURE_1D */ + { 26031, 0x00008C19 }, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */ + { 26061, 0x00008063 }, /* GL_PROXY_TEXTURE_1D_EXT */ + { 26085, 0x00008064 }, /* GL_PROXY_TEXTURE_2D */ + { 26105, 0x00008C1B }, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */ + { 26135, 0x00008064 }, /* GL_PROXY_TEXTURE_2D_EXT */ + { 26159, 0x00008070 }, /* GL_PROXY_TEXTURE_3D */ + { 26179, 0x000080BD }, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */ + { 26212, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP */ + { 26238, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP_ARB */ + { 26268, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */ + { 26299, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_NV */ + { 26329, 0x00002003 }, /* GL_Q */ + { 26334, 0x00001209 }, /* GL_QUADRATIC_ATTENUATION */ + { 26359, 0x00000007 }, /* GL_QUADS */ + { 26368, 0x00008614 }, /* GL_QUAD_MESH_SUN */ + { 26385, 0x00000008 }, /* GL_QUAD_STRIP */ + { 26399, 0x00008864 }, /* GL_QUERY_COUNTER_BITS */ + { 26421, 0x00008864 }, /* GL_QUERY_COUNTER_BITS_ARB */ + { 26447, 0x00008866 }, /* GL_QUERY_RESULT */ + { 26463, 0x00008866 }, /* GL_QUERY_RESULT_ARB */ + { 26483, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE */ + { 26509, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE_ARB */ + { 26539, 0x00002002 }, /* GL_R */ + { 26544, 0x00002A10 }, /* GL_R3_G3_B2 */ + { 26556, 0x00019262 }, /* GL_RASTER_POSITION_UNCLIPPED_IBM */ + { 26589, 0x00000C02 }, /* GL_READ_BUFFER */ + { 26604, 0x00008CAA }, /* GL_READ_FRAMEBUFFER_BINDING_EXT */ + { 26636, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER_EXT */ + { 26660, 0x000088B8 }, /* GL_READ_ONLY */ + { 26673, 0x000088B8 }, /* GL_READ_ONLY_ARB */ + { 26690, 0x000088BA }, /* GL_READ_WRITE */ + { 26704, 0x000088BA }, /* GL_READ_WRITE_ARB */ + { 26722, 0x00001903 }, /* GL_RED */ + { 26729, 0x00008016 }, /* GL_REDUCE */ + { 26739, 0x00008016 }, /* GL_REDUCE_EXT */ + { 26753, 0x00000D15 }, /* GL_RED_BIAS */ + { 26765, 0x00000D52 }, /* GL_RED_BITS */ + { 26777, 0x00000D14 }, /* GL_RED_SCALE */ + { 26790, 0x00008512 }, /* GL_REFLECTION_MAP */ + { 26808, 0x00008512 }, /* GL_REFLECTION_MAP_ARB */ + { 26830, 0x00008512 }, /* GL_REFLECTION_MAP_NV */ + { 26851, 0x00001C00 }, /* GL_RENDER */ + { 26861, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING_EXT */ + { 26889, 0x00008D41 }, /* GL_RENDERBUFFER_EXT */ + { 26909, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT_EXT */ + { 26936, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT_EXT */ + { 26972, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH_EXT */ + { 26998, 0x00001F01 }, /* GL_RENDERER */ + { 27010, 0x00000C40 }, /* GL_RENDER_MODE */ + { 27025, 0x00002901 }, /* GL_REPEAT */ + { 27035, 0x00001E01 }, /* GL_REPLACE */ + { 27046, 0x00008062 }, /* GL_REPLACE_EXT */ + { 27061, 0x00008153 }, /* GL_REPLICATE_BORDER_HP */ + { 27084, 0x0000803A }, /* GL_RESCALE_NORMAL */ + { 27102, 0x0000803A }, /* GL_RESCALE_NORMAL_EXT */ + { 27124, 0x00000102 }, /* GL_RETURN */ + { 27134, 0x00001907 }, /* GL_RGB */ + { 27141, 0x00008052 }, /* GL_RGB10 */ + { 27150, 0x00008059 }, /* GL_RGB10_A2 */ + { 27162, 0x00008059 }, /* GL_RGB10_A2_EXT */ + { 27178, 0x00008052 }, /* GL_RGB10_EXT */ + { 27191, 0x00008053 }, /* GL_RGB12 */ + { 27200, 0x00008053 }, /* GL_RGB12_EXT */ + { 27213, 0x00008054 }, /* GL_RGB16 */ + { 27222, 0x00008054 }, /* GL_RGB16_EXT */ + { 27235, 0x0000804E }, /* GL_RGB2_EXT */ + { 27247, 0x0000804F }, /* GL_RGB4 */ + { 27255, 0x0000804F }, /* GL_RGB4_EXT */ + { 27267, 0x000083A1 }, /* GL_RGB4_S3TC */ + { 27280, 0x00008050 }, /* GL_RGB5 */ + { 27288, 0x00008057 }, /* GL_RGB5_A1 */ + { 27299, 0x00008057 }, /* GL_RGB5_A1_EXT */ + { 27314, 0x00008050 }, /* GL_RGB5_EXT */ + { 27326, 0x00008051 }, /* GL_RGB8 */ + { 27334, 0x00008051 }, /* GL_RGB8_EXT */ + { 27346, 0x00001908 }, /* GL_RGBA */ + { 27354, 0x0000805A }, /* GL_RGBA12 */ + { 27364, 0x0000805A }, /* GL_RGBA12_EXT */ + { 27378, 0x0000805B }, /* GL_RGBA16 */ + { 27388, 0x0000805B }, /* GL_RGBA16_EXT */ + { 27402, 0x00008055 }, /* GL_RGBA2 */ + { 27411, 0x00008055 }, /* GL_RGBA2_EXT */ + { 27424, 0x00008056 }, /* GL_RGBA4 */ + { 27433, 0x000083A5 }, /* GL_RGBA4_DXT5_S3TC */ + { 27452, 0x00008056 }, /* GL_RGBA4_EXT */ + { 27465, 0x000083A3 }, /* GL_RGBA4_S3TC */ + { 27479, 0x00008058 }, /* GL_RGBA8 */ + { 27488, 0x00008058 }, /* GL_RGBA8_EXT */ + { 27501, 0x000083A4 }, /* GL_RGBA_DXT5_S3TC */ + { 27519, 0x00000C31 }, /* GL_RGBA_MODE */ + { 27532, 0x000083A2 }, /* GL_RGBA_S3TC */ + { 27545, 0x000083A0 }, /* GL_RGB_S3TC */ + { 27557, 0x00008573 }, /* GL_RGB_SCALE */ + { 27570, 0x00008573 }, /* GL_RGB_SCALE_ARB */ + { 27587, 0x00008573 }, /* GL_RGB_SCALE_EXT */ + { 27604, 0x00000407 }, /* GL_RIGHT */ + { 27613, 0x00002000 }, /* GL_S */ + { 27618, 0x00008B5D }, /* GL_SAMPLER_1D */ + { 27632, 0x00008B61 }, /* GL_SAMPLER_1D_SHADOW */ + { 27653, 0x00008B5E }, /* GL_SAMPLER_2D */ + { 27667, 0x00008B62 }, /* GL_SAMPLER_2D_SHADOW */ + { 27688, 0x00008B5F }, /* GL_SAMPLER_3D */ + { 27702, 0x00008B60 }, /* GL_SAMPLER_CUBE */ + { 27718, 0x000080A9 }, /* GL_SAMPLES */ + { 27729, 0x000086B4 }, /* GL_SAMPLES_3DFX */ + { 27745, 0x000080A9 }, /* GL_SAMPLES_ARB */ + { 27760, 0x00008914 }, /* GL_SAMPLES_PASSED */ + { 27778, 0x00008914 }, /* GL_SAMPLES_PASSED_ARB */ + { 27800, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE */ + { 27828, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE_ARB */ + { 27860, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE */ + { 27883, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE_ARB */ + { 27910, 0x000080A8 }, /* GL_SAMPLE_BUFFERS */ + { 27928, 0x000086B3 }, /* GL_SAMPLE_BUFFERS_3DFX */ + { 27951, 0x000080A8 }, /* GL_SAMPLE_BUFFERS_ARB */ + { 27973, 0x000080A0 }, /* GL_SAMPLE_COVERAGE */ + { 27992, 0x000080A0 }, /* GL_SAMPLE_COVERAGE_ARB */ + { 28015, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT */ + { 28041, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT_ARB */ + { 28071, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE */ + { 28096, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE_ARB */ + { 28125, 0x00080000 }, /* GL_SCISSOR_BIT */ + { 28140, 0x00000C10 }, /* GL_SCISSOR_BOX */ + { 28155, 0x00000C11 }, /* GL_SCISSOR_TEST */ + { 28171, 0x0000845E }, /* GL_SECONDARY_COLOR_ARRAY */ + { 28196, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */ + { 28236, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB */ + { 28280, 0x0000845D }, /* GL_SECONDARY_COLOR_ARRAY_POINTER */ + { 28313, 0x0000845A }, /* GL_SECONDARY_COLOR_ARRAY_SIZE */ + { 28343, 0x0000845C }, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */ + { 28375, 0x0000845B }, /* GL_SECONDARY_COLOR_ARRAY_TYPE */ + { 28405, 0x00001C02 }, /* GL_SELECT */ + { 28415, 0x00000DF3 }, /* GL_SELECTION_BUFFER_POINTER */ + { 28443, 0x00000DF4 }, /* GL_SELECTION_BUFFER_SIZE */ + { 28468, 0x00008012 }, /* GL_SEPARABLE_2D */ + { 28484, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR */ + { 28511, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR_EXT */ + { 28542, 0x0000150F }, /* GL_SET */ + { 28549, 0x00008B48 }, /* GL_SHADER_OBJECT_ARB */ + { 28570, 0x00008B88 }, /* GL_SHADER_SOURCE_LENGTH */ + { 28594, 0x00008B4F }, /* GL_SHADER_TYPE */ + { 28609, 0x00000B54 }, /* GL_SHADE_MODEL */ + { 28624, 0x00008B8C }, /* GL_SHADING_LANGUAGE_VERSION */ + { 28652, 0x000080BF }, /* GL_SHADOW_AMBIENT_SGIX */ + { 28675, 0x000081FB }, /* GL_SHARED_TEXTURE_PALETTE_EXT */ + { 28705, 0x00001601 }, /* GL_SHININESS */ + { 28718, 0x00001402 }, /* GL_SHORT */ + { 28727, 0x000081F9 }, /* GL_SINGLE_COLOR */ + { 28743, 0x000081F9 }, /* GL_SINGLE_COLOR_EXT */ + { 28763, 0x000085CC }, /* GL_SLICE_ACCUM_SUN */ + { 28782, 0x00001D01 }, /* GL_SMOOTH */ + { 28792, 0x00000B23 }, /* GL_SMOOTH_LINE_WIDTH_GRANULARITY */ + { 28825, 0x00000B22 }, /* GL_SMOOTH_LINE_WIDTH_RANGE */ + { 28852, 0x00000B13 }, /* GL_SMOOTH_POINT_SIZE_GRANULARITY */ + { 28885, 0x00000B12 }, /* GL_SMOOTH_POINT_SIZE_RANGE */ + { 28912, 0x00008588 }, /* GL_SOURCE0_ALPHA */ + { 28929, 0x00008588 }, /* GL_SOURCE0_ALPHA_ARB */ + { 28950, 0x00008588 }, /* GL_SOURCE0_ALPHA_EXT */ + { 28971, 0x00008580 }, /* GL_SOURCE0_RGB */ + { 28986, 0x00008580 }, /* GL_SOURCE0_RGB_ARB */ + { 29005, 0x00008580 }, /* GL_SOURCE0_RGB_EXT */ + { 29024, 0x00008589 }, /* GL_SOURCE1_ALPHA */ + { 29041, 0x00008589 }, /* GL_SOURCE1_ALPHA_ARB */ + { 29062, 0x00008589 }, /* GL_SOURCE1_ALPHA_EXT */ + { 29083, 0x00008581 }, /* GL_SOURCE1_RGB */ + { 29098, 0x00008581 }, /* GL_SOURCE1_RGB_ARB */ + { 29117, 0x00008581 }, /* GL_SOURCE1_RGB_EXT */ + { 29136, 0x0000858A }, /* GL_SOURCE2_ALPHA */ + { 29153, 0x0000858A }, /* GL_SOURCE2_ALPHA_ARB */ + { 29174, 0x0000858A }, /* GL_SOURCE2_ALPHA_EXT */ + { 29195, 0x00008582 }, /* GL_SOURCE2_RGB */ + { 29210, 0x00008582 }, /* GL_SOURCE2_RGB_ARB */ + { 29229, 0x00008582 }, /* GL_SOURCE2_RGB_EXT */ + { 29248, 0x0000858B }, /* GL_SOURCE3_ALPHA_NV */ + { 29268, 0x00008583 }, /* GL_SOURCE3_RGB_NV */ + { 29286, 0x00001202 }, /* GL_SPECULAR */ + { 29298, 0x00002402 }, /* GL_SPHERE_MAP */ + { 29312, 0x00001206 }, /* GL_SPOT_CUTOFF */ + { 29327, 0x00001204 }, /* GL_SPOT_DIRECTION */ + { 29345, 0x00001205 }, /* GL_SPOT_EXPONENT */ + { 29362, 0x00008588 }, /* GL_SRC0_ALPHA */ + { 29376, 0x00008580 }, /* GL_SRC0_RGB */ + { 29388, 0x00008589 }, /* GL_SRC1_ALPHA */ + { 29402, 0x00008581 }, /* GL_SRC1_RGB */ + { 29414, 0x0000858A }, /* GL_SRC2_ALPHA */ + { 29428, 0x00008582 }, /* GL_SRC2_RGB */ + { 29440, 0x00000302 }, /* GL_SRC_ALPHA */ + { 29453, 0x00000308 }, /* GL_SRC_ALPHA_SATURATE */ + { 29475, 0x00000300 }, /* GL_SRC_COLOR */ + { 29488, 0x00000503 }, /* GL_STACK_OVERFLOW */ + { 29506, 0x00000504 }, /* GL_STACK_UNDERFLOW */ + { 29525, 0x000088E6 }, /* GL_STATIC_COPY */ + { 29540, 0x000088E6 }, /* GL_STATIC_COPY_ARB */ + { 29559, 0x000088E4 }, /* GL_STATIC_DRAW */ + { 29574, 0x000088E4 }, /* GL_STATIC_DRAW_ARB */ + { 29593, 0x000088E5 }, /* GL_STATIC_READ */ + { 29608, 0x000088E5 }, /* GL_STATIC_READ_ARB */ + { 29627, 0x00001802 }, /* GL_STENCIL */ + { 29638, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT_EXT */ + { 29664, 0x00008801 }, /* GL_STENCIL_BACK_FAIL */ + { 29685, 0x00008801 }, /* GL_STENCIL_BACK_FAIL_ATI */ + { 29710, 0x00008800 }, /* GL_STENCIL_BACK_FUNC */ + { 29731, 0x00008800 }, /* GL_STENCIL_BACK_FUNC_ATI */ + { 29756, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */ + { 29788, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI */ + { 29824, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */ + { 29856, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI */ + { 29892, 0x00008CA3 }, /* GL_STENCIL_BACK_REF */ + { 29912, 0x00008CA4 }, /* GL_STENCIL_BACK_VALUE_MASK */ + { 29939, 0x00008CA5 }, /* GL_STENCIL_BACK_WRITEMASK */ + { 29965, 0x00000D57 }, /* GL_STENCIL_BITS */ + { 29981, 0x00000400 }, /* GL_STENCIL_BUFFER_BIT */ + { 30003, 0x00000B91 }, /* GL_STENCIL_CLEAR_VALUE */ + { 30026, 0x00000B94 }, /* GL_STENCIL_FAIL */ + { 30042, 0x00000B92 }, /* GL_STENCIL_FUNC */ + { 30058, 0x00001901 }, /* GL_STENCIL_INDEX */ + { 30075, 0x00008D49 }, /* GL_STENCIL_INDEX16_EXT */ + { 30098, 0x00008D46 }, /* GL_STENCIL_INDEX1_EXT */ + { 30120, 0x00008D47 }, /* GL_STENCIL_INDEX4_EXT */ + { 30142, 0x00008D48 }, /* GL_STENCIL_INDEX8_EXT */ + { 30164, 0x00008D45 }, /* GL_STENCIL_INDEX_EXT */ + { 30185, 0x00000B95 }, /* GL_STENCIL_PASS_DEPTH_FAIL */ + { 30212, 0x00000B96 }, /* GL_STENCIL_PASS_DEPTH_PASS */ + { 30239, 0x00000B97 }, /* GL_STENCIL_REF */ + { 30254, 0x00000B90 }, /* GL_STENCIL_TEST */ + { 30270, 0x00008910 }, /* GL_STENCIL_TEST_TWO_SIDE_EXT */ + { 30299, 0x00000B93 }, /* GL_STENCIL_VALUE_MASK */ + { 30321, 0x00000B98 }, /* GL_STENCIL_WRITEMASK */ + { 30342, 0x00000C33 }, /* GL_STEREO */ + { 30352, 0x000088E2 }, /* GL_STREAM_COPY */ + { 30367, 0x000088E2 }, /* GL_STREAM_COPY_ARB */ + { 30386, 0x000088E0 }, /* GL_STREAM_DRAW */ + { 30401, 0x000088E0 }, /* GL_STREAM_DRAW_ARB */ + { 30420, 0x000088E1 }, /* GL_STREAM_READ */ + { 30435, 0x000088E1 }, /* GL_STREAM_READ_ARB */ + { 30454, 0x00000D50 }, /* GL_SUBPIXEL_BITS */ + { 30471, 0x000084E7 }, /* GL_SUBTRACT */ + { 30483, 0x000084E7 }, /* GL_SUBTRACT_ARB */ + { 30499, 0x00002001 }, /* GL_T */ + { 30504, 0x00002A2A }, /* GL_T2F_C3F_V3F */ + { 30519, 0x00002A2C }, /* GL_T2F_C4F_N3F_V3F */ + { 30538, 0x00002A29 }, /* GL_T2F_C4UB_V3F */ + { 30554, 0x00002A2B }, /* GL_T2F_N3F_V3F */ + { 30569, 0x00002A27 }, /* GL_T2F_V3F */ + { 30580, 0x00002A2D }, /* GL_T4F_C4F_N3F_V4F */ + { 30599, 0x00002A28 }, /* GL_T4F_V4F */ + { 30610, 0x00008031 }, /* GL_TABLE_TOO_LARGE_EXT */ + { 30633, 0x00001702 }, /* GL_TEXTURE */ + { 30644, 0x000084C0 }, /* GL_TEXTURE0 */ + { 30656, 0x000084C0 }, /* GL_TEXTURE0_ARB */ + { 30672, 0x000084C1 }, /* GL_TEXTURE1 */ + { 30684, 0x000084CA }, /* GL_TEXTURE10 */ + { 30697, 0x000084CA }, /* GL_TEXTURE10_ARB */ + { 30714, 0x000084CB }, /* GL_TEXTURE11 */ + { 30727, 0x000084CB }, /* GL_TEXTURE11_ARB */ + { 30744, 0x000084CC }, /* GL_TEXTURE12 */ + { 30757, 0x000084CC }, /* GL_TEXTURE12_ARB */ + { 30774, 0x000084CD }, /* GL_TEXTURE13 */ + { 30787, 0x000084CD }, /* GL_TEXTURE13_ARB */ + { 30804, 0x000084CE }, /* GL_TEXTURE14 */ + { 30817, 0x000084CE }, /* GL_TEXTURE14_ARB */ + { 30834, 0x000084CF }, /* GL_TEXTURE15 */ + { 30847, 0x000084CF }, /* GL_TEXTURE15_ARB */ + { 30864, 0x000084D0 }, /* GL_TEXTURE16 */ + { 30877, 0x000084D0 }, /* GL_TEXTURE16_ARB */ + { 30894, 0x000084D1 }, /* GL_TEXTURE17 */ + { 30907, 0x000084D1 }, /* GL_TEXTURE17_ARB */ + { 30924, 0x000084D2 }, /* GL_TEXTURE18 */ + { 30937, 0x000084D2 }, /* GL_TEXTURE18_ARB */ + { 30954, 0x000084D3 }, /* GL_TEXTURE19 */ + { 30967, 0x000084D3 }, /* GL_TEXTURE19_ARB */ + { 30984, 0x000084C1 }, /* GL_TEXTURE1_ARB */ + { 31000, 0x000084C2 }, /* GL_TEXTURE2 */ + { 31012, 0x000084D4 }, /* GL_TEXTURE20 */ + { 31025, 0x000084D4 }, /* GL_TEXTURE20_ARB */ + { 31042, 0x000084D5 }, /* GL_TEXTURE21 */ + { 31055, 0x000084D5 }, /* GL_TEXTURE21_ARB */ + { 31072, 0x000084D6 }, /* GL_TEXTURE22 */ + { 31085, 0x000084D6 }, /* GL_TEXTURE22_ARB */ + { 31102, 0x000084D7 }, /* GL_TEXTURE23 */ + { 31115, 0x000084D7 }, /* GL_TEXTURE23_ARB */ + { 31132, 0x000084D8 }, /* GL_TEXTURE24 */ + { 31145, 0x000084D8 }, /* GL_TEXTURE24_ARB */ + { 31162, 0x000084D9 }, /* GL_TEXTURE25 */ + { 31175, 0x000084D9 }, /* GL_TEXTURE25_ARB */ + { 31192, 0x000084DA }, /* GL_TEXTURE26 */ + { 31205, 0x000084DA }, /* GL_TEXTURE26_ARB */ + { 31222, 0x000084DB }, /* GL_TEXTURE27 */ + { 31235, 0x000084DB }, /* GL_TEXTURE27_ARB */ + { 31252, 0x000084DC }, /* GL_TEXTURE28 */ + { 31265, 0x000084DC }, /* GL_TEXTURE28_ARB */ + { 31282, 0x000084DD }, /* GL_TEXTURE29 */ + { 31295, 0x000084DD }, /* GL_TEXTURE29_ARB */ + { 31312, 0x000084C2 }, /* GL_TEXTURE2_ARB */ + { 31328, 0x000084C3 }, /* GL_TEXTURE3 */ + { 31340, 0x000084DE }, /* GL_TEXTURE30 */ + { 31353, 0x000084DE }, /* GL_TEXTURE30_ARB */ + { 31370, 0x000084DF }, /* GL_TEXTURE31 */ + { 31383, 0x000084DF }, /* GL_TEXTURE31_ARB */ + { 31400, 0x000084C3 }, /* GL_TEXTURE3_ARB */ + { 31416, 0x000084C4 }, /* GL_TEXTURE4 */ + { 31428, 0x000084C4 }, /* GL_TEXTURE4_ARB */ + { 31444, 0x000084C5 }, /* GL_TEXTURE5 */ + { 31456, 0x000084C5 }, /* GL_TEXTURE5_ARB */ + { 31472, 0x000084C6 }, /* GL_TEXTURE6 */ + { 31484, 0x000084C6 }, /* GL_TEXTURE6_ARB */ + { 31500, 0x000084C7 }, /* GL_TEXTURE7 */ + { 31512, 0x000084C7 }, /* GL_TEXTURE7_ARB */ + { 31528, 0x000084C8 }, /* GL_TEXTURE8 */ + { 31540, 0x000084C8 }, /* GL_TEXTURE8_ARB */ + { 31556, 0x000084C9 }, /* GL_TEXTURE9 */ + { 31568, 0x000084C9 }, /* GL_TEXTURE9_ARB */ + { 31584, 0x00000DE0 }, /* GL_TEXTURE_1D */ + { 31598, 0x00008C18 }, /* GL_TEXTURE_1D_ARRAY_EXT */ + { 31622, 0x00000DE1 }, /* GL_TEXTURE_2D */ + { 31636, 0x00008C1A }, /* GL_TEXTURE_2D_ARRAY_EXT */ + { 31660, 0x0000806F }, /* GL_TEXTURE_3D */ + { 31674, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE */ + { 31696, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE_EXT */ + { 31722, 0x0000813C }, /* GL_TEXTURE_BASE_LEVEL */ + { 31744, 0x00008068 }, /* GL_TEXTURE_BINDING_1D */ + { 31766, 0x00008C1C }, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */ + { 31798, 0x00008069 }, /* GL_TEXTURE_BINDING_2D */ + { 31820, 0x00008C1D }, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */ + { 31852, 0x0000806A }, /* GL_TEXTURE_BINDING_3D */ + { 31874, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP */ + { 31902, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP_ARB */ + { 31934, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */ + { 31967, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_NV */ + { 31999, 0x00040000 }, /* GL_TEXTURE_BIT */ + { 32014, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE */ + { 32035, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE_EXT */ + { 32060, 0x00001005 }, /* GL_TEXTURE_BORDER */ + { 32078, 0x00001004 }, /* GL_TEXTURE_BORDER_COLOR */ + { 32102, 0x00008171 }, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */ + { 32133, 0x00008176 }, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */ + { 32163, 0x00008172 }, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */ + { 32193, 0x00008175 }, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */ + { 32228, 0x00008173 }, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */ + { 32259, 0x00008174 }, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */ + { 32297, 0x000080BC }, /* GL_TEXTURE_COLOR_TABLE_SGI */ + { 32324, 0x000081EF }, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */ + { 32356, 0x000080BF }, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ + { 32390, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC */ + { 32414, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC_ARB */ + { 32442, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE */ + { 32466, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE_ARB */ + { 32494, 0x0000819B }, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */ + { 32527, 0x0000819A }, /* GL_TEXTURE_COMPARE_SGIX */ + { 32551, 0x00001003 }, /* GL_TEXTURE_COMPONENTS */ + { 32573, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED */ + { 32595, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED_ARB */ + { 32621, 0x000086A3 }, /* GL_TEXTURE_COMPRESSED_FORMATS_ARB */ + { 32655, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */ + { 32688, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB */ + { 32725, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT */ + { 32753, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT_ARB */ + { 32785, 0x00008078 }, /* GL_TEXTURE_COORD_ARRAY */ + { 32808, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */ + { 32846, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB */ + { 32888, 0x00008092 }, /* GL_TEXTURE_COORD_ARRAY_POINTER */ + { 32919, 0x00008088 }, /* GL_TEXTURE_COORD_ARRAY_SIZE */ + { 32947, 0x0000808A }, /* GL_TEXTURE_COORD_ARRAY_STRIDE */ + { 32977, 0x00008089 }, /* GL_TEXTURE_COORD_ARRAY_TYPE */ + { 33005, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP */ + { 33025, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP_ARB */ + { 33049, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */ + { 33080, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB */ + { 33115, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */ + { 33146, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB */ + { 33181, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */ + { 33212, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB */ + { 33247, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */ + { 33278, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB */ + { 33313, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */ + { 33344, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB */ + { 33379, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */ + { 33410, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB */ + { 33445, 0x00008071 }, /* GL_TEXTURE_DEPTH */ + { 33462, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE */ + { 33484, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE_ARB */ + { 33510, 0x00002300 }, /* GL_TEXTURE_ENV */ + { 33525, 0x00002201 }, /* GL_TEXTURE_ENV_COLOR */ + { 33546, 0x00002200 }, /* GL_TEXTURE_ENV_MODE */ + { 33566, 0x00008500 }, /* GL_TEXTURE_FILTER_CONTROL */ + { 33592, 0x00002500 }, /* GL_TEXTURE_GEN_MODE */ + { 33612, 0x00000C63 }, /* GL_TEXTURE_GEN_Q */ + { 33629, 0x00000C62 }, /* GL_TEXTURE_GEN_R */ + { 33646, 0x00000C60 }, /* GL_TEXTURE_GEN_S */ + { 33663, 0x00000C61 }, /* GL_TEXTURE_GEN_T */ + { 33680, 0x0000819D }, /* GL_TEXTURE_GEQUAL_R_SGIX */ + { 33705, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE */ + { 33727, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE_EXT */ + { 33753, 0x00001001 }, /* GL_TEXTURE_HEIGHT */ + { 33771, 0x000080ED }, /* GL_TEXTURE_INDEX_SIZE_EXT */ + { 33797, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE */ + { 33823, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE_EXT */ + { 33853, 0x00001003 }, /* GL_TEXTURE_INTERNAL_FORMAT */ + { 33880, 0x0000819C }, /* GL_TEXTURE_LEQUAL_R_SGIX */ + { 33905, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS */ + { 33925, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS_EXT */ + { 33949, 0x00008190 }, /* GL_TEXTURE_LOD_BIAS_R_SGIX */ + { 33976, 0x0000818E }, /* GL_TEXTURE_LOD_BIAS_S_SGIX */ + { 34003, 0x0000818F }, /* GL_TEXTURE_LOD_BIAS_T_SGIX */ + { 34030, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE */ + { 34056, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE_EXT */ + { 34086, 0x00002800 }, /* GL_TEXTURE_MAG_FILTER */ + { 34108, 0x00000BA8 }, /* GL_TEXTURE_MATRIX */ + { 34126, 0x000084FE }, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */ + { 34156, 0x0000836B }, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */ + { 34184, 0x00008369 }, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */ + { 34212, 0x0000836A }, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */ + { 34240, 0x0000813D }, /* GL_TEXTURE_MAX_LEVEL */ + { 34261, 0x0000813B }, /* GL_TEXTURE_MAX_LOD */ + { 34280, 0x00002801 }, /* GL_TEXTURE_MIN_FILTER */ + { 34302, 0x0000813A }, /* GL_TEXTURE_MIN_LOD */ + { 34321, 0x00008066 }, /* GL_TEXTURE_PRIORITY */ + { 34341, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_ARB */ + { 34366, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_NV */ + { 34390, 0x0000805C }, /* GL_TEXTURE_RED_SIZE */ + { 34410, 0x0000805C }, /* GL_TEXTURE_RED_SIZE_EXT */ + { 34434, 0x00008067 }, /* GL_TEXTURE_RESIDENT */ + { 34454, 0x00000BA5 }, /* GL_TEXTURE_STACK_DEPTH */ + { 34477, 0x00008065 }, /* GL_TEXTURE_TOO_LARGE_EXT */ + { 34502, 0x0000888F }, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */ + { 34536, 0x00001000 }, /* GL_TEXTURE_WIDTH */ + { 34553, 0x00008072 }, /* GL_TEXTURE_WRAP_R */ + { 34571, 0x00002802 }, /* GL_TEXTURE_WRAP_S */ + { 34589, 0x00002803 }, /* GL_TEXTURE_WRAP_T */ + { 34607, 0x000088BF }, /* GL_TIME_ELAPSED_EXT */ + { 34627, 0x00008648 }, /* GL_TRACK_MATRIX_NV */ + { 34646, 0x00008649 }, /* GL_TRACK_MATRIX_TRANSFORM_NV */ + { 34675, 0x00001000 }, /* GL_TRANSFORM_BIT */ + { 34692, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX */ + { 34718, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX_ARB */ + { 34748, 0x000088B7 }, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */ + { 34780, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX */ + { 34810, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX_ARB */ + { 34844, 0x0000862C }, /* GL_TRANSPOSE_NV */ + { 34860, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX */ + { 34891, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX_ARB */ + { 34926, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX */ + { 34954, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX_ARB */ + { 34986, 0x00000004 }, /* GL_TRIANGLES */ + { 34999, 0x00000006 }, /* GL_TRIANGLE_FAN */ + { 35015, 0x00008615 }, /* GL_TRIANGLE_MESH_SUN */ + { 35036, 0x00000005 }, /* GL_TRIANGLE_STRIP */ + { 35054, 0x00000001 }, /* GL_TRUE */ + { 35062, 0x00000CF5 }, /* GL_UNPACK_ALIGNMENT */ + { 35082, 0x0000806E }, /* GL_UNPACK_IMAGE_HEIGHT */ + { 35105, 0x00000CF1 }, /* GL_UNPACK_LSB_FIRST */ + { 35125, 0x00000CF2 }, /* GL_UNPACK_ROW_LENGTH */ + { 35146, 0x0000806D }, /* GL_UNPACK_SKIP_IMAGES */ + { 35168, 0x00000CF4 }, /* GL_UNPACK_SKIP_PIXELS */ + { 35190, 0x00000CF3 }, /* GL_UNPACK_SKIP_ROWS */ + { 35210, 0x00000CF0 }, /* GL_UNPACK_SWAP_BYTES */ + { 35231, 0x00001401 }, /* GL_UNSIGNED_BYTE */ + { 35248, 0x00008362 }, /* GL_UNSIGNED_BYTE_2_3_3_REV */ + { 35275, 0x00008032 }, /* GL_UNSIGNED_BYTE_3_3_2 */ + { 35298, 0x00001405 }, /* GL_UNSIGNED_INT */ + { 35314, 0x00008036 }, /* GL_UNSIGNED_INT_10_10_10_2 */ + { 35341, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_NV */ + { 35365, 0x00008368 }, /* GL_UNSIGNED_INT_2_10_10_10_REV */ + { 35396, 0x00008035 }, /* GL_UNSIGNED_INT_8_8_8_8 */ + { 35420, 0x00008367 }, /* GL_UNSIGNED_INT_8_8_8_8_REV */ + { 35448, 0x00001403 }, /* GL_UNSIGNED_SHORT */ + { 35466, 0x00008366 }, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */ + { 35496, 0x00008033 }, /* GL_UNSIGNED_SHORT_4_4_4_4 */ + { 35522, 0x00008365 }, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */ + { 35552, 0x00008034 }, /* GL_UNSIGNED_SHORT_5_5_5_1 */ + { 35578, 0x00008363 }, /* GL_UNSIGNED_SHORT_5_6_5 */ + { 35602, 0x00008364 }, /* GL_UNSIGNED_SHORT_5_6_5_REV */ + { 35630, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_APPLE */ + { 35658, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_MESA */ + { 35685, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */ + { 35717, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_MESA */ + { 35748, 0x00008CA2 }, /* GL_UPPER_LEFT */ + { 35762, 0x00002A20 }, /* GL_V2F */ + { 35769, 0x00002A21 }, /* GL_V3F */ + { 35776, 0x00008B83 }, /* GL_VALIDATE_STATUS */ + { 35795, 0x00001F00 }, /* GL_VENDOR */ + { 35805, 0x00001F02 }, /* GL_VERSION */ + { 35816, 0x00008074 }, /* GL_VERTEX_ARRAY */ + { 35832, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING_APPLE */ + { 35862, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING */ + { 35893, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING_ARB */ + { 35928, 0x0000808E }, /* GL_VERTEX_ARRAY_POINTER */ + { 35952, 0x0000807A }, /* GL_VERTEX_ARRAY_SIZE */ + { 35973, 0x0000807C }, /* GL_VERTEX_ARRAY_STRIDE */ + { 35996, 0x0000807B }, /* GL_VERTEX_ARRAY_TYPE */ + { 36017, 0x00008650 }, /* GL_VERTEX_ATTRIB_ARRAY0_NV */ + { 36044, 0x0000865A }, /* GL_VERTEX_ATTRIB_ARRAY10_NV */ + { 36072, 0x0000865B }, /* GL_VERTEX_ATTRIB_ARRAY11_NV */ + { 36100, 0x0000865C }, /* GL_VERTEX_ATTRIB_ARRAY12_NV */ + { 36128, 0x0000865D }, /* GL_VERTEX_ATTRIB_ARRAY13_NV */ + { 36156, 0x0000865E }, /* GL_VERTEX_ATTRIB_ARRAY14_NV */ + { 36184, 0x0000865F }, /* GL_VERTEX_ATTRIB_ARRAY15_NV */ + { 36212, 0x00008651 }, /* GL_VERTEX_ATTRIB_ARRAY1_NV */ + { 36239, 0x00008652 }, /* GL_VERTEX_ATTRIB_ARRAY2_NV */ + { 36266, 0x00008653 }, /* GL_VERTEX_ATTRIB_ARRAY3_NV */ + { 36293, 0x00008654 }, /* GL_VERTEX_ATTRIB_ARRAY4_NV */ + { 36320, 0x00008655 }, /* GL_VERTEX_ATTRIB_ARRAY5_NV */ + { 36347, 0x00008656 }, /* GL_VERTEX_ATTRIB_ARRAY6_NV */ + { 36374, 0x00008657 }, /* GL_VERTEX_ATTRIB_ARRAY7_NV */ + { 36401, 0x00008658 }, /* GL_VERTEX_ATTRIB_ARRAY8_NV */ + { 36428, 0x00008659 }, /* GL_VERTEX_ATTRIB_ARRAY9_NV */ + { 36455, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */ + { 36493, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB */ + { 36535, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */ + { 36566, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */ + { 36601, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */ + { 36635, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */ + { 36673, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */ + { 36704, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */ + { 36739, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */ + { 36767, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */ + { 36799, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */ + { 36829, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */ + { 36863, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */ + { 36891, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */ + { 36923, 0x000086A7 }, /* GL_VERTEX_BLEND_ARB */ + { 36943, 0x00008620 }, /* GL_VERTEX_PROGRAM_ARB */ + { 36965, 0x0000864A }, /* GL_VERTEX_PROGRAM_BINDING_NV */ + { 36994, 0x00008620 }, /* GL_VERTEX_PROGRAM_NV */ + { 37015, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE */ + { 37044, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */ + { 37077, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */ + { 37109, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE */ + { 37136, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */ + { 37167, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */ + { 37197, 0x00008B31 }, /* GL_VERTEX_SHADER */ + { 37214, 0x00008B31 }, /* GL_VERTEX_SHADER_ARB */ + { 37235, 0x00008621 }, /* GL_VERTEX_STATE_PROGRAM_NV */ + { 37262, 0x00000BA2 }, /* GL_VIEWPORT */ + { 37274, 0x00000800 }, /* GL_VIEWPORT_BIT */ + { 37290, 0x000086AD }, /* GL_WEIGHT_ARRAY_ARB */ + { 37310, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */ + { 37341, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB */ + { 37376, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_ARB */ + { 37404, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_ARB */ + { 37429, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_ARB */ + { 37456, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_ARB */ + { 37481, 0x000086A6 }, /* GL_WEIGHT_SUM_UNITY_ARB */ + { 37505, 0x000081D4 }, /* GL_WRAP_BORDER_SUN */ + { 37524, 0x000088B9 }, /* GL_WRITE_ONLY */ + { 37538, 0x000088B9 }, /* GL_WRITE_ONLY_ARB */ + { 37556, 0x00001506 }, /* GL_XOR */ + { 37563, 0x000085B9 }, /* GL_YCBCR_422_APPLE */ + { 37582, 0x00008757 }, /* GL_YCBCR_MESA */ + { 37596, 0x00000000 }, /* GL_ZERO */ + { 37604, 0x00000D16 }, /* GL_ZOOM_X */ + { 37614, 0x00000D17 }, /* GL_ZOOM_Y */ }; static const unsigned reduced_enums[1284] = { - 436, /* GL_FALSE */ - 645, /* GL_LINES */ - 647, /* GL_LINE_LOOP */ - 654, /* GL_LINE_STRIP */ - 1641, /* GL_TRIANGLES */ - 1644, /* GL_TRIANGLE_STRIP */ - 1642, /* GL_TRIANGLE_FAN */ - 1211, /* GL_QUADS */ - 1213, /* GL_QUAD_STRIP */ - 1099, /* GL_POLYGON */ - 1111, /* GL_POLYGON_STIPPLE_BIT */ - 1064, /* GL_PIXEL_MODE_BIT */ - 632, /* GL_LIGHTING_BIT */ - 458, /* GL_FOG_BIT */ + 434, /* GL_FALSE */ + 643, /* GL_LINES */ + 645, /* GL_LINE_LOOP */ + 652, /* GL_LINE_STRIP */ + 1639, /* GL_TRIANGLES */ + 1642, /* GL_TRIANGLE_STRIP */ + 1640, /* GL_TRIANGLE_FAN */ + 1209, /* GL_QUADS */ + 1211, /* GL_QUAD_STRIP */ + 1097, /* GL_POLYGON */ + 1109, /* GL_POLYGON_STIPPLE_BIT */ + 1062, /* GL_PIXEL_MODE_BIT */ + 630, /* GL_LIGHTING_BIT */ + 456, /* GL_FOG_BIT */ 8, /* GL_ACCUM */ - 664, /* GL_LOAD */ - 1253, /* GL_RETURN */ - 937, /* GL_MULT */ + 662, /* GL_LOAD */ + 1251, /* GL_RETURN */ + 935, /* GL_MULT */ 23, /* GL_ADD */ - 953, /* GL_NEVER */ - 622, /* GL_LESS */ - 426, /* GL_EQUAL */ - 621, /* GL_LEQUAL */ - 547, /* GL_GREATER */ - 968, /* GL_NOTEQUAL */ - 522, /* GL_GEQUAL */ + 951, /* GL_NEVER */ + 620, /* GL_LESS */ + 424, /* GL_EQUAL */ + 619, /* GL_LEQUAL */ + 545, /* GL_GREATER */ + 966, /* GL_NOTEQUAL */ + 520, /* GL_GEQUAL */ 46, /* GL_ALWAYS */ - 1386, /* GL_SRC_COLOR */ - 997, /* GL_ONE_MINUS_SRC_COLOR */ - 1384, /* GL_SRC_ALPHA */ - 996, /* GL_ONE_MINUS_SRC_ALPHA */ - 406, /* GL_DST_ALPHA */ - 994, /* GL_ONE_MINUS_DST_ALPHA */ - 407, /* GL_DST_COLOR */ - 995, /* GL_ONE_MINUS_DST_COLOR */ - 1385, /* GL_SRC_ALPHA_SATURATE */ - 510, /* GL_FRONT_LEFT */ - 511, /* GL_FRONT_RIGHT */ - 69, /* GL_BACK_LEFT */ - 70, /* GL_BACK_RIGHT */ - 507, /* GL_FRONT */ - 68, /* GL_BACK */ - 620, /* GL_LEFT */ - 1293, /* GL_RIGHT */ - 508, /* GL_FRONT_AND_BACK */ - 63, /* GL_AUX0 */ - 64, /* GL_AUX1 */ - 65, /* GL_AUX2 */ - 66, /* GL_AUX3 */ - 612, /* GL_INVALID_ENUM */ - 615, /* GL_INVALID_VALUE */ - 614, /* GL_INVALID_OPERATION */ - 1387, /* GL_STACK_OVERFLOW */ - 1388, /* GL_STACK_UNDERFLOW */ - 1022, /* GL_OUT_OF_MEMORY */ - 613, /* GL_INVALID_FRAMEBUFFER_OPERATION_EXT */ + 1384, /* GL_SRC_COLOR */ + 995, /* GL_ONE_MINUS_SRC_COLOR */ + 1382, /* GL_SRC_ALPHA */ + 994, /* GL_ONE_MINUS_SRC_ALPHA */ + 405, /* GL_DST_ALPHA */ + 992, /* GL_ONE_MINUS_DST_ALPHA */ + 406, /* GL_DST_COLOR */ + 993, /* GL_ONE_MINUS_DST_COLOR */ + 1383, /* GL_SRC_ALPHA_SATURATE */ + 508, /* GL_FRONT_LEFT */ + 509, /* GL_FRONT_RIGHT */ + 68, /* GL_BACK_LEFT */ + 69, /* GL_BACK_RIGHT */ + 505, /* GL_FRONT */ + 67, /* GL_BACK */ + 618, /* GL_LEFT */ + 1291, /* GL_RIGHT */ + 506, /* GL_FRONT_AND_BACK */ + 62, /* GL_AUX0 */ + 63, /* GL_AUX1 */ + 64, /* GL_AUX2 */ + 65, /* GL_AUX3 */ + 610, /* GL_INVALID_ENUM */ + 613, /* GL_INVALID_VALUE */ + 612, /* GL_INVALID_OPERATION */ + 1385, /* GL_STACK_OVERFLOW */ + 1386, /* GL_STACK_UNDERFLOW */ + 1020, /* GL_OUT_OF_MEMORY */ + 611, /* GL_INVALID_FRAMEBUFFER_OPERATION_EXT */ 0, /* GL_2D */ 2, /* GL_3D */ 3, /* GL_3D_COLOR */ 4, /* GL_3D_COLOR_TEXTURE */ 6, /* GL_4D_COLOR_TEXTURE */ - 1042, /* GL_PASS_THROUGH_TOKEN */ - 1098, /* GL_POINT_TOKEN */ - 655, /* GL_LINE_TOKEN */ - 1112, /* GL_POLYGON_TOKEN */ - 74, /* GL_BITMAP_TOKEN */ - 405, /* GL_DRAW_PIXEL_TOKEN */ - 271, /* GL_COPY_PIXEL_TOKEN */ - 648, /* GL_LINE_RESET_TOKEN */ - 429, /* GL_EXP */ - 430, /* GL_EXP2 */ - 304, /* GL_CW */ - 116, /* GL_CCW */ - 137, /* GL_COEFF */ - 1019, /* GL_ORDER */ - 344, /* GL_DOMAIN */ - 279, /* GL_CURRENT_COLOR */ - 282, /* GL_CURRENT_INDEX */ - 288, /* GL_CURRENT_NORMAL */ - 300, /* GL_CURRENT_TEXTURE_COORDS */ - 293, /* GL_CURRENT_RASTER_COLOR */ - 295, /* GL_CURRENT_RASTER_INDEX */ - 298, /* GL_CURRENT_RASTER_TEXTURE_COORDS */ - 296, /* GL_CURRENT_RASTER_POSITION */ - 297, /* GL_CURRENT_RASTER_POSITION_VALID */ - 294, /* GL_CURRENT_RASTER_DISTANCE */ - 1091, /* GL_POINT_SMOOTH */ - 1080, /* GL_POINT_SIZE */ - 1090, /* GL_POINT_SIZE_RANGE */ - 1081, /* GL_POINT_SIZE_GRANULARITY */ - 649, /* GL_LINE_SMOOTH */ - 656, /* GL_LINE_WIDTH */ - 658, /* GL_LINE_WIDTH_RANGE */ - 657, /* GL_LINE_WIDTH_GRANULARITY */ - 651, /* GL_LINE_STIPPLE */ - 652, /* GL_LINE_STIPPLE_PATTERN */ - 653, /* GL_LINE_STIPPLE_REPEAT */ - 663, /* GL_LIST_MODE */ - 822, /* GL_MAX_LIST_NESTING */ - 660, /* GL_LIST_BASE */ - 662, /* GL_LIST_INDEX */ - 1101, /* GL_POLYGON_MODE */ - 1108, /* GL_POLYGON_SMOOTH */ - 1110, /* GL_POLYGON_STIPPLE */ - 414, /* GL_EDGE_FLAG */ - 272, /* GL_CULL_FACE */ - 273, /* GL_CULL_FACE_MODE */ - 509, /* GL_FRONT_FACE */ - 631, /* GL_LIGHTING */ - 636, /* GL_LIGHT_MODEL_LOCAL_VIEWER */ - 637, /* GL_LIGHT_MODEL_TWO_SIDE */ - 633, /* GL_LIGHT_MODEL_AMBIENT */ - 1339, /* GL_SHADE_MODEL */ - 168, /* GL_COLOR_MATERIAL_FACE */ - 169, /* GL_COLOR_MATERIAL_PARAMETER */ - 167, /* GL_COLOR_MATERIAL */ - 457, /* GL_FOG */ - 479, /* GL_FOG_INDEX */ - 475, /* GL_FOG_DENSITY */ - 483, /* GL_FOG_START */ - 477, /* GL_FOG_END */ - 480, /* GL_FOG_MODE */ - 459, /* GL_FOG_COLOR */ - 333, /* GL_DEPTH_RANGE */ - 338, /* GL_DEPTH_TEST */ - 341, /* GL_DEPTH_WRITEMASK */ - 321, /* GL_DEPTH_CLEAR_VALUE */ - 332, /* GL_DEPTH_FUNC */ + 1040, /* GL_PASS_THROUGH_TOKEN */ + 1096, /* GL_POINT_TOKEN */ + 653, /* GL_LINE_TOKEN */ + 1110, /* GL_POLYGON_TOKEN */ + 73, /* GL_BITMAP_TOKEN */ + 404, /* GL_DRAW_PIXEL_TOKEN */ + 270, /* GL_COPY_PIXEL_TOKEN */ + 646, /* GL_LINE_RESET_TOKEN */ + 427, /* GL_EXP */ + 428, /* GL_EXP2 */ + 303, /* GL_CW */ + 115, /* GL_CCW */ + 136, /* GL_COEFF */ + 1017, /* GL_ORDER */ + 343, /* GL_DOMAIN */ + 278, /* GL_CURRENT_COLOR */ + 281, /* GL_CURRENT_INDEX */ + 287, /* GL_CURRENT_NORMAL */ + 299, /* GL_CURRENT_TEXTURE_COORDS */ + 292, /* GL_CURRENT_RASTER_COLOR */ + 294, /* GL_CURRENT_RASTER_INDEX */ + 297, /* GL_CURRENT_RASTER_TEXTURE_COORDS */ + 295, /* GL_CURRENT_RASTER_POSITION */ + 296, /* GL_CURRENT_RASTER_POSITION_VALID */ + 293, /* GL_CURRENT_RASTER_DISTANCE */ + 1089, /* GL_POINT_SMOOTH */ + 1078, /* GL_POINT_SIZE */ + 1088, /* GL_POINT_SIZE_RANGE */ + 1079, /* GL_POINT_SIZE_GRANULARITY */ + 647, /* GL_LINE_SMOOTH */ + 654, /* GL_LINE_WIDTH */ + 656, /* GL_LINE_WIDTH_RANGE */ + 655, /* GL_LINE_WIDTH_GRANULARITY */ + 649, /* GL_LINE_STIPPLE */ + 650, /* GL_LINE_STIPPLE_PATTERN */ + 651, /* GL_LINE_STIPPLE_REPEAT */ + 661, /* GL_LIST_MODE */ + 820, /* GL_MAX_LIST_NESTING */ + 658, /* GL_LIST_BASE */ + 660, /* GL_LIST_INDEX */ + 1099, /* GL_POLYGON_MODE */ + 1106, /* GL_POLYGON_SMOOTH */ + 1108, /* GL_POLYGON_STIPPLE */ + 413, /* GL_EDGE_FLAG */ + 271, /* GL_CULL_FACE */ + 272, /* GL_CULL_FACE_MODE */ + 507, /* GL_FRONT_FACE */ + 629, /* GL_LIGHTING */ + 634, /* GL_LIGHT_MODEL_LOCAL_VIEWER */ + 635, /* GL_LIGHT_MODEL_TWO_SIDE */ + 631, /* GL_LIGHT_MODEL_AMBIENT */ + 1337, /* GL_SHADE_MODEL */ + 167, /* GL_COLOR_MATERIAL_FACE */ + 168, /* GL_COLOR_MATERIAL_PARAMETER */ + 166, /* GL_COLOR_MATERIAL */ + 455, /* GL_FOG */ + 477, /* GL_FOG_INDEX */ + 473, /* GL_FOG_DENSITY */ + 481, /* GL_FOG_START */ + 475, /* GL_FOG_END */ + 478, /* GL_FOG_MODE */ + 457, /* GL_FOG_COLOR */ + 332, /* GL_DEPTH_RANGE */ + 337, /* GL_DEPTH_TEST */ + 340, /* GL_DEPTH_WRITEMASK */ + 320, /* GL_DEPTH_CLEAR_VALUE */ + 331, /* GL_DEPTH_FUNC */ 12, /* GL_ACCUM_CLEAR_VALUE */ - 1422, /* GL_STENCIL_TEST */ - 1410, /* GL_STENCIL_CLEAR_VALUE */ - 1412, /* GL_STENCIL_FUNC */ - 1424, /* GL_STENCIL_VALUE_MASK */ - 1411, /* GL_STENCIL_FAIL */ - 1419, /* GL_STENCIL_PASS_DEPTH_FAIL */ - 1420, /* GL_STENCIL_PASS_DEPTH_PASS */ - 1421, /* GL_STENCIL_REF */ - 1425, /* GL_STENCIL_WRITEMASK */ - 791, /* GL_MATRIX_MODE */ - 958, /* GL_NORMALIZE */ - 1731, /* GL_VIEWPORT */ - 932, /* GL_MODELVIEW_STACK_DEPTH */ - 1191, /* GL_PROJECTION_STACK_DEPTH */ - 1620, /* GL_TEXTURE_STACK_DEPTH */ - 930, /* GL_MODELVIEW_MATRIX */ - 1190, /* GL_PROJECTION_MATRIX */ - 1605, /* GL_TEXTURE_MATRIX */ - 61, /* GL_ATTRIB_STACK_DEPTH */ - 127, /* GL_CLIENT_ATTRIB_STACK_DEPTH */ + 1420, /* GL_STENCIL_TEST */ + 1408, /* GL_STENCIL_CLEAR_VALUE */ + 1410, /* GL_STENCIL_FUNC */ + 1422, /* GL_STENCIL_VALUE_MASK */ + 1409, /* GL_STENCIL_FAIL */ + 1417, /* GL_STENCIL_PASS_DEPTH_FAIL */ + 1418, /* GL_STENCIL_PASS_DEPTH_PASS */ + 1419, /* GL_STENCIL_REF */ + 1423, /* GL_STENCIL_WRITEMASK */ + 789, /* GL_MATRIX_MODE */ + 956, /* GL_NORMALIZE */ + 1729, /* GL_VIEWPORT */ + 930, /* GL_MODELVIEW_STACK_DEPTH */ + 1189, /* GL_PROJECTION_STACK_DEPTH */ + 1618, /* GL_TEXTURE_STACK_DEPTH */ + 928, /* GL_MODELVIEW_MATRIX */ + 1188, /* GL_PROJECTION_MATRIX */ + 1603, /* GL_TEXTURE_MATRIX */ + 60, /* GL_ATTRIB_STACK_DEPTH */ + 126, /* GL_CLIENT_ATTRIB_STACK_DEPTH */ 43, /* GL_ALPHA_TEST */ 44, /* GL_ALPHA_TEST_FUNC */ 45, /* GL_ALPHA_TEST_REF */ - 343, /* GL_DITHER */ - 78, /* GL_BLEND_DST */ - 86, /* GL_BLEND_SRC */ - 75, /* GL_BLEND */ - 666, /* GL_LOGIC_OP_MODE */ - 586, /* GL_INDEX_LOGIC_OP */ - 166, /* GL_COLOR_LOGIC_OP */ - 67, /* GL_AUX_BUFFERS */ - 354, /* GL_DRAW_BUFFER */ - 1223, /* GL_READ_BUFFER */ - 1320, /* GL_SCISSOR_BOX */ - 1321, /* GL_SCISSOR_TEST */ - 585, /* GL_INDEX_CLEAR_VALUE */ - 590, /* GL_INDEX_WRITEMASK */ - 163, /* GL_COLOR_CLEAR_VALUE */ - 205, /* GL_COLOR_WRITEMASK */ - 587, /* GL_INDEX_MODE */ - 1287, /* GL_RGBA_MODE */ - 353, /* GL_DOUBLEBUFFER */ - 1426, /* GL_STEREO */ - 1246, /* GL_RENDER_MODE */ - 1043, /* GL_PERSPECTIVE_CORRECTION_HINT */ - 1092, /* GL_POINT_SMOOTH_HINT */ - 650, /* GL_LINE_SMOOTH_HINT */ - 1109, /* GL_POLYGON_SMOOTH_HINT */ - 478, /* GL_FOG_HINT */ - 1586, /* GL_TEXTURE_GEN_S */ - 1587, /* GL_TEXTURE_GEN_T */ - 1585, /* GL_TEXTURE_GEN_R */ - 1584, /* GL_TEXTURE_GEN_Q */ - 1056, /* GL_PIXEL_MAP_I_TO_I */ - 1062, /* GL_PIXEL_MAP_S_TO_S */ - 1058, /* GL_PIXEL_MAP_I_TO_R */ - 1054, /* GL_PIXEL_MAP_I_TO_G */ - 1052, /* GL_PIXEL_MAP_I_TO_B */ - 1050, /* GL_PIXEL_MAP_I_TO_A */ - 1060, /* GL_PIXEL_MAP_R_TO_R */ - 1048, /* GL_PIXEL_MAP_G_TO_G */ - 1046, /* GL_PIXEL_MAP_B_TO_B */ - 1044, /* GL_PIXEL_MAP_A_TO_A */ - 1057, /* GL_PIXEL_MAP_I_TO_I_SIZE */ - 1063, /* GL_PIXEL_MAP_S_TO_S_SIZE */ - 1059, /* GL_PIXEL_MAP_I_TO_R_SIZE */ - 1055, /* GL_PIXEL_MAP_I_TO_G_SIZE */ - 1053, /* GL_PIXEL_MAP_I_TO_B_SIZE */ - 1051, /* GL_PIXEL_MAP_I_TO_A_SIZE */ - 1061, /* GL_PIXEL_MAP_R_TO_R_SIZE */ - 1049, /* GL_PIXEL_MAP_G_TO_G_SIZE */ - 1047, /* GL_PIXEL_MAP_B_TO_B_SIZE */ - 1045, /* GL_PIXEL_MAP_A_TO_A_SIZE */ - 1653, /* GL_UNPACK_SWAP_BYTES */ - 1648, /* GL_UNPACK_LSB_FIRST */ - 1649, /* GL_UNPACK_ROW_LENGTH */ - 1652, /* GL_UNPACK_SKIP_ROWS */ - 1651, /* GL_UNPACK_SKIP_PIXELS */ - 1646, /* GL_UNPACK_ALIGNMENT */ - 1031, /* GL_PACK_SWAP_BYTES */ - 1026, /* GL_PACK_LSB_FIRST */ - 1027, /* GL_PACK_ROW_LENGTH */ - 1030, /* GL_PACK_SKIP_ROWS */ - 1029, /* GL_PACK_SKIP_PIXELS */ - 1023, /* GL_PACK_ALIGNMENT */ - 744, /* GL_MAP_COLOR */ - 745, /* GL_MAP_STENCIL */ - 589, /* GL_INDEX_SHIFT */ - 588, /* GL_INDEX_OFFSET */ - 1235, /* GL_RED_SCALE */ - 1233, /* GL_RED_BIAS */ - 1748, /* GL_ZOOM_X */ - 1749, /* GL_ZOOM_Y */ - 551, /* GL_GREEN_SCALE */ - 549, /* GL_GREEN_BIAS */ - 92, /* GL_BLUE_SCALE */ - 90, /* GL_BLUE_BIAS */ + 342, /* GL_DITHER */ + 77, /* GL_BLEND_DST */ + 85, /* GL_BLEND_SRC */ + 74, /* GL_BLEND */ + 664, /* GL_LOGIC_OP_MODE */ + 584, /* GL_INDEX_LOGIC_OP */ + 165, /* GL_COLOR_LOGIC_OP */ + 66, /* GL_AUX_BUFFERS */ + 353, /* GL_DRAW_BUFFER */ + 1221, /* GL_READ_BUFFER */ + 1318, /* GL_SCISSOR_BOX */ + 1319, /* GL_SCISSOR_TEST */ + 583, /* GL_INDEX_CLEAR_VALUE */ + 588, /* GL_INDEX_WRITEMASK */ + 162, /* GL_COLOR_CLEAR_VALUE */ + 204, /* GL_COLOR_WRITEMASK */ + 585, /* GL_INDEX_MODE */ + 1285, /* GL_RGBA_MODE */ + 352, /* GL_DOUBLEBUFFER */ + 1424, /* GL_STEREO */ + 1244, /* GL_RENDER_MODE */ + 1041, /* GL_PERSPECTIVE_CORRECTION_HINT */ + 1090, /* GL_POINT_SMOOTH_HINT */ + 648, /* GL_LINE_SMOOTH_HINT */ + 1107, /* GL_POLYGON_SMOOTH_HINT */ + 476, /* GL_FOG_HINT */ + 1584, /* GL_TEXTURE_GEN_S */ + 1585, /* GL_TEXTURE_GEN_T */ + 1583, /* GL_TEXTURE_GEN_R */ + 1582, /* GL_TEXTURE_GEN_Q */ + 1054, /* GL_PIXEL_MAP_I_TO_I */ + 1060, /* GL_PIXEL_MAP_S_TO_S */ + 1056, /* GL_PIXEL_MAP_I_TO_R */ + 1052, /* GL_PIXEL_MAP_I_TO_G */ + 1050, /* GL_PIXEL_MAP_I_TO_B */ + 1048, /* GL_PIXEL_MAP_I_TO_A */ + 1058, /* GL_PIXEL_MAP_R_TO_R */ + 1046, /* GL_PIXEL_MAP_G_TO_G */ + 1044, /* GL_PIXEL_MAP_B_TO_B */ + 1042, /* GL_PIXEL_MAP_A_TO_A */ + 1055, /* GL_PIXEL_MAP_I_TO_I_SIZE */ + 1061, /* GL_PIXEL_MAP_S_TO_S_SIZE */ + 1057, /* GL_PIXEL_MAP_I_TO_R_SIZE */ + 1053, /* GL_PIXEL_MAP_I_TO_G_SIZE */ + 1051, /* GL_PIXEL_MAP_I_TO_B_SIZE */ + 1049, /* GL_PIXEL_MAP_I_TO_A_SIZE */ + 1059, /* GL_PIXEL_MAP_R_TO_R_SIZE */ + 1047, /* GL_PIXEL_MAP_G_TO_G_SIZE */ + 1045, /* GL_PIXEL_MAP_B_TO_B_SIZE */ + 1043, /* GL_PIXEL_MAP_A_TO_A_SIZE */ + 1651, /* GL_UNPACK_SWAP_BYTES */ + 1646, /* GL_UNPACK_LSB_FIRST */ + 1647, /* GL_UNPACK_ROW_LENGTH */ + 1650, /* GL_UNPACK_SKIP_ROWS */ + 1649, /* GL_UNPACK_SKIP_PIXELS */ + 1644, /* GL_UNPACK_ALIGNMENT */ + 1029, /* GL_PACK_SWAP_BYTES */ + 1024, /* GL_PACK_LSB_FIRST */ + 1025, /* GL_PACK_ROW_LENGTH */ + 1028, /* GL_PACK_SKIP_ROWS */ + 1027, /* GL_PACK_SKIP_PIXELS */ + 1021, /* GL_PACK_ALIGNMENT */ + 742, /* GL_MAP_COLOR */ + 743, /* GL_MAP_STENCIL */ + 587, /* GL_INDEX_SHIFT */ + 586, /* GL_INDEX_OFFSET */ + 1233, /* GL_RED_SCALE */ + 1231, /* GL_RED_BIAS */ + 1746, /* GL_ZOOM_X */ + 1747, /* GL_ZOOM_Y */ + 549, /* GL_GREEN_SCALE */ + 547, /* GL_GREEN_BIAS */ + 91, /* GL_BLUE_SCALE */ + 89, /* GL_BLUE_BIAS */ 42, /* GL_ALPHA_SCALE */ 40, /* GL_ALPHA_BIAS */ - 334, /* GL_DEPTH_SCALE */ - 315, /* GL_DEPTH_BIAS */ - 817, /* GL_MAX_EVAL_ORDER */ - 821, /* GL_MAX_LIGHTS */ - 800, /* GL_MAX_CLIP_PLANES */ - 865, /* GL_MAX_TEXTURE_SIZE */ - 827, /* GL_MAX_PIXEL_MAP_TABLE */ - 796, /* GL_MAX_ATTRIB_STACK_DEPTH */ - 824, /* GL_MAX_MODELVIEW_STACK_DEPTH */ - 825, /* GL_MAX_NAME_STACK_DEPTH */ - 853, /* GL_MAX_PROJECTION_STACK_DEPTH */ - 866, /* GL_MAX_TEXTURE_STACK_DEPTH */ - 880, /* GL_MAX_VIEWPORT_DIMS */ - 797, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */ - 1433, /* GL_SUBPIXEL_BITS */ - 584, /* GL_INDEX_BITS */ - 1234, /* GL_RED_BITS */ - 550, /* GL_GREEN_BITS */ - 91, /* GL_BLUE_BITS */ + 333, /* GL_DEPTH_SCALE */ + 314, /* GL_DEPTH_BIAS */ + 815, /* GL_MAX_EVAL_ORDER */ + 819, /* GL_MAX_LIGHTS */ + 798, /* GL_MAX_CLIP_PLANES */ + 863, /* GL_MAX_TEXTURE_SIZE */ + 825, /* GL_MAX_PIXEL_MAP_TABLE */ + 794, /* GL_MAX_ATTRIB_STACK_DEPTH */ + 822, /* GL_MAX_MODELVIEW_STACK_DEPTH */ + 823, /* GL_MAX_NAME_STACK_DEPTH */ + 851, /* GL_MAX_PROJECTION_STACK_DEPTH */ + 864, /* GL_MAX_TEXTURE_STACK_DEPTH */ + 878, /* GL_MAX_VIEWPORT_DIMS */ + 795, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */ + 1431, /* GL_SUBPIXEL_BITS */ + 582, /* GL_INDEX_BITS */ + 1232, /* GL_RED_BITS */ + 548, /* GL_GREEN_BITS */ + 90, /* GL_BLUE_BITS */ 41, /* GL_ALPHA_BITS */ - 316, /* GL_DEPTH_BITS */ - 1408, /* GL_STENCIL_BITS */ + 315, /* GL_DEPTH_BITS */ + 1406, /* GL_STENCIL_BITS */ 14, /* GL_ACCUM_RED_BITS */ 13, /* GL_ACCUM_GREEN_BITS */ 10, /* GL_ACCUM_BLUE_BITS */ 9, /* GL_ACCUM_ALPHA_BITS */ - 946, /* GL_NAME_STACK_DEPTH */ - 62, /* GL_AUTO_NORMAL */ - 690, /* GL_MAP1_COLOR_4 */ - 693, /* GL_MAP1_INDEX */ - 694, /* GL_MAP1_NORMAL */ - 695, /* GL_MAP1_TEXTURE_COORD_1 */ - 696, /* GL_MAP1_TEXTURE_COORD_2 */ - 697, /* GL_MAP1_TEXTURE_COORD_3 */ - 698, /* GL_MAP1_TEXTURE_COORD_4 */ - 699, /* GL_MAP1_VERTEX_3 */ - 700, /* GL_MAP1_VERTEX_4 */ - 717, /* GL_MAP2_COLOR_4 */ - 720, /* GL_MAP2_INDEX */ - 721, /* GL_MAP2_NORMAL */ - 722, /* GL_MAP2_TEXTURE_COORD_1 */ - 723, /* GL_MAP2_TEXTURE_COORD_2 */ - 724, /* GL_MAP2_TEXTURE_COORD_3 */ - 725, /* GL_MAP2_TEXTURE_COORD_4 */ - 726, /* GL_MAP2_VERTEX_3 */ - 727, /* GL_MAP2_VERTEX_4 */ - 691, /* GL_MAP1_GRID_DOMAIN */ - 692, /* GL_MAP1_GRID_SEGMENTS */ - 718, /* GL_MAP2_GRID_DOMAIN */ - 719, /* GL_MAP2_GRID_SEGMENTS */ - 1510, /* GL_TEXTURE_1D */ - 1512, /* GL_TEXTURE_2D */ - 439, /* GL_FEEDBACK_BUFFER_POINTER */ - 440, /* GL_FEEDBACK_BUFFER_SIZE */ - 441, /* GL_FEEDBACK_BUFFER_TYPE */ - 1330, /* GL_SELECTION_BUFFER_POINTER */ - 1331, /* GL_SELECTION_BUFFER_SIZE */ - 1623, /* GL_TEXTURE_WIDTH */ - 1591, /* GL_TEXTURE_HEIGHT */ - 1547, /* GL_TEXTURE_COMPONENTS */ - 1531, /* GL_TEXTURE_BORDER_COLOR */ - 1530, /* GL_TEXTURE_BORDER */ - 345, /* GL_DONT_CARE */ - 437, /* GL_FASTEST */ - 954, /* GL_NICEST */ + 944, /* GL_NAME_STACK_DEPTH */ + 61, /* GL_AUTO_NORMAL */ + 688, /* GL_MAP1_COLOR_4 */ + 691, /* GL_MAP1_INDEX */ + 692, /* GL_MAP1_NORMAL */ + 693, /* GL_MAP1_TEXTURE_COORD_1 */ + 694, /* GL_MAP1_TEXTURE_COORD_2 */ + 695, /* GL_MAP1_TEXTURE_COORD_3 */ + 696, /* GL_MAP1_TEXTURE_COORD_4 */ + 697, /* GL_MAP1_VERTEX_3 */ + 698, /* GL_MAP1_VERTEX_4 */ + 715, /* GL_MAP2_COLOR_4 */ + 718, /* GL_MAP2_INDEX */ + 719, /* GL_MAP2_NORMAL */ + 720, /* GL_MAP2_TEXTURE_COORD_1 */ + 721, /* GL_MAP2_TEXTURE_COORD_2 */ + 722, /* GL_MAP2_TEXTURE_COORD_3 */ + 723, /* GL_MAP2_TEXTURE_COORD_4 */ + 724, /* GL_MAP2_VERTEX_3 */ + 725, /* GL_MAP2_VERTEX_4 */ + 689, /* GL_MAP1_GRID_DOMAIN */ + 690, /* GL_MAP1_GRID_SEGMENTS */ + 716, /* GL_MAP2_GRID_DOMAIN */ + 717, /* GL_MAP2_GRID_SEGMENTS */ + 1508, /* GL_TEXTURE_1D */ + 1510, /* GL_TEXTURE_2D */ + 437, /* GL_FEEDBACK_BUFFER_POINTER */ + 438, /* GL_FEEDBACK_BUFFER_SIZE */ + 439, /* GL_FEEDBACK_BUFFER_TYPE */ + 1328, /* GL_SELECTION_BUFFER_POINTER */ + 1329, /* GL_SELECTION_BUFFER_SIZE */ + 1621, /* GL_TEXTURE_WIDTH */ + 1589, /* GL_TEXTURE_HEIGHT */ + 1545, /* GL_TEXTURE_COMPONENTS */ + 1529, /* GL_TEXTURE_BORDER_COLOR */ + 1528, /* GL_TEXTURE_BORDER */ + 344, /* GL_DONT_CARE */ + 435, /* GL_FASTEST */ + 952, /* GL_NICEST */ 47, /* GL_AMBIENT */ - 342, /* GL_DIFFUSE */ - 1373, /* GL_SPECULAR */ - 1113, /* GL_POSITION */ - 1376, /* GL_SPOT_DIRECTION */ - 1377, /* GL_SPOT_EXPONENT */ - 1375, /* GL_SPOT_CUTOFF */ - 245, /* GL_CONSTANT_ATTENUATION */ - 640, /* GL_LINEAR_ATTENUATION */ - 1210, /* GL_QUADRATIC_ATTENUATION */ - 219, /* GL_COMPILE */ - 220, /* GL_COMPILE_AND_EXECUTE */ - 111, /* GL_BYTE */ - 1654, /* GL_UNSIGNED_BYTE */ - 1344, /* GL_SHORT */ - 1663, /* GL_UNSIGNED_SHORT */ - 592, /* GL_INT */ - 1657, /* GL_UNSIGNED_INT */ - 444, /* GL_FLOAT */ + 341, /* GL_DIFFUSE */ + 1371, /* GL_SPECULAR */ + 1111, /* GL_POSITION */ + 1374, /* GL_SPOT_DIRECTION */ + 1375, /* GL_SPOT_EXPONENT */ + 1373, /* GL_SPOT_CUTOFF */ + 244, /* GL_CONSTANT_ATTENUATION */ + 638, /* GL_LINEAR_ATTENUATION */ + 1208, /* GL_QUADRATIC_ATTENUATION */ + 218, /* GL_COMPILE */ + 219, /* GL_COMPILE_AND_EXECUTE */ + 110, /* GL_BYTE */ + 1652, /* GL_UNSIGNED_BYTE */ + 1342, /* GL_SHORT */ + 1661, /* GL_UNSIGNED_SHORT */ + 590, /* GL_INT */ + 1655, /* GL_UNSIGNED_INT */ + 442, /* GL_FLOAT */ 1, /* GL_2_BYTES */ 5, /* GL_3_BYTES */ 7, /* GL_4_BYTES */ - 352, /* GL_DOUBLE */ - 123, /* GL_CLEAR */ + 351, /* GL_DOUBLE */ + 122, /* GL_CLEAR */ 49, /* GL_AND */ 51, /* GL_AND_REVERSE */ - 269, /* GL_COPY */ + 268, /* GL_COPY */ 50, /* GL_AND_INVERTED */ - 956, /* GL_NOOP */ - 1744, /* GL_XOR */ - 1018, /* GL_OR */ - 957, /* GL_NOR */ - 427, /* GL_EQUIV */ - 618, /* GL_INVERT */ - 1021, /* GL_OR_REVERSE */ - 270, /* GL_COPY_INVERTED */ - 1020, /* GL_OR_INVERTED */ - 947, /* GL_NAND */ - 1335, /* GL_SET */ - 424, /* GL_EMISSION */ - 1343, /* GL_SHININESS */ + 954, /* GL_NOOP */ + 1742, /* GL_XOR */ + 1016, /* GL_OR */ + 955, /* GL_NOR */ + 425, /* GL_EQUIV */ + 616, /* GL_INVERT */ + 1019, /* GL_OR_REVERSE */ + 269, /* GL_COPY_INVERTED */ + 1018, /* GL_OR_INVERTED */ + 945, /* GL_NAND */ + 1333, /* GL_SET */ + 422, /* GL_EMISSION */ + 1341, /* GL_SHININESS */ 48, /* GL_AMBIENT_AND_DIFFUSE */ - 165, /* GL_COLOR_INDEXES */ - 897, /* GL_MODELVIEW */ - 1189, /* GL_PROJECTION */ - 1445, /* GL_TEXTURE */ - 138, /* GL_COLOR */ - 313, /* GL_DEPTH */ - 1395, /* GL_STENCIL */ - 164, /* GL_COLOR_INDEX */ - 1413, /* GL_STENCIL_INDEX */ - 322, /* GL_DEPTH_COMPONENT */ - 1230, /* GL_RED */ - 548, /* GL_GREEN */ - 89, /* GL_BLUE */ + 164, /* GL_COLOR_INDEXES */ + 895, /* GL_MODELVIEW */ + 1187, /* GL_PROJECTION */ + 1443, /* GL_TEXTURE */ + 137, /* GL_COLOR */ + 312, /* GL_DEPTH */ + 1393, /* GL_STENCIL */ + 163, /* GL_COLOR_INDEX */ + 1411, /* GL_STENCIL_INDEX */ + 321, /* GL_DEPTH_COMPONENT */ + 1228, /* GL_RED */ + 546, /* GL_GREEN */ + 88, /* GL_BLUE */ 31, /* GL_ALPHA */ - 1254, /* GL_RGB */ - 1273, /* GL_RGBA */ - 668, /* GL_LUMINANCE */ - 689, /* GL_LUMINANCE_ALPHA */ - 73, /* GL_BITMAP */ - 1069, /* GL_POINT */ - 638, /* GL_LINE */ - 442, /* GL_FILL */ - 1239, /* GL_RENDER */ - 438, /* GL_FEEDBACK */ - 1329, /* GL_SELECT */ - 443, /* GL_FLAT */ - 1348, /* GL_SMOOTH */ - 619, /* GL_KEEP */ - 1248, /* GL_REPLACE */ - 575, /* GL_INCR */ - 309, /* GL_DECR */ - 1678, /* GL_VENDOR */ - 1245, /* GL_RENDERER */ - 1679, /* GL_VERSION */ - 431, /* GL_EXTENSIONS */ - 1294, /* GL_S */ - 1436, /* GL_T */ - 1220, /* GL_R */ - 1209, /* GL_Q */ - 933, /* GL_MODULATE */ - 308, /* GL_DECAL */ - 1581, /* GL_TEXTURE_ENV_MODE */ - 1580, /* GL_TEXTURE_ENV_COLOR */ - 1579, /* GL_TEXTURE_ENV */ - 432, /* GL_EYE_LINEAR */ - 980, /* GL_OBJECT_LINEAR */ - 1374, /* GL_SPHERE_MAP */ - 1583, /* GL_TEXTURE_GEN_MODE */ - 982, /* GL_OBJECT_PLANE */ - 433, /* GL_EYE_PLANE */ - 948, /* GL_NEAREST */ - 639, /* GL_LINEAR */ - 952, /* GL_NEAREST_MIPMAP_NEAREST */ - 644, /* GL_LINEAR_MIPMAP_NEAREST */ - 951, /* GL_NEAREST_MIPMAP_LINEAR */ - 643, /* GL_LINEAR_MIPMAP_LINEAR */ - 1604, /* GL_TEXTURE_MAG_FILTER */ - 1612, /* GL_TEXTURE_MIN_FILTER */ - 1625, /* GL_TEXTURE_WRAP_S */ - 1626, /* GL_TEXTURE_WRAP_T */ - 117, /* GL_CLAMP */ - 1247, /* GL_REPEAT */ - 1107, /* GL_POLYGON_OFFSET_UNITS */ - 1106, /* GL_POLYGON_OFFSET_POINT */ - 1105, /* GL_POLYGON_OFFSET_LINE */ - 1221, /* GL_R3_G3_B2 */ - 1675, /* GL_V2F */ - 1676, /* GL_V3F */ - 114, /* GL_C4UB_V2F */ - 115, /* GL_C4UB_V3F */ - 112, /* GL_C3F_V3F */ - 945, /* GL_N3F_V3F */ - 113, /* GL_C4F_N3F_V3F */ - 1441, /* GL_T2F_V3F */ - 1443, /* GL_T4F_V4F */ - 1439, /* GL_T2F_C4UB_V3F */ - 1437, /* GL_T2F_C3F_V3F */ - 1440, /* GL_T2F_N3F_V3F */ - 1438, /* GL_T2F_C4F_N3F_V3F */ - 1442, /* GL_T4F_C4F_N3F_V4F */ - 130, /* GL_CLIP_PLANE0 */ - 131, /* GL_CLIP_PLANE1 */ - 132, /* GL_CLIP_PLANE2 */ - 133, /* GL_CLIP_PLANE3 */ - 134, /* GL_CLIP_PLANE4 */ - 135, /* GL_CLIP_PLANE5 */ - 623, /* GL_LIGHT0 */ - 624, /* GL_LIGHT1 */ - 625, /* GL_LIGHT2 */ - 626, /* GL_LIGHT3 */ - 627, /* GL_LIGHT4 */ - 628, /* GL_LIGHT5 */ - 629, /* GL_LIGHT6 */ - 630, /* GL_LIGHT7 */ - 552, /* GL_HINT_BIT */ - 247, /* GL_CONSTANT_COLOR */ - 992, /* GL_ONE_MINUS_CONSTANT_COLOR */ - 242, /* GL_CONSTANT_ALPHA */ - 990, /* GL_ONE_MINUS_CONSTANT_ALPHA */ - 76, /* GL_BLEND_COLOR */ - 512, /* GL_FUNC_ADD */ - 881, /* GL_MIN */ - 793, /* GL_MAX */ - 81, /* GL_BLEND_EQUATION */ - 516, /* GL_FUNC_SUBTRACT */ - 514, /* GL_FUNC_REVERSE_SUBTRACT */ - 250, /* GL_CONVOLUTION_1D */ - 251, /* GL_CONVOLUTION_2D */ - 1332, /* GL_SEPARABLE_2D */ - 254, /* GL_CONVOLUTION_BORDER_MODE */ - 258, /* GL_CONVOLUTION_FILTER_SCALE */ - 256, /* GL_CONVOLUTION_FILTER_BIAS */ - 1231, /* GL_REDUCE */ - 260, /* GL_CONVOLUTION_FORMAT */ - 264, /* GL_CONVOLUTION_WIDTH */ - 262, /* GL_CONVOLUTION_HEIGHT */ - 808, /* GL_MAX_CONVOLUTION_WIDTH */ - 806, /* GL_MAX_CONVOLUTION_HEIGHT */ - 1146, /* GL_POST_CONVOLUTION_RED_SCALE */ - 1142, /* GL_POST_CONVOLUTION_GREEN_SCALE */ - 1137, /* GL_POST_CONVOLUTION_BLUE_SCALE */ - 1133, /* GL_POST_CONVOLUTION_ALPHA_SCALE */ - 1144, /* GL_POST_CONVOLUTION_RED_BIAS */ - 1140, /* GL_POST_CONVOLUTION_GREEN_BIAS */ - 1135, /* GL_POST_CONVOLUTION_BLUE_BIAS */ - 1131, /* GL_POST_CONVOLUTION_ALPHA_BIAS */ - 553, /* GL_HISTOGRAM */ - 1193, /* GL_PROXY_HISTOGRAM */ - 569, /* GL_HISTOGRAM_WIDTH */ - 559, /* GL_HISTOGRAM_FORMAT */ - 565, /* GL_HISTOGRAM_RED_SIZE */ - 561, /* GL_HISTOGRAM_GREEN_SIZE */ - 556, /* GL_HISTOGRAM_BLUE_SIZE */ - 554, /* GL_HISTOGRAM_ALPHA_SIZE */ - 563, /* GL_HISTOGRAM_LUMINANCE_SIZE */ - 567, /* GL_HISTOGRAM_SINK */ - 882, /* GL_MINMAX */ - 884, /* GL_MINMAX_FORMAT */ - 886, /* GL_MINMAX_SINK */ - 1444, /* GL_TABLE_TOO_LARGE_EXT */ - 1656, /* GL_UNSIGNED_BYTE_3_3_2 */ - 1665, /* GL_UNSIGNED_SHORT_4_4_4_4 */ - 1667, /* GL_UNSIGNED_SHORT_5_5_5_1 */ - 1661, /* GL_UNSIGNED_INT_8_8_8_8 */ - 1658, /* GL_UNSIGNED_INT_10_10_10_2 */ - 1104, /* GL_POLYGON_OFFSET_FILL */ - 1103, /* GL_POLYGON_OFFSET_FACTOR */ - 1102, /* GL_POLYGON_OFFSET_BIAS */ - 1251, /* GL_RESCALE_NORMAL */ + 1252, /* GL_RGB */ + 1271, /* GL_RGBA */ + 666, /* GL_LUMINANCE */ + 687, /* GL_LUMINANCE_ALPHA */ + 72, /* GL_BITMAP */ + 1067, /* GL_POINT */ + 636, /* GL_LINE */ + 440, /* GL_FILL */ + 1237, /* GL_RENDER */ + 436, /* GL_FEEDBACK */ + 1327, /* GL_SELECT */ + 441, /* GL_FLAT */ + 1346, /* GL_SMOOTH */ + 617, /* GL_KEEP */ + 1246, /* GL_REPLACE */ + 573, /* GL_INCR */ + 308, /* GL_DECR */ + 1676, /* GL_VENDOR */ + 1243, /* GL_RENDERER */ + 1677, /* GL_VERSION */ + 429, /* GL_EXTENSIONS */ + 1292, /* GL_S */ + 1434, /* GL_T */ + 1218, /* GL_R */ + 1207, /* GL_Q */ + 931, /* GL_MODULATE */ + 307, /* GL_DECAL */ + 1579, /* GL_TEXTURE_ENV_MODE */ + 1578, /* GL_TEXTURE_ENV_COLOR */ + 1577, /* GL_TEXTURE_ENV */ + 430, /* GL_EYE_LINEAR */ + 978, /* GL_OBJECT_LINEAR */ + 1372, /* GL_SPHERE_MAP */ + 1581, /* GL_TEXTURE_GEN_MODE */ + 980, /* GL_OBJECT_PLANE */ + 431, /* GL_EYE_PLANE */ + 946, /* GL_NEAREST */ + 637, /* GL_LINEAR */ + 950, /* GL_NEAREST_MIPMAP_NEAREST */ + 642, /* GL_LINEAR_MIPMAP_NEAREST */ + 949, /* GL_NEAREST_MIPMAP_LINEAR */ + 641, /* GL_LINEAR_MIPMAP_LINEAR */ + 1602, /* GL_TEXTURE_MAG_FILTER */ + 1610, /* GL_TEXTURE_MIN_FILTER */ + 1623, /* GL_TEXTURE_WRAP_S */ + 1624, /* GL_TEXTURE_WRAP_T */ + 116, /* GL_CLAMP */ + 1245, /* GL_REPEAT */ + 1105, /* GL_POLYGON_OFFSET_UNITS */ + 1104, /* GL_POLYGON_OFFSET_POINT */ + 1103, /* GL_POLYGON_OFFSET_LINE */ + 1219, /* GL_R3_G3_B2 */ + 1673, /* GL_V2F */ + 1674, /* GL_V3F */ + 113, /* GL_C4UB_V2F */ + 114, /* GL_C4UB_V3F */ + 111, /* GL_C3F_V3F */ + 943, /* GL_N3F_V3F */ + 112, /* GL_C4F_N3F_V3F */ + 1439, /* GL_T2F_V3F */ + 1441, /* GL_T4F_V4F */ + 1437, /* GL_T2F_C4UB_V3F */ + 1435, /* GL_T2F_C3F_V3F */ + 1438, /* GL_T2F_N3F_V3F */ + 1436, /* GL_T2F_C4F_N3F_V3F */ + 1440, /* GL_T4F_C4F_N3F_V4F */ + 129, /* GL_CLIP_PLANE0 */ + 130, /* GL_CLIP_PLANE1 */ + 131, /* GL_CLIP_PLANE2 */ + 132, /* GL_CLIP_PLANE3 */ + 133, /* GL_CLIP_PLANE4 */ + 134, /* GL_CLIP_PLANE5 */ + 621, /* GL_LIGHT0 */ + 622, /* GL_LIGHT1 */ + 623, /* GL_LIGHT2 */ + 624, /* GL_LIGHT3 */ + 625, /* GL_LIGHT4 */ + 626, /* GL_LIGHT5 */ + 627, /* GL_LIGHT6 */ + 628, /* GL_LIGHT7 */ + 550, /* GL_HINT_BIT */ + 246, /* GL_CONSTANT_COLOR */ + 990, /* GL_ONE_MINUS_CONSTANT_COLOR */ + 241, /* GL_CONSTANT_ALPHA */ + 988, /* GL_ONE_MINUS_CONSTANT_ALPHA */ + 75, /* GL_BLEND_COLOR */ + 510, /* GL_FUNC_ADD */ + 879, /* GL_MIN */ + 791, /* GL_MAX */ + 80, /* GL_BLEND_EQUATION */ + 514, /* GL_FUNC_SUBTRACT */ + 512, /* GL_FUNC_REVERSE_SUBTRACT */ + 249, /* GL_CONVOLUTION_1D */ + 250, /* GL_CONVOLUTION_2D */ + 1330, /* GL_SEPARABLE_2D */ + 253, /* GL_CONVOLUTION_BORDER_MODE */ + 257, /* GL_CONVOLUTION_FILTER_SCALE */ + 255, /* GL_CONVOLUTION_FILTER_BIAS */ + 1229, /* GL_REDUCE */ + 259, /* GL_CONVOLUTION_FORMAT */ + 263, /* GL_CONVOLUTION_WIDTH */ + 261, /* GL_CONVOLUTION_HEIGHT */ + 806, /* GL_MAX_CONVOLUTION_WIDTH */ + 804, /* GL_MAX_CONVOLUTION_HEIGHT */ + 1144, /* GL_POST_CONVOLUTION_RED_SCALE */ + 1140, /* GL_POST_CONVOLUTION_GREEN_SCALE */ + 1135, /* GL_POST_CONVOLUTION_BLUE_SCALE */ + 1131, /* GL_POST_CONVOLUTION_ALPHA_SCALE */ + 1142, /* GL_POST_CONVOLUTION_RED_BIAS */ + 1138, /* GL_POST_CONVOLUTION_GREEN_BIAS */ + 1133, /* GL_POST_CONVOLUTION_BLUE_BIAS */ + 1129, /* GL_POST_CONVOLUTION_ALPHA_BIAS */ + 551, /* GL_HISTOGRAM */ + 1191, /* GL_PROXY_HISTOGRAM */ + 567, /* GL_HISTOGRAM_WIDTH */ + 557, /* GL_HISTOGRAM_FORMAT */ + 563, /* GL_HISTOGRAM_RED_SIZE */ + 559, /* GL_HISTOGRAM_GREEN_SIZE */ + 554, /* GL_HISTOGRAM_BLUE_SIZE */ + 552, /* GL_HISTOGRAM_ALPHA_SIZE */ + 561, /* GL_HISTOGRAM_LUMINANCE_SIZE */ + 565, /* GL_HISTOGRAM_SINK */ + 880, /* GL_MINMAX */ + 882, /* GL_MINMAX_FORMAT */ + 884, /* GL_MINMAX_SINK */ + 1442, /* GL_TABLE_TOO_LARGE_EXT */ + 1654, /* GL_UNSIGNED_BYTE_3_3_2 */ + 1663, /* GL_UNSIGNED_SHORT_4_4_4_4 */ + 1665, /* GL_UNSIGNED_SHORT_5_5_5_1 */ + 1659, /* GL_UNSIGNED_INT_8_8_8_8 */ + 1656, /* GL_UNSIGNED_INT_10_10_10_2 */ + 1102, /* GL_POLYGON_OFFSET_FILL */ + 1101, /* GL_POLYGON_OFFSET_FACTOR */ + 1100, /* GL_POLYGON_OFFSET_BIAS */ + 1249, /* GL_RESCALE_NORMAL */ 36, /* GL_ALPHA4 */ 38, /* GL_ALPHA8 */ 32, /* GL_ALPHA12 */ 34, /* GL_ALPHA16 */ - 679, /* GL_LUMINANCE4 */ - 685, /* GL_LUMINANCE8 */ - 669, /* GL_LUMINANCE12 */ - 675, /* GL_LUMINANCE16 */ - 680, /* GL_LUMINANCE4_ALPHA4 */ - 683, /* GL_LUMINANCE6_ALPHA2 */ - 686, /* GL_LUMINANCE8_ALPHA8 */ - 672, /* GL_LUMINANCE12_ALPHA4 */ - 670, /* GL_LUMINANCE12_ALPHA12 */ - 676, /* GL_LUMINANCE16_ALPHA16 */ - 593, /* GL_INTENSITY */ - 598, /* GL_INTENSITY4 */ - 600, /* GL_INTENSITY8 */ - 594, /* GL_INTENSITY12 */ - 596, /* GL_INTENSITY16 */ - 1263, /* GL_RGB2_EXT */ - 1264, /* GL_RGB4 */ - 1267, /* GL_RGB5 */ - 1271, /* GL_RGB8 */ - 1255, /* GL_RGB10 */ - 1259, /* GL_RGB12 */ - 1261, /* GL_RGB16 */ - 1278, /* GL_RGBA2 */ - 1280, /* GL_RGBA4 */ - 1268, /* GL_RGB5_A1 */ - 1284, /* GL_RGBA8 */ - 1256, /* GL_RGB10_A2 */ - 1274, /* GL_RGBA12 */ - 1276, /* GL_RGBA16 */ - 1617, /* GL_TEXTURE_RED_SIZE */ - 1589, /* GL_TEXTURE_GREEN_SIZE */ - 1528, /* GL_TEXTURE_BLUE_SIZE */ - 1515, /* GL_TEXTURE_ALPHA_SIZE */ - 1602, /* GL_TEXTURE_LUMINANCE_SIZE */ - 1593, /* GL_TEXTURE_INTENSITY_SIZE */ - 1249, /* GL_REPLACE_EXT */ - 1197, /* GL_PROXY_TEXTURE_1D */ - 1200, /* GL_PROXY_TEXTURE_2D */ - 1621, /* GL_TEXTURE_TOO_LARGE_EXT */ - 1614, /* GL_TEXTURE_PRIORITY */ - 1619, /* GL_TEXTURE_RESIDENT */ - 1518, /* GL_TEXTURE_BINDING_1D */ - 1520, /* GL_TEXTURE_BINDING_2D */ - 1522, /* GL_TEXTURE_BINDING_3D */ - 1028, /* GL_PACK_SKIP_IMAGES */ - 1024, /* GL_PACK_IMAGE_HEIGHT */ - 1650, /* GL_UNPACK_SKIP_IMAGES */ - 1647, /* GL_UNPACK_IMAGE_HEIGHT */ - 1514, /* GL_TEXTURE_3D */ - 1203, /* GL_PROXY_TEXTURE_3D */ - 1576, /* GL_TEXTURE_DEPTH */ - 1624, /* GL_TEXTURE_WRAP_R */ - 794, /* GL_MAX_3D_TEXTURE_SIZE */ - 1680, /* GL_VERTEX_ARRAY */ - 959, /* GL_NORMAL_ARRAY */ - 139, /* GL_COLOR_ARRAY */ - 578, /* GL_INDEX_ARRAY */ - 1555, /* GL_TEXTURE_COORD_ARRAY */ - 415, /* GL_EDGE_FLAG_ARRAY */ - 1685, /* GL_VERTEX_ARRAY_SIZE */ - 1687, /* GL_VERTEX_ARRAY_TYPE */ - 1686, /* GL_VERTEX_ARRAY_STRIDE */ - 964, /* GL_NORMAL_ARRAY_TYPE */ - 963, /* GL_NORMAL_ARRAY_STRIDE */ - 143, /* GL_COLOR_ARRAY_SIZE */ - 145, /* GL_COLOR_ARRAY_TYPE */ - 144, /* GL_COLOR_ARRAY_STRIDE */ - 583, /* GL_INDEX_ARRAY_TYPE */ - 582, /* GL_INDEX_ARRAY_STRIDE */ - 1559, /* GL_TEXTURE_COORD_ARRAY_SIZE */ - 1561, /* GL_TEXTURE_COORD_ARRAY_TYPE */ - 1560, /* GL_TEXTURE_COORD_ARRAY_STRIDE */ - 419, /* GL_EDGE_FLAG_ARRAY_STRIDE */ - 1684, /* GL_VERTEX_ARRAY_POINTER */ - 962, /* GL_NORMAL_ARRAY_POINTER */ - 142, /* GL_COLOR_ARRAY_POINTER */ - 581, /* GL_INDEX_ARRAY_POINTER */ - 1558, /* GL_TEXTURE_COORD_ARRAY_POINTER */ - 418, /* GL_EDGE_FLAG_ARRAY_POINTER */ - 938, /* GL_MULTISAMPLE */ - 1306, /* GL_SAMPLE_ALPHA_TO_COVERAGE */ - 1308, /* GL_SAMPLE_ALPHA_TO_ONE */ - 1313, /* GL_SAMPLE_COVERAGE */ - 1310, /* GL_SAMPLE_BUFFERS */ - 1301, /* GL_SAMPLES */ - 1317, /* GL_SAMPLE_COVERAGE_VALUE */ - 1315, /* GL_SAMPLE_COVERAGE_INVERT */ - 170, /* GL_COLOR_MATRIX */ - 172, /* GL_COLOR_MATRIX_STACK_DEPTH */ - 802, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */ - 1129, /* GL_POST_COLOR_MATRIX_RED_SCALE */ - 1125, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */ - 1120, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */ - 1116, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */ - 1127, /* GL_POST_COLOR_MATRIX_RED_BIAS */ - 1123, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */ - 1118, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */ - 1114, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */ - 1538, /* GL_TEXTURE_COLOR_TABLE_SGI */ - 1204, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */ - 1540, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ - 80, /* GL_BLEND_DST_RGB */ - 88, /* GL_BLEND_SRC_RGB */ - 79, /* GL_BLEND_DST_ALPHA */ - 87, /* GL_BLEND_SRC_ALPHA */ - 176, /* GL_COLOR_TABLE */ - 1139, /* GL_POST_CONVOLUTION_COLOR_TABLE */ - 1122, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */ - 1192, /* GL_PROXY_COLOR_TABLE */ - 1196, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */ - 1195, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */ - 200, /* GL_COLOR_TABLE_SCALE */ - 180, /* GL_COLOR_TABLE_BIAS */ - 185, /* GL_COLOR_TABLE_FORMAT */ - 202, /* GL_COLOR_TABLE_WIDTH */ - 197, /* GL_COLOR_TABLE_RED_SIZE */ - 188, /* GL_COLOR_TABLE_GREEN_SIZE */ - 182, /* GL_COLOR_TABLE_BLUE_SIZE */ - 177, /* GL_COLOR_TABLE_ALPHA_SIZE */ - 194, /* GL_COLOR_TABLE_LUMINANCE_SIZE */ - 191, /* GL_COLOR_TABLE_INTENSITY_SIZE */ - 71, /* GL_BGR */ - 72, /* GL_BGRA */ - 816, /* GL_MAX_ELEMENTS_VERTICES */ - 815, /* GL_MAX_ELEMENTS_INDICES */ - 1592, /* GL_TEXTURE_INDEX_SIZE_EXT */ - 136, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */ - 1086, /* GL_POINT_SIZE_MIN */ - 1082, /* GL_POINT_SIZE_MAX */ - 1076, /* GL_POINT_FADE_THRESHOLD_SIZE */ - 1072, /* GL_POINT_DISTANCE_ATTENUATION */ - 118, /* GL_CLAMP_TO_BORDER */ - 121, /* GL_CLAMP_TO_EDGE */ - 1613, /* GL_TEXTURE_MIN_LOD */ - 1611, /* GL_TEXTURE_MAX_LOD */ - 1517, /* GL_TEXTURE_BASE_LEVEL */ - 1610, /* GL_TEXTURE_MAX_LEVEL */ - 572, /* GL_IGNORE_BORDER_HP */ - 246, /* GL_CONSTANT_BORDER_HP */ - 1250, /* GL_REPLICATE_BORDER_HP */ - 252, /* GL_CONVOLUTION_BORDER_COLOR */ - 987, /* GL_OCCLUSION_TEST_HP */ - 988, /* GL_OCCLUSION_TEST_RESULT_HP */ - 641, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */ - 1532, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */ - 1534, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */ - 1536, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */ - 1537, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */ - 1535, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */ - 1533, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */ - 798, /* GL_MAX_CLIPMAP_DEPTH_SGIX */ - 799, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */ - 1149, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */ - 1151, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */ - 1148, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */ - 1150, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */ - 1600, /* GL_TEXTURE_LOD_BIAS_S_SGIX */ - 1601, /* GL_TEXTURE_LOD_BIAS_T_SGIX */ - 1599, /* GL_TEXTURE_LOD_BIAS_R_SGIX */ - 518, /* GL_GENERATE_MIPMAP */ - 519, /* GL_GENERATE_MIPMAP_HINT */ - 481, /* GL_FOG_OFFSET_SGIX */ - 482, /* GL_FOG_OFFSET_VALUE_SGIX */ - 1546, /* GL_TEXTURE_COMPARE_SGIX */ - 1545, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */ - 1596, /* GL_TEXTURE_LEQUAL_R_SGIX */ - 1588, /* GL_TEXTURE_GEQUAL_R_SGIX */ - 323, /* GL_DEPTH_COMPONENT16 */ - 326, /* GL_DEPTH_COMPONENT24 */ - 329, /* GL_DEPTH_COMPONENT32 */ - 274, /* GL_CULL_VERTEX_EXT */ - 276, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */ - 275, /* GL_CULL_VERTEX_EYE_POSITION_EXT */ - 1741, /* GL_WRAP_BORDER_SUN */ - 1539, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */ - 634, /* GL_LIGHT_MODEL_COLOR_CONTROL */ - 1345, /* GL_SINGLE_COLOR */ - 1333, /* GL_SEPARATE_SPECULAR_COLOR */ - 1342, /* GL_SHARED_TEXTURE_PALETTE_EXT */ - 1655, /* GL_UNSIGNED_BYTE_2_3_3_REV */ - 1668, /* GL_UNSIGNED_SHORT_5_6_5 */ - 1669, /* GL_UNSIGNED_SHORT_5_6_5_REV */ - 1666, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */ - 1664, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */ - 1662, /* GL_UNSIGNED_INT_8_8_8_8_REV */ - 1660, /* GL_UNSIGNED_INT_2_10_10_10_REV */ - 1608, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */ - 1609, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */ - 1607, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */ - 889, /* GL_MIRRORED_REPEAT */ - 1289, /* GL_RGB_S3TC */ - 1266, /* GL_RGB4_S3TC */ - 1288, /* GL_RGBA_S3TC */ - 1283, /* GL_RGBA4_S3TC */ - 1286, /* GL_RGBA_DXT5_S3TC */ - 1281, /* GL_RGBA4_DXT5_S3TC */ - 239, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */ - 234, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */ - 235, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */ - 236, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */ - 950, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */ - 949, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */ - 642, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */ - 468, /* GL_FOG_COORDINATE_SOURCE */ - 460, /* GL_FOG_COORD */ - 484, /* GL_FRAGMENT_DEPTH */ - 280, /* GL_CURRENT_FOG_COORD */ - 467, /* GL_FOG_COORDINATE_ARRAY_TYPE */ - 466, /* GL_FOG_COORDINATE_ARRAY_STRIDE */ - 465, /* GL_FOG_COORDINATE_ARRAY_POINTER */ - 462, /* GL_FOG_COORDINATE_ARRAY */ - 174, /* GL_COLOR_SUM */ - 299, /* GL_CURRENT_SECONDARY_COLOR */ - 1326, /* GL_SECONDARY_COLOR_ARRAY_SIZE */ - 1328, /* GL_SECONDARY_COLOR_ARRAY_TYPE */ - 1327, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */ - 1325, /* GL_SECONDARY_COLOR_ARRAY_POINTER */ - 1322, /* GL_SECONDARY_COLOR_ARRAY */ - 528, /* GL_GL_CURRENT_RASTER_SECONDARY_COLOR */ + 677, /* GL_LUMINANCE4 */ + 683, /* GL_LUMINANCE8 */ + 667, /* GL_LUMINANCE12 */ + 673, /* GL_LUMINANCE16 */ + 678, /* GL_LUMINANCE4_ALPHA4 */ + 681, /* GL_LUMINANCE6_ALPHA2 */ + 684, /* GL_LUMINANCE8_ALPHA8 */ + 670, /* GL_LUMINANCE12_ALPHA4 */ + 668, /* GL_LUMINANCE12_ALPHA12 */ + 674, /* GL_LUMINANCE16_ALPHA16 */ + 591, /* GL_INTENSITY */ + 596, /* GL_INTENSITY4 */ + 598, /* GL_INTENSITY8 */ + 592, /* GL_INTENSITY12 */ + 594, /* GL_INTENSITY16 */ + 1261, /* GL_RGB2_EXT */ + 1262, /* GL_RGB4 */ + 1265, /* GL_RGB5 */ + 1269, /* GL_RGB8 */ + 1253, /* GL_RGB10 */ + 1257, /* GL_RGB12 */ + 1259, /* GL_RGB16 */ + 1276, /* GL_RGBA2 */ + 1278, /* GL_RGBA4 */ + 1266, /* GL_RGB5_A1 */ + 1282, /* GL_RGBA8 */ + 1254, /* GL_RGB10_A2 */ + 1272, /* GL_RGBA12 */ + 1274, /* GL_RGBA16 */ + 1615, /* GL_TEXTURE_RED_SIZE */ + 1587, /* GL_TEXTURE_GREEN_SIZE */ + 1526, /* GL_TEXTURE_BLUE_SIZE */ + 1513, /* GL_TEXTURE_ALPHA_SIZE */ + 1600, /* GL_TEXTURE_LUMINANCE_SIZE */ + 1591, /* GL_TEXTURE_INTENSITY_SIZE */ + 1247, /* GL_REPLACE_EXT */ + 1195, /* GL_PROXY_TEXTURE_1D */ + 1198, /* GL_PROXY_TEXTURE_2D */ + 1619, /* GL_TEXTURE_TOO_LARGE_EXT */ + 1612, /* GL_TEXTURE_PRIORITY */ + 1617, /* GL_TEXTURE_RESIDENT */ + 1516, /* GL_TEXTURE_BINDING_1D */ + 1518, /* GL_TEXTURE_BINDING_2D */ + 1520, /* GL_TEXTURE_BINDING_3D */ + 1026, /* GL_PACK_SKIP_IMAGES */ + 1022, /* GL_PACK_IMAGE_HEIGHT */ + 1648, /* GL_UNPACK_SKIP_IMAGES */ + 1645, /* GL_UNPACK_IMAGE_HEIGHT */ + 1512, /* GL_TEXTURE_3D */ + 1201, /* GL_PROXY_TEXTURE_3D */ + 1574, /* GL_TEXTURE_DEPTH */ + 1622, /* GL_TEXTURE_WRAP_R */ + 792, /* GL_MAX_3D_TEXTURE_SIZE */ + 1678, /* GL_VERTEX_ARRAY */ + 957, /* GL_NORMAL_ARRAY */ + 138, /* GL_COLOR_ARRAY */ + 576, /* GL_INDEX_ARRAY */ + 1553, /* GL_TEXTURE_COORD_ARRAY */ + 414, /* GL_EDGE_FLAG_ARRAY */ + 1683, /* GL_VERTEX_ARRAY_SIZE */ + 1685, /* GL_VERTEX_ARRAY_TYPE */ + 1684, /* GL_VERTEX_ARRAY_STRIDE */ + 962, /* GL_NORMAL_ARRAY_TYPE */ + 961, /* GL_NORMAL_ARRAY_STRIDE */ + 142, /* GL_COLOR_ARRAY_SIZE */ + 144, /* GL_COLOR_ARRAY_TYPE */ + 143, /* GL_COLOR_ARRAY_STRIDE */ + 581, /* GL_INDEX_ARRAY_TYPE */ + 580, /* GL_INDEX_ARRAY_STRIDE */ + 1557, /* GL_TEXTURE_COORD_ARRAY_SIZE */ + 1559, /* GL_TEXTURE_COORD_ARRAY_TYPE */ + 1558, /* GL_TEXTURE_COORD_ARRAY_STRIDE */ + 418, /* GL_EDGE_FLAG_ARRAY_STRIDE */ + 1682, /* GL_VERTEX_ARRAY_POINTER */ + 960, /* GL_NORMAL_ARRAY_POINTER */ + 141, /* GL_COLOR_ARRAY_POINTER */ + 579, /* GL_INDEX_ARRAY_POINTER */ + 1556, /* GL_TEXTURE_COORD_ARRAY_POINTER */ + 417, /* GL_EDGE_FLAG_ARRAY_POINTER */ + 936, /* GL_MULTISAMPLE */ + 1304, /* GL_SAMPLE_ALPHA_TO_COVERAGE */ + 1306, /* GL_SAMPLE_ALPHA_TO_ONE */ + 1311, /* GL_SAMPLE_COVERAGE */ + 1308, /* GL_SAMPLE_BUFFERS */ + 1299, /* GL_SAMPLES */ + 1315, /* GL_SAMPLE_COVERAGE_VALUE */ + 1313, /* GL_SAMPLE_COVERAGE_INVERT */ + 169, /* GL_COLOR_MATRIX */ + 171, /* GL_COLOR_MATRIX_STACK_DEPTH */ + 800, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */ + 1127, /* GL_POST_COLOR_MATRIX_RED_SCALE */ + 1123, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */ + 1118, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */ + 1114, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */ + 1125, /* GL_POST_COLOR_MATRIX_RED_BIAS */ + 1121, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */ + 1116, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */ + 1112, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */ + 1536, /* GL_TEXTURE_COLOR_TABLE_SGI */ + 1202, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */ + 1538, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ + 79, /* GL_BLEND_DST_RGB */ + 87, /* GL_BLEND_SRC_RGB */ + 78, /* GL_BLEND_DST_ALPHA */ + 86, /* GL_BLEND_SRC_ALPHA */ + 175, /* GL_COLOR_TABLE */ + 1137, /* GL_POST_CONVOLUTION_COLOR_TABLE */ + 1120, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */ + 1190, /* GL_PROXY_COLOR_TABLE */ + 1194, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */ + 1193, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */ + 199, /* GL_COLOR_TABLE_SCALE */ + 179, /* GL_COLOR_TABLE_BIAS */ + 184, /* GL_COLOR_TABLE_FORMAT */ + 201, /* GL_COLOR_TABLE_WIDTH */ + 196, /* GL_COLOR_TABLE_RED_SIZE */ + 187, /* GL_COLOR_TABLE_GREEN_SIZE */ + 181, /* GL_COLOR_TABLE_BLUE_SIZE */ + 176, /* GL_COLOR_TABLE_ALPHA_SIZE */ + 193, /* GL_COLOR_TABLE_LUMINANCE_SIZE */ + 190, /* GL_COLOR_TABLE_INTENSITY_SIZE */ + 70, /* GL_BGR */ + 71, /* GL_BGRA */ + 814, /* GL_MAX_ELEMENTS_VERTICES */ + 813, /* GL_MAX_ELEMENTS_INDICES */ + 1590, /* GL_TEXTURE_INDEX_SIZE_EXT */ + 135, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */ + 1084, /* GL_POINT_SIZE_MIN */ + 1080, /* GL_POINT_SIZE_MAX */ + 1074, /* GL_POINT_FADE_THRESHOLD_SIZE */ + 1070, /* GL_POINT_DISTANCE_ATTENUATION */ + 117, /* GL_CLAMP_TO_BORDER */ + 120, /* GL_CLAMP_TO_EDGE */ + 1611, /* GL_TEXTURE_MIN_LOD */ + 1609, /* GL_TEXTURE_MAX_LOD */ + 1515, /* GL_TEXTURE_BASE_LEVEL */ + 1608, /* GL_TEXTURE_MAX_LEVEL */ + 570, /* GL_IGNORE_BORDER_HP */ + 245, /* GL_CONSTANT_BORDER_HP */ + 1248, /* GL_REPLICATE_BORDER_HP */ + 251, /* GL_CONVOLUTION_BORDER_COLOR */ + 985, /* GL_OCCLUSION_TEST_HP */ + 986, /* GL_OCCLUSION_TEST_RESULT_HP */ + 639, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */ + 1530, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */ + 1532, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */ + 1534, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */ + 1535, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */ + 1533, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */ + 1531, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */ + 796, /* GL_MAX_CLIPMAP_DEPTH_SGIX */ + 797, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */ + 1147, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */ + 1149, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */ + 1146, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */ + 1148, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */ + 1598, /* GL_TEXTURE_LOD_BIAS_S_SGIX */ + 1599, /* GL_TEXTURE_LOD_BIAS_T_SGIX */ + 1597, /* GL_TEXTURE_LOD_BIAS_R_SGIX */ + 516, /* GL_GENERATE_MIPMAP */ + 517, /* GL_GENERATE_MIPMAP_HINT */ + 479, /* GL_FOG_OFFSET_SGIX */ + 480, /* GL_FOG_OFFSET_VALUE_SGIX */ + 1544, /* GL_TEXTURE_COMPARE_SGIX */ + 1543, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */ + 1594, /* GL_TEXTURE_LEQUAL_R_SGIX */ + 1586, /* GL_TEXTURE_GEQUAL_R_SGIX */ + 322, /* GL_DEPTH_COMPONENT16 */ + 325, /* GL_DEPTH_COMPONENT24 */ + 328, /* GL_DEPTH_COMPONENT32 */ + 273, /* GL_CULL_VERTEX_EXT */ + 275, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */ + 274, /* GL_CULL_VERTEX_EYE_POSITION_EXT */ + 1739, /* GL_WRAP_BORDER_SUN */ + 1537, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */ + 632, /* GL_LIGHT_MODEL_COLOR_CONTROL */ + 1343, /* GL_SINGLE_COLOR */ + 1331, /* GL_SEPARATE_SPECULAR_COLOR */ + 1340, /* GL_SHARED_TEXTURE_PALETTE_EXT */ + 1653, /* GL_UNSIGNED_BYTE_2_3_3_REV */ + 1666, /* GL_UNSIGNED_SHORT_5_6_5 */ + 1667, /* GL_UNSIGNED_SHORT_5_6_5_REV */ + 1664, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */ + 1662, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */ + 1660, /* GL_UNSIGNED_INT_8_8_8_8_REV */ + 1658, /* GL_UNSIGNED_INT_2_10_10_10_REV */ + 1606, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */ + 1607, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */ + 1605, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */ + 887, /* GL_MIRRORED_REPEAT */ + 1287, /* GL_RGB_S3TC */ + 1264, /* GL_RGB4_S3TC */ + 1286, /* GL_RGBA_S3TC */ + 1281, /* GL_RGBA4_S3TC */ + 1284, /* GL_RGBA_DXT5_S3TC */ + 1279, /* GL_RGBA4_DXT5_S3TC */ + 238, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */ + 233, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */ + 234, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */ + 235, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */ + 948, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */ + 947, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */ + 640, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */ + 466, /* GL_FOG_COORDINATE_SOURCE */ + 458, /* GL_FOG_COORD */ + 482, /* GL_FRAGMENT_DEPTH */ + 279, /* GL_CURRENT_FOG_COORD */ + 465, /* GL_FOG_COORDINATE_ARRAY_TYPE */ + 464, /* GL_FOG_COORDINATE_ARRAY_STRIDE */ + 463, /* GL_FOG_COORDINATE_ARRAY_POINTER */ + 460, /* GL_FOG_COORDINATE_ARRAY */ + 173, /* GL_COLOR_SUM */ + 298, /* GL_CURRENT_SECONDARY_COLOR */ + 1324, /* GL_SECONDARY_COLOR_ARRAY_SIZE */ + 1326, /* GL_SECONDARY_COLOR_ARRAY_TYPE */ + 1325, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */ + 1323, /* GL_SECONDARY_COLOR_ARRAY_POINTER */ + 1320, /* GL_SECONDARY_COLOR_ARRAY */ + 526, /* GL_GL_CURRENT_RASTER_SECONDARY_COLOR */ 28, /* GL_ALIASED_POINT_SIZE_RANGE */ 27, /* GL_ALIASED_LINE_WIDTH_RANGE */ - 1446, /* GL_TEXTURE0 */ - 1448, /* GL_TEXTURE1 */ - 1470, /* GL_TEXTURE2 */ - 1492, /* GL_TEXTURE3 */ - 1498, /* GL_TEXTURE4 */ - 1500, /* GL_TEXTURE5 */ - 1502, /* GL_TEXTURE6 */ - 1504, /* GL_TEXTURE7 */ - 1506, /* GL_TEXTURE8 */ - 1508, /* GL_TEXTURE9 */ - 1449, /* GL_TEXTURE10 */ - 1451, /* GL_TEXTURE11 */ - 1453, /* GL_TEXTURE12 */ - 1455, /* GL_TEXTURE13 */ - 1457, /* GL_TEXTURE14 */ - 1459, /* GL_TEXTURE15 */ - 1461, /* GL_TEXTURE16 */ - 1463, /* GL_TEXTURE17 */ - 1465, /* GL_TEXTURE18 */ - 1467, /* GL_TEXTURE19 */ - 1471, /* GL_TEXTURE20 */ - 1473, /* GL_TEXTURE21 */ - 1475, /* GL_TEXTURE22 */ - 1477, /* GL_TEXTURE23 */ - 1479, /* GL_TEXTURE24 */ - 1481, /* GL_TEXTURE25 */ - 1483, /* GL_TEXTURE26 */ - 1485, /* GL_TEXTURE27 */ - 1487, /* GL_TEXTURE28 */ - 1489, /* GL_TEXTURE29 */ - 1493, /* GL_TEXTURE30 */ - 1495, /* GL_TEXTURE31 */ + 1444, /* GL_TEXTURE0 */ + 1446, /* GL_TEXTURE1 */ + 1468, /* GL_TEXTURE2 */ + 1490, /* GL_TEXTURE3 */ + 1496, /* GL_TEXTURE4 */ + 1498, /* GL_TEXTURE5 */ + 1500, /* GL_TEXTURE6 */ + 1502, /* GL_TEXTURE7 */ + 1504, /* GL_TEXTURE8 */ + 1506, /* GL_TEXTURE9 */ + 1447, /* GL_TEXTURE10 */ + 1449, /* GL_TEXTURE11 */ + 1451, /* GL_TEXTURE12 */ + 1453, /* GL_TEXTURE13 */ + 1455, /* GL_TEXTURE14 */ + 1457, /* GL_TEXTURE15 */ + 1459, /* GL_TEXTURE16 */ + 1461, /* GL_TEXTURE17 */ + 1463, /* GL_TEXTURE18 */ + 1465, /* GL_TEXTURE19 */ + 1469, /* GL_TEXTURE20 */ + 1471, /* GL_TEXTURE21 */ + 1473, /* GL_TEXTURE22 */ + 1475, /* GL_TEXTURE23 */ + 1477, /* GL_TEXTURE24 */ + 1479, /* GL_TEXTURE25 */ + 1481, /* GL_TEXTURE26 */ + 1483, /* GL_TEXTURE27 */ + 1485, /* GL_TEXTURE28 */ + 1487, /* GL_TEXTURE29 */ + 1491, /* GL_TEXTURE30 */ + 1493, /* GL_TEXTURE31 */ 18, /* GL_ACTIVE_TEXTURE */ - 124, /* GL_CLIENT_ACTIVE_TEXTURE */ - 867, /* GL_MAX_TEXTURE_UNITS */ - 1634, /* GL_TRANSPOSE_MODELVIEW_MATRIX */ - 1637, /* GL_TRANSPOSE_PROJECTION_MATRIX */ - 1639, /* GL_TRANSPOSE_TEXTURE_MATRIX */ - 1631, /* GL_TRANSPOSE_COLOR_MATRIX */ - 1434, /* GL_SUBTRACT */ - 856, /* GL_MAX_RENDERBUFFER_SIZE_EXT */ - 222, /* GL_COMPRESSED_ALPHA */ - 226, /* GL_COMPRESSED_LUMINANCE */ - 227, /* GL_COMPRESSED_LUMINANCE_ALPHA */ - 224, /* GL_COMPRESSED_INTENSITY */ - 230, /* GL_COMPRESSED_RGB */ - 231, /* GL_COMPRESSED_RGBA */ - 1553, /* GL_TEXTURE_COMPRESSION_HINT */ - 1615, /* GL_TEXTURE_RECTANGLE_ARB */ - 1525, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */ - 1207, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */ - 854, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */ - 335, /* GL_DEPTH_STENCIL_NV */ - 1659, /* GL_UNSIGNED_INT_24_8_NV */ - 863, /* GL_MAX_TEXTURE_LOD_BIAS */ - 1606, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */ - 864, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */ - 1582, /* GL_TEXTURE_FILTER_CONTROL */ - 1597, /* GL_TEXTURE_LOD_BIAS */ - 207, /* GL_COMBINE4 */ - 857, /* GL_MAX_SHININESS_NV */ - 858, /* GL_MAX_SPOT_EXPONENT_NV */ - 576, /* GL_INCR_WRAP */ - 310, /* GL_DECR_WRAP */ - 909, /* GL_MODELVIEW1_ARB */ - 965, /* GL_NORMAL_MAP */ - 1236, /* GL_REFLECTION_MAP */ - 1562, /* GL_TEXTURE_CUBE_MAP */ - 1523, /* GL_TEXTURE_BINDING_CUBE_MAP */ - 1570, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */ - 1564, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */ - 1572, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */ - 1566, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */ - 1574, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */ - 1568, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */ - 1205, /* GL_PROXY_TEXTURE_CUBE_MAP */ - 810, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */ - 944, /* GL_MULTISAMPLE_FILTER_HINT_NV */ - 476, /* GL_FOG_DISTANCE_MODE_NV */ - 435, /* GL_EYE_RADIAL_NV */ - 434, /* GL_EYE_PLANE_ABSOLUTE_NV */ - 206, /* GL_COMBINE */ - 213, /* GL_COMBINE_RGB */ - 208, /* GL_COMBINE_ALPHA */ - 1290, /* GL_RGB_SCALE */ + 123, /* GL_CLIENT_ACTIVE_TEXTURE */ + 865, /* GL_MAX_TEXTURE_UNITS */ + 1632, /* GL_TRANSPOSE_MODELVIEW_MATRIX */ + 1635, /* GL_TRANSPOSE_PROJECTION_MATRIX */ + 1637, /* GL_TRANSPOSE_TEXTURE_MATRIX */ + 1629, /* GL_TRANSPOSE_COLOR_MATRIX */ + 1432, /* GL_SUBTRACT */ + 854, /* GL_MAX_RENDERBUFFER_SIZE_EXT */ + 221, /* GL_COMPRESSED_ALPHA */ + 225, /* GL_COMPRESSED_LUMINANCE */ + 226, /* GL_COMPRESSED_LUMINANCE_ALPHA */ + 223, /* GL_COMPRESSED_INTENSITY */ + 229, /* GL_COMPRESSED_RGB */ + 230, /* GL_COMPRESSED_RGBA */ + 1551, /* GL_TEXTURE_COMPRESSION_HINT */ + 1613, /* GL_TEXTURE_RECTANGLE_ARB */ + 1523, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */ + 1205, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */ + 852, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */ + 334, /* GL_DEPTH_STENCIL_NV */ + 1657, /* GL_UNSIGNED_INT_24_8_NV */ + 861, /* GL_MAX_TEXTURE_LOD_BIAS */ + 1604, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */ + 862, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */ + 1580, /* GL_TEXTURE_FILTER_CONTROL */ + 1595, /* GL_TEXTURE_LOD_BIAS */ + 206, /* GL_COMBINE4 */ + 855, /* GL_MAX_SHININESS_NV */ + 856, /* GL_MAX_SPOT_EXPONENT_NV */ + 574, /* GL_INCR_WRAP */ + 309, /* GL_DECR_WRAP */ + 907, /* GL_MODELVIEW1_ARB */ + 963, /* GL_NORMAL_MAP */ + 1234, /* GL_REFLECTION_MAP */ + 1560, /* GL_TEXTURE_CUBE_MAP */ + 1521, /* GL_TEXTURE_BINDING_CUBE_MAP */ + 1568, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */ + 1562, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */ + 1570, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */ + 1564, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */ + 1572, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */ + 1566, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */ + 1203, /* GL_PROXY_TEXTURE_CUBE_MAP */ + 808, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */ + 942, /* GL_MULTISAMPLE_FILTER_HINT_NV */ + 474, /* GL_FOG_DISTANCE_MODE_NV */ + 433, /* GL_EYE_RADIAL_NV */ + 432, /* GL_EYE_PLANE_ABSOLUTE_NV */ + 205, /* GL_COMBINE */ + 212, /* GL_COMBINE_RGB */ + 207, /* GL_COMBINE_ALPHA */ + 1288, /* GL_RGB_SCALE */ 24, /* GL_ADD_SIGNED */ - 603, /* GL_INTERPOLATE */ - 241, /* GL_CONSTANT */ - 1155, /* GL_PRIMARY_COLOR */ - 1152, /* GL_PREVIOUS */ - 1356, /* GL_SOURCE0_RGB */ - 1362, /* GL_SOURCE1_RGB */ - 1368, /* GL_SOURCE2_RGB */ - 1372, /* GL_SOURCE3_RGB_NV */ - 1353, /* GL_SOURCE0_ALPHA */ - 1359, /* GL_SOURCE1_ALPHA */ - 1365, /* GL_SOURCE2_ALPHA */ - 1371, /* GL_SOURCE3_ALPHA_NV */ - 1001, /* GL_OPERAND0_RGB */ - 1007, /* GL_OPERAND1_RGB */ - 1013, /* GL_OPERAND2_RGB */ - 1017, /* GL_OPERAND3_RGB_NV */ - 998, /* GL_OPERAND0_ALPHA */ - 1004, /* GL_OPERAND1_ALPHA */ - 1010, /* GL_OPERAND2_ALPHA */ - 1016, /* GL_OPERAND3_ALPHA_NV */ - 1681, /* GL_VERTEX_ARRAY_BINDING_APPLE */ - 1745, /* GL_YCBCR_422_APPLE */ - 1670, /* GL_UNSIGNED_SHORT_8_8_APPLE */ - 1672, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */ - 1347, /* GL_SLICE_ACCUM_SUN */ - 1212, /* GL_QUAD_MESH_SUN */ - 1643, /* GL_TRIANGLE_MESH_SUN */ - 1719, /* GL_VERTEX_PROGRAM_ARB */ - 1730, /* GL_VERTEX_STATE_PROGRAM_NV */ - 1706, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */ - 1712, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */ - 1714, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */ - 1716, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */ - 301, /* GL_CURRENT_VERTEX_ATTRIB */ - 1168, /* GL_PROGRAM_LENGTH_ARB */ - 1182, /* GL_PROGRAM_STRING_ARB */ - 931, /* GL_MODELVIEW_PROJECTION_NV */ - 571, /* GL_IDENTITY_NV */ - 616, /* GL_INVERSE_NV */ - 1636, /* GL_TRANSPOSE_NV */ - 617, /* GL_INVERSE_TRANSPOSE_NV */ - 840, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */ - 839, /* GL_MAX_PROGRAM_MATRICES_ARB */ - 747, /* GL_MATRIX0_NV */ - 759, /* GL_MATRIX1_NV */ - 771, /* GL_MATRIX2_NV */ - 775, /* GL_MATRIX3_NV */ - 777, /* GL_MATRIX4_NV */ - 779, /* GL_MATRIX5_NV */ - 781, /* GL_MATRIX6_NV */ - 783, /* GL_MATRIX7_NV */ - 286, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */ - 283, /* GL_CURRENT_MATRIX_ARB */ - 1722, /* GL_VERTEX_PROGRAM_POINT_SIZE */ - 1725, /* GL_VERTEX_PROGRAM_TWO_SIDE */ - 1180, /* GL_PROGRAM_PARAMETER_NV */ - 1710, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */ - 1184, /* GL_PROGRAM_TARGET_NV */ - 1181, /* GL_PROGRAM_RESIDENT_NV */ - 1628, /* GL_TRACK_MATRIX_NV */ - 1629, /* GL_TRACK_MATRIX_TRANSFORM_NV */ - 1720, /* GL_VERTEX_PROGRAM_BINDING_NV */ - 1162, /* GL_PROGRAM_ERROR_POSITION_ARB */ - 320, /* GL_DEPTH_CLAMP_NV */ - 1688, /* GL_VERTEX_ATTRIB_ARRAY0_NV */ - 1695, /* GL_VERTEX_ATTRIB_ARRAY1_NV */ - 1696, /* GL_VERTEX_ATTRIB_ARRAY2_NV */ - 1697, /* GL_VERTEX_ATTRIB_ARRAY3_NV */ - 1698, /* GL_VERTEX_ATTRIB_ARRAY4_NV */ - 1699, /* GL_VERTEX_ATTRIB_ARRAY5_NV */ - 1700, /* GL_VERTEX_ATTRIB_ARRAY6_NV */ - 1701, /* GL_VERTEX_ATTRIB_ARRAY7_NV */ - 1702, /* GL_VERTEX_ATTRIB_ARRAY8_NV */ - 1703, /* GL_VERTEX_ATTRIB_ARRAY9_NV */ - 1689, /* GL_VERTEX_ATTRIB_ARRAY10_NV */ - 1690, /* GL_VERTEX_ATTRIB_ARRAY11_NV */ - 1691, /* GL_VERTEX_ATTRIB_ARRAY12_NV */ - 1692, /* GL_VERTEX_ATTRIB_ARRAY13_NV */ - 1693, /* GL_VERTEX_ATTRIB_ARRAY14_NV */ - 1694, /* GL_VERTEX_ATTRIB_ARRAY15_NV */ - 701, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */ - 708, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */ - 709, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */ - 710, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */ - 711, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */ - 712, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */ - 713, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */ - 714, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */ - 715, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */ - 716, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */ - 702, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */ - 703, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */ - 704, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */ - 705, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */ - 706, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */ - 707, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */ - 728, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */ - 735, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */ - 736, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */ - 737, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */ - 738, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */ - 739, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */ - 740, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */ - 1161, /* GL_PROGRAM_BINDING_ARB */ - 742, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */ - 743, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */ - 729, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */ - 730, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */ - 731, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */ - 732, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */ - 733, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */ - 734, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */ - 1551, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */ - 1548, /* GL_TEXTURE_COMPRESSED */ - 970, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */ - 240, /* GL_COMPRESSED_TEXTURE_FORMATS */ - 879, /* GL_MAX_VERTEX_UNITS_ARB */ + 601, /* GL_INTERPOLATE */ + 240, /* GL_CONSTANT */ + 1153, /* GL_PRIMARY_COLOR */ + 1150, /* GL_PREVIOUS */ + 1354, /* GL_SOURCE0_RGB */ + 1360, /* GL_SOURCE1_RGB */ + 1366, /* GL_SOURCE2_RGB */ + 1370, /* GL_SOURCE3_RGB_NV */ + 1351, /* GL_SOURCE0_ALPHA */ + 1357, /* GL_SOURCE1_ALPHA */ + 1363, /* GL_SOURCE2_ALPHA */ + 1369, /* GL_SOURCE3_ALPHA_NV */ + 999, /* GL_OPERAND0_RGB */ + 1005, /* GL_OPERAND1_RGB */ + 1011, /* GL_OPERAND2_RGB */ + 1015, /* GL_OPERAND3_RGB_NV */ + 996, /* GL_OPERAND0_ALPHA */ + 1002, /* GL_OPERAND1_ALPHA */ + 1008, /* GL_OPERAND2_ALPHA */ + 1014, /* GL_OPERAND3_ALPHA_NV */ + 1679, /* GL_VERTEX_ARRAY_BINDING_APPLE */ + 1743, /* GL_YCBCR_422_APPLE */ + 1668, /* GL_UNSIGNED_SHORT_8_8_APPLE */ + 1670, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */ + 1345, /* GL_SLICE_ACCUM_SUN */ + 1210, /* GL_QUAD_MESH_SUN */ + 1641, /* GL_TRIANGLE_MESH_SUN */ + 1717, /* GL_VERTEX_PROGRAM_ARB */ + 1728, /* GL_VERTEX_STATE_PROGRAM_NV */ + 1704, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */ + 1710, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */ + 1712, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */ + 1714, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */ + 300, /* GL_CURRENT_VERTEX_ATTRIB */ + 1166, /* GL_PROGRAM_LENGTH_ARB */ + 1180, /* GL_PROGRAM_STRING_ARB */ + 929, /* GL_MODELVIEW_PROJECTION_NV */ + 569, /* GL_IDENTITY_NV */ + 614, /* GL_INVERSE_NV */ + 1634, /* GL_TRANSPOSE_NV */ + 615, /* GL_INVERSE_TRANSPOSE_NV */ + 838, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */ + 837, /* GL_MAX_PROGRAM_MATRICES_ARB */ + 745, /* GL_MATRIX0_NV */ + 757, /* GL_MATRIX1_NV */ + 769, /* GL_MATRIX2_NV */ + 773, /* GL_MATRIX3_NV */ + 775, /* GL_MATRIX4_NV */ + 777, /* GL_MATRIX5_NV */ + 779, /* GL_MATRIX6_NV */ + 781, /* GL_MATRIX7_NV */ + 285, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */ + 282, /* GL_CURRENT_MATRIX_ARB */ + 1720, /* GL_VERTEX_PROGRAM_POINT_SIZE */ + 1723, /* GL_VERTEX_PROGRAM_TWO_SIDE */ + 1178, /* GL_PROGRAM_PARAMETER_NV */ + 1708, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */ + 1182, /* GL_PROGRAM_TARGET_NV */ + 1179, /* GL_PROGRAM_RESIDENT_NV */ + 1626, /* GL_TRACK_MATRIX_NV */ + 1627, /* GL_TRACK_MATRIX_TRANSFORM_NV */ + 1718, /* GL_VERTEX_PROGRAM_BINDING_NV */ + 1160, /* GL_PROGRAM_ERROR_POSITION_ARB */ + 319, /* GL_DEPTH_CLAMP_NV */ + 1686, /* GL_VERTEX_ATTRIB_ARRAY0_NV */ + 1693, /* GL_VERTEX_ATTRIB_ARRAY1_NV */ + 1694, /* GL_VERTEX_ATTRIB_ARRAY2_NV */ + 1695, /* GL_VERTEX_ATTRIB_ARRAY3_NV */ + 1696, /* GL_VERTEX_ATTRIB_ARRAY4_NV */ + 1697, /* GL_VERTEX_ATTRIB_ARRAY5_NV */ + 1698, /* GL_VERTEX_ATTRIB_ARRAY6_NV */ + 1699, /* GL_VERTEX_ATTRIB_ARRAY7_NV */ + 1700, /* GL_VERTEX_ATTRIB_ARRAY8_NV */ + 1701, /* GL_VERTEX_ATTRIB_ARRAY9_NV */ + 1687, /* GL_VERTEX_ATTRIB_ARRAY10_NV */ + 1688, /* GL_VERTEX_ATTRIB_ARRAY11_NV */ + 1689, /* GL_VERTEX_ATTRIB_ARRAY12_NV */ + 1690, /* GL_VERTEX_ATTRIB_ARRAY13_NV */ + 1691, /* GL_VERTEX_ATTRIB_ARRAY14_NV */ + 1692, /* GL_VERTEX_ATTRIB_ARRAY15_NV */ + 699, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */ + 706, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */ + 707, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */ + 708, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */ + 709, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */ + 710, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */ + 711, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */ + 712, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */ + 713, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */ + 714, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */ + 700, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */ + 701, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */ + 702, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */ + 703, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */ + 704, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */ + 705, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */ + 726, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */ + 733, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */ + 734, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */ + 735, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */ + 736, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */ + 737, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */ + 738, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */ + 1159, /* GL_PROGRAM_BINDING_ARB */ + 740, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */ + 741, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */ + 727, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */ + 728, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */ + 729, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */ + 730, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */ + 731, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */ + 732, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */ + 1549, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */ + 1546, /* GL_TEXTURE_COMPRESSED */ + 968, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */ + 239, /* GL_COMPRESSED_TEXTURE_FORMATS */ + 877, /* GL_MAX_VERTEX_UNITS_ARB */ 22, /* GL_ACTIVE_VERTEX_UNITS_ARB */ - 1740, /* GL_WEIGHT_SUM_UNITY_ARB */ - 1718, /* GL_VERTEX_BLEND_ARB */ - 303, /* GL_CURRENT_WEIGHT_ARB */ - 1739, /* GL_WEIGHT_ARRAY_TYPE_ARB */ - 1738, /* GL_WEIGHT_ARRAY_STRIDE_ARB */ - 1737, /* GL_WEIGHT_ARRAY_SIZE_ARB */ - 1736, /* GL_WEIGHT_ARRAY_POINTER_ARB */ - 1733, /* GL_WEIGHT_ARRAY_ARB */ - 346, /* GL_DOT3_RGB */ - 347, /* GL_DOT3_RGBA */ - 238, /* GL_COMPRESSED_RGB_FXT1_3DFX */ - 233, /* GL_COMPRESSED_RGBA_FXT1_3DFX */ - 939, /* GL_MULTISAMPLE_3DFX */ - 1311, /* GL_SAMPLE_BUFFERS_3DFX */ - 1302, /* GL_SAMPLES_3DFX */ - 920, /* GL_MODELVIEW2_ARB */ - 923, /* GL_MODELVIEW3_ARB */ - 924, /* GL_MODELVIEW4_ARB */ - 925, /* GL_MODELVIEW5_ARB */ - 926, /* GL_MODELVIEW6_ARB */ - 927, /* GL_MODELVIEW7_ARB */ - 928, /* GL_MODELVIEW8_ARB */ - 929, /* GL_MODELVIEW9_ARB */ - 899, /* GL_MODELVIEW10_ARB */ - 900, /* GL_MODELVIEW11_ARB */ - 901, /* GL_MODELVIEW12_ARB */ - 902, /* GL_MODELVIEW13_ARB */ - 903, /* GL_MODELVIEW14_ARB */ - 904, /* GL_MODELVIEW15_ARB */ - 905, /* GL_MODELVIEW16_ARB */ - 906, /* GL_MODELVIEW17_ARB */ - 907, /* GL_MODELVIEW18_ARB */ - 908, /* GL_MODELVIEW19_ARB */ - 910, /* GL_MODELVIEW20_ARB */ - 911, /* GL_MODELVIEW21_ARB */ - 912, /* GL_MODELVIEW22_ARB */ - 913, /* GL_MODELVIEW23_ARB */ - 914, /* GL_MODELVIEW24_ARB */ - 915, /* GL_MODELVIEW25_ARB */ - 916, /* GL_MODELVIEW26_ARB */ - 917, /* GL_MODELVIEW27_ARB */ - 918, /* GL_MODELVIEW28_ARB */ - 919, /* GL_MODELVIEW29_ARB */ - 921, /* GL_MODELVIEW30_ARB */ - 922, /* GL_MODELVIEW31_ARB */ - 351, /* GL_DOT3_RGB_EXT */ - 349, /* GL_DOT3_RGBA_EXT */ - 893, /* GL_MIRROR_CLAMP_EXT */ - 896, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */ - 934, /* GL_MODULATE_ADD_ATI */ - 935, /* GL_MODULATE_SIGNED_ADD_ATI */ - 936, /* GL_MODULATE_SUBTRACT_ATI */ - 1746, /* GL_YCBCR_MESA */ - 1025, /* GL_PACK_INVERT_MESA */ - 306, /* GL_DEBUG_OBJECT_MESA */ - 307, /* GL_DEBUG_PRINT_MESA */ - 305, /* GL_DEBUG_ASSERT_MESA */ - 107, /* GL_BUFFER_SIZE */ - 109, /* GL_BUFFER_USAGE */ - 1399, /* GL_STENCIL_BACK_FUNC */ - 1397, /* GL_STENCIL_BACK_FAIL */ - 1401, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */ - 1403, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */ - 485, /* GL_FRAGMENT_PROGRAM_ARB */ - 1159, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */ - 1187, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */ - 1186, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */ - 1171, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */ - 1177, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */ - 1176, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */ - 829, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */ - 852, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */ - 851, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */ - 842, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */ - 848, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */ - 847, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */ - 812, /* GL_MAX_DRAW_BUFFERS */ - 355, /* GL_DRAW_BUFFER0 */ - 358, /* GL_DRAW_BUFFER1 */ - 379, /* GL_DRAW_BUFFER2 */ - 382, /* GL_DRAW_BUFFER3 */ - 385, /* GL_DRAW_BUFFER4 */ - 388, /* GL_DRAW_BUFFER5 */ - 391, /* GL_DRAW_BUFFER6 */ - 394, /* GL_DRAW_BUFFER7 */ - 397, /* GL_DRAW_BUFFER8 */ - 400, /* GL_DRAW_BUFFER9 */ - 359, /* GL_DRAW_BUFFER10 */ - 362, /* GL_DRAW_BUFFER11 */ - 365, /* GL_DRAW_BUFFER12 */ - 368, /* GL_DRAW_BUFFER13 */ - 371, /* GL_DRAW_BUFFER14 */ - 374, /* GL_DRAW_BUFFER15 */ - 82, /* GL_BLEND_EQUATION_ALPHA */ - 792, /* GL_MATRIX_PALETTE_ARB */ - 823, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */ - 826, /* GL_MAX_PALETTE_MATRICES_ARB */ - 289, /* GL_CURRENT_PALETTE_MATRIX_ARB */ - 786, /* GL_MATRIX_INDEX_ARRAY_ARB */ - 284, /* GL_CURRENT_MATRIX_INDEX_ARB */ - 788, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */ - 790, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */ - 789, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */ - 787, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */ - 1577, /* GL_TEXTURE_DEPTH_SIZE */ - 339, /* GL_DEPTH_TEXTURE_MODE */ - 1543, /* GL_TEXTURE_COMPARE_MODE */ - 1541, /* GL_TEXTURE_COMPARE_FUNC */ - 217, /* GL_COMPARE_R_TO_TEXTURE */ - 1093, /* GL_POINT_SPRITE */ - 266, /* GL_COORD_REPLACE */ - 1097, /* GL_POINT_SPRITE_R_MODE_NV */ - 1214, /* GL_QUERY_COUNTER_BITS */ - 291, /* GL_CURRENT_QUERY */ - 1216, /* GL_QUERY_RESULT */ - 1218, /* GL_QUERY_RESULT_AVAILABLE */ - 873, /* GL_MAX_VERTEX_ATTRIBS */ - 1708, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */ - 337, /* GL_DEPTH_STENCIL_TO_RGBA_NV */ - 336, /* GL_DEPTH_STENCIL_TO_BGRA_NV */ - 859, /* GL_MAX_TEXTURE_COORDS */ - 861, /* GL_MAX_TEXTURE_IMAGE_UNITS */ - 1164, /* GL_PROGRAM_ERROR_STRING_ARB */ - 1166, /* GL_PROGRAM_FORMAT_ASCII_ARB */ - 1165, /* GL_PROGRAM_FORMAT_ARB */ - 1622, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */ - 318, /* GL_DEPTH_BOUNDS_TEST_EXT */ - 317, /* GL_DEPTH_BOUNDS_EXT */ + 1738, /* GL_WEIGHT_SUM_UNITY_ARB */ + 1716, /* GL_VERTEX_BLEND_ARB */ + 302, /* GL_CURRENT_WEIGHT_ARB */ + 1737, /* GL_WEIGHT_ARRAY_TYPE_ARB */ + 1736, /* GL_WEIGHT_ARRAY_STRIDE_ARB */ + 1735, /* GL_WEIGHT_ARRAY_SIZE_ARB */ + 1734, /* GL_WEIGHT_ARRAY_POINTER_ARB */ + 1731, /* GL_WEIGHT_ARRAY_ARB */ + 345, /* GL_DOT3_RGB */ + 346, /* GL_DOT3_RGBA */ + 237, /* GL_COMPRESSED_RGB_FXT1_3DFX */ + 232, /* GL_COMPRESSED_RGBA_FXT1_3DFX */ + 937, /* GL_MULTISAMPLE_3DFX */ + 1309, /* GL_SAMPLE_BUFFERS_3DFX */ + 1300, /* GL_SAMPLES_3DFX */ + 918, /* GL_MODELVIEW2_ARB */ + 921, /* GL_MODELVIEW3_ARB */ + 922, /* GL_MODELVIEW4_ARB */ + 923, /* GL_MODELVIEW5_ARB */ + 924, /* GL_MODELVIEW6_ARB */ + 925, /* GL_MODELVIEW7_ARB */ + 926, /* GL_MODELVIEW8_ARB */ + 927, /* GL_MODELVIEW9_ARB */ + 897, /* GL_MODELVIEW10_ARB */ + 898, /* GL_MODELVIEW11_ARB */ + 899, /* GL_MODELVIEW12_ARB */ + 900, /* GL_MODELVIEW13_ARB */ + 901, /* GL_MODELVIEW14_ARB */ + 902, /* GL_MODELVIEW15_ARB */ + 903, /* GL_MODELVIEW16_ARB */ + 904, /* GL_MODELVIEW17_ARB */ + 905, /* GL_MODELVIEW18_ARB */ + 906, /* GL_MODELVIEW19_ARB */ + 908, /* GL_MODELVIEW20_ARB */ + 909, /* GL_MODELVIEW21_ARB */ + 910, /* GL_MODELVIEW22_ARB */ + 911, /* GL_MODELVIEW23_ARB */ + 912, /* GL_MODELVIEW24_ARB */ + 913, /* GL_MODELVIEW25_ARB */ + 914, /* GL_MODELVIEW26_ARB */ + 915, /* GL_MODELVIEW27_ARB */ + 916, /* GL_MODELVIEW28_ARB */ + 917, /* GL_MODELVIEW29_ARB */ + 919, /* GL_MODELVIEW30_ARB */ + 920, /* GL_MODELVIEW31_ARB */ + 350, /* GL_DOT3_RGB_EXT */ + 348, /* GL_DOT3_RGBA_EXT */ + 891, /* GL_MIRROR_CLAMP_EXT */ + 894, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */ + 932, /* GL_MODULATE_ADD_ATI */ + 933, /* GL_MODULATE_SIGNED_ADD_ATI */ + 934, /* GL_MODULATE_SUBTRACT_ATI */ + 1744, /* GL_YCBCR_MESA */ + 1023, /* GL_PACK_INVERT_MESA */ + 305, /* GL_DEBUG_OBJECT_MESA */ + 306, /* GL_DEBUG_PRINT_MESA */ + 304, /* GL_DEBUG_ASSERT_MESA */ + 106, /* GL_BUFFER_SIZE */ + 108, /* GL_BUFFER_USAGE */ + 1397, /* GL_STENCIL_BACK_FUNC */ + 1395, /* GL_STENCIL_BACK_FAIL */ + 1399, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */ + 1401, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */ + 483, /* GL_FRAGMENT_PROGRAM_ARB */ + 1157, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */ + 1185, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */ + 1184, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */ + 1169, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */ + 1175, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */ + 1174, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */ + 827, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */ + 850, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */ + 849, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */ + 840, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */ + 846, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */ + 845, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */ + 810, /* GL_MAX_DRAW_BUFFERS */ + 354, /* GL_DRAW_BUFFER0 */ + 357, /* GL_DRAW_BUFFER1 */ + 378, /* GL_DRAW_BUFFER2 */ + 381, /* GL_DRAW_BUFFER3 */ + 384, /* GL_DRAW_BUFFER4 */ + 387, /* GL_DRAW_BUFFER5 */ + 390, /* GL_DRAW_BUFFER6 */ + 393, /* GL_DRAW_BUFFER7 */ + 396, /* GL_DRAW_BUFFER8 */ + 399, /* GL_DRAW_BUFFER9 */ + 358, /* GL_DRAW_BUFFER10 */ + 361, /* GL_DRAW_BUFFER11 */ + 364, /* GL_DRAW_BUFFER12 */ + 367, /* GL_DRAW_BUFFER13 */ + 370, /* GL_DRAW_BUFFER14 */ + 373, /* GL_DRAW_BUFFER15 */ + 81, /* GL_BLEND_EQUATION_ALPHA */ + 790, /* GL_MATRIX_PALETTE_ARB */ + 821, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */ + 824, /* GL_MAX_PALETTE_MATRICES_ARB */ + 288, /* GL_CURRENT_PALETTE_MATRIX_ARB */ + 784, /* GL_MATRIX_INDEX_ARRAY_ARB */ + 283, /* GL_CURRENT_MATRIX_INDEX_ARB */ + 786, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */ + 788, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */ + 787, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */ + 785, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */ + 1575, /* GL_TEXTURE_DEPTH_SIZE */ + 338, /* GL_DEPTH_TEXTURE_MODE */ + 1541, /* GL_TEXTURE_COMPARE_MODE */ + 1539, /* GL_TEXTURE_COMPARE_FUNC */ + 216, /* GL_COMPARE_R_TO_TEXTURE */ + 1091, /* GL_POINT_SPRITE */ + 265, /* GL_COORD_REPLACE */ + 1095, /* GL_POINT_SPRITE_R_MODE_NV */ + 1212, /* GL_QUERY_COUNTER_BITS */ + 290, /* GL_CURRENT_QUERY */ + 1214, /* GL_QUERY_RESULT */ + 1216, /* GL_QUERY_RESULT_AVAILABLE */ + 871, /* GL_MAX_VERTEX_ATTRIBS */ + 1706, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */ + 336, /* GL_DEPTH_STENCIL_TO_RGBA_NV */ + 335, /* GL_DEPTH_STENCIL_TO_BGRA_NV */ + 857, /* GL_MAX_TEXTURE_COORDS */ + 859, /* GL_MAX_TEXTURE_IMAGE_UNITS */ + 1162, /* GL_PROGRAM_ERROR_STRING_ARB */ + 1164, /* GL_PROGRAM_FORMAT_ASCII_ARB */ + 1163, /* GL_PROGRAM_FORMAT_ARB */ + 1620, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */ + 317, /* GL_DEPTH_BOUNDS_TEST_EXT */ + 316, /* GL_DEPTH_BOUNDS_EXT */ 52, /* GL_ARRAY_BUFFER */ - 420, /* GL_ELEMENT_ARRAY_BUFFER */ - 54, /* GL_ARRAY_BUFFER_BINDING */ - 422, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */ - 1682, /* GL_VERTEX_ARRAY_BUFFER_BINDING */ - 960, /* GL_NORMAL_ARRAY_BUFFER_BINDING */ - 140, /* GL_COLOR_ARRAY_BUFFER_BINDING */ - 579, /* GL_INDEX_ARRAY_BUFFER_BINDING */ - 1556, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */ - 416, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */ - 1323, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */ - 463, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */ - 1734, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */ - 1704, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */ - 1167, /* GL_PROGRAM_INSTRUCTIONS_ARB */ - 835, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */ - 1173, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */ - 844, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */ - 1185, /* GL_PROGRAM_TEMPORARIES_ARB */ - 850, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */ - 1175, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */ - 846, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */ - 1179, /* GL_PROGRAM_PARAMETERS_ARB */ - 849, /* GL_MAX_PROGRAM_PARAMETERS_ARB */ - 1174, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */ - 845, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */ - 1160, /* GL_PROGRAM_ATTRIBS_ARB */ - 830, /* GL_MAX_PROGRAM_ATTRIBS_ARB */ - 1172, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */ - 843, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */ - 1158, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */ - 828, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */ - 1170, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */ - 841, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */ - 836, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */ - 832, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */ - 1188, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */ - 1633, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */ - 1226, /* GL_READ_ONLY */ - 1742, /* GL_WRITE_ONLY */ - 1228, /* GL_READ_WRITE */ - 101, /* GL_BUFFER_ACCESS */ - 103, /* GL_BUFFER_MAPPED */ - 105, /* GL_BUFFER_MAP_POINTER */ - 1627, /* GL_TIME_ELAPSED_EXT */ - 746, /* GL_MATRIX0_ARB */ - 758, /* GL_MATRIX1_ARB */ - 770, /* GL_MATRIX2_ARB */ - 774, /* GL_MATRIX3_ARB */ - 776, /* GL_MATRIX4_ARB */ - 778, /* GL_MATRIX5_ARB */ - 780, /* GL_MATRIX6_ARB */ - 782, /* GL_MATRIX7_ARB */ - 784, /* GL_MATRIX8_ARB */ - 785, /* GL_MATRIX9_ARB */ - 748, /* GL_MATRIX10_ARB */ - 749, /* GL_MATRIX11_ARB */ - 750, /* GL_MATRIX12_ARB */ - 751, /* GL_MATRIX13_ARB */ - 752, /* GL_MATRIX14_ARB */ - 753, /* GL_MATRIX15_ARB */ - 754, /* GL_MATRIX16_ARB */ - 755, /* GL_MATRIX17_ARB */ - 756, /* GL_MATRIX18_ARB */ - 757, /* GL_MATRIX19_ARB */ - 760, /* GL_MATRIX20_ARB */ - 761, /* GL_MATRIX21_ARB */ - 762, /* GL_MATRIX22_ARB */ - 763, /* GL_MATRIX23_ARB */ - 764, /* GL_MATRIX24_ARB */ - 765, /* GL_MATRIX25_ARB */ - 766, /* GL_MATRIX26_ARB */ - 767, /* GL_MATRIX27_ARB */ - 768, /* GL_MATRIX28_ARB */ - 769, /* GL_MATRIX29_ARB */ - 772, /* GL_MATRIX30_ARB */ - 773, /* GL_MATRIX31_ARB */ - 1429, /* GL_STREAM_DRAW */ - 1431, /* GL_STREAM_READ */ - 1427, /* GL_STREAM_COPY */ - 1391, /* GL_STATIC_DRAW */ - 1393, /* GL_STATIC_READ */ - 1389, /* GL_STATIC_COPY */ - 410, /* GL_DYNAMIC_DRAW */ - 412, /* GL_DYNAMIC_READ */ - 408, /* GL_DYNAMIC_COPY */ - 535, /* GL_GL_PIXEL_PACK_BUFFER */ - 537, /* GL_GL_PIXEL_UNPACK_BUFFER */ - 536, /* GL_GL_PIXEL_PACK_BUFFER_BINDING */ - 538, /* GL_GL_PIXEL_UNPACK_BUFFER_BINDING */ - 833, /* GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ - 831, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */ - 834, /* GL_MAX_PROGRAM_IF_DEPTH_NV */ - 838, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */ - 837, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */ - 795, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */ - 1423, /* GL_STENCIL_TEST_TWO_SIDE_EXT */ + 419, /* GL_ELEMENT_ARRAY_BUFFER */ + 53, /* GL_ARRAY_BUFFER_BINDING */ + 420, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */ + 1680, /* GL_VERTEX_ARRAY_BUFFER_BINDING */ + 958, /* GL_NORMAL_ARRAY_BUFFER_BINDING */ + 139, /* GL_COLOR_ARRAY_BUFFER_BINDING */ + 577, /* GL_INDEX_ARRAY_BUFFER_BINDING */ + 1554, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */ + 415, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */ + 1321, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */ + 461, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */ + 1732, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */ + 1702, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */ + 1165, /* GL_PROGRAM_INSTRUCTIONS_ARB */ + 833, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */ + 1171, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */ + 842, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */ + 1183, /* GL_PROGRAM_TEMPORARIES_ARB */ + 848, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */ + 1173, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */ + 844, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */ + 1177, /* GL_PROGRAM_PARAMETERS_ARB */ + 847, /* GL_MAX_PROGRAM_PARAMETERS_ARB */ + 1172, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */ + 843, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */ + 1158, /* GL_PROGRAM_ATTRIBS_ARB */ + 828, /* GL_MAX_PROGRAM_ATTRIBS_ARB */ + 1170, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */ + 841, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */ + 1156, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */ + 826, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */ + 1168, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */ + 839, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */ + 834, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */ + 830, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */ + 1186, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */ + 1631, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */ + 1224, /* GL_READ_ONLY */ + 1740, /* GL_WRITE_ONLY */ + 1226, /* GL_READ_WRITE */ + 100, /* GL_BUFFER_ACCESS */ + 102, /* GL_BUFFER_MAPPED */ + 104, /* GL_BUFFER_MAP_POINTER */ + 1625, /* GL_TIME_ELAPSED_EXT */ + 744, /* GL_MATRIX0_ARB */ + 756, /* GL_MATRIX1_ARB */ + 768, /* GL_MATRIX2_ARB */ + 772, /* GL_MATRIX3_ARB */ + 774, /* GL_MATRIX4_ARB */ + 776, /* GL_MATRIX5_ARB */ + 778, /* GL_MATRIX6_ARB */ + 780, /* GL_MATRIX7_ARB */ + 782, /* GL_MATRIX8_ARB */ + 783, /* GL_MATRIX9_ARB */ + 746, /* GL_MATRIX10_ARB */ + 747, /* GL_MATRIX11_ARB */ + 748, /* GL_MATRIX12_ARB */ + 749, /* GL_MATRIX13_ARB */ + 750, /* GL_MATRIX14_ARB */ + 751, /* GL_MATRIX15_ARB */ + 752, /* GL_MATRIX16_ARB */ + 753, /* GL_MATRIX17_ARB */ + 754, /* GL_MATRIX18_ARB */ + 755, /* GL_MATRIX19_ARB */ + 758, /* GL_MATRIX20_ARB */ + 759, /* GL_MATRIX21_ARB */ + 760, /* GL_MATRIX22_ARB */ + 761, /* GL_MATRIX23_ARB */ + 762, /* GL_MATRIX24_ARB */ + 763, /* GL_MATRIX25_ARB */ + 764, /* GL_MATRIX26_ARB */ + 765, /* GL_MATRIX27_ARB */ + 766, /* GL_MATRIX28_ARB */ + 767, /* GL_MATRIX29_ARB */ + 770, /* GL_MATRIX30_ARB */ + 771, /* GL_MATRIX31_ARB */ + 1427, /* GL_STREAM_DRAW */ + 1429, /* GL_STREAM_READ */ + 1425, /* GL_STREAM_COPY */ + 1389, /* GL_STATIC_DRAW */ + 1391, /* GL_STATIC_READ */ + 1387, /* GL_STATIC_COPY */ + 409, /* GL_DYNAMIC_DRAW */ + 411, /* GL_DYNAMIC_READ */ + 407, /* GL_DYNAMIC_COPY */ + 533, /* GL_GL_PIXEL_PACK_BUFFER */ + 535, /* GL_GL_PIXEL_UNPACK_BUFFER */ + 534, /* GL_GL_PIXEL_PACK_BUFFER_BINDING */ + 536, /* GL_GL_PIXEL_UNPACK_BUFFER_BINDING */ + 831, /* GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ + 829, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */ + 832, /* GL_MAX_PROGRAM_IF_DEPTH_NV */ + 836, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */ + 835, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */ + 793, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */ + 1421, /* GL_STENCIL_TEST_TWO_SIDE_EXT */ 17, /* GL_ACTIVE_STENCIL_FACE_EXT */ - 894, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */ - 1304, /* GL_SAMPLES_PASSED */ - 486, /* GL_FRAGMENT_SHADER */ - 1728, /* GL_VERTEX_SHADER */ - 1178, /* GL_PROGRAM_OBJECT_ARB */ - 1336, /* GL_SHADER_OBJECT_ARB */ - 819, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */ - 877, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */ - 871, /* GL_MAX_VARYING_FLOATS */ - 875, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */ - 804, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */ - 985, /* GL_OBJECT_TYPE_ARB */ - 1338, /* GL_SHADER_TYPE */ - 451, /* GL_FLOAT_VEC2 */ - 453, /* GL_FLOAT_VEC3 */ - 455, /* GL_FLOAT_VEC4 */ - 606, /* GL_INT_VEC2 */ - 608, /* GL_INT_VEC3 */ - 610, /* GL_INT_VEC4 */ - 93, /* GL_BOOL */ - 95, /* GL_BOOL_VEC2 */ - 97, /* GL_BOOL_VEC3 */ - 99, /* GL_BOOL_VEC4 */ - 445, /* GL_FLOAT_MAT2 */ - 447, /* GL_FLOAT_MAT3 */ - 449, /* GL_FLOAT_MAT4 */ - 1295, /* GL_SAMPLER_1D */ - 1297, /* GL_SAMPLER_2D */ - 1299, /* GL_SAMPLER_3D */ - 1300, /* GL_SAMPLER_CUBE */ - 1296, /* GL_SAMPLER_1D_SHADOW */ - 1298, /* GL_SAMPLER_2D_SHADOW */ - 529, /* GL_GL_FLOAT_MAT2x3 */ - 530, /* GL_GL_FLOAT_MAT2x4 */ - 531, /* GL_GL_FLOAT_MAT3x2 */ - 532, /* GL_GL_FLOAT_MAT3x4 */ - 533, /* GL_GL_FLOAT_MAT4x2 */ - 534, /* GL_GL_FLOAT_MAT4x3 */ - 312, /* GL_DELETE_STATUS */ - 221, /* GL_COMPILE_STATUS */ - 659, /* GL_LINK_STATUS */ - 1677, /* GL_VALIDATE_STATUS */ - 591, /* GL_INFO_LOG_LENGTH */ - 56, /* GL_ATTACHED_SHADERS */ + 892, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */ + 1302, /* GL_SAMPLES_PASSED */ + 484, /* GL_FRAGMENT_SHADER */ + 1726, /* GL_VERTEX_SHADER */ + 1176, /* GL_PROGRAM_OBJECT_ARB */ + 1334, /* GL_SHADER_OBJECT_ARB */ + 817, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */ + 875, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */ + 869, /* GL_MAX_VARYING_FLOATS */ + 873, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */ + 802, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */ + 983, /* GL_OBJECT_TYPE_ARB */ + 1336, /* GL_SHADER_TYPE */ + 449, /* GL_FLOAT_VEC2 */ + 451, /* GL_FLOAT_VEC3 */ + 453, /* GL_FLOAT_VEC4 */ + 604, /* GL_INT_VEC2 */ + 606, /* GL_INT_VEC3 */ + 608, /* GL_INT_VEC4 */ + 92, /* GL_BOOL */ + 94, /* GL_BOOL_VEC2 */ + 96, /* GL_BOOL_VEC3 */ + 98, /* GL_BOOL_VEC4 */ + 443, /* GL_FLOAT_MAT2 */ + 445, /* GL_FLOAT_MAT3 */ + 447, /* GL_FLOAT_MAT4 */ + 1293, /* GL_SAMPLER_1D */ + 1295, /* GL_SAMPLER_2D */ + 1297, /* GL_SAMPLER_3D */ + 1298, /* GL_SAMPLER_CUBE */ + 1294, /* GL_SAMPLER_1D_SHADOW */ + 1296, /* GL_SAMPLER_2D_SHADOW */ + 527, /* GL_GL_FLOAT_MAT2x3 */ + 528, /* GL_GL_FLOAT_MAT2x4 */ + 529, /* GL_GL_FLOAT_MAT3x2 */ + 530, /* GL_GL_FLOAT_MAT3x4 */ + 531, /* GL_GL_FLOAT_MAT4x2 */ + 532, /* GL_GL_FLOAT_MAT4x3 */ + 311, /* GL_DELETE_STATUS */ + 220, /* GL_COMPILE_STATUS */ + 657, /* GL_LINK_STATUS */ + 1675, /* GL_VALIDATE_STATUS */ + 589, /* GL_INFO_LOG_LENGTH */ + 55, /* GL_ATTACHED_SHADERS */ 20, /* GL_ACTIVE_UNIFORMS */ 21, /* GL_ACTIVE_UNIFORM_MAX_LENGTH */ - 1337, /* GL_SHADER_SOURCE_LENGTH */ + 1335, /* GL_SHADER_SOURCE_LENGTH */ 15, /* GL_ACTIVE_ATTRIBUTES */ 16, /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */ - 488, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */ - 1340, /* GL_SHADING_LANGUAGE_VERSION */ - 290, /* GL_CURRENT_PROGRAM */ - 1034, /* GL_PALETTE4_RGB8_OES */ - 1036, /* GL_PALETTE4_RGBA8_OES */ - 1032, /* GL_PALETTE4_R5_G6_B5_OES */ - 1035, /* GL_PALETTE4_RGBA4_OES */ - 1033, /* GL_PALETTE4_RGB5_A1_OES */ - 1039, /* GL_PALETTE8_RGB8_OES */ - 1041, /* GL_PALETTE8_RGBA8_OES */ - 1037, /* GL_PALETTE8_R5_G6_B5_OES */ - 1040, /* GL_PALETTE8_RGBA4_OES */ - 1038, /* GL_PALETTE8_RGB5_A1_OES */ - 574, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */ - 573, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */ - 1511, /* GL_TEXTURE_1D_ARRAY_EXT */ - 1198, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */ - 1513, /* GL_TEXTURE_2D_ARRAY_EXT */ - 1201, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */ - 1519, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */ - 1521, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */ - 543, /* GL_GL_SRGB */ - 544, /* GL_GL_SRGB8 */ - 546, /* GL_GL_SRGB_ALPHA */ - 545, /* GL_GL_SRGB8_ALPHA8 */ - 542, /* GL_GL_SLUMINANCE_ALPHA */ - 541, /* GL_GL_SLUMINANCE8_ALPHA8 */ - 539, /* GL_GL_SLUMINANCE */ - 540, /* GL_GL_SLUMINANCE8 */ - 526, /* GL_GL_COMPRESSED_SRGB */ - 527, /* GL_GL_COMPRESSED_SRGB_ALPHA */ - 524, /* GL_GL_COMPRESSED_SLUMINANCE */ - 525, /* GL_GL_COMPRESSED_SLUMINANCE_ALPHA */ - 1095, /* GL_POINT_SPRITE_COORD_ORIGIN */ - 667, /* GL_LOWER_LEFT */ - 1674, /* GL_UPPER_LEFT */ - 1405, /* GL_STENCIL_BACK_REF */ - 1406, /* GL_STENCIL_BACK_VALUE_MASK */ - 1407, /* GL_STENCIL_BACK_WRITEMASK */ - 403, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */ - 1240, /* GL_RENDERBUFFER_BINDING_EXT */ - 1225, /* GL_READ_FRAMEBUFFER_EXT */ - 404, /* GL_DRAW_FRAMEBUFFER_EXT */ - 1224, /* GL_READ_FRAMEBUFFER_BINDING_EXT */ - 490, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT */ - 489, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT */ - 494, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT */ - 492, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT */ - 491, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT */ - 496, /* GL_FRAMEBUFFER_COMPLETE_EXT */ - 498, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT */ - 503, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT */ - 501, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */ - 499, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */ - 502, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */ - 500, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */ - 504, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */ - 506, /* GL_FRAMEBUFFER_UNSUPPORTED_EXT */ - 505, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */ - 801, /* GL_MAX_COLOR_ATTACHMENTS_EXT */ - 146, /* GL_COLOR_ATTACHMENT0_EXT */ - 153, /* GL_COLOR_ATTACHMENT1_EXT */ - 154, /* GL_COLOR_ATTACHMENT2_EXT */ - 155, /* GL_COLOR_ATTACHMENT3_EXT */ - 156, /* GL_COLOR_ATTACHMENT4_EXT */ - 157, /* GL_COLOR_ATTACHMENT5_EXT */ - 158, /* GL_COLOR_ATTACHMENT6_EXT */ - 159, /* GL_COLOR_ATTACHMENT7_EXT */ - 160, /* GL_COLOR_ATTACHMENT8_EXT */ - 161, /* GL_COLOR_ATTACHMENT9_EXT */ - 147, /* GL_COLOR_ATTACHMENT10_EXT */ - 148, /* GL_COLOR_ATTACHMENT11_EXT */ - 149, /* GL_COLOR_ATTACHMENT12_EXT */ - 150, /* GL_COLOR_ATTACHMENT13_EXT */ - 151, /* GL_COLOR_ATTACHMENT14_EXT */ - 152, /* GL_COLOR_ATTACHMENT15_EXT */ - 314, /* GL_DEPTH_ATTACHMENT_EXT */ - 1396, /* GL_STENCIL_ATTACHMENT_EXT */ - 497, /* GL_FRAMEBUFFER_EXT */ - 1241, /* GL_RENDERBUFFER_EXT */ - 1244, /* GL_RENDERBUFFER_WIDTH_EXT */ - 1242, /* GL_RENDERBUFFER_HEIGHT_EXT */ - 1243, /* GL_RENDERBUFFER_INTERNAL_FORMAT_EXT */ - 1418, /* GL_STENCIL_INDEX_EXT */ - 1415, /* GL_STENCIL_INDEX1_EXT */ - 1416, /* GL_STENCIL_INDEX4_EXT */ - 1417, /* GL_STENCIL_INDEX8_EXT */ - 1414, /* GL_STENCIL_INDEX16_EXT */ - 428, /* GL_EVAL_BIT */ - 1222, /* GL_RASTER_POSITION_UNCLIPPED_IBM */ - 661, /* GL_LIST_BIT */ - 1527, /* GL_TEXTURE_BIT */ - 1319, /* GL_SCISSOR_BIT */ + 486, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */ + 1338, /* GL_SHADING_LANGUAGE_VERSION */ + 289, /* GL_CURRENT_PROGRAM */ + 1032, /* GL_PALETTE4_RGB8_OES */ + 1034, /* GL_PALETTE4_RGBA8_OES */ + 1030, /* GL_PALETTE4_R5_G6_B5_OES */ + 1033, /* GL_PALETTE4_RGBA4_OES */ + 1031, /* GL_PALETTE4_RGB5_A1_OES */ + 1037, /* GL_PALETTE8_RGB8_OES */ + 1039, /* GL_PALETTE8_RGBA8_OES */ + 1035, /* GL_PALETTE8_R5_G6_B5_OES */ + 1038, /* GL_PALETTE8_RGBA4_OES */ + 1036, /* GL_PALETTE8_RGB5_A1_OES */ + 572, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */ + 571, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */ + 1509, /* GL_TEXTURE_1D_ARRAY_EXT */ + 1196, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */ + 1511, /* GL_TEXTURE_2D_ARRAY_EXT */ + 1199, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */ + 1517, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */ + 1519, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */ + 541, /* GL_GL_SRGB */ + 542, /* GL_GL_SRGB8 */ + 544, /* GL_GL_SRGB_ALPHA */ + 543, /* GL_GL_SRGB8_ALPHA8 */ + 540, /* GL_GL_SLUMINANCE_ALPHA */ + 539, /* GL_GL_SLUMINANCE8_ALPHA8 */ + 537, /* GL_GL_SLUMINANCE */ + 538, /* GL_GL_SLUMINANCE8 */ + 524, /* GL_GL_COMPRESSED_SRGB */ + 525, /* GL_GL_COMPRESSED_SRGB_ALPHA */ + 522, /* GL_GL_COMPRESSED_SLUMINANCE */ + 523, /* GL_GL_COMPRESSED_SLUMINANCE_ALPHA */ + 1093, /* GL_POINT_SPRITE_COORD_ORIGIN */ + 665, /* GL_LOWER_LEFT */ + 1672, /* GL_UPPER_LEFT */ + 1403, /* GL_STENCIL_BACK_REF */ + 1404, /* GL_STENCIL_BACK_VALUE_MASK */ + 1405, /* GL_STENCIL_BACK_WRITEMASK */ + 402, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */ + 1238, /* GL_RENDERBUFFER_BINDING_EXT */ + 1223, /* GL_READ_FRAMEBUFFER_EXT */ + 403, /* GL_DRAW_FRAMEBUFFER_EXT */ + 1222, /* GL_READ_FRAMEBUFFER_BINDING_EXT */ + 488, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT */ + 487, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT */ + 492, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT */ + 490, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT */ + 489, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT */ + 494, /* GL_FRAMEBUFFER_COMPLETE_EXT */ + 496, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT */ + 501, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT */ + 499, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */ + 497, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */ + 500, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */ + 498, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */ + 502, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */ + 504, /* GL_FRAMEBUFFER_UNSUPPORTED_EXT */ + 503, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */ + 799, /* GL_MAX_COLOR_ATTACHMENTS_EXT */ + 145, /* GL_COLOR_ATTACHMENT0_EXT */ + 152, /* GL_COLOR_ATTACHMENT1_EXT */ + 153, /* GL_COLOR_ATTACHMENT2_EXT */ + 154, /* GL_COLOR_ATTACHMENT3_EXT */ + 155, /* GL_COLOR_ATTACHMENT4_EXT */ + 156, /* GL_COLOR_ATTACHMENT5_EXT */ + 157, /* GL_COLOR_ATTACHMENT6_EXT */ + 158, /* GL_COLOR_ATTACHMENT7_EXT */ + 159, /* GL_COLOR_ATTACHMENT8_EXT */ + 160, /* GL_COLOR_ATTACHMENT9_EXT */ + 146, /* GL_COLOR_ATTACHMENT10_EXT */ + 147, /* GL_COLOR_ATTACHMENT11_EXT */ + 148, /* GL_COLOR_ATTACHMENT12_EXT */ + 149, /* GL_COLOR_ATTACHMENT13_EXT */ + 150, /* GL_COLOR_ATTACHMENT14_EXT */ + 151, /* GL_COLOR_ATTACHMENT15_EXT */ + 313, /* GL_DEPTH_ATTACHMENT_EXT */ + 1394, /* GL_STENCIL_ATTACHMENT_EXT */ + 495, /* GL_FRAMEBUFFER_EXT */ + 1239, /* GL_RENDERBUFFER_EXT */ + 1242, /* GL_RENDERBUFFER_WIDTH_EXT */ + 1240, /* GL_RENDERBUFFER_HEIGHT_EXT */ + 1241, /* GL_RENDERBUFFER_INTERNAL_FORMAT_EXT */ + 1416, /* GL_STENCIL_INDEX_EXT */ + 1413, /* GL_STENCIL_INDEX1_EXT */ + 1414, /* GL_STENCIL_INDEX4_EXT */ + 1415, /* GL_STENCIL_INDEX8_EXT */ + 1412, /* GL_STENCIL_INDEX16_EXT */ + 426, /* GL_EVAL_BIT */ + 1220, /* GL_RASTER_POSITION_UNCLIPPED_IBM */ + 659, /* GL_LIST_BIT */ + 1525, /* GL_TEXTURE_BIT */ + 1317, /* GL_SCISSOR_BIT */ 29, /* GL_ALL_ATTRIB_BITS */ - 941, /* GL_MULTISAMPLE_BIT */ + 939, /* GL_MULTISAMPLE_BIT */ 30, /* GL_ALL_CLIENT_ATTRIB_BITS */ }; -- cgit v1.2.3 From 43346fb1fb43f91cb3e90d84b442dc08d6c9550d Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 09:14:53 -0600 Subject: set ctx->Const.MaxVertexTextureImageUnits = 0 This disallows vertex shader texture sampling. See bugs 16157, 13838. --- src/mesa/drivers/dri/i965/brw_context.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 33f1bba085b..1c7ad5c9c8f 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -125,7 +125,7 @@ GLboolean brwCreateContext( const __GLcontextModes *mesaVis, ctx->Const.MaxTextureUnits = BRW_MAX_TEX_UNIT; ctx->Const.MaxTextureImageUnits = BRW_MAX_TEX_UNIT; ctx->Const.MaxTextureCoordUnits = BRW_MAX_TEX_UNIT; - + ctx->Const.MaxVertexTextureImageUnits = 0; /* no vertex shader textures */ /* Advertise the full hardware capabilities. The new memory * manager should cope much better with overload situations: -- cgit v1.2.3 From 6befdca6a3d65d7e49c0c54a7a8f091cd05034ea Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 09:16:10 -0600 Subject: generate a link error if the vertex shader references too many textures --- src/mesa/shader/slang/slang_link.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mesa/shader/slang/slang_link.c b/src/mesa/shader/slang/slang_link.c index dd4990ba023..f9a5ecef96c 100644 --- a/src/mesa/shader/slang/slang_link.c +++ b/src/mesa/shader/slang/slang_link.c @@ -474,6 +474,12 @@ _slang_link(GLcontext *ctx, } } + /* Check that the vertex program doesn't use too many sampler units */ + if (shProg->VertexProgram && + _mesa_bitcount(shProg->VertexProgram->Base.SamplersUsed) > ctx->Const.MaxVertexTextureImageUnits) { + link_error(shProg, "Vertex program uses too many samplers.\n"); + return; + } if (fragProg && shProg->FragmentProgram) { /* notify driver that a new fragment program has been compiled/linked */ -- cgit v1.2.3 From 5ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5 Mon Sep 17 00:00:00 2001 From: Roland Scheidegger Date: Wed, 2 Jul 2008 20:20:33 +0200 Subject: mesa: fix issues around multisample enable multisample enable is enabled by default, however gl mandates multisample rendering rules only apply if there's also a multisampled buffer. --- src/mesa/drivers/dri/r300/r300_render.c | 2 +- src/mesa/main/buffers.c | 2 +- src/mesa/main/mtypes.h | 1 + src/mesa/main/state.c | 17 +++++++++++++++++ src/mesa/swrast/s_points.c | 2 +- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c index 8f74f9d785e..69ff6d573e2 100644 --- a/src/mesa/drivers/dri/r300/r300_render.c +++ b/src/mesa/drivers/dri/r300/r300_render.c @@ -373,7 +373,7 @@ static int r300Fallback(GLcontext * ctx) if (!r300->disable_lowimpact_fallback) { FALLBACK_IF(ctx->Polygon.StippleFlag); - FALLBACK_IF(ctx->Multisample.Enabled); + FALLBACK_IF(ctx->Multisample._Enabled); FALLBACK_IF(ctx->Line.StippleFlag); FALLBACK_IF(ctx->Line.SmoothFlag); FALLBACK_IF(ctx->Point.SmoothFlag); diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index b08095465d8..5ab969e0ebb 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -829,7 +829,7 @@ _mesa_init_scissor(GLcontext *ctx) void _mesa_init_multisample(GLcontext *ctx) { - ctx->Multisample.Enabled = GL_FALSE; + ctx->Multisample.Enabled = GL_TRUE; ctx->Multisample.SampleAlphaToCoverage = GL_FALSE; ctx->Multisample.SampleAlphaToOne = GL_FALSE; ctx->Multisample.SampleCoverage = GL_FALSE; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 04da767ec91..9339146e25c 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -958,6 +958,7 @@ struct gl_list_extensions struct gl_multisample_attrib { GLboolean Enabled; + GLboolean _Enabled; /**< true if Enabled and multisample buffer */ GLboolean SampleAlphaToCoverage; GLboolean SampleAlphaToOne; GLboolean SampleCoverage; diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 1c73c5c462b..7192bed4a3d 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -1060,6 +1060,20 @@ update_viewport_matrix(GLcontext *ctx) } +/** + * Update derived multisample state. + */ +static void +update_multisample(GLcontext *ctx) +{ + ctx->Multisample._Enabled = GL_FALSE; + if (ctx->DrawBuffer) { + if (ctx->DrawBuffer->Visual.sampleBuffers) + ctx->Multisample._Enabled = GL_TRUE; + } +} + + /** * Update derived color/blend/logicop state. */ @@ -1223,6 +1237,9 @@ _mesa_update_state_locked( GLcontext *ctx ) if (new_state & (_NEW_BUFFERS | _NEW_VIEWPORT)) update_viewport_matrix(ctx); + if (new_state & _NEW_MULTISAMPLE) + update_multisample( ctx ); + if (new_state & _NEW_COLOR) update_color( ctx ); diff --git a/src/mesa/swrast/s_points.c b/src/mesa/swrast/s_points.c index 350a0682d69..1a8fd7d6db2 100644 --- a/src/mesa/swrast/s_points.c +++ b/src/mesa/swrast/s_points.c @@ -263,7 +263,7 @@ smooth_point(GLcontext *ctx, const SWvertex *vert) size = get_size(ctx, vert, GL_TRUE); /* alpha attenuation / fade factor */ - if (ctx->Multisample.Enabled) { + if (ctx->Multisample._Enabled) { if (vert->pointSize >= ctx->Point.Threshold) { alphaAtten = 1.0F; } -- cgit v1.2.3 From 18adc71822463b5e50bcb23d682726b1a44870aa Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 12:37:01 -0600 Subject: mesa: fix all(bvec2) function typo, add missing bvec2/3/4() constuctors --- .../shader/slang/library/slang_common_builtin.gc | 2 +- src/mesa/shader/slang/library/slang_core.gc | 38 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/mesa/shader/slang/library/slang_common_builtin.gc b/src/mesa/shader/slang/library/slang_common_builtin.gc index 26080cf26ca..356f5f9d8e9 100644 --- a/src/mesa/shader/slang/library/slang_common_builtin.gc +++ b/src/mesa/shader/slang/library/slang_common_builtin.gc @@ -1559,7 +1559,7 @@ bool any(const bvec4 v) //// all -bool all (const vec2 v) +bool all (const bvec2 v) { float prod; __asm vec4_multiply prod.x, v.x, v.y; diff --git a/src/mesa/shader/slang/library/slang_core.gc b/src/mesa/shader/slang/library/slang_core.gc index ffa57f74c27..78e3ea9fdac 100644 --- a/src/mesa/shader/slang/library/slang_core.gc +++ b/src/mesa/shader/slang/library/slang_core.gc @@ -350,6 +350,19 @@ bvec2 __constructor(const int i) __asm vec4_seq __retVal.xy, i.xx, zero; } +bvec2 __constructor(const vec2 v) +{ + const vec2 zero = vec2(0.0, 0.0); + __asm vec4_seq __retVal.xy, v, zero; +} + +bvec2 __constructor(const ivec2 v) +{ + const ivec2 zero = ivec2(0, 0); + __asm vec4_seq __retVal.xy, v, zero; +} + + //// bvec3 constructors @@ -377,6 +390,19 @@ bvec3 __constructor(const int i) __asm vec4_seq __retVal.xyz, i.xxx, zero; } +bvec3 __constructor(const vec3 v) +{ + const vec3 zero = vec3(0.0, 0.0, 0.0); + __asm vec4_seq __retVal.xyz, v, zero; +} + +bvec3 __constructor(const ivec3 v) +{ + const ivec3 zero = ivec3(0, 0, 0); + __asm vec4_seq __retVal.xyz, v, zero; +} + + //// bvec4 constructors @@ -405,6 +431,18 @@ bvec4 __constructor(const int i) __asm vec4_seq __retVal, i.xxxx, zero; } +bvec4 __constructor(const vec4 v) +{ + const vec4 zero = vec4(0.0, 0.0, 0.0, 0.0); + __asm vec4_seq __retVal, v, zero; +} + +bvec4 __constructor(const ivec4 v) +{ + const ivec4 zero = ivec4(0, 0, 0, 0); + __asm vec4_seq __retVal, v, zero; +} + //// mat2 constructors -- cgit v1.2.3 From 918f3b17e5a3f94a7676a815c9b64cee054311ea Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 12:38:24 -0600 Subject: mesa: regenerated files --- .../shader/slang/library/slang_common_builtin_gc.h | 2 +- src/mesa/shader/slang/library/slang_core_gc.h | 53 ++++++++++++++-------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/mesa/shader/slang/library/slang_common_builtin_gc.h b/src/mesa/shader/slang/library/slang_common_builtin_gc.h index c8d1ffc1748..42f997db8d6 100644 --- a/src/mesa/shader/slang/library/slang_common_builtin_gc.h +++ b/src/mesa/shader/slang/library/slang_common_builtin_gc.h @@ -671,7 +671,7 @@ 101,99,52,95,97,100,100,0,18,115,117,109,0,59,120,0,0,18,115,117,109,0,59,120,0,0,18,118,0,59,122, 0,0,0,4,118,101,99,52,95,97,100,100,0,18,115,117,109,0,59,120,0,0,18,115,117,109,0,59,120,0,0,18, 118,0,59,119,0,0,0,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18, -115,117,109,0,59,120,0,0,17,48,0,48,0,0,0,0,0,1,0,1,0,97,108,108,0,1,1,0,10,118,0,0,0,1,3,2,0,9,1, +115,117,109,0,59,120,0,0,17,48,0,48,0,0,0,0,0,1,0,1,0,97,108,108,0,1,1,0,2,118,0,0,0,1,3,2,0,9,1, 112,114,111,100,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,112,114,111,100,0,59, 120,0,0,18,118,0,59,120,0,0,18,118,0,59,121,0,0,0,4,118,101,99,52,95,115,110,101,0,18,95,95,114, 101,116,86,97,108,0,59,120,0,0,18,112,114,111,100,0,59,120,0,0,17,48,0,48,0,0,0,0,8,18,118,0,59, diff --git a/src/mesa/shader/slang/library/slang_core_gc.h b/src/mesa/shader/slang/library/slang_core_gc.h index 1604d5a034a..b8e6d1a9903 100644 --- a/src/mesa/shader/slang/library/slang_core_gc.h +++ b/src/mesa/shader/slang/library/slang_core_gc.h @@ -61,26 +61,41 @@ 59,120,121,0,0,18,102,0,59,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,2,1,1,1,0,5,105,0,0,0,1,3,2, 1,6,1,122,101,114,111,0,2,58,105,118,101,99,50,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95, 115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,105,0,59,120,120,0,0,18,122,101, -114,111,0,0,0,0,1,0,3,1,1,1,0,1,98,49,0,0,1,1,0,1,98,50,0,0,1,1,0,1,98,51,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,59,120,0,18,98,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,18,98,50, -0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,18,98,51,0,20,0,0,1,0,3,1,1,1,0,1,98,0,0,0,1,9, -18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,18,98,0,59,120,120,120,0,20,0,0,1,0,3,1,1,1,0,9, -102,0,0,0,1,3,2,1,11,1,122,101,114,111,0,2,58,118,101,99,51,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17, -48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121, -122,0,0,18,102,0,59,120,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,3,1,1,1,0,5,105,0,0,0,1,3,2,1,7, -1,122,101,114,111,0,2,58,105,118,101,99,51,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101, -99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,105,0,59,120,120,120, -0,0,18,122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,1,98,49,0,0,1,1,0,1,98,50,0,0,1,1,0,1,98,51,0,0,1,1,0, -1,98,52,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,98,49,0,20,0,9,18,95,95,114,101,116, -86,97,108,0,59,121,0,18,98,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,18,98,51,0,20,0,9, -18,95,95,114,101,116,86,97,108,0,59,119,0,18,98,52,0,20,0,0,1,0,4,1,1,1,0,1,98,0,0,0,1,9,18,95,95, -114,101,116,86,97,108,0,59,120,121,122,119,0,18,98,0,59,120,120,120,120,0,20,0,0,1,0,4,1,1,1,0,9, -102,0,0,0,1,3,2,1,12,1,122,101,114,111,0,2,58,118,101,99,52,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17, +114,111,0,0,0,0,1,0,2,1,1,1,0,10,118,0,0,0,1,3,2,1,10,1,122,101,114,111,0,2,58,118,101,99,50,0,17, 48,0,48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97, -108,0,0,18,102,0,59,120,120,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,5,105,0,0,0,1,3,2, -1,8,1,122,101,114,111,0,2,58,105,118,101,99,52,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0, -0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,105,0,59,120,120,120, -120,0,0,18,122,101,114,111,0,0,0,0,1,0,13,1,1,1,0,9,109,48,48,0,0,1,1,0,9,109,49,48,0,0,1,1,0,9, +108,0,59,120,121,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,2,1,1,1,0,6,118,0,0,0,1,3,2,1,6,1, +122,101,114,111,0,2,58,105,118,101,99,50,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115, +101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1, +0,3,1,1,1,0,1,98,49,0,0,1,1,0,1,98,50,0,0,1,1,0,1,98,51,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0, +59,120,0,18,98,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,18,98,50,0,20,0,9,18,95,95, +114,101,116,86,97,108,0,59,122,0,18,98,51,0,20,0,0,1,0,3,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114,101, +116,86,97,108,0,59,120,121,122,0,18,98,0,59,120,120,120,0,20,0,0,1,0,3,1,1,1,0,9,102,0,0,0,1,3,2,1, +11,1,122,101,114,111,0,2,58,118,101,99,51,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0,0, +0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,102,0,59, +120,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,3,1,1,1,0,5,105,0,0,0,1,3,2,1,7,1,122,101,114,111,0, +2,58,105,118,101,99,51,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115,101,113, +0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,105,0,59,120,120,120,0,0,18,122,101,114, +111,0,0,0,0,1,0,3,1,1,1,0,11,118,0,0,0,1,3,2,1,11,1,122,101,114,111,0,2,58,118,101,99,51,0,17,48,0, +48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101, +116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,3,1,1,1,0,7,118,0,0,0, +1,3,2,1,7,1,122,101,114,111,0,2,58,105,118,101,99,51,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4, +118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,18, +122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,1,98,49,0,0,1,1,0,1,98,50,0,0,1,1,0,1,98,51,0,0,1,1,0,1,98, +52,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,98,49,0,20,0,9,18,95,95,114,101,116,86, +97,108,0,59,121,0,18,98,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,18,98,51,0,20,0,9,18, +95,95,114,101,116,86,97,108,0,59,119,0,18,98,52,0,20,0,0,1,0,4,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,59,120,121,122,119,0,18,98,0,59,120,120,120,120,0,20,0,0,1,0,4,1,1,1,0,9,102,0, +0,0,1,3,2,1,12,1,122,101,114,111,0,2,58,118,101,99,52,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0, +48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0, +0,18,102,0,59,120,120,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,5,105,0,0,0,1,3,2,1,8,1, +122,101,114,111,0,2,58,105,118,101,99,52,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4, +118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,105,0,59,120,120,120,120,0,0, +18,122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,12,118,0,0,0,1,3,2,1,12,1,122,101,114,111,0,2,58,118,101, +99,52,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52, +95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,4,1, +1,1,0,8,118,0,0,0,1,3,2,1,8,1,122,101,114,111,0,2,58,105,118,101,99,52,0,16,8,48,0,0,16,8,48,0,0, +16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0, +18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,13,1,1,1,0,9,109,48,48,0,0,1,1,0,9,109,49,48,0,0,1,1,0,9, 109,48,49,0,0,1,1,0,9,109,49,49,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,120,0, 18,109,48,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,121,0,18,109,49,48,0,20,0,9, 18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,120,0,18,109,48,49,0,20,0,9,18,95,95,114,101,116, -- cgit v1.2.3 From a2cddf58d2787a1ed027cbc7bc25bf4aa001e989 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 16:39:26 -0600 Subject: mesa: added some missing equal() notEqual() intrinsics --- .../shader/slang/library/slang_common_builtin.gc | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/mesa/shader/slang/library/slang_common_builtin.gc b/src/mesa/shader/slang/library/slang_common_builtin.gc index 356f5f9d8e9..f741c657e4a 100644 --- a/src/mesa/shader/slang/library/slang_common_builtin.gc +++ b/src/mesa/shader/slang/library/slang_common_builtin.gc @@ -1496,6 +1496,23 @@ bvec4 equal(const ivec4 u, const ivec4 v) __asm vec4_seq __retVal, u, v; } +bvec2 equal(const bvec2 u, const bvec2 v) +{ + __asm vec4_seq __retVal.xy, u, v; +} + +bvec3 equal(const bvec3 u, const bvec3 v) +{ + __asm vec4_seq __retVal.xyz, u, v; +} + +bvec4 equal(const bvec4 u, const bvec4 v) +{ + __asm vec4_seq __retVal, u, v; +} + + + //// notEqual @@ -1529,6 +1546,22 @@ bvec4 notEqual(const ivec4 u, const ivec4 v) __asm vec4_sne __retVal, u, v; } +bvec2 notEqual(const bvec2 u, const bvec2 v) +{ + __asm vec4_sne __retVal.xy, u, v; +} + +bvec3 notEqual(const bvec3 u, const bvec3 v) +{ + __asm vec4_sne __retVal.xyz, u, v; +} + +bvec4 notEqual(const bvec4 u, const bvec4 v) +{ + __asm vec4_sne __retVal, u, v; +} + + //// any -- cgit v1.2.3 From a405d69063c8bae28bd5808e297070d65d90a421 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 16:39:48 -0600 Subject: mesa: regenerated --- .../shader/slang/library/slang_common_builtin_gc.h | 315 +++++++++++---------- 1 file changed, 163 insertions(+), 152 deletions(-) diff --git a/src/mesa/shader/slang/library/slang_common_builtin_gc.h b/src/mesa/shader/slang/library/slang_common_builtin_gc.h index 42f997db8d6..260a768de6a 100644 --- a/src/mesa/shader/slang/library/slang_common_builtin_gc.h +++ b/src/mesa/shader/slang/library/slang_common_builtin_gc.h @@ -648,162 +648,173 @@ 1,1,0,7,118,0,0,0,1,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121, 122,0,0,18,117,0,0,18,118,0,0,0,0,1,0,4,0,101,113,117,97,108,0,1,1,0,8,117,0,0,1,1,0,8,118,0,0,0,1, 4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,117,0,0,18,118,0,0,0,0,1,0, -2,0,110,111,116,69,113,117,97,108,0,1,1,0,10,117,0,0,1,1,0,10,118,0,0,0,1,4,118,101,99,52,95,115, -110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,117,0,0,18,118,0,0,0,0,1,0,3,0,110, -111,116,69,113,117,97,108,0,1,1,0,11,117,0,0,1,1,0,11,118,0,0,0,1,4,118,101,99,52,95,115,110,101,0, -18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,117,0,0,18,118,0,0,0,0,1,0,4,0,110,111,116, -69,113,117,97,108,0,1,1,0,12,117,0,0,1,1,0,12,118,0,0,0,1,4,118,101,99,52,95,115,110,101,0,18,95, -95,114,101,116,86,97,108,0,0,18,117,0,0,18,118,0,0,0,0,1,0,2,0,110,111,116,69,113,117,97,108,0,1,1, -0,6,117,0,0,1,1,0,6,118,0,0,0,1,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0, -59,120,121,0,0,18,117,0,0,18,118,0,0,0,0,1,0,3,0,110,111,116,69,113,117,97,108,0,1,1,0,7,117,0,0,1, -1,0,7,118,0,0,0,1,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122, -0,0,18,117,0,0,18,118,0,0,0,0,1,0,4,0,110,111,116,69,113,117,97,108,0,1,1,0,8,117,0,0,1,1,0,8,118, -0,0,0,1,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,0,18,117,0,0,18,118,0,0, -0,0,1,0,1,0,97,110,121,0,1,1,0,2,118,0,0,0,1,3,2,0,9,1,115,117,109,0,0,0,4,118,101,99,52,95,97,100, -100,0,18,115,117,109,0,59,120,0,0,18,118,0,59,120,0,0,18,118,0,59,121,0,0,0,4,118,101,99,52,95,115, -110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,115,117,109,0,59,120,0,0,17,48,0,48,0,0,0, -0,0,1,0,1,0,97,110,121,0,1,1,0,3,118,0,0,0,1,3,2,0,9,1,115,117,109,0,0,0,4,118,101,99,52,95,97,100, -100,0,18,115,117,109,0,59,120,0,0,18,118,0,59,120,0,0,18,118,0,59,121,0,0,0,4,118,101,99,52,95,97, -100,100,0,18,115,117,109,0,59,120,0,0,18,115,117,109,0,59,120,0,0,18,118,0,59,122,0,0,0,4,118,101, +2,0,101,113,117,97,108,0,1,1,0,2,117,0,0,1,1,0,2,118,0,0,0,1,4,118,101,99,52,95,115,101,113,0,18, +95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,117,0,0,18,118,0,0,0,0,1,0,3,0,101,113,117,97,108, +0,1,1,0,3,117,0,0,1,1,0,3,118,0,0,0,1,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97, +108,0,59,120,121,122,0,0,18,117,0,0,18,118,0,0,0,0,1,0,4,0,101,113,117,97,108,0,1,1,0,4,117,0,0,1, +1,0,4,118,0,0,0,1,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,117,0,0, +18,118,0,0,0,0,1,0,2,0,110,111,116,69,113,117,97,108,0,1,1,0,10,117,0,0,1,1,0,10,118,0,0,0,1,4,118, +101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,117,0,0,18,118,0,0,0, +0,1,0,3,0,110,111,116,69,113,117,97,108,0,1,1,0,11,117,0,0,1,1,0,11,118,0,0,0,1,4,118,101,99,52,95, +115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,117,0,0,18,118,0,0,0,0,1,0,4, +0,110,111,116,69,113,117,97,108,0,1,1,0,12,117,0,0,1,1,0,12,118,0,0,0,1,4,118,101,99,52,95,115,110, +101,0,18,95,95,114,101,116,86,97,108,0,0,18,117,0,0,18,118,0,0,0,0,1,0,2,0,110,111,116,69,113,117, +97,108,0,1,1,0,6,117,0,0,1,1,0,6,118,0,0,0,1,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116, +86,97,108,0,59,120,121,0,0,18,117,0,0,18,118,0,0,0,0,1,0,3,0,110,111,116,69,113,117,97,108,0,1,1,0, +7,117,0,0,1,1,0,7,118,0,0,0,1,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,59, +120,121,122,0,0,18,117,0,0,18,118,0,0,0,0,1,0,4,0,110,111,116,69,113,117,97,108,0,1,1,0,8,117,0,0, +1,1,0,8,118,0,0,0,1,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,0,18,117,0,0, +18,118,0,0,0,0,1,0,2,0,110,111,116,69,113,117,97,108,0,1,1,0,2,117,0,0,1,1,0,2,118,0,0,0,1,4,118, +101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,117,0,0,18,118,0,0,0, +0,1,0,3,0,110,111,116,69,113,117,97,108,0,1,1,0,3,117,0,0,1,1,0,3,118,0,0,0,1,4,118,101,99,52,95, +115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,117,0,0,18,118,0,0,0,0,1,0,4, +0,110,111,116,69,113,117,97,108,0,1,1,0,4,117,0,0,1,1,0,4,118,0,0,0,1,4,118,101,99,52,95,115,110, +101,0,18,95,95,114,101,116,86,97,108,0,0,18,117,0,0,18,118,0,0,0,0,1,0,1,0,97,110,121,0,1,1,0,2, +118,0,0,0,1,3,2,0,9,1,115,117,109,0,0,0,4,118,101,99,52,95,97,100,100,0,18,115,117,109,0,59,120,0, +0,18,118,0,59,120,0,0,18,118,0,59,121,0,0,0,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116, +86,97,108,0,59,120,0,0,18,115,117,109,0,59,120,0,0,17,48,0,48,0,0,0,0,0,1,0,1,0,97,110,121,0,1,1,0, +3,118,0,0,0,1,3,2,0,9,1,115,117,109,0,0,0,4,118,101,99,52,95,97,100,100,0,18,115,117,109,0,59,120, +0,0,18,118,0,59,120,0,0,18,118,0,59,121,0,0,0,4,118,101,99,52,95,97,100,100,0,18,115,117,109,0,59, +120,0,0,18,115,117,109,0,59,120,0,0,18,118,0,59,122,0,0,0,4,118,101,99,52,95,115,110,101,0,18,95, +95,114,101,116,86,97,108,0,59,120,0,0,18,115,117,109,0,59,120,0,0,17,48,0,48,0,0,0,0,0,1,0,1,0,97, +110,121,0,1,1,0,4,118,0,0,0,1,3,2,0,9,1,115,117,109,0,0,0,4,118,101,99,52,95,97,100,100,0,18,115, +117,109,0,59,120,0,0,18,118,0,59,120,0,0,18,118,0,59,121,0,0,0,4,118,101,99,52,95,97,100,100,0,18, +115,117,109,0,59,120,0,0,18,115,117,109,0,59,120,0,0,18,118,0,59,122,0,0,0,4,118,101,99,52,95,97, +100,100,0,18,115,117,109,0,59,120,0,0,18,115,117,109,0,59,120,0,0,18,118,0,59,119,0,0,0,4,118,101, 99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,115,117,109,0,59,120,0,0,17, -48,0,48,0,0,0,0,0,1,0,1,0,97,110,121,0,1,1,0,4,118,0,0,0,1,3,2,0,9,1,115,117,109,0,0,0,4,118,101, -99,52,95,97,100,100,0,18,115,117,109,0,59,120,0,0,18,118,0,59,120,0,0,18,118,0,59,121,0,0,0,4,118, -101,99,52,95,97,100,100,0,18,115,117,109,0,59,120,0,0,18,115,117,109,0,59,120,0,0,18,118,0,59,122, -0,0,0,4,118,101,99,52,95,97,100,100,0,18,115,117,109,0,59,120,0,0,18,115,117,109,0,59,120,0,0,18, -118,0,59,119,0,0,0,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18, -115,117,109,0,59,120,0,0,17,48,0,48,0,0,0,0,0,1,0,1,0,97,108,108,0,1,1,0,2,118,0,0,0,1,3,2,0,9,1, -112,114,111,100,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,112,114,111,100,0,59, -120,0,0,18,118,0,59,120,0,0,18,118,0,59,121,0,0,0,4,118,101,99,52,95,115,110,101,0,18,95,95,114, -101,116,86,97,108,0,59,120,0,0,18,112,114,111,100,0,59,120,0,0,17,48,0,48,0,0,0,0,8,18,118,0,59, -120,0,18,118,0,59,121,0,34,0,0,1,0,1,0,97,108,108,0,1,1,0,3,118,0,0,0,1,3,2,0,9,1,112,114,111,100, -0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,112,114,111,100,0,59,120,0,0,18,118, -0,59,120,0,0,18,118,0,59,121,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,112,114, -111,100,0,59,120,0,0,18,112,114,111,100,0,59,120,0,0,18,118,0,59,122,0,0,0,4,118,101,99,52,95,115, -110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,112,114,111,100,0,59,120,0,0,17,48,0,48,0, -0,0,0,0,1,0,1,0,97,108,108,0,1,1,0,4,118,0,0,0,1,3,2,0,9,1,112,114,111,100,0,0,0,4,118,101,99,52, -95,109,117,108,116,105,112,108,121,0,18,112,114,111,100,0,59,120,0,0,18,118,0,59,120,0,0,18,118,0, -59,121,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,112,114,111,100,0,59,120,0,0, -18,112,114,111,100,0,59,120,0,0,18,118,0,59,122,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112, -108,121,0,18,112,114,111,100,0,59,120,0,0,18,112,114,111,100,0,59,120,0,0,18,118,0,59,119,0,0,0,4, -118,101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,112,114,111,100,0,59, -120,0,0,17,48,0,48,0,0,0,0,0,1,0,2,0,110,111,116,0,1,1,0,2,118,0,0,0,1,4,118,101,99,52,95,115,101, -113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,0,17,48,0,48,0,0,0,0,0,1,0,3,0,110, -111,116,0,1,1,0,3,118,0,0,0,1,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59, -120,121,122,0,0,18,118,0,0,17,48,0,48,0,0,0,0,0,1,0,4,0,110,111,116,0,1,1,0,4,118,0,0,0,1,4,118, -101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,17,48,0,48,0,0,0,0,0,1,0, -12,0,116,101,120,116,117,114,101,49,68,0,1,1,0,16,115,97,109,112,108,101,114,0,0,1,1,0,9,99,111, -111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18, -115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101, -49,68,80,114,111,106,0,1,1,0,16,115,97,109,112,108,101,114,0,0,1,1,0,10,99,111,111,114,100,0,0,0,1, -4,118,101,99,52,95,116,101,120,112,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112, -108,101,114,0,0,18,99,111,111,114,100,0,59,120,121,121,121,0,0,0,0,1,0,12,0,116,101,120,116,117, -114,101,49,68,80,114,111,106,0,1,1,0,16,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100, +48,0,48,0,0,0,0,0,1,0,1,0,97,108,108,0,1,1,0,2,118,0,0,0,1,3,2,0,9,1,112,114,111,100,0,0,0,4,118, +101,99,52,95,109,117,108,116,105,112,108,121,0,18,112,114,111,100,0,59,120,0,0,18,118,0,59,120,0,0, +18,118,0,59,121,0,0,0,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0, +18,112,114,111,100,0,59,120,0,0,17,48,0,48,0,0,0,0,8,18,118,0,59,120,0,18,118,0,59,121,0,34,0,0,1, +0,1,0,97,108,108,0,1,1,0,3,118,0,0,0,1,3,2,0,9,1,112,114,111,100,0,0,0,4,118,101,99,52,95,109,117, +108,116,105,112,108,121,0,18,112,114,111,100,0,59,120,0,0,18,118,0,59,120,0,0,18,118,0,59,121,0,0, +0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,112,114,111,100,0,59,120,0,0,18,112,114, +111,100,0,59,120,0,0,18,118,0,59,122,0,0,0,4,118,101,99,52,95,115,110,101,0,18,95,95,114,101,116, +86,97,108,0,59,120,0,0,18,112,114,111,100,0,59,120,0,0,17,48,0,48,0,0,0,0,0,1,0,1,0,97,108,108,0,1, +1,0,4,118,0,0,0,1,3,2,0,9,1,112,114,111,100,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108, +121,0,18,112,114,111,100,0,59,120,0,0,18,118,0,59,120,0,0,18,118,0,59,121,0,0,0,4,118,101,99,52,95, +109,117,108,116,105,112,108,121,0,18,112,114,111,100,0,59,120,0,0,18,112,114,111,100,0,59,120,0,0, +18,118,0,59,122,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,112,114,111,100,0,59, +120,0,0,18,112,114,111,100,0,59,120,0,0,18,118,0,59,119,0,0,0,4,118,101,99,52,95,115,110,101,0,18, +95,95,114,101,116,86,97,108,0,59,120,0,0,18,112,114,111,100,0,59,120,0,0,17,48,0,48,0,0,0,0,0,1,0, +2,0,110,111,116,0,1,1,0,2,118,0,0,0,1,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97, +108,0,59,120,121,0,0,18,118,0,0,17,48,0,48,0,0,0,0,0,1,0,3,0,110,111,116,0,1,1,0,3,118,0,0,0,1,4, +118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,17, +48,0,48,0,0,0,0,0,1,0,4,0,110,111,116,0,1,1,0,4,118,0,0,0,1,4,118,101,99,52,95,115,101,113,0,18,95, +95,114,101,116,86,97,108,0,0,18,118,0,0,17,48,0,48,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101, +49,68,0,1,1,0,16,115,97,109,112,108,101,114,0,0,1,1,0,9,99,111,111,114,100,0,0,0,1,4,118,101,99,52, +95,116,101,120,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99, +111,111,114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,49,68,80,114,111,106,0,1,1,0,16,115, +97,109,112,108,101,114,0,0,1,1,0,10,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112, +49,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114, +100,0,59,120,121,121,121,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,49,68,80,114,111,106,0,1,1,0, +16,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101, +120,112,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111, +111,114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,0,1,1,0,17,115,97,109,112,108,101, +114,0,0,1,1,0,10,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,50,100,0,18,95,95,114, +101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,116, +101,120,116,117,114,101,50,68,80,114,111,106,0,1,1,0,17,115,97,109,112,108,101,114,0,0,1,1,0,11,99, +111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112,50,100,0,18,95,95,114,101,116,86,97,108, +0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,59,120,121,122,122,0,0,0,0,1,0,12,0, +116,101,120,116,117,114,101,50,68,80,114,111,106,0,1,1,0,17,115,97,109,112,108,101,114,0,0,1,1,0, +12,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112,50,100,0,18,95,95,114,101,116,86, +97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,116,101,120, +116,117,114,101,51,68,0,1,1,0,18,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0, +1,4,118,101,99,52,95,116,101,120,51,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108, +101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,51,68,80,114,111, +106,0,1,1,0,18,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,0,1,4,118,101,99,52, +95,116,101,120,112,51,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0, +18,99,111,111,114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,67,117,98,101,0,1,1,0,19,115,97, +109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,99,117, +98,101,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114, +100,0,0,0,0,1,0,12,0,115,104,97,100,111,119,49,68,0,1,1,0,20,115,97,109,112,108,101,114,0,0,1,1,0, +11,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,49,100,0,18,95,95,114,101,116,86,97, +108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,115,104,97,100, +111,119,49,68,80,114,111,106,0,1,1,0,20,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100, 0,0,0,1,4,118,101,99,52,95,116,101,120,112,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97, -109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,0, -1,1,0,17,115,97,109,112,108,101,114,0,0,1,1,0,10,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116, -101,120,50,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111, -111,114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,80,114,111,106,0,1,1,0,17,115,97, -109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112,50, -100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0, -59,120,121,122,122,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,80,114,111,106,0,1,1,0,17, +109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,0,1,1, +0,21,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101, +120,50,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111, +114,100,0,0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,80,114,111,106,0,1,1,0,21,115,97,109,112,108, +101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112,50,100,0,18,95, +95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0, +12,0,116,101,120,116,117,114,101,50,68,82,101,99,116,0,1,1,0,22,115,97,109,112,108,101,114,0,0,1,1, +0,10,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,95,114,101,99,116,0,18,95,95,114, +101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,116, +101,120,116,117,114,101,50,68,82,101,99,116,80,114,111,106,0,1,1,0,22,115,97,109,112,108,101,114,0, +0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112,95,114,101,99,116,0,18,95, +95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,59,120,121, +122,122,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,82,101,99,116,80,114,111,106,0,1,1,0,22, 115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120, -112,50,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111, -114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,51,68,0,1,1,0,18,115,97,109,112,108,101,114,0, -0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,51,100,0,18,95,95,114,101,116, -86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,116,101,120, -116,117,114,101,51,68,80,114,111,106,0,1,1,0,18,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111, -114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112,51,100,0,18,95,95,114,101,116,86,97,108,0,0,18, -115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101, -67,117,98,101,0,1,1,0,19,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118, -101,99,52,95,116,101,120,99,117,98,101,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108, -101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,115,104,97,100,111,119,49,68,0,1,1,0,20,115,97, -109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,49,100, -0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0, -0,1,0,12,0,115,104,97,100,111,119,49,68,80,114,111,106,0,1,1,0,20,115,97,109,112,108,101,114,0,0,1, -1,0,12,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112,49,100,0,18,95,95,114,101,116, -86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,115,104,97, -100,111,119,50,68,0,1,1,0,21,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0,1,4, -118,101,99,52,95,116,101,120,50,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101, -114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,80,114,111,106,0,1,1,0, -21,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101, -120,112,50,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111, -111,114,100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,82,101,99,116,0,1,1,0,22,115,97,109, -112,108,101,114,0,0,1,1,0,10,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,95,114,101, -99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114, -100,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,82,101,99,116,80,114,111,106,0,1,1,0,22,115, -97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112, +112,95,114,101,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99, +99,111,111,114,100,0,0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,82,101,99,116,0,1,1,0,23,115,97, +109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,95,114, +101,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111, +114,100,0,0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,82,101,99,116,80,114,111,106,0,1,1,0,23,115, +97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,0,1,4,118,101,99,52,95,116,101,120,112, 95,114,101,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111, -111,114,100,0,59,120,121,122,122,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,82,101,99,116, -80,114,111,106,0,1,1,0,22,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,0,1,4,118, -101,99,52,95,116,101,120,112,95,114,101,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109, -112,108,101,114,0,0,18,99,99,111,111,114,100,0,0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,82,101, -99,116,0,1,1,0,23,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,0,1,4,118,101,99, -52,95,116,101,120,95,114,101,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101, -114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,82,101,99,116,80,114, -111,106,0,1,1,0,23,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,0,1,4,118,101,99, -52,95,116,101,120,112,95,114,101,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108, -101,114,0,0,18,99,111,111,114,100,0,0,0,0,1,0,9,0,110,111,105,115,101,49,0,1,1,0,9,120,0,0,0,1,4, -102,108,111,97,116,95,110,111,105,115,101,49,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1, -0,9,0,110,111,105,115,101,49,0,1,1,0,10,120,0,0,0,1,4,102,108,111,97,116,95,110,111,105,115,101,50, -0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,9,0,110,111,105,115,101,49,0,1,1,0,11,120, -0,0,0,1,4,102,108,111,97,116,95,110,111,105,115,101,51,0,18,95,95,114,101,116,86,97,108,0,0,18,120, -0,0,0,0,1,0,9,0,110,111,105,115,101,49,0,1,1,0,12,120,0,0,0,1,4,102,108,111,97,116,95,110,111,105, -115,101,52,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,10,0,110,111,105,115,101,50,0,1, -1,0,9,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0, -0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,17,49,57, -0,51,52,0,0,46,0,0,20,0,0,1,0,10,0,110,111,105,115,101,50,0,1,1,0,10,120,0,0,0,1,9,18,95,95,114, +111,114,100,0,0,0,0,1,0,9,0,110,111,105,115,101,49,0,1,1,0,9,120,0,0,0,1,4,102,108,111,97,116,95, +110,111,105,115,101,49,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,9,0,110,111,105,115, +101,49,0,1,1,0,10,120,0,0,0,1,4,102,108,111,97,116,95,110,111,105,115,101,50,0,18,95,95,114,101, +116,86,97,108,0,0,18,120,0,0,0,0,1,0,9,0,110,111,105,115,101,49,0,1,1,0,11,120,0,0,0,1,4,102,108, +111,97,116,95,110,111,105,115,101,51,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,9,0, +110,111,105,115,101,49,0,1,1,0,12,120,0,0,0,1,4,102,108,111,97,116,95,110,111,105,115,101,52,0,18, +95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,10,0,110,111,105,115,101,50,0,1,1,0,9,120,0,0,0, +1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18, +95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,17,49,57,0,51,52,0,0, +46,0,0,20,0,0,1,0,10,0,110,111,105,115,101,50,0,1,1,0,10,120,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59, +121,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,50,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54, +0,0,0,0,46,0,0,20,0,0,1,0,10,0,110,111,105,115,101,50,0,1,1,0,11,120,0,0,0,1,9,18,95,95,114,101, +116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116,86, +97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,51,0,17,49,57,0,51,52,0,0,0, +17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,0,46,0,0,20,0,0,1,0,10,0,110,111,105,115,101,50,0,1,1,0,12, +120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0, +20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101, +99,52,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,17,50,0,55,55,0,0,0,0,46,0, +0,20,0,0,1,0,11,0,110,111,105,115,101,51,0,1,1,0,9,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0, +59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0, +58,110,111,105,115,101,49,0,18,120,0,17,49,57,0,51,52,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86,97, +108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,17,53,0,52,55,0,0,46,0,0,20,0,0,1,0,11,0,110, +111,105,115,101,51,0,1,1,0,10,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111, +105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115, +101,49,0,18,120,0,58,118,101,99,50,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,0,46,0,0,20,0,9,18, +95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,50,0,17, +53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,0,46,0,0,20,0,0,1,0,11,0,110,111,105,115,101,51,0,1,1,0,11, +120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0, +20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101, +99,51,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,0,46,0,0,20,0,9,18,95,95, +114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,51,0,17,53,0, +52,55,0,0,0,17,49,55,0,56,53,0,0,0,17,49,49,0,48,52,0,0,0,0,46,0,0,20,0,0,1,0,11,0,110,111,105,115, +101,51,0,1,1,0,12,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101, +49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18, +120,0,58,118,101,99,52,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,17,50,0,55, +55,0,0,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18, +120,0,58,118,101,99,52,0,17,53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,17,49,49,0,48,52,0,0,0,17,49, +51,0,49,57,0,0,0,0,46,0,0,20,0,0,1,0,12,0,110,111,105,115,101,52,0,1,1,0,9,120,0,0,0,1,9,18,95,95, +114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101, +116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,17,49,57,0,51,52,0,0,46,0,0,20,0,9, +18,95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,17,53,0,52,55,0,0, +46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,110,111,105,115,101,49,0,18,120,0,17,50, +51,0,53,52,0,0,46,0,0,20,0,0,1,0,12,0,110,111,105,115,101,52,0,1,1,0,10,120,0,0,0,1,9,18,95,95,114, 101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116, 86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,50,0,17,49,57,0,51,52,0,0, -0,17,55,0,54,54,0,0,0,0,46,0,0,20,0,0,1,0,10,0,110,111,105,115,101,50,0,1,1,0,11,120,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95, -114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,51,0,17,49,57, -0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,0,46,0,0,20,0,0,1,0,10,0,110,111,105,115,101, -50,0,1,1,0,12,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0, -18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0, -58,118,101,99,52,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,17,50,0,55,55,0, -0,0,0,46,0,0,20,0,0,1,0,11,0,110,111,105,115,101,51,0,1,1,0,9,120,0,0,0,1,9,18,95,95,114,101,116, -86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97, -108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,17,49,57,0,51,52,0,0,46,0,0,20,0,9,18,95,95, -114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,17,53,0,52,55,0,0,46,0,0,20, -0,0,1,0,11,0,110,111,105,115,101,51,0,1,1,0,10,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59, -120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58, -110,111,105,115,101,49,0,18,120,0,58,118,101,99,50,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,0, +0,17,55,0,54,54,0,0,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105,115, +101,49,0,18,120,0,58,118,101,99,50,0,17,53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,0,46,0,0,20,0,9,18, +95,95,114,101,116,86,97,108,0,59,119,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,50,0,17, +50,51,0,53,52,0,0,0,17,50,57,0,49,49,0,0,0,0,46,0,0,20,0,0,1,0,12,0,110,111,105,115,101,52,0,1,1,0, +11,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0, +0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101, +99,51,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,0,46,0,0,20,0,9,18,95,95, +114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,51,0,17,53,0, +52,55,0,0,0,17,49,55,0,56,53,0,0,0,17,49,49,0,48,52,0,0,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86, +97,108,0,59,119,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,51,0,17,50,51,0,53,52,0,0,0, +17,50,57,0,49,49,0,0,0,17,51,49,0,57,49,0,0,0,0,46,0,0,20,0,0,1,0,12,0,110,111,105,115,101,52,0,1, +1,0,12,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120, +0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,58,118, +101,99,52,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,17,50,0,55,55,0,0,0,0, 46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,58, -118,101,99,50,0,17,53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,0,46,0,0,20,0,0,1,0,11,0,110,111,105, -115,101,51,0,1,1,0,11,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115, -101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0, -18,120,0,58,118,101,99,51,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,0,46,0, -0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101, -99,51,0,17,53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,17,49,49,0,48,52,0,0,0,0,46,0,0,20,0,0,1,0,11,0, -110,111,105,115,101,51,0,1,1,0,12,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110, -111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105, -115,101,49,0,18,120,0,58,118,101,99,52,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51, -0,0,0,17,50,0,55,55,0,0,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105, -115,101,49,0,18,120,0,58,118,101,99,52,0,17,53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,17,49,49,0,48, -52,0,0,0,17,49,51,0,49,57,0,0,0,0,46,0,0,20,0,0,1,0,12,0,110,111,105,115,101,52,0,1,1,0,9,120,0,0, -0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18, -95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,17,49,57,0,51,52,0,0, -46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,17,53, -0,52,55,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,110,111,105,115,101,49,0,18, -120,0,17,50,51,0,53,52,0,0,46,0,0,20,0,0,1,0,12,0,110,111,105,115,101,52,0,1,1,0,10,120,0,0,0,1,9, -18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0,18,120,0,0,0,20,0,9,18,95,95, -114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,50,0,17,49,57, -0,51,52,0,0,0,17,55,0,54,54,0,0,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,110, -111,105,115,101,49,0,18,120,0,58,118,101,99,50,0,17,53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,0,46,0, -0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101, -99,50,0,17,50,51,0,53,52,0,0,0,17,50,57,0,49,49,0,0,0,0,46,0,0,20,0,0,1,0,12,0,110,111,105,115,101, -52,0,1,1,0,11,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0, -18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0, -58,118,101,99,51,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,0,46,0,0,20,0,9, -18,95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,51,0, -17,53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,17,49,49,0,48,52,0,0,0,0,46,0,0,20,0,9,18,95,95,114,101, -116,86,97,108,0,59,119,0,58,110,111,105,115,101,49,0,18,120,0,58,118,101,99,51,0,17,50,51,0,53,52, -0,0,0,17,50,57,0,49,49,0,0,0,17,51,49,0,57,49,0,0,0,0,46,0,0,20,0,0,1,0,12,0,110,111,105,115,101, -52,0,1,1,0,12,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,110,111,105,115,101,49,0, -18,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,110,111,105,115,101,49,0,18,120,0, -58,118,101,99,52,0,17,49,57,0,51,52,0,0,0,17,55,0,54,54,0,0,0,17,51,0,50,51,0,0,0,17,50,0,55,55,0, -0,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,110,111,105,115,101,49,0,18,120,0, -58,118,101,99,52,0,17,53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,17,49,49,0,48,52,0,0,0,17,49,51,0,49, -57,0,0,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,110,111,105,115,101,49,0,18, -120,0,58,118,101,99,52,0,17,50,51,0,53,52,0,0,0,17,50,57,0,49,49,0,0,0,17,51,49,0,57,49,0,0,0,17, -51,55,0,52,56,0,0,0,0,46,0,0,20,0,0,0 +118,101,99,52,0,17,53,0,52,55,0,0,0,17,49,55,0,56,53,0,0,0,17,49,49,0,48,52,0,0,0,17,49,51,0,49,57, +0,0,0,0,46,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,110,111,105,115,101,49,0,18,120, +0,58,118,101,99,52,0,17,50,51,0,53,52,0,0,0,17,50,57,0,49,49,0,0,0,17,51,49,0,57,49,0,0,0,17,51,55, +0,52,56,0,0,0,0,46,0,0,20,0,0,0 -- cgit v1.2.3 From 36a582641119671688a9f366e5bfa1ab3e8b9cbc Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 16:40:24 -0600 Subject: mesa: fix error codes in _mesa_shader_source(), _mesa_get_shader_source() If the 'shader' parameter is wrong, need to either generate GL_INVALID_VALUE or GL_INVALID_OPERATION. It depends on whether 'shader' actually names a 'program' or is a totally unknown ID. There might be other cases to fix... --- src/mesa/shader/shader_api.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index c9eec7f07ee..c77d0c43973 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -875,7 +875,12 @@ _mesa_get_shader_source(GLcontext *ctx, GLuint shader, GLsizei maxLength, { struct gl_shader *sh = _mesa_lookup_shader(ctx, shader); if (!sh) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSource(shader)"); + GLenum err; + if (_mesa_lookup_shader_program(ctx, shader)) + err = GL_INVALID_OPERATION; + else + err = GL_INVALID_VALUE; + _mesa_error(ctx, err, "glGetShaderSource(shader)"); return; } copy_string(sourceOut, maxLength, length, sh->Source); @@ -966,7 +971,12 @@ _mesa_shader_source(GLcontext *ctx, GLuint shader, const GLchar *source) { struct gl_shader *sh = _mesa_lookup_shader(ctx, shader); if (!sh) { - _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSource(shaderObj)"); + GLenum err; + if (_mesa_lookup_shader_program(ctx, shader)) + err = GL_INVALID_OPERATION; + else + err = GL_INVALID_VALUE; + _mesa_error(ctx, err, "glShaderSource(shaderObj)"); return; } -- cgit v1.2.3 From cb79c5c7c62a661c4b7b4efcf3884ee1dedafe4f Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 16:50:52 -0600 Subject: mesa: added some debug code (disabled) --- src/mesa/shader/slang/slang_compile.c | 6 ++++++ src/mesa/shader/slang/slang_log.c | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c index cdea1c51287..4cda7124c05 100644 --- a/src/mesa/shader/slang/slang_compile.c +++ b/src/mesa/shader/slang/slang_compile.c @@ -2129,6 +2129,12 @@ compile_shader(GLcontext *ctx, slang_code_object * object, GLboolean success; grammar id = 0; +#if 0 /* for debug */ + _mesa_printf("********* COMPILE SHADER ***********\n"); + _mesa_printf("%s\n", shader->Source); + _mesa_printf("************************************\n"); +#endif + assert(program); _slang_code_object_dtr(object); diff --git a/src/mesa/shader/slang/slang_log.c b/src/mesa/shader/slang/slang_log.c index e9234bafec7..c963914fe3c 100644 --- a/src/mesa/shader/slang/slang_log.c +++ b/src/mesa/shader/slang/slang_log.c @@ -86,6 +86,9 @@ slang_info_log_message(slang_info_log * log, const char *prefix, } slang_string_concat(log->text, msg); slang_string_concat(log->text, "\n"); +#if 0 /* debug */ + _mesa_printf("Mesa GLSL error/warning: %s\n", log->text); +#endif return 1; } -- cgit v1.2.3 From 1726b7d1d336465dca10a5bd0a8a02fcf5f2e455 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 16:51:49 -0600 Subject: mesa: when linking a shader program, make sure all the shaders compiled OK --- src/mesa/shader/slang/slang_link.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mesa/shader/slang/slang_link.c b/src/mesa/shader/slang/slang_link.c index f9a5ecef96c..a69cad5942d 100644 --- a/src/mesa/shader/slang/slang_link.c +++ b/src/mesa/shader/slang/slang_link.c @@ -388,6 +388,14 @@ _slang_link(GLcontext *ctx, _mesa_clear_shader_program_data(ctx, shProg); + /* check that all programs compiled successfully */ + for (i = 0; i < shProg->NumShaders; i++) { + if (!shProg->Shaders[i]->CompileStatus) { + link_error(shProg, "linking with uncompiled shader\n"); + return; + } + } + shProg->Uniforms = _mesa_new_uniform_list(); shProg->Varying = _mesa_new_parameter_list(); -- cgit v1.2.3 From b3e1f9bd521ab25fc1cb313902cd77c6c274a918 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 2 Jul 2008 19:17:11 -0600 Subject: mesa: fix vertex array validation test for attribute 0 (vert pos) We don't actually need vertex array[0] enabled when using a vertex program/shader. --- src/mesa/main/api_validate.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index 74b0912bef6..5a199939760 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -108,10 +108,10 @@ _mesa_validate_DrawElements(GLcontext *ctx, if (ctx->NewState) _mesa_update_state(ctx); - /* Always need vertex positions */ - if (!ctx->Array.ArrayObj->Vertex.Enabled - && !(ctx->VertexProgram._Enabled - && ctx->Array.ArrayObj->VertexAttrib[0].Enabled)) + /* Always need vertex positions, unless a vertex program is in use */ + if (!ctx->VertexProgram._Current && + !ctx->Array.ArrayObj->Vertex.Enabled && + !ctx->Array.ArrayObj->VertexAttrib[0].Enabled) return GL_FALSE; /* Vertex buffer object tests */ @@ -190,10 +190,10 @@ _mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode, if (ctx->NewState) _mesa_update_state(ctx); - /* Always need vertex positions */ - if (!ctx->Array.ArrayObj->Vertex.Enabled - && !(ctx->VertexProgram._Enabled - && ctx->Array.ArrayObj->VertexAttrib[0].Enabled)) + /* Always need vertex positions, unless a vertex program is in use */ + if (!ctx->VertexProgram._Current && + !ctx->Array.ArrayObj->Vertex.Enabled && + !ctx->Array.ArrayObj->VertexAttrib[0].Enabled) return GL_FALSE; /* Vertex buffer object tests */ @@ -261,9 +261,10 @@ _mesa_validate_DrawArrays(GLcontext *ctx, if (ctx->NewState) _mesa_update_state(ctx); - /* Always need vertex positions */ - if (!ctx->Array.ArrayObj->Vertex.Enabled - && !ctx->Array.ArrayObj->VertexAttrib[0].Enabled) + /* Always need vertex positions, unless a vertex program is in use */ + if (!ctx->VertexProgram._Current && + !ctx->Array.ArrayObj->Vertex.Enabled && + !ctx->Array.ArrayObj->VertexAttrib[0].Enabled) return GL_FALSE; if (ctx->Const.CheckArrayBounds) { -- cgit v1.2.3 From 1dc20c7916e873dd154d62f885f849c87211c192 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 3 Jul 2008 13:03:35 -0600 Subject: mesa: fix incorrect array size, added assertion --- src/mesa/shader/slang/slang_vartable.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mesa/shader/slang/slang_vartable.c b/src/mesa/shader/slang/slang_vartable.c index 1d817000c60..c4a2f784d4d 100644 --- a/src/mesa/shader/slang/slang_vartable.c +++ b/src/mesa/shader/slang/slang_vartable.c @@ -28,7 +28,7 @@ struct table slang_variable **Vars; /* array [NumVars] */ TempState Temps[MAX_PROGRAM_TEMPS * 4]; /* per-component state */ - int ValSize[MAX_PROGRAM_TEMPS]; /* For debug only */ + int ValSize[MAX_PROGRAM_TEMPS * 4]; /**< For debug only */ struct table *Parent; /** Parent scope table */ }; @@ -220,6 +220,7 @@ alloc_reg(slang_var_table *vt, GLint size, GLboolean isTemp) assert(i % 4 == 0); for (j = 0; j < size; j++) t->Temps[i + j] = isTemp ? TEMP : VAR; + assert(i < MAX_PROGRAM_TEMPS * 4); t->ValSize[i] = size; return i; } -- cgit v1.2.3 From 6e46c121f9efc941473f797e0a388146a9599eea Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 3 Jul 2008 13:05:28 -0600 Subject: mesa: fix array storage allocation bug --- src/mesa/shader/slang/slang_codegen.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 4846c257f16..14fa38c3cda 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -2071,6 +2071,14 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var) n->Store->File = PROGRAM_TEMPORARY; n->Store->Size = _slang_sizeof_type_specifier(&n->Var->type.specifier); + if (var->array_len > 0) { + /* this is an array */ + /* round up element size to mult of 4 */ + GLint sz = (n->Store->Size + 3) & ~3; + /* mult by array size */ + sz *= var->array_len; + n->Store->Size = sz; + } A->program->NumTemporaries++; assert(n->Store->Size > 0); } -- cgit v1.2.3 From 7f4f2ac39de7a5425bcfbd362b688f62f6003afd Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 3 Jul 2008 13:24:19 -0600 Subject: mesa: additional vec4 constructor --- src/mesa/shader/slang/library/slang_core.gc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mesa/shader/slang/library/slang_core.gc b/src/mesa/shader/slang/library/slang_core.gc index 78e3ea9fdac..15a0792f437 100644 --- a/src/mesa/shader/slang/library/slang_core.gc +++ b/src/mesa/shader/slang/library/slang_core.gc @@ -249,6 +249,14 @@ vec4 __constructor(const vec3 v3, const float f) __retVal.w = f; } +vec4 __constructor(const vec2 v2, const float f1, const float f2) +{ + // XXX this constructor shouldn't be needed anymore + __retVal.xy = v2; + __retVal.z = f1; + __retVal.w = f2; +} + //// ivec2 constructors -- cgit v1.2.3 From d866cb3712cc4db0d3798b91039a482453e58700 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 3 Jul 2008 13:24:28 -0600 Subject: mesa: regenerated file --- src/mesa/shader/slang/library/slang_core_gc.h | 1524 +++++++++++++------------ 1 file changed, 763 insertions(+), 761 deletions(-) diff --git a/src/mesa/shader/slang/library/slang_core_gc.h b/src/mesa/shader/slang/library/slang_core_gc.h index b8e6d1a9903..5213b693b3e 100644 --- a/src/mesa/shader/slang/library/slang_core_gc.h +++ b/src/mesa/shader/slang/library/slang_core_gc.h @@ -35,785 +35,787 @@ 120,120,120,0,20,0,0,1,0,12,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,98,0,59,120, 120,120,120,0,20,0,0,1,0,12,1,1,1,0,11,118,51,0,0,1,1,0,9,102,0,0,0,1,9,18,95,95,114,101,116,86,97, 108,0,59,120,121,122,0,18,118,51,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,18,102,0,20,0, -0,1,0,6,1,1,1,0,5,105,0,0,1,1,0,5,106,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,105,0, -20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,18,106,0,20,0,0,1,0,6,1,1,1,0,5,105,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,59,120,121,0,18,105,0,59,120,120,0,20,0,0,1,0,6,1,1,1,0,9,102,0,0,0, -1,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0, -18,102,0,59,120,120,0,0,0,0,1,0,6,1,1,1,0,1,98,0,0,0,1,4,102,108,111,97,116,95,116,111,95,105,110, -116,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,98,0,59,120,120,0,0,0,0,1,0,7,1,1,1,0,5, -105,0,0,1,1,0,5,106,0,0,1,1,0,5,107,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,105,0, -20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,18,106,0,20,0,9,18,95,95,114,101,116,86,97,108,0, -59,122,0,18,107,0,20,0,0,1,0,7,1,1,1,0,5,105,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,121, -122,0,18,105,0,59,120,120,120,0,20,0,0,1,0,7,1,1,1,0,9,102,0,0,0,1,9,18,95,95,114,101,116,86,97, -108,0,59,120,121,122,0,18,102,0,59,120,120,120,0,20,0,0,1,0,7,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,59,120,121,122,0,18,98,0,59,120,120,120,0,20,0,0,1,0,8,1,1,1,0,5,120,0,0,1,1,0, -5,121,0,0,1,1,0,5,122,0,0,1,1,0,5,119,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,120,0, -20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,18,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0, -59,122,0,18,122,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,18,119,0,20,0,0,1,0,8,1,1,1,0,5, -105,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,105,0,59,120,120,120,120,0,20,0,0,1,0,8,1,1,1,0, -9,102,0,0,0,1,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0, -18,102,0,59,120,120,120,120,0,0,0,0,1,0,8,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0, -18,98,0,59,120,120,120,120,0,20,0,0,1,0,2,1,1,1,0,1,98,49,0,0,1,1,0,1,98,50,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,59,120,0,18,98,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,18,98,50, -0,20,0,0,1,0,2,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,121,0,18,98,0,59,120, -120,0,20,0,0,1,0,2,1,1,1,0,9,102,0,0,0,1,3,2,1,10,1,122,101,114,111,0,2,58,118,101,99,50,0,17,48,0, -48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0, -59,120,121,0,0,18,102,0,59,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,2,1,1,1,0,5,105,0,0,0,1,3,2, -1,6,1,122,101,114,111,0,2,58,105,118,101,99,50,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95, -115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,105,0,59,120,120,0,0,18,122,101, -114,111,0,0,0,0,1,0,2,1,1,1,0,10,118,0,0,0,1,3,2,1,10,1,122,101,114,111,0,2,58,118,101,99,50,0,17, -48,0,48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97, -108,0,59,120,121,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,2,1,1,1,0,6,118,0,0,0,1,3,2,1,6,1, -122,101,114,111,0,2,58,105,118,101,99,50,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115, -101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1, -0,3,1,1,1,0,1,98,49,0,0,1,1,0,1,98,50,0,0,1,1,0,1,98,51,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0, -59,120,0,18,98,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,18,98,50,0,20,0,9,18,95,95, -114,101,116,86,97,108,0,59,122,0,18,98,51,0,20,0,0,1,0,3,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114,101, -116,86,97,108,0,59,120,121,122,0,18,98,0,59,120,120,120,0,20,0,0,1,0,3,1,1,1,0,9,102,0,0,0,1,3,2,1, -11,1,122,101,114,111,0,2,58,118,101,99,51,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0,0, -0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,102,0,59, -120,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,3,1,1,1,0,5,105,0,0,0,1,3,2,1,7,1,122,101,114,111,0, -2,58,105,118,101,99,51,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115,101,113, -0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,105,0,59,120,120,120,0,0,18,122,101,114, -111,0,0,0,0,1,0,3,1,1,1,0,11,118,0,0,0,1,3,2,1,11,1,122,101,114,111,0,2,58,118,101,99,51,0,17,48,0, -48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101, -116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,3,1,1,1,0,7,118,0,0,0, -1,3,2,1,7,1,122,101,114,111,0,2,58,105,118,101,99,51,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4, -118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,18, -122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,1,98,49,0,0,1,1,0,1,98,50,0,0,1,1,0,1,98,51,0,0,1,1,0,1,98, -52,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,98,49,0,20,0,9,18,95,95,114,101,116,86, -97,108,0,59,121,0,18,98,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,18,98,51,0,20,0,9,18, -95,95,114,101,116,86,97,108,0,59,119,0,18,98,52,0,20,0,0,1,0,4,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,59,120,121,122,119,0,18,98,0,59,120,120,120,120,0,20,0,0,1,0,4,1,1,1,0,9,102,0, -0,0,1,3,2,1,12,1,122,101,114,111,0,2,58,118,101,99,52,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0, -48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0, -0,18,102,0,59,120,120,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,5,105,0,0,0,1,3,2,1,8,1, -122,101,114,111,0,2,58,105,118,101,99,52,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4, -118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,105,0,59,120,120,120,120,0,0, -18,122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,12,118,0,0,0,1,3,2,1,12,1,122,101,114,111,0,2,58,118,101, -99,52,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52, -95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,4,1, -1,1,0,8,118,0,0,0,1,3,2,1,8,1,122,101,114,111,0,2,58,105,118,101,99,52,0,16,8,48,0,0,16,8,48,0,0, -16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0, -18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,13,1,1,1,0,9,109,48,48,0,0,1,1,0,9,109,49,48,0,0,1,1,0,9, -109,48,49,0,0,1,1,0,9,109,49,49,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,120,0, -18,109,48,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,121,0,18,109,49,48,0,20,0,9, -18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,120,0,18,109,48,49,0,20,0,9,18,95,95,114,101,116, -86,97,108,0,16,10,49,0,57,59,121,0,18,109,49,49,0,20,0,0,1,0,13,1,1,1,0,9,102,0,0,0,1,9,18,95,95, -114,101,116,86,97,108,0,16,8,48,0,57,59,120,0,18,102,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -8,48,0,57,59,121,0,17,48,0,48,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,120,0, -17,48,0,48,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,121,0,18,102,0,20,0,0,1,0, -13,1,1,1,0,5,105,0,0,0,1,8,58,109,97,116,50,0,58,102,108,111,97,116,0,18,105,0,0,0,0,0,0,0,1,0,13, -1,1,1,0,1,98,0,0,0,1,8,58,109,97,116,50,0,58,102,108,111,97,116,0,18,98,0,0,0,0,0,0,0,1,0,13,1,1,1, -0,10,99,48,0,0,1,1,0,10,99,49,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,99,48,0, -20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,99,49,0,20,0,0,1,0,14,1,1,1,0,9,109,48,48, -0,0,1,1,0,9,109,49,48,0,0,1,1,0,9,109,50,48,0,0,1,1,0,9,109,48,49,0,0,1,1,0,9,109,49,49,0,0,1,1,0, -9,109,50,49,0,0,1,1,0,9,109,48,50,0,0,1,1,0,9,109,49,50,0,0,1,1,0,9,109,50,50,0,0,0,1,9,18,95,95, -114,101,116,86,97,108,0,16,8,48,0,57,59,120,0,18,109,48,48,0,20,0,9,18,95,95,114,101,116,86,97,108, -0,16,8,48,0,57,59,121,0,18,109,49,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,122, -0,18,109,50,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,120,0,18,109,48,49,0,20, -0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,121,0,18,109,49,49,0,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,49,0,57,59,122,0,18,109,50,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,50,0,57,59,120,0,18,109,48,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,121,0, -18,109,49,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,122,0,18,109,50,50,0,20,0, -0,1,0,14,1,1,1,0,9,102,0,0,0,1,3,2,0,10,1,118,0,2,58,118,101,99,50,0,18,102,0,0,17,48,0,48,0,0,0,0, -0,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,118,0,59,120,121,121,0,20,0,9,18,95,95,114, -101,116,86,97,108,0,16,10,49,0,57,18,118,0,59,121,120,121,0,20,0,9,18,95,95,114,101,116,86,97,108, -0,16,10,50,0,57,18,118,0,59,121,121,120,0,20,0,0,1,0,14,1,1,1,0,5,105,0,0,0,1,8,58,109,97,116,51,0, -58,102,108,111,97,116,0,18,105,0,0,0,0,0,0,0,1,0,14,1,1,1,0,1,98,0,0,0,1,8,58,109,97,116,51,0,58, -102,108,111,97,116,0,18,98,0,0,0,0,0,0,0,1,0,14,1,1,1,0,11,99,48,0,0,1,1,0,11,99,49,0,0,1,1,0,11, -99,50,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,99,48,0,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,49,0,57,18,99,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18, -99,50,0,20,0,0,1,0,15,1,1,1,0,9,109,48,48,0,0,1,1,0,9,109,49,48,0,0,1,1,0,9,109,50,48,0,0,1,1,0,9, -109,51,48,0,0,1,1,0,9,109,48,49,0,0,1,1,0,9,109,49,49,0,0,1,1,0,9,109,50,49,0,0,1,1,0,9,109,51,49, -0,0,1,1,0,9,109,48,50,0,0,1,1,0,9,109,49,50,0,0,1,1,0,9,109,50,50,0,0,1,1,0,9,109,51,50,0,0,1,1,0, -9,109,48,51,0,0,1,1,0,9,109,49,51,0,0,1,1,0,9,109,50,51,0,0,1,1,0,9,109,51,51,0,0,0,1,9,18,95,95, -114,101,116,86,97,108,0,16,8,48,0,57,59,120,0,18,109,48,48,0,20,0,9,18,95,95,114,101,116,86,97,108, -0,16,8,48,0,57,59,121,0,18,109,49,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,122, -0,18,109,50,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,119,0,18,109,51,48,0,20,0, -9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,120,0,18,109,48,49,0,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,49,0,57,59,121,0,18,109,49,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,49,0,57,59,122,0,18,109,50,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,119,0, -18,109,51,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,120,0,18,109,48,50,0,20,0, -9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,121,0,18,109,49,50,0,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,50,0,57,59,122,0,18,109,50,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,50,0,57,59,119,0,18,109,51,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,59,120,0, -18,109,48,51,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,59,121,0,18,109,49,51,0,20,0, -9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,59,122,0,18,109,50,51,0,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,51,0,57,59,119,0,18,109,51,51,0,20,0,0,1,0,15,1,1,1,0,9,102,0,0,0,1,3,2,0,10, -1,118,0,2,58,118,101,99,50,0,18,102,0,0,17,48,0,48,0,0,0,0,0,0,9,18,95,95,114,101,116,86,97,108,0, -16,8,48,0,57,18,118,0,59,120,121,121,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57, -18,118,0,59,121,120,121,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,118,0,59, -121,121,120,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,118,0,59,121,121,121, -120,0,20,0,0,1,0,15,1,1,1,0,5,105,0,0,0,1,8,58,109,97,116,52,0,58,102,108,111,97,116,0,18,105,0,0, -0,0,0,0,0,1,0,15,1,1,1,0,1,98,0,0,0,1,8,58,109,97,116,52,0,58,102,108,111,97,116,0,18,98,0,0,0,0,0, -0,0,1,0,15,1,1,1,0,12,99,48,0,0,1,1,0,12,99,49,0,0,1,1,0,12,99,50,0,0,1,1,0,12,99,51,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,99,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,49,0,57,18,99,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,99,50,0,20,0,9,18, -95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,99,51,0,20,0,0,1,0,5,2,26,1,1,0,5,97,0,0,1,1,0,5,98, -0,0,0,1,3,2,0,9,1,120,0,0,0,4,118,101,99,52,95,97,100,100,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102, -108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,5, -2,27,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,3,2,0,9,1,120,0,0,0,4,118,101,99,52,95,115,117,98,116,114, -97,99,116,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18, -95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,5,2,21,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,3,2,0, -9,1,120,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0,0,18,98,0,0, -0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0, -0,1,0,5,2,22,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,3,2,0,9,1,98,73,110,118,0,0,1,1,120,0,0,0,4,102,108, -111,97,116,95,114,99,112,0,18,98,73,110,118,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105, -112,108,121,0,18,120,0,0,18,97,0,0,18,98,73,110,118,0,0,0,4,102,108,111,97,116,95,116,111,95,105, -110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,6,2,26,1,1,0,6,97,0,0,1,1,0,6,98,0, -0,0,1,3,2,0,10,1,120,0,0,0,4,118,101,99,52,95,97,100,100,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102, -108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,6, -2,27,1,1,0,6,97,0,0,1,1,0,6,98,0,0,0,1,3,2,0,10,1,120,0,0,0,4,118,101,99,52,95,115,117,98,116,114, -97,99,116,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18, -95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,6,2,21,1,1,0,6,97,0,0,1,1,0,6,98,0,0,0,1,3,2,0, -10,1,120,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0,0,18,98,0,0, -0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0, -0,1,0,6,2,22,1,1,0,6,97,0,0,1,1,0,6,98,0,0,0,1,3,2,0,10,1,98,73,110,118,0,0,1,1,120,0,0,0,4,102, -108,111,97,116,95,114,99,112,0,18,98,73,110,118,0,59,120,0,0,18,98,0,59,120,0,0,0,4,102,108,111,97, -116,95,114,99,112,0,18,98,73,110,118,0,59,121,0,0,18,98,0,59,121,0,0,0,4,118,101,99,52,95,109,117, -108,116,105,112,108,121,0,18,120,0,0,18,97,0,0,18,98,73,110,118,0,0,0,4,102,108,111,97,116,95,116, -111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,7,2,26,1,1,0,7,97,0,0,1, -1,0,7,98,0,0,0,1,3,2,0,11,1,120,0,0,0,4,118,101,99,52,95,97,100,100,0,18,120,0,0,18,97,0,0,18,98,0, -0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0, -0,0,1,0,7,2,27,1,1,0,7,97,0,0,1,1,0,7,98,0,0,0,1,3,2,0,11,1,120,0,0,0,4,118,101,99,52,95,115,117, -98,116,114,97,99,116,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110, -116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,7,2,21,1,1,0,7,97,0,0,1,1,0,7,98,0,0,0, -1,3,2,0,11,1,120,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0,0, +0,1,0,12,1,1,1,0,10,118,50,0,0,1,1,0,9,102,49,0,0,1,1,0,9,102,50,0,0,0,1,9,18,95,95,114,101,116,86, +97,108,0,59,120,121,0,18,118,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,18,102,49,0,20, +0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,18,102,50,0,20,0,0,1,0,6,1,1,1,0,5,105,0,0,1,1,0,5, +106,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,105,0,20,0,9,18,95,95,114,101,116,86,97, +108,0,59,121,0,18,106,0,20,0,0,1,0,6,1,1,1,0,5,105,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59, +120,121,0,18,105,0,59,120,120,0,20,0,0,1,0,6,1,1,1,0,9,102,0,0,0,1,4,102,108,111,97,116,95,116,111, +95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,102,0,59,120,120,0,0,0,0,1,0,6, +1,1,1,0,1,98,0,0,0,1,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97, +108,0,59,120,121,0,0,18,98,0,59,120,120,0,0,0,0,1,0,7,1,1,1,0,5,105,0,0,1,1,0,5,106,0,0,1,1,0,5, +107,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,105,0,20,0,9,18,95,95,114,101,116,86,97, +108,0,59,121,0,18,106,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,18,107,0,20,0,0,1,0,7,1,1, +1,0,5,105,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,18,105,0,59,120,120,120,0,20, +0,0,1,0,7,1,1,1,0,9,102,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,18,102,0,59, +120,120,120,0,20,0,0,1,0,7,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,121,122, +0,18,98,0,59,120,120,120,0,20,0,0,1,0,8,1,1,1,0,5,120,0,0,1,1,0,5,121,0,0,1,1,0,5,122,0,0,1,1,0,5, +119,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,120,0,20,0,9,18,95,95,114,101,116,86,97, +108,0,59,121,0,18,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,18,122,0,20,0,9,18,95,95, +114,101,116,86,97,108,0,59,119,0,18,119,0,20,0,0,1,0,8,1,1,1,0,5,105,0,0,0,1,9,18,95,95,114,101, +116,86,97,108,0,18,105,0,59,120,120,120,120,0,20,0,0,1,0,8,1,1,1,0,9,102,0,0,0,1,4,102,108,111,97, +116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,102,0,59,120,120,120,120,0,0, +0,0,1,0,8,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,98,0,59,120,120,120,120,0,20, +0,0,1,0,2,1,1,1,0,1,98,49,0,0,1,1,0,1,98,50,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18, +98,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,18,98,50,0,20,0,0,1,0,2,1,1,1,0,1,98,0,0, +0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,121,0,18,98,0,59,120,120,0,20,0,0,1,0,2,1,1,1,0,9, +102,0,0,0,1,3,2,1,10,1,122,101,114,111,0,2,58,118,101,99,50,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0, +0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,102,0,59, +120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,2,1,1,1,0,5,105,0,0,0,1,3,2,1,6,1,122,101,114,111,0,2, +58,105,118,101,99,50,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114, +101,116,86,97,108,0,59,120,121,0,0,18,105,0,59,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,2,1,1,1, +0,10,118,0,0,0,1,3,2,1,10,1,122,101,114,111,0,2,58,118,101,99,50,0,17,48,0,48,0,0,0,17,48,0,48,0,0, +0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0, +0,18,122,101,114,111,0,0,0,0,1,0,2,1,1,1,0,6,118,0,0,0,1,3,2,1,6,1,122,101,114,111,0,2,58,105,118, +101,99,50,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86, +97,108,0,59,120,121,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,3,1,1,1,0,1,98,49,0,0,1,1,0,1,98, +50,0,0,1,1,0,1,98,51,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,18,98,49,0,20,0,9,18,95, +95,114,101,116,86,97,108,0,59,121,0,18,98,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,18, +98,51,0,20,0,0,1,0,3,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,18, +98,0,59,120,120,120,0,20,0,0,1,0,3,1,1,1,0,9,102,0,0,0,1,3,2,1,11,1,122,101,114,111,0,2,58,118,101, +99,51,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0, +18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,102,0,59,120,120,120,0,0,18,122,101,114,111, +0,0,0,0,1,0,3,1,1,1,0,5,105,0,0,0,1,3,2,1,7,1,122,101,114,111,0,2,58,105,118,101,99,51,0,16,8,48,0, +0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0, +59,120,121,122,0,0,18,105,0,59,120,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,3,1,1,1,0,11,118,0,0, +0,1,3,2,1,11,1,122,101,114,111,0,2,58,118,101,99,51,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48, +0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0, +18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,3,1,1,1,0,7,118,0,0,0,1,3,2,1,7,1,122,101,114,111,0,2,58, +105,118,101,99,51,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18, +95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,4,1,1,1, +0,1,98,49,0,0,1,1,0,1,98,50,0,0,1,1,0,1,98,51,0,0,1,1,0,1,98,52,0,0,0,1,9,18,95,95,114,101,116,86, +97,108,0,59,120,0,18,98,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,18,98,50,0,20,0,9,18, +95,95,114,101,116,86,97,108,0,59,122,0,18,98,51,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0, +18,98,52,0,20,0,0,1,0,4,1,1,1,0,1,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,121,122,119, +0,18,98,0,59,120,120,120,120,0,20,0,0,1,0,4,1,1,1,0,9,102,0,0,0,1,3,2,1,12,1,122,101,114,111,0,2, +58,118,101,99,52,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118, +101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,102,0,59,120,120,120,120,0,0,18, +122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,5,105,0,0,0,1,3,2,1,8,1,122,101,114,111,0,2,58,105,118,101, +99,52,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18, +95,95,114,101,116,86,97,108,0,0,18,105,0,59,120,120,120,120,0,0,18,122,101,114,111,0,0,0,0,1,0,4,1, +1,1,0,12,118,0,0,0,1,3,2,1,12,1,122,101,114,111,0,2,58,118,101,99,52,0,17,48,0,48,0,0,0,17,48,0,48, +0,0,0,17,48,0,48,0,0,0,17,48,0,48,0,0,0,0,0,0,4,118,101,99,52,95,115,101,113,0,18,95,95,114,101, +116,86,97,108,0,0,18,118,0,0,18,122,101,114,111,0,0,0,0,1,0,4,1,1,1,0,8,118,0,0,0,1,3,2,1,8,1,122, +101,114,111,0,2,58,105,118,101,99,52,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,16,8,48,0,0,0,0,0,4,118, +101,99,52,95,115,101,113,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,122,101,114,111,0,0,0, +0,1,0,13,1,1,1,0,9,109,48,48,0,0,1,1,0,9,109,49,48,0,0,1,1,0,9,109,48,49,0,0,1,1,0,9,109,49,49,0,0, +0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,120,0,18,109,48,48,0,20,0,9,18,95,95,114, +101,116,86,97,108,0,16,8,48,0,57,59,121,0,18,109,49,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0, +16,10,49,0,57,59,120,0,18,109,48,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,121, +0,18,109,49,49,0,20,0,0,1,0,13,1,1,1,0,9,102,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0, +57,59,120,0,18,102,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,121,0,17,48,0,48,0,0, +20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,120,0,17,48,0,48,0,0,20,0,9,18,95,95,114, +101,116,86,97,108,0,16,10,49,0,57,59,121,0,18,102,0,20,0,0,1,0,13,1,1,1,0,5,105,0,0,0,1,8,58,109, +97,116,50,0,58,102,108,111,97,116,0,18,105,0,0,0,0,0,0,0,1,0,13,1,1,1,0,1,98,0,0,0,1,8,58,109,97, +116,50,0,58,102,108,111,97,116,0,18,98,0,0,0,0,0,0,0,1,0,13,1,1,1,0,10,99,48,0,0,1,1,0,10,99,49,0, +0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,99,48,0,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,49,0,57,18,99,49,0,20,0,0,1,0,14,1,1,1,0,9,109,48,48,0,0,1,1,0,9,109,49,48,0,0,1,1,0,9, +109,50,48,0,0,1,1,0,9,109,48,49,0,0,1,1,0,9,109,49,49,0,0,1,1,0,9,109,50,49,0,0,1,1,0,9,109,48,50, +0,0,1,1,0,9,109,49,50,0,0,1,1,0,9,109,50,50,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0, +57,59,120,0,18,109,48,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,121,0,18,109,49, +48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,122,0,18,109,50,48,0,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,49,0,57,59,120,0,18,109,48,49,0,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,49,0,57,59,121,0,18,109,49,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57, +59,122,0,18,109,50,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,120,0,18,109,48, +50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,121,0,18,109,49,50,0,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,50,0,57,59,122,0,18,109,50,50,0,20,0,0,1,0,14,1,1,1,0,9,102,0,0,0,1, +3,2,0,10,1,118,0,2,58,118,101,99,50,0,18,102,0,0,17,48,0,48,0,0,0,0,0,0,9,18,95,95,114,101,116,86, +97,108,0,16,8,48,0,57,18,118,0,59,120,121,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0, +57,18,118,0,59,121,120,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,118,0,59,121, +121,120,0,20,0,0,1,0,14,1,1,1,0,5,105,0,0,0,1,8,58,109,97,116,51,0,58,102,108,111,97,116,0,18,105, +0,0,0,0,0,0,0,1,0,14,1,1,1,0,1,98,0,0,0,1,8,58,109,97,116,51,0,58,102,108,111,97,116,0,18,98,0,0,0, +0,0,0,0,1,0,14,1,1,1,0,11,99,48,0,0,1,1,0,11,99,49,0,0,1,1,0,11,99,50,0,0,0,1,9,18,95,95,114,101, +116,86,97,108,0,16,8,48,0,57,18,99,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18, +99,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,99,50,0,20,0,0,1,0,15,1,1,1,0,9, +109,48,48,0,0,1,1,0,9,109,49,48,0,0,1,1,0,9,109,50,48,0,0,1,1,0,9,109,51,48,0,0,1,1,0,9,109,48,49, +0,0,1,1,0,9,109,49,49,0,0,1,1,0,9,109,50,49,0,0,1,1,0,9,109,51,49,0,0,1,1,0,9,109,48,50,0,0,1,1,0, +9,109,49,50,0,0,1,1,0,9,109,50,50,0,0,1,1,0,9,109,51,50,0,0,1,1,0,9,109,48,51,0,0,1,1,0,9,109,49, +51,0,0,1,1,0,9,109,50,51,0,0,1,1,0,9,109,51,51,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48, +0,57,59,120,0,18,109,48,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,121,0,18,109, +49,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,122,0,18,109,50,48,0,20,0,9,18,95, +95,114,101,116,86,97,108,0,16,8,48,0,57,59,119,0,18,109,51,48,0,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,49,0,57,59,120,0,18,109,48,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57, +59,121,0,18,109,49,49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,122,0,18,109,50, +49,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,119,0,18,109,51,49,0,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,50,0,57,59,120,0,18,109,48,50,0,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,50,0,57,59,121,0,18,109,49,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57, +59,122,0,18,109,50,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,119,0,18,109,51, +50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,59,120,0,18,109,48,51,0,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,51,0,57,59,121,0,18,109,49,51,0,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,51,0,57,59,122,0,18,109,50,51,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57, +59,119,0,18,109,51,51,0,20,0,0,1,0,15,1,1,1,0,9,102,0,0,0,1,3,2,0,10,1,118,0,2,58,118,101,99,50,0, +18,102,0,0,17,48,0,48,0,0,0,0,0,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,118,0,59,120, +121,121,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,118,0,59,121,120,121,121,0, +20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,118,0,59,121,121,120,121,0,20,0,9,18,95, +95,114,101,116,86,97,108,0,16,10,51,0,57,18,118,0,59,121,121,121,120,0,20,0,0,1,0,15,1,1,1,0,5,105, +0,0,0,1,8,58,109,97,116,52,0,58,102,108,111,97,116,0,18,105,0,0,0,0,0,0,0,1,0,15,1,1,1,0,1,98,0,0, +0,1,8,58,109,97,116,52,0,58,102,108,111,97,116,0,18,98,0,0,0,0,0,0,0,1,0,15,1,1,1,0,12,99,48,0,0,1, +1,0,12,99,49,0,0,1,1,0,12,99,50,0,0,1,1,0,12,99,51,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8, +48,0,57,18,99,48,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,99,49,0,20,0,9,18,95, +95,114,101,116,86,97,108,0,16,10,50,0,57,18,99,50,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10, +51,0,57,18,99,51,0,20,0,0,1,0,5,2,26,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,3,2,0,9,1,120,0,0,0,4,118, +101,99,52,95,97,100,100,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105, +110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,5,2,27,1,1,0,5,97,0,0,1,1,0,5,98,0, +0,0,1,3,2,0,9,1,120,0,0,0,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,120,0,0,18,97,0,0, 18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18, -120,0,0,0,0,1,0,7,2,22,1,1,0,7,97,0,0,1,1,0,7,98,0,0,0,1,3,2,0,11,1,98,73,110,118,0,0,1,1,120,0,0, -0,4,102,108,111,97,116,95,114,99,112,0,18,98,73,110,118,0,59,120,0,0,18,98,0,59,120,0,0,0,4,102, -108,111,97,116,95,114,99,112,0,18,98,73,110,118,0,59,121,0,0,18,98,0,59,121,0,0,0,4,102,108,111,97, -116,95,114,99,112,0,18,98,73,110,118,0,59,122,0,0,18,98,0,59,122,0,0,0,4,118,101,99,52,95,109,117, -108,116,105,112,108,121,0,18,120,0,0,18,97,0,0,18,98,73,110,118,0,0,0,4,102,108,111,97,116,95,116, -111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,8,2,26,1,1,0,8,97,0,0,1, -1,0,8,98,0,0,0,1,3,2,0,11,1,120,0,0,0,4,118,101,99,52,95,97,100,100,0,18,120,0,0,18,97,0,0,18,98,0, -0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0, -0,0,1,0,8,2,27,1,1,0,8,97,0,0,1,1,0,8,98,0,0,0,1,3,2,0,12,1,120,0,0,0,4,118,101,99,52,95,115,117, -98,116,114,97,99,116,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110, -116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,8,2,21,1,1,0,8,97,0,0,1,1,0,8,98,0,0,0, -1,3,2,0,12,1,120,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0,0, +120,0,0,0,0,1,0,5,2,21,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,3,2,0,9,1,120,0,0,0,4,118,101,99,52,95, +109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111, +95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,5,2,22,1,1,0,5,97,0,0,1,1,0, +5,98,0,0,0,1,3,2,0,9,1,98,73,110,118,0,0,1,1,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,98, +73,110,118,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0, +0,18,98,73,110,118,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86, +97,108,0,0,18,120,0,0,0,0,1,0,6,2,26,1,1,0,6,97,0,0,1,1,0,6,98,0,0,0,1,3,2,0,10,1,120,0,0,0,4,118, +101,99,52,95,97,100,100,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105, +110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,6,2,27,1,1,0,6,97,0,0,1,1,0,6,98,0, +0,0,1,3,2,0,10,1,120,0,0,0,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,120,0,0,18,97,0,0, 18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18, -120,0,0,0,0,1,0,8,2,22,1,1,0,8,97,0,0,1,1,0,8,98,0,0,0,1,3,2,0,12,1,98,73,110,118,0,0,1,1,120,0,0, -0,4,102,108,111,97,116,95,114,99,112,0,18,98,73,110,118,0,59,120,0,0,18,98,0,59,120,0,0,0,4,102, -108,111,97,116,95,114,99,112,0,18,98,73,110,118,0,59,121,0,0,18,98,0,59,121,0,0,0,4,102,108,111,97, -116,95,114,99,112,0,18,98,73,110,118,0,59,122,0,0,18,98,0,59,122,0,0,0,4,102,108,111,97,116,95,114, -99,112,0,18,98,73,110,118,0,59,119,0,0,18,98,0,59,119,0,0,0,4,118,101,99,52,95,109,117,108,116,105, -112,108,121,0,18,120,0,0,18,97,0,0,18,98,73,110,118,0,0,0,4,102,108,111,97,116,95,116,111,95,105, -110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,9,2,26,1,1,0,9,97,0,0,1,1,0,9,98,0, -0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,97,0,0,18,98, -0,0,0,0,1,0,9,2,27,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99, -116,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,97,0,0,18,98,0,0,0,0,1,0,9,2,21,1,1,0,9,97,0, -0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86, -97,108,0,59,120,0,0,18,97,0,0,18,98,0,0,0,0,1,0,9,2,22,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,9,1, -98,73,110,118,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,98,73,110,118,0,59,120,0,0,18,98,0,59, -120,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59, -120,0,0,18,97,0,0,18,98,73,110,118,0,0,0,0,1,0,10,2,26,1,1,0,10,118,0,0,1,1,0,10,117,0,0,0,1,4,118, -101,99,52,95,97,100,100,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,0,18,117,0,0,0, -0,1,0,10,2,27,1,1,0,10,118,0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99, -116,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,0,18,117,0,0,0,0,1,0,10,2,21,1,1,0, -10,118,0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114, -101,116,86,97,108,0,59,120,121,0,0,18,118,0,0,18,117,0,0,0,0,1,0,10,2,22,1,1,0,10,118,0,0,1,1,0,10, -117,0,0,0,1,3,2,0,10,1,119,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,120,0,0,18,117,0, -59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,121,0,0,18,117,0,59,121,0,0,0,4,118, +120,0,0,0,0,1,0,6,2,21,1,1,0,6,97,0,0,1,1,0,6,98,0,0,0,1,3,2,0,10,1,120,0,0,0,4,118,101,99,52,95, +109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111, +95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,6,2,22,1,1,0,6,97,0,0,1,1,0, +6,98,0,0,0,1,3,2,0,10,1,98,73,110,118,0,0,1,1,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,98, +73,110,118,0,59,120,0,0,18,98,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,98,73,110,118, +0,59,121,0,0,18,98,0,59,121,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,120,0,0, +18,97,0,0,18,98,73,110,118,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101, +116,86,97,108,0,0,18,120,0,0,0,0,1,0,7,2,26,1,1,0,7,97,0,0,1,1,0,7,98,0,0,0,1,3,2,0,11,1,120,0,0,0, +4,118,101,99,52,95,97,100,100,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111, +95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,7,2,27,1,1,0,7,97,0,0,1,1,0, +7,98,0,0,0,1,3,2,0,11,1,120,0,0,0,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,120,0,0,18, +97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108, +0,0,18,120,0,0,0,0,1,0,7,2,21,1,1,0,7,97,0,0,1,1,0,7,98,0,0,0,1,3,2,0,11,1,120,0,0,0,4,118,101,99, +52,95,109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95, +116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,7,2,22,1,1,0,7,97,0, +0,1,1,0,7,98,0,0,0,1,3,2,0,11,1,98,73,110,118,0,0,1,1,120,0,0,0,4,102,108,111,97,116,95,114,99,112, +0,18,98,73,110,118,0,59,120,0,0,18,98,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,98,73, +110,118,0,59,121,0,0,18,98,0,59,121,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,98,73,110,118,0, +59,122,0,0,18,98,0,59,122,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,120,0,0,18, +97,0,0,18,98,73,110,118,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101, +116,86,97,108,0,0,18,120,0,0,0,0,1,0,8,2,26,1,1,0,8,97,0,0,1,1,0,8,98,0,0,0,1,3,2,0,11,1,120,0,0,0, +4,118,101,99,52,95,97,100,100,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111, +95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,8,2,27,1,1,0,8,97,0,0,1,1,0, +8,98,0,0,0,1,3,2,0,12,1,120,0,0,0,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,120,0,0,18, +97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108, +0,0,18,120,0,0,0,0,1,0,8,2,21,1,1,0,8,97,0,0,1,1,0,8,98,0,0,0,1,3,2,0,12,1,120,0,0,0,4,118,101,99, +52,95,109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95, +116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,120,0,0,0,0,1,0,8,2,22,1,1,0,8,97,0, +0,1,1,0,8,98,0,0,0,1,3,2,0,12,1,98,73,110,118,0,0,1,1,120,0,0,0,4,102,108,111,97,116,95,114,99,112, +0,18,98,73,110,118,0,59,120,0,0,18,98,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,98,73, +110,118,0,59,121,0,0,18,98,0,59,121,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,98,73,110,118,0, +59,122,0,0,18,98,0,59,122,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,98,73,110,118,0,59,119,0,0, +18,98,0,59,119,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,120,0,0,18,97,0,0,18, +98,73,110,118,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97, +108,0,0,18,120,0,0,0,0,1,0,9,2,26,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,97,100,100, +0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,97,0,0,18,98,0,0,0,0,1,0,9,2,27,1,1,0,9,97,0,0,1, +1,0,9,98,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108, +0,59,120,0,0,18,97,0,0,18,98,0,0,0,0,1,0,9,2,21,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52, +95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,97,0,0,18,98,0, +0,0,0,1,0,9,2,22,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,9,1,98,73,110,118,0,0,0,4,102,108,111,97, +116,95,114,99,112,0,18,98,73,110,118,0,59,120,0,0,18,98,0,59,120,0,0,0,4,118,101,99,52,95,109,117, +108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,97,0,0,18,98,73,110,118,0, +0,0,0,1,0,10,2,26,1,1,0,10,118,0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95, +114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,0,18,117,0,0,0,0,1,0,10,2,27,1,1,0,10,118,0,0,1,1, +0,10,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108, +0,59,120,121,0,0,18,118,0,0,18,117,0,0,0,0,1,0,10,2,21,1,1,0,10,118,0,0,1,1,0,10,117,0,0,0,1,4,118, 101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18, -118,0,0,18,119,0,0,0,0,1,0,11,2,26,1,1,0,11,118,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,97,100, -100,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,18,117,0,0,0,0,1,0,11,2,27,1, -1,0,11,118,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114, -101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,18,117,0,0,0,0,1,0,11,2,21,1,1,0,11,118,0,0,1,1, -0,11,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97, -108,0,59,120,121,122,0,0,18,118,0,0,18,117,0,0,0,0,1,0,11,2,22,1,1,0,11,118,0,0,1,1,0,11,117,0,0,0, -1,3,2,0,11,1,119,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,120,0,0,18,117,0,59,120,0, -0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,121,0,0,18,117,0,59,121,0,0,0,4,102,108,111, -97,116,95,114,99,112,0,18,119,0,59,122,0,0,18,117,0,59,122,0,0,0,4,118,101,99,52,95,109,117,108, -116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,18,119,0,0,0, -0,1,0,12,2,26,1,1,0,12,118,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114, -101,116,86,97,108,0,0,18,118,0,0,18,117,0,0,0,0,1,0,12,2,27,1,1,0,12,118,0,0,1,1,0,12,117,0,0,0,1, -4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18, -117,0,0,0,0,1,0,12,2,21,1,1,0,12,118,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116, -105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,117,0,0,0,0,1,0,12,2,22,1,1,0, -12,118,0,0,1,1,0,12,117,0,0,0,1,3,2,0,12,1,119,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0, -59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,121,0,0,18,117,0, -59,121,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,122,0,0,18,117,0,59,122,0,0,0,4,102, -108,111,97,116,95,114,99,112,0,18,119,0,59,119,0,0,18,117,0,59,119,0,0,0,4,118,101,99,52,95,109, -117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,119,0,0,0,0,1,0,10, -2,26,1,1,0,9,97,0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114,101,116,86, -97,108,0,59,120,121,0,0,18,97,0,59,120,120,0,0,18,117,0,59,120,121,0,0,0,0,1,0,10,2,26,1,1,0,10, +118,0,0,18,117,0,0,0,0,1,0,10,2,22,1,1,0,10,118,0,0,1,1,0,10,117,0,0,0,1,3,2,0,10,1,119,0,0,0,4, +102,108,111,97,116,95,114,99,112,0,18,119,0,59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116, +95,114,99,112,0,18,119,0,59,121,0,0,18,117,0,59,121,0,0,0,4,118,101,99,52,95,109,117,108,116,105, +112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,0,18,119,0,0,0,0,1,0,11,2, +26,1,1,0,11,118,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114,101,116,86, +97,108,0,59,120,121,122,0,0,18,118,0,0,18,117,0,0,0,0,1,0,11,2,27,1,1,0,11,118,0,0,1,1,0,11,117,0, +0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,59,120, +121,122,0,0,18,118,0,0,18,117,0,0,0,0,1,0,11,2,21,1,1,0,11,118,0,0,1,1,0,11,117,0,0,0,1,4,118,101, +99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18, +118,0,0,18,117,0,0,0,0,1,0,11,2,22,1,1,0,11,118,0,0,1,1,0,11,117,0,0,0,1,3,2,0,11,1,119,0,0,0,4, +102,108,111,97,116,95,114,99,112,0,18,119,0,59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116, +95,114,99,112,0,18,119,0,59,121,0,0,18,117,0,59,121,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18, +119,0,59,122,0,0,18,117,0,59,122,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95, +95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,0,18,119,0,0,0,0,1,0,12,2,26,1,1,0,12,118,0, +0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0, +0,18,117,0,0,0,0,1,0,12,2,27,1,1,0,12,118,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,115,117,98, +116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,117,0,0,0,0,1,0,12,2,21,1,1,0, +12,118,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114, +101,116,86,97,108,0,0,18,118,0,0,18,117,0,0,0,0,1,0,12,2,22,1,1,0,12,118,0,0,1,1,0,12,117,0,0,0,1, +3,2,0,12,1,119,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,120,0,0,18,117,0,59,120,0,0, +0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,121,0,0,18,117,0,59,121,0,0,0,4,102,108,111,97, +116,95,114,99,112,0,18,119,0,59,122,0,0,18,117,0,59,122,0,0,0,4,102,108,111,97,116,95,114,99,112,0, +18,119,0,59,119,0,0,18,117,0,59,119,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18, +95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,119,0,0,0,0,1,0,10,2,26,1,1,0,9,97,0,0,1,1,0,10,117, +0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,97,0,59, +120,120,0,0,18,117,0,59,120,121,0,0,0,0,1,0,10,2,26,1,1,0,10,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101, +99,52,95,97,100,100,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18, +98,0,59,120,120,0,0,0,0,1,0,10,2,27,1,1,0,9,97,0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,115,117, +98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,97,0,59,120,120,0,0,18, +117,0,59,120,121,0,0,0,0,1,0,10,2,27,1,1,0,10,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,115, +117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,59,120,121,0,0, +18,98,0,59,120,120,0,0,0,0,1,0,10,2,21,1,1,0,9,97,0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,109, +117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,97,0,59,120,120,0, +0,18,117,0,59,120,121,0,0,0,0,1,0,10,2,21,1,1,0,10,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95, +109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,59,120, +121,0,0,18,98,0,59,120,120,0,0,0,0,1,0,10,2,22,1,1,0,9,97,0,0,1,1,0,10,117,0,0,0,1,3,2,0,10,1,105, +110,118,85,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,85,0,59,120,0,0,18,117,0,59, +120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,85,0,59,121,0,0,18,117,0,59,121,0,0, +0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121, +0,0,18,97,0,59,120,120,0,0,18,105,110,118,85,0,59,120,121,0,0,0,0,1,0,10,2,22,1,1,0,10,118,0,0,1,1, +0,9,98,0,0,0,1,3,2,0,9,1,105,110,118,66,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118, +66,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97, +108,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,105,110,118,66,0,59,120,120,0,0,0,0,1,0,11,2,26,1, +1,0,9,97,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114,101,116,86,97,108,0, +59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,18,117,0,59,120,121,122,0,0,0,0,1,0,11,2,26,1,1,0,11, 118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114,101,116,86,97,108,0,59,120, -121,0,0,18,118,0,59,120,121,0,0,18,98,0,59,120,120,0,0,0,0,1,0,10,2,27,1,1,0,9,97,0,0,1,1,0,10,117, -0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,59,120, -121,0,0,18,97,0,59,120,120,0,0,18,117,0,59,120,121,0,0,0,0,1,0,10,2,27,1,1,0,10,118,0,0,1,1,0,9,98, -0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,59,120, -121,0,0,18,118,0,59,120,121,0,0,18,98,0,59,120,120,0,0,0,0,1,0,10,2,21,1,1,0,9,97,0,0,1,1,0,10,117, -0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59, -120,121,0,0,18,97,0,59,120,120,0,0,18,117,0,59,120,121,0,0,0,0,1,0,10,2,21,1,1,0,10,118,0,0,1,1,0, -9,98,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0, -59,120,121,0,0,18,118,0,59,120,121,0,0,18,98,0,59,120,120,0,0,0,0,1,0,10,2,22,1,1,0,9,97,0,0,1,1,0, -10,117,0,0,0,1,3,2,0,10,1,105,110,118,85,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118, -85,0,59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,85,0,59, -121,0,0,18,117,0,59,121,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114, -101,116,86,97,108,0,59,120,121,0,0,18,97,0,59,120,120,0,0,18,105,110,118,85,0,59,120,121,0,0,0,0,1, -0,10,2,22,1,1,0,10,118,0,0,1,1,0,9,98,0,0,0,1,3,2,0,9,1,105,110,118,66,0,0,0,4,102,108,111,97,116, -95,114,99,112,0,18,105,110,118,66,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108, -121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,105,110,118,66,0, -59,120,120,0,0,0,0,1,0,11,2,26,1,1,0,9,97,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0, -18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,18,117,0,59,120,121, -122,0,0,0,0,1,0,11,2,26,1,1,0,11,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95, -95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,98,0,59,120,120,120,0, -0,0,0,1,0,11,2,27,1,1,0,9,97,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99, -116,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,18,117,0,59, -120,121,122,0,0,0,0,1,0,11,2,27,1,1,0,11,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,115,117,98, -116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0, -0,18,98,0,59,120,120,120,0,0,0,0,1,0,11,2,21,1,1,0,9,97,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52, -95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,97,0, -59,120,120,120,0,0,18,117,0,59,120,121,122,0,0,0,0,1,0,11,2,21,1,1,0,11,118,0,0,1,1,0,9,98,0,0,0,1, -4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121, -122,0,0,18,118,0,59,120,121,122,0,0,18,98,0,59,120,120,120,0,0,0,0,1,0,11,2,22,1,1,0,9,97,0,0,1,1, -0,11,117,0,0,0,1,3,2,0,11,1,105,110,118,85,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110, +121,122,0,0,18,118,0,59,120,121,122,0,0,18,98,0,59,120,120,120,0,0,0,0,1,0,11,2,27,1,1,0,9,97,0,0, +1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97, +108,0,59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,18,117,0,59,120,121,122,0,0,0,0,1,0,11,2,27,1, +1,0,11,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114, +101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,98,0,59,120,120,120,0,0,0,0, +1,0,11,2,21,1,1,0,9,97,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121, +0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,18,117,0,59,120, +121,122,0,0,0,0,1,0,11,2,21,1,1,0,11,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,109,117,108,116, +105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0, +18,98,0,59,120,120,120,0,0,0,0,1,0,11,2,22,1,1,0,9,97,0,0,1,1,0,11,117,0,0,0,1,3,2,0,11,1,105,110, +118,85,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,85,0,59,120,0,0,18,117,0,59,120,0, +0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,85,0,59,121,0,0,18,117,0,59,121,0,0,0,4, +102,108,111,97,116,95,114,99,112,0,18,105,110,118,85,0,59,122,0,0,18,117,0,59,122,0,0,0,4,118,101, +99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18, +97,0,59,120,120,120,0,0,18,105,110,118,85,0,59,120,121,122,0,0,0,0,1,0,11,2,22,1,1,0,11,118,0,0,1, +1,0,9,98,0,0,0,1,3,2,0,9,1,105,110,118,66,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110, +118,66,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116, +86,97,108,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,105,110,118,66,0,59,120,120,120,0,0, +0,0,1,0,12,2,26,1,1,0,9,97,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114, +101,116,86,97,108,0,0,18,97,0,59,120,120,120,120,0,0,18,117,0,0,0,0,1,0,12,2,26,1,1,0,12,118,0,0,1, +1,0,9,98,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18, +98,0,59,120,120,120,120,0,0,0,0,1,0,12,2,27,1,1,0,9,97,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95, +115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,97,0,59,120,120,120,120,0,0, +18,117,0,0,0,0,1,0,12,2,27,1,1,0,12,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,115,117,98,116, +114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,98,0,59,120,120,120,120,0,0,0,0,1, +0,12,2,21,1,1,0,9,97,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0, +18,95,95,114,101,116,86,97,108,0,0,18,97,0,59,120,120,120,120,0,0,18,117,0,0,0,0,1,0,12,2,21,1,1,0, +12,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114, +101,116,86,97,108,0,0,18,118,0,0,18,98,0,59,120,120,120,120,0,0,0,0,1,0,12,2,22,1,1,0,9,97,0,0,1,1, +0,12,117,0,0,0,1,3,2,0,12,1,105,110,118,85,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110, 118,85,0,59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,85,0, 59,121,0,0,18,117,0,59,121,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,85,0,59,122,0, -0,18,117,0,59,122,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116, -86,97,108,0,59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,18,105,110,118,85,0,59,120,121,122,0,0,0, -0,1,0,11,2,22,1,1,0,11,118,0,0,1,1,0,9,98,0,0,0,1,3,2,0,9,1,105,110,118,66,0,0,0,4,102,108,111,97, -116,95,114,99,112,0,18,105,110,118,66,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112, -108,121,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,105, -110,118,66,0,59,120,120,120,0,0,0,0,1,0,12,2,26,1,1,0,9,97,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99, -52,95,97,100,100,0,18,95,95,114,101,116,86,97,108,0,0,18,97,0,59,120,120,120,120,0,0,18,117,0,0,0, -0,1,0,12,2,26,1,1,0,12,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,95,95,114,101, -116,86,97,108,0,0,18,118,0,0,18,98,0,59,120,120,120,120,0,0,0,0,1,0,12,2,27,1,1,0,9,97,0,0,1,1,0, -12,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0, -0,18,97,0,59,120,120,120,120,0,0,18,117,0,0,0,0,1,0,12,2,27,1,1,0,12,118,0,0,1,1,0,9,98,0,0,0,1,4, -118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18, -98,0,59,120,120,120,120,0,0,0,0,1,0,12,2,21,1,1,0,9,97,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95, -109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,0,18,97,0,59,120,120,120,120,0, -0,18,117,0,0,0,0,1,0,12,2,21,1,1,0,12,118,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,109,117,108, -116,105,112,108,121,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,98,0,59,120,120,120,120,0,0, -0,0,1,0,12,2,22,1,1,0,9,97,0,0,1,1,0,12,117,0,0,0,1,3,2,0,12,1,105,110,118,85,0,0,0,4,102,108,111, -97,116,95,114,99,112,0,18,105,110,118,85,0,59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116, -95,114,99,112,0,18,105,110,118,85,0,59,121,0,0,18,117,0,59,121,0,0,0,4,102,108,111,97,116,95,114, -99,112,0,18,105,110,118,85,0,59,122,0,0,18,117,0,59,122,0,0,0,4,102,108,111,97,116,95,114,99,112,0, -18,105,110,118,85,0,59,119,0,0,18,117,0,59,119,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112, -108,121,0,18,95,95,114,101,116,86,97,108,0,0,18,97,0,59,120,120,120,120,0,0,18,105,110,118,85,0,0, -0,0,1,0,12,2,22,1,1,0,12,118,0,0,1,1,0,9,98,0,0,0,1,3,2,0,9,1,105,110,118,66,0,0,0,4,102,108,111, -97,116,95,114,99,112,0,18,105,110,118,66,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105, -112,108,121,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,18,105,110,118,66,0,59,120,120,120,120, -0,0,0,0,1,0,6,2,26,1,1,0,5,97,0,0,1,1,0,6,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105, -118,101,99,50,0,18,97,0,0,0,18,117,0,46,20,0,0,1,0,6,2,26,1,1,0,6,118,0,0,1,1,0,5,98,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,50,0,18,98,0,0,0,46,20,0,0,1,0,6,2,27,1,1, -0,5,97,0,0,1,1,0,6,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,50,0,18,97,0,0, -0,18,117,0,47,20,0,0,1,0,6,2,27,1,1,0,6,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97, -108,0,18,118,0,58,105,118,101,99,50,0,18,98,0,0,0,47,20,0,0,1,0,6,2,21,1,1,0,5,97,0,0,1,1,0,6,117, -0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,50,0,18,97,0,0,0,18,117,0,48,20,0,0,1, -0,6,2,21,1,1,0,6,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118, -101,99,50,0,18,98,0,0,0,48,20,0,0,1,0,6,2,22,1,1,0,5,97,0,0,1,1,0,6,117,0,0,0,1,9,18,95,95,114,101, -116,86,97,108,0,58,105,118,101,99,50,0,18,97,0,0,0,18,117,0,49,20,0,0,1,0,6,2,22,1,1,0,6,118,0,0,1, -1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,50,0,18,98,0,0,0,49, -20,0,0,1,0,7,2,26,1,1,0,5,97,0,0,1,1,0,7,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118, -101,99,51,0,18,97,0,0,0,18,117,0,46,20,0,0,1,0,7,2,26,1,1,0,7,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95, -95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,51,0,18,98,0,0,0,46,20,0,0,1,0,7,2,27,1,1,0, -5,97,0,0,1,1,0,7,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,51,0,18,97,0,0,0, -18,117,0,47,20,0,0,1,0,7,2,27,1,1,0,7,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108, -0,18,118,0,58,105,118,101,99,51,0,18,98,0,0,0,47,20,0,0,1,0,7,2,21,1,1,0,5,97,0,0,1,1,0,7,117,0,0, -0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,51,0,18,97,0,0,0,18,117,0,48,20,0,0,1,0,7, -2,21,1,1,0,7,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101, -99,51,0,18,98,0,0,0,48,20,0,0,1,0,7,2,22,1,1,0,5,97,0,0,1,1,0,7,117,0,0,0,1,9,18,95,95,114,101,116, -86,97,108,0,58,105,118,101,99,51,0,18,97,0,0,0,18,117,0,49,20,0,0,1,0,7,2,22,1,1,0,7,118,0,0,1,1,0, -5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,51,0,18,98,0,0,0,49,20, -0,0,1,0,8,2,26,1,1,0,5,97,0,0,1,1,0,8,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118, -101,99,52,0,18,97,0,0,0,18,117,0,46,20,0,0,1,0,8,2,26,1,1,0,8,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95, -95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,52,0,18,98,0,0,0,46,20,0,0,1,0,8,2,27,1,1,0, -5,97,0,0,1,1,0,8,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,52,0,18,97,0,0,0, -18,117,0,47,20,0,0,1,0,8,2,27,1,1,0,8,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108, -0,18,118,0,58,105,118,101,99,52,0,18,98,0,0,0,47,20,0,0,1,0,8,2,21,1,1,0,5,97,0,0,1,1,0,8,117,0,0, -0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,52,0,18,97,0,0,0,18,117,0,48,20,0,0,1,0,8, -2,21,1,1,0,8,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101, -99,52,0,18,98,0,0,0,48,20,0,0,1,0,8,2,22,1,1,0,5,97,0,0,1,1,0,8,117,0,0,0,1,9,18,95,95,114,101,116, -86,97,108,0,58,105,118,101,99,52,0,18,97,0,0,0,18,117,0,49,20,0,0,1,0,8,2,22,1,1,0,8,118,0,0,1,1,0, -5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,52,0,18,98,0,0,0,49,20, -0,0,1,0,5,2,27,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,110,101,103,97,116,101,0,18,95,95,114,101,116, -86,97,108,0,59,120,0,0,18,97,0,0,0,0,1,0,6,2,27,1,1,0,6,118,0,0,0,1,4,118,101,99,52,95,110,101,103, -97,116,101,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,0,0,1,0,7,2,27,1,1,0,7,118,0,0,0,1,4, -118,101,99,52,95,110,101,103,97,116,101,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,0,0,1,0,8, -2,27,1,1,0,8,118,0,0,0,1,4,118,101,99,52,95,110,101,103,97,116,101,0,18,95,95,114,101,116,86,97, -108,0,0,18,118,0,0,0,0,1,0,9,2,27,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,110,101,103,97,116,101,0, -18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,97,0,0,0,0,1,0,10,2,27,1,1,0,10,118,0,0,0,1,4,118, -101,99,52,95,110,101,103,97,116,101,0,18,95,95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,59, -120,121,0,0,0,0,1,0,11,2,27,1,1,0,11,118,0,0,0,1,4,118,101,99,52,95,110,101,103,97,116,101,0,18,95, -95,114,101,116,86,97,108,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,0,0,1,0,12,2,27,1,1,0,12, -118,0,0,0,1,4,118,101,99,52,95,110,101,103,97,116,101,0,18,95,95,114,101,116,86,97,108,0,0,18,118, -0,0,0,0,1,0,13,2,27,1,1,0,13,109,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0, -16,8,48,0,57,54,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,54,20, -0,0,1,0,14,2,27,1,1,0,14,109,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8, -48,0,57,54,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,54,20,0,9, -18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,54,20,0,0,1,0,15,2,27,1,1,0, -15,109,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,54,20,0,9,18, -95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,54,20,0,9,18,95,95,114,101,116, -86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,54,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10, -51,0,57,18,109,0,16,10,51,0,57,54,20,0,0,1,0,9,0,100,111,116,0,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,9, -18,95,95,114,101,116,86,97,108,0,18,97,0,18,98,0,48,20,0,0,1,0,9,0,100,111,116,0,1,1,0,10,97,0,0,1, -1,0,10,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,59,120,0,18,98,0,59,120,0,48,18,97,0, -59,121,0,18,98,0,59,121,0,48,46,20,0,0,1,0,9,0,100,111,116,0,1,1,0,11,97,0,0,1,1,0,11,98,0,0,0,1,4, -118,101,99,51,95,100,111,116,0,18,95,95,114,101,116,86,97,108,0,0,18,97,0,0,18,98,0,0,0,0,1,0,9,0, -100,111,116,0,1,1,0,12,97,0,0,1,1,0,12,98,0,0,0,1,4,118,101,99,52,95,100,111,116,0,18,95,95,114, -101,116,86,97,108,0,0,18,97,0,0,18,98,0,0,0,0,1,0,0,2,1,1,0,2,5,97,0,0,1,1,0,5,98,0,0,0,1,4,118, -101,99,52,95,97,100,100,0,18,97,0,0,18,97,0,0,18,98,0,0,0,0,1,0,0,2,2,1,0,2,5,97,0,0,1,1,0,5,98,0, -0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,97,0,0,18,97,0,0,18,98,0,0,0,0,1,0,0,2, -3,1,0,2,5,97,0,0,1,1,0,5,98,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,97,0,0, -18,97,0,0,18,98,0,0,0,0,1,0,0,2,4,1,0,2,5,97,0,0,1,1,0,5,98,0,0,0,1,3,2,0,9,1,105,110,118,66,0,0,0, -4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,66,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117, -108,116,105,112,108,121,0,18,97,0,0,18,97,0,0,18,105,110,118,66,0,0,0,0,1,0,0,2,1,1,0,2,6,118,0,0, -1,1,0,6,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,2, -1,0,2,6,118,0,0,1,1,0,6,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,0, -18,118,0,0,18,117,0,0,0,0,1,0,0,2,3,1,0,2,6,118,0,0,1,1,0,6,117,0,0,0,1,4,118,101,99,52,95,109,117, -108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,6,118,0,0,1,1,0,6, -117,0,0,0,1,3,2,0,6,1,105,110,118,0,0,1,1,122,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105, -110,118,0,59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,0, -59,121,0,0,18,117,0,59,121,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,122,0,0, -18,118,0,0,18,105,110,118,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101, -116,86,97,108,0,0,18,122,0,0,0,0,1,0,0,2,1,1,0,2,7,118,0,0,1,1,0,7,117,0,0,0,1,4,118,101,99,52,95, -97,100,100,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,2,1,0,2,7,118,0,0,1,1,0,7,117,0,0,0,1,4, +0,18,117,0,59,122,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,85,0,59,119,0,0,18,117, +0,59,119,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108, +0,0,18,97,0,59,120,120,120,120,0,0,18,105,110,118,85,0,0,0,0,1,0,12,2,22,1,1,0,12,118,0,0,1,1,0,9, +98,0,0,0,1,3,2,0,9,1,105,110,118,66,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,66,0, +0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,95,95,114,101,116,86,97,108, +0,0,18,118,0,0,18,105,110,118,66,0,59,120,120,120,120,0,0,0,0,1,0,6,2,26,1,1,0,5,97,0,0,1,1,0,6, +117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,50,0,18,97,0,0,0,18,117,0,46,20,0, +0,1,0,6,2,26,1,1,0,6,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105, +118,101,99,50,0,18,98,0,0,0,46,20,0,0,1,0,6,2,27,1,1,0,5,97,0,0,1,1,0,6,117,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,58,105,118,101,99,50,0,18,97,0,0,0,18,117,0,47,20,0,0,1,0,6,2,27,1,1,0,6,118,0, +0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,50,0,18,98,0,0, +0,47,20,0,0,1,0,6,2,21,1,1,0,5,97,0,0,1,1,0,6,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58, +105,118,101,99,50,0,18,97,0,0,0,18,117,0,48,20,0,0,1,0,6,2,21,1,1,0,6,118,0,0,1,1,0,5,98,0,0,0,1,9, +18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,50,0,18,98,0,0,0,48,20,0,0,1,0,6,2,22, +1,1,0,5,97,0,0,1,1,0,6,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,50,0,18,97, +0,0,0,18,117,0,49,20,0,0,1,0,6,2,22,1,1,0,6,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86, +97,108,0,18,118,0,58,105,118,101,99,50,0,18,98,0,0,0,49,20,0,0,1,0,7,2,26,1,1,0,5,97,0,0,1,1,0,7, +117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,51,0,18,97,0,0,0,18,117,0,46,20,0, +0,1,0,7,2,26,1,1,0,7,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105, +118,101,99,51,0,18,98,0,0,0,46,20,0,0,1,0,7,2,27,1,1,0,5,97,0,0,1,1,0,7,117,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,58,105,118,101,99,51,0,18,97,0,0,0,18,117,0,47,20,0,0,1,0,7,2,27,1,1,0,7,118,0, +0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,51,0,18,98,0,0, +0,47,20,0,0,1,0,7,2,21,1,1,0,5,97,0,0,1,1,0,7,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58, +105,118,101,99,51,0,18,97,0,0,0,18,117,0,48,20,0,0,1,0,7,2,21,1,1,0,7,118,0,0,1,1,0,5,98,0,0,0,1,9, +18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,51,0,18,98,0,0,0,48,20,0,0,1,0,7,2,22, +1,1,0,5,97,0,0,1,1,0,7,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,51,0,18,97, +0,0,0,18,117,0,49,20,0,0,1,0,7,2,22,1,1,0,7,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86, +97,108,0,18,118,0,58,105,118,101,99,51,0,18,98,0,0,0,49,20,0,0,1,0,8,2,26,1,1,0,5,97,0,0,1,1,0,8, +117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,52,0,18,97,0,0,0,18,117,0,46,20,0, +0,1,0,8,2,26,1,1,0,8,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105, +118,101,99,52,0,18,98,0,0,0,46,20,0,0,1,0,8,2,27,1,1,0,5,97,0,0,1,1,0,8,117,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,58,105,118,101,99,52,0,18,97,0,0,0,18,117,0,47,20,0,0,1,0,8,2,27,1,1,0,8,118,0, +0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,52,0,18,98,0,0, +0,47,20,0,0,1,0,8,2,21,1,1,0,5,97,0,0,1,1,0,8,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58, +105,118,101,99,52,0,18,97,0,0,0,18,117,0,48,20,0,0,1,0,8,2,21,1,1,0,8,118,0,0,1,1,0,5,98,0,0,0,1,9, +18,95,95,114,101,116,86,97,108,0,18,118,0,58,105,118,101,99,52,0,18,98,0,0,0,48,20,0,0,1,0,8,2,22, +1,1,0,5,97,0,0,1,1,0,8,117,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,58,105,118,101,99,52,0,18,97, +0,0,0,18,117,0,49,20,0,0,1,0,8,2,22,1,1,0,8,118,0,0,1,1,0,5,98,0,0,0,1,9,18,95,95,114,101,116,86, +97,108,0,18,118,0,58,105,118,101,99,52,0,18,98,0,0,0,49,20,0,0,1,0,5,2,27,1,1,0,5,97,0,0,0,1,4,118, +101,99,52,95,110,101,103,97,116,101,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,97,0,0,0,0,1, +0,6,2,27,1,1,0,6,118,0,0,0,1,4,118,101,99,52,95,110,101,103,97,116,101,0,18,95,95,114,101,116,86, +97,108,0,0,18,118,0,0,0,0,1,0,7,2,27,1,1,0,7,118,0,0,0,1,4,118,101,99,52,95,110,101,103,97,116,101, +0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,0,0,1,0,8,2,27,1,1,0,8,118,0,0,0,1,4,118,101,99,52, +95,110,101,103,97,116,101,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,0,0,1,0,9,2,27,1,1,0,9, +97,0,0,0,1,4,118,101,99,52,95,110,101,103,97,116,101,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0, +18,97,0,0,0,0,1,0,10,2,27,1,1,0,10,118,0,0,0,1,4,118,101,99,52,95,110,101,103,97,116,101,0,18,95, +95,114,101,116,86,97,108,0,59,120,121,0,0,18,118,0,59,120,121,0,0,0,0,1,0,11,2,27,1,1,0,11,118,0,0, +0,1,4,118,101,99,52,95,110,101,103,97,116,101,0,18,95,95,114,101,116,86,97,108,0,59,120,121,122,0, +0,18,118,0,59,120,121,122,0,0,0,0,1,0,12,2,27,1,1,0,12,118,0,0,0,1,4,118,101,99,52,95,110,101,103, +97,116,101,0,18,95,95,114,101,116,86,97,108,0,0,18,118,0,0,0,0,1,0,13,2,27,1,1,0,13,109,0,0,0,1,9, +18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,54,20,0,9,18,95,95,114,101,116, +86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,54,20,0,0,1,0,14,2,27,1,1,0,14,109,0,0,0,1,9,18, +95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,54,20,0,9,18,95,95,114,101,116,86, +97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,54,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50, +0,57,18,109,0,16,10,50,0,57,54,20,0,0,1,0,15,2,27,1,1,0,15,109,0,0,0,1,9,18,95,95,114,101,116,86, +97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,54,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0, +57,18,109,0,16,10,49,0,57,54,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10, +50,0,57,54,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,54,20,0,0, +1,0,9,0,100,111,116,0,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0, +18,98,0,48,20,0,0,1,0,9,0,100,111,116,0,1,1,0,10,97,0,0,1,1,0,10,98,0,0,0,1,9,18,95,95,114,101,116, +86,97,108,0,18,97,0,59,120,0,18,98,0,59,120,0,48,18,97,0,59,121,0,18,98,0,59,121,0,48,46,20,0,0,1, +0,9,0,100,111,116,0,1,1,0,11,97,0,0,1,1,0,11,98,0,0,0,1,4,118,101,99,51,95,100,111,116,0,18,95,95, +114,101,116,86,97,108,0,0,18,97,0,0,18,98,0,0,0,0,1,0,9,0,100,111,116,0,1,1,0,12,97,0,0,1,1,0,12, +98,0,0,0,1,4,118,101,99,52,95,100,111,116,0,18,95,95,114,101,116,86,97,108,0,0,18,97,0,0,18,98,0,0, +0,0,1,0,0,2,1,1,0,2,5,97,0,0,1,1,0,5,98,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,97,0,0,18,97,0, +0,18,98,0,0,0,0,1,0,0,2,2,1,0,2,5,97,0,0,1,1,0,5,98,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114, +97,99,116,0,18,97,0,0,18,97,0,0,18,98,0,0,0,0,1,0,0,2,3,1,0,2,5,97,0,0,1,1,0,5,98,0,0,0,1,4,118, +101,99,52,95,109,117,108,116,105,112,108,121,0,18,97,0,0,18,97,0,0,18,98,0,0,0,0,1,0,0,2,4,1,0,2,5, +97,0,0,1,1,0,5,98,0,0,0,1,3,2,0,9,1,105,110,118,66,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18, +105,110,118,66,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,97,0,0,18, +97,0,0,18,105,110,118,66,0,0,0,0,1,0,0,2,1,1,0,2,6,118,0,0,1,1,0,6,117,0,0,0,1,4,118,101,99,52,95, +97,100,100,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,2,1,0,2,6,118,0,0,1,1,0,6,117,0,0,0,1,4, 118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,3,1,0, -2,7,118,0,0,1,1,0,7,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,0,18, -118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,7,118,0,0,1,1,0,7,117,0,0,0,1,3,2,0,7,1,105,110,118,0,0,1,1, +2,6,118,0,0,1,1,0,6,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,0,18, +118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,6,118,0,0,1,1,0,6,117,0,0,0,1,3,2,0,6,1,105,110,118,0,0,1,1, 122,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,0,59,120,0,0,18,117,0,59,120,0,0,0,4, 102,108,111,97,116,95,114,99,112,0,18,105,110,118,0,59,121,0,0,18,117,0,59,121,0,0,0,4,118,101,99, 52,95,109,117,108,116,105,112,108,121,0,18,122,0,0,18,118,0,0,18,105,110,118,0,0,0,4,102,108,111, 97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,122,0,0,0,0,1,0,0,2,1,1,0, -2,8,118,0,0,1,1,0,8,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,0,18,118,0,0,18,117,0,0,0, -0,1,0,0,2,2,1,0,2,8,118,0,0,1,1,0,8,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0, -18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,3,1,0,2,8,118,0,0,1,1,0,8,117,0,0,0,1,4,118,101,99,52, -95,109,117,108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,8,118,0, -0,1,1,0,8,117,0,0,0,1,3,2,0,8,1,105,110,118,0,0,1,1,122,0,0,0,4,102,108,111,97,116,95,114,99,112,0, +2,7,118,0,0,1,1,0,7,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,0,18,118,0,0,18,117,0,0,0, +0,1,0,0,2,2,1,0,2,7,118,0,0,1,1,0,7,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0, +18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,3,1,0,2,7,118,0,0,1,1,0,7,117,0,0,0,1,4,118,101,99,52, +95,109,117,108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,7,118,0, +0,1,1,0,7,117,0,0,0,1,3,2,0,7,1,105,110,118,0,0,1,1,122,0,0,0,4,102,108,111,97,116,95,114,99,112,0, 18,105,110,118,0,59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110, 118,0,59,121,0,0,18,117,0,59,121,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,122, 0,0,18,118,0,0,18,105,110,118,0,0,0,4,102,108,111,97,116,95,116,111,95,105,110,116,0,18,95,95,114, -101,116,86,97,108,0,0,18,122,0,0,0,0,1,0,0,2,1,1,0,2,9,97,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52, -95,97,100,100,0,18,97,0,59,120,0,0,18,97,0,59,120,0,0,18,98,0,0,0,0,1,0,0,2,2,1,0,2,9,97,0,0,1,1,0, -9,98,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,97,0,59,120,0,0,18,97,0,0,18,98, -0,0,0,0,1,0,0,2,3,1,0,2,9,97,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108, -121,0,18,97,0,59,120,0,0,18,97,0,0,18,98,0,0,0,0,1,0,0,2,4,1,0,2,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0, -9,1,119,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,120,0,0,18,98,0,0,0,4,118,101,99,52, -95,109,117,108,116,105,112,108,121,0,18,97,0,59,120,0,0,18,97,0,0,18,119,0,0,0,0,1,0,0,2,1,1,0,2, -10,118,0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,59,120,121,0,0,18,118,0, -59,120,121,0,0,18,117,0,59,120,121,0,0,0,0,1,0,0,2,2,1,0,2,10,118,0,0,1,1,0,10,117,0,0,0,1,4,118, -101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,117, -0,59,120,121,0,0,0,0,1,0,0,2,3,1,0,2,10,118,0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,109,117, -108,116,105,112,108,121,0,18,118,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,117,0,59,120,121,0,0, -0,0,1,0,0,2,4,1,0,2,10,118,0,0,1,1,0,10,117,0,0,0,1,3,2,0,10,1,119,0,0,0,4,102,108,111,97,116,95, -114,99,112,0,18,119,0,59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119, -0,59,121,0,0,18,117,0,59,121,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0, -59,120,121,0,0,18,118,0,59,120,121,0,0,18,119,0,59,120,121,0,0,0,0,1,0,0,2,1,1,0,2,11,118,0,0,1,1, -0,11,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,59,120,121,122,0,0,18,118,0,0,18,117,0,0, -0,0,1,0,0,2,2,1,0,2,11,118,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99, -116,0,18,118,0,59,120,121,122,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,3,1,0,2,11,118,0,0,1,1,0,11, -117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,59,120,121,122,0,0,18, -118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,11,118,0,0,1,1,0,11,117,0,0,0,1,3,2,0,11,1,119,0,0,0,4,102, +101,116,86,97,108,0,0,18,122,0,0,0,0,1,0,0,2,1,1,0,2,8,118,0,0,1,1,0,8,117,0,0,0,1,4,118,101,99,52, +95,97,100,100,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,2,1,0,2,8,118,0,0,1,1,0,8,117,0,0,0,1, +4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,3,1, +0,2,8,118,0,0,1,1,0,8,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,0, +18,118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,8,118,0,0,1,1,0,8,117,0,0,0,1,3,2,0,8,1,105,110,118,0,0, +1,1,122,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,0,59,120,0,0,18,117,0,59,120,0,0, +0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,0,59,121,0,0,18,117,0,59,121,0,0,0,4,118,101, +99,52,95,109,117,108,116,105,112,108,121,0,18,122,0,0,18,118,0,0,18,105,110,118,0,0,0,4,102,108, +111,97,116,95,116,111,95,105,110,116,0,18,95,95,114,101,116,86,97,108,0,0,18,122,0,0,0,0,1,0,0,2,1, +1,0,2,9,97,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,97,0,59,120,0,0,18,97,0,59, +120,0,0,18,98,0,0,0,0,1,0,0,2,2,1,0,2,9,97,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,115,117,98, +116,114,97,99,116,0,18,97,0,59,120,0,0,18,97,0,0,18,98,0,0,0,0,1,0,0,2,3,1,0,2,9,97,0,0,1,1,0,9,98, +0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,97,0,59,120,0,0,18,97,0,0,18,98,0, +0,0,0,1,0,0,2,4,1,0,2,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,9,1,119,0,0,0,4,102,108,111,97,116,95,114, +99,112,0,18,119,0,59,120,0,0,18,98,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18, +97,0,59,120,0,0,18,97,0,0,18,119,0,0,0,0,1,0,0,2,1,1,0,2,10,118,0,0,1,1,0,10,117,0,0,0,1,4,118,101, +99,52,95,97,100,100,0,18,118,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,117,0,59,120,121,0,0,0,0, +1,0,0,2,2,1,0,2,10,118,0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0, +18,118,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,117,0,59,120,121,0,0,0,0,1,0,0,2,3,1,0,2,10,118, +0,0,1,1,0,10,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,59,120,121, +0,0,18,118,0,59,120,121,0,0,18,117,0,59,120,121,0,0,0,0,1,0,0,2,4,1,0,2,10,118,0,0,1,1,0,10,117,0, +0,0,1,3,2,0,10,1,119,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,120,0,0,18,117,0,59, +120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,121,0,0,18,117,0,59,121,0,0,0,4,118,101, +99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,119, +0,59,120,121,0,0,0,0,1,0,0,2,1,1,0,2,11,118,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,97,100,100, +0,18,118,0,59,120,121,122,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,2,1,0,2,11,118,0,0,1,1,0,11,117,0, +0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,59,120,121,122,0,0,18,118,0,0,18, +117,0,0,0,0,1,0,0,2,3,1,0,2,11,118,0,0,1,1,0,11,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105, +112,108,121,0,18,118,0,59,120,121,122,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,11,118,0,0,1,1, +0,11,117,0,0,0,1,3,2,0,11,1,119,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,120,0,0,18, +117,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,121,0,0,18,117,0,59,121,0,0,0, +4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,122,0,0,18,117,0,59,122,0,0,0,4,118,101,99,52,95, +109,117,108,116,105,112,108,121,0,18,118,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,119,0, +59,120,121,122,0,0,0,0,1,0,0,2,1,1,0,2,12,118,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,97,100, +100,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,2,1,0,2,12,118,0,0,1,1,0,12,117,0,0,0,1,4,118, +101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,3,1,0,2, +12,118,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,0,18, +118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,12,118,0,0,1,1,0,12,117,0,0,0,1,3,2,0,12,1,119,0,0,0,4,102, 108,111,97,116,95,114,99,112,0,18,119,0,59,120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116,95, 114,99,112,0,18,119,0,59,121,0,0,18,117,0,59,121,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119, -0,59,122,0,0,18,117,0,59,122,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0, -59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,119,0,59,120,121,122,0,0,0,0,1,0,0,2,1,1,0,2,12, -118,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0, -1,0,0,2,2,1,0,2,12,118,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0, -18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,3,1,0,2,12,118,0,0,1,1,0,12,117,0,0,0,1,4,118,101,99, -52,95,109,117,108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18,117,0,0,0,0,1,0,0,2,4,1,0,2,12, -118,0,0,1,1,0,12,117,0,0,0,1,3,2,0,12,1,119,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59, -120,0,0,18,117,0,59,120,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,121,0,0,18,117,0,59, -121,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,122,0,0,18,117,0,59,122,0,0,0,4,102,108, -111,97,116,95,114,99,112,0,18,119,0,59,119,0,0,18,117,0,59,119,0,0,0,4,118,101,99,52,95,109,117, -108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18,119,0,0,0,0,1,0,0,2,1,1,0,2,6,118,0,0,1,1,0,5, -97,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,97,0, -59,120,120,0,0,0,0,1,0,0,2,2,1,0,2,6,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,115,117,98,116, -114,97,99,116,0,18,118,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,97,0,59,120,120,0,0,0,0,1,0,0,2, -3,1,0,2,6,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0, -59,120,121,0,0,18,118,0,59,120,121,0,0,18,97,0,59,120,120,0,0,0,9,18,118,0,59,120,0,18,97,0,23,0,9, -18,118,0,59,121,0,18,97,0,23,0,0,1,0,0,2,4,1,0,2,6,118,0,0,1,1,0,5,97,0,0,0,1,9,18,118,0,59,120,0, -18,97,0,24,0,9,18,118,0,59,121,0,18,97,0,24,0,0,1,0,0,2,1,1,0,2,7,118,0,0,1,1,0,5,97,0,0,0,1,4,118, -101,99,52,95,97,100,100,0,18,118,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,97,0,59,120, -120,120,0,0,0,0,1,0,0,2,2,1,0,2,7,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114, -97,99,116,0,18,118,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,0,0, -1,0,0,2,3,1,0,2,7,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0, -18,118,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,0,0,1,0,0,2,4,1, -0,2,7,118,0,0,1,1,0,5,97,0,0,0,1,9,18,118,0,59,120,0,18,97,0,24,0,9,18,118,0,59,121,0,18,97,0,24,0, -9,18,118,0,59,122,0,18,97,0,24,0,0,1,0,0,2,1,1,0,2,8,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95, -97,100,100,0,18,118,0,0,18,118,0,0,18,97,0,59,120,120,120,120,0,0,0,0,1,0,0,2,2,1,0,2,8,118,0,0,1, -1,0,5,97,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,0,18,118,0,0,18,97,0, -59,120,120,120,120,0,0,0,0,1,0,0,2,3,1,0,2,8,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,109,117, -108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18,97,0,59,120,120,120,120,0,0,0,0,1,0,0,2,4,1,0,2, -8,118,0,0,1,1,0,5,97,0,0,0,1,9,18,118,0,59,120,0,18,97,0,24,0,9,18,118,0,59,121,0,18,97,0,24,0,9, -18,118,0,59,122,0,18,97,0,24,0,9,18,118,0,59,119,0,18,97,0,24,0,0,1,0,0,2,1,1,0,2,10,118,0,0,1,1,0, -9,97,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,59,120,121,0,0,18,118,0,0,18,97,0,59,120,120, -0,0,0,0,1,0,0,2,2,1,0,2,10,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99, -116,0,18,118,0,59,120,121,0,0,18,118,0,0,18,97,0,59,120,120,0,0,0,0,1,0,0,2,3,1,0,2,10,118,0,0,1,1, -0,9,97,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,59,120,121,0,0,18,118, -0,0,18,97,0,59,120,120,0,0,0,0,1,0,0,2,4,1,0,2,10,118,0,0,1,1,0,9,97,0,0,0,1,3,2,0,9,1,105,110,118, -65,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,65,0,0,18,97,0,0,0,4,118,101,99,52,95, +0,59,122,0,0,18,117,0,59,122,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,119,0,59,119,0,0,18,117, +0,59,119,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18,119,0, +0,0,0,1,0,0,2,1,1,0,2,6,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,59,120, +121,0,0,18,118,0,59,120,121,0,0,18,97,0,59,120,120,0,0,0,0,1,0,0,2,2,1,0,2,6,118,0,0,1,1,0,5,97,0, +0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,59,120,121,0,0,18,118,0,59,120, +121,0,0,18,97,0,59,120,120,0,0,0,0,1,0,0,2,3,1,0,2,6,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95, 109,117,108,116,105,112,108,121,0,18,118,0,59,120,121,0,0,18,118,0,59,120,121,0,0,18,97,0,59,120, -120,0,0,0,0,1,0,0,2,1,1,0,2,11,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0, -59,120,121,122,0,0,18,118,0,0,18,97,0,59,120,120,120,0,0,0,0,1,0,0,2,2,1,0,2,11,118,0,0,1,1,0,9,97, -0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,59,120,121,122,0,0,18,118,0,0, -18,97,0,59,120,120,120,0,0,0,0,1,0,0,2,3,1,0,2,11,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95, -109,117,108,116,105,112,108,121,0,18,118,0,59,120,121,122,0,0,18,118,0,0,18,97,0,59,120,120,120,0, -0,0,0,1,0,0,2,4,1,0,2,11,118,0,0,1,1,0,9,97,0,0,0,1,3,2,0,9,1,105,110,118,65,0,0,0,4,102,108,111, -97,116,95,114,99,112,0,18,105,110,118,65,0,0,18,97,0,0,0,4,118,101,99,52,95,109,117,108,116,105, -112,108,121,0,18,118,0,59,120,121,122,0,0,18,118,0,59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,0, -0,1,0,0,2,1,1,0,2,12,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,0,18,118, -0,0,18,97,0,59,120,120,120,120,0,0,0,0,1,0,0,2,2,1,0,2,12,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99, -52,95,115,117,98,116,114,97,99,116,0,18,118,0,0,18,118,0,0,18,97,0,59,120,120,120,120,0,0,0,0,1,0, -0,2,3,1,0,2,12,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18, -118,0,0,18,118,0,0,18,97,0,59,120,120,120,120,0,0,0,0,1,0,0,2,4,1,0,2,12,118,0,0,1,1,0,9,97,0,0,0, -1,3,2,0,9,1,105,110,118,65,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,65,0,0,18,97, -0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18,97,0,59,120, -120,120,120,0,0,0,0,1,0,13,2,26,1,1,0,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97, -108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86, -97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,46,20,0,0,1,0,13,2,27,1,1,0, -13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0, -57,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10, -49,0,57,18,110,0,16,10,49,0,57,47,20,0,0,1,0,13,2,21,1,1,0,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,95, -95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,59,120,120,0, -48,18,109,0,16,10,49,0,57,18,110,0,16,8,48,0,57,59,121,121,0,48,46,20,0,9,18,95,95,114,101,116,86, -97,108,0,16,10,49,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,49,0,57,59,120,120,0,48,18,109,0,16,10, -49,0,57,18,110,0,16,10,49,0,57,59,121,121,0,48,46,20,0,0,1,0,13,2,22,1,1,0,13,109,0,0,1,1,0,13,110, -0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0, -57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10, -49,0,57,49,20,0,0,1,0,14,2,26,1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97, -108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86, -97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,46,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,46,20,0,0,1,0,14,2,27, -1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16, -8,48,0,57,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0, -16,10,49,0,57,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18, -109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,47,20,0,0,1,0,14,2,21,1,1,0,14,109,0,0,1,1,0,14,110,0,0, -0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,59, -120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,8,48,0,57,59,121,121,121,0,48,46,18,109,0,16, -10,50,0,57,18,110,0,16,8,48,0,57,59,122,122,122,0,48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,49,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,49,0,57,59,120,120,120,0,48,18,109,0,16,10,49,0,57, -18,110,0,16,10,49,0,57,59,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16,10,49,0,57,59,122, -122,122,0,48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,8,48,0,57,18,110, -0,16,10,50,0,57,59,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,50,0,57,59,121,121,121,0, -48,46,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,59,122,122,122,0,48,46,20,0,0,1,0,14,2,22,1,1, -0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48, -0,57,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10, -49,0,57,18,110,0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0, -16,10,50,0,57,18,110,0,16,10,50,0,57,49,20,0,0,1,0,15,2,26,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9, -18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,46,20,0, -9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,46, -20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0, -57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10, -51,0,57,46,20,0,0,1,0,15,2,27,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97, -108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86, -97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,47,20,0,9,18,95,95,114, -101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,47,20,0,0,1,0,15,2, -21,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0, -16,8,48,0,57,18,110,0,16,8,48,0,57,59,120,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,8,48, -0,57,59,121,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16,8,48,0,57,59,122,122,122,122,0, -48,46,18,109,0,16,10,51,0,57,18,110,0,16,8,48,0,57,59,119,119,119,119,0,48,46,20,0,9,18,95,95,114, -101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,49,0,57,59,120,120,120,120, -0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,59,121,121,121,121,0,48,46,18,109,0,16,10,50,0, -57,18,110,0,16,10,49,0,57,59,122,122,122,122,0,48,46,18,109,0,16,10,51,0,57,18,110,0,16,10,49,0,57, -59,119,119,119,119,0,48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,8,48, -0,57,18,110,0,16,10,50,0,57,59,120,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,50,0,57, -59,121,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,59,122,122,122,122,0,48, -46,18,109,0,16,10,51,0,57,18,110,0,16,10,50,0,57,59,119,119,119,119,0,48,46,20,0,9,18,95,95,114, -101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,51,0,57,59,120,120,120,120, -0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,51,0,57,59,121,121,121,121,0,48,46,18,109,0,16,10,50,0, -57,18,110,0,16,10,51,0,57,59,122,122,122,122,0,48,46,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57, -59,119,119,119,119,0,48,46,20,0,0,1,0,15,2,22,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95, -114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,49,20,0,9,18, -95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,49,20,0, -9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,49, -20,0,0,1,0,13,2,26,1,1,0,9,97,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48, -0,57,18,97,0,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97, -0,18,110,0,16,10,49,0,57,46,20,0,0,1,0,13,2,26,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86, -97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,46,20,0,0,1,0,13,2,27,1,1,0,9,97,0,0,1,1,0, -13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,47,20, -0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,47,20,0,0,1,0,13, -2,27,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0, -16,8,48,0,57,18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0, -57,18,98,0,47,20,0,0,1,0,13,2,21,1,1,0,9,97,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97, -108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10, -49,0,57,18,97,0,18,110,0,16,10,49,0,57,48,20,0,0,1,0,13,2,21,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9, -18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,48,20,0,9,18,95,95,114, -101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,48,20,0,0,1,0,13,2,22,1,1,0,9,97, +120,0,0,0,9,18,118,0,59,120,0,18,97,0,23,0,9,18,118,0,59,121,0,18,97,0,23,0,0,1,0,0,2,4,1,0,2,6, +118,0,0,1,1,0,5,97,0,0,0,1,9,18,118,0,59,120,0,18,97,0,24,0,9,18,118,0,59,121,0,18,97,0,24,0,0,1,0, +0,2,1,1,0,2,7,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,59,120,121,122,0, +0,18,118,0,59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,0,0,1,0,0,2,2,1,0,2,7,118,0,0,1,1,0,5,97, +0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,59,120,121,122,0,0,18,118,0,59, +120,121,122,0,0,18,97,0,59,120,120,120,0,0,0,0,1,0,0,2,3,1,0,2,7,118,0,0,1,1,0,5,97,0,0,0,1,4,118, +101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,59,120,121,122,0,0,18,118,0,59,120,121,122, +0,0,18,97,0,59,120,120,120,0,0,0,0,1,0,0,2,4,1,0,2,7,118,0,0,1,1,0,5,97,0,0,0,1,9,18,118,0,59,120, +0,18,97,0,24,0,9,18,118,0,59,121,0,18,97,0,24,0,9,18,118,0,59,122,0,18,97,0,24,0,0,1,0,0,2,1,1,0,2, +8,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,0,18,118,0,0,18,97,0,59,120, +120,120,120,0,0,0,0,1,0,0,2,2,1,0,2,8,118,0,0,1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,115,117,98,116, +114,97,99,116,0,18,118,0,0,18,118,0,0,18,97,0,59,120,120,120,120,0,0,0,0,1,0,0,2,3,1,0,2,8,118,0,0, +1,1,0,5,97,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18, +97,0,59,120,120,120,120,0,0,0,0,1,0,0,2,4,1,0,2,8,118,0,0,1,1,0,5,97,0,0,0,1,9,18,118,0,59,120,0, +18,97,0,24,0,9,18,118,0,59,121,0,18,97,0,24,0,9,18,118,0,59,122,0,18,97,0,24,0,9,18,118,0,59,119,0, +18,97,0,24,0,0,1,0,0,2,1,1,0,2,10,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18, +118,0,59,120,121,0,0,18,118,0,0,18,97,0,59,120,120,0,0,0,0,1,0,0,2,2,1,0,2,10,118,0,0,1,1,0,9,97,0, +0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,59,120,121,0,0,18,118,0,0,18,97,0, +59,120,120,0,0,0,0,1,0,0,2,3,1,0,2,10,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,109,117,108, +116,105,112,108,121,0,18,118,0,59,120,121,0,0,18,118,0,0,18,97,0,59,120,120,0,0,0,0,1,0,0,2,4,1,0, +2,10,118,0,0,1,1,0,9,97,0,0,0,1,3,2,0,9,1,105,110,118,65,0,0,0,4,102,108,111,97,116,95,114,99,112, +0,18,105,110,118,65,0,0,18,97,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0, +59,120,121,0,0,18,118,0,59,120,121,0,0,18,97,0,59,120,120,0,0,0,0,1,0,0,2,1,1,0,2,11,118,0,0,1,1,0, +9,97,0,0,0,1,4,118,101,99,52,95,97,100,100,0,18,118,0,59,120,121,122,0,0,18,118,0,0,18,97,0,59,120, +120,120,0,0,0,0,1,0,0,2,2,1,0,2,11,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,115,117,98,116, +114,97,99,116,0,18,118,0,59,120,121,122,0,0,18,118,0,0,18,97,0,59,120,120,120,0,0,0,0,1,0,0,2,3,1, +0,2,11,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,59, +120,121,122,0,0,18,118,0,0,18,97,0,59,120,120,120,0,0,0,0,1,0,0,2,4,1,0,2,11,118,0,0,1,1,0,9,97,0, +0,0,1,3,2,0,9,1,105,110,118,65,0,0,0,4,102,108,111,97,116,95,114,99,112,0,18,105,110,118,65,0,0,18, +97,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,59,120,121,122,0,0,18,118,0, +59,120,121,122,0,0,18,97,0,59,120,120,120,0,0,0,0,1,0,0,2,1,1,0,2,12,118,0,0,1,1,0,9,97,0,0,0,1,4, +118,101,99,52,95,97,100,100,0,18,118,0,0,18,118,0,0,18,97,0,59,120,120,120,120,0,0,0,0,1,0,0,2,2,1, +0,2,12,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101,99,52,95,115,117,98,116,114,97,99,116,0,18,118,0,0,18, +118,0,0,18,97,0,59,120,120,120,120,0,0,0,0,1,0,0,2,3,1,0,2,12,118,0,0,1,1,0,9,97,0,0,0,1,4,118,101, +99,52,95,109,117,108,116,105,112,108,121,0,18,118,0,0,18,118,0,0,18,97,0,59,120,120,120,120,0,0,0, +0,1,0,0,2,4,1,0,2,12,118,0,0,1,1,0,9,97,0,0,0,1,3,2,0,9,1,105,110,118,65,0,0,0,4,102,108,111,97, +116,95,114,99,112,0,18,105,110,118,65,0,0,18,97,0,0,0,4,118,101,99,52,95,109,117,108,116,105,112, +108,121,0,18,118,0,0,18,118,0,0,18,97,0,59,120,120,120,120,0,0,0,0,1,0,13,2,26,1,1,0,13,109,0,0,1, +1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0, +16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18, +110,0,16,10,49,0,57,46,20,0,0,1,0,13,2,27,1,1,0,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101, +116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114, +101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,47,20,0,0,1,0,13,2, +21,1,1,0,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0, +16,8,48,0,57,18,110,0,16,8,48,0,57,59,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,8,48,0,57,59, +121,121,0,48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,8,48,0,57,18,110, +0,16,10,49,0,57,59,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,59,121,121,0,48,46, +20,0,0,1,0,13,2,22,1,1,0,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8, +48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16, +10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,49,20,0,0,1,0,14,2,26,1,1,0,14,109,0,0,1, +1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0, +16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18, +110,0,16,10,49,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0, +57,18,110,0,16,10,50,0,57,46,20,0,0,1,0,14,2,27,1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95, +114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,47,20,0,9,18,95, +95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,47,20,0,9, +18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,47,20, +0,0,1,0,14,2,21,1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0, +57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,59,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0, +16,8,48,0,57,59,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16,8,48,0,57,59,122,122,122,0, +48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10, +49,0,57,59,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,59,121,121,121,0,48,46, +18,109,0,16,10,50,0,57,18,110,0,16,10,49,0,57,59,122,122,122,0,48,46,20,0,9,18,95,95,114,101,116, +86,97,108,0,16,10,50,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,50,0,57,59,120,120,120,0,48,18,109, +0,16,10,49,0,57,18,110,0,16,10,50,0,57,59,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16, +10,50,0,57,59,122,122,122,0,48,46,20,0,0,1,0,14,2,22,1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95, +95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,49,20,0,9,18, +95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,49,20,0, +9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,49, +20,0,0,1,0,15,2,26,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8, +48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16, +10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108, +0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,46,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,46,20,0,0,1,0,15,2,27,1,1,0,15, +109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57, +18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0, +57,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10, +50,0,57,18,110,0,16,10,50,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0, +16,10,51,0,57,18,110,0,16,10,51,0,57,47,20,0,0,1,0,15,2,21,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9, +18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,59,120, +120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,8,48,0,57,59,121,121,121,121,0,48,46,18,109,0, +16,10,50,0,57,18,110,0,16,8,48,0,57,59,122,122,122,122,0,48,46,18,109,0,16,10,51,0,57,18,110,0,16, +8,48,0,57,59,119,119,119,119,0,48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109, +0,16,8,48,0,57,18,110,0,16,10,49,0,57,59,120,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16, +10,49,0,57,59,121,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16,10,49,0,57,59,122,122,122, +122,0,48,46,18,109,0,16,10,51,0,57,18,110,0,16,10,49,0,57,59,119,119,119,119,0,48,46,20,0,9,18,95, +95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,50,0,57,59,120,120, +120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,50,0,57,59,121,121,121,121,0,48,46,18,109,0,16, +10,50,0,57,18,110,0,16,10,50,0,57,59,122,122,122,122,0,48,46,18,109,0,16,10,51,0,57,18,110,0,16,10, +50,0,57,59,119,119,119,119,0,48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0, +16,8,48,0,57,18,110,0,16,10,51,0,57,59,120,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,10, +51,0,57,59,121,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16,10,51,0,57,59,122,122,122, +122,0,48,46,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,59,119,119,119,119,0,48,46,20,0,0,1,0,15, +2,22,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109, +0,16,8,48,0,57,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18, +109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0, +57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10, +51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,49,20,0,0,1,0,13,2,26,1,1,0,9,97,0,0,1,1,0, +13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,46,20, +0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,46,20,0,0,1,0,13, +2,26,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0, +16,8,48,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0, +57,18,98,0,46,20,0,0,1,0,13,2,27,1,1,0,9,97,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10, +49,0,57,18,97,0,18,110,0,16,10,49,0,57,47,20,0,0,1,0,13,2,27,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9, +18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,47,20,0,9,18,95,95,114, +101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,47,20,0,0,1,0,13,2,21,1,1,0,9,97, 0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48, -0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,49,20, -0,0,1,0,13,2,22,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0, -57,18,109,0,16,8,48,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0, -16,10,49,0,57,18,98,0,49,20,0,0,1,0,14,2,26,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101, -116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97, -108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,46,20,0,0,1,0,14,2,26,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0, -1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,46,20,0,9,18,95,95, -114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,46,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,46,20,0,0,1,0,14,2,27,1,1,0,9,97,0,0, -1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57, -47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,47,20,0,9, -18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,47,20,0,0,1,0,14,2, -27,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16, -8,48,0,57,18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57, -18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,47, -20,0,0,1,0,14,2,21,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48, -0,57,18,97,0,18,110,0,16,8,48,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97, -0,18,110,0,16,10,49,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0, -16,10,50,0,57,48,20,0,0,1,0,14,2,21,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86, -97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57, -18,109,0,16,10,50,0,57,18,98,0,48,20,0,0,1,0,14,2,22,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95, -95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116,86,97, -108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,49,20,0,0,1,0,14,2,22,1,1,0,14,109,0,0,1,1,0,9, +0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,48,20, +0,0,1,0,13,2,21,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0, +57,18,109,0,16,8,48,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0, +16,10,49,0,57,18,98,0,48,20,0,0,1,0,13,2,22,1,1,0,9,97,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101, +116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,49,20,0,0,1,0,13,2,22,1,1,0,13,109,0,0,1,1,0,9, 98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,49,20,0,9, -18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,49,20,0,9,18,95,95, -114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,49,20,0,0,1,0,15,2,26,1,1,0,9, -97,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8, -48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,46, -20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,46,20,0,9,18, -95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,97,0,18,110,0,16,10,51,0,57,46,20,0,0,1,0,15,2,26,1, -1,0,15,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48, -0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98, -0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,46,20,0, -9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,98,0,46,20,0,0,1,0,15,2, -27,1,1,0,9,97,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18, -110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10, -49,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,47, -20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,97,0,18,110,0,16,10,51,0,57,47,20,0,0,1,0, -15,2,27,1,1,0,15,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109, -0,16,8,48,0,57,18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49, -0,57,18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98, -0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,98,0,47,20,0, -0,1,0,15,2,21,1,1,0,9,97,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57, -18,97,0,18,110,0,16,8,48,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18, -110,0,16,10,49,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16, -10,50,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,97,0,18,110,0,16,10,51,0,57, -48,20,0,0,1,0,15,2,21,1,1,0,15,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8, -48,0,57,18,109,0,16,8,48,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18, -109,0,16,10,49,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16, -10,50,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57, -18,98,0,48,20,0,0,1,0,15,2,22,1,1,0,9,97,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108, -0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0, -57,18,97,0,18,110,0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0, -18,110,0,16,10,50,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,97,0,18,110,0, -16,10,51,0,57,49,20,0,0,1,0,15,2,22,1,1,0,15,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86, -97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57, -18,109,0,16,10,50,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0, -16,10,51,0,57,18,98,0,49,20,0,0,1,0,10,2,21,1,1,0,13,109,0,0,1,1,0,10,118,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,18,109,0,16,8,48,0,57,18,118,0,59,120,120,0,48,18,109,0,16,10,49,0,57,18,118,0, -59,121,121,0,48,46,20,0,0,1,0,10,2,21,1,1,0,10,118,0,0,1,1,0,13,109,0,0,0,1,9,18,95,95,114,101,116, -86,97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101, -116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0,20,0,0,1,0,11,2,21, -1,1,0,14,109,0,0,1,1,0,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,109,0,16,8,48,0,57,18, -118,0,59,120,120,120,0,48,18,109,0,16,10,49,0,57,18,118,0,59,121,121,121,0,48,46,18,109,0,16,10,50, -0,57,18,118,0,59,122,122,122,0,48,46,20,0,0,1,0,11,2,21,1,1,0,11,118,0,0,1,1,0,14,109,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0, -9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0, -20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,50,0, -57,0,0,20,0,0,1,0,12,2,21,1,1,0,15,109,0,0,1,1,0,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0, -18,109,0,16,8,48,0,57,18,118,0,59,120,120,120,120,0,48,18,109,0,16,10,49,0,57,18,118,0,59,121,121, -121,121,0,48,46,18,109,0,16,10,50,0,57,18,118,0,59,122,122,122,122,0,48,46,18,109,0,16,10,51,0,57, -18,118,0,59,119,119,119,119,0,48,46,20,0,0,1,0,12,2,21,1,1,0,12,118,0,0,1,1,0,15,109,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0, -9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0, -20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,50,0, -57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10, -51,0,57,0,0,20,0,0,1,0,0,2,1,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110, -0,16,8,48,0,57,21,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,21,0,0,1,0,0,2,2,1,0,2,13,109, -0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18,109,0,16,10,49,0, -57,18,110,0,16,10,49,0,57,22,0,0,1,0,0,2,3,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,18,109, -0,18,110,0,48,20,0,0,1,0,0,2,4,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18, -110,0,16,8,48,0,57,24,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0,0,1,0,0,2,1,1,0,2,14, -109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,21,0,9,18,109,0,16,10, -49,0,57,18,110,0,16,10,49,0,57,21,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,21,0,0,1,0,0,2, -2,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18, -109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,22,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,22, -0,0,1,0,0,2,3,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,18,109,0,18,110,0,48,20,0,0,1,0,0,2, -4,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,24,0,9,18, -109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,24, -0,0,1,0,0,2,1,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57, -21,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,21,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10, -50,0,57,21,0,9,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,21,0,0,1,0,0,2,2,1,0,2,15,109,0,0,1,1, -0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18,109,0,16,10,49,0,57,18, -110,0,16,10,49,0,57,22,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,22,0,9,18,109,0,16,10,51, -0,57,18,110,0,16,10,51,0,57,22,0,0,1,0,0,2,3,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,18, -109,0,18,110,0,48,20,0,0,1,0,0,2,4,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57, -18,110,0,16,8,48,0,57,24,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0,9,18,109,0,16,10, -50,0,57,18,110,0,16,10,50,0,57,24,0,9,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,24,0,0,1,0,0,2, -1,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,21,0,9,18,109,0,16,10,49,0, -57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,22, -0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0, -16,8,48,0,57,18,97,0,23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2,13,109,0,0,1,1,0, -9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,24,0,9,18,109,0,16,10,49,0,57,18,97,0,24,0,0,1,0,0,2, -1,1,0,2,14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,21,0,9,18,109,0,16,10,49,0, -57,18,97,0,21,0,9,18,109,0,16,10,50,0,57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,14,109,0,0,1,1,0,9,97,0,0, -0,1,9,18,109,0,16,8,48,0,57,18,97,0,22,0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,9,18,109,0,16,10,50, -0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0, -23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,9,18,109,0,16,10,50,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2, -14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,24,0,9,18,109,0,16,10,49,0,57,18,97, -0,24,0,9,18,109,0,16,10,50,0,57,18,97,0,24,0,0,1,0,0,2,1,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1,9,18, -109,0,16,8,48,0,57,18,97,0,21,0,9,18,109,0,16,10,49,0,57,18,97,0,21,0,9,18,109,0,16,10,50,0,57,18, -97,0,21,0,9,18,109,0,16,10,51,0,57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1,9, -18,109,0,16,8,48,0,57,18,97,0,22,0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,9,18,109,0,16,10,50,0,57, -18,97,0,22,0,9,18,109,0,16,10,51,0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1, -9,18,109,0,16,8,48,0,57,18,97,0,23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,9,18,109,0,16,10,50,0, -57,18,97,0,23,0,9,18,109,0,16,10,51,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2,15,109,0,0,1,1,0,9,97,0,0, +18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,49,20,0,0,1,0,14,2, +26,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18, +110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10, +49,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,46, +20,0,0,1,0,14,2,26,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48, +0,57,18,109,0,16,8,48,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109, +0,16,10,49,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50, +0,57,18,98,0,46,20,0,0,1,0,14,2,27,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86, +97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16, +10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57, +18,97,0,18,110,0,16,10,50,0,57,47,20,0,0,1,0,14,2,27,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95, +95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,47,20,0,9,18,95,95,114,101, +116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,47,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,47,20,0,0,1,0,14,2,21,1,1,0,9,97,0,0,1,1,0,14, +110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,48,20,0, +9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,48,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,48,20,0,0,1,0,14,2,21,1,1,0, +14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0, +57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0, +48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,48,20,0,0, +1,0,14,2,22,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18, +97,0,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110, +0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50, +0,57,49,20,0,0,1,0,14,2,22,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0, +16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0, +57,18,109,0,16,10,49,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109, +0,16,10,50,0,57,18,98,0,49,20,0,0,1,0,15,2,26,1,1,0,9,97,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86, +97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0, +16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0, +57,18,97,0,18,110,0,16,10,51,0,57,46,20,0,0,1,0,15,2,26,1,1,0,15,109,0,0,1,1,0,9,98,0,0,0,1,9,18, +95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,46,20,0,9,18,95,95,114, +101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86, +97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0, +16,10,51,0,57,18,109,0,16,10,51,0,57,18,98,0,46,20,0,0,1,0,15,2,27,1,1,0,9,97,0,0,1,1,0,15,110,0,0, +0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,47,20,0,9,18,95, +95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95,114,101, +116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,47,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,51,0,57,18,97,0,18,110,0,16,10,51,0,57,47,20,0,0,1,0,15,2,27,1,1,0,15,109,0,0,1,1,0,9, +98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,47,20,0,9, +18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,47,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,47,20,0,9,18,95,95,114,101, +116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,98,0,47,20,0,0,1,0,15,2,21,1,1,0,9,97,0,0, +1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57, +48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,48,20,0,9, +18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,48,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,51,0,57,18,97,0,18,110,0,16,10,51,0,57,48,20,0,0,1,0,15,2,21,1,1,0, +15,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0, +57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0, +48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,48,20,0,9, +18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,98,0,48,20,0,0,1,0,15,2, +22,1,1,0,9,97,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18, +110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10, +49,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,49, +20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,97,0,18,110,0,16,10,51,0,57,49,20,0,0,1,0, +15,2,22,1,1,0,15,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109, +0,16,8,48,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49, +0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98, +0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,98,0,49,20,0, +0,1,0,10,2,21,1,1,0,13,109,0,0,1,1,0,10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,109,0,16, +8,48,0,57,18,118,0,59,120,120,0,48,18,109,0,16,10,49,0,57,18,118,0,59,121,121,0,48,46,20,0,0,1,0, +10,2,21,1,1,0,10,118,0,0,1,1,0,13,109,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,100, +111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58, +100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0,20,0,0,1,0,11,2,21,1,1,0,14,109,0,0,1,1,0,11, +118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,109,0,16,8,48,0,57,18,118,0,59,120,120,120,0,48, +18,109,0,16,10,49,0,57,18,118,0,59,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,118,0,59,122,122, +122,0,48,46,20,0,0,1,0,11,2,21,1,1,0,11,118,0,0,1,1,0,14,109,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101,116, +86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0,20,0,9,18,95,95,114, +101,116,86,97,108,0,59,122,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,50,0,57,0,0,20,0,0,1,0,12, +2,21,1,1,0,15,109,0,0,1,1,0,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,109,0,16,8,48,0, +57,18,118,0,59,120,120,120,120,0,48,18,109,0,16,10,49,0,57,18,118,0,59,121,121,121,121,0,48,46,18, +109,0,16,10,50,0,57,18,118,0,59,122,122,122,122,0,48,46,18,109,0,16,10,51,0,57,18,118,0,59,119,119, +119,119,0,48,46,20,0,0,1,0,12,2,21,1,1,0,12,118,0,0,1,1,0,15,109,0,0,0,1,9,18,95,95,114,101,116,86, +97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101, +116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0,20,0,9,18,95,95, +114,101,116,86,97,108,0,59,122,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,50,0,57,0,0,20,0,9,18, +95,95,114,101,116,86,97,108,0,59,119,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,51,0,57,0,0,20,0, +0,1,0,0,2,1,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,21, +0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,21,0,0,1,0,0,2,2,1,0,2,13,109,0,0,1,1,0,13,110,0, +0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10, +49,0,57,22,0,0,1,0,0,2,3,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,18,109,0,18,110,0,48,20, +0,0,1,0,0,2,4,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57, +24,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0,0,1,0,0,2,1,1,0,2,14,109,0,0,1,1,0,14, +110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,21,0,9,18,109,0,16,10,49,0,57,18,110,0, +16,10,49,0,57,21,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,21,0,0,1,0,0,2,2,1,0,2,14,109,0, +0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18,109,0,16,10,49,0,57, +18,110,0,16,10,49,0,57,22,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,22,0,0,1,0,0,2,3,1,0,2, +14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,18,109,0,18,110,0,48,20,0,0,1,0,0,2,4,1,0,2,14,109,0,0, +1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,24,0,9,18,109,0,16,10,49,0,57, +18,110,0,16,10,49,0,57,24,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,24,0,0,1,0,0,2,1,1,0,2, +15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,21,0,9,18,109,0,16, +10,49,0,57,18,110,0,16,10,49,0,57,21,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,21,0,9,18, +109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,21,0,0,1,0,0,2,2,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1, +9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57, +22,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,22,0,9,18,109,0,16,10,51,0,57,18,110,0,16,10, +51,0,57,22,0,0,1,0,0,2,3,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,18,109,0,18,110,0,48,20, +0,0,1,0,0,2,4,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57, +24,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10, +50,0,57,24,0,9,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,24,0,0,1,0,0,2,1,1,0,2,13,109,0,0,1,1, +0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,21,0,9,18,109,0,16,10,49,0,57,18,97,0,21,0,0,1,0,0, +2,2,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,22,0,9,18,109,0,16,10,49,0, +57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,23, +0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0, +16,8,48,0,57,18,97,0,24,0,9,18,109,0,16,10,49,0,57,18,97,0,24,0,0,1,0,0,2,1,1,0,2,14,109,0,0,1,1,0, +9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,21,0,9,18,109,0,16,10,49,0,57,18,97,0,21,0,9,18,109,0, +16,10,50,0,57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57, +18,97,0,22,0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,9,18,109,0,16,10,50,0,57,18,97,0,22,0,0,1,0,0,2, +3,1,0,2,14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,23,0,9,18,109,0,16,10,49,0, +57,18,97,0,23,0,9,18,109,0,16,10,50,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2,14,109,0,0,1,1,0,9,97,0,0, 0,1,9,18,109,0,16,8,48,0,57,18,97,0,24,0,9,18,109,0,16,10,49,0,57,18,97,0,24,0,9,18,109,0,16,10,50, -0,57,18,97,0,24,0,9,18,109,0,16,10,51,0,57,18,97,0,24,0,0,1,0,0,2,3,1,0,2,10,118,0,0,1,1,0,13,109, -0,0,0,1,9,18,118,0,18,118,0,18,109,0,48,20,0,0,1,0,0,2,3,1,0,2,11,118,0,0,1,1,0,14,109,0,0,0,1,9, -18,118,0,18,118,0,18,109,0,48,20,0,0,1,0,0,2,3,1,0,2,12,118,0,0,1,1,0,15,109,0,0,0,1,9,18,118,0,18, -118,0,18,109,0,48,20,0,0,1,0,5,2,25,1,0,2,5,97,0,0,0,1,9,18,97,0,18,97,0,16,10,49,0,47,20,0,9,18, -95,95,114,101,116,86,97,108,0,18,97,0,20,0,0,1,0,6,2,25,1,0,2,6,118,0,0,0,1,9,18,118,0,18,118,0,58, -105,118,101,99,50,0,16,10,49,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0, -7,2,25,1,0,2,7,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,47,20,0,9,18, -95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,8,2,25,1,0,2,8,118,0,0,0,1,9,18,118,0,18,118,0, -58,105,118,101,99,52,0,16,10,49,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1, -0,9,2,25,1,0,2,9,97,0,0,0,1,9,18,97,0,18,97,0,17,49,0,48,0,0,47,20,0,9,18,95,95,114,101,116,86,97, -108,0,18,97,0,20,0,0,1,0,10,2,25,1,0,2,10,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49, -0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,11,2,25,1,0,2,11,118,0, -0,0,1,9,18,118,0,18,118,0,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86, -97,108,0,18,118,0,20,0,0,1,0,12,2,25,1,0,2,12,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,52,0, -17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,13,2,25,1,0,2,13, -109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47, -20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47,20,0, -9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,14,2,25,1,0,2,14,109,0,0,0,1,9,18,109,0,16, -8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49, -0,57,18,109,0,16,10,49,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57, -18,109,0,16,10,50,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97, -108,0,18,109,0,20,0,0,1,0,15,2,25,1,0,2,15,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0, -57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57, -58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58, -118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118, -101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,5,2, -24,1,0,2,5,97,0,0,0,1,9,18,97,0,18,97,0,16,10,49,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18, -97,0,20,0,0,1,0,6,2,24,1,0,2,6,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0, -0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,7,2,24,1,0,2,7,118,0,0,0,1,9,18, -118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18, -118,0,20,0,0,1,0,8,2,24,1,0,2,8,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,52,0,16,10,49,0, -0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,9,2,24,1,0,2,9,97,0,0,0,1,9,18, -97,0,18,97,0,17,49,0,48,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,0,1,0,10,2,24, -1,0,2,10,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95, -114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,11,2,24,1,0,2,11,118,0,0,0,1,9,18,118,0,18,118,0,58, -118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0, -12,2,24,1,0,2,12,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9, -18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,13,2,24,1,0,2,13,109,0,0,0,1,9,18,109,0,16,8, -48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0, -57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86, -97,108,0,18,109,0,20,0,0,1,0,14,2,24,1,0,2,14,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48, -0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57, -58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58, -118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0, -15,2,24,1,0,2,15,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,52,0,17, -49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,52,0,17,49,0, -48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0,48,0, -0,0,0,46,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0, -0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,5,0,95,95,112,111,115,116,68,101, -99,114,0,1,0,2,5,97,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,16, -10,49,0,47,20,0,0,1,0,6,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,6,118,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0,0,47,20, -0,0,1,0,7,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,7,118,0,0,0,1,9,18,95,95,114,101,116,86,97, -108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,47,20,0,0,1,0,8,0,95, -95,112,111,115,116,68,101,99,114,0,1,0,2,8,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0, -20,0,9,18,118,0,18,118,0,58,105,118,101,99,52,0,16,10,49,0,0,0,47,20,0,0,1,0,9,0,95,95,112,111,115, -116,68,101,99,114,0,1,0,2,9,97,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0, -18,97,0,17,49,0,48,0,0,47,20,0,0,1,0,10,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,10,118,0,0,0, -1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49,0, -48,0,0,0,0,47,20,0,0,1,0,11,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,11,118,0,0,0,1,9,18,95, -95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,51,0,17,49,0,48,0,0,0,0, -47,20,0,0,1,0,12,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,12,118,0,0,0,1,9,18,95,95,114,101, -116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,0, -1,0,13,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,13,109,0,0,0,1,9,18,95,95,114,101,116,86,97, -108,0,18,109,0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49,0,48,0, -0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0, -0,47,20,0,0,1,0,14,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,14,109,0,0,0,1,9,18,95,95,114,101, -116,86,97,108,0,18,109,0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,51,0,17, -49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,51,0,17,49,0, -48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,51,0,17,49,0,48,0, -0,0,0,47,20,0,0,1,0,15,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,15,109,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,18,109,0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,52,0, -17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,52,0,17, -49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0, -48,0,0,0,0,47,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0, -0,0,0,47,20,0,0,1,0,9,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,9,97,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,16,10,49,0,46,20,0,0,1,0,10,0,95,95,112,111,115, -116,73,110,99,114,0,1,0,2,10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118, -0,18,118,0,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,11,0,95,95,112,111,115,116,73,110, -99,114,0,1,0,2,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0, -58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,12,0,95,95,112,111,115,116,73,110,99,114,0,1,0, -2,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101, -99,52,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,5,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,5,97,0,0, -0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,16,10,49,0,46,20,0,0,1,0,6,0, -95,95,112,111,115,116,73,110,99,114,0,1,0,2,6,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18, -118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0,0,46,20,0,0,1,0,7,0,95,95,112, -111,115,116,73,110,99,114,0,1,0,2,7,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9, -18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,46,20,0,0,1,0,8,0,95,95,112,111,115,116,73, -110,99,114,0,1,0,2,8,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18, -118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,46,20,0,0,1,0,13,0,95,95,112,111,115,116,73,110,99,114, -0,1,0,2,13,109,0,0,0,1,3,2,0,13,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0, -57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57, -58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,14,0,95,95,112,111,115,116,73,110, -99,114,0,1,0,2,14,109,0,0,0,1,3,2,0,14,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8,48,0,57,18,109,0,16, -8,48,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49, -0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57, -58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,15,0,95,95,112,111,115,116,73,110, -99,114,0,1,0,2,15,109,0,0,0,1,3,2,0,15,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8,48,0,57,18,109,0,16, -8,48,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49, -0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57, -58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58, -118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,1,2,15,1,1,0,9,97,0,0,1,1,0,9,98,0,0, -0,1,4,118,101,99,52,95,115,103,116,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,98,0,0,18,97,0, -0,0,0,1,0,1,2,15,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102, -108,111,97,116,0,18,98,0,0,0,40,0,0,1,0,1,2,16,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,99,0,0, -0,4,102,108,111,97,116,95,108,101,115,115,0,18,99,0,0,18,98,0,0,18,97,0,0,0,8,18,99,0,0,0,1,0,1,2, -16,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0, -18,98,0,0,0,41,0,0,1,0,1,2,18,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,103,0,0,1,1,101,0,0,0,4, -102,108,111,97,116,95,108,101,115,115,0,18,103,0,0,18,98,0,0,18,97,0,0,0,4,102,108,111,97,116,95, -101,113,117,97,108,0,18,101,0,0,18,97,0,0,18,98,0,0,0,8,18,103,0,18,101,0,32,0,0,1,0,1,2,18,1,1,0, -5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0,18,98,0, -0,0,43,0,0,1,0,1,2,17,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,103,0,0,1,1,101,0,0,0,4,102,108, -111,97,116,95,108,101,115,115,0,18,103,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,101,113, -117,97,108,0,18,101,0,0,18,97,0,0,18,98,0,0,0,8,18,103,0,18,101,0,32,0,0,1,0,1,2,17,1,1,0,5,97,0,0, -1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0,18,98,0,0,0,42,0, -0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,9,102,0,0,0,1,4,102,108,111,97,116,95,112,114, -105,110,116,0,18,102,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,5,105,0,0,0,1,4,105, -110,116,95,112,114,105,110,116,0,18,105,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,1, -98,0,0,0,1,4,98,111,111,108,95,112,114,105,110,116,0,18,98,0,0,0,0,1,0,0,0,112,114,105,110,116,77, -69,83,65,0,1,1,0,10,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9, -58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69, -83,65,0,1,1,0,11,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58, -112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0, -18,118,0,59,122,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,12,118,0,0,0,1,9,58,112, -114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18, -118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58,112,114, -105,110,116,77,69,83,65,0,18,118,0,59,119,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1, -0,6,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105, -110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,7, -118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110, -116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0, -0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,8,118,0,0,0,1,9,58,112,114,105,110,116,77, -69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0, -9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58,112,114,105,110,116,77,69,83, -65,0,18,118,0,59,119,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,2,118,0,0,0,1,9,58, -112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0, -18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,3,118,0,0,0,1,9,58,112, -114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18, -118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,0,1,0,0,0,112, -114,105,110,116,77,69,83,65,0,1,1,0,4,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0, +0,57,18,97,0,24,0,0,1,0,0,2,1,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0, +21,0,9,18,109,0,16,10,49,0,57,18,97,0,21,0,9,18,109,0,16,10,50,0,57,18,97,0,21,0,9,18,109,0,16,10, +51,0,57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97, +0,22,0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,9,18,109,0,16,10,50,0,57,18,97,0,22,0,9,18,109,0,16, +10,51,0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18, +97,0,23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,9,18,109,0,16,10,50,0,57,18,97,0,23,0,9,18,109,0, +16,10,51,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57, +18,97,0,24,0,9,18,109,0,16,10,49,0,57,18,97,0,24,0,9,18,109,0,16,10,50,0,57,18,97,0,24,0,9,18,109, +0,16,10,51,0,57,18,97,0,24,0,0,1,0,0,2,3,1,0,2,10,118,0,0,1,1,0,13,109,0,0,0,1,9,18,118,0,18,118,0, +18,109,0,48,20,0,0,1,0,0,2,3,1,0,2,11,118,0,0,1,1,0,14,109,0,0,0,1,9,18,118,0,18,118,0,18,109,0,48, +20,0,0,1,0,0,2,3,1,0,2,12,118,0,0,1,1,0,15,109,0,0,0,1,9,18,118,0,18,118,0,18,109,0,48,20,0,0,1,0, +5,2,25,1,0,2,5,97,0,0,0,1,9,18,97,0,18,97,0,16,10,49,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0, +18,97,0,20,0,0,1,0,6,2,25,1,0,2,6,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49, +0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,7,2,25,1,0,2,7,118,0,0,0,1,9, +18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0, +18,118,0,20,0,0,1,0,8,2,25,1,0,2,8,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,52,0,16,10,49, +0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,9,2,25,1,0,2,9,97,0,0,0,1,9, +18,97,0,18,97,0,17,49,0,48,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,0,1,0,10,2, +25,1,0,2,10,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95, +95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,11,2,25,1,0,2,11,118,0,0,0,1,9,18,118,0,18,118,0,58, +118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0, +12,2,25,1,0,2,12,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9, +18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,13,2,25,1,0,2,13,109,0,0,0,1,9,18,109,0,16,8, +48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0, +57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86, +97,108,0,18,109,0,20,0,0,1,0,14,2,25,1,0,2,14,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48, +0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57, +58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58, +118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0, +15,2,25,1,0,2,15,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,52,0,17, +49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,52,0,17,49,0, +48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0,48,0, +0,0,0,47,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0, +0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,5,2,24,1,0,2,5,97,0,0,0,1,9,18,97, +0,18,97,0,16,10,49,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,0,1,0,6,2,24,1,0,2,6, +118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0,0,46,20,0,9,18,95,95,114,101, +116,86,97,108,0,18,118,0,20,0,0,1,0,7,2,24,1,0,2,7,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101, +99,51,0,16,10,49,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,8,2,24,1,0,2, +8,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,52,0,16,10,49,0,0,0,46,20,0,9,18,95,95,114,101, +116,86,97,108,0,18,118,0,20,0,0,1,0,9,2,24,1,0,2,9,97,0,0,0,1,9,18,97,0,18,97,0,17,49,0,48,0,0,46, +20,0,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,0,1,0,10,2,24,1,0,2,10,118,0,0,0,1,9,18,118,0, +18,118,0,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0, +20,0,0,1,0,11,2,24,1,0,2,11,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,51,0,17,49,0,48,0,0,0,0, +46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,12,2,24,1,0,2,12,118,0,0,0,1,9,18, +118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18, +118,0,20,0,0,1,0,13,2,24,1,0,2,13,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118, +101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101, +99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,14,2,24, +1,0,2,14,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,51,0,17,49,0,48,0, +0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0, +0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46, +20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,15,2,24,1,0,2,15,109,0,0,0,1,9,18,109, +0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16, +10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10, +50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,51,0, +57,18,109,0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86, +97,108,0,18,109,0,20,0,0,1,0,5,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,5,97,0,0,0,1,9,18,95, +95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,16,10,49,0,47,20,0,0,1,0,6,0,95,95,112, +111,115,116,68,101,99,114,0,1,0,2,6,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9, +18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0,0,47,20,0,0,1,0,7,0,95,95,112,111,115,116,68, +101,99,114,0,1,0,2,7,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18, +118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,47,20,0,0,1,0,8,0,95,95,112,111,115,116,68,101,99,114, +0,1,0,2,8,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105, +118,101,99,52,0,16,10,49,0,0,0,47,20,0,0,1,0,9,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,9,97, +0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,17,49,0,48,0,0,47,20,0,0, +1,0,10,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,10,118,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,11,0, +95,95,112,111,115,116,68,101,99,114,0,1,0,2,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18, +118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,12,0,95,95,112, +111,115,116,68,101,99,114,0,1,0,2,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0, +9,18,118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,13,0,95,95,112,111,115,116, +68,101,99,114,0,1,0,2,13,109,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,9,18,109,0, +16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10, +49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,14,0,95,95,112, +111,115,116,68,101,99,114,0,1,0,2,14,109,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0, +9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18, +109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109, +0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,15,0,95, +95,112,111,115,116,68,101,99,114,0,1,0,2,15,109,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,109, +0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0, +9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18, +109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109, +0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,9,0,95, +95,112,111,115,116,73,110,99,114,0,1,0,2,9,97,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0, +20,0,9,18,97,0,18,97,0,16,10,49,0,46,20,0,0,1,0,10,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2, +10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99, +50,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,11,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,11,118,0,0, +0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,51,0,17,49, +0,48,0,0,0,0,46,20,0,0,1,0,12,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,12,118,0,0,0,1,9,18,95, +95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0, +46,20,0,0,1,0,5,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,5,97,0,0,0,1,9,18,95,95,114,101,116, +86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,16,10,49,0,46,20,0,0,1,0,6,0,95,95,112,111,115,116,73, +110,99,114,0,1,0,2,6,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18, +118,0,58,105,118,101,99,50,0,16,10,49,0,0,0,46,20,0,0,1,0,7,0,95,95,112,111,115,116,73,110,99,114, +0,1,0,2,7,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105, +118,101,99,51,0,16,10,49,0,0,0,46,20,0,0,1,0,8,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,8,118, +0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,51, +0,16,10,49,0,0,0,46,20,0,0,1,0,13,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,13,109,0,0,0,1,3,2, +0,13,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49, +0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48, +0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,14,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,14,109,0,0,0,1, +3,2,0,14,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,51,0, +17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,51,0,17, +49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,51,0,17,49,0, +48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,15,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,15,109,0,0, +0,1,3,2,0,15,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,52, +0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,52,0,17, +49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0, +48,0,0,0,0,46,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0, +0,0,0,46,20,0,8,18,110,0,0,0,1,0,1,2,15,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,115, +103,116,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,98,0,0,18,97,0,0,0,0,1,0,1,2,15,1,1,0,5, +97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0,18,98,0,0, +0,40,0,0,1,0,1,2,16,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,99,0,0,0,4,102,108,111,97,116,95, +108,101,115,115,0,18,99,0,0,18,98,0,0,18,97,0,0,0,8,18,99,0,0,0,1,0,1,2,16,1,1,0,5,97,0,0,1,1,0,5, +98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0,18,98,0,0,0,41,0,0,1,0,1, +2,18,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,103,0,0,1,1,101,0,0,0,4,102,108,111,97,116,95,108, +101,115,115,0,18,103,0,0,18,98,0,0,18,97,0,0,0,4,102,108,111,97,116,95,101,113,117,97,108,0,18,101, +0,0,18,97,0,0,18,98,0,0,0,8,18,103,0,18,101,0,32,0,0,1,0,1,2,18,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1, +8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0,18,98,0,0,0,43,0,0,1,0,1,2,17,1,1,0, +9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,103,0,0,1,1,101,0,0,0,4,102,108,111,97,116,95,108,101,115, +115,0,18,103,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,101,113,117,97,108,0,18,101,0,0,18, +97,0,0,18,98,0,0,0,8,18,103,0,18,101,0,32,0,0,1,0,1,2,17,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,8,58, +102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0,18,98,0,0,0,42,0,0,1,0,0,0,112,114,105, +110,116,77,69,83,65,0,1,1,0,9,102,0,0,0,1,4,102,108,111,97,116,95,112,114,105,110,116,0,18,102,0,0, +0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,5,105,0,0,0,1,4,105,110,116,95,112,114,105,110, +116,0,18,105,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,1,98,0,0,0,1,4,98,111,111,108, +95,112,114,105,110,116,0,18,98,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,10,118,0,0, +0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69, +83,65,0,18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,11,118,0,0,0,1,9, +58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65, +0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,0,1,0,0,0, +112,114,105,110,116,77,69,83,65,0,1,1,0,12,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18, +118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114, +105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0, +59,119,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,6,118,0,0,0,1,9,58,112,114,105, +110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59, +121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,7,118,0,0,0,1,9,58,112,114,105,110, +116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0, +0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,0,1,0,0,0,112,114,105,110,116, +77,69,83,65,0,1,1,0,8,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9, +58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65, +0,18,118,0,59,122,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,119,0,0,0,0,0,1,0,0,0, +112,114,105,110,116,77,69,83,65,0,1,1,0,2,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18, +118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,0,1,0,0,0,112, +114,105,110,116,77,69,83,65,0,1,1,0,3,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0, 59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110, -116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,119,0, -0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,13,109,0,0,0,1,9,58,112,114,105,110,116,77, -69,83,65,0,18,109,0,16,8,48,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,49,0, -57,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,14,109,0,0,0,1,9,58,112,114,105,110,116, -77,69,83,65,0,18,109,0,16,8,48,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,49, -0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,50,0,57,0,0,0,0,1,0,0,0,112,114, -105,110,116,77,69,83,65,0,1,1,0,15,109,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16, -8,48,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,49,0,57,0,0,0,9,58,112,114, -105,110,116,77,69,83,65,0,18,109,0,16,10,50,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18, -109,0,16,10,51,0,57,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,16,101,0,0,0,1,4,105, -110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,17, -101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77, -69,83,65,0,1,1,0,18,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112, -114,105,110,116,77,69,83,65,0,1,1,0,19,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0, -0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,20,101,0,0,0,1,4,105,110,116,95,112,114,105, -110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,21,101,0,0,0,1,4,105,110, -116,95,112,114,105,110,116,0,18,101,0,0,0,0,0 +116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,4,118, +0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77, +69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0, +9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,119,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69, +83,65,0,1,1,0,13,109,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,8,48,0,57,0,0,0,9, +58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,49,0,57,0,0,0,0,1,0,0,0,112,114,105,110,116,77, +69,83,65,0,1,1,0,14,109,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,8,48,0,57,0,0,0, +9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,49,0,57,0,0,0,9,58,112,114,105,110,116,77,69, +83,65,0,18,109,0,16,10,50,0,57,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,15,109,0,0, +0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,8,48,0,57,0,0,0,9,58,112,114,105,110,116,77, +69,83,65,0,18,109,0,16,10,49,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,50,0, +57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,51,0,57,0,0,0,0,1,0,0,0,112,114,105, +110,116,77,69,83,65,0,1,1,0,16,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1, +0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,17,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116, +0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,18,101,0,0,0,1,4,105,110,116,95, +112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,19,101,0,0,0, +1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0, +1,1,0,20,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110, +116,77,69,83,65,0,1,1,0,21,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,0 -- cgit v1.2.3 From 7acb7c1ac058d11d649b615bfcabf29b5a74a801 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 3 Jul 2008 13:49:48 -0600 Subject: mesa: additional error checking, fix error codes --- src/mesa/shader/shader_api.c | 56 ++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index c77d0c43973..eea44eb92a6 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -360,6 +360,22 @@ copy_string(GLchar *dst, GLsizei maxLength, GLsizei *length, const GLchar *src) } +static GLboolean +_mesa_is_program(GLcontext *ctx, GLuint name) +{ + struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name); + return shProg ? GL_TRUE : GL_FALSE; +} + + +static GLboolean +_mesa_is_shader(GLcontext *ctx, GLuint name) +{ + struct gl_shader *shader = _mesa_lookup_shader(ctx, name); + return shader ? GL_TRUE : GL_FALSE; +} + + /** * Called via ctx->Driver.AttachShader() */ @@ -372,12 +388,21 @@ _mesa_attach_shader(GLcontext *ctx, GLuint program, GLuint shader) GLuint n; GLuint i; - if (!shProg || !sh) { - _mesa_error(ctx, GL_INVALID_VALUE, - "glAttachShader(bad program or shader name)"); + if (!shProg) { + GLenum err = _mesa_is_shader(ctx, program) + ? GL_INVALID_OPERATION : GL_INVALID_VALUE; + _mesa_error(ctx, err, "glAttachShader(bad program or shader name)"); + return; + } + + if (!sh) { + GLenum err = _mesa_is_program(ctx, shader) + ? GL_INVALID_OPERATION : GL_INVALID_VALUE; + _mesa_error(ctx, err, "glAttachShader(bad program or shader name)"); return; } + n = shProg->NumShaders; for (i = 0; i < n; i++) { @@ -445,7 +470,9 @@ _mesa_bind_attrib_location(GLcontext *ctx, GLuint program, GLuint index, GLint i, oldIndex; if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocation(program)"); + GLenum err = _mesa_is_shader(ctx, program) + ? GL_INVALID_OPERATION : GL_INVALID_VALUE; + _mesa_error(ctx, err, "glBindAttribLocation(program)"); return; } @@ -458,6 +485,11 @@ _mesa_bind_attrib_location(GLcontext *ctx, GLuint program, GLuint index, return; } + if (index >= ctx->Const.VertexProgram.MaxAttribs) { + _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocation(index)"); + return; + } + if (shProg->LinkStatus) { /* get current index/location for the attribute */ oldIndex = _mesa_get_attrib_location(ctx, program, name); @@ -946,22 +978,6 @@ _mesa_get_uniform_location(GLcontext *ctx, GLuint program, const GLchar *name) } -static GLboolean -_mesa_is_program(GLcontext *ctx, GLuint name) -{ - struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name); - return shProg ? GL_TRUE : GL_FALSE; -} - - -static GLboolean -_mesa_is_shader(GLcontext *ctx, GLuint name) -{ - struct gl_shader *shader = _mesa_lookup_shader(ctx, name); - return shader ? GL_TRUE : GL_FALSE; -} - - /** * Called via ctx->Driver.ShaderSource() -- cgit v1.2.3 From 3dc6591a7c85b6a05551ce91b69e57d23148bf57 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 3 Jul 2008 15:40:38 -0600 Subject: mesa: fix problem freeing framebuffer/renderbuffer objects Basically, set up no-op Delete() methods for the DummyFrame/Renderbuffer objects. --- src/mesa/main/context.c | 1 + src/mesa/main/fbobject.c | 25 +++++++++++++++++++++++-- src/mesa/main/fbobject.h | 7 +++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 2c387d8e2cb..3dec27b6bd1 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -983,6 +983,7 @@ init_attrib_groups(GLcontext *ctx) _mesa_init_debug( ctx ); _mesa_init_display_list( ctx ); _mesa_init_eval( ctx ); + _mesa_init_fbobjects( ctx ); _mesa_init_feedback( ctx ); _mesa_init_fog( ctx ); _mesa_init_histogram( ctx ); diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index 8e9948cb45d..6ef90578c12 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.5.1 + * Version: 7.1 * - * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2008 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"), @@ -66,6 +66,27 @@ static struct gl_renderbuffer DummyRenderbuffer; (TARGET) <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z) +static void +delete_dummy_renderbuffer(struct gl_renderbuffer *rb) +{ + /* no op */ +} + +static void +delete_dummy_framebuffer(struct gl_framebuffer *fb) +{ + /* no op */ +} + + +void +_mesa_init_fbobjects(GLcontext *ctx) +{ + DummyFramebuffer.Delete = delete_dummy_framebuffer; + DummyRenderbuffer.Delete = delete_dummy_renderbuffer; +} + + /** * Helper routine for getting a gl_renderbuffer. */ diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h index 782ad8cb180..b6154719abc 100644 --- a/src/mesa/main/fbobject.h +++ b/src/mesa/main/fbobject.h @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.5 + * Version: 7.1 * - * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2008 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"), @@ -27,6 +27,9 @@ #define FBOBJECT_H +extern void +_mesa_init_fbobjects(GLcontext *ctx); + extern struct gl_renderbuffer * _mesa_lookup_renderbuffer(GLcontext *ctx, GLuint id); -- cgit v1.2.3 From 011185396b1bb13fcba6619912948bbd2154936d Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 3 Jul 2008 16:02:05 -0600 Subject: mesa: fix some error codes in _mesa_ShaderSourceARB() --- src/mesa/main/shaders.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mesa/main/shaders.c b/src/mesa/main/shaders.c index 7bf88087670..b7b2f791a52 100644 --- a/src/mesa/main/shaders.c +++ b/src/mesa/main/shaders.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.5.3 + * Version: 7.1 * - * Copyright (C) 2004-2007 Brian Paul All Rights Reserved. + * Copyright (C) 2004-2008 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"), @@ -382,7 +382,7 @@ _mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count, GLsizei i, totalLength; GLcharARB *source; - if (string == NULL) { + if (!shaderObj || string == NULL) { _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB"); return; } @@ -400,7 +400,7 @@ _mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count, for (i = 0; i < count; i++) { if (string[i] == NULL) { _mesa_free((GLvoid *) offsets); - _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB(null string)"); + _mesa_error(ctx, GL_INVALID_OPERATION, "glShaderSourceARB(null string)"); return; } if (length == NULL || length[i] < 0) -- cgit v1.2.3 From 530df581dd1a502041b44afee8023a09d5b7e59f Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 3 Jul 2008 16:21:11 -0600 Subject: mesa: fix various error codes --- src/mesa/shader/shader_api.c | 211 +++++++++++++++++++++++++------------------ 1 file changed, 123 insertions(+), 88 deletions(-) diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index eea44eb92a6..3a067fe3e11 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -212,6 +212,35 @@ _mesa_lookup_shader_program(GLcontext *ctx, GLuint name) } +/** + * As above, but record an error if program is not found. + */ +static struct gl_shader_program * +_mesa_lookup_shader_program_err(GLcontext *ctx, GLuint name, + const char *caller) +{ + if (!name) { + _mesa_error(ctx, GL_INVALID_VALUE, caller); + return NULL; + } + else { + struct gl_shader_program *shProg = (struct gl_shader_program *) + _mesa_HashLookup(ctx->Shared->ShaderObjects, name); + if (!shProg) { + _mesa_error(ctx, GL_INVALID_VALUE, caller); + return NULL; + } + if (shProg->Type != GL_SHADER_PROGRAM_MESA) { + _mesa_error(ctx, GL_INVALID_OPERATION, caller); + return NULL; + } + return shProg; + } +} + + + + /** * Allocate a new gl_shader object, initialize it. */ @@ -314,6 +343,33 @@ _mesa_lookup_shader(GLcontext *ctx, GLuint name) } +/** + * As above, but record an error if shader is not found. + */ +static struct gl_shader * +_mesa_lookup_shader_err(GLcontext *ctx, GLuint name, const char *caller) +{ + if (!name) { + _mesa_error(ctx, GL_INVALID_VALUE, caller); + return NULL; + } + else { + struct gl_shader *sh = (struct gl_shader *) + _mesa_HashLookup(ctx->Shared->ShaderObjects, name); + if (!sh) { + _mesa_error(ctx, GL_INVALID_VALUE, caller); + return NULL; + } + if (sh->Type == GL_SHADER_PROGRAM_MESA) { + _mesa_error(ctx, GL_INVALID_OPERATION, caller); + return NULL; + } + return sh; + } +} + + + /** * Initialize context's shader state. */ @@ -382,29 +438,20 @@ _mesa_is_shader(GLcontext *ctx, GLuint name) static void _mesa_attach_shader(GLcontext *ctx, GLuint program, GLuint shader) { - struct gl_shader_program *shProg - = _mesa_lookup_shader_program(ctx, program); - struct gl_shader *sh = _mesa_lookup_shader(ctx, shader); - GLuint n; - GLuint i; + struct gl_shader_program *shProg; + struct gl_shader *sh; + GLuint i, n; - if (!shProg) { - GLenum err = _mesa_is_shader(ctx, program) - ? GL_INVALID_OPERATION : GL_INVALID_VALUE; - _mesa_error(ctx, err, "glAttachShader(bad program or shader name)"); + shProg = _mesa_lookup_shader_program_err(ctx, program, "glAttachShader"); + if (!shProg) return; - } + sh = _mesa_lookup_shader_err(ctx, shader, "glAttachShader"); if (!sh) { - GLenum err = _mesa_is_program(ctx, shader) - ? GL_INVALID_OPERATION : GL_INVALID_VALUE; - _mesa_error(ctx, err, "glAttachShader(bad program or shader name)"); return; } - n = shProg->NumShaders; - for (i = 0; i < n; i++) { if (shProg->Shaders[i] == sh) { /* already attached */ @@ -434,10 +481,9 @@ _mesa_get_attrib_location(GLcontext *ctx, GLuint program, const GLchar *name) { struct gl_shader_program *shProg - = _mesa_lookup_shader_program(ctx, program); + = _mesa_lookup_shader_program_err(ctx, program, "glGetAttribLocation"); if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttribLocation"); return -1; } @@ -464,15 +510,13 @@ static void _mesa_bind_attrib_location(GLcontext *ctx, GLuint program, GLuint index, const GLchar *name) { - struct gl_shader_program *shProg - = _mesa_lookup_shader_program(ctx, program); + struct gl_shader_program *shProg; const GLint size = -1; /* unknown size */ GLint i, oldIndex; + shProg = _mesa_lookup_shader_program_err(ctx, program, + "glBindAttribLocation"); if (!shProg) { - GLenum err = _mesa_is_shader(ctx, program) - ? GL_INVALID_OPERATION : GL_INVALID_VALUE; - _mesa_error(ctx, err, "glBindAttribLocation(program)"); return; } @@ -571,11 +615,9 @@ _mesa_delete_program2(GLcontext *ctx, GLuint name) */ struct gl_shader_program *shProg; - shProg = _mesa_lookup_shader_program(ctx, name); - if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteProgram(name)"); + shProg = _mesa_lookup_shader_program_err(ctx, name, "glDeleteProgram"); + if (!shProg) return; - } shProg->DeletePending = GL_TRUE; @@ -587,10 +629,11 @@ _mesa_delete_program2(GLcontext *ctx, GLuint name) static void _mesa_delete_shader(GLcontext *ctx, GLuint shader) { - struct gl_shader *sh = _mesa_lookup_shader(ctx, shader); - if (!sh) { + struct gl_shader *sh; + + sh = _mesa_lookup_shader_err(ctx, shader, "glDeleteShader"); + if (!sh) return; - } sh->DeletePending = GL_TRUE; @@ -602,16 +645,13 @@ _mesa_delete_shader(GLcontext *ctx, GLuint shader) static void _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader) { - struct gl_shader_program *shProg - = _mesa_lookup_shader_program(ctx, program); + struct gl_shader_program *shProg; GLuint n; GLuint i, j; - if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, - "glDetachShader(bad program or shader name)"); + shProg = _mesa_lookup_shader_program_err(ctx, program, "glDetachShader"); + if (!shProg) return; - } n = shProg->NumShaders; @@ -620,7 +660,7 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader) /* found it */ struct gl_shader **newList; - /* derefernce */ + /* release */ _mesa_reference_shader(ctx, &shProg->Shaders[i], NULL); /* alloc new, smaller array */ @@ -656,8 +696,17 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader) } /* not found */ - _mesa_error(ctx, GL_INVALID_VALUE, - "glDetachShader(shader not found)"); + { + GLenum err; + if (_mesa_is_shader(ctx, shader)) + err = GL_INVALID_OPERATION; + else if (_mesa_is_program(ctx, shader)) + err = GL_INVALID_OPERATION; + else + err = GL_INVALID_VALUE; + _mesa_error(ctx, err, "glDetachProgram(shader)"); + return; + } } @@ -669,14 +718,12 @@ _mesa_get_active_attrib(GLcontext *ctx, GLuint program, GLuint index, static const GLenum vec_types[] = { GL_FLOAT, GL_FLOAT_VEC2, GL_FLOAT_VEC3, GL_FLOAT_VEC4 }; - struct gl_shader_program *shProg - = _mesa_lookup_shader_program(ctx, program); + struct gl_shader_program *shProg; GLint sz; - if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib"); + shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveAttrib"); + if (!shProg) return; - } if (!shProg->Attributes || index >= shProg->Attributes->NumParameters) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)"); @@ -701,15 +748,13 @@ _mesa_get_active_uniform(GLcontext *ctx, GLuint program, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLchar *nameOut) { - const struct gl_shader_program *shProg - = _mesa_lookup_shader_program(ctx, program); + const struct gl_shader_program *shProg; const struct gl_program *prog; GLint progPos; - if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniform"); + shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform"); + if (!shProg) return; - } if (!shProg->Uniforms || index >= shProg->Uniforms->NumUniforms) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniform(index)"); @@ -748,19 +793,16 @@ static void _mesa_get_attached_shaders(GLcontext *ctx, GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj) { - struct gl_shader_program *shProg - = _mesa_lookup_shader_program(ctx, program); + struct gl_shader_program *shProg = + _mesa_lookup_shader_program_err(ctx, program, "glGetAttachedShaders"); if (shProg) { - GLint i; - for (i = 0; i < maxCount && i < shProg->NumShaders; i++) { + GLuint i; + for (i = 0; i < (GLuint) maxCount && i < shProg->NumShaders; i++) { obj[i] = shProg->Shaders[i]->Name; } if (count) *count = i; } - else { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedShaders"); - } } @@ -841,10 +883,9 @@ _mesa_get_programiv(GLcontext *ctx, GLuint program, static void _mesa_get_shaderiv(GLcontext *ctx, GLuint name, GLenum pname, GLint *params) { - struct gl_shader *shader = _mesa_lookup_shader(ctx, name); + struct gl_shader *shader = _mesa_lookup_shader_err(ctx, name, "glGetShaderiv"); if (!shader) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderiv(shader)"); return; } @@ -905,14 +946,9 @@ static void _mesa_get_shader_source(GLcontext *ctx, GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *sourceOut) { - struct gl_shader *sh = _mesa_lookup_shader(ctx, shader); + struct gl_shader *sh; + sh = _mesa_lookup_shader_err(ctx, shader, "glGetShaderSource"); if (!sh) { - GLenum err; - if (_mesa_lookup_shader_program(ctx, shader)) - err = GL_INVALID_OPERATION; - else - err = GL_INVALID_VALUE; - _mesa_error(ctx, err, "glGetShaderSource(shader)"); return; } copy_string(sourceOut, maxLength, length, sh->Source); @@ -969,11 +1005,16 @@ _mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location, static GLint _mesa_get_uniform_location(GLcontext *ctx, GLuint program, const GLchar *name) { - struct gl_shader_program *shProg - = _mesa_lookup_shader_program(ctx, program); + struct gl_shader_program *shProg = + _mesa_lookup_shader_program_err(ctx, program, "glGetUniformLocation"); + if (!shProg) return -1; + /* XXX we should return -1 if the uniform was declared, but not + * actually used. + */ + return _mesa_lookup_uniform(shProg->Uniforms, name); } @@ -985,16 +1026,11 @@ _mesa_get_uniform_location(GLcontext *ctx, GLuint program, const GLchar *name) static void _mesa_shader_source(GLcontext *ctx, GLuint shader, const GLchar *source) { - struct gl_shader *sh = _mesa_lookup_shader(ctx, shader); - if (!sh) { - GLenum err; - if (_mesa_lookup_shader_program(ctx, shader)) - err = GL_INVALID_OPERATION; - else - err = GL_INVALID_VALUE; - _mesa_error(ctx, err, "glShaderSource(shaderObj)"); + struct gl_shader *sh; + + sh = _mesa_lookup_shader_err(ctx, shader, "glShaderSource"); + if (!sh) return; - } /* free old shader source string and install new one */ if (sh->Source) { @@ -1011,12 +1047,11 @@ _mesa_shader_source(GLcontext *ctx, GLuint shader, const GLchar *source) static void _mesa_compile_shader(GLcontext *ctx, GLuint shaderObj) { - struct gl_shader *sh = _mesa_lookup_shader(ctx, shaderObj); + struct gl_shader *sh; - if (!sh) { - _mesa_error(ctx, GL_INVALID_VALUE, "glCompileShader(shaderObj)"); + sh = _mesa_lookup_shader_err(ctx, shaderObj, "glCompileShader"); + if (!sh) return; - } sh->CompileStatus = _slang_compile(ctx, sh); } @@ -1030,11 +1065,9 @@ _mesa_link_program(GLcontext *ctx, GLuint program) { struct gl_shader_program *shProg; - shProg = _mesa_lookup_shader_program(ctx, program); - if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, "glLinkProgram(program)"); + shProg = _mesa_lookup_shader_program_err(ctx, program, "glLinkProgram"); + if (!shProg) return; - } FLUSH_VERTICES(ctx, _NEW_PROGRAM); @@ -1059,10 +1092,12 @@ _mesa_use_program(GLcontext *ctx, GLuint program) FLUSH_VERTICES(ctx, _NEW_PROGRAM); if (program) { - shProg = _mesa_lookup_shader_program(ctx, program); + shProg = _mesa_lookup_shader_program_err(ctx, program, "glUseProgram"); if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, - "glUseProgramObjectARB(programObj)"); + return; + } + if (!shProg->LinkStatus) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glUseProgram"); return; } } @@ -1107,7 +1142,7 @@ update_textures_used(struct gl_program *prog) */ static void set_program_uniform(GLcontext *ctx, struct gl_program *program, GLint location, - GLenum type, GLint count, GLint elems, const void *values) + GLenum type, GLsizei count, GLint elems, const void *values) { if (program->Parameters->Parameters[location].Type == PROGRAM_SAMPLER) { /* This controls which texture unit which is used by a sampler */ @@ -1139,7 +1174,7 @@ set_program_uniform(GLcontext *ctx, struct gl_program *program, GLint location, } else { /* ordinary uniform variable */ - GLint k, i; + GLsizei k, i; if (count * elems > program->Parameters->Parameters[location].Size) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(count too large)"); -- cgit v1.2.3 From 0c1e96e6d38c0acfd3fe6b4116f2a67f5bf62136 Mon Sep 17 00:00:00 2001 From: "Xiang, Haihao" Date: Fri, 4 Jul 2008 09:53:51 +0800 Subject: mesa: fix polygon offset issue (bug #12061) --- src/mesa/tnl_dd/t_dd_tritmp.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mesa/tnl_dd/t_dd_tritmp.h b/src/mesa/tnl_dd/t_dd_tritmp.h index 2bb890593b1..1ae70f4059f 100644 --- a/src/mesa/tnl_dd/t_dd_tritmp.h +++ b/src/mesa/tnl_dd/t_dd_tritmp.h @@ -267,7 +267,7 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) GLfloat bc = b * ic; if ( ac < 0.0f ) ac = -ac; if ( bc < 0.0f ) bc = -bc; - offset += MAX2( ac, bc ) * ctx->Polygon.OffsetFactor; + offset += MAX2( ac, bc ) * ctx->Polygon.OffsetFactor / ctx->DrawBuffer->_MRD; } offset *= ctx->DrawBuffer->_MRD * (REVERSE_DEPTH ? -1.0 : 1.0); } @@ -539,7 +539,7 @@ static void TAG(quadr)( GLcontext *ctx, GLfloat bc = b * ic; if ( ac < 0.0f ) ac = -ac; if ( bc < 0.0f ) bc = -bc; - offset += MAX2( ac, bc ) * ctx->Polygon.OffsetFactor; + offset += MAX2( ac, bc ) * ctx->Polygon.OffsetFactor / ctx->DrawBuffer->_MRD; } offset *= ctx->DrawBuffer->_MRD * (REVERSE_DEPTH ? -1.0 : 1.0); } -- cgit v1.2.3 From 9157b1e09a8948e9e084ed3ce2a3537a6bac2005 Mon Sep 17 00:00:00 2001 From: Alan Hourihane Date: Fri, 4 Jul 2008 13:54:49 +0100 Subject: glcontextmodes.c is required remove the reference in .gitignore --- src/glx/x11/.gitignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/glx/x11/.gitignore diff --git a/src/glx/x11/.gitignore b/src/glx/x11/.gitignore deleted file mode 100644 index ffc14ab7660..00000000000 --- a/src/glx/x11/.gitignore +++ /dev/null @@ -1 +0,0 @@ -glcontextmodes.c -- cgit v1.2.3 From b931a0c1d9128b7fb402915089e1fd2496f65349 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 4 Jul 2008 09:55:48 -0600 Subject: mesa: remove incorrect assertion --- src/mesa/main/fbobject.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index 6ef90578c12..4190a95e419 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -180,7 +180,6 @@ _mesa_remove_attachment(GLcontext *ctx, struct gl_renderbuffer_attachment *att) ASSERT(!att->Texture); } if (att->Type == GL_TEXTURE || att->Type == GL_RENDERBUFFER_EXT) { - ASSERT(att->Renderbuffer); ASSERT(!att->Texture); _mesa_reference_renderbuffer(&att->Renderbuffer, NULL); /* unbind */ ASSERT(!att->Renderbuffer); -- cgit v1.2.3 From e06565b103828b276fb10e3c4b2d94b36de05987 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 4 Jul 2008 09:58:55 -0600 Subject: mesa: generate GL_INVALID_OPERATION in _mesa_get_uniform_location() if program isn't linked --- src/mesa/shader/shader_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index 3a067fe3e11..6cfdf57a494 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -1011,6 +1011,11 @@ _mesa_get_uniform_location(GLcontext *ctx, GLuint program, const GLchar *name) if (!shProg) return -1; + if (shProg->LinkStatus == GL_FALSE) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfv(program)"); + return -1; + } + /* XXX we should return -1 if the uniform was declared, but not * actually used. */ -- cgit v1.2.3 From 1f4d0748ba92ff2c44faadc31a99f07e1bea28fb Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 4 Jul 2008 10:05:39 -0600 Subject: GLSL-related bug fixes --- docs/relnotes-7.1.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/relnotes-7.1.html b/docs/relnotes-7.1.html index 7720ca19d06..c9d7cddcab0 100644 --- a/docs/relnotes-7.1.html +++ b/docs/relnotes-7.1.html @@ -33,6 +33,13 @@ TBD +

Bug fixes

+
    +
  • Fixed a number of minor GLSL intrinsic function/constructor bugs +
  • Fixed some error code/detection bugs in the GLSL-related API functions +
+ +

To Do (someday) items

  • Remove the MEMCPY() and _mesa_memcpy() wrappers and just use memcpy(). -- cgit v1.2.3 From 845e3f701dec29f08e5759969c165b3d812e5afe Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sun, 29 Jun 2008 14:53:04 +0200 Subject: Enable TexGen based on InputsRead when a fragment program is active The old behaviour depended on which texture images the fragment program reads from, which seems to contradict the shader specifications. Note: Piglit's general/texgen test checks for this problem. --- src/mesa/main/texstate.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index 626c2648631..a6c92cb1af4 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -2999,6 +2999,24 @@ update_texture_state( GLcontext *ctx ) _mesa_problem(ctx, "invalid Alpha combine mode in update_texture_state"); break; } + } + + /* Determine which texture coordinate sets are actually needed */ + if (fprog) { + const GLuint coordMask = (1 << MAX_TEXTURE_COORD_UNITS) - 1; + ctx->Texture._EnabledCoordUnits + = (fprog->Base.InputsRead >> FRAG_ATTRIB_TEX0) & coordMask; + } + else { + ctx->Texture._EnabledCoordUnits = ctx->Texture._EnabledUnits; + } + + /* Setup texgen for those texture coordinate sets that are in use */ + for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) { + struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; + + if (!(ctx->Texture._EnabledCoordUnits & (1 << unit))) + continue; if (texUnit->TexGenEnabled) { if (texUnit->TexGenEnabled & S_BIT) { @@ -3021,16 +3039,6 @@ update_texture_state( GLcontext *ctx ) if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) ctx->Texture._TexMatEnabled |= ENABLE_TEXMAT(unit); } - - /* Determine which texture coordinate sets are actually needed */ - if (fprog) { - const GLuint coordMask = (1 << MAX_TEXTURE_COORD_UNITS) - 1; - ctx->Texture._EnabledCoordUnits - = (fprog->Base.InputsRead >> FRAG_ATTRIB_TEX0) & coordMask; - } - else { - ctx->Texture._EnabledCoordUnits = ctx->Texture._EnabledUnits; - } } -- cgit v1.2.3 From e187627c1d3b06e5d185989dd3d37f09a8953a1b Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Fri, 4 Jul 2008 18:18:19 +0200 Subject: r300: Fix depth texture in compare mode Missed the homogenous divide of R by Q before... --- src/mesa/drivers/dri/r300/r300_fragprog.c | 57 +++++++++++++++++------------ src/mesa/drivers/dri/r300/r500_fragprog.c | 59 ++++++++++++++++++------------- 2 files changed, 68 insertions(+), 48 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c index 6d24d266fec..0d1428f0bc9 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog.c @@ -177,43 +177,54 @@ static GLboolean transform_TEX( compiler->fp->mesa_program.Base.ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode; + int rcptemp = radeonCompilerAllocateTemporary(context->compiler); tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 2); - - tgt[0].Opcode = OPCODE_ADD; - tgt[0].DstReg = inst.DstReg; - tgt[0].DstReg.WriteMask = orig_inst->DstReg.WriteMask; - tgt[0].SrcReg[0].File = PROGRAM_TEMPORARY; - tgt[0].SrcReg[0].Index = inst.DstReg.Index; + context->dest->NumInstructions, 3); + + tgt[0].Opcode = OPCODE_RCP; + tgt[0].DstReg.File = PROGRAM_TEMPORARY; + tgt[0].DstReg.Index = rcptemp; + tgt[0].DstReg.WriteMask = WRITEMASK_W; + tgt[0].SrcReg[0] = inst.SrcReg[0]; + tgt[0].SrcReg[0].Swizzle = SWIZZLE_WWWW; + + tgt[1].Opcode = OPCODE_MAD; + tgt[1].DstReg = inst.DstReg; + tgt[1].DstReg.WriteMask = orig_inst->DstReg.WriteMask; + tgt[1].SrcReg[0] = inst.SrcReg[0]; + tgt[1].SrcReg[0].Swizzle = SWIZZLE_ZZZZ; + tgt[1].SrcReg[1].File = PROGRAM_TEMPORARY; + tgt[1].SrcReg[1].Index = rcptemp; + tgt[1].SrcReg[1].Swizzle = SWIZZLE_WWWW; + tgt[1].SrcReg[2].File = PROGRAM_TEMPORARY; + tgt[1].SrcReg[2].Index = inst.DstReg.Index; if (depthmode == 0) /* GL_LUMINANCE */ - tgt[0].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z); + tgt[1].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z); else if (depthmode == 2) /* GL_ALPHA */ - tgt[0].SrcReg[0].Swizzle = SWIZZLE_WWWW; - tgt[0].SrcReg[1] = inst.SrcReg[0]; - tgt[0].SrcReg[1].Swizzle = SWIZZLE_ZZZZ; + tgt[1].SrcReg[2].Swizzle = SWIZZLE_WWWW; /* Recall that SrcReg[0] is tex, SrcReg[2] is r and: * r < tex <=> -tex+r < 0 * r >= tex <=> not (-tex+r < 0 */ if (comparefunc == GL_LESS || comparefunc == GL_GEQUAL) - tgt[0].SrcReg[0].NegateBase = tgt[0].SrcReg[0].NegateBase ^ NEGATE_XYZW; + tgt[1].SrcReg[2].NegateBase = tgt[0].SrcReg[2].NegateBase ^ NEGATE_XYZW; else - tgt[0].SrcReg[1].NegateBase = tgt[0].SrcReg[1].NegateBase ^ NEGATE_XYZW; + tgt[1].SrcReg[0].NegateBase = tgt[0].SrcReg[0].NegateBase ^ NEGATE_XYZW; - tgt[1].Opcode = OPCODE_CMP; - tgt[1].DstReg = orig_inst->DstReg; - tgt[1].SrcReg[0].File = PROGRAM_TEMPORARY; - tgt[1].SrcReg[0].Index = tgt[0].DstReg.Index; - tgt[1].SrcReg[1].File = PROGRAM_BUILTIN; - tgt[1].SrcReg[2].File = PROGRAM_BUILTIN; + tgt[2].Opcode = OPCODE_CMP; + tgt[2].DstReg = orig_inst->DstReg; + tgt[2].SrcReg[0].File = PROGRAM_TEMPORARY; + tgt[2].SrcReg[0].Index = tgt[1].DstReg.Index; + tgt[2].SrcReg[1].File = PROGRAM_BUILTIN; + tgt[2].SrcReg[2].File = PROGRAM_BUILTIN; if (comparefunc == GL_LESS || comparefunc == GL_GREATER) { - tgt[1].SrcReg[1].Swizzle = SWIZZLE_1111; - tgt[1].SrcReg[2].Swizzle = SWIZZLE_0000; + tgt[2].SrcReg[1].Swizzle = SWIZZLE_1111; + tgt[2].SrcReg[2].Swizzle = SWIZZLE_0000; } else { - tgt[1].SrcReg[1].Swizzle = SWIZZLE_0000; - tgt[1].SrcReg[2].Swizzle = SWIZZLE_1111; + tgt[2].SrcReg[1].Swizzle = SWIZZLE_0000; + tgt[2].SrcReg[2].Swizzle = SWIZZLE_1111; } } else if (destredirect) { tgt = radeonClauseInsertInstructions(context->compiler, context->dest, diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index 5d72ec2784f..41cb7c6ffcf 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -87,45 +87,54 @@ static GLboolean transform_TEX( compiler->fp->mesa_program.Base.ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode; + int rcptemp = radeonCompilerAllocateTemporary(context->compiler); tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 2); - - tgt[0].Opcode = OPCODE_MAD; - tgt[0].DstReg = inst.DstReg; - tgt[0].DstReg.WriteMask = orig_inst->DstReg.WriteMask; - tgt[0].SrcReg[0].File = PROGRAM_TEMPORARY; - tgt[0].SrcReg[0].Index = inst.DstReg.Index; + context->dest->NumInstructions, 3); + + tgt[0].Opcode = OPCODE_RCP; + tgt[0].DstReg.File = PROGRAM_TEMPORARY; + tgt[0].DstReg.Index = rcptemp; + tgt[0].DstReg.WriteMask = WRITEMASK_W; + tgt[0].SrcReg[0] = inst.SrcReg[0]; + tgt[0].SrcReg[0].Swizzle = SWIZZLE_WWWW; + + tgt[1].Opcode = OPCODE_MAD; + tgt[1].DstReg = inst.DstReg; + tgt[1].DstReg.WriteMask = orig_inst->DstReg.WriteMask; + tgt[1].SrcReg[0] = inst.SrcReg[0]; + tgt[1].SrcReg[0].Swizzle = SWIZZLE_ZZZZ; + tgt[1].SrcReg[1].File = PROGRAM_TEMPORARY; + tgt[1].SrcReg[1].Index = rcptemp; + tgt[1].SrcReg[1].Swizzle = SWIZZLE_WWWW; + tgt[1].SrcReg[2].File = PROGRAM_TEMPORARY; + tgt[1].SrcReg[2].Index = inst.DstReg.Index; if (depthmode == 0) /* GL_LUMINANCE */ - tgt[0].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z); + tgt[1].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z); else if (depthmode == 2) /* GL_ALPHA */ - tgt[0].SrcReg[0].Swizzle = SWIZZLE_WWWW; - tgt[0].SrcReg[1].File = PROGRAM_BUILTIN; - tgt[0].SrcReg[1].Swizzle = SWIZZLE_1111; - tgt[0].SrcReg[2] = inst.SrcReg[0]; - tgt[0].SrcReg[2].Swizzle = SWIZZLE_ZZZZ; + tgt[1].SrcReg[2].Swizzle = SWIZZLE_WWWW; /* Recall that SrcReg[0] is tex, SrcReg[2] is r and: * r < tex <=> -tex+r < 0 * r >= tex <=> not (-tex+r < 0 */ if (comparefunc == GL_LESS || comparefunc == GL_GEQUAL) - tgt[0].SrcReg[0].NegateBase = tgt[0].SrcReg[0].NegateBase ^ NEGATE_XYZW; + tgt[1].SrcReg[2].NegateBase = tgt[0].SrcReg[2].NegateBase ^ NEGATE_XYZW; else - tgt[0].SrcReg[2].NegateBase = tgt[0].SrcReg[2].NegateBase ^ NEGATE_XYZW; + tgt[1].SrcReg[0].NegateBase = tgt[0].SrcReg[0].NegateBase ^ NEGATE_XYZW; - tgt[1].Opcode = OPCODE_CMP; - tgt[1].DstReg = orig_inst->DstReg; - tgt[1].SrcReg[0].File = PROGRAM_TEMPORARY; - tgt[1].SrcReg[0].Index = tgt[0].DstReg.Index; - tgt[1].SrcReg[1].File = PROGRAM_BUILTIN; - tgt[1].SrcReg[2].File = PROGRAM_BUILTIN; + tgt[2].Opcode = OPCODE_CMP; + tgt[2].DstReg = orig_inst->DstReg; + tgt[2].SrcReg[0].File = PROGRAM_TEMPORARY; + tgt[2].SrcReg[0].Index = tgt[1].DstReg.Index; + tgt[2].SrcReg[1].File = PROGRAM_BUILTIN; + tgt[2].SrcReg[2].File = PROGRAM_BUILTIN; if (comparefunc == GL_LESS || comparefunc == GL_GREATER) { - tgt[1].SrcReg[1].Swizzle = SWIZZLE_1111; - tgt[1].SrcReg[2].Swizzle = SWIZZLE_0000; + tgt[2].SrcReg[1].Swizzle = SWIZZLE_1111; + tgt[2].SrcReg[2].Swizzle = SWIZZLE_0000; } else { - tgt[1].SrcReg[1].Swizzle = SWIZZLE_0000; - tgt[1].SrcReg[2].Swizzle = SWIZZLE_1111; + tgt[2].SrcReg[1].Swizzle = SWIZZLE_0000; + tgt[2].SrcReg[2].Swizzle = SWIZZLE_1111; } } else if (destredirect) { tgt = radeonClauseInsertInstructions(context->compiler, context->dest, -- cgit v1.2.3 From 82635aad4203d44648dd6e345ec2b5e21ff06510 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 18:03:44 +0200 Subject: _mesa_clone_program: Copy ShadowSamplers --- src/mesa/shader/program.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c index 7048770cf74..376d7ee60d4 100644 --- a/src/mesa/shader/program.c +++ b/src/mesa/shader/program.c @@ -437,6 +437,7 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog) clone->InputsRead = prog->InputsRead; clone->OutputsWritten = prog->OutputsWritten; clone->SamplersUsed = prog->SamplersUsed; + clone->ShadowSamplers = prog->ShadowSamplers; memcpy(clone->TexturesUsed, prog->TexturesUsed, sizeof(prog->TexturesUsed)); if (prog->Parameters) -- cgit v1.2.3 From 09e587fcf3c77860eacf16a45c6cf1a9a54cc605 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 09:31:44 +0200 Subject: r500: Fix blend color. --- src/mesa/drivers/dri/r300/r300_cmdbuf.c | 11 ++++++++--- src/mesa/drivers/dri/r300/r300_state.c | 26 +++++++++++++++++--------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.c index d378045b983..4dc31614492 100644 --- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c +++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c @@ -405,7 +405,7 @@ void r300InitCmdBuf(r300ContextPtr r300) ALLOC_STATE(ri, always, R500_RI_CMDSIZE, 0); r300->hw.ri.cmd[R300_RI_CMD_0] = cmdpacket0(R500_RS_IP_0, 16); for (i = 0; i < 8; i++) { - r300->hw.ri.cmd[R300_RI_CMD_0 + i +1] = + r300->hw.ri.cmd[R300_RI_CMD_0 + i +1] = (R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_S_SHIFT) | (R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_T_SHIFT) | (R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT) | @@ -470,8 +470,13 @@ void r300InitCmdBuf(r300ContextPtr r300) r300->hw.bld.cmd[R300_BLD_CMD_0] = cmdpacket0(R300_RB3D_CBLEND, 2); ALLOC_STATE(cmk, always, R300_CMK_CMDSIZE, 0); r300->hw.cmk.cmd[R300_CMK_CMD_0] = cmdpacket0(RB3D_COLOR_CHANNEL_MASK, 1); - ALLOC_STATE(blend_color, always, 4, 0); - r300->hw.blend_color.cmd[0] = cmdpacket0(R300_RB3D_BLEND_COLOR, 3); + if (is_r500) { + ALLOC_STATE(blend_color, always, 3, 0); + r300->hw.blend_color.cmd[0] = cmdpacket0(R500_RB3D_CONSTANT_COLOR_AR, 2); + } else { + ALLOC_STATE(blend_color, always, 2, 0); + r300->hw.blend_color.cmd[0] = cmdpacket0(R300_RB3D_BLEND_COLOR, 1); + } ALLOC_STATE(cb, always, R300_CB_CMDSIZE, 0); r300->hw.cb.cmd[R300_CB_CMD_0] = cmdpacket0(R300_RB3D_COLOROFFSET0, 1); r300->hw.cb.cmd[R300_CB_CMD_1] = cmdpacket0(R300_RB3D_COLORPITCH0, 1); diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index 592ee9ccc10..0f7c179de84 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -70,20 +70,28 @@ extern void _tnl_UpdateFixedFunctionProgram(GLcontext * ctx); static void r300BlendColor(GLcontext * ctx, const GLfloat cf[4]) { - GLubyte color[4]; r300ContextPtr rmesa = R300_CONTEXT(ctx); R300_STATECHANGE(rmesa, blend_color); - CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]); - CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]); - CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]); - CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]); + if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) { + GLuint r = IROUND(cf[0]*1023.0f); + GLuint g = IROUND(cf[1]*1023.0f); + GLuint b = IROUND(cf[2]*1023.0f); + GLuint a = IROUND(cf[3]*1023.0f); - rmesa->hw.blend_color.cmd[1] = PACK_COLOR_8888(color[3], color[0], - color[1], color[2]); - rmesa->hw.blend_color.cmd[2] = 0; - rmesa->hw.blend_color.cmd[3] = 0; + rmesa->hw.blend_color.cmd[1] = r | (a << 16); + rmesa->hw.blend_color.cmd[2] = b | (g << 16); + } else { + GLubyte color[4]; + CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]); + CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]); + CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]); + CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]); + + rmesa->hw.blend_color.cmd[1] = PACK_COLOR_8888(color[3], color[0], + color[1], color[2]); + } } /** -- cgit v1.2.3 From 13c44679ad42886544036f49597dcfc0d4b7e925 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 10:24:27 +0200 Subject: r500: Fix a mixup in fragment program LRP instruction emit --- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 3dc72af87ab..2266dc3dece 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -942,16 +942,15 @@ static int do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction *f | R500_ALPHA_SRCP_OP_1_MINUS_A0; code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRCP | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_RGB); + | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[2])); code->inst[counter].inst4 |= R500_ALPHA_OP_MAD | R500_ALPHA_ADDRD(dest) | R500_ALPHA_SEL_A_SRCP | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | R500_ALPHA_SWIZ_B_A; + | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[2])); code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD | R500_ALU_RGBA_ADDRD(dest) - | R500_ALU_RGBA_SEL_C_SRC2 | MAKE_SWIZ_RGBA_C(make_rgb_swizzle(fpi->SrcReg[2])) - | R500_ALU_RGBA_ALPHA_SEL_C_SRC2 - | MAKE_SWIZ_ALPHA_C(make_alpha_swizzle(fpi->SrcReg[2])); + | R500_ALU_RGBA_SEL_C_SRC2 | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_RGB) + | R500_ALU_RGBA_ALPHA_SEL_C_SRC2 | R500_ALU_RGBA_A_SWIZ_A; break; case OPCODE_MAD: emit_mad(cs, counter, fpi, 0, 1, 2); -- cgit v1.2.3 From 85b46fbe9cfc8de8871d6adb0b2287c5837d3028 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 10:58:54 +0200 Subject: r500_fragprog: Cleanup some unused variables and code. --- src/mesa/drivers/dri/r300/r500_fragprog.c | 5 --- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 42 +------------------------- 2 files changed, 1 insertion(+), 46 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index 41cb7c6ffcf..fd9769d653d 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -27,11 +27,6 @@ #include "r500_fragprog.h" -static void reset_srcreg(struct prog_src_register* reg) -{ - _mesa_bzero(reg, sizeof(*reg)); - reg->Swizzle = SWIZZLE_NOOP; -} /** * Transform TEX, TXP, TXB, and KIL instructions in the following way: diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 2266dc3dece..19a5cef0843 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -89,27 +89,6 @@ struct reg_lifetime { int scalar_lastread; }; -/** - * Store usage information about an ALU instruction slot during the - * compilation of a fragment program. - */ -#define SLOT_SRC_VECTOR (1<<0) -#define SLOT_SRC_SCALAR (1<<3) -#define SLOT_SRC_BOTH (SLOT_SRC_VECTOR | SLOT_SRC_SCALAR) -#define SLOT_OP_VECTOR (1<<16) -#define SLOT_OP_SCALAR (1<<17) -#define SLOT_OP_BOTH (SLOT_OP_VECTOR | SLOT_OP_SCALAR) - -struct r500_pfs_compile_slot { - /* Bitmask indicating which parts of the slot are used, using SLOT_ constants - defined above */ - unsigned int used; - - /* Selected sources */ - int vsrc[3]; - int ssrc[3]; -}; - /** * Store information during compilation of fragment programs. */ @@ -119,21 +98,9 @@ struct r500_pfs_compile_state { /* number of ALU slots used so far */ int nrslots; - /* Track which (parts of) slots are already filled with instructions */ - struct r500_pfs_compile_slot slot[PFS_MAX_ALU_INST]; - - /* Track the validity of R300 temporaries */ - struct reg_lifetime hwtemps[PFS_NUM_TEMP_REGS]; - /* Used to map Mesa's inputs/temps onto hardware temps */ int temp_in_use; - struct reg_acc temps[PFS_NUM_TEMP_REGS]; struct reg_acc inputs[32]; /* don't actually need 32... */ - - /* Track usage of hardware temps, for register allocation, - * indirection detection, etc. */ - GLuint used_in_node; - GLuint dest_in_node; }; /* @@ -1328,7 +1295,7 @@ static void init_program(struct r500_pfs_compile_state *cs) struct prog_instruction *fpi; GLuint InputsRead = mp->Base.InputsRead; GLuint temps_used = 0; - int i, j; + int i; /* New compile, reset tracking data */ cs->compiler->fp->optimization = @@ -1343,13 +1310,6 @@ static void init_program(struct r500_pfs_compile_state *cs) /* Whether or not we perform any depth writing. */ cs->compiler->fp->writes_depth = GL_FALSE; - for (i = 0; i < PFS_MAX_ALU_INST; i++) { - for (j = 0; j < 3; j++) { - cs->slot[i].vsrc[j] = SRC_CONST; - cs->slot[i].ssrc[j] = SRC_CONST; - } - } - /* Work out what temps the Mesa inputs correspond to, this must match * what setup_rs_unit does, which shouldn't be a problem as rs_unit * configures itself based on the fragprog's InputsRead -- cgit v1.2.3 From dea8719f00ad46ed66b5d4f5e6c0b71e2d1054e9 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 11:53:39 +0200 Subject: r300: Remove clause stuff for now in favour of a cloned generic gl_program --- src/mesa/drivers/dri/r300/r300_fragprog.c | 55 +++--- src/mesa/drivers/dri/r300/r300_fragprog.h | 3 +- src/mesa/drivers/dri/r300/r300_fragprog_emit.c | 19 +- src/mesa/drivers/dri/r300/r500_fragprog.c | 50 +++-- src/mesa/drivers/dri/r300/r500_fragprog.h | 2 +- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 40 ++-- src/mesa/drivers/dri/r300/radeon_program.c | 241 +++---------------------- src/mesa/drivers/dri/r300/radeon_program.h | 103 +---------- src/mesa/drivers/dri/r300/radeon_program_alu.c | 101 +++++------ src/mesa/drivers/dri/r300/radeon_program_alu.h | 3 +- 10 files changed, 157 insertions(+), 460 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c index 0d1428f0bc9..8c49e8ada68 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog.c @@ -68,7 +68,7 @@ static void reset_srcreg(struct prog_src_register* reg) * be reused. */ static GLboolean transform_TEX( - struct radeon_program_transform_context* context, + GLcontext *ctx, struct gl_program *p, struct prog_instruction* orig_inst, void* data) { struct r300_fragment_program_compiler *compiler = @@ -84,12 +84,11 @@ static GLboolean transform_TEX( return GL_FALSE; if (inst.Opcode != OPCODE_KIL && - compiler->fp->mesa_program.Base.ShadowSamplers & (1 << inst.TexSrcUnit)) { + p->ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; if (comparefunc == GL_NEVER || comparefunc == GL_ALWAYS) { - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 1); + tgt = radeonAppendInstructions(p, 1); tgt->Opcode = OPCODE_MOV; tgt->DstReg = inst.DstReg; @@ -99,7 +98,7 @@ static GLboolean transform_TEX( } inst.DstReg.File = PROGRAM_TEMPORARY; - inst.DstReg.Index = radeonCompilerAllocateTemporary(context->compiler); + inst.DstReg.Index = _mesa_find_free_register(p, PROGRAM_TEMPORARY); inst.DstReg.WriteMask = WRITEMASK_XYZW; } @@ -114,7 +113,7 @@ static GLboolean transform_TEX( 0 }; - int tempreg = radeonCompilerAllocateTemporary(context->compiler); + int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); int factor_index; tokens[2] = inst.TexSrcUnit; @@ -122,8 +121,7 @@ static GLboolean transform_TEX( _mesa_add_state_reference( compiler->fp->mesa_program.Base.Parameters, tokens); - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 1); + tgt = radeonAppendInstructions(p, 1); tgt->Opcode = OPCODE_MUL; tgt->DstReg.File = PROGRAM_TEMPORARY; @@ -142,10 +140,9 @@ static GLboolean transform_TEX( */ if (inst.SrcReg[0].Swizzle != SWIZZLE_NOOP || inst.SrcReg[0].Abs || inst.SrcReg[0].NegateBase || inst.SrcReg[0].NegateAbs) { - int tempreg = radeonCompilerAllocateTemporary(context->compiler); + int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 1); + tgt = radeonAppendInstructions(p, 1); tgt->Opcode = OPCODE_MOV; tgt->DstReg.File = PROGRAM_TEMPORARY; @@ -160,7 +157,7 @@ static GLboolean transform_TEX( if (inst.Opcode != OPCODE_KIL) { if (inst.DstReg.File != PROGRAM_TEMPORARY || inst.DstReg.WriteMask != WRITEMASK_XYZW) { - int tempreg = radeonCompilerAllocateTemporary(context->compiler); + int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); inst.DstReg.File = PROGRAM_TEMPORARY; inst.DstReg.Index = tempreg; @@ -169,18 +166,16 @@ static GLboolean transform_TEX( } } - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 1); + tgt = radeonAppendInstructions(p, 1); _mesa_copy_instructions(tgt, &inst, 1); if (inst.Opcode != OPCODE_KIL && - compiler->fp->mesa_program.Base.ShadowSamplers & (1 << inst.TexSrcUnit)) { + p->ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode; - int rcptemp = radeonCompilerAllocateTemporary(context->compiler); + int rcptemp = _mesa_find_free_register(p, PROGRAM_TEMPORARY); - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 3); + tgt = radeonAppendInstructions(p, 3); tgt[0].Opcode = OPCODE_RCP; tgt[0].DstReg.File = PROGRAM_TEMPORARY; @@ -227,8 +222,7 @@ static GLboolean transform_TEX( tgt[2].SrcReg[2].Swizzle = SWIZZLE_1111; } } else if (destredirect) { - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 1); + tgt = radeonAppendInstructions(p, 1); tgt->Opcode = OPCODE_MOV; tgt->DstReg = orig_inst->DstReg; @@ -274,9 +268,10 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) struct prog_instruction *fpi; GLuint window_index; int i = 0; - GLuint tempregi = radeonCompilerAllocateTemporary(&compiler->compiler); + GLuint tempregi = _mesa_find_free_register(compiler->program, PROGRAM_TEMPORARY); - fpi = radeonClauseInsertInstructions(&compiler->compiler, &compiler->compiler.Clauses[0], 0, 3); + _mesa_insert_instructions(compiler->program, 0, 3); + fpi = compiler->program->Instructions; /* perspective divide */ fpi[i].Opcode = OPCODE_RCP; @@ -333,7 +328,7 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); i++; - for (; i < compiler->compiler.Clauses[0].NumInstructions; ++i) { + for (; i < compiler->program->NumInstructions; ++i) { int reg; for (reg = 0; reg < 3; reg++) { if (fpi[i].SrcReg[reg].File == PROGRAM_INPUT && @@ -404,8 +399,7 @@ void r300TranslateFragmentShader(r300ContextPtr r300, compiler.r300 = r300; compiler.fp = fp; compiler.code = &fp->code; - - radeonCompilerInit(&compiler.compiler, r300->radeon.glCtx, &fp->mesa_program.Base); + compiler.program = _mesa_clone_program(r300->radeon.glCtx, &fp->mesa_program.Base); insert_WPOS_trailer(&compiler); @@ -413,19 +407,20 @@ void r300TranslateFragmentShader(r300ContextPtr r300, { &transform_TEX, &compiler }, { &radeonTransformALU, 0 } }; - radeonClauseLocalTransform(&compiler.compiler, - &compiler.compiler.Clauses[0], + radeonLocalTransform( + r300->radeon.glCtx, + compiler.program, 2, transformations); if (RADEON_DEBUG & DEBUG_PIXEL) { - _mesa_printf("Compiler state after transformations:\n"); - radeonCompilerDump(&compiler.compiler); + _mesa_printf("Program after transformations:\n"); + _mesa_print_program(compiler.program); } if (!r300FragmentProgramEmit(&compiler)) fp->error = GL_TRUE; - radeonCompilerCleanup(&compiler.compiler); + _mesa_reference_program(r300->radeon.glCtx, &compiler.program, NULL); if (!fp->error) fp->translated = GL_TRUE; diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.h b/src/mesa/drivers/dri/r300/r300_fragprog.h index 7c1e210b044..c76ae627015 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog.h +++ b/src/mesa/drivers/dri/r300/r300_fragprog.h @@ -146,10 +146,9 @@ struct r300_fragment_program_compiler { r300ContextPtr r300; struct r300_fragment_program *fp; struct r300_fragment_program_code *code; - struct radeon_compiler compiler; + struct gl_program *program; }; -extern void r300FPTransformTextures(struct r300_fragment_program_compiler *compiler); extern GLboolean r300FragmentProgramEmit(struct r300_fragment_program_compiler *compiler); diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c index d72b92832c9..889631f7054 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c @@ -1887,18 +1887,13 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst static GLboolean parse_program(struct r300_pfs_compile_state *cs) { COMPILE_STATE; - int clauseidx; + struct prog_instruction* fpi; - for (clauseidx = 0; clauseidx < cs->compiler->compiler.NumClauses; ++clauseidx) { - struct radeon_clause* clause = &cs->compiler->compiler.Clauses[clauseidx]; - int ip; + for(fpi = cs->compiler->program->Instructions; fpi->Opcode != OPCODE_END; ++fpi) { + emit_instruction(cs, fpi); - for(ip = 0; ip < clause->NumInstructions; ++ip) { - emit_instruction(cs, clause->Instructions + ip); - - if (fp->error) - return GL_FALSE; - } + if (fp->error) + return GL_FALSE; } return GL_TRUE; @@ -1988,8 +1983,8 @@ static void init_program(struct r300_pfs_compile_state *cs) /* Pre-parse the program, grabbing refcounts on input/temp regs. * That way, we can free up the reg when it's no longer needed */ - for (i = 0; i < cs->compiler->compiler.Clauses[0].NumInstructions; ++i) { - struct prog_instruction *fpi = cs->compiler->compiler.Clauses[0].Instructions + i; + for (i = 0; i < cs->compiler->program->NumInstructions; ++i) { + struct prog_instruction *fpi = cs->compiler->program->Instructions + i; int idx; for (j = 0; j < 3; j++) { diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index fd9769d653d..62e06ea52c0 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -36,7 +36,7 @@ * */ static GLboolean transform_TEX( - struct radeon_program_transform_context* context, + GLcontext *ctx, struct gl_program *p, struct prog_instruction* orig_inst, void* data) { struct r500_fragment_program_compiler *compiler = @@ -53,12 +53,11 @@ static GLboolean transform_TEX( /* ARB_shadow & EXT_shadow_funcs */ if (inst.Opcode != OPCODE_KIL && - compiler->fp->mesa_program.Base.ShadowSamplers & (1 << inst.TexSrcUnit)) { + p->ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; if (comparefunc == GL_NEVER || comparefunc == GL_ALWAYS) { - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 1); + tgt = radeonAppendInstructions(p, 1); tgt->Opcode = OPCODE_MOV; tgt->DstReg.File = inst.DstReg.File; @@ -70,22 +69,20 @@ static GLboolean transform_TEX( } inst.DstReg.File = PROGRAM_TEMPORARY; - inst.DstReg.Index = radeonCompilerAllocateTemporary(context->compiler); + inst.DstReg.Index = _mesa_find_free_register(p, PROGRAM_TEMPORARY); inst.DstReg.WriteMask = WRITEMASK_XYZW; } - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 1); + tgt = radeonAppendInstructions(p, 1); _mesa_copy_instructions(tgt, &inst, 1); if (inst.Opcode != OPCODE_KIL && - compiler->fp->mesa_program.Base.ShadowSamplers & (1 << inst.TexSrcUnit)) { + p->ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode; - int rcptemp = radeonCompilerAllocateTemporary(context->compiler); + int rcptemp = _mesa_find_free_register(p, PROGRAM_TEMPORARY); - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 3); + tgt = radeonAppendInstructions(p, 3); tgt[0].Opcode = OPCODE_RCP; tgt[0].DstReg.File = PROGRAM_TEMPORARY; @@ -132,17 +129,12 @@ static GLboolean transform_TEX( tgt[2].SrcReg[2].Swizzle = SWIZZLE_1111; } } else if (destredirect) { - tgt = radeonClauseInsertInstructions(context->compiler, context->dest, - context->dest->NumInstructions, 1); + tgt = radeonAppendInstructions(p, 1); - tgt->Opcode = OPCODE_MAD; + tgt->Opcode = OPCODE_MOV; tgt->DstReg = orig_inst->DstReg; tgt->SrcReg[0].File = PROGRAM_TEMPORARY; tgt->SrcReg[0].Index = inst.DstReg.Index; - tgt->SrcReg[1].File = PROGRAM_BUILTIN; - tgt->SrcReg[1].Swizzle = SWIZZLE_1111; - tgt->SrcReg[2].File = PROGRAM_BUILTIN; - tgt->SrcReg[2].Swizzle = SWIZZLE_0000; } return GL_TRUE; @@ -183,9 +175,10 @@ static void insert_WPOS_trailer(struct r500_fragment_program_compiler *compiler) struct prog_instruction *fpi; GLuint window_index; int i = 0; - GLuint tempregi = radeonCompilerAllocateTemporary(&compiler->compiler); + GLuint tempregi = _mesa_find_free_register(compiler->program, PROGRAM_TEMPORARY); - fpi = radeonClauseInsertInstructions(&compiler->compiler, &compiler->compiler.Clauses[0], 0, 3); + _mesa_insert_instructions(compiler->program, 0, 3); + fpi = compiler->program->Instructions; /* perspective divide */ fpi[i].Opcode = OPCODE_RCP; @@ -242,7 +235,7 @@ static void insert_WPOS_trailer(struct r500_fragment_program_compiler *compiler) MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); i++; - for (; i < compiler->compiler.Clauses[0].NumInstructions; ++i) { + for (; i < compiler->program->NumInstructions; ++i) { int reg; for (reg = 0; reg < 3; reg++) { if (fpi[i].SrcReg[reg].File == PROGRAM_INPUT && @@ -314,26 +307,29 @@ void r500TranslateFragmentShader(r300ContextPtr r300, compiler.r300 = r300; compiler.fp = fp; compiler.code = &fp->code; + compiler.program = _mesa_clone_program(r300->radeon.glCtx, &fp->mesa_program.Base); - radeonCompilerInit(&compiler.compiler, r300->radeon.glCtx, &fp->mesa_program.Base); + if (RADEON_DEBUG & DEBUG_PIXEL) { + _mesa_printf("Compiler: Initial program:\n"); + _mesa_print_program(compiler.program); + } insert_WPOS_trailer(&compiler); struct radeon_program_transformation transformations[1] = { { &transform_TEX, &compiler } }; - radeonClauseLocalTransform(&compiler.compiler, - &compiler.compiler.Clauses[0], + radeonLocalTransform(r300->radeon.glCtx, compiler.program, 1, transformations); if (RADEON_DEBUG & DEBUG_PIXEL) { - _mesa_printf("Compiler state after transformations:\n"); - radeonCompilerDump(&compiler.compiler); + _mesa_printf("Compiler: after all transformations:\n"); + _mesa_print_program(compiler.program); } fp->translated = r500FragmentProgramEmit(&compiler); - radeonCompilerCleanup(&compiler.compiler); + _mesa_reference_program(r300->radeon.glCtx, &compiler.program, 0); r300UpdateStateParameters(r300->radeon.glCtx, _NEW_PROGRAM); diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.h b/src/mesa/drivers/dri/r300/r500_fragprog.h index ff6a9002c14..ed8f7f41cac 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.h +++ b/src/mesa/drivers/dri/r300/r500_fragprog.h @@ -84,7 +84,7 @@ struct r500_fragment_program_compiler { r300ContextPtr r300; struct r500_fragment_program *fp; struct r500_fragment_program_code *code; - struct radeon_compiler compiler; + struct gl_program *program; }; extern GLboolean r500FragmentProgramEmit(struct r500_fragment_program_compiler *compiler); diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 19a5cef0843..67545cbb4f6 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -282,7 +282,7 @@ static GLuint make_src(struct r500_pfs_compile_state *cs, struct prog_src_regist break; case PROGRAM_ENV_PARAM: reg = emit_const4fv(cs, - cs->compiler->compiler.Ctx->FragmentProgram.Parameters[src.Index]); + cs->compiler->r300->radeon.glCtx->FragmentProgram.Parameters[src.Index]); break; case PROGRAM_STATE_VAR: case PROGRAM_NAMED_PARAM: @@ -1256,21 +1256,14 @@ static int do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction *f static GLboolean parse_program(struct r500_pfs_compile_state *cs) { PROG_CODE; - int clauseidx, counter = 0; + int counter = 0; + struct prog_instruction* fpi; - for (clauseidx = 0; clauseidx < cs->compiler->compiler.NumClauses; clauseidx++) { - struct radeon_clause* clause = &cs->compiler->compiler.Clauses[clauseidx]; - struct prog_instruction* fpi; + for(fpi = cs->compiler->program->Instructions; fpi->Opcode != OPCODE_END; ++fpi) { + counter = do_inst(cs, fpi, counter); - int ip; - - for (ip = 0; ip < clause->NumInstructions; ip++) { - fpi = clause->Instructions + ip; - counter = do_inst(cs, fpi, counter); - - if (cs->compiler->fp->error) - return GL_FALSE; - } + if (cs->compiler->fp->error) + return GL_FALSE; } /* Finish him! (If it's an ALU/OUT instruction...) */ @@ -1365,19 +1358,14 @@ static void init_program(struct r500_pfs_compile_state *cs) cs->inputs[i].reg = 0; } - int clauseidx; - - for (clauseidx = 0; clauseidx < cs->compiler->compiler.NumClauses; ++clauseidx) { - struct radeon_clause* clause = &cs->compiler->compiler.Clauses[clauseidx]; - int ip; + int ip; - for (ip = 0; ip < clause->NumInstructions; ip++) { - fpi = clause->Instructions + ip; - for (i = 0; i < 3; i++) { - if (fpi->SrcReg[i].File == PROGRAM_TEMPORARY) { - if (fpi->SrcReg[i].Index >= temps_used) - temps_used = fpi->SrcReg[i].Index + 1; - } + for (ip = 0; ip < cs->compiler->program->NumInstructions; ip++) { + fpi = cs->compiler->program->Instructions + ip; + for (i = 0; i < 3; i++) { + if (fpi->SrcReg[i].File == PROGRAM_TEMPORARY) { + if (fpi->SrcReg[i].Index >= temps_used) + temps_used = fpi->SrcReg[i].Index + 1; } } } diff --git a/src/mesa/drivers/dri/r300/radeon_program.c b/src/mesa/drivers/dri/r300/radeon_program.c index c8f40e81893..3112339f81c 100644 --- a/src/mesa/drivers/dri/r300/radeon_program.c +++ b/src/mesa/drivers/dri/r300/radeon_program.c @@ -29,201 +29,6 @@ #include "shader/prog_print.h" -/** - * Initialize a compiler structure with a single mixed clause - * containing all instructions from the source program. - */ -void radeonCompilerInit( - struct radeon_compiler *compiler, - GLcontext *ctx, - struct gl_program *source) -{ - struct radeon_clause* clause; - - _mesa_memset(compiler, 0, sizeof(*compiler)); - compiler->Source = source; - compiler->Ctx = ctx; - - compiler->NumTemporaries = source->NumTemporaries; - - clause = radeonCompilerInsertClause(compiler, 0, CLAUSE_MIXED); - clause->NumInstructions = 0; - while(source->Instructions[clause->NumInstructions].Opcode != OPCODE_END) - clause->NumInstructions++; - clause->ReservedInstructions = clause->NumInstructions; - clause->Instructions = _mesa_alloc_instructions(clause->NumInstructions); - _mesa_copy_instructions(clause->Instructions, source->Instructions, clause->NumInstructions); -} - - -/** - * Free all data that is referenced by the compiler structure. - * However, the compiler structure itself is not freed. - */ -void radeonCompilerCleanup(struct radeon_compiler *compiler) -{ - radeonCompilerEraseClauses(compiler, 0, compiler->NumClauses); -} - - -/** - * Allocate and return a unique temporary register. - */ -int radeonCompilerAllocateTemporary(struct radeon_compiler *compiler) -{ - if (compiler->NumTemporaries >= 256) { - _mesa_problem(compiler->Ctx, "radeonCompiler: Too many temporaries"); - return 0; - } - - return compiler->NumTemporaries++; -} - - -static const char* clausename(int type) -{ - switch(type) { - case CLAUSE_MIXED: return "CLAUSE_MIXED"; - case CLAUSE_ALU: return "CLAUSE_ALU"; - case CLAUSE_TEX: return "CLAUSE_TEX"; - default: return "CLAUSE_UNKNOWN"; - } -} - - -/** - * Dump the current compiler state to the console for debugging. - */ -void radeonCompilerDump(struct radeon_compiler *compiler) -{ - int i; - for(i = 0; i < compiler->NumClauses; ++i) { - struct radeon_clause *clause = &compiler->Clauses[i]; - int j; - - _mesa_printf("%2i: %s\n", i+1, clausename(clause->Type)); - - for(j = 0; j < clause->NumInstructions; ++j) { - _mesa_printf("%4i: ", j+1); - _mesa_print_instruction(&clause->Instructions[j]); - } - } -} - - -/** - * \p position index of the new clause; later clauses are moved - * \p type of the new clause; one of CLAUSE_XXX - * \return a pointer to the new clause - */ -struct radeon_clause* radeonCompilerInsertClause( - struct radeon_compiler *compiler, - int position, int type) -{ - struct radeon_clause* oldClauses = compiler->Clauses; - struct radeon_clause* clause; - - assert(position >= 0 && position <= compiler->NumClauses); - - compiler->Clauses = (struct radeon_clause *) - _mesa_malloc((compiler->NumClauses+1) * sizeof(struct radeon_clause)); - if (oldClauses) { - _mesa_memcpy(compiler->Clauses, oldClauses, - position*sizeof(struct radeon_clause)); - _mesa_memcpy(compiler->Clauses+position+1, oldClauses+position, - (compiler->NumClauses - position) * sizeof(struct radeon_clause)); - _mesa_free(oldClauses); - } - compiler->NumClauses++; - - clause = compiler->Clauses + position; - _mesa_memset(clause, 0, sizeof(*clause)); - clause->Type = type; - - return clause; -} - - -/** - * Remove clauses in the range [start, end) - */ -void radeonCompilerEraseClauses( - struct radeon_compiler *compiler, - int start, int end) -{ - struct radeon_clause* oldClauses = compiler->Clauses; - int i; - - assert(0 <= start); - assert(start <= end); - assert(end <= compiler->NumClauses); - - if (end == start) - return; - - for(i = start; i < end; ++i) { - struct radeon_clause* clause = oldClauses + i; - _mesa_free_instructions(clause->Instructions, clause->NumInstructions); - } - - if (start > 0 || end < compiler->NumClauses) { - compiler->Clauses = (struct radeon_clause*) - _mesa_malloc((compiler->NumClauses+start-end) * sizeof(struct radeon_clause)); - _mesa_memcpy(compiler->Clauses, oldClauses, - start * sizeof(struct radeon_clause)); - _mesa_memcpy(compiler->Clauses + start, oldClauses + end, - (compiler->NumClauses - end) * sizeof(struct radeon_clause)); - compiler->NumClauses -= end - start; - } else { - compiler->Clauses = 0; - compiler->NumClauses = 0; - } - - _mesa_free(oldClauses); -} - - -/** - * Insert new instructions at the given position, initialize them as NOPs - * and return a pointer to the first new instruction. - */ -struct prog_instruction* radeonClauseInsertInstructions( - struct radeon_compiler *compiler, - struct radeon_clause *clause, - int position, int count) -{ - int newNumInstructions = clause->NumInstructions + count; - - assert(position >= 0 && position <= clause->NumInstructions); - - if (newNumInstructions <= clause->ReservedInstructions) { - memmove(clause->Instructions + position + count, clause->Instructions + position, - (clause->NumInstructions - position) * sizeof(struct prog_instruction)); - } else { - struct prog_instruction *oldInstructions = clause->Instructions; - - clause->ReservedInstructions *= 2; - if (newNumInstructions > clause->ReservedInstructions) - clause->ReservedInstructions = newNumInstructions; - - clause->Instructions = (struct prog_instruction*) - _mesa_malloc(clause->ReservedInstructions * sizeof(struct prog_instruction)); - - if (oldInstructions) { - _mesa_memcpy(clause->Instructions, oldInstructions, - position * sizeof(struct prog_instruction)); - _mesa_memcpy(clause->Instructions + position + count, oldInstructions + position, - (clause->NumInstructions - position) * sizeof(struct prog_instruction)); - - _mesa_free(oldInstructions); - } - } - - clause->NumInstructions = newNumInstructions; - _mesa_init_instructions(clause->Instructions + position, count); - return clause->Instructions + position; -} - /** * Transform the given clause in the following way: @@ -240,42 +45,50 @@ struct prog_instruction* radeonClauseInsertInstructions( * \note The transform is called 'local' because it can only look at * one instruction at a time. */ -void radeonClauseLocalTransform( - struct radeon_compiler *compiler, - struct radeon_clause *clause, +void radeonLocalTransform( + GLcontext *ctx, + struct gl_program *program, int num_transformations, struct radeon_program_transformation* transformations) { - struct radeon_program_transform_context context; - struct radeon_clause source; + struct prog_instruction *source; + int numinstructions; int ip; - source = *clause; - clause->Instructions = 0; - clause->NumInstructions = 0; - clause->ReservedInstructions = 0; + source = program->Instructions; + numinstructions = program->NumInstructions; - context.compiler = compiler; - context.dest = clause; - context.src = &source; + program->Instructions = 0; + program->NumInstructions = 0; - for(ip = 0; ip < source.NumInstructions; ++ip) { - struct prog_instruction *instr = source.Instructions + ip; + for(ip = 0; ip < numinstructions; ++ip) { + struct prog_instruction *instr = source + ip; int i; for(i = 0; i < num_transformations; ++i) { struct radeon_program_transformation* t = transformations + i; - if (t->function(&context, instr, t->userData)) + if (t->function(ctx, program, instr, t->userData)) break; } if (i >= num_transformations) { - struct prog_instruction *tgt = - radeonClauseInsertInstructions(compiler, clause, clause->NumInstructions, 1); - _mesa_copy_instructions(tgt, instr, 1); + struct prog_instruction* dest = radeonAppendInstructions(program, 1); + _mesa_copy_instructions(dest, instr, 1); } } - _mesa_free_instructions(source.Instructions, source.NumInstructions); + _mesa_free_instructions(source, numinstructions); +} + + +/** + * Append the given number of instructions to the program and return a + * pointer to the first new instruction. + */ +struct prog_instruction *radeonAppendInstructions(struct gl_program *program, int count) +{ + int oldnum = program->NumInstructions; + _mesa_insert_instructions(program, oldnum, count); + return program->Instructions + oldnum; } diff --git a/src/mesa/drivers/dri/r300/radeon_program.h b/src/mesa/drivers/dri/r300/radeon_program.h index 25e70505b16..012104fa5ae 100644 --- a/src/mesa/drivers/dri/r300/radeon_program.h +++ b/src/mesa/drivers/dri/r300/radeon_program.h @@ -49,96 +49,7 @@ enum { #define SWIZZLE_1111 MAKE_SWIZZLE4(SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE) /** - * A clause is simply a sequence of instructions that are executed - * in order. - */ -struct radeon_clause { - /** - * Type of this clause, one of CLAUSE_XXX. - */ - int Type : 2; - - /** - * Pointer to an array of instructions. - * The array is terminated by an OPCODE_END instruction. - */ - struct prog_instruction *Instructions; - - /** - * Number of instructions in this clause. - */ - int NumInstructions; - - /** - * Space reserved for instructions in this clause. - */ - int ReservedInstructions; -}; - -/** - * A compile object, holding the current intermediate state during compilation. - */ -struct radeon_compiler { - struct gl_program *Source; - GLcontext* Ctx; - - /** - * Number of clauses in this program. - */ - int NumClauses; - - /** - * Pointer to an array of NumClauses clauses. - */ - struct radeon_clause *Clauses; - - /** - * Number of registers in the PROGRAM_TEMPORARIES file. - */ - int NumTemporaries; -}; - -void radeonCompilerInit( - struct radeon_compiler *compiler, - GLcontext *ctx, - struct gl_program *source); -void radeonCompilerCleanup(struct radeon_compiler *compiler); -int radeonCompilerAllocateTemporary(struct radeon_compiler *compiler); -void radeonCompilerDump(struct radeon_compiler *compiler); - -struct radeon_clause *radeonCompilerInsertClause( - struct radeon_compiler *compiler, - int position, - int type); -void radeonCompilerEraseClauses( - struct radeon_compiler *compiler, - int start, - int end); - -struct prog_instruction* radeonClauseInsertInstructions( - struct radeon_compiler *compiler, - struct radeon_clause *clause, - int position, int count); - -/** - * - */ -struct radeon_program_transform_context { - struct radeon_compiler *compiler; - - /** - * Destination clause where new instructions must be written. - */ - struct radeon_clause *dest; - - /** - * Original clause that is currently being transformed. - */ - struct radeon_clause *src; -}; - -/** - * A transformation that can be passed to \ref radeonClauseLinearTransform. + * A transformation that can be passed to \ref radeonLocalTransform. * * The function will be called once for each instruction. * It has to either emit the appropriate transformed code for the instruction @@ -149,16 +60,20 @@ struct radeon_program_transform_context { */ struct radeon_program_transformation { GLboolean (*function)( - struct radeon_program_transform_context*, + GLcontext*, + struct gl_program*, struct prog_instruction*, void*); void *userData; }; -void radeonClauseLocalTransform( - struct radeon_compiler *compiler, - struct radeon_clause *clause, +void radeonLocalTransform( + GLcontext* ctx, + struct gl_program *program, int num_transformations, struct radeon_program_transformation* transformations); + +struct prog_instruction *radeonAppendInstructions(struct gl_program *program, int count); + #endif diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.c b/src/mesa/drivers/dri/r300/radeon_program_alu.c index 7fe940a7d7f..3104d07facd 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.c @@ -36,13 +36,11 @@ #include "radeon_program_alu.h" -static struct prog_instruction *emit1(struct radeon_program_transform_context* ctx, +static struct prog_instruction *emit1(struct gl_program* p, gl_inst_opcode Opcode, struct prog_dst_register DstReg, struct prog_src_register SrcReg) { - struct prog_instruction *fpi = - radeonClauseInsertInstructions(ctx->compiler, ctx->dest, - ctx->dest->NumInstructions, 1); + struct prog_instruction *fpi = radeonAppendInstructions(p, 1); fpi->Opcode = Opcode; fpi->DstReg = DstReg; @@ -50,13 +48,11 @@ static struct prog_instruction *emit1(struct radeon_program_transform_context* c return fpi; } -static struct prog_instruction *emit2(struct radeon_program_transform_context* ctx, +static struct prog_instruction *emit2(struct gl_program* p, gl_inst_opcode Opcode, struct prog_dst_register DstReg, struct prog_src_register SrcReg0, struct prog_src_register SrcReg1) { - struct prog_instruction *fpi = - radeonClauseInsertInstructions(ctx->compiler, ctx->dest, - ctx->dest->NumInstructions, 1); + struct prog_instruction *fpi = radeonAppendInstructions(p, 1); fpi->Opcode = Opcode; fpi->DstReg = DstReg; @@ -65,14 +61,12 @@ static struct prog_instruction *emit2(struct radeon_program_transform_context* c return fpi; } -static struct prog_instruction *emit3(struct radeon_program_transform_context* ctx, +static struct prog_instruction *emit3(struct gl_program* p, gl_inst_opcode Opcode, struct prog_dst_register DstReg, struct prog_src_register SrcReg0, struct prog_src_register SrcReg1, struct prog_src_register SrcReg2) { - struct prog_instruction *fpi = - radeonClauseInsertInstructions(ctx->compiler, ctx->dest, - ctx->dest->NumInstructions, 1); + struct prog_instruction *fpi = radeonAppendInstructions(p, 1); fpi->Opcode = Opcode; fpi->DstReg = DstReg; @@ -154,24 +148,24 @@ static struct prog_src_register scalar(struct prog_src_register reg) return swizzle(reg, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X); } -static void transform_ABS(struct radeon_program_transform_context* ctx, +static void transform_ABS(struct gl_program* p, struct prog_instruction* inst) { struct prog_src_register src = inst->SrcReg[0]; src.Abs = 1; src.NegateBase = 0; src.NegateAbs = 0; - emit1(ctx, OPCODE_MOV, inst->DstReg, src); + emit1(p, OPCODE_MOV, inst->DstReg, src); } -static void transform_DPH(struct radeon_program_transform_context* ctx, +static void transform_DPH(struct gl_program* p, struct prog_instruction* inst) { struct prog_src_register src0 = inst->SrcReg[0]; if (src0.NegateAbs) { if (src0.Abs) { - int tempreg = radeonCompilerAllocateTemporary(ctx->compiler); - emit1(ctx, OPCODE_MOV, dstreg(PROGRAM_TEMPORARY, tempreg), src0); + int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + emit1(p, OPCODE_MOV, dstreg(PROGRAM_TEMPORARY, tempreg), src0); src0 = srcreg(src0.File, src0.Index); } else { src0.NegateAbs = 0; @@ -180,70 +174,70 @@ static void transform_DPH(struct radeon_program_transform_context* ctx, } set_swizzle(&src0, 3, SWIZZLE_ONE); set_negate_base(&src0, 3, 0); - emit2(ctx, OPCODE_DP4, inst->DstReg, src0, inst->SrcReg[1]); + emit2(p, OPCODE_DP4, inst->DstReg, src0, inst->SrcReg[1]); } -static void transform_FLR(struct radeon_program_transform_context* ctx, +static void transform_FLR(struct gl_program* p, struct prog_instruction* inst) { - int tempreg = radeonCompilerAllocateTemporary(ctx->compiler); - emit1(ctx, OPCODE_FRC, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0]); - emit2(ctx, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg))); + int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + emit1(p, OPCODE_FRC, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0]); + emit2(p, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg))); } -static void transform_POW(struct radeon_program_transform_context* ctx, +static void transform_POW(struct gl_program* p, struct prog_instruction* inst) { - int tempreg = radeonCompilerAllocateTemporary(ctx->compiler); + int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); struct prog_dst_register tempdst = dstreg(PROGRAM_TEMPORARY, tempreg); struct prog_src_register tempsrc = srcreg(PROGRAM_TEMPORARY, tempreg); tempdst.WriteMask = WRITEMASK_W; tempsrc.Swizzle = SWIZZLE_WWWW; - emit1(ctx, OPCODE_LG2, tempdst, scalar(inst->SrcReg[0])); - emit2(ctx, OPCODE_MUL, tempdst, tempsrc, scalar(inst->SrcReg[1])); - emit1(ctx, OPCODE_EX2, inst->DstReg, tempsrc); + emit1(p, OPCODE_LG2, tempdst, scalar(inst->SrcReg[0])); + emit2(p, OPCODE_MUL, tempdst, tempsrc, scalar(inst->SrcReg[1])); + emit1(p, OPCODE_EX2, inst->DstReg, tempsrc); } -static void transform_SGE(struct radeon_program_transform_context* ctx, +static void transform_SGE(struct gl_program* p, struct prog_instruction* inst) { - int tempreg = radeonCompilerAllocateTemporary(ctx->compiler); + int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); - emit2(ctx, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); - emit3(ctx, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_zero, builtin_one); + emit2(p, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); + emit3(p, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_zero, builtin_one); } -static void transform_SLT(struct radeon_program_transform_context* ctx, +static void transform_SLT(struct gl_program* p, struct prog_instruction* inst) { - int tempreg = radeonCompilerAllocateTemporary(ctx->compiler); + int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); - emit2(ctx, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); - emit3(ctx, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_one, builtin_zero); + emit2(p, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); + emit3(p, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_one, builtin_zero); } -static void transform_SUB(struct radeon_program_transform_context* ctx, +static void transform_SUB(struct gl_program* p, struct prog_instruction* inst) { - emit2(ctx, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(inst->SrcReg[1])); + emit2(p, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(inst->SrcReg[1])); } -static void transform_SWZ(struct radeon_program_transform_context* ctx, +static void transform_SWZ(struct gl_program* p, struct prog_instruction* inst) { - emit1(ctx, OPCODE_MOV, inst->DstReg, inst->SrcReg[0]); + emit1(p, OPCODE_MOV, inst->DstReg, inst->SrcReg[0]); } -static void transform_XPD(struct radeon_program_transform_context* ctx, +static void transform_XPD(struct gl_program* p, struct prog_instruction* inst) { - int tempreg = radeonCompilerAllocateTemporary(ctx->compiler); + int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); - emit2(ctx, OPCODE_MUL, dstreg(PROGRAM_TEMPORARY, tempreg), + emit2(p, OPCODE_MUL, dstreg(PROGRAM_TEMPORARY, tempreg), swizzle(inst->SrcReg[0], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W), swizzle(inst->SrcReg[1], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W)); - emit3(ctx, OPCODE_MAD, inst->DstReg, + emit3(p, OPCODE_MAD, inst->DstReg, swizzle(inst->SrcReg[0], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W), swizzle(inst->SrcReg[1], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W), negate(srcreg(PROGRAM_TEMPORARY, tempreg))); @@ -264,20 +258,21 @@ static void transform_XPD(struct radeon_program_transform_context* ctx, * @todo add LIT here as well? */ GLboolean radeonTransformALU( - struct radeon_program_transform_context* ctx, + GLcontext* ctx, + struct gl_program* prog, struct prog_instruction* inst, void* unused) { switch(inst->Opcode) { - case OPCODE_ABS: transform_ABS(ctx, inst); return GL_TRUE; - case OPCODE_DPH: transform_DPH(ctx, inst); return GL_TRUE; - case OPCODE_FLR: transform_FLR(ctx, inst); return GL_TRUE; - case OPCODE_POW: transform_POW(ctx, inst); return GL_TRUE; - case OPCODE_SGE: transform_SGE(ctx, inst); return GL_TRUE; - case OPCODE_SLT: transform_SLT(ctx, inst); return GL_TRUE; - case OPCODE_SUB: transform_SUB(ctx, inst); return GL_TRUE; - case OPCODE_SWZ: transform_SWZ(ctx, inst); return GL_TRUE; - case OPCODE_XPD: transform_XPD(ctx, inst); return GL_TRUE; + case OPCODE_ABS: transform_ABS(prog, inst); return GL_TRUE; + case OPCODE_DPH: transform_DPH(prog, inst); return GL_TRUE; + case OPCODE_FLR: transform_FLR(prog, inst); return GL_TRUE; + case OPCODE_POW: transform_POW(prog, inst); return GL_TRUE; + case OPCODE_SGE: transform_SGE(prog, inst); return GL_TRUE; + case OPCODE_SLT: transform_SLT(prog, inst); return GL_TRUE; + case OPCODE_SUB: transform_SUB(prog, inst); return GL_TRUE; + case OPCODE_SWZ: transform_SWZ(prog, inst); return GL_TRUE; + case OPCODE_XPD: transform_XPD(prog, inst); return GL_TRUE; default: return GL_FALSE; } diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.h b/src/mesa/drivers/dri/r300/radeon_program_alu.h index 940459624fc..f5beb9f8c30 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.h +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.h @@ -31,7 +31,8 @@ #include "radeon_program.h" GLboolean radeonTransformALU( - struct radeon_program_transform_context*, + GLcontext*, + struct gl_program*, struct prog_instruction*, void*); -- cgit v1.2.3 From 364d45a3e1629f32c6ab5407f92618a16c9d45e0 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 16:07:37 +0200 Subject: r500: Major refactoring of fragment program emit Use the common facilities to convert non-native instructions into native ones. Worked hard to make the code easier to read (hopefully), by using helper functions instead of direct manipulation of the machine code. Fixes two bugs related to FLR and XPD. --- src/mesa/drivers/dri/r300/r300_reg.h | 6 + src/mesa/drivers/dri/r300/r500_fragprog.c | 9 +- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 1218 +++++++++--------------- 3 files changed, 458 insertions(+), 775 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_reg.h b/src/mesa/drivers/dri/r300/r300_reg.h index 58a19554c71..cd232c5b7b2 100644 --- a/src/mesa/drivers/dri/r300/r300_reg.h +++ b/src/mesa/drivers/dri/r300/r300_reg.h @@ -2705,6 +2705,7 @@ enum { # define R500_ALPHA_OP_MDV 15 # define R500_ALPHA_ADDRD(x) (x << 4) # define R500_ALPHA_ADDRD_REL (1 << 11) +# define R500_ALPHA_SEL_A_SHIFT 12 # define R500_ALPHA_SEL_A_SRC0 (0 << 12) # define R500_ALPHA_SEL_A_SRC1 (1 << 12) # define R500_ALPHA_SEL_A_SRC2 (2 << 12) @@ -2721,6 +2722,7 @@ enum { # define R500_ALPHA_MOD_A_NEG (1 << 17) # define R500_ALPHA_MOD_A_ABS (2 << 17) # define R500_ALPHA_MOD_A_NAB (3 << 17) +# define R500_ALPHA_SEL_B_SHIFT 19 # define R500_ALPHA_SEL_B_SRC0 (0 << 19) # define R500_ALPHA_SEL_B_SRC1 (1 << 19) # define R500_ALPHA_SEL_B_SRC2 (2 << 19) @@ -2777,6 +2779,7 @@ enum { # define R500_ALU_RGBA_OP_MDV (12 << 0) # define R500_ALU_RGBA_ADDRD(x) (x << 4) # define R500_ALU_RGBA_ADDRD_REL (1 << 11) +# define R500_ALU_RGBA_SEL_C_SHIFT 12 # define R500_ALU_RGBA_SEL_C_SRC0 (0 << 12) # define R500_ALU_RGBA_SEL_C_SRC1 (1 << 12) # define R500_ALU_RGBA_SEL_C_SRC2 (2 << 12) @@ -2809,6 +2812,7 @@ enum { # define R500_ALU_RGBA_MOD_C_NEG (1 << 23) # define R500_ALU_RGBA_MOD_C_ABS (2 << 23) # define R500_ALU_RGBA_MOD_C_NAB (3 << 23) +# define R500_ALU_RGBA_ALPHA_SEL_C_SHIFT 25 # define R500_ALU_RGBA_ALPHA_SEL_C_SRC0 (0 << 25) # define R500_ALU_RGBA_ALPHA_SEL_C_SRC1 (1 << 25) # define R500_ALU_RGBA_ALPHA_SEL_C_SRC2 (2 << 25) @@ -2826,6 +2830,7 @@ enum { # define R500_ALU_RGBA_ALPHA_MOD_C_ABS (2 << 30) # define R500_ALU_RGBA_ALPHA_MOD_C_NAB (3 << 30) #define R500_US_ALU_RGB_INST_0 0xa000 +# define R500_ALU_RGB_SEL_A_SHIFT 0 # define R500_ALU_RGB_SEL_A_SRC0 (0 << 0) # define R500_ALU_RGB_SEL_A_SRC1 (1 << 0) # define R500_ALU_RGB_SEL_A_SRC2 (2 << 0) @@ -2858,6 +2863,7 @@ enum { # define R500_ALU_RGB_MOD_A_NEG (1 << 11) # define R500_ALU_RGB_MOD_A_ABS (2 << 11) # define R500_ALU_RGB_MOD_A_NAB (3 << 11) +# define R500_ALU_RGB_SEL_B_SHIFT 13 # define R500_ALU_RGB_SEL_B_SRC0 (0 << 13) # define R500_ALU_RGB_SEL_B_SRC1 (1 << 13) # define R500_ALU_RGB_SEL_B_SRC2 (2 << 13) diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index 62e06ea52c0..b46e924ac7b 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -27,6 +27,8 @@ #include "r500_fragprog.h" +#include "radeon_program_alu.h" + /** * Transform TEX, TXP, TXB, and KIL instructions in the following way: @@ -316,11 +318,12 @@ void r500TranslateFragmentShader(r300ContextPtr r300, insert_WPOS_trailer(&compiler); - struct radeon_program_transformation transformations[1] = { - { &transform_TEX, &compiler } + struct radeon_program_transformation transformations[2] = { + { &transform_TEX, &compiler }, + { &radeonTransformALU, 0 } }; radeonLocalTransform(r300->radeon.glCtx, compiler.program, - 1, transformations); + 2, transformations); if (RADEON_DEBUG & DEBUG_PIXEL) { _mesa_printf("Compiler: after all transformations:\n"); diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 67545cbb4f6..0e95c81e482 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -168,6 +168,12 @@ static const GLfloat LIT[] = {127.999999, 127.999999, -127.999999}; +static const struct prog_dst_register dstreg_template = { + .File = PROGRAM_TEMPORARY, + .Index = 0, + .WriteMask = WRITEMASK_XYZW +}; + static INLINE GLuint make_rgb_swizzle(struct prog_src_register src) { GLuint swiz = 0x0; GLuint temp; @@ -179,8 +185,14 @@ static INLINE GLuint make_rgb_swizzle(struct prog_src_register src) { if (temp == 5) temp++; swiz |= temp << i*3; } - if (src.NegateBase) - swiz |= (R500_SWIZ_MOD_NEG << 9); + if (src.Abs) { + swiz |= R500_SWIZ_MOD_ABS << 9; + } else if (src.NegateBase & 7) { + ASSERT((src.NegateBase & 7) == 7); + swiz |= R500_SWIZ_MOD_NEG << 9; + } + if (src.NegateAbs) + swiz ^= R500_SWIZ_MOD_NEG << 9; return swiz; } @@ -202,8 +214,13 @@ static INLINE GLuint make_alpha_swizzle(struct prog_src_register src) { if (swiz == 5) swiz++; - if (src.NegateBase) - swiz |= (R500_SWIZ_MOD_NEG << 3); + if (src.Abs) { + swiz |= R500_SWIZ_MOD_ABS << 3; + } else if (src.NegateBase & 8) { + swiz |= R500_SWIZ_MOD_NEG << 3; + } + if (src.NegateAbs) + swiz ^= R500_SWIZ_MOD_NEG << 3; return swiz; } @@ -212,6 +229,15 @@ static INLINE GLuint make_sop_swizzle(struct prog_src_register src) { GLuint swiz = GET_SWZ(src.Swizzle, 0); if (swiz == 5) swiz++; + + if (src.Abs) { + swiz |= R500_SWIZ_MOD_ABS << 3; + } else if (src.NegateBase & 1) { + swiz |= R500_SWIZ_MOD_NEG << 3; + } + if (src.NegateAbs) + swiz ^= R500_SWIZ_MOD_NEG << 3; + return swiz; } @@ -324,12 +350,23 @@ static GLuint make_dest(struct r500_pfs_compile_state *cs, struct prog_dst_regis return reg; } -static void emit_tex(struct r500_pfs_compile_state *cs, - struct prog_instruction *fpi, int dest, int counter) +static int emit_slot(struct r500_pfs_compile_state *cs) +{ + if (cs->nrslots >= 512) { + ERROR("Too many instructions"); + cs->nrslots = 1; + return 0; + } + return cs->nrslots++; +} + +static int emit_tex(struct r500_pfs_compile_state *cs, + struct prog_instruction *fpi, int dest) { PROG_CODE; int hwsrc, hwdest; GLuint mask; + int counter = emit_slot(cs); mask = fpi->DstReg.WriteMask << 11; hwsrc = make_src(cs, fpi->SrcReg[0]); @@ -399,844 +436,490 @@ static void emit_tex(struct r500_pfs_compile_state *cs, | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); } + + return counter; } -static void emit_alu(struct r500_pfs_compile_state *cs, int counter, struct prog_instruction *fpi) { +/* Do not call directly */ +static int _helper_emit_alu(struct r500_pfs_compile_state *cs, GLuint rgbop, GLuint alphaop, + int File, int Index, int WriteMask) +{ PROG_CODE; - /* Ideally, we shouldn't have to explicitly clear memory here! */ - code->inst[counter].inst0 = 0x0; - code->inst[counter].inst1 = 0x0; - code->inst[counter].inst2 = 0x0; - code->inst[counter].inst3 = 0x0; - code->inst[counter].inst4 = 0x0; - code->inst[counter].inst5 = 0x0; + int counter = emit_slot(cs); - if (fpi->DstReg.File == PROGRAM_OUTPUT) { - code->inst[counter].inst0 = R500_INST_TYPE_OUT; + code->inst[counter].inst4 = alphaop; + code->inst[counter].inst5 = rgbop; - if (fpi->DstReg.Index == FRAG_RESULT_COLR) - code->inst[counter].inst0 |= (fpi->DstReg.WriteMask << 15); + if (File == PROGRAM_OUTPUT) { + code->inst[counter].inst0 = R500_INST_TYPE_OUT; - if (fpi->DstReg.Index == FRAG_RESULT_DEPR) { + if (Index == FRAG_RESULT_COLR) { + code->inst[counter].inst0 |= WriteMask << 15; + } else if (Index == FRAG_RESULT_DEPR) { code->inst[counter].inst4 |= R500_ALPHA_W_OMASK; - /* Notify the state emission! */ cs->compiler->fp->writes_depth = GL_TRUE; } } else { + int dest = Index + code->temp_reg_offset; + code->inst[counter].inst0 = R500_INST_TYPE_ALU - /* pixel_mask */ - | (fpi->DstReg.WriteMask << 11); + | (WriteMask << 11); + code->inst[counter].inst4 |= R500_ALPHA_ADDRD(dest); + code->inst[counter].inst5 |= R500_ALU_RGBA_ADDRD(dest); } code->inst[counter].inst0 |= R500_INST_TEX_SEM_WAIT; + + return counter; } -static void emit_mov(struct r500_pfs_compile_state *cs, int counter, struct prog_instruction *fpi, GLuint src_reg, GLuint swizzle, GLuint dest) { +/** + * Prepare an ALU slot with the given RGB operation, ALPHA operation, and + * destination register. + */ +static int emit_alu(struct r500_pfs_compile_state *cs, GLuint rgbop, GLuint alphaop, struct prog_dst_register dst) +{ + return _helper_emit_alu(cs, rgbop, alphaop, dst.File, dst.Index, dst.WriteMask); +} + +static int emit_alu_temp(struct r500_pfs_compile_state *cs, GLuint rgbop, GLuint alphaop, int dst, int writemask) +{ + return _helper_emit_alu(cs, rgbop, alphaop, + PROGRAM_TEMPORARY, dst - cs->compiler->code->temp_reg_offset, writemask); +} + +/** + * Set an instruction's source 0 (both RGB and ALPHA) to the given hardware index. + */ +static void set_src0_direct(struct r500_pfs_compile_state *cs, int ip, GLuint src) +{ PROG_CODE; - /* The r3xx shader uses MAD to implement MOV. We are using CMP, since - * it is technically more accurate and recommended by ATI/AMD. */ - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src_reg); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src_reg); - /* (De)mangle the swizzle from Mesa to R500. */ - swizzle = make_rgba_swizzle(swizzle); - /* 0x1FF is 9 bits, size of an RGB swizzle. */ - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A((swizzle & 0x1ff)) - | R500_ALU_RGB_SEL_B_SRC0 - | MAKE_SWIZ_RGB_B((swizzle & 0x1ff)) - | R500_ALU_RGB_OMOD_DISABLE; - code->inst[counter].inst4 |= R500_ALPHA_OP_CMP - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(GET_SWZ(swizzle, 3)) - | R500_ALPHA_SEL_B_SRC0 | MAKE_SWIZ_ALPHA_B(GET_SWZ(swizzle, 3)) - | R500_ALPHA_OMOD_DISABLE; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_CMP - | R500_ALU_RGBA_ADDRD(dest) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); + code->inst[ip].inst1 |= R500_RGB_ADDR0(src); + code->inst[ip].inst2 |= R500_ALPHA_ADDR0(src); } -static void emit_mad(struct r500_pfs_compile_state *cs, int counter, struct prog_instruction *fpi, int one, int two, int three) { +/** + * Set an instruction's source 1 (both RGB and ALPHA) to the given hardware index. + */ +static void set_src1_direct(struct r500_pfs_compile_state *cs, int ip, GLuint src) +{ PROG_CODE; - /* Note: This code was all Corbin's. Corbin is a rather hackish coder. - * If you can make it pretty or fast, please do so! */ - emit_alu(cs, counter, fpi); - /* Common MAD stuff */ - code->inst[counter].inst4 |= R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(make_dest(cs, fpi->DstReg)); - code->inst[counter].inst5 |= R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(make_dest(cs, fpi->DstReg)); - switch (one) { - case 0: - case 1: - case 2: - code->inst[counter].inst1 |= R500_RGB_ADDR0(make_src(cs, fpi->SrcReg[one])); - code->inst[counter].inst2 |= R500_ALPHA_ADDR0(make_src(cs, fpi->SrcReg[one])); - code->inst[counter].inst3 |= R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[one])); - code->inst[counter].inst4 |= R500_ALPHA_SEL_A_SRC0 - | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[one])); - break; - case R500_SWIZZLE_ZERO: - code->inst[counter].inst3 |= MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_ZERO); - code->inst[counter].inst4 |= MAKE_SWIZ_ALPHA_A(R500_SWIZZLE_ZERO); - break; - case R500_SWIZZLE_ONE: - code->inst[counter].inst3 |= MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_ONE); - code->inst[counter].inst4 |= MAKE_SWIZ_ALPHA_A(R500_SWIZZLE_ONE); - break; - default: - ERROR("Bad src index in emit_mad: %d\n", one); - break; - } - switch (two) { - case 0: - case 1: - case 2: - code->inst[counter].inst1 |= R500_RGB_ADDR1(make_src(cs, fpi->SrcReg[two])); - code->inst[counter].inst2 |= R500_ALPHA_ADDR1(make_src(cs, fpi->SrcReg[two])); - code->inst[counter].inst3 |= R500_ALU_RGB_SEL_B_SRC1 - | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[two])); - code->inst[counter].inst4 |= R500_ALPHA_SEL_B_SRC1 - | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[two])); - break; - case R500_SWIZZLE_ZERO: - code->inst[counter].inst3 |= MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_ZERO); - code->inst[counter].inst4 |= MAKE_SWIZ_ALPHA_B(R500_SWIZZLE_ZERO); - break; - case R500_SWIZZLE_ONE: - code->inst[counter].inst3 |= MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_ONE); - code->inst[counter].inst4 |= MAKE_SWIZ_ALPHA_B(R500_SWIZZLE_ONE); - break; - default: - ERROR("Bad src index in emit_mad: %d\n", two); - break; - } - switch (three) { - case 0: - case 1: - case 2: - code->inst[counter].inst1 |= R500_RGB_ADDR2(make_src(cs, fpi->SrcReg[three])); - code->inst[counter].inst2 |= R500_ALPHA_ADDR2(make_src(cs, fpi->SrcReg[three])); - code->inst[counter].inst5 |= R500_ALU_RGBA_SEL_C_SRC2 - | MAKE_SWIZ_RGBA_C(make_rgb_swizzle(fpi->SrcReg[three])) - | R500_ALU_RGBA_ALPHA_SEL_C_SRC2 - | MAKE_SWIZ_ALPHA_C(make_alpha_swizzle(fpi->SrcReg[three])); - break; - case R500_SWIZZLE_ZERO: - code->inst[counter].inst5 |= MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); - break; - case R500_SWIZZLE_ONE: - code->inst[counter].inst5 |= MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ONE) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ONE); - break; - default: - ERROR("Bad src index in emit_mad: %d\n", three); - break; - } + code->inst[ip].inst1 |= R500_RGB_ADDR1(src); + code->inst[ip].inst2 |= R500_ALPHA_ADDR1(src); } -static void emit_sop(struct r500_pfs_compile_state *cs, int counter, struct prog_instruction *fpi, int opcode, GLuint src, GLuint swiz, GLuint dest) { +/** + * Set an instruction's source 2 (both RGB and ALPHA) to the given hardware index. + */ +static void set_src2_direct(struct r500_pfs_compile_state *cs, int ip, GLuint src) +{ PROG_CODE; - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src); - code->inst[counter].inst4 |= R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(swiz); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_SOP - | R500_ALU_RGBA_ADDRD(dest); - switch (opcode) { - case OPCODE_COS: - code->inst[counter].inst4 |= R500_ALPHA_OP_COS; - break; - case OPCODE_EX2: - code->inst[counter].inst4 |= R500_ALPHA_OP_EX2; - break; - case OPCODE_LG2: - code->inst[counter].inst4 |= R500_ALPHA_OP_LN2; - break; - case OPCODE_RCP: - code->inst[counter].inst4 |= R500_ALPHA_OP_RCP; - break; - case OPCODE_RSQ: - code->inst[counter].inst4 |= R500_ALPHA_OP_RSQ; - break; - case OPCODE_SIN: - code->inst[counter].inst4 |= R500_ALPHA_OP_SIN; - break; - default: - ERROR("Bad opcode in emit_sop: %d\n", opcode); - break; + code->inst[ip].inst1 |= R500_RGB_ADDR2(src); + code->inst[ip].inst2 |= R500_ALPHA_ADDR2(src); +} + +/** + * Set an instruction's source 0 (both RGB and ALPHA) according to the given source register. + */ +static void set_src0(struct r500_pfs_compile_state *cs, int ip, struct prog_src_register srcreg) +{ + set_src0_direct(cs, ip, make_src(cs, srcreg)); +} + +/** + * Set an instruction's source 1 (both RGB and ALPHA) according to the given source register. + */ +static void set_src1(struct r500_pfs_compile_state *cs, int ip, struct prog_src_register srcreg) +{ + set_src1_direct(cs, ip, make_src(cs, srcreg)); +} + +/** + * Set an instruction's source 2 (both RGB and ALPHA) according to the given source register. + */ +static void set_src2(struct r500_pfs_compile_state *cs, int ip, struct prog_src_register srcreg) +{ + set_src2_direct(cs, ip, make_src(cs, srcreg)); +} + +/** + * Set an instruction's argument A (both RGB and ALPHA) from the given source, + * taking swizzles+neg+abs as specified (see also _reg version below). + */ +static void set_argA(struct r500_pfs_compile_state *cs, int ip, int source, GLuint swizRGB, GLuint swizA) +{ + PROG_CODE; + code->inst[ip].inst3 |= (source << R500_ALU_RGB_SEL_A_SHIFT) | MAKE_SWIZ_RGB_A(swizRGB); + code->inst[ip].inst4 |= (source << R500_ALPHA_SEL_A_SHIFT) | MAKE_SWIZ_ALPHA_A(swizA); +} + +/** + * Set an instruction's argument B (both RGB and ALPHA) from the given source, + * taking swizzles+neg+abs as specified (see also _reg version below). + */ +static void set_argB(struct r500_pfs_compile_state *cs, int ip, int source, GLuint swizRGB, GLuint swizA) +{ + PROG_CODE; + code->inst[ip].inst3 |= (source << R500_ALU_RGB_SEL_B_SHIFT) | MAKE_SWIZ_RGB_B(swizRGB); + code->inst[ip].inst4 |= (source << R500_ALPHA_SEL_B_SHIFT) | MAKE_SWIZ_ALPHA_B(swizA); +} + +/** + * Set an instruction's argument C (both RGB and ALPHA) from the given source, + * taking swizzles+neg+abs as specified (see also _reg version below). + */ +static void set_argC(struct r500_pfs_compile_state *cs, int ip, int source, GLuint swizRGB, GLuint swizA) +{ + PROG_CODE; + code->inst[ip].inst5 |= + (source << R500_ALU_RGBA_SEL_C_SHIFT) | + MAKE_SWIZ_RGBA_C(swizRGB) | + (source << R500_ALU_RGBA_ALPHA_SEL_C_SHIFT) | + MAKE_SWIZ_ALPHA_C(swizA); +} + +/** + * Set an instruction's argument A (both RGB and ALPHA) from the given source, + * taking swizzles, negation and absolute value from the given source register. + */ +static void set_argA_reg(struct r500_pfs_compile_state *cs, int ip, int source, struct prog_src_register srcreg) +{ + set_argA(cs, ip, source, make_rgb_swizzle(srcreg), make_alpha_swizzle(srcreg)); +} + +/** + * Set an instruction's argument B (both RGB and ALPHA) from the given source, + * taking swizzles, negation and absolute value from the given source register. + */ +static void set_argB_reg(struct r500_pfs_compile_state *cs, int ip, int source, struct prog_src_register srcreg) +{ + set_argB(cs, ip, source, make_rgb_swizzle(srcreg), make_alpha_swizzle(srcreg)); +} + +/** + * Set an instruction's argument C (both RGB and ALPHA) from the given source, + * taking swizzles, negation and absolute value from the given source register. + */ +static void set_argC_reg(struct r500_pfs_compile_state *cs, int ip, int source, struct prog_src_register srcreg) +{ + set_argC(cs, ip, source, make_rgb_swizzle(srcreg), make_alpha_swizzle(srcreg)); +} + +/** + * Emit a special scalar operation. + */ +static int emit_sop(struct r500_pfs_compile_state *cs, + int opcode, struct prog_dst_register dstreg, GLuint src, GLuint swiz) +{ + int ip = emit_alu(cs, R500_ALU_RGBA_OP_SOP, opcode, dstreg); + set_src0_direct(cs, ip, src); + set_argA(cs, ip, 0, R500_SWIZ_RGB_ZERO, swiz); + return ip; +} + + +/** + * Emit trigonometric function COS, SIN, SCS + */ +static void emit_trig(struct r500_pfs_compile_state *cs, struct prog_instruction *fpi) +{ + int ip; + struct prog_dst_register temp = dstreg_template; + temp.Index = get_temp(cs, 0); + temp.WriteMask = WRITEMASK_W; + + /* temp = Input*(1/2pi) */ + ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, temp); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1_direct(cs, ip, emit_const4fv(cs, RCP_2PI)); + set_argA(cs, ip, 0, R500_SWIZ_RGB_ZERO, make_sop_swizzle(fpi->SrcReg[0])); + set_argB(cs, ip, 1, R500_SWIZ_RGB_ZERO, SWIZZLE_W); + set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); + + /* temp = frac(dst) */ + ip = emit_alu(cs, R500_ALU_RGBA_OP_FRC, R500_ALPHA_OP_FRC, temp); + set_src0_direct(cs, ip, temp.Index); + set_argA(cs, ip, 0, R500_SWIZ_RGB_RGB, SWIZZLE_W); + + /* Dest = trig(temp) */ + if (fpi->Opcode == OPCODE_COS) { + emit_sop(cs, R500_ALPHA_OP_COS, fpi->DstReg, temp.Index, SWIZZLE_W); + } else if (fpi->Opcode == OPCODE_SIN) { + emit_sop(cs, R500_ALPHA_OP_SIN, fpi->DstReg, temp.Index, SWIZZLE_W); + } else if (fpi->Opcode == OPCODE_SCS) { + struct prog_dst_register moddst = fpi->DstReg; + + if (fpi->DstReg.WriteMask & WRITEMASK_X) { + moddst.WriteMask = WRITEMASK_X; + emit_sop(cs, R500_ALPHA_OP_COS, fpi->DstReg, temp.Index, SWIZZLE_W); + } + if (fpi->DstReg.WriteMask & WRITEMASK_Y) { + moddst.WriteMask = WRITEMASK_Y; + emit_sop(cs, R500_ALPHA_OP_SIN, fpi->DstReg, temp.Index, SWIZZLE_W); + } } } -static int do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction *fpi, int counter) { +/** + * Emit a LIT instruction. + * + * Definition of LIT (from ARB_fragment_program): + * tmp = VectorLoad(op0); + * if (tmp.x < 0) tmp.x = 0; + * if (tmp.y < 0) tmp.y = 0; + * if (tmp.w < -(128.0-epsilon)) tmp.w = -(128.0-epsilon); + * else if (tmp.w > 128-epsilon) tmp.w = 128-epsilon; + * result.x = 1.0; + * result.y = tmp.x; + * result.z = (tmp.x > 0) ? RoughApproxPower(tmp.y, tmp.w) : 0.0; + * result.w = 1.0; + */ +static void emit_lit(struct r500_pfs_compile_state *cs, struct prog_instruction *fpi) +{ + GLuint cnst; + int needTemporary; + GLuint temp; + int ip; + + cnst = emit_const4fv(cs, LIT); + + needTemporary = 0; + if (fpi->DstReg.WriteMask != WRITEMASK_XYZW || fpi->DstReg.File == PROGRAM_OUTPUT) + needTemporary = 1; + + if (needTemporary) { + temp = get_temp(cs, 0); + } else { + temp = fpi->DstReg.Index; + } + + // MAX tmp.xyw, op0, { 0, 0, 0, -128+eps } + ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_MAX, R500_ALPHA_OP_MAX, temp, WRITEMASK_XYW); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1_direct(cs, ip, cnst); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argB(cs, ip, 1, R500_SWIZ_RGB_ZERO, SWIZZLE_W); + + // MIN tmp.z, tmp.w, { 128-eps } + // LG2 tmp.w, tmp.y + ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_MIN, R500_ALPHA_OP_LN2, temp, WRITEMASK_ZW); + set_src0_direct(cs, ip, temp); + set_src1_direct(cs, ip, cnst); + set_argA(cs, ip, 0, SWIZZLE_W | (SWIZZLE_W<<3) | (SWIZZLE_W<<6), SWIZZLE_Y); + set_argB(cs, ip, 1, SWIZZLE_X | (SWIZZLE_X<<3) | (SWIZZLE_X<<6), SWIZZLE_X); + + // MOV tmp.y, tmp.x + // MUL tmp.w, tmp.z, tmp.w + ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, temp, WRITEMASK_YW); + set_src0_direct(cs, ip, temp); + set_argA(cs, ip, 0, SWIZZLE_X | (SWIZZLE_X<<3) | (SWIZZLE_X<<6), SWIZZLE_Z); + set_argB(cs, ip, 0, R500_SWIZ_RGB_ONE, SWIZZLE_W); + set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); + + // MOV tmp.x, 1.0 + // EX2 tmp.w, tmp.w + ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_EX2, temp, WRITEMASK_XW); + set_src0_direct(cs, ip, temp); + set_argA(cs, ip, 0, R500_SWIZ_RGB_ONE, SWIZZLE_W); + set_argB(cs, ip, 0, R500_SWIZ_RGB_ONE, R500_SWIZZLE_ZERO); + set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); + + // tmp.z := (-tmp.x >= 0) ? tmp.y : 0.0 + // MOV tmp.w, 1.0 + ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_CMP, temp, WRITEMASK_ZW); + set_src0_direct(cs, ip, temp); + set_argA(cs, ip, 0, R500_SWIZZLE_ZERO, R500_SWIZZLE_ONE); + set_argB(cs, ip, 0, SWIZZLE_W | (SWIZZLE_W<<3) | (SWIZZLE_W<<6), R500_SWIZZLE_ONE); + set_argC(cs, ip, 0, SWIZZLE_Y | (SWIZZLE_Y<<3) | (SWIZZLE_Y<<6) | (R500_SWIZ_MOD_NEG<<9), R500_SWIZZLE_ZERO); + + if (needTemporary) { + ip = emit_alu(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_CMP, fpi->DstReg); + set_src0_direct(cs, ip, temp); + set_argA(cs, ip, 0, R500_SWIZ_RGB_RGB, SWIZZLE_W); + set_argB(cs, ip, 1, R500_SWIZ_RGB_RGB, SWIZZLE_W); + set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); + } +} + +static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction *fpi) { PROG_CODE; GLuint src[3], dest = 0; - int temp_swiz = 0; + int ip; if (fpi->Opcode != OPCODE_KIL) { dest = make_dest(cs, fpi->DstReg); } switch (fpi->Opcode) { - case OPCODE_ABS: - emit_mov(cs, counter, fpi, make_src(cs, fpi->SrcReg[0]), fpi->SrcReg[0].Swizzle, dest); - code->inst[counter].inst3 |= R500_ALU_RGB_MOD_A_ABS - | R500_ALU_RGB_MOD_B_ABS; - code->inst[counter].inst4 |= R500_ALPHA_MOD_A_ABS - | R500_ALPHA_MOD_B_ABS; - break; case OPCODE_ADD: /* Variation on MAD: 1*src0+src1 */ - emit_mad(cs, counter, fpi, R500_SWIZZLE_ONE, 0, 1); + ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_argA(cs, ip, 0, R500_SWIZ_RGB_ONE, R500_SWIZZLE_ONE); + set_argB_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argC_reg(cs, ip, 1, fpi->SrcReg[1]); break; case OPCODE_CMP: /* This inst's selects need to be swapped as follows: * 0 -> C ; 1 -> B ; 2 -> A */ - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - src[2] = make_src(cs, fpi->SrcReg[2]); - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[2]) - | R500_RGB_ADDR1(src[1]) | R500_RGB_ADDR2(src[0]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[2]) - | R500_ALPHA_ADDR1(src[1]) | R500_ALPHA_ADDR2(src[0]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[2])) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst4 |= R500_ALPHA_OP_CMP - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[2])) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_CMP - | R500_ALU_RGBA_ADDRD(dest) - | R500_ALU_RGBA_SEL_C_SRC2 - | MAKE_SWIZ_RGBA_C(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGBA_ALPHA_SEL_C_SRC2 - | MAKE_SWIZ_ALPHA_C(make_alpha_swizzle(fpi->SrcReg[0])); + ip = emit_alu(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_CMP, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_src2(cs, ip, fpi->SrcReg[2]); + set_argA_reg(cs, ip, 2, fpi->SrcReg[2]); + set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); + set_argC_reg(cs, ip, 0, fpi->SrcReg[0]); break; case OPCODE_COS: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = emit_const4fv(cs, RCP_2PI); - code->inst[counter].inst0 = R500_INST_TYPE_ALU | R500_INST_TEX_SEM_WAIT - | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_RGB) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_RGB); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(get_temp(cs, 0)) - | R500_ALPHA_SEL_A_SRC0 | R500_ALPHA_SWIZ_A_A - | R500_ALPHA_SEL_B_SRC1 | R500_ALPHA_SWIZ_B_A; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(get_temp(cs, 0)) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); - counter++; - code->inst[counter].inst0 = R500_INST_TYPE_ALU | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_RGB); - code->inst[counter].inst4 = R500_ALPHA_OP_FRC - | R500_ALPHA_ADDRD(get_temp(cs, 1)) - | R500_ALPHA_SEL_A_SRC0 | R500_ALPHA_SWIZ_A_A; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_FRC - | R500_ALU_RGBA_ADDRD(get_temp(cs, 1)); - counter++; - emit_sop(cs, counter, fpi, OPCODE_COS, get_temp(cs, 1), make_sop_swizzle(fpi->SrcReg[0]), dest); + emit_trig(cs, fpi); break; case OPCODE_DP3: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst4 |= R500_ALPHA_OP_DP - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_DP3 - | R500_ALU_RGBA_ADDRD(dest); + ip = emit_alu(cs, R500_ALU_RGBA_OP_DP3, R500_ALPHA_OP_DP, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); break; case OPCODE_DP4: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - /* Based on DP3 */ - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst4 |= R500_ALPHA_OP_DP - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_DP4 - | R500_ALU_RGBA_ADDRD(dest); - break; - case OPCODE_DPH: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - /* Based on DP3 */ - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst4 |= R500_ALPHA_OP_DP - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(R500_SWIZZLE_ONE) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_DP4 - | R500_ALU_RGBA_ADDRD(dest); + ip = emit_alu(cs, R500_ALU_RGBA_OP_DP4, R500_ALPHA_OP_DP, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); break; case OPCODE_DST: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); /* [1, src0.y*src1.y, src0.z, src1.w] - * So basically MUL with lotsa swizzling. */ - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | R500_ALU_RGB_SEL_B_SRC1; - /* Select [1, y, z, 1] */ - temp_swiz = (make_rgb_swizzle(fpi->SrcReg[0]) & ~0x7) | R500_SWIZZLE_ONE; - code->inst[counter].inst3 |= MAKE_SWIZ_RGB_A(temp_swiz); - /* Select [1, y, 1, w] */ - temp_swiz = (make_rgb_swizzle(fpi->SrcReg[0]) & ~0x1c7) | R500_SWIZZLE_ONE | (R500_SWIZZLE_ONE << 6); - code->inst[counter].inst3 |= MAKE_SWIZ_RGB_B(temp_swiz); - code->inst[counter].inst4 |= R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(R500_SWIZZLE_ONE) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(dest) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); + * So basically MUL with lotsa swizzling. */ + ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_argA(cs, ip, 0, + (make_rgb_swizzle(fpi->SrcReg[0]) & ~0x7) | R500_SWIZZLE_ONE, + R500_SWIZZLE_ONE); + set_argB(cs, ip, 1, + (make_rgb_swizzle(fpi->SrcReg[0]) & ~0x1c7) | R500_SWIZZLE_ONE | (R500_SWIZZLE_ONE << 6), + make_alpha_swizzle(fpi->SrcReg[1])); + set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); break; case OPCODE_EX2: src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, counter, fpi, OPCODE_EX2, src[0], make_sop_swizzle(fpi->SrcReg[0]), dest); + emit_sop(cs, R500_ALPHA_OP_EX2, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); break; case OPCODE_FLR: - src[0] = make_src(cs, fpi->SrcReg[0]); - code->inst[counter].inst0 = R500_INST_TYPE_ALU | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst4 |= R500_ALPHA_OP_FRC - | R500_ALPHA_ADDRD(get_temp(cs, 0)) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_FRC - | R500_ALU_RGBA_ADDRD(get_temp(cs, 0)); - counter++; - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(get_temp(cs, 0)); - code->inst[counter].inst3 = MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_ONE) - | R500_ALU_RGB_SEL_B_SRC0 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SWIZ_A_A - | R500_ALPHA_SEL_B_SRC0 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(dest) - | R500_ALU_RGBA_SEL_C_SRC1 - | MAKE_SWIZ_RGBA_C(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGBA_ALPHA_SEL_C_SRC1 - | MAKE_SWIZ_ALPHA_C(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGBA_MOD_C_NEG; + dest = get_temp(cs, 0); + ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_FRC, R500_ALPHA_OP_FRC, dest, WRITEMASK_XYZW); + set_src0(cs, ip, fpi->SrcReg[0]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + + ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1_direct(cs, ip, dest); + set_argA_reg(cs, ip, 0, fpi->SrcReg[1]); + set_argB(cs, ip, 0, R500_SWIZ_RGB_ONE, R500_SWIZZLE_ONE); + set_argC(cs, ip, 1, + R500_SWIZ_RGB_RGB|(R500_SWIZ_MOD_NEG<<9), + SWIZZLE_W|(R500_SWIZ_MOD_NEG<<3)); break; case OPCODE_FRC: - src[0] = make_src(cs, fpi->SrcReg[0]); - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst4 |= R500_ALPHA_OP_FRC - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_FRC - | R500_ALU_RGBA_ADDRD(dest); + ip = emit_alu(cs, R500_ALU_RGBA_OP_FRC, R500_ALPHA_OP_FRC, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); break; case OPCODE_LG2: src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, counter, fpi, OPCODE_LG2, src[0], make_sop_swizzle(fpi->SrcReg[0]), dest); + emit_sop(cs, R500_ALPHA_OP_LN2, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); break; case OPCODE_LIT: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = emit_const4fv(cs, LIT); - /* First inst: MAX temp, input, [0, 0, 0, -128] - * Write: RG, A */ - code->inst[counter].inst0 = R500_INST_TYPE_ALU | R500_INST_TEX_SEM_WAIT - | (R500_WRITEMASK_ARG << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_ZERO); - code->inst[counter].inst4 = R500_ALPHA_OP_MAX - | R500_ALPHA_ADDRD(get_temp(cs, 0)) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | R500_ALPHA_SWIZ_B_A; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAX - | R500_ALU_RGBA_ADDRD(get_temp(cs, 0)); - counter++; - /* Second inst: MIN temp, temp, [x, x, x, 128] - * Write: A */ - code->inst[counter].inst0 = R500_INST_TYPE_ALU | (R500_WRITEMASK_A << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 0)) | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 0)) | R500_ALPHA_ADDR1(src[1]); - /* code->inst[counter].inst3; */ - code->inst[counter].inst4 = R500_ALPHA_OP_MAX - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | R500_ALPHA_SWIZ_A_A - | R500_ALPHA_SEL_B_SRC1 | R500_ALPHA_SWIZ_B_A; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAX - | R500_ALU_RGBA_ADDRD(dest); - counter++; - /* Third-fifth insts: POW temp, temp.y, temp.w - * Write: B */ - emit_sop(cs, counter, fpi, OPCODE_LG2, get_temp(cs, 0), SWIZZLE_Y, get_temp(cs, 1)); - code->inst[counter].inst0 |= (R500_WRITEMASK_ARGB << 11); - counter++; - code->inst[counter].inst0 = R500_INST_TYPE_ALU | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 1)) - | R500_RGB_ADDR1(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 1)) - | R500_ALPHA_ADDR1(get_temp(cs, 0)); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_RGB) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_RGB); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(get_temp(cs, 1)) - | R500_ALPHA_SEL_A_SRC0 | R500_ALPHA_SWIZ_A_A - | R500_ALPHA_SEL_B_SRC1 | R500_ALPHA_SWIZ_B_A; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(get_temp(cs, 1)) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); - counter++; - emit_sop(cs, counter, fpi, OPCODE_EX2, get_temp(cs, 1), SWIZZLE_W, get_temp(cs, 0)); - code->inst[counter].inst0 |= (R500_WRITEMASK_B << 11); - counter++; - /* Sixth inst: CMP dest, temp.xxxx, temp.[1, x, z, 1], temp.[1, x, 0, 1]; - * Write: ARGB - * This inst's selects need to be swapped as follows: - * 0 -> C ; 1 -> B ; 2 -> A */ - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | R500_ALU_RGB_R_SWIZ_A_1 - | R500_ALU_RGB_G_SWIZ_A_R - | R500_ALU_RGB_B_SWIZ_A_B - | R500_ALU_RGB_SEL_B_SRC0 - | R500_ALU_RGB_R_SWIZ_B_1 - | R500_ALU_RGB_G_SWIZ_B_R - | R500_ALU_RGB_B_SWIZ_B_0; - code->inst[counter].inst4 |= R500_ALPHA_OP_CMP - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | R500_ALPHA_SWIZ_A_1 - | R500_ALPHA_SEL_B_SRC0 | R500_ALPHA_SWIZ_B_1; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_CMP - | R500_ALU_RGBA_ADDRD(dest) - | R500_ALU_RGBA_SEL_C_SRC0 - | R500_ALU_RGBA_ALPHA_SEL_C_SRC0 - | R500_ALU_RGBA_R_SWIZ_R - | R500_ALU_RGBA_G_SWIZ_R - | R500_ALU_RGBA_B_SWIZ_R - | R500_ALU_RGBA_A_SWIZ_R; + emit_lit(cs, fpi); break; case OPCODE_LRP: - /* src0 * src1 + INV(src0) * src2 - * 1) MUL src0, src1, temp - * 2) PRE 1-src0; MAD srcp, src2, temp */ - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - src[2] = make_src(cs, fpi->SrcReg[2]); - code->inst[counter].inst0 = R500_INST_TYPE_ALU | R500_INST_TEX_SEM_WAIT - | R500_INST_NOP | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(get_temp(cs, 0)) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(get_temp(cs, 0)) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); - counter++; - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[2]) - | R500_RGB_ADDR2(get_temp(cs, 0)) - | R500_RGB_SRCP_OP_1_MINUS_RGB0; - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[2]) - | R500_ALPHA_ADDR2(get_temp(cs, 0)) - | R500_ALPHA_SRCP_OP_1_MINUS_A0; - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRCP - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[2])); - code->inst[counter].inst4 |= R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRCP | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[2])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(dest) - | R500_ALU_RGBA_SEL_C_SRC2 | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_RGB) - | R500_ALU_RGBA_ALPHA_SEL_C_SRC2 | R500_ALU_RGBA_A_SWIZ_A; + /* result = src0*src1 + (1-src0)*src2 + * = src0*src1 + src2 + (-src0)*src2 + * + * Note: LRP without swizzling (or with only limited + * swizzling) could be done more efficiently using the + * presubtract hardware. + */ + dest = get_temp(cs, 0); + ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, dest, WRITEMASK_XYZW); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_src2(cs, ip, fpi->SrcReg[2]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); + set_argC_reg(cs, ip, 2, fpi->SrcReg[2]); + + ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[2]); + set_src2_direct(cs, ip, dest); + set_argA(cs, ip, 0, + make_rgb_swizzle(fpi->SrcReg[0]) ^ (R500_SWIZ_MOD_NEG<<9), + make_alpha_swizzle(fpi->SrcReg[0]) ^ (R500_SWIZ_MOD_NEG<<3)); + set_argB_reg(cs, ip, 1, fpi->SrcReg[2]); + set_argC(cs, ip, 2, R500_SWIZ_RGB_RGB, SWIZZLE_W); break; case OPCODE_MAD: - emit_mad(cs, counter, fpi, 0, 1, 2); + ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_src2(cs, ip, fpi->SrcReg[2]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); + set_argC_reg(cs, ip, 2, fpi->SrcReg[2]); break; case OPCODE_MAX: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGB_SEL_B_SRC1 - | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst4 |= R500_ALPHA_OP_MAX - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAX - | R500_ALU_RGBA_ADDRD(dest); + ip = emit_alu(cs, R500_ALU_RGBA_OP_MAX, R500_ALPHA_OP_MAX, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); break; case OPCODE_MIN: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGB_SEL_B_SRC1 - | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst4 |= R500_ALPHA_OP_MIN - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MIN - | R500_ALU_RGBA_ADDRD(dest); + ip = emit_alu(cs, R500_ALU_RGBA_OP_MIN, R500_ALPHA_OP_MIN, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); break; case OPCODE_MOV: - emit_mov(cs, counter, fpi, make_src(cs, fpi->SrcReg[0]), fpi->SrcReg[0].Swizzle, dest); + ip = emit_alu(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_CMP, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argB_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); + code->inst[ip].inst3 |= R500_ALU_RGB_OMOD_DISABLE; + code->inst[ip].inst4 |= R500_ALPHA_OMOD_DISABLE; break; case OPCODE_MUL: /* Variation on MAD: src0*src1+0 */ - emit_mad(cs, counter, fpi, 0, 1, R500_SWIZZLE_ZERO); - break; - case OPCODE_POW: - /* POW(a,b) = EX2(LN2(a)*b) */ - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - emit_sop(cs, counter, fpi, OPCODE_LG2, src[0], make_sop_swizzle(fpi->SrcReg[0]), get_temp(cs, 0)); - code->inst[counter].inst0 |= (R500_WRITEMASK_ARGB << 11); - counter++; - code->inst[counter].inst0 = R500_INST_TYPE_ALU | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 0)) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 0)) - | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(make_rgb_swizzle(fpi->SrcReg[0])) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(get_temp(cs, 1)) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(get_temp(cs, 1)) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); - counter++; - emit_sop(cs, counter, fpi, OPCODE_EX2, get_temp(cs, 1), make_sop_swizzle(fpi->SrcReg[0]), dest); + ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); + set_src0(cs, ip, fpi->SrcReg[0]); + set_src1(cs, ip, fpi->SrcReg[1]); + set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); + set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); + set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); break; case OPCODE_RCP: src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, counter, fpi, OPCODE_RCP, src[0], make_sop_swizzle(fpi->SrcReg[0]), dest); + emit_sop(cs, R500_ALPHA_OP_RCP, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); break; case OPCODE_RSQ: src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, counter, fpi, OPCODE_RSQ, src[0], make_sop_swizzle(fpi->SrcReg[0]), dest); + emit_sop(cs, R500_ALPHA_OP_RSQ, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); break; case OPCODE_SCS: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = emit_const4fv(cs, RCP_2PI); - code->inst[counter].inst0 = R500_INST_TYPE_ALU | R500_INST_TEX_SEM_WAIT - | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_RGB) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_RGB); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(get_temp(cs, 0)) - | R500_ALPHA_SEL_A_SRC0 | R500_ALPHA_SWIZ_A_A - | R500_ALPHA_SEL_B_SRC1 | R500_ALPHA_SWIZ_B_A; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(get_temp(cs, 0)) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); - counter++; - code->inst[counter].inst0 = R500_INST_TYPE_ALU | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_RGB); - code->inst[counter].inst4 = R500_ALPHA_OP_FRC - | R500_ALPHA_ADDRD(get_temp(cs, 1)) - | R500_ALPHA_SEL_A_SRC0 | R500_ALPHA_SWIZ_A_A; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_FRC - | R500_ALU_RGBA_ADDRD(get_temp(cs, 1)); - counter++; - /* Do a cosine, then a sine, masking out the channels we want to protect. */ - /* Cosine only goes in R (x) channel. */ - fpi->DstReg.WriteMask = 0x1; - emit_sop(cs, counter, fpi, OPCODE_COS, get_temp(cs, 1), make_sop_swizzle(fpi->SrcReg[0]), dest); - counter++; - /* Sine only goes in G (y) channel. */ - fpi->DstReg.WriteMask = 0x2; - emit_sop(cs, counter, fpi, OPCODE_SIN, get_temp(cs, 1), make_sop_swizzle(fpi->SrcReg[0]), dest); - break; - case OPCODE_SGE: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - code->inst[counter].inst0 = R500_INST_TYPE_ALU | R500_INST_TEX_SEM_WAIT - | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR1(src[0]) - | R500_RGB_ADDR2(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR1(src[0]) - | R500_ALPHA_ADDR2(src[1]); - code->inst[counter].inst3 = /* 1 */ - MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_ONE) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(get_temp(cs, 0)) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(R500_SWIZZLE_ONE) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(get_temp(cs, 0)) - | R500_ALU_RGBA_SEL_C_SRC2 - | MAKE_SWIZ_RGBA_C(make_rgb_swizzle(fpi->SrcReg[1])) - | R500_ALU_RGBA_MOD_C_NEG - | R500_ALU_RGBA_ALPHA_SEL_C_SRC2 - | MAKE_SWIZ_ALPHA_C(make_alpha_swizzle(fpi->SrcReg[1])) - | R500_ALU_RGBA_ALPHA_MOD_C_NEG; - counter++; - /* This inst's selects need to be swapped as follows: - * 0 -> C ; 1 -> B ; 2 -> A */ - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_ONE) - | R500_ALU_RGB_SEL_B_SRC0 - | MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_ZERO); - code->inst[counter].inst4 |= R500_ALPHA_OP_CMP - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(R500_SWIZZLE_ONE) - | R500_ALPHA_SEL_B_SRC0 | MAKE_SWIZ_ALPHA_B(R500_SWIZZLE_ZERO); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_CMP - | R500_ALU_RGBA_ADDRD(dest) - | R500_ALU_RGBA_SEL_C_SRC0 - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_RGB) - | R500_ALU_RGBA_ALPHA_SEL_C_SRC0 - | R500_ALU_RGBA_A_SWIZ_A; + emit_trig(cs, fpi); break; case OPCODE_SIN: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = emit_const4fv(cs, RCP_2PI); - code->inst[counter].inst0 = R500_INST_TYPE_ALU | R500_INST_TEX_SEM_WAIT - | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_RGB) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_RGB); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(get_temp(cs, 0)) - | R500_ALPHA_SEL_A_SRC0 | R500_ALPHA_SWIZ_A_A - | R500_ALPHA_SEL_B_SRC1 | R500_ALPHA_SWIZ_B_A; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(get_temp(cs, 0)) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); - counter++; - code->inst[counter].inst0 = R500_INST_TYPE_ALU | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_RGB); - code->inst[counter].inst4 = R500_ALPHA_OP_FRC - | R500_ALPHA_ADDRD(get_temp(cs, 1)) - | R500_ALPHA_SEL_A_SRC0 | R500_ALPHA_SWIZ_A_A; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_FRC - | R500_ALU_RGBA_ADDRD(get_temp(cs, 1)); - counter++; - emit_sop(cs, counter, fpi, OPCODE_SIN, get_temp(cs, 1), make_sop_swizzle(fpi->SrcReg[0]), dest); - break; - case OPCODE_SLT: - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - code->inst[counter].inst0 = R500_INST_TYPE_ALU | R500_INST_TEX_SEM_WAIT - | (R500_WRITEMASK_ARGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR1(src[0]) - | R500_RGB_ADDR2(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR1(src[0]) - | R500_ALPHA_ADDR2(src[1]); - code->inst[counter].inst3 = /* 1 */ - MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_ONE) - | R500_ALU_RGB_SEL_B_SRC1 | MAKE_SWIZ_RGB_B(make_rgb_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(get_temp(cs, 0)) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(R500_SWIZZLE_ONE) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[0])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(get_temp(cs, 0)) - | R500_ALU_RGBA_SEL_C_SRC2 - | MAKE_SWIZ_RGBA_C(make_rgb_swizzle(fpi->SrcReg[1])) - | R500_ALU_RGBA_MOD_C_NEG - | R500_ALU_RGBA_ALPHA_SEL_C_SRC2 - | MAKE_SWIZ_ALPHA_C(make_alpha_swizzle(fpi->SrcReg[1])) - | R500_ALU_RGBA_ALPHA_MOD_C_NEG; - counter++; - /* This inst's selects need to be swapped as follows: - * 0 -> C ; 1 -> B ; 2 -> A */ - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_ZERO) - | R500_ALU_RGB_SEL_B_SRC0 - | MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_ONE); - code->inst[counter].inst4 |= R500_ALPHA_OP_CMP - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(R500_SWIZZLE_ZERO) - | R500_ALPHA_SEL_B_SRC0 | MAKE_SWIZ_ALPHA_B(R500_SWIZZLE_ONE); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_CMP - | R500_ALU_RGBA_ADDRD(dest) - | R500_ALU_RGBA_SEL_C_SRC0 - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_RGB) - | R500_ALU_RGBA_ALPHA_SEL_C_SRC0 - | R500_ALU_RGBA_A_SWIZ_A; - break; - case OPCODE_SUB: - /* Variation on MAD: 1*src0-src1 */ - fpi->SrcReg[1].NegateBase = 0xF; /* NEG_XYZW */ - emit_mad(cs, counter, fpi, R500_SWIZZLE_ONE, 0, 1); - break; - case OPCODE_SWZ: - /* TODO: The rarer negation masks! */ - emit_mov(cs, counter, fpi, make_src(cs, fpi->SrcReg[0]), fpi->SrcReg[0].Swizzle, dest); - break; - case OPCODE_XPD: - /* src0 * src1 - src1 * src0 - * 1) MUL temp.xyz, src0.yzx, src1.zxy - * 2) MAD src0.zxy, src1.yzx, -temp.xyz */ - src[0] = make_src(cs, fpi->SrcReg[0]); - src[1] = make_src(cs, fpi->SrcReg[1]); - code->inst[counter].inst0 = R500_INST_TYPE_ALU | R500_INST_TEX_SEM_WAIT - | (R500_WRITEMASK_RGB << 11); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]); - /* Select [y, z, x] */ - temp_swiz = make_rgb_swizzle(fpi->SrcReg[0]); - temp_swiz = (GET_SWZ(temp_swiz, 1) << 0) | (GET_SWZ(temp_swiz, 2) << 3) | (GET_SWZ(temp_swiz, 0) << 6); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(temp_swiz); - /* Select [z, x, y] */ - temp_swiz = make_rgb_swizzle(fpi->SrcReg[1]); - temp_swiz = (GET_SWZ(temp_swiz, 2) << 0) | (GET_SWZ(temp_swiz, 0) << 3) | (GET_SWZ(temp_swiz, 1) << 6); - code->inst[counter].inst3 |= R500_ALU_RGB_SEL_B_SRC1 - | MAKE_SWIZ_RGB_B(temp_swiz); - code->inst[counter].inst4 = R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(get_temp(cs, 0)) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(make_alpha_swizzle(fpi->SrcReg[0])) - | R500_ALPHA_SEL_B_SRC1 | MAKE_SWIZ_ALPHA_B(make_alpha_swizzle(fpi->SrcReg[1])); - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(get_temp(cs, 0)) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); - counter++; - emit_alu(cs, counter, fpi); - code->inst[counter].inst1 = R500_RGB_ADDR0(src[0]) - | R500_RGB_ADDR1(src[1]) - | R500_RGB_ADDR2(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(src[0]) - | R500_ALPHA_ADDR1(src[1]) - | R500_ALPHA_ADDR2(get_temp(cs, 0)); - /* Select [z, x, y] */ - temp_swiz = make_rgb_swizzle(fpi->SrcReg[0]); - temp_swiz = (GET_SWZ(temp_swiz, 2) << 0) | (GET_SWZ(temp_swiz, 0) << 3) | (GET_SWZ(temp_swiz, 1) << 6); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(temp_swiz); - /* Select [y, z, x] */ - temp_swiz = make_rgb_swizzle(fpi->SrcReg[1]); - temp_swiz = (GET_SWZ(temp_swiz, 1) << 0) | (GET_SWZ(temp_swiz, 2) << 3) | (GET_SWZ(temp_swiz, 0) << 6); - code->inst[counter].inst3 |= R500_ALU_RGB_SEL_B_SRC1 - | MAKE_SWIZ_RGB_B(temp_swiz); - code->inst[counter].inst4 |= R500_ALPHA_OP_MAD - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SWIZ_A_1 - | R500_ALPHA_SWIZ_B_1; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_MAD - | R500_ALU_RGBA_ADDRD(dest) - | R500_ALU_RGBA_SEL_C_SRC2 - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_RGB) - | R500_ALU_RGBA_MOD_C_NEG - | R500_ALU_RGBA_A_SWIZ_0; + emit_trig(cs, fpi); break; case OPCODE_KIL: case OPCODE_TEX: case OPCODE_TXB: case OPCODE_TXP: - emit_tex(cs, fpi, dest, counter); - if (fpi->DstReg.File == PROGRAM_OUTPUT) - counter++; + emit_tex(cs, fpi, dest); break; default: ERROR("unknown fpi->Opcode %s\n", _mesa_opcode_string(fpi->Opcode)); @@ -1245,37 +928,30 @@ static int do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction *f /* Finishing touches */ if (fpi->SaturateMode == SATURATE_ZERO_ONE) { - code->inst[counter].inst0 |= R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP; + code->inst[cs->nrslots-1].inst0 |= R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP; } - - counter++; - - return counter; } static GLboolean parse_program(struct r500_pfs_compile_state *cs) { PROG_CODE; - int counter = 0; struct prog_instruction* fpi; for(fpi = cs->compiler->program->Instructions; fpi->Opcode != OPCODE_END; ++fpi) { - counter = do_inst(cs, fpi, counter); + do_inst(cs, fpi); if (cs->compiler->fp->error) return GL_FALSE; } /* Finish him! (If it's an ALU/OUT instruction...) */ - if ((code->inst[counter-1].inst0 & 0x3) == 1) { - code->inst[counter-1].inst0 |= R500_INST_LAST; + if ((code->inst[cs->nrslots-1].inst0 & 0x3) == 1) { + code->inst[cs->nrslots-1].inst0 |= R500_INST_LAST; } else { /* We still need to put an output inst, right? */ WARN_ONCE("Final FP instruction is not an OUT.\n"); } - cs->nrslots = counter; - code->max_temp_idx++; return GL_TRUE; @@ -1295,12 +971,10 @@ static void init_program(struct r500_pfs_compile_state *cs) driQueryOptioni(&cs->compiler->r300->radeon.optionCache, "fp_optimization"); cs->compiler->fp->translated = GL_FALSE; cs->compiler->fp->error = GL_FALSE; - code->const_nr = 0; - /* Size of pixel stack, plus 1. */ - code->max_temp_idx = 1; - /* Temp register offset. */ - code->temp_reg_offset = 0; - /* Whether or not we perform any depth writing. */ + + _mesa_bzero(code, sizeof(*code)); + code->max_temp_idx = 1; /* Size of pixel stack, plus 1. */ + cs->nrslots = 0; cs->compiler->fp->writes_depth = GL_FALSE; /* Work out what temps the Mesa inputs correspond to, this must match -- cgit v1.2.3 From 77fdfaa23adeaaf6a217ef1ee751410c6a5b0d21 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 20:01:20 +0200 Subject: r300: Correctly scan for used temporary registers This fixes a regression introduced by dea8719f0... --- src/mesa/drivers/dri/r300/r300_fragprog.c | 28 ++++----- src/mesa/drivers/dri/r300/r500_fragprog.c | 18 +++--- src/mesa/drivers/dri/r300/radeon_program.c | 52 +++++++++++++--- src/mesa/drivers/dri/r300/radeon_program.h | 20 +++++- src/mesa/drivers/dri/r300/radeon_program_alu.c | 84 +++++++++++++------------- src/mesa/drivers/dri/r300/radeon_program_alu.h | 3 +- 6 files changed, 126 insertions(+), 79 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c index 8c49e8ada68..6a8ef0ef5fc 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog.c @@ -68,7 +68,7 @@ static void reset_srcreg(struct prog_src_register* reg) * be reused. */ static GLboolean transform_TEX( - GLcontext *ctx, struct gl_program *p, + struct radeon_transform_context *t, struct prog_instruction* orig_inst, void* data) { struct r300_fragment_program_compiler *compiler = @@ -84,11 +84,11 @@ static GLboolean transform_TEX( return GL_FALSE; if (inst.Opcode != OPCODE_KIL && - p->ShadowSamplers & (1 << inst.TexSrcUnit)) { + t->Program->ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; if (comparefunc == GL_NEVER || comparefunc == GL_ALWAYS) { - tgt = radeonAppendInstructions(p, 1); + tgt = radeonAppendInstructions(t->Program, 1); tgt->Opcode = OPCODE_MOV; tgt->DstReg = inst.DstReg; @@ -98,7 +98,7 @@ static GLboolean transform_TEX( } inst.DstReg.File = PROGRAM_TEMPORARY; - inst.DstReg.Index = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + inst.DstReg.Index = radeonFindFreeTemporary(t); inst.DstReg.WriteMask = WRITEMASK_XYZW; } @@ -113,7 +113,7 @@ static GLboolean transform_TEX( 0 }; - int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + int tempreg = radeonFindFreeTemporary(t); int factor_index; tokens[2] = inst.TexSrcUnit; @@ -121,7 +121,7 @@ static GLboolean transform_TEX( _mesa_add_state_reference( compiler->fp->mesa_program.Base.Parameters, tokens); - tgt = radeonAppendInstructions(p, 1); + tgt = radeonAppendInstructions(t->Program, 1); tgt->Opcode = OPCODE_MUL; tgt->DstReg.File = PROGRAM_TEMPORARY; @@ -140,9 +140,9 @@ static GLboolean transform_TEX( */ if (inst.SrcReg[0].Swizzle != SWIZZLE_NOOP || inst.SrcReg[0].Abs || inst.SrcReg[0].NegateBase || inst.SrcReg[0].NegateAbs) { - int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + int tempreg = radeonFindFreeTemporary(t); - tgt = radeonAppendInstructions(p, 1); + tgt = radeonAppendInstructions(t->Program, 1); tgt->Opcode = OPCODE_MOV; tgt->DstReg.File = PROGRAM_TEMPORARY; @@ -157,7 +157,7 @@ static GLboolean transform_TEX( if (inst.Opcode != OPCODE_KIL) { if (inst.DstReg.File != PROGRAM_TEMPORARY || inst.DstReg.WriteMask != WRITEMASK_XYZW) { - int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + int tempreg = radeonFindFreeTemporary(t); inst.DstReg.File = PROGRAM_TEMPORARY; inst.DstReg.Index = tempreg; @@ -166,16 +166,16 @@ static GLboolean transform_TEX( } } - tgt = radeonAppendInstructions(p, 1); + tgt = radeonAppendInstructions(t->Program, 1); _mesa_copy_instructions(tgt, &inst, 1); if (inst.Opcode != OPCODE_KIL && - p->ShadowSamplers & (1 << inst.TexSrcUnit)) { + t->Program->ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode; - int rcptemp = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + int rcptemp = radeonFindFreeTemporary(t); - tgt = radeonAppendInstructions(p, 3); + tgt = radeonAppendInstructions(t->Program, 3); tgt[0].Opcode = OPCODE_RCP; tgt[0].DstReg.File = PROGRAM_TEMPORARY; @@ -222,7 +222,7 @@ static GLboolean transform_TEX( tgt[2].SrcReg[2].Swizzle = SWIZZLE_1111; } } else if (destredirect) { - tgt = radeonAppendInstructions(p, 1); + tgt = radeonAppendInstructions(t->Program, 1); tgt->Opcode = OPCODE_MOV; tgt->DstReg = orig_inst->DstReg; diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index b46e924ac7b..7ee84947225 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -38,7 +38,7 @@ * */ static GLboolean transform_TEX( - GLcontext *ctx, struct gl_program *p, + struct radeon_transform_context *t, struct prog_instruction* orig_inst, void* data) { struct r500_fragment_program_compiler *compiler = @@ -55,11 +55,11 @@ static GLboolean transform_TEX( /* ARB_shadow & EXT_shadow_funcs */ if (inst.Opcode != OPCODE_KIL && - p->ShadowSamplers & (1 << inst.TexSrcUnit)) { + t->Program->ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; if (comparefunc == GL_NEVER || comparefunc == GL_ALWAYS) { - tgt = radeonAppendInstructions(p, 1); + tgt = radeonAppendInstructions(t->Program, 1); tgt->Opcode = OPCODE_MOV; tgt->DstReg.File = inst.DstReg.File; @@ -71,20 +71,20 @@ static GLboolean transform_TEX( } inst.DstReg.File = PROGRAM_TEMPORARY; - inst.DstReg.Index = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + inst.DstReg.Index = radeonFindFreeTemporary(t); inst.DstReg.WriteMask = WRITEMASK_XYZW; } - tgt = radeonAppendInstructions(p, 1); + tgt = radeonAppendInstructions(t->Program, 1); _mesa_copy_instructions(tgt, &inst, 1); if (inst.Opcode != OPCODE_KIL && - p->ShadowSamplers & (1 << inst.TexSrcUnit)) { + t->Program->ShadowSamplers & (1 << inst.TexSrcUnit)) { GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func; GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode; - int rcptemp = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + int rcptemp = radeonFindFreeTemporary(t); - tgt = radeonAppendInstructions(p, 3); + tgt = radeonAppendInstructions(t->Program, 3); tgt[0].Opcode = OPCODE_RCP; tgt[0].DstReg.File = PROGRAM_TEMPORARY; @@ -131,7 +131,7 @@ static GLboolean transform_TEX( tgt[2].SrcReg[2].Swizzle = SWIZZLE_1111; } } else if (destredirect) { - tgt = radeonAppendInstructions(p, 1); + tgt = radeonAppendInstructions(t->Program, 1); tgt->Opcode = OPCODE_MOV; tgt->DstReg = orig_inst->DstReg; diff --git a/src/mesa/drivers/dri/r300/radeon_program.c b/src/mesa/drivers/dri/r300/radeon_program.c index 3112339f81c..da5e7aefce5 100644 --- a/src/mesa/drivers/dri/r300/radeon_program.c +++ b/src/mesa/drivers/dri/r300/radeon_program.c @@ -46,29 +46,30 @@ * one instruction at a time. */ void radeonLocalTransform( - GLcontext *ctx, + GLcontext *Ctx, struct gl_program *program, int num_transformations, struct radeon_program_transformation* transformations) { - struct prog_instruction *source; - int numinstructions; + struct radeon_transform_context ctx; int ip; - source = program->Instructions; - numinstructions = program->NumInstructions; + ctx.Ctx = Ctx; + ctx.Program = program; + ctx.OldInstructions = program->Instructions; + ctx.OldNumInstructions = program->NumInstructions; program->Instructions = 0; program->NumInstructions = 0; - for(ip = 0; ip < numinstructions; ++ip) { - struct prog_instruction *instr = source + ip; + for(ip = 0; ip < ctx.OldNumInstructions; ++ip) { + struct prog_instruction *instr = ctx.OldInstructions + ip; int i; for(i = 0; i < num_transformations; ++i) { struct radeon_program_transformation* t = transformations + i; - if (t->function(ctx, program, instr, t->userData)) + if (t->function(&ctx, instr, t->userData)) break; } @@ -78,7 +79,40 @@ void radeonLocalTransform( } } - _mesa_free_instructions(source, numinstructions); + _mesa_free_instructions(ctx.OldInstructions, ctx.OldNumInstructions); +} + + +static void scan_instructions(GLboolean* used, const struct prog_instruction* insts, GLuint count) +{ + GLuint i; + for (i = 0; i < count; i++) { + const struct prog_instruction *inst = insts + i; + const GLuint n = _mesa_num_inst_src_regs(inst->Opcode); + GLuint k; + + for (k = 0; k < n; k++) { + if (inst->SrcReg[k].File == PROGRAM_TEMPORARY) + used[inst->SrcReg[k].Index] = GL_TRUE; + } + } +} + +GLint radeonFindFreeTemporary(struct radeon_transform_context *t) +{ + GLboolean used[MAX_PROGRAM_TEMPS]; + GLuint i; + + _mesa_memset(used, 0, sizeof(used)); + scan_instructions(used, t->Program->Instructions, t->Program->NumInstructions); + scan_instructions(used, t->OldInstructions, t->OldNumInstructions); + + for (i = 0; i < MAX_PROGRAM_TEMPS; i++) { + if (!used[i]) + return i; + } + + return -1; } diff --git a/src/mesa/drivers/dri/r300/radeon_program.h b/src/mesa/drivers/dri/r300/radeon_program.h index 012104fa5ae..ba76bc47cfb 100644 --- a/src/mesa/drivers/dri/r300/radeon_program.h +++ b/src/mesa/drivers/dri/r300/radeon_program.h @@ -48,6 +48,19 @@ enum { #define SWIZZLE_0000 MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO) #define SWIZZLE_1111 MAKE_SWIZZLE4(SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE) +/** + * Transformation context that is passed to local transformations. + * + * Care must be taken with some operations during transformation, + * e.g. finding new temporary registers must use @ref radeonFindFreeTemporary + */ +struct radeon_transform_context { + GLcontext *Ctx; + struct gl_program *Program; + struct prog_instruction *OldInstructions; + GLuint OldNumInstructions; +}; + /** * A transformation that can be passed to \ref radeonLocalTransform. * @@ -60,8 +73,7 @@ enum { */ struct radeon_program_transformation { GLboolean (*function)( - GLcontext*, - struct gl_program*, + struct radeon_transform_context*, struct prog_instruction*, void*); void *userData; @@ -73,6 +85,10 @@ void radeonLocalTransform( int num_transformations, struct radeon_program_transformation* transformations); +/** + * Find a usable free temporary register during program transformation + */ +GLint radeonFindFreeTemporary(struct radeon_transform_context *ctx); struct prog_instruction *radeonAppendInstructions(struct gl_program *program, int count); diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.c b/src/mesa/drivers/dri/r300/radeon_program_alu.c index 3104d07facd..d6d016d7c12 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.c @@ -148,24 +148,24 @@ static struct prog_src_register scalar(struct prog_src_register reg) return swizzle(reg, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X); } -static void transform_ABS(struct gl_program* p, +static void transform_ABS(struct radeon_transform_context* t, struct prog_instruction* inst) { struct prog_src_register src = inst->SrcReg[0]; src.Abs = 1; src.NegateBase = 0; src.NegateAbs = 0; - emit1(p, OPCODE_MOV, inst->DstReg, src); + emit1(t->Program, OPCODE_MOV, inst->DstReg, src); } -static void transform_DPH(struct gl_program* p, +static void transform_DPH(struct radeon_transform_context* t, struct prog_instruction* inst) { struct prog_src_register src0 = inst->SrcReg[0]; if (src0.NegateAbs) { if (src0.Abs) { - int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); - emit1(p, OPCODE_MOV, dstreg(PROGRAM_TEMPORARY, tempreg), src0); + int tempreg = radeonFindFreeTemporary(t); + emit1(t->Program, OPCODE_MOV, dstreg(PROGRAM_TEMPORARY, tempreg), src0); src0 = srcreg(src0.File, src0.Index); } else { src0.NegateAbs = 0; @@ -174,70 +174,70 @@ static void transform_DPH(struct gl_program* p, } set_swizzle(&src0, 3, SWIZZLE_ONE); set_negate_base(&src0, 3, 0); - emit2(p, OPCODE_DP4, inst->DstReg, src0, inst->SrcReg[1]); + emit2(t->Program, OPCODE_DP4, inst->DstReg, src0, inst->SrcReg[1]); } -static void transform_FLR(struct gl_program* p, +static void transform_FLR(struct radeon_transform_context* t, struct prog_instruction* inst) { - int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); - emit1(p, OPCODE_FRC, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0]); - emit2(p, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg))); + int tempreg = radeonFindFreeTemporary(t); + emit1(t->Program, OPCODE_FRC, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0]); + emit2(t->Program, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg))); } -static void transform_POW(struct gl_program* p, +static void transform_POW(struct radeon_transform_context* t, struct prog_instruction* inst) { - int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + int tempreg = radeonFindFreeTemporary(t); struct prog_dst_register tempdst = dstreg(PROGRAM_TEMPORARY, tempreg); struct prog_src_register tempsrc = srcreg(PROGRAM_TEMPORARY, tempreg); tempdst.WriteMask = WRITEMASK_W; tempsrc.Swizzle = SWIZZLE_WWWW; - emit1(p, OPCODE_LG2, tempdst, scalar(inst->SrcReg[0])); - emit2(p, OPCODE_MUL, tempdst, tempsrc, scalar(inst->SrcReg[1])); - emit1(p, OPCODE_EX2, inst->DstReg, tempsrc); + emit1(t->Program, OPCODE_LG2, tempdst, scalar(inst->SrcReg[0])); + emit2(t->Program, OPCODE_MUL, tempdst, tempsrc, scalar(inst->SrcReg[1])); + emit1(t->Program, OPCODE_EX2, inst->DstReg, tempsrc); } -static void transform_SGE(struct gl_program* p, +static void transform_SGE(struct radeon_transform_context* t, struct prog_instruction* inst) { - int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + int tempreg = radeonFindFreeTemporary(t); - emit2(p, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); - emit3(p, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_zero, builtin_one); + emit2(t->Program, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); + emit3(t->Program, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_zero, builtin_one); } -static void transform_SLT(struct gl_program* p, +static void transform_SLT(struct radeon_transform_context* t, struct prog_instruction* inst) { - int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + int tempreg = radeonFindFreeTemporary(t); - emit2(p, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); - emit3(p, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_one, builtin_zero); + emit2(t->Program, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); + emit3(t->Program, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_one, builtin_zero); } -static void transform_SUB(struct gl_program* p, +static void transform_SUB(struct radeon_transform_context* t, struct prog_instruction* inst) { - emit2(p, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(inst->SrcReg[1])); + emit2(t->Program, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(inst->SrcReg[1])); } -static void transform_SWZ(struct gl_program* p, +static void transform_SWZ(struct radeon_transform_context* t, struct prog_instruction* inst) { - emit1(p, OPCODE_MOV, inst->DstReg, inst->SrcReg[0]); + emit1(t->Program, OPCODE_MOV, inst->DstReg, inst->SrcReg[0]); } -static void transform_XPD(struct gl_program* p, +static void transform_XPD(struct radeon_transform_context* t, struct prog_instruction* inst) { - int tempreg = _mesa_find_free_register(p, PROGRAM_TEMPORARY); + int tempreg = radeonFindFreeTemporary(t); - emit2(p, OPCODE_MUL, dstreg(PROGRAM_TEMPORARY, tempreg), + emit2(t->Program, OPCODE_MUL, dstreg(PROGRAM_TEMPORARY, tempreg), swizzle(inst->SrcReg[0], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W), swizzle(inst->SrcReg[1], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W)); - emit3(p, OPCODE_MAD, inst->DstReg, + emit3(t->Program, OPCODE_MAD, inst->DstReg, swizzle(inst->SrcReg[0], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W), swizzle(inst->SrcReg[1], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W), negate(srcreg(PROGRAM_TEMPORARY, tempreg))); @@ -257,22 +257,20 @@ static void transform_XPD(struct gl_program* p, * * @todo add LIT here as well? */ -GLboolean radeonTransformALU( - GLcontext* ctx, - struct gl_program* prog, +GLboolean radeonTransformALU(struct radeon_transform_context* t, struct prog_instruction* inst, void* unused) { switch(inst->Opcode) { - case OPCODE_ABS: transform_ABS(prog, inst); return GL_TRUE; - case OPCODE_DPH: transform_DPH(prog, inst); return GL_TRUE; - case OPCODE_FLR: transform_FLR(prog, inst); return GL_TRUE; - case OPCODE_POW: transform_POW(prog, inst); return GL_TRUE; - case OPCODE_SGE: transform_SGE(prog, inst); return GL_TRUE; - case OPCODE_SLT: transform_SLT(prog, inst); return GL_TRUE; - case OPCODE_SUB: transform_SUB(prog, inst); return GL_TRUE; - case OPCODE_SWZ: transform_SWZ(prog, inst); return GL_TRUE; - case OPCODE_XPD: transform_XPD(prog, inst); return GL_TRUE; + case OPCODE_ABS: transform_ABS(t, inst); return GL_TRUE; + case OPCODE_DPH: transform_DPH(t, inst); return GL_TRUE; + case OPCODE_FLR: transform_FLR(t, inst); return GL_TRUE; + case OPCODE_POW: transform_POW(t, inst); return GL_TRUE; + case OPCODE_SGE: transform_SGE(t, inst); return GL_TRUE; + case OPCODE_SLT: transform_SLT(t, inst); return GL_TRUE; + case OPCODE_SUB: transform_SUB(t, inst); return GL_TRUE; + case OPCODE_SWZ: transform_SWZ(t, inst); return GL_TRUE; + case OPCODE_XPD: transform_XPD(t, inst); return GL_TRUE; default: return GL_FALSE; } diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.h b/src/mesa/drivers/dri/r300/radeon_program_alu.h index f5beb9f8c30..858c5ed0b8c 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.h +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.h @@ -31,8 +31,7 @@ #include "radeon_program.h" GLboolean radeonTransformALU( - GLcontext*, - struct gl_program*, + struct radeon_transform_context *t, struct prog_instruction*, void*); -- cgit v1.2.3 From 62bccd6df0c963a14e801bcac95dc8046b978a7f Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 22:21:24 +0200 Subject: r300: Allow adding parameters during fragprog transform, share LIT code --- src/mesa/drivers/dri/r300/r300_context.h | 24 ++--- src/mesa/drivers/dri/r300/r300_fragprog.c | 18 +++- src/mesa/drivers/dri/r300/r300_fragprog_emit.c | 143 ++++--------------------- src/mesa/drivers/dri/r300/r300_state.c | 41 +++++-- src/mesa/drivers/dri/r300/r500_fragprog.c | 12 ++- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 112 +++---------------- src/mesa/drivers/dri/r300/radeon_program_alu.c | 124 +++++++++++++++++++-- 7 files changed, 216 insertions(+), 258 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h index a24ab0cad76..a69beba9a7b 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -716,14 +716,11 @@ struct r300_fragment_program_code { int tex_offset; int tex_end; - /* Hardware constants. - * Contains a pointer to the value. The destination of the pointer - * is supposed to be updated when GL state changes. - * Typically, this is either a pointer into - * gl_program_parameter_list::ParameterValues, or a pointer to a - * global constant (e.g. for sin/cos-approximation) + /** + * Remember which program register a given hardware constant + * belongs to. */ - const GLfloat *constant[PFS_NUM_CONST_REGS]; + struct prog_src_register constant[PFS_NUM_CONST_REGS]; int const_nr; int max_temp_idx; @@ -787,14 +784,11 @@ struct r500_fragment_program_code { int inst_offset; int inst_end; - /* Hardware constants. - * Contains a pointer to the value. The destination of the pointer - * is supposed to be updated when GL state changes. - * Typically, this is either a pointer into - * gl_program_parameter_list::ParameterValues, or a pointer to a - * global constant (e.g. for sin/cos-approximation) - */ - const GLfloat *constant[PFS_NUM_CONST_REGS]; + /** + * Remember which program register a given hardware constant + * belongs to. + */ + struct prog_src_register constant[PFS_NUM_CONST_REGS]; int const_nr; int max_temp_idx; diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c index 6a8ef0ef5fc..57987f5d0fc 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog.c @@ -117,9 +117,7 @@ static GLboolean transform_TEX( int factor_index; tokens[2] = inst.TexSrcUnit; - factor_index = - _mesa_add_state_reference( - compiler->fp->mesa_program.Base.Parameters, tokens); + factor_index = _mesa_add_state_reference(t->Program->Parameters, tokens); tgt = radeonAppendInstructions(t->Program, 1); @@ -303,7 +301,7 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) i++; /* viewport transformation */ - window_index = _mesa_add_state_reference(compiler->fp->mesa_program.Base.Parameters, tokens); + window_index = _mesa_add_state_reference(compiler->program->Parameters, tokens); fpi[i].Opcode = OPCODE_MAD; @@ -401,6 +399,11 @@ void r300TranslateFragmentShader(r300ContextPtr r300, compiler.code = &fp->code; compiler.program = _mesa_clone_program(r300->radeon.glCtx, &fp->mesa_program.Base); + if (RADEON_DEBUG & DEBUG_PIXEL) { + _mesa_printf("Fragment Program: Initial program:\n"); + _mesa_print_program(compiler.program); + } + insert_WPOS_trailer(&compiler); struct radeon_program_transformation transformations[] = { @@ -413,13 +416,18 @@ void r300TranslateFragmentShader(r300ContextPtr r300, 2, transformations); if (RADEON_DEBUG & DEBUG_PIXEL) { - _mesa_printf("Program after transformations:\n"); + _mesa_printf("Fragment Program: After transformations:\n"); _mesa_print_program(compiler.program); } if (!r300FragmentProgramEmit(&compiler)) fp->error = GL_TRUE; + /* Subtle: Rescue any parameters that have been added during transformations */ + _mesa_free_parameter_list(fp->mesa_program.Base.Parameters); + fp->mesa_program.Base.Parameters = compiler.program->Parameters; + compiler.program->Parameters = 0; + _mesa_reference_program(r300->radeon.glCtx, &compiler.program, NULL); if (!fp->error) diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c index 889631f7054..d95008edc06 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c @@ -549,22 +549,17 @@ static void free_temp(struct r300_pfs_compile_state *cs, GLuint r) /** * Emit a hardware constant/parameter. - * - * \p cp Stable pointer to an array of 4 floats. - * The pointer must be stable in the sense that it remains to be valid - * and hold the contents of the constant/parameter throughout the lifetime - * of the fragment program (actually, up until the next time the fragment - * program is translated). */ static GLuint emit_const4fv(struct r300_pfs_compile_state *cs, - const GLfloat * cp) + struct prog_src_register srcreg) { COMPILE_STATE; GLuint reg = undef; int index; for (index = 0; index < code->const_nr; ++index) { - if (code->constant[index] == cp) + if (code->constant[index].File == srcreg.File && + code->constant[index].Index == srcreg.Index) break; } @@ -575,7 +570,7 @@ static GLuint emit_const4fv(struct r300_pfs_compile_state *cs, } code->const_nr++; - code->constant[index] = cp; + code->constant[index] = srcreg; } REG_SET_TYPE(reg, REG_TYPE_CONST); @@ -806,20 +801,11 @@ static GLuint t_src(struct r300_pfs_compile_state *cs, REG_SET_TYPE(r, REG_TYPE_INPUT); break; case PROGRAM_LOCAL_PARAM: - r = emit_const4fv(cs, - fp->mesa_program.Base.LocalParams[fpsrc. - Index]); - break; case PROGRAM_ENV_PARAM: - r = emit_const4fv(cs, - cs->compiler->r300->radeon.glCtx->FragmentProgram.Parameters[fpsrc.Index]); - break; case PROGRAM_STATE_VAR: case PROGRAM_NAMED_PARAM: case PROGRAM_CONSTANT: - r = emit_const4fv(cs, - fp->mesa_program.Base.Parameters-> - ParameterValues[fpsrc.Index]); + r = emit_const4fv(cs, fpsrc); break; case PROGRAM_BUILTIN: switch(fpsrc.Swizzle) { @@ -1452,100 +1438,17 @@ static GLfloat SinCosConsts[2][4] = { } }; -/** - * Emit a LIT instruction. - * \p flags may be PFS_FLAG_SAT - * - * Definition of LIT (from ARB_fragment_program): - * tmp = VectorLoad(op0); - * if (tmp.x < 0) tmp.x = 0; - * if (tmp.y < 0) tmp.y = 0; - * if (tmp.w < -(128.0-epsilon)) tmp.w = -(128.0-epsilon); - * else if (tmp.w > 128-epsilon) tmp.w = 128-epsilon; - * result.x = 1.0; - * result.y = tmp.x; - * result.z = (tmp.x > 0) ? RoughApproxPower(tmp.y, tmp.w) : 0.0; - * result.w = 1.0; - * - * The longest path of computation is the one leading to result.z, - * consisting of 5 operations. This implementation of LIT takes - * 5 slots. So unless there's some special undocumented opcode, - * this implementation is potentially optimal. Unfortunately, - * emit_arith is a bit too conservative because it doesn't understand - * partial writes to the vector component. - */ -static const GLfloat LitConst[4] = - { 127.999999, 127.999999, 127.999999, -127.999999 }; - -static void emit_lit(struct r300_pfs_compile_state *cs, - GLuint dest, int mask, GLuint src, int flags) +static GLuint emit_sincosconsts(struct r300_pfs_compile_state *cs, int i) { - COMPILE_STATE; - GLuint cnst; - int needTemporary; - GLuint temp; - - cnst = emit_const4fv(cs, LitConst); - - needTemporary = 0; - if ((mask & WRITEMASK_XYZW) != WRITEMASK_XYZW) { - needTemporary = 1; - } else if (REG_GET_TYPE(dest) == REG_TYPE_OUTPUT) { - // LIT is typically followed by DP3/DP4, so there's no point - // in creating special code for this case - needTemporary = 1; - } + struct prog_src_register srcreg; + GLuint constant_swizzle; - if (needTemporary) { - temp = keep(get_temp_reg(cs)); - } else { - temp = keep(dest); - } + srcreg.File = PROGRAM_CONSTANT; + srcreg.Index = _mesa_add_unnamed_constant(cs->compiler->program->Parameters, + SinCosConsts[i], 4, &constant_swizzle); + srcreg.Swizzle = constant_swizzle; - // Note: The order of emit_arith inside the slots is relevant, - // because emit_arith only looks at scalar vs. vector when resolving - // dependencies, and it does not consider individual vector components, - // so swizzling between the two parts can create fake dependencies. - - // First slot - emit_arith(cs, PFS_OP_MAX, temp, WRITEMASK_XY, - keep(src), pfs_zero, undef, 0); - emit_arith(cs, PFS_OP_MAX, temp, WRITEMASK_W, src, cnst, undef, 0); - - // Second slot - emit_arith(cs, PFS_OP_MIN, temp, WRITEMASK_Z, - swizzle(temp, W, W, W, W), cnst, undef, 0); - emit_arith(cs, PFS_OP_LG2, temp, WRITEMASK_W, - swizzle(temp, Y, Y, Y, Y), undef, undef, 0); - - // Third slot - // If desired, we saturate the y result here. - // This does not affect the use as a condition variable in the CMP later - emit_arith(cs, PFS_OP_MAD, temp, WRITEMASK_W, - temp, swizzle(temp, Z, Z, Z, Z), pfs_zero, 0); - emit_arith(cs, PFS_OP_MAD, temp, WRITEMASK_Y, - swizzle(temp, X, X, X, X), pfs_one, pfs_zero, flags); - - // Fourth slot - emit_arith(cs, PFS_OP_MAD, temp, WRITEMASK_X, - pfs_one, pfs_one, pfs_zero, 0); - emit_arith(cs, PFS_OP_EX2, temp, WRITEMASK_W, temp, undef, undef, 0); - - // Fifth slot - emit_arith(cs, PFS_OP_CMP, temp, WRITEMASK_Z, - pfs_zero, swizzle(temp, W, W, W, W), - negate(swizzle(temp, Y, Y, Y, Y)), flags); - emit_arith(cs, PFS_OP_MAD, temp, WRITEMASK_W, pfs_one, pfs_one, - pfs_zero, 0); - - if (needTemporary) { - emit_arith(cs, PFS_OP_MAD, dest, mask, - temp, pfs_one, pfs_zero, flags); - free_temp(cs, temp); - } else { - // Decrease refcount of the destination - t_hw_dst(cs, dest, GL_FALSE, cs->nrslots); - } + return emit_const4fv(cs, srcreg); } static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_instruction *fpi) @@ -1577,8 +1480,8 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst src[1] = t_src(cs, fpi->SrcReg[1]); src[2] = t_src(cs, fpi->SrcReg[2]); /* ARB_f_p - if src0.c < 0.0 ? src1.c : src2.c - * r300 - if src2.c < 0.0 ? src1.c : src0.c - */ + * r300 - if src2.c < 0.0 ? src1.c : src0.c + */ emit_arith(cs, PFS_OP_CMP, dest, mask, src[2], src[1], src[0], flags); break; @@ -1592,8 +1495,8 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst * result = sin(x) */ temp[0] = get_temp_reg(cs); - const_sin[0] = emit_const4fv(cs, SinCosConsts[0]); - const_sin[1] = emit_const4fv(cs, SinCosConsts[1]); + const_sin[0] = emit_sincosconsts(cs, 0); + const_sin[1] = emit_sincosconsts(cs, 1); src[0] = t_scalar_src(cs, fpi->SrcReg[0]); /* add 0.5*PI and do range reduction */ @@ -1687,10 +1590,6 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst emit_arith(cs, PFS_OP_LG2, dest, mask, src[0], undef, undef, flags); break; - case OPCODE_LIT: - src[0] = t_src(cs, fpi->SrcReg[0]); - emit_lit(cs, dest, mask, src[0], flags); - break; case OPCODE_LRP: src[0] = t_src(cs, fpi->SrcReg[0]); src[1] = t_src(cs, fpi->SrcReg[1]); @@ -1758,8 +1657,8 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst */ temp[0] = get_temp_reg(cs); temp[1] = get_temp_reg(cs); - const_sin[0] = emit_const4fv(cs, SinCosConsts[0]); - const_sin[1] = emit_const4fv(cs, SinCosConsts[1]); + const_sin[0] = emit_sincosconsts(cs, 0); + const_sin[1] = emit_sincosconsts(cs, 1); src[0] = t_scalar_src(cs, fpi->SrcReg[0]); /* x = -abs(x)+0.5*PI */ @@ -1825,8 +1724,8 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst */ temp[0] = get_temp_reg(cs); - const_sin[0] = emit_const4fv(cs, SinCosConsts[0]); - const_sin[1] = emit_const4fv(cs, SinCosConsts[1]); + const_sin[0] = emit_sincosconsts(cs, 0); + const_sin[1] = emit_sincosconsts(cs, 1); src[0] = t_scalar_src(cs, fpi->SrcReg[0]); /* do range reduction */ diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index 0f7c179de84..d7a6962acc8 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -2453,6 +2453,27 @@ void r300UpdateShaders(r300ContextPtr rmesa) r300UpdateStateParameters(ctx, _NEW_PROGRAM); } +static const GLfloat *get_fragmentprogram_constant(GLcontext *ctx, + struct gl_program *program, struct prog_src_register srcreg) +{ + static const GLfloat dummy[4] = { 0, 0, 0, 0 }; + + switch(srcreg.File) { + case PROGRAM_LOCAL_PARAM: + return program->LocalParams[srcreg.Index]; + case PROGRAM_ENV_PARAM: + return ctx->FragmentProgram.Parameters[srcreg.Index]; + case PROGRAM_STATE_VAR: + case PROGRAM_NAMED_PARAM: + case PROGRAM_CONSTANT: + return program->Parameters->ParameterValues[srcreg.Index]; + default: + _mesa_problem(ctx, "get_fragmentprogram_constant: Unknown\n"); + return dummy; + } +} + + static void r300SetupPixelShader(r300ContextPtr rmesa) { GLcontext *ctx = rmesa->radeon.glCtx; @@ -2523,10 +2544,12 @@ static void r300SetupPixelShader(r300ContextPtr rmesa) R300_STATECHANGE(rmesa, fpp); rmesa->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(R300_PFS_PARAM_0_X, code->const_nr * 4); for (i = 0; i < code->const_nr; i++) { - rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat24(code->constant[i][0]); - rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat24(code->constant[i][1]); - rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat24(code->constant[i][2]); - rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 3] = r300PackFloat24(code->constant[i][3]); + const GLfloat *constant = get_fragmentprogram_constant(ctx, + &fp->mesa_program.Base, code->constant[i]); + rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat24(constant[0]); + rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat24(constant[1]); + rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat24(constant[2]); + rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 3] = r300PackFloat24(constant[3]); } } @@ -2595,10 +2618,12 @@ static void r500SetupPixelShader(r300ContextPtr rmesa) R300_STATECHANGE(rmesa, r500fp_const); for (i = 0; i < code->const_nr; i++) { - rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat32(code->constant[i][0]); - rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat32(code->constant[i][1]); - rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat32(code->constant[i][2]); - rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 3] = r300PackFloat32(code->constant[i][3]); + const GLfloat *constant = get_fragmentprogram_constant(ctx, + &fp->mesa_program.Base, code->constant[i]); + rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat32(constant[0]); + rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat32(constant[1]); + rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat32(constant[2]); + rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 3] = r300PackFloat32(constant[3]); } bump_r500fp_const_count(rmesa->hw.r500fp_const.cmd, code->const_nr * 4); diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index 7ee84947225..1cdb065354b 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -212,7 +212,7 @@ static void insert_WPOS_trailer(struct r500_fragment_program_compiler *compiler) i++; /* viewport transformation */ - window_index = _mesa_add_state_reference(compiler->fp->mesa_program.Base.Parameters, tokens); + window_index = _mesa_add_state_reference(compiler->program->Parameters, tokens); fpi[i].Opcode = OPCODE_MAD; @@ -332,6 +332,11 @@ void r500TranslateFragmentShader(r300ContextPtr r300, fp->translated = r500FragmentProgramEmit(&compiler); + /* Subtle: Rescue any parameters that have been added during transformations */ + _mesa_free_parameter_list(fp->mesa_program.Base.Parameters); + fp->mesa_program.Base.Parameters = compiler.program->Parameters; + compiler.program->Parameters = 0; + _mesa_reference_program(r300->radeon.glCtx, &compiler.program, 0); r300UpdateStateParameters(r300->radeon.glCtx, _NEW_PROGRAM); @@ -461,9 +466,8 @@ static void dump_program(struct r500_fragment_program_code *code) if (code->const_nr) { fprintf(stderr, "--------\nConstants:\n"); for (n = 0; n < code->const_nr; n++) { - fprintf(stderr, "Constant %d: %f %f\n\t %f %f\n", n, - code->constant[n][0], code->constant[n][1], code->constant[n][2], - code->constant[n][3]); + fprintf(stderr, "Constant %d: %i[%i]\n", n, + code->constant[n].File, code->constant[n].Index); } fprintf(stderr, "--------\n"); } diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 0e95c81e482..c79bff96bd4 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -266,7 +266,7 @@ static int get_temp(struct r500_pfs_compile_state *cs, int slot) { /* Borrowed verbatim from r300_fragprog since it hasn't changed. */ static GLuint emit_const4fv(struct r500_pfs_compile_state *cs, - const GLfloat * cp) + struct prog_src_register srcreg) { PROG_CODE; @@ -274,7 +274,8 @@ static GLuint emit_const4fv(struct r500_pfs_compile_state *cs, int index; for (index = 0; index < code->const_nr; ++index) { - if (code->constant[index] == cp) + if (code->constant[index].File == srcreg.File && + code->constant[index].Index == srcreg.Index) break; } @@ -285,7 +286,7 @@ static GLuint emit_const4fv(struct r500_pfs_compile_state *cs, } code->const_nr++; - code->constant[index] = cp; + code->constant[index] = srcreg; } reg = index | REG_CONSTANT; @@ -303,18 +304,11 @@ static GLuint make_src(struct r500_pfs_compile_state *cs, struct prog_src_regist reg = cs->inputs[src.Index].reg; break; case PROGRAM_LOCAL_PARAM: - reg = emit_const4fv(cs, - cs->compiler->fp->mesa_program.Base.LocalParams[src.Index]); - break; case PROGRAM_ENV_PARAM: - reg = emit_const4fv(cs, - cs->compiler->r300->radeon.glCtx->FragmentProgram.Parameters[src.Index]); - break; case PROGRAM_STATE_VAR: case PROGRAM_NAMED_PARAM: case PROGRAM_CONSTANT: - reg = emit_const4fv(cs, - cs->compiler->fp->mesa_program.Base.Parameters->ParameterValues[src.Index]); + reg = emit_const4fv(cs, src); break; case PROGRAM_BUILTIN: reg = 0x0; @@ -628,12 +622,20 @@ static void emit_trig(struct r500_pfs_compile_state *cs, struct prog_instruction temp.Index = get_temp(cs, 0); temp.WriteMask = WRITEMASK_W; + struct prog_src_register srcreg; + GLuint constant_swizzle; + + srcreg.File = PROGRAM_CONSTANT; + srcreg.Index = _mesa_add_unnamed_constant(cs->compiler->program->Parameters, + RCP_2PI, 4, &constant_swizzle); + srcreg.Swizzle = constant_swizzle; + /* temp = Input*(1/2pi) */ ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, temp); set_src0(cs, ip, fpi->SrcReg[0]); - set_src1_direct(cs, ip, emit_const4fv(cs, RCP_2PI)); + set_src1(cs, ip, srcreg); set_argA(cs, ip, 0, R500_SWIZ_RGB_ZERO, make_sop_swizzle(fpi->SrcReg[0])); - set_argB(cs, ip, 1, R500_SWIZ_RGB_ZERO, SWIZZLE_W); + set_argB(cs, ip, 1, R500_SWIZ_RGB_ZERO, make_alpha_swizzle(srcreg)); set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); /* temp = frac(dst) */ @@ -660,87 +662,6 @@ static void emit_trig(struct r500_pfs_compile_state *cs, struct prog_instruction } } -/** - * Emit a LIT instruction. - * - * Definition of LIT (from ARB_fragment_program): - * tmp = VectorLoad(op0); - * if (tmp.x < 0) tmp.x = 0; - * if (tmp.y < 0) tmp.y = 0; - * if (tmp.w < -(128.0-epsilon)) tmp.w = -(128.0-epsilon); - * else if (tmp.w > 128-epsilon) tmp.w = 128-epsilon; - * result.x = 1.0; - * result.y = tmp.x; - * result.z = (tmp.x > 0) ? RoughApproxPower(tmp.y, tmp.w) : 0.0; - * result.w = 1.0; - */ -static void emit_lit(struct r500_pfs_compile_state *cs, struct prog_instruction *fpi) -{ - GLuint cnst; - int needTemporary; - GLuint temp; - int ip; - - cnst = emit_const4fv(cs, LIT); - - needTemporary = 0; - if (fpi->DstReg.WriteMask != WRITEMASK_XYZW || fpi->DstReg.File == PROGRAM_OUTPUT) - needTemporary = 1; - - if (needTemporary) { - temp = get_temp(cs, 0); - } else { - temp = fpi->DstReg.Index; - } - - // MAX tmp.xyw, op0, { 0, 0, 0, -128+eps } - ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_MAX, R500_ALPHA_OP_MAX, temp, WRITEMASK_XYW); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1_direct(cs, ip, cnst); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argB(cs, ip, 1, R500_SWIZ_RGB_ZERO, SWIZZLE_W); - - // MIN tmp.z, tmp.w, { 128-eps } - // LG2 tmp.w, tmp.y - ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_MIN, R500_ALPHA_OP_LN2, temp, WRITEMASK_ZW); - set_src0_direct(cs, ip, temp); - set_src1_direct(cs, ip, cnst); - set_argA(cs, ip, 0, SWIZZLE_W | (SWIZZLE_W<<3) | (SWIZZLE_W<<6), SWIZZLE_Y); - set_argB(cs, ip, 1, SWIZZLE_X | (SWIZZLE_X<<3) | (SWIZZLE_X<<6), SWIZZLE_X); - - // MOV tmp.y, tmp.x - // MUL tmp.w, tmp.z, tmp.w - ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, temp, WRITEMASK_YW); - set_src0_direct(cs, ip, temp); - set_argA(cs, ip, 0, SWIZZLE_X | (SWIZZLE_X<<3) | (SWIZZLE_X<<6), SWIZZLE_Z); - set_argB(cs, ip, 0, R500_SWIZ_RGB_ONE, SWIZZLE_W); - set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); - - // MOV tmp.x, 1.0 - // EX2 tmp.w, tmp.w - ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_EX2, temp, WRITEMASK_XW); - set_src0_direct(cs, ip, temp); - set_argA(cs, ip, 0, R500_SWIZ_RGB_ONE, SWIZZLE_W); - set_argB(cs, ip, 0, R500_SWIZ_RGB_ONE, R500_SWIZZLE_ZERO); - set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); - - // tmp.z := (-tmp.x >= 0) ? tmp.y : 0.0 - // MOV tmp.w, 1.0 - ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_CMP, temp, WRITEMASK_ZW); - set_src0_direct(cs, ip, temp); - set_argA(cs, ip, 0, R500_SWIZZLE_ZERO, R500_SWIZZLE_ONE); - set_argB(cs, ip, 0, SWIZZLE_W | (SWIZZLE_W<<3) | (SWIZZLE_W<<6), R500_SWIZZLE_ONE); - set_argC(cs, ip, 0, SWIZZLE_Y | (SWIZZLE_Y<<3) | (SWIZZLE_Y<<6) | (R500_SWIZ_MOD_NEG<<9), R500_SWIZZLE_ZERO); - - if (needTemporary) { - ip = emit_alu(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_CMP, fpi->DstReg); - set_src0_direct(cs, ip, temp); - set_argA(cs, ip, 0, R500_SWIZ_RGB_RGB, SWIZZLE_W); - set_argB(cs, ip, 1, R500_SWIZ_RGB_RGB, SWIZZLE_W); - set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); - } -} - static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction *fpi) { PROG_CODE; GLuint src[3], dest = 0; @@ -830,9 +751,6 @@ static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction * src[0] = make_src(cs, fpi->SrcReg[0]); emit_sop(cs, R500_ALPHA_OP_LN2, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); break; - case OPCODE_LIT: - emit_lit(cs, fpi); - break; case OPCODE_LRP: /* result = src0*src1 + (1-src0)*src2 * = src0*src1 + src2 + (-src0)*src2 diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.c b/src/mesa/drivers/dri/r300/radeon_program_alu.c index d6d016d7c12..85ea810523f 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.c @@ -35,6 +35,8 @@ #include "radeon_program_alu.h" +#include "shader/prog_parameter.h" + static struct prog_instruction *emit1(struct gl_program* p, gl_inst_opcode Opcode, struct prog_dst_register DstReg, @@ -101,6 +103,19 @@ static struct prog_dst_register dstreg(int file, int index) return dst; } +static struct prog_dst_register dstregtmpmask(int index, int mask) +{ + struct prog_dst_register dst; + dst.File = PROGRAM_TEMPORARY; + dst.Index = index; + dst.WriteMask = mask; + dst.CondMask = COND_TR; + dst.CondSwizzle = SWIZZLE_NOOP; + dst.CondSrc = 0; + dst.pad = 0; + return dst; +} + static const struct prog_src_register builtin_zero = { .File = PROGRAM_BUILTIN, .Index = 0, @@ -125,6 +140,15 @@ static struct prog_src_register srcreg(int file, int index) return src; } +static struct prog_src_register srcregswz(int file, int index, int swz) +{ + struct prog_src_register src = srcreg_undefined; + src.File = file; + src.Index = index; + src.Swizzle = swz; + return src; +} + static struct prog_src_register negate(struct prog_src_register reg) { struct prog_src_register newreg = reg; @@ -136,10 +160,10 @@ static struct prog_src_register swizzle(struct prog_src_register reg, GLuint x, { struct prog_src_register swizzled = reg; swizzled.Swizzle = MAKE_SWIZZLE4( - GET_SWZ(reg.Swizzle, x), - GET_SWZ(reg.Swizzle, y), - GET_SWZ(reg.Swizzle, z), - GET_SWZ(reg.Swizzle, w)); + x >= 4 ? x : GET_SWZ(reg.Swizzle, x), + y >= 4 ? y : GET_SWZ(reg.Swizzle, y), + z >= 4 ? z : GET_SWZ(reg.Swizzle, z), + w >= 4 ? w : GET_SWZ(reg.Swizzle, w)); return swizzled; } @@ -185,6 +209,93 @@ static void transform_FLR(struct radeon_transform_context* t, emit2(t->Program, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg))); } +/** + * Definition of LIT (from ARB_fragment_program): + * + * tmp = VectorLoad(op0); + * if (tmp.x < 0) tmp.x = 0; + * if (tmp.y < 0) tmp.y = 0; + * if (tmp.w < -(128.0-epsilon)) tmp.w = -(128.0-epsilon); + * else if (tmp.w > 128-epsilon) tmp.w = 128-epsilon; + * result.x = 1.0; + * result.y = tmp.x; + * result.z = (tmp.x > 0) ? RoughApproxPower(tmp.y, tmp.w) : 0.0; + * result.w = 1.0; + * + * The longest path of computation is the one leading to result.z, + * consisting of 5 operations. This implementation of LIT takes + * 5 slots, if the subsequent optimization passes are clever enough + * to pair instructions correctly. + */ +static void transform_LIT(struct radeon_transform_context* t, + struct prog_instruction* inst) +{ + static const GLfloat LitConst[4] = { -127.999999 }; + + GLuint constant; + GLuint constant_swizzle; + GLuint temp; + int needTemporary = 0; + struct prog_src_register srctemp; + + constant = _mesa_add_unnamed_constant(t->Program->Parameters, LitConst, 1, &constant_swizzle); + + if (inst->DstReg.WriteMask != WRITEMASK_XYZW) { + needTemporary = 1; + } else if (inst->DstReg.File != PROGRAM_TEMPORARY) { + // LIT is typically followed by DP3/DP4, so there's no point + // in creating special code for this case + needTemporary = 1; + } + + if (needTemporary) { + temp = radeonFindFreeTemporary(t); + } else { + temp = inst->DstReg.Index; + } + srctemp = srcreg(PROGRAM_TEMPORARY, temp); + + // tmp.x = max(0.0, Src.x); + // tmp.y = max(0.0, Src.y); + // tmp.w = clamp(Src.z, -128+eps, 128-eps); + emit2(t->Program, OPCODE_MAX, + dstregtmpmask(temp, WRITEMASK_XYW), + inst->SrcReg[0], + swizzle(srcreg(PROGRAM_CONSTANT, constant), + SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO, constant_swizzle&3)); + emit2(t->Program, OPCODE_MIN, + dstregtmpmask(temp, WRITEMASK_Z), + swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + negate(srcregswz(PROGRAM_CONSTANT, constant, constant_swizzle))); + + // tmp.w = Pow(tmp.y, tmp.w) + emit1(t->Program, OPCODE_LG2, + dstregtmpmask(temp, WRITEMASK_W), + swizzle(srctemp, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y)); + emit2(t->Program, OPCODE_MUL, + dstregtmpmask(temp, WRITEMASK_W), + swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + swizzle(srctemp, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)); + emit1(t->Program, OPCODE_EX2, + dstregtmpmask(temp, WRITEMASK_W), + swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)); + + // tmp.z = (tmp.x > 0) ? tmp.w : 0.0 + emit3(t->Program, OPCODE_CMP, + dstregtmpmask(temp, WRITEMASK_Z), + negate(swizzle(srctemp, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)), + swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + builtin_zero); + + // tmp.x, tmp.y, tmp.w = 1.0, tmp.x, 1.0 + emit1(t->Program, OPCODE_MOV, + dstregtmpmask(temp, WRITEMASK_XYW), + swizzle(srctemp, SWIZZLE_ONE, SWIZZLE_X, SWIZZLE_ONE, SWIZZLE_ONE)); + + if (needTemporary) + emit1(t->Program, OPCODE_MOV, inst->DstReg, srctemp); +} + static void transform_POW(struct radeon_transform_context* t, struct prog_instruction* inst) { @@ -249,13 +360,11 @@ static void transform_XPD(struct radeon_transform_context* t, * no userData necessary. * * Eliminates the following ALU instructions: - * ABS, DPH, FLR, POW, SGE, SLT, SUB, SWZ, XPD + * ABS, DPH, FLR, LIT, POW, SGE, SLT, SUB, SWZ, XPD * using: * MOV, ADD, MUL, MAD, FRC, DP3, LG2, EX2, CMP * * @note should be applicable to R300 and R500 fragment programs. - * - * @todo add LIT here as well? */ GLboolean radeonTransformALU(struct radeon_transform_context* t, struct prog_instruction* inst, @@ -265,6 +374,7 @@ GLboolean radeonTransformALU(struct radeon_transform_context* t, case OPCODE_ABS: transform_ABS(t, inst); return GL_TRUE; case OPCODE_DPH: transform_DPH(t, inst); return GL_TRUE; case OPCODE_FLR: transform_FLR(t, inst); return GL_TRUE; + case OPCODE_LIT: transform_LIT(t, inst); return GL_TRUE; case OPCODE_POW: transform_POW(t, inst); return GL_TRUE; case OPCODE_SGE: transform_SGE(t, inst); return GL_TRUE; case OPCODE_SLT: transform_SLT(t, inst); return GL_TRUE; -- cgit v1.2.3 From 03abd021f2fa1d043682c9f1bbb1c080fba6b033 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 22:35:46 +0200 Subject: r300: Translate fragment program LRP in radeon_program_alu.c --- src/mesa/drivers/dri/r300/r300_fragprog_emit.c | 17 ---------------- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 27 -------------------------- src/mesa/drivers/dri/r300/radeon_program_alu.c | 16 ++++++++++++++- 3 files changed, 15 insertions(+), 45 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c index d95008edc06..446517405ba 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c @@ -1590,23 +1590,6 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst emit_arith(cs, PFS_OP_LG2, dest, mask, src[0], undef, undef, flags); break; - case OPCODE_LRP: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - src[2] = t_src(cs, fpi->SrcReg[2]); - /* result = tmp0tmp1 + (1 - tmp0)tmp2 - * = tmp0tmp1 + tmp2 + (-tmp0)tmp2 - * MAD temp, -tmp0, tmp2, tmp2 - * MAD result, tmp0, tmp1, temp - */ - temp[0] = get_temp_reg(cs); - emit_arith(cs, PFS_OP_MAD, temp[0], mask, - negate(keep(src[0])), keep(src[2]), src[2], - 0); - emit_arith(cs, PFS_OP_MAD, dest, mask, - src[0], src[1], temp[0], flags); - free_temp(cs, temp[0]); - break; case OPCODE_MAD: src[0] = t_src(cs, fpi->SrcReg[0]); src[1] = t_src(cs, fpi->SrcReg[1]); diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index c79bff96bd4..5b4d06ecf36 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -751,33 +751,6 @@ static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction * src[0] = make_src(cs, fpi->SrcReg[0]); emit_sop(cs, R500_ALPHA_OP_LN2, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); break; - case OPCODE_LRP: - /* result = src0*src1 + (1-src0)*src2 - * = src0*src1 + src2 + (-src0)*src2 - * - * Note: LRP without swizzling (or with only limited - * swizzling) could be done more efficiently using the - * presubtract hardware. - */ - dest = get_temp(cs, 0); - ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, dest, WRITEMASK_XYZW); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_src2(cs, ip, fpi->SrcReg[2]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); - set_argC_reg(cs, ip, 2, fpi->SrcReg[2]); - - ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[2]); - set_src2_direct(cs, ip, dest); - set_argA(cs, ip, 0, - make_rgb_swizzle(fpi->SrcReg[0]) ^ (R500_SWIZ_MOD_NEG<<9), - make_alpha_swizzle(fpi->SrcReg[0]) ^ (R500_SWIZ_MOD_NEG<<3)); - set_argB_reg(cs, ip, 1, fpi->SrcReg[2]); - set_argC(cs, ip, 2, R500_SWIZ_RGB_RGB, SWIZZLE_W); - break; case OPCODE_MAD: ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); set_src0(cs, ip, fpi->SrcReg[0]); diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.c b/src/mesa/drivers/dri/r300/radeon_program_alu.c index 85ea810523f..483dfa2cdc3 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.c @@ -296,6 +296,19 @@ static void transform_LIT(struct radeon_transform_context* t, emit1(t->Program, OPCODE_MOV, inst->DstReg, srctemp); } +static void transform_LRP(struct radeon_transform_context* t, + struct prog_instruction* inst) +{ + int tempreg = radeonFindFreeTemporary(t); + + emit2(t->Program, OPCODE_ADD, + dstreg(PROGRAM_TEMPORARY, tempreg), + inst->SrcReg[1], negate(inst->SrcReg[2])); + emit3(t->Program, OPCODE_MAD, + inst->DstReg, + inst->SrcReg[0], srcreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[2]); +} + static void transform_POW(struct radeon_transform_context* t, struct prog_instruction* inst) { @@ -360,7 +373,7 @@ static void transform_XPD(struct radeon_transform_context* t, * no userData necessary. * * Eliminates the following ALU instructions: - * ABS, DPH, FLR, LIT, POW, SGE, SLT, SUB, SWZ, XPD + * ABS, DPH, FLR, LIT, LRP, POW, SGE, SLT, SUB, SWZ, XPD * using: * MOV, ADD, MUL, MAD, FRC, DP3, LG2, EX2, CMP * @@ -375,6 +388,7 @@ GLboolean radeonTransformALU(struct radeon_transform_context* t, case OPCODE_DPH: transform_DPH(t, inst); return GL_TRUE; case OPCODE_FLR: transform_FLR(t, inst); return GL_TRUE; case OPCODE_LIT: transform_LIT(t, inst); return GL_TRUE; + case OPCODE_LRP: transform_LRP(t, inst); return GL_TRUE; case OPCODE_POW: transform_POW(t, inst); return GL_TRUE; case OPCODE_SGE: transform_SGE(t, inst); return GL_TRUE; case OPCODE_SLT: transform_SLT(t, inst); return GL_TRUE; -- cgit v1.2.3 From 4746752f167c674722b46ab3840297d48e6d889d Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 22:44:37 +0200 Subject: r300: Translate fragment program DST in radeon_program_alu --- src/mesa/drivers/dri/r300/r300_fragprog_emit.c | 21 --------------------- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 14 -------------- src/mesa/drivers/dri/r300/radeon_program_alu.c | 15 ++++++++++++++- 3 files changed, 14 insertions(+), 36 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c index 446517405ba..30f513b5a31 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c @@ -1551,27 +1551,6 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst emit_arith(cs, PFS_OP_DP4, dest, mask, src[0], src[1], undef, flags); break; - case OPCODE_DST: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - /* dest.y = src0.y * src1.y */ - if (mask & WRITEMASK_Y) - emit_arith(cs, PFS_OP_MAD, dest, WRITEMASK_Y, - keep(src[0]), keep(src[1]), - pfs_zero, flags); - /* dest.z = src0.z */ - if (mask & WRITEMASK_Z) - emit_arith(cs, PFS_OP_MAD, dest, WRITEMASK_Z, - src[0], pfs_one, pfs_zero, flags); - /* result.x = 1.0 - * result.w = src1.w */ - if (mask & WRITEMASK_XW) { - REG_SET_VSWZ(src[1], SWIZZLE_111); /*Cheat */ - emit_arith(cs, PFS_OP_MAD, dest, - mask & WRITEMASK_XW, - src[1], pfs_one, pfs_zero, flags); - } - break; case OPCODE_EX2: src[0] = t_scalar_src(cs, fpi->SrcReg[0]); emit_arith(cs, PFS_OP_EX2, dest, mask, diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 5b4d06ecf36..678114b8c17 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -709,20 +709,6 @@ static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction * set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); break; - case OPCODE_DST: - /* [1, src0.y*src1.y, src0.z, src1.w] - * So basically MUL with lotsa swizzling. */ - ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_argA(cs, ip, 0, - (make_rgb_swizzle(fpi->SrcReg[0]) & ~0x7) | R500_SWIZZLE_ONE, - R500_SWIZZLE_ONE); - set_argB(cs, ip, 1, - (make_rgb_swizzle(fpi->SrcReg[0]) & ~0x1c7) | R500_SWIZZLE_ONE | (R500_SWIZZLE_ONE << 6), - make_alpha_swizzle(fpi->SrcReg[1])); - set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); - break; case OPCODE_EX2: src[0] = make_src(cs, fpi->SrcReg[0]); emit_sop(cs, R500_ALPHA_OP_EX2, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.c b/src/mesa/drivers/dri/r300/radeon_program_alu.c index 483dfa2cdc3..4a40d3e44d8 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.c @@ -201,6 +201,18 @@ static void transform_DPH(struct radeon_transform_context* t, emit2(t->Program, OPCODE_DP4, inst->DstReg, src0, inst->SrcReg[1]); } +/** + * [1, src0.y*src1.y, src0.z, src1.w] + * So basically MUL with lotsa swizzling. + */ +static void transform_DST(struct radeon_transform_context* t, + struct prog_instruction* inst) +{ + emit2(t->Program, OPCODE_MUL, inst->DstReg, + swizzle(inst->SrcReg[0], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE), + swizzle(inst->SrcReg[1], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_ONE, SWIZZLE_W)); +} + static void transform_FLR(struct radeon_transform_context* t, struct prog_instruction* inst) { @@ -373,7 +385,7 @@ static void transform_XPD(struct radeon_transform_context* t, * no userData necessary. * * Eliminates the following ALU instructions: - * ABS, DPH, FLR, LIT, LRP, POW, SGE, SLT, SUB, SWZ, XPD + * ABS, DPH, DST, FLR, LIT, LRP, POW, SGE, SLT, SUB, SWZ, XPD * using: * MOV, ADD, MUL, MAD, FRC, DP3, LG2, EX2, CMP * @@ -386,6 +398,7 @@ GLboolean radeonTransformALU(struct radeon_transform_context* t, switch(inst->Opcode) { case OPCODE_ABS: transform_ABS(t, inst); return GL_TRUE; case OPCODE_DPH: transform_DPH(t, inst); return GL_TRUE; + case OPCODE_DST: transform_DST(t, inst); return GL_TRUE; case OPCODE_FLR: transform_FLR(t, inst); return GL_TRUE; case OPCODE_LIT: transform_LIT(t, inst); return GL_TRUE; case OPCODE_LRP: transform_LRP(t, inst); return GL_TRUE; -- cgit v1.2.3 From 2b2cb566563b9f1f9739327ef9874143af838850 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 5 Jul 2008 23:54:31 +0200 Subject: r300_fragprog: Emulate trigonometric functions in radeon_program_alu --- src/mesa/drivers/dri/r300/r300_fragprog.c | 5 +- src/mesa/drivers/dri/r300/r300_fragprog_emit.c | 206 +------------------------ src/mesa/drivers/dri/r300/radeon_program_alu.c | 144 +++++++++++++++++ src/mesa/drivers/dri/r300/radeon_program_alu.h | 5 + 4 files changed, 153 insertions(+), 207 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c index 57987f5d0fc..8a1d690ae4e 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog.c @@ -408,12 +408,13 @@ void r300TranslateFragmentShader(r300ContextPtr r300, struct radeon_program_transformation transformations[] = { { &transform_TEX, &compiler }, - { &radeonTransformALU, 0 } + { &radeonTransformALU, 0 }, + { &radeonTransformTrigSimple, 0 } }; radeonLocalTransform( r300->radeon.glCtx, compiler.program, - 2, transformations); + 3, transformations); if (RADEON_DEBUG & DEBUG_PIXEL) { _mesa_printf("Fragment Program: After transformations:\n"); diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c index 30f513b5a31..4786b4554df 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c @@ -1423,40 +1423,11 @@ static void emit_arith(struct r300_pfs_compile_state *cs, return; } -static GLfloat SinCosConsts[2][4] = { - { - 1.273239545, // 4/PI - -0.405284735, // -4/(PI*PI) - 3.141592654, // PI - 0.2225 // weight - }, - { - 0.75, - 0.0, - 0.159154943, // 1/(2*PI) - 6.283185307 // 2*PI - } -}; - -static GLuint emit_sincosconsts(struct r300_pfs_compile_state *cs, int i) -{ - struct prog_src_register srcreg; - GLuint constant_swizzle; - - srcreg.File = PROGRAM_CONSTANT; - srcreg.Index = _mesa_add_unnamed_constant(cs->compiler->program->Parameters, - SinCosConsts[i], 4, &constant_swizzle); - srcreg.Swizzle = constant_swizzle; - - return emit_const4fv(cs, srcreg); -} - static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_instruction *fpi) { COMPILE_STATE; - GLuint src[3], dest, temp[2]; + GLuint src[3], dest; int flags, mask = 0; - int const_sin[2]; if (fpi->SaturateMode == SATURATE_ZERO_ONE) flags = PFS_FLAG_SAT; @@ -1485,60 +1456,6 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst emit_arith(cs, PFS_OP_CMP, dest, mask, src[2], src[1], src[0], flags); break; - case OPCODE_COS: - /* - * cos using a parabola (see SIN): - * cos(x): - * x = (x/(2*PI))+0.75 - * x = frac(x) - * x = (x*2*PI)-PI - * result = sin(x) - */ - temp[0] = get_temp_reg(cs); - const_sin[0] = emit_sincosconsts(cs, 0); - const_sin[1] = emit_sincosconsts(cs, 1); - src[0] = t_scalar_src(cs, fpi->SrcReg[0]); - - /* add 0.5*PI and do range reduction */ - - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_X, - swizzle(src[0], X, X, X, X), - swizzle(const_sin[1], Z, Z, Z, Z), - swizzle(const_sin[1], X, X, X, X), 0); - - emit_arith(cs, PFS_OP_FRC, temp[0], WRITEMASK_X, - swizzle(temp[0], X, X, X, X), - undef, undef, 0); - - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_Z, swizzle(temp[0], X, X, X, X), swizzle(const_sin[1], W, W, W, W), //2*PI - negate(swizzle(const_sin[0], Z, Z, Z, Z)), //-PI - 0); - - /* SIN */ - - emit_arith(cs, PFS_OP_MAD, temp[0], - WRITEMASK_X | WRITEMASK_Y, swizzle(temp[0], - Z, Z, Z, - Z), - const_sin[0], pfs_zero, 0); - - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_X, - swizzle(temp[0], Y, Y, Y, Y), - absolute(swizzle(temp[0], Z, Z, Z, Z)), - swizzle(temp[0], X, X, X, X), 0); - - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_Y, - swizzle(temp[0], X, X, X, X), - absolute(swizzle(temp[0], X, X, X, X)), - negate(swizzle(temp[0], X, X, X, X)), 0); - - emit_arith(cs, PFS_OP_MAD, dest, mask, - swizzle(temp[0], Y, Y, Y, Y), - swizzle(const_sin[0], W, W, W, W), - swizzle(temp[0], X, X, X, X), flags); - - free_temp(cs, temp[0]); - break; case OPCODE_DP3: src[0] = t_src(cs, fpi->SrcReg[0]); src[1] = t_src(cs, fpi->SrcReg[1]); @@ -1609,127 +1526,6 @@ static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_inst emit_arith(cs, PFS_OP_RSQ, dest, mask, absolute(src[0]), pfs_zero, pfs_zero, flags); break; - case OPCODE_SCS: - /* - * scs using a parabola : - * scs(x): - * result.x = sin(-abs(x)+0.5*PI) (cos) - * result.y = sin(x) (sin) - * - */ - temp[0] = get_temp_reg(cs); - temp[1] = get_temp_reg(cs); - const_sin[0] = emit_sincosconsts(cs, 0); - const_sin[1] = emit_sincosconsts(cs, 1); - src[0] = t_scalar_src(cs, fpi->SrcReg[0]); - - /* x = -abs(x)+0.5*PI */ - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_Z, swizzle(const_sin[0], Z, Z, Z, Z), //PI - pfs_half, - negate(abs - (swizzle(keep(src[0]), X, X, X, X))), - 0); - - /* C*x (sin) */ - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_W, - swizzle(const_sin[0], Y, Y, Y, Y), - swizzle(keep(src[0]), X, X, X, X), - pfs_zero, 0); - - /* B*x, C*x (cos) */ - emit_arith(cs, PFS_OP_MAD, temp[0], - WRITEMASK_X | WRITEMASK_Y, swizzle(temp[0], - Z, Z, Z, - Z), - const_sin[0], pfs_zero, 0); - - /* B*x (sin) */ - emit_arith(cs, PFS_OP_MAD, temp[1], WRITEMASK_W, - swizzle(const_sin[0], X, X, X, X), - keep(src[0]), pfs_zero, 0); - - /* y = B*x + C*x*abs(x) (sin) */ - emit_arith(cs, PFS_OP_MAD, temp[1], WRITEMASK_Z, - absolute(src[0]), - swizzle(temp[0], W, W, W, W), - swizzle(temp[1], W, W, W, W), 0); - - /* y = B*x + C*x*abs(x) (cos) */ - emit_arith(cs, PFS_OP_MAD, temp[1], WRITEMASK_W, - swizzle(temp[0], Y, Y, Y, Y), - absolute(swizzle(temp[0], Z, Z, Z, Z)), - swizzle(temp[0], X, X, X, X), 0); - - /* y*abs(y) - y (cos), y*abs(y) - y (sin) */ - emit_arith(cs, PFS_OP_MAD, temp[0], - WRITEMASK_X | WRITEMASK_Y, swizzle(temp[1], - W, Z, Y, - X), - absolute(swizzle(temp[1], W, Z, Y, X)), - negate(swizzle(temp[1], W, Z, Y, X)), 0); - - /* dest.xy = mad(temp.xy, P, temp2.wz) */ - emit_arith(cs, PFS_OP_MAD, dest, - mask & (WRITEMASK_X | WRITEMASK_Y), temp[0], - swizzle(const_sin[0], W, W, W, W), - swizzle(temp[1], W, Z, Y, X), flags); - - free_temp(cs, temp[0]); - free_temp(cs, temp[1]); - break; - case OPCODE_SIN: - /* - * using a parabola: - * sin(x) = 4/pi * x + -4/(pi*pi) * x * abs(x) - * extra precision is obtained by weighting against - * itself squared. - */ - - temp[0] = get_temp_reg(cs); - const_sin[0] = emit_sincosconsts(cs, 0); - const_sin[1] = emit_sincosconsts(cs, 1); - src[0] = t_scalar_src(cs, fpi->SrcReg[0]); - - /* do range reduction */ - - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_X, - swizzle(keep(src[0]), X, X, X, X), - swizzle(const_sin[1], Z, Z, Z, Z), - pfs_half, 0); - - emit_arith(cs, PFS_OP_FRC, temp[0], WRITEMASK_X, - swizzle(temp[0], X, X, X, X), - undef, undef, 0); - - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_Z, swizzle(temp[0], X, X, X, X), swizzle(const_sin[1], W, W, W, W), //2*PI - negate(swizzle(const_sin[0], Z, Z, Z, Z)), //PI - 0); - - /* SIN */ - - emit_arith(cs, PFS_OP_MAD, temp[0], - WRITEMASK_X | WRITEMASK_Y, swizzle(temp[0], - Z, Z, Z, - Z), - const_sin[0], pfs_zero, 0); - - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_X, - swizzle(temp[0], Y, Y, Y, Y), - absolute(swizzle(temp[0], Z, Z, Z, Z)), - swizzle(temp[0], X, X, X, X), 0); - - emit_arith(cs, PFS_OP_MAD, temp[0], WRITEMASK_Y, - swizzle(temp[0], X, X, X, X), - absolute(swizzle(temp[0], X, X, X, X)), - negate(swizzle(temp[0], X, X, X, X)), 0); - - emit_arith(cs, PFS_OP_MAD, dest, mask, - swizzle(temp[0], Y, Y, Y, Y), - swizzle(const_sin[0], W, W, W, W), - swizzle(temp[0], X, X, X, X), flags); - - free_temp(cs, temp[0]); - break; case OPCODE_TEX: emit_tex(cs, fpi, R300_TEX_OP_LD); break; diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.c b/src/mesa/drivers/dri/r300/radeon_program_alu.c index 4a40d3e44d8..fa6a67f0c19 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.c @@ -149,6 +149,14 @@ static struct prog_src_register srcregswz(int file, int index, int swz) return src; } +static struct prog_src_register absolute(struct prog_src_register reg) +{ + struct prog_src_register newreg = reg; + newreg.Abs = 1; + newreg.NegateAbs = 0; + return newreg; +} + static struct prog_src_register negate(struct prog_src_register reg) { struct prog_src_register newreg = reg; @@ -412,3 +420,139 @@ GLboolean radeonTransformALU(struct radeon_transform_context* t, return GL_FALSE; } } + + +static void sincos_constants(struct radeon_transform_context* t, GLuint *constants) +{ + static const GLfloat SinCosConsts[2][4] = { + { + 1.273239545, // 4/PI + -0.405284735, // -4/(PI*PI) + 3.141592654, // PI + 0.2225 // weight + }, + { + 0.75, + 0.5, + 0.159154943, // 1/(2*PI) + 6.283185307 // 2*PI + } + }; + int i; + + for(i = 0; i < 2; ++i) { + GLuint swz; + constants[i] = _mesa_add_unnamed_constant(t->Program->Parameters, SinCosConsts[i], 4, &swz); + ASSERT(swz == SWIZZLE_NOOP); + } +} + +/** + * Approximate sin(x), where x is clamped to (-pi/2, pi/2). + * + * MUL tmp.xy, src, { 4/PI, -4/(PI^2) } + * MAD tmp.x, tmp.y, |src|, tmp.x + * MAD tmp.y, tmp.x, |tmp.x|, -tmp.x + * MAD dest, tmp.y, weight, tmp.x + */ +static void sin_approx(struct radeon_transform_context* t, + struct prog_dst_register dst, struct prog_src_register src, const GLuint* constants) +{ + GLuint tempreg = radeonFindFreeTemporary(t); + + emit2(t->Program, OPCODE_MUL, dstregtmpmask(tempreg, WRITEMASK_XY), + swizzle(src, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), + srcreg(PROGRAM_CONSTANT, constants[0])); + emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_X), + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y), + absolute(swizzle(src, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)), + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)); + emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_Y), + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), + absolute(swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)), + negate(swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X))); + emit3(t->Program, OPCODE_MAD, dst, + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y), + swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)); +} + +/** + * Translate the trigonometric functions COS, SIN, and SCS + * using only the basic instructions + * MOV, ADD, MUL, MAD, FRC + */ +GLboolean radeonTransformTrigSimple(struct radeon_transform_context* t, + struct prog_instruction* inst, + void* unused) +{ + if (inst->Opcode != OPCODE_COS && + inst->Opcode != OPCODE_SIN && + inst->Opcode != OPCODE_SCS) + return GL_FALSE; + + GLuint constants[2]; + GLuint tempreg = radeonFindFreeTemporary(t); + + sincos_constants(t, constants); + + if (inst->Opcode == OPCODE_COS) { + // MAD tmp.x, src, 1/(2*PI), 0.75 + // FRC tmp.x, tmp.x + // MAD tmp.z, tmp.x, 2*PI, -PI + emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_W), + swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), + swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z), + swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)); + emit1(t->Program, OPCODE_FRC, dstregtmpmask(tempreg, WRITEMASK_W), + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)); + emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_W), + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z))); + + sin_approx(t, inst->DstReg, + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + constants); + } else if (inst->Opcode == OPCODE_SIN) { + emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_W), + swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), + swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z), + swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y)); + emit1(t->Program, OPCODE_FRC, dstregtmpmask(tempreg, WRITEMASK_W), + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)); + emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_W), + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z))); + + sin_approx(t, inst->DstReg, + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + constants); + } else { + emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_XY), + swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), + swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z), + swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W)); + emit1(t->Program, OPCODE_FRC, dstregtmpmask(tempreg, WRITEMASK_XY), + srcreg(PROGRAM_TEMPORARY, tempreg)); + emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_XY), + srcreg(PROGRAM_TEMPORARY, tempreg), + swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), + negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z))); + + struct prog_dst_register dst = inst->DstReg; + + dst.WriteMask = inst->DstReg.WriteMask & WRITEMASK_X; + sin_approx(t, dst, + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), + constants); + + dst.WriteMask = inst->DstReg.WriteMask & WRITEMASK_Y; + sin_approx(t, dst, + swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y), + constants); + } + + return GL_TRUE; +} diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.h b/src/mesa/drivers/dri/r300/radeon_program_alu.h index 858c5ed0b8c..3fe6153fd82 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.h +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.h @@ -35,4 +35,9 @@ GLboolean radeonTransformALU( struct prog_instruction*, void*); +GLboolean radeonTransformTrigSimple( + struct radeon_transform_context *t, + struct prog_instruction*, + void*); + #endif /* __RADEON_PROGRAM_ALU_H_ */ -- cgit v1.2.3 From 056689d457924ba4d8a0723d0c5f24383d1757d9 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sun, 6 Jul 2008 16:39:31 +0200 Subject: r500_fragprog: Fix RSQ with negative parameters --- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 678114b8c17..8c900941c4d 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -784,7 +784,8 @@ static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction * break; case OPCODE_RSQ: src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, R500_ALPHA_OP_RSQ, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); + emit_sop(cs, R500_ALPHA_OP_RSQ, fpi->DstReg, src[0], + (make_sop_swizzle(fpi->SrcReg[0]) | (R500_SWIZ_MOD_ABS<<3)) & ~(R500_SWIZ_MOD_NEG<<3)); break; case OPCODE_SCS: emit_trig(cs, fpi); -- cgit v1.2.3 From 11ac5b2456575060627e9f52946d7d0e218a228d Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Thu, 3 Jul 2008 09:17:44 -0700 Subject: Set library and header installation directories from configuration Currently the installation directories for libraries and headers are resolved within the install commands. For instance, the libraries will be installed to $(INSTALL_DIR)/$(LIB_DIR). This limits the flexibility of the installation, such as when the libraries should be installed to a subdirectory like /usr/lib/tls. This adds the make variables $(INSTALL_LIB_DIR) and $(INSTALL_INC_DIR) to define the locations that the libraries and headers are installed. For the static configs, this resolves exactly as before to $(INSTALL_DIR)/include and $(INSTALL_DIR)/$(LIB_DIR). For autoconf, they are derived directly from the --libdir and --includedir settings. --- configs/autoconf.in | 3 +++ configs/default | 4 +++- configure.ac | 1 + src/glu/Makefile | 11 ++++++----- src/glu/glu.pc.in | 4 ++-- src/glut/fbdev/Makefile | 8 ++++---- src/glut/glx/Makefile | 15 ++++++++------- src/glut/glx/glut.pc.in | 4 ++-- src/glut/mini/Makefile | 15 ++++++++------- src/glut/mini/glut.pc.in | 4 ++-- src/glw/Makefile | 15 ++++++++------- src/glw/glw.pc.in | 4 ++-- src/mesa/Makefile | 19 ++++++++++--------- src/mesa/drivers/dri/Makefile | 15 +++++++++------ src/mesa/drivers/dri/dri.pc.in | 4 ++-- src/mesa/gl.pc.in | 4 ++-- 16 files changed, 72 insertions(+), 58 deletions(-) diff --git a/configs/autoconf.in b/configs/autoconf.in index ed44a0f1a68..21d224fb329 100644 --- a/configs/autoconf.in +++ b/configs/autoconf.in @@ -89,9 +89,12 @@ EXPAT_INCLUDES = @EXPAT_INCLUDES@ prefix = @prefix@ exec_prefix = @exec_prefix@ libdir = @libdir@ +includedir = @includedir@ # Installation directories (for make install) INSTALL_DIR = $(prefix) +INSTALL_LIB_DIR = $(libdir) +INSTALL_INC_DIR = $(includedir) # DRI installation directories DRI_DRIVER_INSTALL_DIR = @DRI_DRIVER_INSTALL_DIR@ diff --git a/configs/default b/configs/default index 37b693932d6..d5b40c5cd0c 100644 --- a/configs/default +++ b/configs/default @@ -84,7 +84,9 @@ APP_LIB_DEPS = -lm # Installation directories (for make install) INSTALL_DIR = /usr/local -DRI_DRIVER_INSTALL_DIR = $(INSTALL_DIR)/$(LIB_DIR)/dri +INSTALL_LIB_DIR = $(INSTALL_DIR)/$(LIB_DIR) +INSTALL_INC_DIR = $(INSTALL_DIR)/include +DRI_DRIVER_INSTALL_DIR = $(INSTALL_LIB_DIR)/dri # Where libGL will look for DRI hardware drivers DRI_DRIVER_SEARCH_DIR = $(DRI_DRIVER_INSTALL_DIR) diff --git a/configure.ac b/configure.ac index f15d9ff94a6..961a60cccfa 100644 --- a/configure.ac +++ b/configure.ac @@ -994,6 +994,7 @@ echo "" echo " prefix: $prefix" echo " exec_prefix: $exec_prefix" echo " libdir: $libdir" +echo " includedir: $includedir" dnl Driver info echo "" diff --git a/src/glu/Makefile b/src/glu/Makefile index 23161b50156..fe19fd1ff34 100644 --- a/src/glu/Makefile +++ b/src/glu/Makefile @@ -16,16 +16,17 @@ default: $(TOP)/configs/current # GLU pkg-config file pcedit = sed \ -e 's,@INSTALL_DIR@,$(INSTALL_DIR),' \ - -e 's,@LIB_DIR@,$(LIB_DIR),' \ + -e 's,@INSTALL_LIB_DIR@,$(INSTALL_LIB_DIR),' \ + -e 's,@INSTALL_INC_DIR@,$(INSTALL_INC_DIR),' \ -e 's,@VERSION@,$(MESA_MAJOR).$(MESA_MINOR).$(MESA_TINY),' glu.pc: glu.pc.in $(pcedit) $< > $@ install: glu.pc - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig - $(INSTALL) $(TOP)/$(LIB_DIR)/libGLU.* $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -m 644 glu.pc $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig + $(INSTALL) $(TOP)/$(LIB_DIR)/libGLU.* $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -m 644 glu.pc $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig clean: -@for dir in $(SUBDIRS) ; do \ diff --git a/src/glu/glu.pc.in b/src/glu/glu.pc.in index 5d6e52a75e4..8606b9b222c 100644 --- a/src/glu/glu.pc.in +++ b/src/glu/glu.pc.in @@ -1,7 +1,7 @@ prefix=@INSTALL_DIR@ exec_prefix=${prefix} -libdir=${exec_prefix}/@LIB_DIR@ -includedir=${prefix}/include +libdir=@INSTALL_LIB_DIR@ +includedir=@INSTALL_INC_DIR@ Name: glu Description: Mesa OpenGL Utility library diff --git a/src/glut/fbdev/Makefile b/src/glut/fbdev/Makefile index 95893b7dd1b..ff74a2898dd 100644 --- a/src/glut/fbdev/Makefile +++ b/src/glut/fbdev/Makefile @@ -69,10 +69,10 @@ $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS) $(MKLIB_OPTIONS) $(OBJECTS) install: - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/GL - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -m 644 $(TOP)/include/GL/glut.h $(DESTDIR)$(INSTALL_DIR)/include/GL - $(INSTALL) $(TOP)/$(LIB_DIR)/libglut* $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) + $(INSTALL) -d $(DESTDIR)$(INSTALL_INC_DIR)/GL + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -m 644 $(TOP)/include/GL/glut.h $(DESTDIR)$(INSTALL_INC_DIR)/GL + $(INSTALL) $(TOP)/$(LIB_DIR)/libglut* $(DESTDIR)$(INSTALL_LIB_DIR) # Run 'make -f Makefile.solo dep' to update the dependencies if you change # what's included by any source file. diff --git a/src/glut/glx/Makefile b/src/glut/glx/Makefile index 674d5a5dcef..819dfd25022 100644 --- a/src/glut/glx/Makefile +++ b/src/glut/glx/Makefile @@ -100,18 +100,19 @@ $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS) # glut pkgconfig file pcedit = sed \ -e 's,@INSTALL_DIR@,$(INSTALL_DIR),' \ - -e 's,@LIB_DIR@,$(LIB_DIR),' \ + -e 's,@INSTALL_LIB_DIR@,$(INSTALL_LIB_DIR),' \ + -e 's,@INSTALL_INC_DIR@,$(INSTALL_INC_DIR),' \ -e 's,@VERSION@,$(GLUT_MAJOR).$(GLUT_MINOR).$(GLUT_TINY),' glut.pc: glut.pc.in $(pcedit) $< > $@ install: glut.pc - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/GL - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig - $(INSTALL) -m 644 $(TOP)/include/GL/glut.h $(DESTDIR)$(INSTALL_DIR)/include/GL - $(INSTALL) $(TOP)/$(LIB_DIR)/libglut* $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -m 644 glut.pc $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig + $(INSTALL) -d $(DESTDIR)$(INSTALL_INC_DIR)/GL + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig + $(INSTALL) -m 644 $(TOP)/include/GL/glut.h $(DESTDIR)$(INSTALL_INC_DIR)/GL + $(INSTALL) $(TOP)/$(LIB_DIR)/libglut* $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -m 644 glut.pc $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig clean: diff --git a/src/glut/glx/glut.pc.in b/src/glut/glx/glut.pc.in index f732f2990d0..e8638fe1488 100644 --- a/src/glut/glx/glut.pc.in +++ b/src/glut/glx/glut.pc.in @@ -1,7 +1,7 @@ prefix=@INSTALL_DIR@ exec_prefix=${prefix} -libdir=${exec_prefix}/@LIB_DIR@ -includedir=${prefix}/include +libdir=@INSTALL_LIB_DIR@ +includedir=@INSTALL_INC_DIR@ Name: glut Description: Mesa OpenGL Utility Toolkit library diff --git a/src/glut/mini/Makefile b/src/glut/mini/Makefile index d3860503901..6aba2af0a3a 100644 --- a/src/glut/mini/Makefile +++ b/src/glut/mini/Makefile @@ -75,18 +75,19 @@ tags: # glut pkgconfig file pcedit = sed \ -e 's,@INSTALL_DIR@,$(INSTALL_DIR),' \ - -e 's,@LIB_DIR@,$(LIB_DIR),' \ + -e 's,@INSTALL_LIB_DIR@,$(INSTALL_LIB_DIR),' \ + -e 's,@INSTALL_INC_DIR@,$(INSTALL_INC_DIR),' \ -e 's,@VERSION@,$(GLUT_MAJOR).$(GLUT_MINOR).$(GLUT_TINY),' glut.pc: glut.pc.in $(pcedit) $< > $@ install: glut.pc - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/GL - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig - $(INSTALL) -m 644 $(TOP)/include/GL/glut.h $(DESTDIR)$(INSTALL_DIR)/include/GL - $(INSTALL) $(TOP)/$(LIB_DIR)/libglut* $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -m 644 glut.pc $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig + $(INSTALL) -d $(DESTDIR)$(INSTALL_INC_DIR)/GL + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig + $(INSTALL) -m 644 $(TOP)/include/GL/glut.h $(DESTDIR)$(INSTALL_INC_DIR)/GL + $(INSTALL) $(TOP)/$(LIB_DIR)/libglut* $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -m 644 glut.pc $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig # Remove .o and backup files diff --git a/src/glut/mini/glut.pc.in b/src/glut/mini/glut.pc.in index f732f2990d0..e8638fe1488 100644 --- a/src/glut/mini/glut.pc.in +++ b/src/glut/mini/glut.pc.in @@ -1,7 +1,7 @@ prefix=@INSTALL_DIR@ exec_prefix=${prefix} -libdir=${exec_prefix}/@LIB_DIR@ -includedir=${prefix}/include +libdir=@INSTALL_LIB_DIR@ +includedir=@INSTALL_INC_DIR@ Name: glut Description: Mesa OpenGL Utility Toolkit library diff --git a/src/glw/Makefile b/src/glw/Makefile index 88bf99d44f3..f0dd1acb43b 100644 --- a/src/glw/Makefile +++ b/src/glw/Makefile @@ -28,18 +28,19 @@ default: $(TOP)/$(LIB_DIR)/$(GLW_LIB_NAME) # GLU pkg-config file pcedit = sed \ -e 's,@INSTALL_DIR@,$(INSTALL_DIR),' \ - -e 's,@LIB_DIR@,$(LIB_DIR),' \ + -e 's,@INSTALL_LIB_DIR@,$(INSTALL_LIB_DIR),' \ + -e 's,@INSTALL_INC_DIR@,$(INSTALL_INC_DIR),' \ -e 's,@VERSION@,$(MAJOR).$(MINOR).$(TINY),' glw.pc: glw.pc.in $(pcedit) $< > $@ install: glw.pc - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/GL - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig - $(INSTALL) -m 644 *.h $(DESTDIR)$(INSTALL_DIR)/include/GL - $(INSTALL) $(TOP)/$(LIB_DIR)/libGLw.* $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -m 644 glw.pc $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig + $(INSTALL) -d $(DESTDIR)$(INSTALL_INC_DIR)/GL + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig + $(INSTALL) -m 644 *.h $(DESTDIR)$(INSTALL_INC_DIR)/GL + $(INSTALL) $(TOP)/$(LIB_DIR)/libGLw.* $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -m 644 glw.pc $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig clean: -rm -f depend depend.bak diff --git a/src/glw/glw.pc.in b/src/glw/glw.pc.in index 9c2682fbf34..25f3f73b8c6 100644 --- a/src/glw/glw.pc.in +++ b/src/glw/glw.pc.in @@ -1,7 +1,7 @@ prefix=@INSTALL_DIR@ exec_prefix=${prefix} -libdir=${exec_prefix}/@LIB_DIR@ -includedir=${prefix}/include +libdir=@INSTALL_LIB_DIR@ +includedir=@INSTALL_INC_DIR@ Name: glw Description: Mesa OpenGL widget library diff --git a/src/mesa/Makefile b/src/mesa/Makefile index e0b641b921e..3827ffb3f72 100644 --- a/src/mesa/Makefile +++ b/src/mesa/Makefile @@ -90,28 +90,29 @@ install: default pcedit = sed \ -e 's,@INSTALL_DIR@,$(INSTALL_DIR),' \ - -e 's,@LIB_DIR@,$(LIB_DIR),' \ + -e 's,@INSTALL_LIB_DIR@,$(INSTALL_LIB_DIR),' \ + -e 's,@INSTALL_INC_DIR@,$(INSTALL_INC_DIR),' \ -e 's,@VERSION@,$(MESA_MAJOR).$(MESA_MINOR).$(MESA_TINY),' gl.pc: gl.pc.in $(pcedit) $< > $@ install-headers: - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/GL + $(INSTALL) -d $(DESTDIR)$(INSTALL_INC_DIR)/GL $(INSTALL) -m 644 $(TOP)/include/GL/*.h \ - $(DESTDIR)$(INSTALL_DIR)/include/GL + $(DESTDIR)$(INSTALL_INC_DIR)/GL install-libgl: default gl.pc install-headers - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig $(INSTALL) $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME)* \ - $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) - $(INSTALL) -m 644 gl.pc $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig + $(DESTDIR)$(INSTALL_LIB_DIR) + $(INSTALL) -m 644 gl.pc $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig install-osmesa: default - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR) $(INSTALL) $(TOP)/$(LIB_DIR)/$(OSMESA_LIB_NAME)* \ - $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) + $(DESTDIR)$(INSTALL_LIB_DIR) install-dri: default cd drivers/dri && $(MAKE) install diff --git a/src/mesa/drivers/dri/Makefile b/src/mesa/drivers/dri/Makefile index 3f87782fb1b..96118e01765 100644 --- a/src/mesa/drivers/dri/Makefile +++ b/src/mesa/drivers/dri/Makefile @@ -22,7 +22,8 @@ subdirs: pcedit = sed \ -e 's,@INSTALL_DIR@,$(INSTALL_DIR),' \ - -e 's,@LIB_DIR@,$(LIB_DIR),' \ + -e 's,@INSTALL_LIB_DIR@,$(INSTALL_LIB_DIR),' \ + -e 's,@INSTALL_INC_DIR@,$(INSTALL_INC_DIR),' \ -e 's,@VERSION@,$(MESA_MAJOR).$(MESA_MINOR).$(MESA_TINY),' \ -e 's,@DRI_DRIVER_DIR@,$(DRI_DRIVER_SEARCH_DIR),' @@ -36,11 +37,13 @@ install: dri.pc (cd $$dir && $(MAKE) install) || exit 1 ; \ fi \ done - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/GL/internal - $(INSTALL) -m 0644 $(TOP)/include/GL/internal/dri_interface.h $(DESTDIR)$(INSTALL_DIR)/include/GL/internal - $(INSTALL) -m 0644 $(TOP)/include/GL/internal/dri_sarea.h $(DESTDIR)$(INSTALL_DIR)/include/GL/internal - $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig - $(INSTALL) -m 0644 dri.pc $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR)/pkgconfig + $(INSTALL) -d $(DESTDIR)$(INSTALL_INC_DIR)/GL/internal + $(INSTALL) -m 0644 $(TOP)/include/GL/internal/dri_interface.h \ + $(DESTDIR)$(INSTALL_INC_DIR)/GL/internal + $(INSTALL) -m 0644 $(TOP)/include/GL/internal/dri_sarea.h \ + $(DESTDIR)$(INSTALL_INC_DIR)/GL/internal + $(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig + $(INSTALL) -m 0644 dri.pc $(DESTDIR)$(INSTALL_LIB_DIR)/pkgconfig clean: diff --git a/src/mesa/drivers/dri/dri.pc.in b/src/mesa/drivers/dri/dri.pc.in index 58d890d0cb6..c47ee9c7e7d 100644 --- a/src/mesa/drivers/dri/dri.pc.in +++ b/src/mesa/drivers/dri/dri.pc.in @@ -1,7 +1,7 @@ prefix=@INSTALL_DIR@ exec_prefix=${prefix} -libdir=${exec_prefix}/@LIB_DIR@ -includedir=${prefix}/include +libdir=@INSTALL_LIB_DIR@ +includedir=@INSTALL_INC_DIR@ dridriverdir=@DRI_DRIVER_DIR@ Name: dri diff --git a/src/mesa/gl.pc.in b/src/mesa/gl.pc.in index 4b144ffa4b2..1927880d5f9 100644 --- a/src/mesa/gl.pc.in +++ b/src/mesa/gl.pc.in @@ -1,7 +1,7 @@ prefix=@INSTALL_DIR@ exec_prefix=${prefix} -libdir=${exec_prefix}/@LIB_DIR@ -includedir=${prefix}/include +libdir=@INSTALL_LIB_DIR@ +includedir=@INSTALL_INC_DIR@ Name: gl Description: Mesa OpenGL library -- cgit v1.2.3 From e6e4f25aa5433fc77a3c1b0dba2300cc4cee5d33 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Sun, 6 Jul 2008 14:17:39 -0700 Subject: autoconf: Allow commas or spaces to separate DRI drivers Explicitly allow the argument to --with-dri-drivers to contain comma-separated or space-separated drivers. A space-separated driver list worked by chance before. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 961a60cccfa..a2ebc3b3b6b 100644 --- a/configure.ac +++ b/configure.ac @@ -619,7 +619,7 @@ case "$with_dri_drivers" in no|yes) ;; *) # verify the requested driver directories exist - dri_drivers=`IFS=,; echo $with_dri_drivers` + dri_drivers=`IFS=', '; echo $with_dri_drivers` for driver in $dri_drivers; do test -d "$srcdir/src/mesa/drivers/dri/$driver" || \ AC_MSG_ERROR([DRI driver directory '$driver' doesn't exist]) -- cgit v1.2.3 From a36bf890e8be3473f6a98f5ba4369e3acc0463ad Mon Sep 17 00:00:00 2001 From: George Sapountzis Date: Mon, 7 Jul 2008 18:34:17 +0300 Subject: glx: add LIBGL_ALWAYS_SOFTWARE this disables accelerated DRI and fallbacks to client-side software rendering. compile-tested only. --- src/glx/x11/glxext.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c index 777828569f4..d13d636699e 100644 --- a/src/glx/x11/glxext.c +++ b/src/glx/x11/glxext.c @@ -631,6 +631,9 @@ _X_HIDDEN __GLXdisplayPrivate *__glXInitialize(Display* dpy) __GLXdisplayPrivate *dpyPriv; XEDataObject dataObj; int major, minor; +#ifdef GLX_DIRECT_RENDERING + Bool glx_direct, glx_accel; +#endif #if defined(USE_XTHREADS) { @@ -698,16 +701,20 @@ _X_HIDDEN __GLXdisplayPrivate *__glXInitialize(Display* dpy) dpyPriv->serverGLXversion = 0x0; #ifdef GLX_DIRECT_RENDERING + glx_direct = (getenv("LIBGL_ALWAYS_INDIRECT") == NULL); + glx_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL); + /* ** Initialize the direct rendering per display data and functions. ** Note: This _must_ be done before calling any other DRI routines ** (e.g., those called in AllocAndFetchScreenConfigs). */ - if (getenv("LIBGL_ALWAYS_INDIRECT") == NULL) { + if (glx_direct && glx_accel) { dpyPriv->dri2Display = dri2CreateDisplay(dpy); dpyPriv->driDisplay = driCreateDisplay(dpy); - dpyPriv->driswDisplay = driswCreateDisplay(dpy); } + if (glx_direct) + dpyPriv->driswDisplay = driswCreateDisplay(dpy); #endif if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) { -- cgit v1.2.3 From 92c075eeb7c330ea420400d1c2bae57356b19f03 Mon Sep 17 00:00:00 2001 From: "Xiang, Haihao" Date: Tue, 8 Jul 2008 14:14:04 +0800 Subject: i965: official name for GM45 chipset --- src/mesa/drivers/dri/i965/brw_clip_line.c | 2 +- src/mesa/drivers/dri/i965/brw_clip_state.c | 2 +- src/mesa/drivers/dri/i965/brw_clip_tri.c | 2 +- src/mesa/drivers/dri/i965/brw_defines.h | 13 +++++++------ src/mesa/drivers/dri/i965/brw_eu_emit.c | 16 ++++++++-------- src/mesa/drivers/dri/i965/brw_misc_state.c | 8 ++++---- src/mesa/drivers/dri/i965/brw_structs.h | 4 ++-- src/mesa/drivers/dri/i965/brw_vs_emit.c | 2 +- src/mesa/drivers/dri/intel/intel_chipset.h | 10 +++++----- src/mesa/drivers/dri/intel/intel_context.c | 4 +++- 10 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_clip_line.c b/src/mesa/drivers/dri/i965/brw_clip_line.c index 7d51cddfc3d..0930e6a5739 100644 --- a/src/mesa/drivers/dri/i965/brw_clip_line.c +++ b/src/mesa/drivers/dri/i965/brw_clip_line.c @@ -148,7 +148,7 @@ static void clip_and_emit_line( struct brw_clip_compile *c ) brw_clip_init_clipmask(c); /* -ve rhw workaround */ - if (!BRW_IS_IGD(p->brw)) { + if (!(BRW_IS_GM45(p->brw) || BRW_IS_G4X(p->brw))) { brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ); brw_AND(p, brw_null_reg(), get_element_ud(c->reg.R0, 2), brw_imm_ud(1<<20)); diff --git a/src/mesa/drivers/dri/i965/brw_clip_state.c b/src/mesa/drivers/dri/i965/brw_clip_state.c index 7cb21f894eb..2d0b24c5cae 100644 --- a/src/mesa/drivers/dri/i965/brw_clip_state.c +++ b/src/mesa/drivers/dri/i965/brw_clip_state.c @@ -102,7 +102,7 @@ clip_unit_create_from_key(struct brw_context *brw, clip.clip5.api_mode = BRW_CLIP_API_OGL; clip.clip5.clip_mode = key->clip_mode; - if (BRW_IS_IGD(brw)) + if (BRW_IS_GM45(brw) || BRW_IS_G4X(brw)) clip.clip5.negative_w_clip_test = 1; clip.clip6.clipper_viewport_state_ptr = 0; diff --git a/src/mesa/drivers/dri/i965/brw_clip_tri.c b/src/mesa/drivers/dri/i965/brw_clip_tri.c index f1fc6e1e9da..7c703179fea 100644 --- a/src/mesa/drivers/dri/i965/brw_clip_tri.c +++ b/src/mesa/drivers/dri/i965/brw_clip_tri.c @@ -536,7 +536,7 @@ void brw_emit_tri_clip( struct brw_clip_compile *c ) /* if -ve rhw workaround bit is set, do cliptest */ - if (!BRW_IS_IGD(p->brw)) { + if (!(BRW_IS_GM45(p->brw) || BRW_IS_G4X(p->brw))) { brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ); brw_AND(p, brw_null_reg(), get_element_ud(c->reg.R0, 2), brw_imm_ud(1<<20)); diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h index 3aada8cab1a..92c058ade8d 100644 --- a/src/mesa/drivers/dri/i965/brw_defines.h +++ b/src/mesa/drivers/dri/i965/brw_defines.h @@ -804,7 +804,7 @@ #define CMD_STATE_BASE_ADDRESS 0x6101 #define CMD_STATE_INSN_POINTER 0x6102 #define CMD_PIPELINE_SELECT_965 0x6104 -#define CMD_PIPELINE_SELECT_IGD 0x6904 +#define CMD_PIPELINE_SELECT_GM45 0x6904 #define CMD_PIPELINED_STATE_POINTERS 0x7800 #define CMD_BINDING_TABLE_PTRS 0x7801 @@ -836,7 +836,7 @@ #define CMD_INDEX_BUFFER 0x780a #define CMD_VF_STATISTICS_965 0x780b -#define CMD_VF_STATISTICS_IGD 0x680b +#define CMD_VF_STATISTICS_GM45 0x680b #define CMD_DRAW_RECT 0x7900 #define CMD_BLEND_CONSTANT_COLOR 0x7901 @@ -862,9 +862,10 @@ #include "intel_chipset.h" -#define BRW_IS_IGD(brw) (IS_IGD((brw)->intel.intelScreen->deviceID)) -#define CMD_PIPELINE_SELECT(brw) ((BRW_IS_IGD(brw)) ? CMD_PIPELINE_SELECT_IGD : CMD_PIPELINE_SELECT_965) -#define CMD_VF_STATISTICS(brw) ((BRW_IS_IGD(brw)) ? CMD_VF_STATISTICS_IGD : CMD_VF_STATISTICS_965) -#define URB_SIZES(brw) ((BRW_IS_IGD(brw)) ? 384 : 256) /* 512 bit unit */ +#define BRW_IS_GM45(brw) (IS_GM45_GM((brw)->intel.intelScreen->deviceID)) +#define BRW_IS_G4X(brw) (IS_G4X((brw)->intel.intelScreen->deviceID)) +#define CMD_PIPELINE_SELECT(brw) ((BRW_IS_GM45(brw) || BRW_IS_G4X(brw)) ? CMD_PIPELINE_SELECT_GM45 : CMD_PIPELINE_SELECT_965) +#define CMD_VF_STATISTICS(brw) ((BRW_IS_GM45(brw) || BRW_IS_G4X(brw)) ? CMD_VF_STATISTICS_GM45 : CMD_VF_STATISTICS_965) +#define URB_SIZES(brw) ((BRW_IS_GM45(brw) || BRW_IS_G4X(brw)) ? 384 : 256) /* 512 bit unit */ #endif diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c index fefd30bc7f5..6b97f8b170c 100644 --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c @@ -329,14 +329,14 @@ static void brw_set_sampler_message(struct brw_context *brw, { brw_set_src1(insn, brw_imm_d(0)); - if (BRW_IS_IGD(brw)) { - insn->bits3.sampler_igd.binding_table_index = binding_table_index; - insn->bits3.sampler_igd.sampler = sampler; - insn->bits3.sampler_igd.msg_type = msg_type; - insn->bits3.sampler_igd.response_length = response_length; - insn->bits3.sampler_igd.msg_length = msg_length; - insn->bits3.sampler_igd.end_of_thread = eot; - insn->bits3.sampler_igd.msg_target = BRW_MESSAGE_TARGET_SAMPLER; + if (BRW_IS_GM45(brw) || BRW_IS_G4X(brw)) { + insn->bits3.sampler_gm45_g4x.binding_table_index = binding_table_index; + insn->bits3.sampler_gm45_g4x.sampler = sampler; + insn->bits3.sampler_gm45_g4x.msg_type = msg_type; + insn->bits3.sampler_gm45_g4x.response_length = response_length; + insn->bits3.sampler_gm45_g4x.msg_length = msg_length; + insn->bits3.sampler_gm45_g4x.end_of_thread = eot; + insn->bits3.sampler_gm45_g4x.msg_target = BRW_MESSAGE_TARGET_SAMPLER; } else { insn->bits3.sampler.binding_table_index = binding_table_index; insn->bits3.sampler.sampler = sampler; diff --git a/src/mesa/drivers/dri/i965/brw_misc_state.c b/src/mesa/drivers/dri/i965/brw_misc_state.c index 26ec797b5fd..62df2590f35 100644 --- a/src/mesa/drivers/dri/i965/brw_misc_state.c +++ b/src/mesa/drivers/dri/i965/brw_misc_state.c @@ -192,7 +192,7 @@ static void emit_depthbuffer(struct brw_context *brw) { struct intel_context *intel = &brw->intel; struct intel_region *region = brw->state.depth_region; - unsigned int len = BRW_IS_IGD(brw) ? sizeof(struct brw_depthbuffer_igd) / 4 : sizeof(struct brw_depthbuffer) / 4; + unsigned int len = (BRW_IS_GM45(brw) || BRW_IS_G4X(brw)) ? sizeof(struct brw_depthbuffer_gm45_g4x) / 4 : sizeof(struct brw_depthbuffer) / 4; if (region == NULL) { BEGIN_BATCH(len, IGNORE_CLIPRECTS); @@ -203,7 +203,7 @@ static void emit_depthbuffer(struct brw_context *brw) OUT_BATCH(0); OUT_BATCH(0); - if (BRW_IS_IGD(brw)) + if (BRW_IS_GM45(brw) || BRW_IS_G4X(brw)) OUT_BATCH(0); ADVANCE_BATCH(); @@ -239,7 +239,7 @@ static void emit_depthbuffer(struct brw_context *brw) ((region->height - 1) << 19)); OUT_BATCH(0); - if (BRW_IS_IGD(brw)) + if (BRW_IS_GM45(brw) || BRW_IS_G4X(brw)) OUT_BATCH(0); ADVANCE_BATCH(); @@ -324,7 +324,7 @@ static void upload_aa_line_parameters(struct brw_context *brw) { struct brw_aa_line_parameters balp; - if (!BRW_IS_IGD(brw)) + if (!(BRW_IS_GM45(brw) || BRW_IS_G4X(brw))) return; /* use legacy aa line coverage computation */ diff --git a/src/mesa/drivers/dri/i965/brw_structs.h b/src/mesa/drivers/dri/i965/brw_structs.h index 1326280e00a..ec865c925a7 100644 --- a/src/mesa/drivers/dri/i965/brw_structs.h +++ b/src/mesa/drivers/dri/i965/brw_structs.h @@ -175,7 +175,7 @@ struct brw_depthbuffer } dword4; }; -struct brw_depthbuffer_igd +struct brw_depthbuffer_gm45_g4x { union header_union header; @@ -1405,7 +1405,7 @@ struct brw_instruction GLuint msg_target:4; GLuint pad1:3; GLuint end_of_thread:1; - } sampler_igd; + } sampler_gm45_g4x; struct brw_urb_immediate urb; diff --git a/src/mesa/drivers/dri/i965/brw_vs_emit.c b/src/mesa/drivers/dri/i965/brw_vs_emit.c index 3cac97c71f4..7767d1369ce 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_emit.c +++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c @@ -867,7 +867,7 @@ static void emit_vertex_write( struct brw_vs_compile *c) * Later, clipping will detect ucp[6] and ensure the primitive is * clipped against all fixed planes. */ - if (!BRW_IS_IGD(p->brw) && !c->key.know_w_is_one) { + if (!(BRW_IS_GM45(p->brw) || BRW_IS_G4X(p->brw)) && !c->key.know_w_is_one) { brw_CMP(p, vec8(brw_null_reg()), BRW_CONDITIONAL_L, diff --git a/src/mesa/drivers/dri/intel/intel_chipset.h b/src/mesa/drivers/dri/intel/intel_chipset.h index 4a5166263ac..15b9ef43127 100644 --- a/src/mesa/drivers/dri/intel/intel_chipset.h +++ b/src/mesa/drivers/dri/intel/intel_chipset.h @@ -53,7 +53,7 @@ #define PCI_CHIP_I965_GM 0x2A02 #define PCI_CHIP_I965_GME 0x2A12 -#define PCI_CHIP_IGD_GM 0x2A42 +#define PCI_CHIP_GM45_GM 0x2A42 #define PCI_CHIP_IGD_E_G 0x2E02 #define PCI_CHIP_Q45_G 0x2E12 @@ -65,13 +65,12 @@ devid == PCI_CHIP_I945_GME || \ devid == PCI_CHIP_I965_GM || \ devid == PCI_CHIP_I965_GME || \ - devid == PCI_CHIP_IGD_GM) + devid == PCI_CHIP_GM45_GM) -#define IS_IGD_GM(devid) (devid == PCI_CHIP_IGD_GM) +#define IS_GM45_GM(devid) (devid == PCI_CHIP_GM45_GM) #define IS_G4X(devid) (devid == PCI_CHIP_IGD_E_G || \ devid == PCI_CHIP_Q45_G || \ devid == PCI_CHIP_G45_G) -#define IS_IGD(devid) (IS_IGD_GM(devid) || IS_G4X(devid)) #define IS_915(devid) (devid == PCI_CHIP_I915_G || \ devid == PCI_CHIP_E7221_G || \ @@ -90,7 +89,8 @@ devid == PCI_CHIP_I965_GM || \ devid == PCI_CHIP_I965_GME || \ devid == PCI_CHIP_I946_GZ || \ - IS_IGD(devid)) + IS_GM45_GM(devid) || \ + IS_G4X(devid)) #define IS_9XX(devid) (IS_915(devid) || \ IS_945(devid) || \ diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c index 671b3f68a3e..f8ea6461c9c 100644 --- a/src/mesa/drivers/dri/intel/intel_context.c +++ b/src/mesa/drivers/dri/intel/intel_context.c @@ -166,7 +166,9 @@ intelGetString(GLcontext * ctx, GLenum name) case PCI_CHIP_I965_GME: chipset = "Intel(R) 965GME/GLE"; break; - case PCI_CHIP_IGD_GM: + case PCI_CHIP_GM45_GM: + chipset = "Mobile Intel® GM45 Express Chipset"; + break; case PCI_CHIP_IGD_E_G: chipset = "Intel(R) Integrated Graphics Device"; break; -- cgit v1.2.3 From 477d597df69845e3fcd84605b26801c14a0ce382 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 13:02:24 -0600 Subject: mesa: add missing VARYING case to storage_string() --- src/mesa/shader/slang/slang_ir.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mesa/shader/slang/slang_ir.c b/src/mesa/shader/slang/slang_ir.c index 31ad94183c2..16c36aad0c1 100644 --- a/src/mesa/shader/slang/slang_ir.c +++ b/src/mesa/shader/slang/slang_ir.c @@ -218,12 +218,14 @@ storage_string(const slang_ir_storage *st) "NAMED_PARAM", "CONSTANT", "UNIFORM", + "VARYING", "WRITE_ONLY", "ADDRESS", "SAMPLER", "UNDEFINED" }; static char s[100]; + assert(Elements(files) == PROGRAM_FILE_MAX); #if 0 if (st->Size == 1) sprintf(s, "%s[%d]", files[st->File], st->Index); -- cgit v1.2.3 From d14b7890a44fe7a3bccd9152645f50b0edb850d8 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 13:05:34 -0600 Subject: mesa: compute global var size before doing codegen --- src/mesa/shader/slang/slang_compile.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c index 4cda7124c05..75d1d7621d7 100644 --- a/src/mesa/shader/slang/slang_compile.c +++ b/src/mesa/shader/slang/slang_compile.c @@ -1634,6 +1634,15 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O, return 0; } + /* allocate global address space for a variable with a known size */ + if (C->global_scope + && !(var->type.specifier.type == SLANG_SPEC_ARRAY + && var->array_len == 0)) { + if (!calculate_var_size(C, O, var)) + return GL_FALSE; + var->address = slang_var_pool_alloc(O->global_pool, var->size); + } + /* emit code for global var decl */ if (C->global_scope) { slang_assemble_ctx A; @@ -1648,15 +1657,6 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O, return 0; } - /* allocate global address space for a variable with a known size */ - if (C->global_scope - && !(var->type.specifier.type == SLANG_SPEC_ARRAY - && var->array_len == 0)) { - if (!calculate_var_size(C, O, var)) - return GL_FALSE; - var->address = slang_var_pool_alloc(O->global_pool, var->size); - } - /* initialize global variable */ if (C->global_scope) { if (var->initializer != NULL) { -- cgit v1.2.3 From fd6cb1b11d526d2e22d51441ab2629a10323e7b4 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 14:59:36 -0600 Subject: mesa: more debug output --- src/mesa/shader/slang/slang_print.c | 84 +++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 22 deletions(-) diff --git a/src/mesa/shader/slang/slang_print.c b/src/mesa/shader/slang/slang_print.c index f3e127cb13f..ff9c62c929e 100644 --- a/src/mesa/shader/slang/slang_print.c +++ b/src/mesa/shader/slang/slang_print.c @@ -171,9 +171,15 @@ static void print_binary(const slang_operation *op, const char *oper, int indent) { assert(op->num_children == 2); + printf("binary at %p locals=%p outer=%p\n", + (void *) op, + (void *) op->locals, + (void *) op->locals->outer_scope); slang_print_tree(&op->children[0], indent + 3); spaces(indent); - printf("%s\n", oper); + printf("%s at %p locals=%p outer=%p\n", + oper, (void *) op, (void *) op->locals, + (void *) op->locals->outer_scope); slang_print_tree(&op->children[1], indent + 3); } @@ -182,14 +188,16 @@ static void print_generic2(const slang_operation *op, const char *oper, const char *s, int indent) { - int i; + GLuint i; if (oper) { spaces(indent); - printf("[%p locals %p] %s %s\n", (void*) op, (void*) op->locals, oper, s); + printf("%s %s at %p locals=%p outer=%p\n", + oper, s, (void *) op, (void *) op->locals, + (void *) op->locals->outer_scope); } for (i = 0; i < op->num_children; i++) { spaces(indent); - printf("//child %d:\n", i); + printf("//child %u of %u:\n", i, op->num_children); slang_print_tree(&op->children[i], indent); } } @@ -244,7 +252,7 @@ slang_print_tree(const slang_operation *op, int indent) case SLANG_OPER_BLOCK_NO_NEW_SCOPE: spaces(indent); - printf("{ locals %p outer %p\n", (void*)op->locals, (void*)op->locals->outer_scope); + printf("{ locals=%p outer=%p\n", (void*)op->locals, (void*)op->locals->outer_scope); print_generic(op, NULL, indent+3); spaces(indent); printf("}\n"); @@ -252,7 +260,14 @@ slang_print_tree(const slang_operation *op, int indent) case SLANG_OPER_BLOCK_NEW_SCOPE: spaces(indent); - printf("{{ // new scope locals %p\n", (void*)op->locals); + printf("{{ // new scope locals=%p: ", (void*)op->locals); + { + int i; + for (i = 0; i < op->locals->num_variables; i++) { + printf("%s ", (char *) op->locals->variables[i]->a_name); + } + printf("\n"); + } print_generic(op, NULL, indent+3); spaces(indent); printf("}}\n"); @@ -264,14 +279,16 @@ slang_print_tree(const slang_operation *op, int indent) slang_variable *v; v = _slang_locate_variable(op->locals, op->a_id, GL_TRUE); if (v) { + const slang_variable_scope *scope; spaces(indent); printf("DECL (locals=%p outer=%p) ", (void*)op->locals, (void*) op->locals->outer_scope); print_type(&v->type); printf(" %s (%p)", (char *) op->a_id, (void *) find_var(op->locals, op->a_id)); - printf(" (in scope %p) ", - (void *) find_scope(op->locals, op->a_id)); + scope = find_scope(op->locals, op->a_id); + printf(" (in scope %p) ", (void *) scope); + assert(scope); if (op->num_children == 1) { printf(" :=\n"); slang_print_tree(&op->children[0], indent + 3); @@ -300,8 +317,12 @@ slang_print_tree(const slang_operation *op, int indent) case SLANG_OPER_ASM: spaces(indent); - printf("ASM: %s\n", (char*) op->a_id); - print_generic(op, NULL, indent+3); + printf("ASM: %s at %p locals=%p outer=%p\n", + (char *) op->a_id, + (void *) op, + (void *) op->locals, + (void *) op->locals->outer_scope); + print_generic(op, "ASM", indent+3); break; case SLANG_OPER_BREAK: @@ -333,7 +354,9 @@ slang_print_tree(const slang_operation *op, int indent) case SLANG_OPER_EXPRESSION: spaces(indent); - printf("EXPR: locals %p\n", (void*) op->locals); + printf("EXPR: locals=%p outer=%p\n", + (void *) op->locals, + (void *) op->locals->outer_scope); /*print_generic(op, "SLANG_OPER_EXPRESSION", indent);*/ slang_print_tree(&op->children[0], indent + 3); break; @@ -422,13 +445,25 @@ slang_print_tree(const slang_operation *op, int indent) break; case SLANG_OPER_IDENTIFIER: - spaces(indent); - if (op->var && op->var->a_name) - printf("VAR %s (in scope %p)\n", (char *) op->var->a_name, - (void *) find_scope(op->locals, op->a_id)); - else - printf("VAR' %s (in scope %p)\n", (char *) op->a_id, - (void *) find_scope(op->locals, op->a_id)); + { + const slang_variable_scope *scope; + spaces(indent); + if (op->var && op->var->a_name) { + scope = find_scope(op->locals, op->var->a_name); + printf("VAR %s (in scope %p)\n", (char *) op->var->a_name, + (void *) scope); + assert(scope); + } + else { + scope = find_scope(op->locals, op->a_id); + printf("VAR' %s (in scope %p) locals=%p outer=%p\n", + (char *) op->a_id, + (void *) scope, + (void *) op->locals, + (void *) op->locals->outer_scope); + assert(scope); + } + } break; case SLANG_OPER_SEQUENCE: @@ -437,7 +472,9 @@ slang_print_tree(const slang_operation *op, int indent) case SLANG_OPER_ASSIGN: spaces(indent); - printf("ASSIGNMENT locals %p\n", (void*)op->locals); + printf("ASSIGNMENT locals=%p outer=%p\n", + (void *) op->locals, + (void *) op->locals->outer_scope); print_binary(op, ":=", indent); break; @@ -573,7 +610,9 @@ slang_print_tree(const slang_operation *op, int indent) case SLANG_OPER_SUBSCRIPT: spaces(indent); - printf("SLANG_OPER_SUBSCRIPT\n"); + printf("SLANG_OPER_SUBSCRIPT locals=%p outer=%p\n", + (void *) op->locals, + (void *) op->locals->outer_scope); print_generic(op, NULL, indent+3); break; @@ -640,7 +679,8 @@ slang_print_function(const slang_function *f, GLboolean body) print_variable(f->parameters->variables[i], 3); } - printf(")\n"); + printf(") param scope = %p\n", (void *) f->parameters); + if (body && f->body) slang_print_tree(f->body, 0); } @@ -804,7 +844,7 @@ int slang_checksum_tree(const slang_operation *op) { int s = op->num_children; - int i; + GLuint i; for (i = 0; i < op->num_children; i++) { s += slang_checksum_tree(&op->children[i]); -- cgit v1.2.3 From c71fa34728ef4eddd074aeb2bee49ae6a7acb3d1 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 15:11:23 -0600 Subject: added null texObj ptr check (bug 15567) --- src/mesa/swrast/s_fragprog.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/mesa/swrast/s_fragprog.c b/src/mesa/swrast/s_fragprog.c index ecace9c5025..bf7a1de03bc 100644 --- a/src/mesa/swrast/s_fragprog.c +++ b/src/mesa/swrast/s_fragprog.c @@ -44,7 +44,8 @@ fetch_texel_lod( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda, SWcontext *swrast = SWRAST_CONTEXT(ctx); const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current; - lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod); + if (texObj) + lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod); /* XXX use a float-valued TextureSample routine here!!! */ swrast->TextureSample[unit](ctx, texObj, 1, (const GLfloat (*)[4]) texcoord, @@ -68,20 +69,23 @@ fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4], { SWcontext *swrast = SWRAST_CONTEXT(ctx); const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current; - const struct gl_texture_image *texImg = texObj->Image[0][texObj->BaseLevel]; - const GLfloat texW = (GLfloat) texImg->WidthScale; - const GLfloat texH = (GLfloat) texImg->HeightScale; + GLfloat lambda; GLchan rgba[4]; - GLfloat lambda - = _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */ - texdx[1], texdy[1], /* dt/dx, dt/dy */ - texdx[3], texdy[2], /* dq/dx, dq/dy */ - texW, texH, - texcoord[0], texcoord[1], texcoord[3], - 1.0F / texcoord[3]) + lodBias; + if (texObj) { + const struct gl_texture_image *texImg = texObj->Image[0][texObj->BaseLevel]; + const GLfloat texW = (GLfloat) texImg->WidthScale; + const GLfloat texH = (GLfloat) texImg->HeightScale; - lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod); + lambda = _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */ + texdx[1], texdy[1], /* dt/dx, dt/dy */ + texdx[3], texdy[2], /* dq/dx, dq/dy */ + texW, texH, + texcoord[0], texcoord[1], texcoord[3], + 1.0F / texcoord[3]) + lodBias; + + lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod); + } swrast->TextureSample[unit](ctx, texObj, 1, (const GLfloat (*)[4]) texcoord, &lambda, &rgba); -- cgit v1.2.3 From 6fe78576291d38108c8815dc33fa44a8ae656f71 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 15:12:48 -0600 Subject: mesa: bump version to rc2 --- Makefile | 8 ++++---- src/mesa/main/version.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 21cf0b5009d..79b4472bcb7 100644 --- a/Makefile +++ b/Makefile @@ -174,10 +174,10 @@ ultrix-gcc: # Rules for making release tarballs -DIRECTORY = Mesa-7.1-rc1 -LIB_NAME = MesaLib-7.1-rc1 -DEMO_NAME = MesaDemos-7.1-rc1 -GLUT_NAME = MesaGLUT-7.1-rc1 +DIRECTORY = Mesa-7.1-rc2 +LIB_NAME = MesaLib-7.1-rc2 +DEMO_NAME = MesaDemos-7.1-rc2 +GLUT_NAME = MesaGLUT-7.1-rc2 MAIN_FILES = \ $(DIRECTORY)/Makefile* \ diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h index 2f459e517a5..9f37453960e 100644 --- a/src/mesa/main/version.h +++ b/src/mesa/main/version.h @@ -31,7 +31,7 @@ #define MESA_MAJOR 7 #define MESA_MINOR 1 #define MESA_PATCH 0 -#define MESA_VERSION_STRING "7.1 rc1" +#define MESA_VERSION_STRING "7.1 rc2" /* To make version comparison easy */ #define MESA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -- cgit v1.2.3 From 44029f15a8c841d0deb3c7b477bc36ca7a9cd3e6 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 16:16:57 -0600 Subject: added src/mesa/drivers/Makefile to file list --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 79b4472bcb7..d69252e41d0 100644 --- a/Makefile +++ b/Makefile @@ -258,6 +258,7 @@ MAIN_FILES = \ $(DIRECTORY)/src/mesa/tnl_dd/*.[ch] \ $(DIRECTORY)/src/mesa/tnl_dd/imm/*.[ch] \ $(DIRECTORY)/src/mesa/tnl_dd/imm/NOTES.imm \ + $(DIRECTORY)/src/mesa/drivers/Makefile \ $(DIRECTORY)/src/mesa/drivers/beos/*.cpp \ $(DIRECTORY)/src/mesa/drivers/beos/Makefile \ $(DIRECTORY)/src/mesa/drivers/common/*.[ch] \ -- cgit v1.2.3 From 2be54a8e8ccb206eeedd319cf48a3c81797b83a4 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 16:17:04 -0600 Subject: mesa: implement glGetUniformiv() with new ctx->Driver function The old implementation could overwrite the caller's param buffer. --- src/mesa/main/dd.h | 2 ++ src/mesa/main/shaders.c | 7 ++----- src/mesa/shader/shader_api.c | 45 ++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index e3ded41acac..8edcfaf8c6e 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -868,6 +868,8 @@ struct dd_function_table { GLsizei *length, GLcharARB *sourceOut); void (*GetUniformfv)(GLcontext *ctx, GLuint program, GLint location, GLfloat *params); + void (*GetUniformiv)(GLcontext *ctx, GLuint program, GLint location, + GLint *params); GLint (*GetUniformLocation)(GLcontext *ctx, GLuint program, const GLcharARB *name); GLboolean (*IsProgram)(GLcontext *ctx, GLuint name); diff --git a/src/mesa/main/shaders.c b/src/mesa/main/shaders.c index b7b2f791a52..a2670fda32a 100644 --- a/src/mesa/main/shaders.c +++ b/src/mesa/main/shaders.c @@ -128,6 +128,7 @@ _mesa_DeleteObjectARB(GLhandleARB obj) void GLAPIENTRY _mesa_DeleteProgram(GLuint name) { + printf("%s name=%u\n", __FUNCTION__, name); if (name) { GET_CURRENT_CONTEXT(ctx); ctx->Driver.DeleteProgram2(ctx, name); @@ -309,11 +310,7 @@ void GLAPIENTRY _mesa_GetUniformivARB(GLhandleARB program, GLint location, GLint * params) { GET_CURRENT_CONTEXT(ctx); - GLfloat fparams[16]; /* XXX is 16 enough? */ - GLuint i; - ctx->Driver.GetUniformfv(ctx, program, location, fparams); - for (i = 0; i < 16; i++) - params[i] = (GLint) fparams[i]; /* XXX correct? */ + ctx->Driver.GetUniformiv(ctx, program, location, params); } diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index 6cfdf57a494..105f76be281 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -955,12 +955,15 @@ _mesa_get_shader_source(GLcontext *ctx, GLuint shader, GLsizei maxLength, } +#define MAX_UNIFORM_ELEMENTS 16 + /** - * Called via ctx->Driver.GetUniformfv(). + * Helper for GetUniformfv(), GetUniformiv() + * Returns number of elements written to 'params' output. */ -static void -_mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location, - GLfloat *params) +static GLuint +get_uniformfv(GLcontext *ctx, GLuint program, GLint location, + GLfloat *params) { struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, program); @@ -984,9 +987,13 @@ _mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location, ASSERT(prog); if (prog) { + /* See uniformiv() below */ + assert(prog->Parameters->Parameters[progPos].Size <= MAX_UNIFORM_ELEMENTS); + for (i = 0; i < prog->Parameters->Parameters[progPos].Size; i++) { params[i] = prog->Parameters->ParameterValues[progPos][i]; } + return prog->Parameters->Parameters[progPos].Size; } } else { @@ -996,6 +1003,35 @@ _mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location, else { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfv(program)"); } + return 0; +} + + +/** + * Called via ctx->Driver.GetUniformfv(). + */ +static void +_mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location, + GLfloat *params) +{ + (void) get_uniformfv(ctx, program, location, params); +} + + +/** + * Called via ctx->Driver.GetUniformiv(). + */ +static void +_mesa_get_uniformiv(GLcontext *ctx, GLuint program, GLint location, + GLint *params) +{ + GLfloat fparams[MAX_UNIFORM_ELEMENTS]; + GLuint n = get_uniformfv(ctx, program, location, fparams); + GLuint i; + assert(n <= MAX_UNIFORM_ELEMENTS); + for (i = 0; i < n; i++) { + params[i] = (GLint) fparams[i]; + } } @@ -1413,6 +1449,7 @@ _mesa_init_glsl_driver_functions(struct dd_function_table *driver) driver->GetShaderInfoLog = _mesa_get_shader_info_log; driver->GetShaderSource = _mesa_get_shader_source; driver->GetUniformfv = _mesa_get_uniformfv; + driver->GetUniformiv = _mesa_get_uniformiv; driver->GetUniformLocation = _mesa_get_uniform_location; driver->IsProgram = _mesa_is_program; driver->IsShader = _mesa_is_shader; -- cgit v1.2.3 From 7d3feef9d6d75ffb7dad51cef37059192a6be4ab Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 16:26:06 -0600 Subject: added more Makefiles to file list --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index d69252e41d0..87a394e9dfc 100644 --- a/Makefile +++ b/Makefile @@ -275,6 +275,7 @@ MAIN_FILES = \ $(DIRECTORY)/src/mesa/drivers/ggi/display/*.c \ $(DIRECTORY)/src/mesa/drivers/ggi/display/fbdev.conf.in \ $(DIRECTORY)/src/mesa/drivers/ggi/include/ggi/mesa/*.h \ + $(DIRECTORY)/src/mesa/drivers/osmesa/Makefile \ $(DIRECTORY)/src/mesa/drivers/osmesa/Makefile.win \ $(DIRECTORY)/src/mesa/drivers/osmesa/descrip.mms \ $(DIRECTORY)/src/mesa/drivers/osmesa/osmesa.def \ @@ -282,6 +283,7 @@ MAIN_FILES = \ $(DIRECTORY)/src/mesa/drivers/svga/*.[ch] \ $(DIRECTORY)/src/mesa/drivers/windows/*/*.[ch] \ $(DIRECTORY)/src/mesa/drivers/windows/*/*.def \ + $(DIRECTORY)/src/mesa/drivers/x11/Makefile \ $(DIRECTORY)/src/mesa/drivers/x11/descrip.mms \ $(DIRECTORY)/src/mesa/drivers/x11/*.[ch] \ $(DIRECTORY)/src/mesa/ppc/*.[ch] \ -- cgit v1.2.3 From ee2a10112323d11ddc613a043761481aa1485f19 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 16:26:28 -0600 Subject: bump version to rc3 --- Makefile | 8 ++++---- src/mesa/main/version.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 87a394e9dfc..3fd388c8256 100644 --- a/Makefile +++ b/Makefile @@ -174,10 +174,10 @@ ultrix-gcc: # Rules for making release tarballs -DIRECTORY = Mesa-7.1-rc2 -LIB_NAME = MesaLib-7.1-rc2 -DEMO_NAME = MesaDemos-7.1-rc2 -GLUT_NAME = MesaGLUT-7.1-rc2 +DIRECTORY = Mesa-7.1-rc3 +LIB_NAME = MesaLib-7.1-rc3 +DEMO_NAME = MesaDemos-7.1-rc3 +GLUT_NAME = MesaGLUT-7.1-rc3 MAIN_FILES = \ $(DIRECTORY)/Makefile* \ diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h index 9f37453960e..4258a114ed0 100644 --- a/src/mesa/main/version.h +++ b/src/mesa/main/version.h @@ -31,7 +31,7 @@ #define MESA_MAJOR 7 #define MESA_MINOR 1 #define MESA_PATCH 0 -#define MESA_VERSION_STRING "7.1 rc2" +#define MESA_VERSION_STRING "7.1 rc3" /* To make version comparison easy */ #define MESA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -- cgit v1.2.3 From e4d9cc94b82090ca6822789458edb2364f271f30 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 16:28:33 -0600 Subject: add yet another Makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 3fd388c8256..a31ce386aae 100644 --- a/Makefile +++ b/Makefile @@ -266,6 +266,7 @@ MAIN_FILES = \ $(DIRECTORY)/src/mesa/drivers/directfb/*.[ch] \ $(DIRECTORY)/src/mesa/drivers/directfb/Makefile \ $(DIRECTORY)/src/mesa/drivers/dos/*.[chS] \ + $(DIRECTORY)/src/mesa/drivers/fbdev/Makefile \ $(DIRECTORY)/src/mesa/drivers/fbdev/glfbdev.c \ $(DIRECTORY)/src/mesa/drivers/glide/*.[ch] \ $(DIRECTORY)/src/mesa/drivers/ggi/*.[ch] \ -- cgit v1.2.3 From 2f1b5ffcda283cebc97bd440b5af44168a9c8b00 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 8 Jul 2008 16:52:45 -0600 Subject: mesa: remove debug code --- src/mesa/main/shaders.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mesa/main/shaders.c b/src/mesa/main/shaders.c index a2670fda32a..f0db0d2a818 100644 --- a/src/mesa/main/shaders.c +++ b/src/mesa/main/shaders.c @@ -128,7 +128,6 @@ _mesa_DeleteObjectARB(GLhandleARB obj) void GLAPIENTRY _mesa_DeleteProgram(GLuint name) { - printf("%s name=%u\n", __FUNCTION__, name); if (name) { GET_CURRENT_CONTEXT(ctx); ctx->Driver.DeleteProgram2(ctx, name); -- cgit v1.2.3 From 75e4db18049f3284197c9a8deabd9dd74aa7920e Mon Sep 17 00:00:00 2001 From: "Xiang, Haihao" Date: Wed, 9 Jul 2008 13:08:09 +0800 Subject: i915: fall back to software rendering when shadow comparison is enabled for 1D texture. fix #12176 --- src/mesa/drivers/dri/i915/i915_texstate.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/mesa/drivers/dri/i915/i915_texstate.c b/src/mesa/drivers/dri/i915/i915_texstate.c index af7166e681d..69c1e0755ef 100644 --- a/src/mesa/drivers/dri/i915/i915_texstate.c +++ b/src/mesa/drivers/dri/i915/i915_texstate.c @@ -257,18 +257,15 @@ i915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3) */ if (tObj->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB && tObj->Target != GL_TEXTURE_3D) { + if (tObj->Target == GL_TEXTURE_1D) + return GL_FALSE; state[I915_TEXREG_SS2] |= (SS2_SHADOW_ENABLE | intel_translate_shadow_compare_func(tObj->CompareFunc)); - if (tObj->Target == GL_TEXTURE_1D) { - minFilt = FILTER_NEAREST; - magFilt = FILTER_NEAREST; - } else { - minFilt = FILTER_4X4_FLAT; - magFilt = FILTER_4X4_FLAT; - } + minFilt = FILTER_4X4_FLAT; + magFilt = FILTER_4X4_FLAT; } state[I915_TEXREG_SS2] |= ((minFilt << SS2_MIN_FILTER_SHIFT) | -- cgit v1.2.3 From a2e435054c0d410e92d1e76a23f8d801a606537d Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 9 Jul 2008 07:48:46 -0600 Subject: mesa: check for OpenBSD (bug 15604) --- src/mesa/main/execmem.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/mesa/main/execmem.c b/src/mesa/main/execmem.c index b40a2de8fa4..0719d0051c3 100644 --- a/src/mesa/main/execmem.c +++ b/src/mesa/main/execmem.c @@ -36,7 +36,7 @@ -#if defined(__linux__) +#if defined(__linux__) || defined(__OpenBSD__) /* * Allocate a large block of memory which can hold code then dole it out @@ -51,6 +51,12 @@ #include #endif + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + + #define EXEC_HEAP_SIZE (10*1024*1024) _glthread_DECLARE_STATIC_MUTEX(exec_mutex); -- cgit v1.2.3 From 4ca0af188267ab92f84223acd7f8b957be0cb5f6 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 9 Jul 2008 08:35:50 -0600 Subject: mesa: fix state.clip[n].plane parsing bug (bug 16611) --- src/mesa/shader/arbprogparse.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mesa/shader/arbprogparse.c b/src/mesa/shader/arbprogparse.c index 97bda9c6b38..f10233e5fed 100644 --- a/src/mesa/shader/arbprogparse.c +++ b/src/mesa/shader/arbprogparse.c @@ -1132,7 +1132,9 @@ parse_state_single_item (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, gl_state_index state_tokens[STATE_LENGTH]) { - switch (*(*inst)++) { + GLubyte token = *(*inst)++; + + switch (token) { case STATE_MATERIAL_PARSER: state_tokens[0] = STATE_MATERIAL; state_tokens[1] = parse_face_type (inst); @@ -1317,7 +1319,6 @@ parse_state_single_item (GLcontext * ctx, const GLubyte ** inst, case STATE_CLIP_PLANE: state_tokens[0] = STATE_CLIPPLANE; - state_tokens[1] = parse_integer (inst, Program); if (parse_clipplane_num (ctx, inst, Program, (GLint *) &state_tokens[1])) return 1; @@ -1769,7 +1770,9 @@ parse_param_elements (GLcontext * ctx, const GLubyte ** inst, gl_state_index state_tokens[STATE_LENGTH] = {0, 0, 0, 0, 0}; GLfloat const_values[4]; - switch (*(*inst)++) { + GLubyte token = *(*inst)++; + + switch (token) { case PARAM_STATE_ELEMENT: if (parse_state_single_item (ctx, inst, Program, state_tokens)) return 1; -- cgit v1.2.3 From ac05da56ec1dd14876dbf3fde37aa951b9215f5b Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 9 Jul 2008 15:06:36 -0600 Subject: mesa: return -1, not GL_FALSE if _glapi_add_dispatch() fails name sanity check --- src/mesa/glapi/glapi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mesa/glapi/glapi.c b/src/mesa/glapi/glapi.c index 94a804329aa..08a26980e19 100644 --- a/src/mesa/glapi/glapi.c +++ b/src/mesa/glapi/glapi.c @@ -740,7 +740,7 @@ add_function_name( const char * funcName ) * \returns * The offset in the dispatch table of the named function. A pointer to the * driver's implementation of the named function should be stored at - * \c dispatch_table[\c offset]. + * \c dispatch_table[\c offset]. Return -1 if error/problem. * * \sa glXGetProcAddress * @@ -789,7 +789,7 @@ _glapi_add_dispatch( const char * const * function_names, */ if (!function_names[i] || function_names[i][0] != 'g' || function_names[i][1] != 'l') - return GL_FALSE; + return -1; /* Determine if the named function already exists. If the function does * exist, it must have the same parameter signature as the function -- cgit v1.2.3 From b52398571b7f5c537c2f5e1c87f1b8bdf3d8ea9b Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Fri, 11 Jul 2008 07:28:55 +1000 Subject: intel: fix batch flushing problem with cliprects handling. pointed out and debugged by stringfellow on #dri-devel --- src/mesa/drivers/dri/intel/intel_batchbuffer.h | 4 +++- src/mesa/drivers/dri/intel/intel_blit.c | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.h b/src/mesa/drivers/dri/intel/intel_batchbuffer.h index 2d636df2ce5..0da602010e8 100644 --- a/src/mesa/drivers/dri/intel/intel_batchbuffer.h +++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.h @@ -118,8 +118,10 @@ intel_batchbuffer_require_space(struct intel_batchbuffer *batch, if (batch->cliprect_mode == IGNORE_CLIPRECTS) { batch->cliprect_mode = cliprect_mode; } else { - if (batch->cliprect_mode != cliprect_mode) + if (batch->cliprect_mode != cliprect_mode) { intel_batchbuffer_flush(batch); + batch->cliprect_mode = cliprect_mode; + } } } } diff --git a/src/mesa/drivers/dri/intel/intel_blit.c b/src/mesa/drivers/dri/intel/intel_blit.c index d9dbbb24825..25ac609f133 100644 --- a/src/mesa/drivers/dri/intel/intel_blit.c +++ b/src/mesa/drivers/dri/intel/intel_blit.c @@ -123,7 +123,8 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv, dst_pitch /= 4; } #endif - + /* do space/cliprects check before going any further */ + intel_batchbuffer_require_space(intel->batch, 8 * 4, REFERENCES_CLIPRECTS); again: ret = dri_bufmgr_check_aperture_space(dst->buffer); ret |= dri_bufmgr_check_aperture_space(src->buffer); @@ -278,6 +279,8 @@ intelEmitCopyBlit(struct intel_context *intel, int ret; BATCH_LOCALS; + /* do space/cliprects check before going any further */ + intel_batchbuffer_require_space(intel->batch, 8 * 4, NO_LOOP_CLIPRECTS); again: ret = dri_bufmgr_check_aperture_space(dst_buffer); ret |= dri_bufmgr_check_aperture_space(src_buffer); -- cgit v1.2.3 From e97ab72b593278edeac9f9b71b8237a79247c7c7 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Tue, 1 Jul 2008 08:55:42 -0700 Subject: autoconf: Tell the user about docs/autoconf.html in --help output The documentation in autoconf.html is much more explicit about how the different configure options control the build. This adds a notice at the end of the `./configure --help' output to tell the user about it. --- configure.ac | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/configure.ac b/configure.ac index a2ebc3b3b6b..dbd81909f15 100644 --- a/configure.ac +++ b/configure.ac @@ -12,6 +12,10 @@ m4_ifval(mesa_version,[],[ m4_exit([1]) ]) +dnl Tell the user about autoconf.html in the --help output +m4_divert_once([HELP_END], [ +See docs/autoconf.html for more details on the options for Mesa.]) + AC_INIT([Mesa],[mesa_version], [https://bugs.freedesktop.org/enter_bug.cgi?product=Mesa]) AC_CONFIG_AUX_DIR([bin]) -- cgit v1.2.3 From 99803a4ec90d70363305c0652203550d63f086ec Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Tue, 1 Jul 2008 09:03:15 -0700 Subject: autoconf: Add information about the --x-* options to --help output Try to tell the user that the --x-* options are only used when the X libraries can't be found by pkg-config. --- configure.ac | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index dbd81909f15..ec8b5ddbc75 100644 --- a/configure.ac +++ b/configure.ac @@ -456,7 +456,7 @@ esac dnl dnl Find out if X is available. The variable have_x is set if libX11 is -dnl to mimic AC_PATH_XTRA. +dnl found to mimic AC_PATH_XTRA. dnl if test -n "$PKG_CONFIG"; then AC_MSG_CHECKING([pkg-config files for X11 are available]) @@ -475,6 +475,12 @@ if test "$x11_pkgconfig" = no; then AC_PATH_XTRA fi +dnl Try to tell the user that the --x-* options are only used when +dnl pkg-config is not available. This must be right after AC_PATH_XTRA. +m4_divert_once([HELP_BEGIN], +[These options are only used when the X libraries cannot be found by the +pkg-config utility.]) + dnl We need X for xlib and dri, so bomb now if it's not found case "$mesa_driver" in xlib|dri) -- cgit v1.2.3 From 6c44c6d020ce7bc8e65ef69fefa0db4cc6157bed Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Fri, 11 Jul 2008 10:43:29 -0700 Subject: Remove generated pkg-config files on `make clean' --- src/glu/Makefile | 1 + src/glut/glx/Makefile | 1 + src/glut/mini/Makefile | 2 +- src/glw/Makefile | 2 +- src/mesa/Makefile | 1 + src/mesa/drivers/dri/Makefile | 1 + 6 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/glu/Makefile b/src/glu/Makefile index fe19fd1ff34..599b3fc75a3 100644 --- a/src/glu/Makefile +++ b/src/glu/Makefile @@ -32,3 +32,4 @@ clean: -@for dir in $(SUBDIRS) ; do \ (cd $$dir && $(MAKE) clean) ; \ done + -rm -f *.pc diff --git a/src/glut/glx/Makefile b/src/glut/glx/Makefile index 819dfd25022..660ce8e4f52 100644 --- a/src/glut/glx/Makefile +++ b/src/glut/glx/Makefile @@ -119,6 +119,7 @@ clean: -rm -f *.o *~ -rm -f *.lo -rm -f *.la + -rm -f *.pc -rm -rf .libs -rm -f depend depend.bak diff --git a/src/glut/mini/Makefile b/src/glut/mini/Makefile index 6aba2af0a3a..3b5a73e09ae 100644 --- a/src/glut/mini/Makefile +++ b/src/glut/mini/Makefile @@ -93,6 +93,6 @@ install: glut.pc # Remove .o and backup files clean: depend -rm -f depend depend.bak - -rm -f *.o *~ *.o *~ *.so libglut.so.3.7 + -rm -f *.o *~ *.o *~ *.so *.pc libglut.so.3.7 include depend diff --git a/src/glw/Makefile b/src/glw/Makefile index f0dd1acb43b..0c11a9d8385 100644 --- a/src/glw/Makefile +++ b/src/glw/Makefile @@ -44,7 +44,7 @@ install: glw.pc clean: -rm -f depend depend.bak - -rm -f *.o *~ + -rm -f *.o *.pc *~ # Make the library diff --git a/src/mesa/Makefile b/src/mesa/Makefile index 3827ffb3f72..bd3627b5eb5 100644 --- a/src/mesa/Makefile +++ b/src/mesa/Makefile @@ -129,6 +129,7 @@ clean: -rm -f */*/*.o -rm -f depend depend.bak libmesa.a libglapi.a -rm -f drivers/*/*.o + -rm -f *.pc -@cd drivers/dri && $(MAKE) clean -@cd drivers/x11 && $(MAKE) clean -@cd drivers/osmesa && $(MAKE) clean diff --git a/src/mesa/drivers/dri/Makefile b/src/mesa/drivers/dri/Makefile index 96118e01765..3b3fcf11df1 100644 --- a/src/mesa/drivers/dri/Makefile +++ b/src/mesa/drivers/dri/Makefile @@ -53,3 +53,4 @@ clean: fi \ done -rm -f common/*.o + -rm -f *.pc -- cgit v1.2.3 From b0ef353b4696672ecaea4b370b612bbb482880ca Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Fri, 11 Jul 2008 19:23:06 -0400 Subject: R300: update vap_cntl values for NUM_FPUS based on info from hw team --- src/mesa/drivers/dri/r300/r300_ioctl.c | 9 +++++---- src/mesa/drivers/dri/r300/r300_state.c | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.c b/src/mesa/drivers/dri/r300/r300_ioctl.c index 71821a01ea0..bd7f060435f 100644 --- a/src/mesa/drivers/dri/r300/r300_ioctl.c +++ b/src/mesa/drivers/dri/r300/r300_ioctl.c @@ -419,13 +419,14 @@ static void r300EmitClearState(GLcontext * ctx) if (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV515) vap_cntl |= (2 << R300_PVS_NUM_FPUS_SHIFT); else if ((r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV530) || - (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV560)) + (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV560) || + (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV570)) vap_cntl |= (5 << R300_PVS_NUM_FPUS_SHIFT); - else if (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_R420) + else if ((r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV410) || + (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_R420)) vap_cntl |= (6 << R300_PVS_NUM_FPUS_SHIFT); else if ((r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_R520) || - (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_R580) || - (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV570)) + (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_R580)) vap_cntl |= (8 << R300_PVS_NUM_FPUS_SHIFT); else vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT); diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index d7a6962acc8..fbe5f664181 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -1971,13 +1971,14 @@ static void r300VapCntl(r300ContextPtr rmesa, GLuint input_count, if (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV515) rmesa->hw.vap_cntl.cmd[R300_VAP_CNTL_INSTR] |= (2 << R300_PVS_NUM_FPUS_SHIFT); else if ((rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV530) || - (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV560)) + (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV560) || + (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV570)) rmesa->hw.vap_cntl.cmd[R300_VAP_CNTL_INSTR] |= (5 << R300_PVS_NUM_FPUS_SHIFT); - else if (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R420) + else if ((rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV410) || + (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R420)) rmesa->hw.vap_cntl.cmd[R300_VAP_CNTL_INSTR] |= (6 << R300_PVS_NUM_FPUS_SHIFT); else if ((rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R520) || - (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R580) || - (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV570)) + (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R580)) rmesa->hw.vap_cntl.cmd[R300_VAP_CNTL_INSTR] |= (8 << R300_PVS_NUM_FPUS_SHIFT); else rmesa->hw.vap_cntl.cmd[R300_VAP_CNTL_INSTR] |= (4 << R300_PVS_NUM_FPUS_SHIFT); -- cgit v1.2.3 From 7904c9fad4c2cb2a4153258a9e86e530a0330a78 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sun, 6 Jul 2008 16:58:51 +0200 Subject: r500_fragprog: Transform trigonometric functions in first pass --- src/mesa/drivers/dri/r300/r500_fragprog.c | 7 +- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 91 ++------------------------ src/mesa/drivers/dri/r300/radeon_program_alu.c | 52 +++++++++++++++ src/mesa/drivers/dri/r300/radeon_program_alu.h | 5 ++ 4 files changed, 65 insertions(+), 90 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index 1cdb065354b..9bb92d3ba41 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -318,12 +318,13 @@ void r500TranslateFragmentShader(r300ContextPtr r300, insert_WPOS_trailer(&compiler); - struct radeon_program_transformation transformations[2] = { + struct radeon_program_transformation transformations[3] = { { &transform_TEX, &compiler }, - { &radeonTransformALU, 0 } + { &radeonTransformALU, 0 }, + { &radeonTransformTrigScale, 0 } }; radeonLocalTransform(r300->radeon.glCtx, compiler.program, - 2, transformations); + 3, transformations); if (RADEON_DEBUG & DEBUG_PIXEL) { _mesa_printf("Compiler: after all transformations:\n"); diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 8c900941c4d..4f658039536 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -156,17 +156,6 @@ struct r500_pfs_compile_state { #define R500_WRITEMASK_AB 0xC #define R500_WRITEMASK_ARGB 0xF -/* 1/(2pi), needed for quick modulus in trig insts - * Thanks to glisse for pointing out how to do it! */ -static const GLfloat RCP_2PI[] = {0.15915494309189535, - 0.15915494309189535, - 0.15915494309189535, - 0.15915494309189535}; - -static const GLfloat LIT[] = {127.999999, - 127.999999, - 127.999999, - -127.999999}; static const struct prog_dst_register dstreg_template = { .File = PROGRAM_TEMPORARY, @@ -476,12 +465,6 @@ static int emit_alu(struct r500_pfs_compile_state *cs, GLuint rgbop, GLuint alph return _helper_emit_alu(cs, rgbop, alphaop, dst.File, dst.Index, dst.WriteMask); } -static int emit_alu_temp(struct r500_pfs_compile_state *cs, GLuint rgbop, GLuint alphaop, int dst, int writemask) -{ - return _helper_emit_alu(cs, rgbop, alphaop, - PROGRAM_TEMPORARY, dst - cs->compiler->code->temp_reg_offset, writemask); -} - /** * Set an instruction's source 0 (both RGB and ALPHA) to the given hardware index. */ @@ -612,56 +595,6 @@ static int emit_sop(struct r500_pfs_compile_state *cs, } -/** - * Emit trigonometric function COS, SIN, SCS - */ -static void emit_trig(struct r500_pfs_compile_state *cs, struct prog_instruction *fpi) -{ - int ip; - struct prog_dst_register temp = dstreg_template; - temp.Index = get_temp(cs, 0); - temp.WriteMask = WRITEMASK_W; - - struct prog_src_register srcreg; - GLuint constant_swizzle; - - srcreg.File = PROGRAM_CONSTANT; - srcreg.Index = _mesa_add_unnamed_constant(cs->compiler->program->Parameters, - RCP_2PI, 4, &constant_swizzle); - srcreg.Swizzle = constant_swizzle; - - /* temp = Input*(1/2pi) */ - ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, temp); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, srcreg); - set_argA(cs, ip, 0, R500_SWIZ_RGB_ZERO, make_sop_swizzle(fpi->SrcReg[0])); - set_argB(cs, ip, 1, R500_SWIZ_RGB_ZERO, make_alpha_swizzle(srcreg)); - set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); - - /* temp = frac(dst) */ - ip = emit_alu(cs, R500_ALU_RGBA_OP_FRC, R500_ALPHA_OP_FRC, temp); - set_src0_direct(cs, ip, temp.Index); - set_argA(cs, ip, 0, R500_SWIZ_RGB_RGB, SWIZZLE_W); - - /* Dest = trig(temp) */ - if (fpi->Opcode == OPCODE_COS) { - emit_sop(cs, R500_ALPHA_OP_COS, fpi->DstReg, temp.Index, SWIZZLE_W); - } else if (fpi->Opcode == OPCODE_SIN) { - emit_sop(cs, R500_ALPHA_OP_SIN, fpi->DstReg, temp.Index, SWIZZLE_W); - } else if (fpi->Opcode == OPCODE_SCS) { - struct prog_dst_register moddst = fpi->DstReg; - - if (fpi->DstReg.WriteMask & WRITEMASK_X) { - moddst.WriteMask = WRITEMASK_X; - emit_sop(cs, R500_ALPHA_OP_COS, fpi->DstReg, temp.Index, SWIZZLE_W); - } - if (fpi->DstReg.WriteMask & WRITEMASK_Y) { - moddst.WriteMask = WRITEMASK_Y; - emit_sop(cs, R500_ALPHA_OP_SIN, fpi->DstReg, temp.Index, SWIZZLE_W); - } - } -} - static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction *fpi) { PROG_CODE; GLuint src[3], dest = 0; @@ -693,7 +626,8 @@ static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction * set_argC_reg(cs, ip, 0, fpi->SrcReg[0]); break; case OPCODE_COS: - emit_trig(cs, fpi); + src[0] = make_src(cs, fpi->SrcReg[0]); + emit_sop(cs, R500_ALPHA_OP_COS, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); break; case OPCODE_DP3: ip = emit_alu(cs, R500_ALU_RGBA_OP_DP3, R500_ALPHA_OP_DP, fpi->DstReg); @@ -713,21 +647,6 @@ static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction * src[0] = make_src(cs, fpi->SrcReg[0]); emit_sop(cs, R500_ALPHA_OP_EX2, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); break; - case OPCODE_FLR: - dest = get_temp(cs, 0); - ip = emit_alu_temp(cs, R500_ALU_RGBA_OP_FRC, R500_ALPHA_OP_FRC, dest, WRITEMASK_XYZW); - set_src0(cs, ip, fpi->SrcReg[0]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - - ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1_direct(cs, ip, dest); - set_argA_reg(cs, ip, 0, fpi->SrcReg[1]); - set_argB(cs, ip, 0, R500_SWIZ_RGB_ONE, R500_SWIZZLE_ONE); - set_argC(cs, ip, 1, - R500_SWIZ_RGB_RGB|(R500_SWIZ_MOD_NEG<<9), - SWIZZLE_W|(R500_SWIZ_MOD_NEG<<3)); - break; case OPCODE_FRC: ip = emit_alu(cs, R500_ALU_RGBA_OP_FRC, R500_ALPHA_OP_FRC, fpi->DstReg); set_src0(cs, ip, fpi->SrcReg[0]); @@ -787,11 +706,9 @@ static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction * emit_sop(cs, R500_ALPHA_OP_RSQ, fpi->DstReg, src[0], (make_sop_swizzle(fpi->SrcReg[0]) | (R500_SWIZ_MOD_ABS<<3)) & ~(R500_SWIZ_MOD_NEG<<3)); break; - case OPCODE_SCS: - emit_trig(cs, fpi); - break; case OPCODE_SIN: - emit_trig(cs, fpi); + src[0] = make_src(cs, fpi->SrcReg[0]); + emit_sop(cs, R500_ALPHA_OP_SIN, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); break; case OPCODE_KIL: case OPCODE_TEX: diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.c b/src/mesa/drivers/dri/r300/radeon_program_alu.c index fa6a67f0c19..8daa94c7268 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.c @@ -556,3 +556,55 @@ GLboolean radeonTransformTrigSimple(struct radeon_transform_context* t, return GL_TRUE; } + + +/** + * Transform the trigonometric functions COS, SIN, and SCS + * to include pre-scaling by 1/(2*PI) and taking the fractional + * part, so that the input to COS and SIN is always in the range [0,1). + * SCS is replaced by one COS and one SIN instruction. + * + * @warning This transformation implicitly changes the semantics of SIN and COS! + */ +GLboolean radeonTransformTrigScale(struct radeon_transform_context* t, + struct prog_instruction* inst, + void* unused) +{ + if (inst->Opcode != OPCODE_COS && + inst->Opcode != OPCODE_SIN && + inst->Opcode != OPCODE_SCS) + return GL_FALSE; + + static const GLfloat RCP_2PI[] = { 0.15915494309189535 }; + GLuint temp; + GLuint constant; + GLuint constant_swizzle; + + temp = radeonFindFreeTemporary(t); + constant = _mesa_add_unnamed_constant(t->Program->Parameters, RCP_2PI, 1, &constant_swizzle); + + emit2(t->Program, OPCODE_MUL, dstregtmpmask(temp, WRITEMASK_W), + swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), + srcregswz(PROGRAM_CONSTANT, constant, constant_swizzle)); + emit1(t->Program, OPCODE_FRC, dstregtmpmask(temp, WRITEMASK_W), + srcreg(PROGRAM_TEMPORARY, temp)); + + if (inst->Opcode == OPCODE_COS) { + emit1(t->Program, OPCODE_COS, inst->DstReg, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); + } else if (inst->Opcode == OPCODE_SIN) { + emit1(t->Program, OPCODE_SIN, inst->DstReg, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); + } else if (inst->Opcode == OPCODE_SCS) { + struct prog_dst_register moddst = inst->DstReg; + + if (inst->DstReg.WriteMask & WRITEMASK_X) { + moddst.WriteMask = WRITEMASK_X; + emit1(t->Program, OPCODE_COS, moddst, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); + } + if (inst->DstReg.WriteMask & WRITEMASK_Y) { + moddst.WriteMask = WRITEMASK_Y; + emit1(t->Program, OPCODE_SIN, moddst, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); + } + } + + return GL_TRUE; +} diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.h b/src/mesa/drivers/dri/r300/radeon_program_alu.h index 3fe6153fd82..ea9d5bb669c 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.h +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.h @@ -40,4 +40,9 @@ GLboolean radeonTransformTrigSimple( struct prog_instruction*, void*); +GLboolean radeonTransformTrigScale( + struct radeon_transform_context *t, + struct prog_instruction*, + void*); + #endif /* __RADEON_PROGRAM_ALU_H_ */ -- cgit v1.2.3 From d8d086c20b5a43353c4980cf234d8329900585f5 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sun, 6 Jul 2008 19:48:50 +0200 Subject: r500: Add "Not quite SSA" and dead code elimination pass In addition, this pass fixes non-native swizzles. --- src/mesa/drivers/dri/r300/Makefile | 1 + src/mesa/drivers/dri/r300/r500_fragprog.c | 67 +++++- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 28 ++- src/mesa/drivers/dri/r300/radeon_nqssadce.c | 282 +++++++++++++++++++++++++ src/mesa/drivers/dri/r300/radeon_nqssadce.h | 96 +++++++++ src/mesa/shader/program.c | 61 +++++- src/mesa/shader/program.h | 13 +- 7 files changed, 524 insertions(+), 24 deletions(-) create mode 100644 src/mesa/drivers/dri/r300/radeon_nqssadce.c create mode 100644 src/mesa/drivers/dri/r300/radeon_nqssadce.h diff --git a/src/mesa/drivers/dri/r300/Makefile b/src/mesa/drivers/dri/r300/Makefile index d52b2b4c36d..1dc75a30625 100644 --- a/src/mesa/drivers/dri/r300/Makefile +++ b/src/mesa/drivers/dri/r300/Makefile @@ -38,6 +38,7 @@ DRIVER_SOURCES = \ r300_texstate.c \ radeon_program.c \ radeon_program_alu.c \ + radeon_nqssadce.c \ r300_vertprog.c \ r300_fragprog.c \ r300_fragprog_emit.c \ diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index 9bb92d3ba41..c92ea8f5e6d 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -27,6 +27,7 @@ #include "r500_fragprog.h" +#include "radeon_nqssadce.h" #include "radeon_program_alu.h" @@ -250,6 +251,57 @@ static void insert_WPOS_trailer(struct r500_fragment_program_compiler *compiler) } +static void nqssadce_init(struct nqssadce_state* s) +{ + s->Outputs[FRAG_RESULT_COLR].Sourced = WRITEMASK_XYZW; + s->Outputs[FRAG_RESULT_DEPR].Sourced = WRITEMASK_W; +} + +static GLboolean is_native_swizzle(GLuint opcode, struct prog_src_register reg) +{ + GLuint relevant; + int i; + + if (reg.Abs) + return GL_TRUE; + + relevant = 0; + for(i = 0; i < 3; ++i) { + GLuint swz = GET_SWZ(reg.Swizzle, i); + if (swz != SWIZZLE_NIL && swz != SWIZZLE_ZERO) + relevant |= 1 << i; + } + if ((reg.NegateBase & relevant) && ((reg.NegateBase & relevant) != relevant)) + return GL_FALSE; + + return GL_TRUE; +} + +/** + * Implement a non-native swizzle. This function assumes that + * is_native_swizzle returned true. + */ +static void nqssadce_build_swizzle(struct nqssadce_state *s, + struct prog_dst_register dst, struct prog_src_register src) +{ + struct prog_instruction *inst; + + _mesa_insert_instructions(s->Program, s->IP, 2); + inst = s->Program->Instructions + s->IP; + + inst[0].Opcode = OPCODE_MOV; + inst[0].DstReg = dst; + inst[0].DstReg.WriteMask &= src.NegateBase; + inst[0].SrcReg[0] = src; + + inst[1].Opcode = OPCODE_MOV; + inst[1].DstReg = dst; + inst[1].DstReg.WriteMask &= ~src.NegateBase; + inst[1].SrcReg[0] = src; + + s->IP += 2; +} + static GLuint build_dtm(GLuint depthmode) { switch(depthmode) { @@ -327,7 +379,20 @@ void r500TranslateFragmentShader(r300ContextPtr r300, 3, transformations); if (RADEON_DEBUG & DEBUG_PIXEL) { - _mesa_printf("Compiler: after all transformations:\n"); + _mesa_printf("Compiler: after native rewrite:\n"); + _mesa_print_program(compiler.program); + } + + struct radeon_nqssadce_descr nqssadce = { + .Init = &nqssadce_init, + .IsNativeSwizzle = &is_native_swizzle, + .BuildSwizzle = &nqssadce_build_swizzle, + .RewriteDepthOut = GL_TRUE + }; + radeonNqssaDce(r300->radeon.glCtx, compiler.program, &nqssadce); + + if (RADEON_DEBUG & DEBUG_PIXEL) { + _mesa_printf("Compiler: after NqSSA-DCE:\n"); _mesa_print_program(compiler.program); } diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 4f658039536..275911679dc 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -163,23 +163,30 @@ static const struct prog_dst_register dstreg_template = { .WriteMask = WRITEMASK_XYZW }; +static INLINE GLuint fix_hw_swizzle(GLuint swz) +{ + if (swz == 5) swz = 6; + if (swz == SWIZZLE_NIL) swz = 4; + return swz; +} + static INLINE GLuint make_rgb_swizzle(struct prog_src_register src) { GLuint swiz = 0x0; GLuint temp; /* This could be optimized, but it should be plenty fast already. */ int i; + int negatebase = 0; for (i = 0; i < 3; i++) { - temp = GET_SWZ(src.Swizzle, i); - /* Fix SWIZZLE_ONE */ - if (temp == 5) temp++; + temp = GET_SWZ(src.Swizzle, i); + if (temp != SWIZZLE_NIL && GET_BIT(src.NegateBase, i)) + negatebase = 1; + temp = fix_hw_swizzle(temp); swiz |= temp << i*3; } - if (src.Abs) { + if (src.Abs) swiz |= R500_SWIZ_MOD_ABS << 9; - } else if (src.NegateBase & 7) { - ASSERT((src.NegateBase & 7) == 7); + else if (negatebase) swiz |= R500_SWIZ_MOD_NEG << 9; - } if (src.NegateAbs) swiz ^= R500_SWIZ_MOD_NEG << 9; return swiz; @@ -191,8 +198,7 @@ static INLINE GLuint make_rgba_swizzle(GLuint src) { int i; for (i = 0; i < 4; i++) { temp = GET_SWZ(src, i); - /* Fix SWIZZLE_ONE */ - if (temp == 5) temp++; + temp = fix_hw_swizzle(temp); swiz |= temp << i*3; } return swiz; @@ -201,7 +207,7 @@ static INLINE GLuint make_rgba_swizzle(GLuint src) { static INLINE GLuint make_alpha_swizzle(struct prog_src_register src) { GLuint swiz = GET_SWZ(src.Swizzle, 3); - if (swiz == 5) swiz++; + swiz = fix_hw_swizzle(swiz); if (src.Abs) { swiz |= R500_SWIZ_MOD_ABS << 3; @@ -217,7 +223,7 @@ static INLINE GLuint make_alpha_swizzle(struct prog_src_register src) { static INLINE GLuint make_sop_swizzle(struct prog_src_register src) { GLuint swiz = GET_SWZ(src.Swizzle, 0); - if (swiz == 5) swiz++; + swiz = fix_hw_swizzle(swiz); if (src.Abs) { swiz |= R500_SWIZ_MOD_ABS << 3; diff --git a/src/mesa/drivers/dri/r300/radeon_nqssadce.c b/src/mesa/drivers/dri/r300/radeon_nqssadce.c new file mode 100644 index 00000000000..f10ba4004aa --- /dev/null +++ b/src/mesa/drivers/dri/r300/radeon_nqssadce.c @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2008 Nicolai Haehnle. + * + * 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 (including the + * next paragraph) 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 COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS 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. + * + */ + +/** + * @file + * + * "Not-quite SSA" and Dead-Code Elimination. + * + * @note This code uses SWIZZLE_NIL in a source register to indicate that + * the corresponding component is ignored by the corresponding instruction. + */ + +#include "radeon_nqssadce.h" + + +/** + * Return the @ref register_state for the given register (or 0 for untracked + * registers, i.e. constants). + */ +static struct register_state *get_reg_state(struct nqssadce_state* s, GLuint file, GLuint index) +{ + switch(file) { + case PROGRAM_TEMPORARY: return &s->Temps[index]; + case PROGRAM_OUTPUT: return &s->Outputs[index]; + default: return 0; + } +} + + +/** + * Left multiplication of a register with a swizzle + * + * @note Works correctly only for X, Y, Z, W swizzles, not for constant swizzles. + */ +static struct prog_src_register lmul_swizzle(GLuint swizzle, struct prog_src_register srcreg) +{ + struct prog_src_register tmp = srcreg; + int i; + tmp.Swizzle = 0; + tmp.NegateBase = 0; + for(i = 0; i < 4; ++i) { + GLuint swz = GET_SWZ(swizzle, i); + if (swz < 4) { + tmp.Swizzle |= GET_SWZ(srcreg.Swizzle, swz) << (i*3); + tmp.NegateBase |= GET_BIT(srcreg.NegateBase, swz) << i; + } else { + tmp.Swizzle |= swz << (i*3); + } + } + return tmp; +} + + +static struct prog_instruction* track_used_srcreg(struct nqssadce_state* s, + struct prog_instruction *inst, GLint src, GLuint sourced) +{ + int i; + GLuint deswz_source = 0; + + for(i = 0; i < 4; ++i) { + if (GET_BIT(sourced, i)) { + GLuint swz = GET_SWZ(inst->SrcReg[src].Swizzle, i); + deswz_source |= 1 << swz; + } else { + inst->SrcReg[src].Swizzle &= ~(7 << (3*i)); + inst->SrcReg[src].Swizzle |= SWIZZLE_NIL << (3*i); + } + } + + if (!s->Descr->IsNativeSwizzle(inst->Opcode, inst->SrcReg[src])) { + struct prog_dst_register dstreg = inst->DstReg; + dstreg.File = PROGRAM_TEMPORARY; + dstreg.Index = _mesa_find_free_register(s->Program, PROGRAM_TEMPORARY); + dstreg.WriteMask = sourced; + + s->Descr->BuildSwizzle(s, dstreg, inst->SrcReg[src]); + + inst = s->Program->Instructions + s->IP; + inst->SrcReg[src].File = PROGRAM_TEMPORARY; + inst->SrcReg[src].Index = dstreg.Index; + inst->SrcReg[src].Swizzle = 0; + inst->SrcReg[src].NegateBase = 0; + inst->SrcReg[src].Abs = 0; + inst->SrcReg[src].NegateAbs = 0; + for(i = 0; i < 4; ++i) { + if (GET_BIT(sourced, i)) + inst->SrcReg[src].Swizzle |= i << (3*i); + else + inst->SrcReg[src].Swizzle |= SWIZZLE_NIL << (3*i); + } + deswz_source = sourced; + } + + struct register_state *regstate = get_reg_state(s, inst->SrcReg[src].File, inst->SrcReg[src].Index); + if (regstate) + regstate->Sourced |= deswz_source & 0xf; + + return inst; +} + + +static void rewrite_depth_out(struct prog_instruction *inst) +{ + if (inst->DstReg.WriteMask & WRITEMASK_Z) { + inst->DstReg.WriteMask = WRITEMASK_W; + } else { + inst->DstReg.WriteMask = 0; + return; + } + + switch (inst->Opcode) { + case OPCODE_FRC: + case OPCODE_MOV: + inst->SrcReg[0] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[0]); + break; + case OPCODE_ADD: + case OPCODE_MAX: + case OPCODE_MIN: + case OPCODE_MUL: + inst->SrcReg[0] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[0]); + inst->SrcReg[1] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[1]); + break; + case OPCODE_CMP: + case OPCODE_MAD: + inst->SrcReg[0] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[0]); + inst->SrcReg[1] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[1]); + inst->SrcReg[2] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[2]); + break; + default: + // Scalar instructions needn't be reswizzled + break; + } +} + +static void unalias_srcregs(struct prog_instruction *inst, GLuint oldindex, GLuint newindex) +{ + int nsrc = _mesa_num_inst_src_regs(inst->Opcode); + int i; + for(i = 0; i < nsrc; ++i) + if (inst->SrcReg[i].File == PROGRAM_TEMPORARY && inst->SrcReg[i].Index == oldindex) + inst->SrcReg[i].Index = newindex; +} + +static void unalias_temporary(struct nqssadce_state* s, GLuint oldindex) +{ + GLuint newindex = _mesa_find_free_register(s->Program, PROGRAM_TEMPORARY); + int ip; + for(ip = 0; ip < s->IP; ++ip) { + struct prog_instruction* inst = s->Program->Instructions + ip; + if (inst->DstReg.File == PROGRAM_TEMPORARY && inst->DstReg.Index == oldindex) + inst->DstReg.Index = newindex; + unalias_srcregs(inst, oldindex, newindex); + } + unalias_srcregs(s->Program->Instructions + s->IP, oldindex, newindex); +} + + +/** + * Handle one instruction. + */ +static void process_instruction(struct nqssadce_state* s) +{ + struct prog_instruction *inst = s->Program->Instructions + s->IP; + + if (inst->Opcode == OPCODE_END) + return; + + if (inst->Opcode != OPCODE_KIL) { + if (s->Descr->RewriteDepthOut) { + if (inst->DstReg.File == PROGRAM_OUTPUT && inst->DstReg.Index == FRAG_RESULT_DEPR) + rewrite_depth_out(inst); + } + + struct register_state *regstate = get_reg_state(s, inst->DstReg.File, inst->DstReg.Index); + if (!regstate) { + _mesa_problem(s->Ctx, "NqssaDce: bad destination register (%i[%i])\n", + inst->DstReg.File, inst->DstReg.Index); + return; + } + + inst->DstReg.WriteMask &= regstate->Sourced; + regstate->Sourced &= ~inst->DstReg.WriteMask; + + if (inst->DstReg.WriteMask == 0) { + _mesa_delete_instructions(s->Program, s->IP, 1); + return; + } + + if (inst->DstReg.File == PROGRAM_TEMPORARY && !regstate->Sourced) + unalias_temporary(s, inst->DstReg.Index); + } + + /* Attention: Due to swizzle emulation code, the following + * might change the instruction stream under us, so we have + * to be careful with the inst pointer. */ + switch (inst->Opcode) { + case OPCODE_FRC: + case OPCODE_MOV: + inst = track_used_srcreg(s, inst, 0, inst->DstReg.WriteMask); + break; + case OPCODE_ADD: + case OPCODE_MAX: + case OPCODE_MIN: + case OPCODE_MUL: + inst = track_used_srcreg(s, inst, 0, inst->DstReg.WriteMask); + inst = track_used_srcreg(s, inst, 1, inst->DstReg.WriteMask); + break; + case OPCODE_CMP: + case OPCODE_MAD: + inst = track_used_srcreg(s, inst, 0, inst->DstReg.WriteMask); + inst = track_used_srcreg(s, inst, 1, inst->DstReg.WriteMask); + inst = track_used_srcreg(s, inst, 2, inst->DstReg.WriteMask); + break; + case OPCODE_COS: + case OPCODE_EX2: + case OPCODE_LG2: + case OPCODE_RCP: + case OPCODE_RSQ: + case OPCODE_SIN: + inst = track_used_srcreg(s, inst, 0, 0x1); + break; + case OPCODE_DP3: + inst = track_used_srcreg(s, inst, 0, 0x7); + inst = track_used_srcreg(s, inst, 1, 0x7); + break; + case OPCODE_DP4: + inst = track_used_srcreg(s, inst, 0, 0xf); + inst = track_used_srcreg(s, inst, 1, 0xf); + break; + case OPCODE_KIL: + case OPCODE_TEX: + case OPCODE_TXB: + case OPCODE_TXP: + inst = track_used_srcreg(s, inst, 0, 0xf); + break; + default: + _mesa_problem(s->Ctx, "NqssaDce: Unknown opcode %d\n", inst->Opcode); + return; + } +} + + +void radeonNqssaDce(GLcontext *ctx, struct gl_program *p, struct radeon_nqssadce_descr* descr) +{ + struct nqssadce_state s; + + _mesa_bzero(&s, sizeof(s)); + s.Ctx = ctx; + s.Program = p; + s.Descr = descr; + s.Descr->Init(&s); + s.IP = p->NumInstructions; + + while(s.IP > 0) { + s.IP--; + process_instruction(&s); + } +} diff --git a/src/mesa/drivers/dri/r300/radeon_nqssadce.h b/src/mesa/drivers/dri/r300/radeon_nqssadce.h new file mode 100644 index 00000000000..a4f94abcb62 --- /dev/null +++ b/src/mesa/drivers/dri/r300/radeon_nqssadce.h @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2008 Nicolai Haehnle. + * + * 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 (including the + * next paragraph) 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 COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS 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. + * + */ + +#ifndef __RADEON_PROGRAM_NQSSADCE_H_ +#define __RADEON_PROGRAM_NQSSADCE_H_ + +#include "radeon_program.h" + + +struct register_state { + /** + * Bitmask indicating which components of the register are sourced + * by later instructions. + */ + GLuint Sourced : 4; +}; + +/** + * Maintain state such as which registers are used, which registers are + * read from, etc. + */ +struct nqssadce_state { + GLcontext *Ctx; + struct gl_program *Program; + struct radeon_nqssadce_descr *Descr; + + /** + * All instructions after this instruction pointer have been dealt with. + */ + int IP; + + /** + * Which registers are read by subsequent instructions? + */ + struct register_state Temps[MAX_PROGRAM_TEMPS]; + struct register_state Outputs[VERT_RESULT_MAX]; +}; + + +/** + * This structure contains a description of the hardware in-so-far as + * it is required for the NqSSA-DCE pass. + */ +struct radeon_nqssadce_descr { + /** + * Fill in which outputs + */ + void (*Init)(struct nqssadce_state *); + + /** + * Check whether the given swizzle, absolute and negate combination + * can be implemented natively by the hardware for this opcode. + */ + GLboolean (*IsNativeSwizzle)(GLuint opcode, struct prog_src_register reg); + + /** + * Emit (at the current IP) the instruction MOV dst, src; + * The transformation will work recursively on the emitted instruction(s). + */ + void (*BuildSwizzle)(struct nqssadce_state*, struct prog_dst_register dst, struct prog_src_register src); + + /** + * Rewrite instructions that write to DEPR.z to write to DEPR.w + * instead (rewriting is done *before* the WriteMask test). + */ + GLboolean RewriteDepthOut; + void *Data; +}; + +void radeonNqssaDce(GLcontext *ctx, struct gl_program *p, struct radeon_nqssadce_descr* descr); + +#endif /* __RADEON_PROGRAM_NQSSADCE_H_ */ diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c index 376d7ee60d4..a80e6e91541 100644 --- a/src/mesa/shader/program.c +++ b/src/mesa/shader/program.c @@ -112,7 +112,7 @@ _mesa_free_program_data(GLcontext *ctx) /** * Update the default program objects in the given context to reference those - * specified in the shared state and release those referencing the old + * specified in the shared state and release those referencing the old * shared state. */ void @@ -238,7 +238,7 @@ struct gl_program * _mesa_init_fragment_program( GLcontext *ctx, struct gl_fragment_program *prog, GLenum target, GLuint id) { - if (prog) + if (prog) return _mesa_init_program_struct( ctx, &prog->Base, target, id ); else return NULL; @@ -252,7 +252,7 @@ struct gl_program * _mesa_init_vertex_program( GLcontext *ctx, struct gl_vertex_program *prog, GLenum target, GLuint id) { - if (prog) + if (prog) return _mesa_init_program_struct( ctx, &prog->Base, target, id ); else return NULL; @@ -265,7 +265,7 @@ _mesa_init_vertex_program( GLcontext *ctx, struct gl_vertex_program *prog, * ctx->Driver.NewProgram. May be overridden (ie. replaced) by a * device driver function to implement OO deriviation with additional * types not understood by this function. - * + * * \param ctx context * \param id program id/number * \param target program target/type @@ -309,7 +309,7 @@ _mesa_delete_program(GLcontext *ctx, struct gl_program *prog) if (prog == &_mesa_DummyProgram) return; - + if (prog->String) _mesa_free(prog->String); @@ -382,7 +382,7 @@ _mesa_reference_program(GLcontext *ctx, deleteFlag = ((*ptr)->RefCount == 0); /*_glthread_UNLOCK_MUTEX((*ptr)->Mutex);*/ - + if (deleteFlag) { ASSERT(ctx); ctx->Driver.DeleteProgram(ctx, *ptr); @@ -541,6 +541,53 @@ _mesa_insert_instructions(struct gl_program *prog, GLuint start, GLuint count) } +/** + * Delete 'count' instructions at 'start' in the given program. + * Adjust branch targets accordingly. + */ +GLboolean +_mesa_delete_instructions(struct gl_program *prog, GLuint start, GLuint count) +{ + const GLuint origLen = prog->NumInstructions; + const GLuint newLen = origLen - count; + struct prog_instruction *newInst; + GLuint i; + + /* adjust branches */ + for (i = 0; i < prog->NumInstructions; i++) { + struct prog_instruction *inst = prog->Instructions + i; + if (inst->BranchTarget > 0) { + if (inst->BranchTarget >= start) { + inst->BranchTarget -= count; + } + } + } + + /* Alloc storage for new instructions */ + newInst = _mesa_alloc_instructions(newLen); + if (!newInst) { + return GL_FALSE; + } + + /* Copy 'start' instructions into new instruction buffer */ + _mesa_copy_instructions(newInst, prog->Instructions, start); + + /* Copy the remaining/tail instructions to new inst buffer */ + _mesa_copy_instructions(newInst + start, + prog->Instructions + start + count, + newLen - start); + + /* free old instructions */ + _mesa_free_instructions(prog->Instructions, origLen); + + /* install new instructions */ + prog->Instructions = newInst; + prog->NumInstructions = newLen; + + return GL_TRUE; +} + + /** * Search instructions for registers that match (oldFile, oldIndex), * replacing them with (newFile, newIndex). @@ -844,7 +891,7 @@ _mesa_BindProgram(GLenum target, GLuint id) * \note Not compiled into display lists. * \note Called by both glDeleteProgramsNV and glDeleteProgramsARB. */ -void GLAPIENTRY +void GLAPIENTRY _mesa_DeletePrograms(GLsizei n, const GLuint *ids) { GLint i; diff --git a/src/mesa/shader/program.h b/src/mesa/shader/program.h index f1a69a2c016..48fe06ab7f3 100644 --- a/src/mesa/shader/program.h +++ b/src/mesa/shader/program.h @@ -67,13 +67,13 @@ _mesa_find_line_column(const GLubyte *string, const GLubyte *pos, GLint *line, GLint *col); -extern struct gl_program * -_mesa_init_vertex_program(GLcontext *ctx, - struct gl_vertex_program *prog, +extern struct gl_program * +_mesa_init_vertex_program(GLcontext *ctx, + struct gl_vertex_program *prog, GLenum target, GLuint id); -extern struct gl_program * -_mesa_init_fragment_program(GLcontext *ctx, +extern struct gl_program * +_mesa_init_fragment_program(GLcontext *ctx, struct gl_fragment_program *prog, GLenum target, GLuint id); @@ -115,6 +115,9 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog); extern GLboolean _mesa_insert_instructions(struct gl_program *prog, GLuint start, GLuint count); +extern GLboolean +_mesa_delete_instructions(struct gl_program *prog, GLuint start, GLuint count); + extern struct gl_program * _mesa_combine_programs(GLcontext *ctx, const struct gl_program *progA, -- cgit v1.2.3 From b6765c34993b08bba4acf20738c8938413ed4daf Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 12 Jul 2008 01:14:35 +0200 Subject: r500_fragprog: Major refactoring of final emit Use an abstracted instruction scheduling and register allocation algorithm that we will be able to share with r300_fragprog. Unlike the original emit code, this code tries to pair instructions that only use the RGB part of the ALU with instructions that only use the alpha part. However, the pairing algorithm still has some shortcomings; for example, it doesn't generate optimal code for the emulation of LIT. --- src/mesa/drivers/dri/r300/Makefile | 1 + src/mesa/drivers/dri/r300/r300_context.h | 3 - src/mesa/drivers/dri/r300/r300_reg.h | 1 + src/mesa/drivers/dri/r300/r500_fragprog.c | 8 +- src/mesa/drivers/dri/r300/r500_fragprog_emit.c | 1002 +++++------------------ src/mesa/drivers/dri/r300/radeon_program.h | 4 + src/mesa/drivers/dri/r300/radeon_program_pair.c | 970 ++++++++++++++++++++++ src/mesa/drivers/dri/r300/radeon_program_pair.h | 126 +++ 8 files changed, 1290 insertions(+), 825 deletions(-) create mode 100644 src/mesa/drivers/dri/r300/radeon_program_pair.c create mode 100644 src/mesa/drivers/dri/r300/radeon_program_pair.h diff --git a/src/mesa/drivers/dri/r300/Makefile b/src/mesa/drivers/dri/r300/Makefile index 1dc75a30625..9baa1e71312 100644 --- a/src/mesa/drivers/dri/r300/Makefile +++ b/src/mesa/drivers/dri/r300/Makefile @@ -38,6 +38,7 @@ DRIVER_SOURCES = \ r300_texstate.c \ radeon_program.c \ radeon_program_alu.c \ + radeon_program_pair.c \ radeon_nqssadce.c \ r300_vertprog.c \ r300_fragprog.c \ diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h index a69beba9a7b..8e9c5cee5f3 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -777,9 +777,6 @@ struct r500_fragment_program_code { GLuint inst4; GLuint inst5; } inst[512]; - /* TODO: This is magic! */ - - int temp_reg_offset; int inst_offset; int inst_end; diff --git a/src/mesa/drivers/dri/r300/r300_reg.h b/src/mesa/drivers/dri/r300/r300_reg.h index cd232c5b7b2..ec2b58377c5 100644 --- a/src/mesa/drivers/dri/r300/r300_reg.h +++ b/src/mesa/drivers/dri/r300/r300_reg.h @@ -2921,6 +2921,7 @@ enum { # define R500_RGB_SRCP_OP_RGB1_PLUS_RGB0 (2 << 30) # define R500_RGB_SRCP_OP_1_MINUS_RGB0 (3 << 30) #define R500_US_CMN_INST_0 0xb800 +# define R500_INST_TYPE_MASK (3 << 0) # define R500_INST_TYPE_ALU (0 << 0) # define R500_INST_TYPE_OUT (1 << 0) # define R500_INST_TYPE_FC (2 << 0) diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index c92ea8f5e6d..7b18efa69d6 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -408,12 +408,10 @@ void r500TranslateFragmentShader(r300ContextPtr r300, r300UpdateStateParameters(r300->radeon.glCtx, _NEW_PROGRAM); if (RADEON_DEBUG & DEBUG_PIXEL) { - fprintf(stderr, "Mesa program:\n"); - fprintf(stderr, "-------------\n"); - _mesa_print_program(&fp->mesa_program.Base); - fflush(stdout); - if (fp->translated) + if (fp->translated) { + _mesa_printf("Machine-readable code:\n"); dump_program(&fp->code); + } } } diff --git a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c index 275911679dc..b6f52474e26 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog_emit.c @@ -43,913 +43,281 @@ * */ -#include "glheader.h" -#include "macros.h" -#include "enums.h" -#include "shader/prog_instruction.h" -#include "shader/prog_parameter.h" -#include "shader/prog_print.h" - -#include "r300_context.h" #include "r500_fragprog.h" -#include "r300_reg.h" -#include "r300_state.h" -/* Mapping Mesa registers to R500 temporaries */ -struct reg_acc { - int reg; /* Assigned hw temp */ - unsigned int refcount; /* Number of uses by mesa program */ -}; - -/** - * Describe the current lifetime information for an R300 temporary - */ -struct reg_lifetime { - /* Index of the first slot where this register is free in the sense - that it can be used as a new destination register. - This is -1 if the register has been assigned to a Mesa register - and the last access to the register has not yet been emitted */ - int free; - - /* Index of the first slot where this register is currently reserved. - This is used to stop e.g. a scalar operation from being moved - before the allocation time of a register that was first allocated - for a vector operation. */ - int reserved; - - /* Index of the first slot in which the register can be used as a - source without losing the value that is written by the last - emitted instruction that writes to the register */ - int vector_valid; - int scalar_valid; - - /* Index to the slot where the register was last read. - This is also the first slot in which the register may be written again */ - int vector_lastread; - int scalar_lastread; -}; - -/** - * Store information during compilation of fragment programs. - */ -struct r500_pfs_compile_state { - struct r500_fragment_program_compiler *compiler; +#include "radeon_program_pair.h" - /* number of ALU slots used so far */ - int nrslots; - /* Used to map Mesa's inputs/temps onto hardware temps */ - int temp_in_use; - struct reg_acc inputs[32]; /* don't actually need 32... */ -}; +#define PROG_CODE \ + struct r500_fragment_program_compiler *c = (struct r500_fragment_program_compiler*)data; \ + struct r500_fragment_program_code *code = c->code -/* - * Useful macros and values - */ -#define ERROR(fmt, args...) do { \ +#define error(fmt, args...) do { \ fprintf(stderr, "%s::%s(): " fmt "\n", \ __FILE__, __FUNCTION__, ##args); \ - cs->compiler->fp->error = GL_TRUE; \ } while(0) -#define PROG_CODE struct r500_fragment_program_code *code = cs->compiler->code - -#define R500_US_NUM_TEMP_REGS 128 -#define R500_US_NUM_CONST_REGS 256 - -/* "Register" flags */ -#define REG_CONSTANT (1 << 8) -#define REG_SRC_REL (1 << 9) -#define REG_DEST_REL (1 << 7) - -/* Swizzle tools */ -#define R500_SWIZZLE_ZERO 4 -#define R500_SWIZZLE_HALF 5 -#define R500_SWIZZLE_ONE 6 -#define R500_SWIZ_RGB_ZERO ((4 << 0) | (4 << 3) | (4 << 6)) -#define R500_SWIZ_RGB_ONE ((6 << 0) | (6 << 3) | (6 << 6)) -#define R500_SWIZ_RGB_RGB ((0 << 0) | (1 << 3) | (2 << 6)) -#define R500_SWIZ_MOD_NEG 1 -#define R500_SWIZ_MOD_ABS 2 -#define R500_SWIZ_MOD_NEG_ABS 3 -/* Swizzles for inst2 */ -#define MAKE_SWIZ_TEX_STRQ(x) (x << 8) -#define MAKE_SWIZ_TEX_RGBA(x) (x << 24) -/* Swizzles for inst3 */ -#define MAKE_SWIZ_RGB_A(x) (x << 2) -#define MAKE_SWIZ_RGB_B(x) (x << 15) -/* Swizzles for inst4 */ -#define MAKE_SWIZ_ALPHA_A(x) (x << 14) -#define MAKE_SWIZ_ALPHA_B(x) (x << 21) -/* Swizzle for inst5 */ -#define MAKE_SWIZ_RGBA_C(x) (x << 14) -#define MAKE_SWIZ_ALPHA_C(x) (x << 27) - -/* Writemasks */ -#define R500_WRITEMASK_G 0x2 -#define R500_WRITEMASK_B 0x4 -#define R500_WRITEMASK_RGB 0x7 -#define R500_WRITEMASK_A 0x8 -#define R500_WRITEMASK_AR 0x9 -#define R500_WRITEMASK_AG 0xA -#define R500_WRITEMASK_ARG 0xB -#define R500_WRITEMASK_AB 0xC -#define R500_WRITEMASK_ARGB 0xF - - -static const struct prog_dst_register dstreg_template = { - .File = PROGRAM_TEMPORARY, - .Index = 0, - .WriteMask = WRITEMASK_XYZW -}; -static INLINE GLuint fix_hw_swizzle(GLuint swz) -{ - if (swz == 5) swz = 6; - if (swz == SWIZZLE_NIL) swz = 4; - return swz; -} - -static INLINE GLuint make_rgb_swizzle(struct prog_src_register src) { - GLuint swiz = 0x0; - GLuint temp; - /* This could be optimized, but it should be plenty fast already. */ - int i; - int negatebase = 0; - for (i = 0; i < 3; i++) { - temp = GET_SWZ(src.Swizzle, i); - if (temp != SWIZZLE_NIL && GET_BIT(src.NegateBase, i)) - negatebase = 1; - temp = fix_hw_swizzle(temp); - swiz |= temp << i*3; - } - if (src.Abs) - swiz |= R500_SWIZ_MOD_ABS << 9; - else if (negatebase) - swiz |= R500_SWIZ_MOD_NEG << 9; - if (src.NegateAbs) - swiz ^= R500_SWIZ_MOD_NEG << 9; - return swiz; -} - -static INLINE GLuint make_rgba_swizzle(GLuint src) { - GLuint swiz = 0x0; - GLuint temp; - int i; - for (i = 0; i < 4; i++) { - temp = GET_SWZ(src, i); - temp = fix_hw_swizzle(temp); - swiz |= temp << i*3; - } - return swiz; -} - -static INLINE GLuint make_alpha_swizzle(struct prog_src_register src) { - GLuint swiz = GET_SWZ(src.Swizzle, 3); - - swiz = fix_hw_swizzle(swiz); - - if (src.Abs) { - swiz |= R500_SWIZ_MOD_ABS << 3; - } else if (src.NegateBase & 8) { - swiz |= R500_SWIZ_MOD_NEG << 3; - } - if (src.NegateAbs) - swiz ^= R500_SWIZ_MOD_NEG << 3; - - return swiz; -} - -static INLINE GLuint make_sop_swizzle(struct prog_src_register src) { - GLuint swiz = GET_SWZ(src.Swizzle, 0); - - swiz = fix_hw_swizzle(swiz); - - if (src.Abs) { - swiz |= R500_SWIZ_MOD_ABS << 3; - } else if (src.NegateBase & 1) { - swiz |= R500_SWIZ_MOD_NEG << 3; - } - if (src.NegateAbs) - swiz ^= R500_SWIZ_MOD_NEG << 3; - - return swiz; -} - -static INLINE GLuint make_strq_swizzle(struct prog_src_register src) { - GLuint swiz = 0x0, temp = 0x0; - int i; - for (i = 0; i < 4; i++) { - temp = GET_SWZ(src.Swizzle, i) & 0x3; - swiz |= temp << i*2; - } - return swiz; -} - -static int get_temp(struct r500_pfs_compile_state *cs, int slot) { - - PROG_CODE; - - int r = code->temp_reg_offset + cs->temp_in_use + slot; - - if (r > R500_US_NUM_TEMP_REGS) { - ERROR("Too many temporary registers requested, can't compile!\n"); - } - - return r; -} - -/* Borrowed verbatim from r300_fragprog since it hasn't changed. */ -static GLuint emit_const4fv(struct r500_pfs_compile_state *cs, - struct prog_src_register srcreg) +/** + * Callback to register hardware constants. + */ +static GLboolean emit_const(void *data, GLuint file, GLuint idx, GLuint *hwindex) { PROG_CODE; - GLuint reg = 0x0; - int index; - - for (index = 0; index < code->const_nr; ++index) { - if (code->constant[index].File == srcreg.File && - code->constant[index].Index == srcreg.Index) + for (*hwindex = 0; *hwindex < code->const_nr; ++*hwindex) { + if (code->constant[*hwindex].File == file && + code->constant[*hwindex].Index == idx) break; } - if (index >= code->const_nr) { - if (index >= R500_US_NUM_CONST_REGS) { - ERROR("Out of hw constants!\n"); - return reg; + if (*hwindex >= code->const_nr) { + if (*hwindex >= PFS_NUM_CONST_REGS) { + error("Out of hw constants!\n"); + return GL_FALSE; } code->const_nr++; - code->constant[index] = srcreg; - } - - reg = index | REG_CONSTANT; - return reg; -} - -static GLuint make_src(struct r500_pfs_compile_state *cs, struct prog_src_register src) { - PROG_CODE; - GLuint reg; - switch (src.File) { - case PROGRAM_TEMPORARY: - reg = src.Index + code->temp_reg_offset; - break; - case PROGRAM_INPUT: - reg = cs->inputs[src.Index].reg; - break; - case PROGRAM_LOCAL_PARAM: - case PROGRAM_ENV_PARAM: - case PROGRAM_STATE_VAR: - case PROGRAM_NAMED_PARAM: - case PROGRAM_CONSTANT: - reg = emit_const4fv(cs, src); - break; - case PROGRAM_BUILTIN: - reg = 0x0; - break; - default: - ERROR("Can't handle src.File %x\n", src.File); - reg = 0x0; - break; + code->constant[*hwindex].File = file; + code->constant[*hwindex].Index = idx; } - return reg; -} -static GLuint make_dest(struct r500_pfs_compile_state *cs, struct prog_dst_register dest) { - PROG_CODE; - GLuint reg; - switch (dest.File) { - case PROGRAM_TEMPORARY: - reg = dest.Index + code->temp_reg_offset; - break; - case PROGRAM_OUTPUT: - /* Eventually we may need to handle multiple - * rendering targets... */ - reg = dest.Index; - break; - case PROGRAM_BUILTIN: - reg = 0x0; - break; - default: - ERROR("Can't handle dest.File %x\n", dest.File); - reg = 0x0; - break; - } - return reg; -} - -static int emit_slot(struct r500_pfs_compile_state *cs) -{ - if (cs->nrslots >= 512) { - ERROR("Too many instructions"); - cs->nrslots = 1; - return 0; - } - return cs->nrslots++; + return GL_TRUE; } -static int emit_tex(struct r500_pfs_compile_state *cs, - struct prog_instruction *fpi, int dest) +static GLuint translate_rgb_op(GLuint opcode) { - PROG_CODE; - int hwsrc, hwdest; - GLuint mask; - int counter = emit_slot(cs); - - mask = fpi->DstReg.WriteMask << 11; - hwsrc = make_src(cs, fpi->SrcReg[0]); - - if (fpi->DstReg.File == PROGRAM_OUTPUT) { - hwdest = get_temp(cs, 0); - } else { - hwdest = dest; - } - - code->inst[counter].inst0 = R500_INST_TYPE_TEX | mask - | R500_INST_TEX_SEM_WAIT; - - code->inst[counter].inst1 = R500_TEX_ID(fpi->TexSrcUnit) - | R500_TEX_SEM_ACQUIRE | R500_TEX_IGNORE_UNCOVERED; - - if (fpi->TexSrcTarget == TEXTURE_RECT_INDEX) - code->inst[counter].inst1 |= R500_TEX_UNSCALED; - - switch (fpi->Opcode) { - case OPCODE_KIL: - code->inst[counter].inst1 |= R500_TEX_INST_TEXKILL; - break; - case OPCODE_TEX: - code->inst[counter].inst1 |= R500_TEX_INST_LD; - break; - case OPCODE_TXB: - code->inst[counter].inst1 |= R500_TEX_INST_LODBIAS; - break; - case OPCODE_TXP: - code->inst[counter].inst1 |= R500_TEX_INST_PROJ; - break; + switch(opcode) { + case OPCODE_CMP: return R500_ALU_RGBA_OP_CMP; + case OPCODE_DP3: return R500_ALU_RGBA_OP_DP3; + case OPCODE_DP4: return R500_ALU_RGBA_OP_DP4; + case OPCODE_FRC: return R500_ALU_RGBA_OP_FRC; default: - ERROR("emit_tex can't handle opcode %x\n", fpi->Opcode); + error("translate_rgb_op(%d): unknown opcode\n", opcode); + /* fall through */ + case OPCODE_NOP: + /* fall through */ + case OPCODE_MAD: return R500_ALU_RGBA_OP_MAD; + case OPCODE_MAX: return R500_ALU_RGBA_OP_MAX; + case OPCODE_MIN: return R500_ALU_RGBA_OP_MIN; + case OPCODE_REPL_ALPHA: return R500_ALU_RGBA_OP_SOP; } - - code->inst[counter].inst2 = R500_TEX_SRC_ADDR(hwsrc) - | MAKE_SWIZ_TEX_STRQ(make_strq_swizzle(fpi->SrcReg[0])) - /* | R500_TEX_SRC_S_SWIZ_R | R500_TEX_SRC_T_SWIZ_G - | R500_TEX_SRC_R_SWIZ_B | R500_TEX_SRC_Q_SWIZ_A */ - | R500_TEX_DST_ADDR(hwdest) - | R500_TEX_DST_R_SWIZ_R | R500_TEX_DST_G_SWIZ_G - | R500_TEX_DST_B_SWIZ_B | R500_TEX_DST_A_SWIZ_A; - - code->inst[counter].inst3 = 0x0; - code->inst[counter].inst4 = 0x0; - code->inst[counter].inst5 = 0x0; - - if (fpi->DstReg.File == PROGRAM_OUTPUT) { - counter++; - code->inst[counter].inst0 = R500_INST_TYPE_OUT - | R500_INST_TEX_SEM_WAIT | (mask << 4); - code->inst[counter].inst1 = R500_RGB_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst2 = R500_ALPHA_ADDR0(get_temp(cs, 0)); - code->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0 - | MAKE_SWIZ_RGB_A(R500_SWIZ_RGB_RGB) - | R500_ALU_RGB_SEL_B_SRC0 - | MAKE_SWIZ_RGB_B(R500_SWIZ_RGB_RGB) - | R500_ALU_RGB_OMOD_DISABLE; - code->inst[counter].inst4 = R500_ALPHA_OP_CMP - | R500_ALPHA_ADDRD(dest) - | R500_ALPHA_SEL_A_SRC0 | MAKE_SWIZ_ALPHA_A(R500_ALPHA_SWIZ_A_A) - | R500_ALPHA_SEL_B_SRC0 | MAKE_SWIZ_ALPHA_B(R500_ALPHA_SWIZ_A_A) - | R500_ALPHA_OMOD_DISABLE; - code->inst[counter].inst5 = R500_ALU_RGBA_OP_CMP - | R500_ALU_RGBA_ADDRD(dest) - | MAKE_SWIZ_RGBA_C(R500_SWIZ_RGB_ZERO) - | MAKE_SWIZ_ALPHA_C(R500_SWIZZLE_ZERO); - } - - return counter; } -/* Do not call directly */ -static int _helper_emit_alu(struct r500_pfs_compile_state *cs, GLuint rgbop, GLuint alphaop, - int File, int Index, int WriteMask) +static GLuint translate_alpha_op(GLuint opcode) { - PROG_CODE; - int counter = emit_slot(cs); - - code->inst[counter].inst4 = alphaop; - code->inst[counter].inst5 = rgbop; - - if (File == PROGRAM_OUTPUT) { - code->inst[counter].inst0 = R500_INST_TYPE_OUT; - - if (Index == FRAG_RESULT_COLR) { - code->inst[counter].inst0 |= WriteMask << 15; - } else if (Index == FRAG_RESULT_DEPR) { - code->inst[counter].inst4 |= R500_ALPHA_W_OMASK; - cs->compiler->fp->writes_depth = GL_TRUE; - } - } else { - int dest = Index + code->temp_reg_offset; - - code->inst[counter].inst0 = R500_INST_TYPE_ALU - | (WriteMask << 11); - code->inst[counter].inst4 |= R500_ALPHA_ADDRD(dest); - code->inst[counter].inst5 |= R500_ALU_RGBA_ADDRD(dest); + switch(opcode) { + case OPCODE_CMP: return R500_ALPHA_OP_CMP; + case OPCODE_COS: return R500_ALPHA_OP_COS; + case OPCODE_DP3: return R500_ALPHA_OP_DP; + case OPCODE_DP4: return R500_ALPHA_OP_DP; + case OPCODE_EX2: return R500_ALPHA_OP_EX2; + case OPCODE_FRC: return R500_ALPHA_OP_FRC; + case OPCODE_LG2: return R500_ALPHA_OP_LN2; + default: + error("translate_alpha_op(%d): unknown opcode\n", opcode); + /* fall through */ + case OPCODE_NOP: + /* fall through */ + case OPCODE_MAD: return R500_ALPHA_OP_MAD; + case OPCODE_MAX: return R500_ALPHA_OP_MAX; + case OPCODE_MIN: return R500_ALPHA_OP_MIN; + case OPCODE_RCP: return R500_ALPHA_OP_RCP; + case OPCODE_RSQ: return R500_ALPHA_OP_RSQ; + case OPCODE_SIN: return R500_ALPHA_OP_SIN; } - - code->inst[counter].inst0 |= R500_INST_TEX_SEM_WAIT; - - return counter; } -/** - * Prepare an ALU slot with the given RGB operation, ALPHA operation, and - * destination register. - */ -static int emit_alu(struct r500_pfs_compile_state *cs, GLuint rgbop, GLuint alphaop, struct prog_dst_register dst) -{ - return _helper_emit_alu(cs, rgbop, alphaop, dst.File, dst.Index, dst.WriteMask); -} - -/** - * Set an instruction's source 0 (both RGB and ALPHA) to the given hardware index. - */ -static void set_src0_direct(struct r500_pfs_compile_state *cs, int ip, GLuint src) +static GLuint fix_hw_swizzle(GLuint swz) { - PROG_CODE; - code->inst[ip].inst1 |= R500_RGB_ADDR0(src); - code->inst[ip].inst2 |= R500_ALPHA_ADDR0(src); + if (swz == 5) swz = 6; + if (swz == SWIZZLE_NIL) swz = 4; + return swz; } -/** - * Set an instruction's source 1 (both RGB and ALPHA) to the given hardware index. - */ -static void set_src1_direct(struct r500_pfs_compile_state *cs, int ip, GLuint src) +static GLuint translate_arg_rgb(struct radeon_pair_instruction *inst, int arg) { - PROG_CODE; - code->inst[ip].inst1 |= R500_RGB_ADDR1(src); - code->inst[ip].inst2 |= R500_ALPHA_ADDR1(src); -} + GLuint t = inst->RGB.Arg[arg].Source; + int comp; + t |= inst->RGB.Arg[arg].Negate << 11; + t |= inst->RGB.Arg[arg].Abs << 12; -/** - * Set an instruction's source 2 (both RGB and ALPHA) to the given hardware index. - */ -static void set_src2_direct(struct r500_pfs_compile_state *cs, int ip, GLuint src) -{ - PROG_CODE; - code->inst[ip].inst1 |= R500_RGB_ADDR2(src); - code->inst[ip].inst2 |= R500_ALPHA_ADDR2(src); -} + for(comp = 0; comp < 3; ++comp) + t |= fix_hw_swizzle(GET_SWZ(inst->RGB.Arg[arg].Swizzle, comp)) << (3*comp + 2); -/** - * Set an instruction's source 0 (both RGB and ALPHA) according to the given source register. - */ -static void set_src0(struct r500_pfs_compile_state *cs, int ip, struct prog_src_register srcreg) -{ - set_src0_direct(cs, ip, make_src(cs, srcreg)); + return t; } -/** - * Set an instruction's source 1 (both RGB and ALPHA) according to the given source register. - */ -static void set_src1(struct r500_pfs_compile_state *cs, int ip, struct prog_src_register srcreg) +static GLuint translate_arg_alpha(struct radeon_pair_instruction *inst, int i) { - set_src1_direct(cs, ip, make_src(cs, srcreg)); + GLuint t = inst->Alpha.Arg[i].Source; + t |= fix_hw_swizzle(inst->Alpha.Arg[i].Swizzle) << 2; + t |= inst->Alpha.Arg[i].Negate << 5; + t |= inst->Alpha.Arg[i].Abs << 6; + return t; } -/** - * Set an instruction's source 2 (both RGB and ALPHA) according to the given source register. - */ -static void set_src2(struct r500_pfs_compile_state *cs, int ip, struct prog_src_register srcreg) +static void use_temporary(struct r500_fragment_program_code* code, GLuint index) { - set_src2_direct(cs, ip, make_src(cs, srcreg)); + if (index > code->max_temp_idx) + code->max_temp_idx = index; } -/** - * Set an instruction's argument A (both RGB and ALPHA) from the given source, - * taking swizzles+neg+abs as specified (see also _reg version below). - */ -static void set_argA(struct r500_pfs_compile_state *cs, int ip, int source, GLuint swizRGB, GLuint swizA) +static GLuint use_source(struct r500_fragment_program_code* code, struct radeon_pair_instruction_source src) { - PROG_CODE; - code->inst[ip].inst3 |= (source << R500_ALU_RGB_SEL_A_SHIFT) | MAKE_SWIZ_RGB_A(swizRGB); - code->inst[ip].inst4 |= (source << R500_ALPHA_SEL_A_SHIFT) | MAKE_SWIZ_ALPHA_A(swizA); + if (!src.Constant) + use_temporary(code, src.Index); + return src.Index | src.Constant << 8; } -/** - * Set an instruction's argument B (both RGB and ALPHA) from the given source, - * taking swizzles+neg+abs as specified (see also _reg version below). - */ -static void set_argB(struct r500_pfs_compile_state *cs, int ip, int source, GLuint swizRGB, GLuint swizA) -{ - PROG_CODE; - code->inst[ip].inst3 |= (source << R500_ALU_RGB_SEL_B_SHIFT) | MAKE_SWIZ_RGB_B(swizRGB); - code->inst[ip].inst4 |= (source << R500_ALPHA_SEL_B_SHIFT) | MAKE_SWIZ_ALPHA_B(swizA); -} /** - * Set an instruction's argument C (both RGB and ALPHA) from the given source, - * taking swizzles+neg+abs as specified (see also _reg version below). + * Emit a paired ALU instruction. */ -static void set_argC(struct r500_pfs_compile_state *cs, int ip, int source, GLuint swizRGB, GLuint swizA) +static GLboolean emit_paired(void *data, struct radeon_pair_instruction *inst) { PROG_CODE; - code->inst[ip].inst5 |= - (source << R500_ALU_RGBA_SEL_C_SHIFT) | - MAKE_SWIZ_RGBA_C(swizRGB) | - (source << R500_ALU_RGBA_ALPHA_SEL_C_SHIFT) | - MAKE_SWIZ_ALPHA_C(swizA); -} -/** - * Set an instruction's argument A (both RGB and ALPHA) from the given source, - * taking swizzles, negation and absolute value from the given source register. - */ -static void set_argA_reg(struct r500_pfs_compile_state *cs, int ip, int source, struct prog_src_register srcreg) -{ - set_argA(cs, ip, source, make_rgb_swizzle(srcreg), make_alpha_swizzle(srcreg)); -} - -/** - * Set an instruction's argument B (both RGB and ALPHA) from the given source, - * taking swizzles, negation and absolute value from the given source register. - */ -static void set_argB_reg(struct r500_pfs_compile_state *cs, int ip, int source, struct prog_src_register srcreg) -{ - set_argB(cs, ip, source, make_rgb_swizzle(srcreg), make_alpha_swizzle(srcreg)); -} - -/** - * Set an instruction's argument C (both RGB and ALPHA) from the given source, - * taking swizzles, negation and absolute value from the given source register. - */ -static void set_argC_reg(struct r500_pfs_compile_state *cs, int ip, int source, struct prog_src_register srcreg) -{ - set_argC(cs, ip, source, make_rgb_swizzle(srcreg), make_alpha_swizzle(srcreg)); -} - -/** - * Emit a special scalar operation. - */ -static int emit_sop(struct r500_pfs_compile_state *cs, - int opcode, struct prog_dst_register dstreg, GLuint src, GLuint swiz) -{ - int ip = emit_alu(cs, R500_ALU_RGBA_OP_SOP, opcode, dstreg); - set_src0_direct(cs, ip, src); - set_argA(cs, ip, 0, R500_SWIZ_RGB_ZERO, swiz); - return ip; -} + if (code->inst_end >= 511) { + error("emit_alu: Too many instructions"); + return GL_FALSE; + } + int ip = ++code->inst_end; -static void do_inst(struct r500_pfs_compile_state *cs, struct prog_instruction *fpi) { - PROG_CODE; - GLuint src[3], dest = 0; - int ip; + code->inst[ip].inst5 = translate_rgb_op(inst->RGB.Opcode); + code->inst[ip].inst4 = translate_alpha_op(inst->Alpha.Opcode); - if (fpi->Opcode != OPCODE_KIL) { - dest = make_dest(cs, fpi->DstReg); - } + if (inst->RGB.OutputWriteMask || inst->Alpha.OutputWriteMask || inst->Alpha.DepthWriteMask) + code->inst[ip].inst0 = R500_INST_TYPE_OUT; + else + code->inst[ip].inst0 = R500_INST_TYPE_ALU; + code->inst[ip].inst0 |= R500_INST_TEX_SEM_WAIT; - switch (fpi->Opcode) { - case OPCODE_ADD: - /* Variation on MAD: 1*src0+src1 */ - ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_argA(cs, ip, 0, R500_SWIZ_RGB_ONE, R500_SWIZZLE_ONE); - set_argB_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argC_reg(cs, ip, 1, fpi->SrcReg[1]); - break; - case OPCODE_CMP: - /* This inst's selects need to be swapped as follows: - * 0 -> C ; 1 -> B ; 2 -> A */ - ip = emit_alu(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_CMP, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_src2(cs, ip, fpi->SrcReg[2]); - set_argA_reg(cs, ip, 2, fpi->SrcReg[2]); - set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); - set_argC_reg(cs, ip, 0, fpi->SrcReg[0]); - break; - case OPCODE_COS: - src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, R500_ALPHA_OP_COS, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); - break; - case OPCODE_DP3: - ip = emit_alu(cs, R500_ALU_RGBA_OP_DP3, R500_ALPHA_OP_DP, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); - break; - case OPCODE_DP4: - ip = emit_alu(cs, R500_ALU_RGBA_OP_DP4, R500_ALPHA_OP_DP, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); - break; - case OPCODE_EX2: - src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, R500_ALPHA_OP_EX2, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); - break; - case OPCODE_FRC: - ip = emit_alu(cs, R500_ALU_RGBA_OP_FRC, R500_ALPHA_OP_FRC, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - break; - case OPCODE_LG2: - src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, R500_ALPHA_OP_LN2, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); - break; - case OPCODE_MAD: - ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_src2(cs, ip, fpi->SrcReg[2]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); - set_argC_reg(cs, ip, 2, fpi->SrcReg[2]); - break; - case OPCODE_MAX: - ip = emit_alu(cs, R500_ALU_RGBA_OP_MAX, R500_ALPHA_OP_MAX, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); - break; - case OPCODE_MIN: - ip = emit_alu(cs, R500_ALU_RGBA_OP_MIN, R500_ALPHA_OP_MIN, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); - break; - case OPCODE_MOV: - ip = emit_alu(cs, R500_ALU_RGBA_OP_CMP, R500_ALPHA_OP_CMP, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argB_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); - code->inst[ip].inst3 |= R500_ALU_RGB_OMOD_DISABLE; - code->inst[ip].inst4 |= R500_ALPHA_OMOD_DISABLE; - break; - case OPCODE_MUL: - /* Variation on MAD: src0*src1+0 */ - ip = emit_alu(cs, R500_ALU_RGBA_OP_MAD, R500_ALPHA_OP_MAD, fpi->DstReg); - set_src0(cs, ip, fpi->SrcReg[0]); - set_src1(cs, ip, fpi->SrcReg[1]); - set_argA_reg(cs, ip, 0, fpi->SrcReg[0]); - set_argB_reg(cs, ip, 1, fpi->SrcReg[1]); - set_argC(cs, ip, 0, R500_SWIZ_RGB_ZERO, R500_SWIZZLE_ZERO); - break; - case OPCODE_RCP: - src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, R500_ALPHA_OP_RCP, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); - break; - case OPCODE_RSQ: - src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, R500_ALPHA_OP_RSQ, fpi->DstReg, src[0], - (make_sop_swizzle(fpi->SrcReg[0]) | (R500_SWIZ_MOD_ABS<<3)) & ~(R500_SWIZ_MOD_NEG<<3)); - break; - case OPCODE_SIN: - src[0] = make_src(cs, fpi->SrcReg[0]); - emit_sop(cs, R500_ALPHA_OP_SIN, fpi->DstReg, src[0], make_sop_swizzle(fpi->SrcReg[0])); - break; - case OPCODE_KIL: - case OPCODE_TEX: - case OPCODE_TXB: - case OPCODE_TXP: - emit_tex(cs, fpi, dest); - break; - default: - ERROR("unknown fpi->Opcode %s\n", _mesa_opcode_string(fpi->Opcode)); - break; + code->inst[ip].inst0 |= (inst->RGB.WriteMask << 11) | (inst->Alpha.WriteMask << 14); + code->inst[ip].inst0 |= (inst->RGB.OutputWriteMask << 15) | (inst->Alpha.OutputWriteMask << 18); + if (inst->Alpha.DepthWriteMask) { + code->inst[ip].inst4 |= R500_ALPHA_W_OMASK; + c->fp->writes_depth = GL_TRUE; } - /* Finishing touches */ - if (fpi->SaturateMode == SATURATE_ZERO_ONE) { - code->inst[cs->nrslots-1].inst0 |= R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP; - } -} + code->inst[ip].inst4 |= R500_ALPHA_ADDRD(inst->Alpha.DestIndex); + code->inst[ip].inst5 |= R500_ALU_RGBA_ADDRD(inst->RGB.DestIndex); + use_temporary(code, inst->Alpha.DestIndex); + use_temporary(code, inst->RGB.DestIndex); -static GLboolean parse_program(struct r500_pfs_compile_state *cs) -{ - PROG_CODE; - struct prog_instruction* fpi; + if (inst->RGB.Saturate) + code->inst[ip].inst0 |= R500_INST_RGB_CLAMP; + if (inst->Alpha.Saturate) + code->inst[ip].inst0 |= R500_INST_ALPHA_CLAMP; - for(fpi = cs->compiler->program->Instructions; fpi->Opcode != OPCODE_END; ++fpi) { - do_inst(cs, fpi); + code->inst[ip].inst1 |= R500_RGB_ADDR0(use_source(code, inst->RGB.Src[0])); + code->inst[ip].inst1 |= R500_RGB_ADDR1(use_source(code, inst->RGB.Src[1])); + code->inst[ip].inst1 |= R500_RGB_ADDR2(use_source(code, inst->RGB.Src[2])); - if (cs->compiler->fp->error) - return GL_FALSE; - } + code->inst[ip].inst2 |= R500_ALPHA_ADDR0(use_source(code, inst->Alpha.Src[0])); + code->inst[ip].inst2 |= R500_ALPHA_ADDR1(use_source(code, inst->Alpha.Src[1])); + code->inst[ip].inst2 |= R500_ALPHA_ADDR2(use_source(code, inst->Alpha.Src[2])); - /* Finish him! (If it's an ALU/OUT instruction...) */ - if ((code->inst[cs->nrslots-1].inst0 & 0x3) == 1) { - code->inst[cs->nrslots-1].inst0 |= R500_INST_LAST; - } else { - /* We still need to put an output inst, right? */ - WARN_ONCE("Final FP instruction is not an OUT.\n"); - } + code->inst[ip].inst3 |= translate_arg_rgb(inst, 0) << R500_ALU_RGB_SEL_A_SHIFT; + code->inst[ip].inst3 |= translate_arg_rgb(inst, 1) << R500_ALU_RGB_SEL_B_SHIFT; + code->inst[ip].inst5 |= translate_arg_rgb(inst, 2) << R500_ALU_RGBA_SEL_C_SHIFT; - code->max_temp_idx++; + code->inst[ip].inst4 |= translate_arg_alpha(inst, 0) << R500_ALPHA_SEL_A_SHIFT; + code->inst[ip].inst4 |= translate_arg_alpha(inst, 1) << R500_ALPHA_SEL_B_SHIFT; + code->inst[ip].inst5 |= translate_arg_alpha(inst, 2) << R500_ALU_RGBA_ALPHA_SEL_C_SHIFT; return GL_TRUE; } -static void init_program(struct r500_pfs_compile_state *cs) +static GLuint translate_strq_swizzle(struct prog_src_register src) { - PROG_CODE; - struct gl_fragment_program *mp = &cs->compiler->fp->mesa_program; - struct prog_instruction *fpi; - GLuint InputsRead = mp->Base.InputsRead; - GLuint temps_used = 0; + GLuint swiz = 0; int i; + for (i = 0; i < 4; i++) + swiz |= (GET_SWZ(src.Swizzle, i) & 0x3) << i*2; + return swiz; +} - /* New compile, reset tracking data */ - cs->compiler->fp->optimization = - driQueryOptioni(&cs->compiler->r300->radeon.optionCache, "fp_optimization"); - cs->compiler->fp->translated = GL_FALSE; - cs->compiler->fp->error = GL_FALSE; +/** + * Emit a single TEX instruction + */ +static GLboolean emit_tex(void *data, struct prog_instruction *inst) +{ + PROG_CODE; - _mesa_bzero(code, sizeof(*code)); - code->max_temp_idx = 1; /* Size of pixel stack, plus 1. */ - cs->nrslots = 0; - cs->compiler->fp->writes_depth = GL_FALSE; - - /* Work out what temps the Mesa inputs correspond to, this must match - * what setup_rs_unit does, which shouldn't be a problem as rs_unit - * configures itself based on the fragprog's InputsRead - * - * NOTE: this depends on get_hw_temp() allocating registers in order, - * starting from register 0, so we're just going to do that instead. - */ - - /* Texcoords come first */ - for (i = 0; i < cs->compiler->fp->ctx->Const.MaxTextureUnits; i++) { - if (InputsRead & (FRAG_BIT_TEX0 << i)) { - cs->inputs[FRAG_ATTRIB_TEX0 + i].refcount = 0; - cs->inputs[FRAG_ATTRIB_TEX0 + i].reg = - code->temp_reg_offset; - code->temp_reg_offset++; - } - } - InputsRead &= ~FRAG_BITS_TEX_ANY; - - /* fragment position treated as a texcoord */ - if (InputsRead & FRAG_BIT_WPOS) { - cs->inputs[FRAG_ATTRIB_WPOS].refcount = 0; - cs->inputs[FRAG_ATTRIB_WPOS].reg = - code->temp_reg_offset; - code->temp_reg_offset++; - } - InputsRead &= ~FRAG_BIT_WPOS; - - /* Then primary colour */ - if (InputsRead & FRAG_BIT_COL0) { - cs->inputs[FRAG_ATTRIB_COL0].refcount = 0; - cs->inputs[FRAG_ATTRIB_COL0].reg = - code->temp_reg_offset; - code->temp_reg_offset++; - } - InputsRead &= ~FRAG_BIT_COL0; - - /* Secondary color */ - if (InputsRead & FRAG_BIT_COL1) { - cs->inputs[FRAG_ATTRIB_COL1].refcount = 0; - cs->inputs[FRAG_ATTRIB_COL1].reg = - code->temp_reg_offset; - code->temp_reg_offset++; - } - InputsRead &= ~FRAG_BIT_COL1; - - /* Anything else */ - if (InputsRead) { - WARN_ONCE("Don't know how to handle inputs 0x%x\n", InputsRead); - /* force read from hwreg 0 for now */ - for (i = 0; i < 32; i++) - if (InputsRead & (1 << i)) - cs->inputs[i].reg = 0; + if (code->inst_end >= 511) { + error("emit_tex: Too many instructions"); + return GL_FALSE; } - int ip; + int ip = ++code->inst_end; - for (ip = 0; ip < cs->compiler->program->NumInstructions; ip++) { - fpi = cs->compiler->program->Instructions + ip; - for (i = 0; i < 3; i++) { - if (fpi->SrcReg[i].File == PROGRAM_TEMPORARY) { - if (fpi->SrcReg[i].Index >= temps_used) - temps_used = fpi->SrcReg[i].Index + 1; - } - } - } + code->inst[ip].inst0 = R500_INST_TYPE_TEX + | (inst->DstReg.WriteMask << 11) + | R500_INST_TEX_SEM_WAIT; + code->inst[ip].inst1 = R500_TEX_ID(inst->TexSrcUnit) + | R500_TEX_SEM_ACQUIRE | R500_TEX_IGNORE_UNCOVERED; + if (inst->TexSrcTarget == TEXTURE_RECT_INDEX) + code->inst[ip].inst1 |= R500_TEX_UNSCALED; - cs->temp_in_use = temps_used + 1; + switch (inst->Opcode) { + case OPCODE_KIL: + code->inst[ip].inst1 |= R500_TEX_INST_TEXKILL; + break; + case OPCODE_TEX: + code->inst[ip].inst1 |= R500_TEX_INST_LD; + break; + case OPCODE_TXB: + code->inst[ip].inst1 |= R500_TEX_INST_LODBIAS; + break; + case OPCODE_TXP: + code->inst[ip].inst1 |= R500_TEX_INST_PROJ; + break; + default: + error("emit_tex can't handle opcode %x\n", inst->Opcode); + } - code->max_temp_idx = code->temp_reg_offset + cs->temp_in_use; + code->inst[ip].inst2 = R500_TEX_SRC_ADDR(inst->SrcReg[0].Index) + | (translate_strq_swizzle(inst->SrcReg[0]) << 8) + | R500_TEX_DST_ADDR(inst->DstReg.Index) + | R500_TEX_DST_R_SWIZ_R | R500_TEX_DST_G_SWIZ_G + | R500_TEX_DST_B_SWIZ_B | R500_TEX_DST_A_SWIZ_A; - if (RADEON_DEBUG & DEBUG_PIXEL) - fprintf(stderr, "FP temp indices: code->max_temp_idx: %d cs->temp_in_use: %d\n", code->max_temp_idx, cs->temp_in_use); + return GL_TRUE; } -static void dumb_shader(struct r500_pfs_compile_state *cs) -{ - PROG_CODE; - code->inst[0].inst0 = R500_INST_TYPE_TEX - | R500_INST_TEX_SEM_WAIT - | R500_INST_RGB_WMASK_R - | R500_INST_RGB_WMASK_G - | R500_INST_RGB_WMASK_B - | R500_INST_ALPHA_WMASK - | R500_INST_RGB_CLAMP - | R500_INST_ALPHA_CLAMP; - code->inst[0].inst1 = R500_TEX_ID(0) - | R500_TEX_INST_LD - | R500_TEX_SEM_ACQUIRE - | R500_TEX_IGNORE_UNCOVERED; - code->inst[0].inst2 = R500_TEX_SRC_ADDR(0) - | R500_TEX_SRC_S_SWIZ_R - | R500_TEX_SRC_T_SWIZ_G - | R500_TEX_DST_ADDR(0) - | R500_TEX_DST_R_SWIZ_R - | R500_TEX_DST_G_SWIZ_G - | R500_TEX_DST_B_SWIZ_B - | R500_TEX_DST_A_SWIZ_A; - code->inst[0].inst3 = R500_DX_ADDR(0) - | R500_DX_S_SWIZ_R - | R500_DX_T_SWIZ_R - | R500_DX_R_SWIZ_R - | R500_DX_Q_SWIZ_R - | R500_DY_ADDR(0) - | R500_DY_S_SWIZ_R - | R500_DY_T_SWIZ_R - | R500_DY_R_SWIZ_R - | R500_DY_Q_SWIZ_R; - code->inst[0].inst4 = 0x0; - code->inst[0].inst5 = 0x0; - - code->inst[1].inst0 = R500_INST_TYPE_OUT | - R500_INST_TEX_SEM_WAIT | - R500_INST_LAST | - R500_INST_RGB_OMASK_R | - R500_INST_RGB_OMASK_G | - R500_INST_RGB_OMASK_B | - R500_INST_ALPHA_OMASK; - code->inst[1].inst1 = R500_RGB_ADDR0(0) | - R500_RGB_ADDR1(0) | - R500_RGB_ADDR1_CONST | - R500_RGB_ADDR2(0) | - R500_RGB_ADDR2_CONST | - R500_RGB_SRCP_OP_1_MINUS_2RGB0; - code->inst[1].inst2 = R500_ALPHA_ADDR0(0) | - R500_ALPHA_ADDR1(0) | - R500_ALPHA_ADDR1_CONST | - R500_ALPHA_ADDR2(0) | - R500_ALPHA_ADDR2_CONST | - R500_ALPHA_SRCP_OP_1_MINUS_2A0; - code->inst[1].inst3 = R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_R | - R500_ALU_RGB_G_SWIZ_A_G | - R500_ALU_RGB_B_SWIZ_A_B | - R500_ALU_RGB_SEL_B_SRC0 | - R500_ALU_RGB_R_SWIZ_B_1 | - R500_ALU_RGB_B_SWIZ_B_1 | - R500_ALU_RGB_G_SWIZ_B_1; - code->inst[1].inst4 = R500_ALPHA_OP_MAD | - R500_ALPHA_SWIZ_A_A | - R500_ALPHA_SWIZ_B_1; - code->inst[1].inst5 = R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_R_SWIZ_0 | - R500_ALU_RGBA_G_SWIZ_0 | - R500_ALU_RGBA_B_SWIZ_0 | - R500_ALU_RGBA_A_SWIZ_0; - - cs->nrslots = 2; -} +static const struct radeon_pair_handler pair_handler = { + .EmitConst = emit_const, + .EmitPaired = emit_paired, + .EmitTex = emit_tex, + .MaxHwTemps = 128 +}; GLboolean r500FragmentProgramEmit(struct r500_fragment_program_compiler *compiler) { - struct r500_pfs_compile_state cs; struct r500_fragment_program_code *code = compiler->code; - _mesa_memset(&cs, 0, sizeof(cs)); - cs.compiler = compiler; - init_program(&cs); - - if (!parse_program(&cs)) { -#if 0 - ERROR("Huh. Couldn't parse program. There should be additional errors explaining why.\nUsing dumb shader...\n"); - dumb_shader(fp); - code->inst_offset = 0; - code->inst_end = cs.nrslots - 1; -#endif + _mesa_bzero(code, sizeof(*code)); + code->max_temp_idx = 1; + code->inst_offset = 0; + code->inst_end = -1; + + if (!radeonPairProgram(compiler->r300->radeon.glCtx, compiler->program, &pair_handler, compiler)) return GL_FALSE; - } - code->inst_offset = 0; - code->inst_end = cs.nrslots - 1; + if ((code->inst[code->inst_end].inst0 & R500_INST_TYPE_MASK) != R500_INST_TYPE_OUT) { + /* This may happen when dead-code elimination is disabled or + * when most of the fragment program logic is leading to a KIL */ + if (code->inst_end >= 511) { + error("Introducing fake OUT: Too many instructions"); + return GL_FALSE; + } + + int ip = ++code->inst_end; + code->inst[ip].inst0 = R500_INST_TYPE_OUT | R500_INST_TEX_SEM_WAIT; + } return GL_TRUE; } diff --git a/src/mesa/drivers/dri/r300/radeon_program.h b/src/mesa/drivers/dri/r300/radeon_program.h index ba76bc47cfb..2e01dd496b3 100644 --- a/src/mesa/drivers/dri/r300/radeon_program.h +++ b/src/mesa/drivers/dri/r300/radeon_program.h @@ -45,6 +45,10 @@ enum { PROGRAM_BUILTIN = PROGRAM_FILE_MAX /**< not a real register, but a special swizzle constant */ }; +enum { + OPCODE_REPL_ALPHA = MAX_OPCODE /**< used in paired instructions */ +}; + #define SWIZZLE_0000 MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO) #define SWIZZLE_1111 MAKE_SWIZZLE4(SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE) diff --git a/src/mesa/drivers/dri/r300/radeon_program_pair.c b/src/mesa/drivers/dri/r300/radeon_program_pair.c new file mode 100644 index 00000000000..86180edcb5e --- /dev/null +++ b/src/mesa/drivers/dri/r300/radeon_program_pair.c @@ -0,0 +1,970 @@ +/* + * Copyright (C) 2008 Nicolai Haehnle. + * + * 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 (including the + * next paragraph) 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 COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS 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. + * + */ + +/** + * @file + * + * Perform temporary register allocation and attempt to pair off instructions + * in RGB and Alpha pairs. Also attempts to optimize the TEX instruction + * vs. ALU instruction scheduling. + */ + +#include "radeon_program_pair.h" + +#include "radeon_context.h" + +#include "shader/prog_print.h" + +#define error(fmt, args...) do { \ + _mesa_problem(s->Ctx, "%s::%s(): " fmt "\n", \ + __FILE__, __FUNCTION__, ##args); \ + s->Error = GL_TRUE; \ +} while(0) + +struct pair_state_instruction { + GLuint IsTex:1; /**< Is a texture instruction */ + GLuint NeedRGB:1; /**< Needs the RGB ALU */ + GLuint NeedAlpha:1; /**< Needs the Alpha ALU */ + GLuint IsTranscendent:1; /**< Is a special transcendent instruction */ + + /** + * Number of (read and write) dependencies that must be resolved before + * this instruction can be scheduled. + */ + GLuint NumDependencies:5; + + /** + * Next instruction in the linked list of ready instructions. + */ + struct pair_state_instruction *NextReady; + + /** + * Values that this instruction writes + */ + struct reg_value *Values[4]; +}; + + +/** + * Used to keep track of which instructions read a value. + */ +struct reg_value_reader { + GLuint IP; /**< IP of the instruction that performs this access */ + struct reg_value_reader *Next; +}; + +/** + * Used to keep track which values are stored in each component of a + * PROGRAM_TEMPORARY. + */ +struct reg_value { + GLuint IP; /**< IP of the instruction that writes this value */ + struct reg_value *Next; /**< Pointer to the next value to be written to the same PROGRAM_TEMPORARY component */ + + /** + * Unordered linked list of instructions that read from this value. + */ + struct reg_value_reader *Readers; + + /** + * Number of readers of this value. This is calculated during @ref scan_instructions + * and continually decremented during code emission. + * When this count reaches zero, the instruction that writes the @ref Next value + * can be scheduled. + */ + GLuint NumReaders; +}; + +/** + * Used to translate a PROGRAM_INPUT or PROGRAM_TEMPORARY Mesa register + * to the proper hardware temporary. + */ +struct pair_register_translation { + GLuint Allocated:1; + GLuint HwIndex:8; + GLuint RefCount:23; /**< # of times this occurs in an unscheduled instruction SrcReg or DstReg */ + + /** + * Notes the value that is currently contained in each component + * (only used for PROGRAM_TEMPORARY registers). + */ + struct reg_value *Value[4]; +}; + +struct pair_state { + GLcontext *Ctx; + struct gl_program *Program; + const struct radeon_pair_handler *Handler; + GLboolean Error; + GLboolean Debug; + GLboolean Verbose; + void *UserData; + + /** + * Translate Mesa registers to hardware registers + */ + struct pair_register_translation Inputs[FRAG_ATTRIB_MAX]; + struct pair_register_translation Temps[MAX_PROGRAM_TEMPS]; + + /** + * Derived information about program instructions. + */ + struct pair_state_instruction *Instructions; + + struct { + GLuint RefCount; /**< # of times this occurs in an unscheduled SrcReg or DstReg */ + } HwTemps[128]; + + /** + * Linked list of instructions that can be scheduled right now, + * based on which ALU/TEX resources they require. + */ + struct pair_state_instruction *ReadyFullALU; + struct pair_state_instruction *ReadyRGB; + struct pair_state_instruction *ReadyAlpha; + struct pair_state_instruction *ReadyTEX; + + /** + * Pool of @ref reg_value structures for fast allocation. + */ + struct reg_value *ValuePool; + GLuint ValuePoolUsed; + struct reg_value_reader *ReaderPool; + GLuint ReaderPoolUsed; +}; + + +static struct pair_register_translation *get_register(struct pair_state *s, GLuint file, GLuint index) +{ + switch(file) { + case PROGRAM_TEMPORARY: return &s->Temps[index]; + case PROGRAM_INPUT: return &s->Inputs[index]; + default: return 0; + } +} + + +static GLuint get_hw_reg(struct pair_state *s, GLuint file, GLuint index) +{ + GLuint hwindex; + + struct pair_register_translation *t = get_register(s, file, index); + if (!t) { + _mesa_problem(s->Ctx, "get_hw_reg: %i[%i]\n", file, index); + return 0; + } + + if (t->Allocated) + return t->HwIndex; + + for(hwindex = 0; hwindex < s->Handler->MaxHwTemps; ++hwindex) + if (!s->HwTemps[hwindex].RefCount) + break; + + if (hwindex >= s->Handler->MaxHwTemps) { + error("Ran out of hardware temporaries"); + return 0; + } + + s->HwTemps[hwindex].RefCount = t->RefCount; + t->Allocated = 1; + t->HwIndex = hwindex; + return hwindex; +} + + +static void deref_hw_reg(struct pair_state *s, GLuint hwindex) +{ + if (!s->HwTemps[hwindex].RefCount) { + error("Hwindex %i refcount error", hwindex); + return; + } + + s->HwTemps[hwindex].RefCount--; +} + +static void add_pairinst_to_list(struct pair_state_instruction **list, struct pair_state_instruction *pairinst) +{ + pairinst->NextReady = *list; + *list = pairinst; +} + +/** + * The instruction at the given IP has become ready. Link it into the ready + * instructions. + */ +static void instruction_ready(struct pair_state *s, int ip) +{ + struct pair_state_instruction *pairinst = s->Instructions + ip; + + if (s->Verbose) + _mesa_printf("instruction_ready(%i)\n", ip); + + if (pairinst->IsTex) + add_pairinst_to_list(&s->ReadyTEX, pairinst); + else if (!pairinst->NeedAlpha) + add_pairinst_to_list(&s->ReadyRGB, pairinst); + else if (!pairinst->NeedRGB) + add_pairinst_to_list(&s->ReadyAlpha, pairinst); + else + add_pairinst_to_list(&s->ReadyFullALU, pairinst); +} + + +/** + * Finally rewrite ADD, MOV, MUL as the appropriate native instruction + * and reverse the order of arguments for CMP. + */ +static void final_rewrite(struct pair_state *s, struct prog_instruction *inst) +{ + struct prog_src_register tmp; + + switch(inst->Opcode) { + case OPCODE_ADD: + inst->SrcReg[2] = inst->SrcReg[1]; + inst->SrcReg[1].File = PROGRAM_BUILTIN; + inst->SrcReg[1].Swizzle = SWIZZLE_1111; + inst->SrcReg[1].NegateBase = 0; + inst->SrcReg[1].NegateAbs = 0; + inst->Opcode = OPCODE_MAD; + break; + case OPCODE_CMP: + tmp = inst->SrcReg[2]; + inst->SrcReg[2] = inst->SrcReg[0]; + inst->SrcReg[0] = tmp; + break; + case OPCODE_MOV: + inst->SrcReg[1] = inst->SrcReg[0]; + inst->SrcReg[2].File = PROGRAM_BUILTIN; + inst->SrcReg[2].Swizzle = SWIZZLE_0000; + inst->Opcode = OPCODE_CMP; + // TODO: disable output modifiers on R500 + break; + case OPCODE_MUL: + inst->SrcReg[2].File = PROGRAM_BUILTIN; + inst->SrcReg[2].Swizzle = SWIZZLE_0000; + inst->Opcode = OPCODE_MAD; + break; + default: + /* nothing to do */ + break; + } +} + + +/** + * Classify an instruction according to which ALUs etc. it needs + */ +static void classify_instruction(struct pair_state *s, + struct prog_instruction *inst, struct pair_state_instruction *pairinst) +{ + pairinst->NeedRGB = (inst->DstReg.WriteMask & WRITEMASK_XYZ) ? 1 : 0; + pairinst->NeedAlpha = (inst->DstReg.WriteMask & WRITEMASK_W) ? 1 : 0; + + switch(inst->Opcode) { + case OPCODE_ADD: + case OPCODE_CMP: + case OPCODE_FRC: + case OPCODE_MAD: + case OPCODE_MAX: + case OPCODE_MIN: + case OPCODE_MOV: + case OPCODE_MUL: + break; + case OPCODE_COS: + case OPCODE_EX2: + case OPCODE_LG2: + case OPCODE_RCP: + case OPCODE_RSQ: + case OPCODE_SIN: + pairinst->IsTranscendent = 1; + pairinst->NeedAlpha = 1; + break; + case OPCODE_DP4: + pairinst->NeedAlpha = 1; + /* fall through */ + case OPCODE_DP3: + pairinst->NeedRGB = 1; + break; + case OPCODE_KIL: + case OPCODE_TEX: + case OPCODE_TXB: + case OPCODE_TXP: + case OPCODE_END: + pairinst->IsTex = 1; + break; + default: + error("Unknown opcode %d\n", inst->Opcode); + break; + } +} + + +/** + * Count which (input, temporary) register is read and written how often, + * and scan the instruction stream to find dependencies. + */ +static void scan_instructions(struct pair_state *s) +{ + struct prog_instruction *inst; + struct pair_state_instruction *pairinst; + GLuint ip; + + for(inst = s->Program->Instructions, pairinst = s->Instructions, ip = 0; + inst->Opcode != OPCODE_END; + ++inst, ++pairinst, ++ip) { + final_rewrite(s, inst); + classify_instruction(s, inst, pairinst); + + int nsrc = _mesa_num_inst_src_regs(inst->Opcode); + int j; + for(j = 0; j < nsrc; j++) { + struct pair_register_translation *t = + get_register(s, inst->SrcReg[j].File, inst->SrcReg[j].Index); + if (!t) + continue; + + t->RefCount++; + + if (inst->SrcReg[j].File == PROGRAM_TEMPORARY) { + int i; + for(i = 0; i < 4; ++i) { + GLuint swz = GET_SWZ(inst->SrcReg[j].Swizzle, i); + if (swz >= 4) + continue; /* constant or NIL swizzle */ + if (!t->Value[swz]) + continue; /* this is an undefined read */ + + /* Do not add a dependency if this instruction + * also rewrites the value. The code below adds + * a dependency for the DstReg, which is a superset + * of the SrcReg dependency. */ + if (inst->DstReg.File == PROGRAM_TEMPORARY && + inst->DstReg.Index == inst->SrcReg[j].Index && + GET_BIT(inst->DstReg.WriteMask, swz)) + continue; + + struct reg_value_reader* r = &s->ReaderPool[s->ReaderPoolUsed++]; + pairinst->NumDependencies++; + t->Value[swz]->NumReaders++; + r->IP = ip; + r->Next = t->Value[swz]->Readers; + t->Value[swz]->Readers = r; + } + } + } + + int ndst = _mesa_num_inst_dst_regs(inst->Opcode); + if (ndst) { + struct pair_register_translation *t = + get_register(s, inst->DstReg.File, inst->DstReg.Index); + if (t) { + t->RefCount++; + + if (inst->DstReg.File == PROGRAM_TEMPORARY) { + int j; + for(j = 0; j < 4; ++j) { + if (!GET_BIT(inst->DstReg.WriteMask, j)) + continue; + + struct reg_value* v = &s->ValuePool[s->ValuePoolUsed++]; + v->IP = ip; + if (t->Value[j]) { + pairinst->NumDependencies++; + t->Value[j]->Next = v; + } + t->Value[j] = v; + pairinst->Values[j] = v; + } + } + } + } + + if (s->Verbose) + _mesa_printf("scan(%i): NumDeps = %i\n", ip, pairinst->NumDependencies); + + if (!pairinst->NumDependencies) + instruction_ready(s, ip); + } + + /* Clear the PROGRAM_TEMPORARY state */ + int i, j; + for(i = 0; i < MAX_PROGRAM_TEMPS; ++i) { + for(j = 0; j < 4; ++j) + s->Temps[i].Value[j] = 0; + } +} + + +/** + * Reserve hardware temporary registers for the program inputs. + * + * @note This allocation is performed explicitly, because the order of inputs + * is determined by the RS hardware. + */ +static void allocate_input_registers(struct pair_state *s) +{ + GLuint InputsRead = s->Program->InputsRead; + int i; + + /* Texcoords come first */ + for (i = 0; i < s->Ctx->Const.MaxTextureUnits; i++) { + if (InputsRead & (FRAG_BIT_TEX0 << i)) + get_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_TEX0+i); + } + InputsRead &= ~FRAG_BITS_TEX_ANY; + + /* fragment position treated as a texcoord */ + if (InputsRead & FRAG_BIT_WPOS) + get_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_WPOS); + InputsRead &= ~FRAG_BIT_WPOS; + + /* Then primary colour */ + if (InputsRead & FRAG_BIT_COL0) + get_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL0); + InputsRead &= ~FRAG_BIT_COL0; + + /* Secondary color */ + if (InputsRead & FRAG_BIT_COL1) + get_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL1); + InputsRead &= ~FRAG_BIT_COL1; + + /* Anything else */ + if (InputsRead) + error("Don't know how to handle inputs 0x%x\n", InputsRead); +} + + +static void decrement_dependencies(struct pair_state *s, int ip) +{ + struct pair_state_instruction *pairinst = s->Instructions + ip; + ASSERT(pairinst->NumDependencies > 0); + if (!--pairinst->NumDependencies) + instruction_ready(s, ip); +} + +/** + * Update the dependency tracking state based on what the instruction + * at the given IP does. + */ +static void commit_instruction(struct pair_state *s, int ip) +{ + struct prog_instruction *inst = s->Program->Instructions + ip; + struct pair_state_instruction *pairinst = s->Instructions + ip; + + if (s->Verbose) + _mesa_printf("commit_instruction(%i)\n", ip); + + if (inst->DstReg.File == PROGRAM_TEMPORARY) { + struct pair_register_translation *t = &s->Temps[inst->DstReg.Index]; + deref_hw_reg(s, t->HwIndex); + + int i; + for(i = 0; i < 4; ++i) { + if (!GET_BIT(inst->DstReg.WriteMask, i)) + continue; + + t->Value[i] = pairinst->Values[i]; + if (t->Value[i]->NumReaders) { + struct reg_value_reader *r; + for(r = pairinst->Values[i]->Readers; r; r = r->Next) + decrement_dependencies(s, r->IP); + } else if (t->Value[i]->Next) { + /* This happens when the only reader writes + * the register at the same time */ + decrement_dependencies(s, t->Value[i]->Next->IP); + } + } + } + + int nsrc = _mesa_num_inst_src_regs(inst->Opcode); + int i; + for(i = 0; i < nsrc; i++) { + struct pair_register_translation *t = get_register(s, inst->SrcReg[i].File, inst->SrcReg[i].Index); + if (!t) + continue; + + deref_hw_reg(s, get_hw_reg(s, inst->SrcReg[i].File, inst->SrcReg[i].Index)); + + if (inst->SrcReg[i].File != PROGRAM_TEMPORARY) + continue; + + int j; + for(j = 0; j < 4; ++j) { + GLuint swz = GET_SWZ(inst->SrcReg[i].Swizzle, j); + if (swz >= 4) + continue; + if (!t->Value[swz]) + continue; + + /* Do not free a dependency if this instruction + * also rewrites the value. See scan_instructions. */ + if (inst->DstReg.File == PROGRAM_TEMPORARY && + inst->DstReg.Index == inst->SrcReg[i].Index && + GET_BIT(inst->DstReg.WriteMask, swz)) + continue; + + if (!--t->Value[swz]->NumReaders) { + if (t->Value[swz]->Next) + decrement_dependencies(s, t->Value[swz]->Next->IP); + } + } + } +} + + +/** + * Emit all ready texture instructions in a single block. + * + * Emit as a single block to (hopefully) sample many textures in parallel, + * and to avoid hardware indirections on R300. + * + * In R500, we don't really know when the result of a texture instruction + * arrives. So allocate all destinations first, to make sure they do not + * arrive early and overwrite a texture coordinate we're going to use later + * in the block. + */ +static void emit_all_tex(struct pair_state *s) +{ + struct pair_state_instruction *readytex; + struct pair_state_instruction *pairinst; + + ASSERT(s->ReadyTEX); + + // Don't let the ready list change under us! + readytex = s->ReadyTEX; + s->ReadyTEX = 0; + + // Allocate destination hardware registers in one block to avoid conflicts. + for(pairinst = readytex; pairinst; pairinst = pairinst->NextReady) { + int ip = pairinst - s->Instructions; + struct prog_instruction *inst = s->Program->Instructions + ip; + if (inst->Opcode != OPCODE_KIL) + get_hw_reg(s, inst->DstReg.File, inst->DstReg.Index); + } + + if (s->Debug) + _mesa_printf(" BEGIN_TEX\n"); + + for(pairinst = readytex; pairinst; pairinst = pairinst->NextReady) { + int ip = pairinst - s->Instructions; + struct prog_instruction *inst = s->Program->Instructions + ip; + commit_instruction(s, ip); + + if (inst->Opcode != OPCODE_KIL) + inst->DstReg.Index = get_hw_reg(s, inst->DstReg.File, inst->DstReg.Index); + inst->SrcReg[0].Index = get_hw_reg(s, inst->SrcReg[0].File, inst->SrcReg[0].Index); + + if (s->Debug) { + _mesa_printf(" "); + _mesa_print_instruction(inst); + } + s->Error = s->Error || !s->Handler->EmitTex(s->UserData, inst); + } + + if (s->Handler->EndTexBlock) + s->Handler->EndTexBlock(s->UserData); + + if (s->Debug) + _mesa_printf(" END_TEX\n"); +} + + +static int alloc_pair_source(struct pair_state *s, struct radeon_pair_instruction *pair, + struct prog_src_register src, GLboolean rgb, GLboolean alpha) +{ + int candidate = -1; + int candidate_quality = -1; + int i; + + if (!rgb && !alpha) + return 0; + + GLuint constant; + GLuint index; + + if (src.File == PROGRAM_TEMPORARY || src.File == PROGRAM_INPUT) { + constant = 0; + index = get_hw_reg(s, src.File, src.Index); + } else { + constant = 1; + s->Error |= !s->Handler->EmitConst(s->UserData, src.File, src.Index, &index); + } + + for(i = 0; i < 3; ++i) { + int q = 0; + if (rgb) { + if (pair->RGB.Src[i].Used) { + if (pair->RGB.Src[i].Constant != constant || + pair->RGB.Src[i].Index != index) + continue; + q++; + } + } + if (alpha) { + if (pair->Alpha.Src[i].Used) { + if (pair->Alpha.Src[i].Constant != constant || + pair->Alpha.Src[i].Index != index) + continue; + q++; + } + } + if (q > candidate_quality) { + candidate_quality = q; + candidate = i; + } + } + + if (candidate >= 0) { + if (rgb) { + pair->RGB.Src[candidate].Used = 1; + pair->RGB.Src[candidate].Constant = constant; + pair->RGB.Src[candidate].Index = index; + } + if (alpha) { + pair->Alpha.Src[candidate].Used = 1; + pair->Alpha.Src[candidate].Constant = constant; + pair->Alpha.Src[candidate].Index = index; + } + } + + return candidate; +} + + + +/** + * Fill the given ALU instruction's opcodes and source operands into the given pair, + * if possible. + */ +static GLboolean fill_instruction_into_pair(struct pair_state *s, struct radeon_pair_instruction *pair, int ip) +{ + struct pair_state_instruction *pairinst = s->Instructions + ip; + struct prog_instruction *inst = s->Program->Instructions + ip; + + ASSERT(!pairinst->NeedRGB || pair->RGB.Opcode == OPCODE_NOP); + ASSERT(!pairinst->NeedAlpha || pair->Alpha.Opcode == OPCODE_NOP); + + if (pairinst->NeedRGB) { + if (pairinst->IsTranscendent) + pair->RGB.Opcode = OPCODE_REPL_ALPHA; + else + pair->RGB.Opcode = inst->Opcode; + } + if (pairinst->NeedAlpha) + pair->Alpha.Opcode = inst->Opcode; + + int nargs = _mesa_num_inst_src_regs(inst->Opcode); + int i; + + for(i = 0; i < nargs; ++i) { + int source; + if (pairinst->NeedRGB && !pairinst->IsTranscendent) { + GLboolean srcrgb = GL_FALSE; + GLboolean srcalpha = GL_FALSE; + GLuint negatebase = 0; + int j; + for(j = 0; j < 3; ++j) { + GLuint swz = GET_SWZ(inst->SrcReg[i].Swizzle, j); + if (swz < 3) + srcrgb = GL_TRUE; + else if (swz < 4) + srcalpha = GL_TRUE; + if (swz != SWIZZLE_NIL && GET_BIT(inst->SrcReg[i].NegateBase, j)) + negatebase = 1; + } + source = alloc_pair_source(s, pair, inst->SrcReg[i], srcrgb, srcalpha); + if (source < 0) + return GL_FALSE; + pair->RGB.Arg[i].Source = source; + pair->RGB.Arg[i].Swizzle = inst->SrcReg[i].Swizzle & 0x1ff; + pair->RGB.Arg[i].Abs = inst->SrcReg[i].Abs; + pair->RGB.Arg[i].Negate = (negatebase & ~pair->RGB.Arg[i].Abs) ^ inst->SrcReg[i].NegateAbs; + } + if (pairinst->NeedAlpha) { + GLboolean srcrgb = GL_FALSE; + GLboolean srcalpha = GL_FALSE; + GLuint negatebase = GET_BIT(inst->SrcReg[i].NegateBase, pairinst->IsTranscendent ? 0 : 3); + GLuint swz = GET_SWZ(inst->SrcReg[i].Swizzle, pairinst->IsTranscendent ? 0 : 3); + if (swz < 3) + srcrgb = GL_TRUE; + else if (swz < 4) + srcalpha = GL_TRUE; + source = alloc_pair_source(s, pair, inst->SrcReg[i], srcrgb, srcalpha); + if (source < 0) + return GL_FALSE; + pair->Alpha.Arg[i].Source = source; + pair->Alpha.Arg[i].Swizzle = swz; + pair->Alpha.Arg[i].Abs = inst->SrcReg[i].Abs; + pair->Alpha.Arg[i].Negate = (negatebase & ~pair->RGB.Arg[i].Abs) ^ inst->SrcReg[i].NegateAbs; + } + } + + return GL_TRUE; +} + + +/** + * Fill in the destination register information. + * + * This is split from filling in source registers because we want + * to avoid allocating hardware temporaries for destinations until + * we are absolutely certain that we're going to emit a certain + * instruction pairing. + */ +static void fill_dest_into_pair(struct pair_state *s, struct radeon_pair_instruction *pair, int ip) +{ + struct pair_state_instruction *pairinst = s->Instructions + ip; + struct prog_instruction *inst = s->Program->Instructions + ip; + + if (inst->DstReg.File == PROGRAM_OUTPUT) { + if (inst->DstReg.Index == FRAG_RESULT_COLR) { + pair->RGB.OutputWriteMask |= inst->DstReg.WriteMask & WRITEMASK_XYZ; + pair->Alpha.OutputWriteMask |= GET_BIT(inst->DstReg.WriteMask, 3); + } else if (inst->DstReg.Index == FRAG_RESULT_DEPR) { + pair->Alpha.DepthWriteMask |= GET_BIT(inst->DstReg.WriteMask, 3); + } + } else { + GLuint hwindex = get_hw_reg(s, inst->DstReg.File, inst->DstReg.Index); + if (pairinst->NeedRGB) { + pair->RGB.DestIndex = hwindex; + pair->RGB.WriteMask |= inst->DstReg.WriteMask & WRITEMASK_XYZ; + } + if (pairinst->NeedAlpha) { + pair->Alpha.DestIndex = hwindex; + pair->Alpha.WriteMask |= GET_BIT(inst->DstReg.WriteMask, 3); + } + } +} + + +/** + * Find a good ALU instruction or pair of ALU instruction and emit it. + * + * Prefer emitting full ALU instructions, so that when we reach a point + * where no full ALU instruction can be emitted, we have more candidates + * for RGB/Alpha pairing. + */ +static void emit_alu(struct pair_state *s) +{ + struct radeon_pair_instruction pair; + + if (s->ReadyFullALU || !(s->ReadyRGB && s->ReadyAlpha)) { + int ip; + if (s->ReadyFullALU) { + ip = s->ReadyFullALU - s->Instructions; + s->ReadyFullALU = s->ReadyFullALU->NextReady; + } else if (s->ReadyRGB) { + ip = s->ReadyRGB - s->Instructions; + s->ReadyRGB = s->ReadyRGB->NextReady; + } else { + ip = s->ReadyAlpha - s->Instructions; + s->ReadyAlpha = s->ReadyAlpha->NextReady; + } + + _mesa_bzero(&pair, sizeof(pair)); + fill_instruction_into_pair(s, &pair, ip); + fill_dest_into_pair(s, &pair, ip); + commit_instruction(s, ip); + } else { + struct pair_state_instruction **prgb; + struct pair_state_instruction **palpha; + + /* Some pairings might fail because they require too + * many source slots; try all possible pairings if necessary */ + for(prgb = &s->ReadyRGB; *prgb; prgb = &(*prgb)->NextReady) { + for(palpha = &s->ReadyAlpha; *palpha; palpha = &(*palpha)->NextReady) { + int rgbip = *prgb - s->Instructions; + int alphaip = *palpha - s->Instructions; + _mesa_bzero(&pair, sizeof(pair)); + fill_instruction_into_pair(s, &pair, rgbip); + if (!fill_instruction_into_pair(s, &pair, alphaip)) + continue; + *prgb = (*prgb)->NextReady; + *palpha = (*palpha)->NextReady; + fill_dest_into_pair(s, &pair, rgbip); + fill_dest_into_pair(s, &pair, alphaip); + commit_instruction(s, rgbip); + commit_instruction(s, alphaip); + goto success; + } + } + + /* No success in pairing; just take the first RGB instruction */ + int ip = s->ReadyRGB - s->Instructions; + s->ReadyRGB = s->ReadyRGB->NextReady; + _mesa_bzero(&pair, sizeof(pair)); + fill_instruction_into_pair(s, &pair, ip); + fill_dest_into_pair(s, &pair, ip); + commit_instruction(s, ip); + success: ; + } + + if (s->Debug) + radeonPrintPairInstruction(&pair); + + s->Error = s->Error || !s->Handler->EmitPaired(s->UserData, &pair); +} + + +GLboolean radeonPairProgram(GLcontext *ctx, struct gl_program *program, + const struct radeon_pair_handler* handler, void *userdata) +{ + struct pair_state s; + + _mesa_bzero(&s, sizeof(s)); + s.Ctx = ctx; + s.Program = program; + s.Handler = handler; + s.UserData = userdata; + s.Debug = (RADEON_DEBUG & DEBUG_PIXEL) ? GL_TRUE : GL_FALSE; + s.Verbose = GL_FALSE && s.Debug; + + s.Instructions = (struct pair_state_instruction*)_mesa_calloc( + sizeof(struct pair_state_instruction)*s.Program->NumInstructions); + s.ValuePool = (struct reg_value*)_mesa_calloc(sizeof(struct reg_value)*s.Program->NumInstructions*4); + s.ReaderPool = (struct reg_value_reader*)_mesa_calloc( + sizeof(struct reg_value_reader)*s.Program->NumInstructions*12); + + if (s.Debug) + _mesa_printf("Emit paired program\n"); + + scan_instructions(&s); + allocate_input_registers(&s); + + while(!s.Error && + (s.ReadyTEX || s.ReadyRGB || s.ReadyAlpha || s.ReadyFullALU)) { + if (s.ReadyTEX) + emit_all_tex(&s); + + while(s.ReadyFullALU || s.ReadyRGB || s.ReadyAlpha) + emit_alu(&s); + } + + if (s.Debug) + _mesa_printf(" END\n"); + + _mesa_free(s.Instructions); + _mesa_free(s.ValuePool); + _mesa_free(s.ReaderPool); + + return !s.Error; +} + + +static void print_pair_src(int i, struct radeon_pair_instruction_source* src) +{ + _mesa_printf(" Src%i = %s[%i]", i, src->Constant ? "CNST" : "TEMP", src->Index); +} + +static const char* opcode_string(GLuint opcode) +{ + if (opcode == OPCODE_REPL_ALPHA) + return "SOP"; + else + return _mesa_opcode_string(opcode); +} + +static int num_pairinst_args(GLuint opcode) +{ + if (opcode == OPCODE_REPL_ALPHA) + return 0; + else + return _mesa_num_inst_src_regs(opcode); +} + +static char swizzle_char(GLuint swz) +{ + switch(swz) { + case SWIZZLE_X: return 'x'; + case SWIZZLE_Y: return 'y'; + case SWIZZLE_Z: return 'z'; + case SWIZZLE_W: return 'w'; + case SWIZZLE_ZERO: return '0'; + case SWIZZLE_ONE: return '1'; + case SWIZZLE_NIL: return '_'; + default: return '?'; + } +} + +void radeonPrintPairInstruction(struct radeon_pair_instruction *inst) +{ + int nargs; + int i; + + _mesa_printf(" RGB: "); + for(i = 0; i < 3; ++i) { + if (inst->RGB.Src[i].Used) + print_pair_src(i, inst->RGB.Src + i); + } + _mesa_printf("\n"); + _mesa_printf(" Alpha:"); + for(i = 0; i < 3; ++i) { + if (inst->Alpha.Src[i].Used) + print_pair_src(i, inst->Alpha.Src + i); + } + _mesa_printf("\n"); + + _mesa_printf(" %s%s", opcode_string(inst->RGB.Opcode), inst->RGB.Saturate ? "_SAT" : ""); + if (inst->RGB.WriteMask) + _mesa_printf(" TEMP[%i].%s%s%s", inst->RGB.DestIndex, + (inst->RGB.WriteMask & 1) ? "x" : "", + (inst->RGB.WriteMask & 2) ? "y" : "", + (inst->RGB.WriteMask & 4) ? "z" : ""); + if (inst->RGB.OutputWriteMask) + _mesa_printf(" COLOR.%s%s%s", + (inst->RGB.OutputWriteMask & 1) ? "x" : "", + (inst->RGB.OutputWriteMask & 2) ? "y" : "", + (inst->RGB.OutputWriteMask & 4) ? "z" : ""); + nargs = num_pairinst_args(inst->RGB.Opcode); + for(i = 0; i < nargs; ++i) { + const char* abs = inst->RGB.Arg[i].Abs ? "|" : ""; + const char* neg = inst->RGB.Arg[i].Negate ? "-" : ""; + _mesa_printf(", %s%sSrc%i.%c%c%c%s", neg, abs, inst->RGB.Arg[i].Source, + swizzle_char(GET_SWZ(inst->RGB.Arg[i].Swizzle, 0)), + swizzle_char(GET_SWZ(inst->RGB.Arg[i].Swizzle, 1)), + swizzle_char(GET_SWZ(inst->RGB.Arg[i].Swizzle, 2)), + abs); + } + _mesa_printf("\n"); + + _mesa_printf(" %s%s", opcode_string(inst->Alpha.Opcode), inst->Alpha.Saturate ? "_SAT" : ""); + if (inst->Alpha.WriteMask) + _mesa_printf(" TEMP[%i].w", inst->Alpha.DestIndex); + if (inst->Alpha.OutputWriteMask) + _mesa_printf(" COLOR.w"); + if (inst->Alpha.DepthWriteMask) + _mesa_printf(" DEPTH.w"); + nargs = num_pairinst_args(inst->Alpha.Opcode); + for(i = 0; i < nargs; ++i) { + const char* abs = inst->Alpha.Arg[i].Abs ? "|" : ""; + const char* neg = inst->Alpha.Arg[i].Negate ? "-" : ""; + _mesa_printf(", %s%sSrc%i.%c%s", neg, abs, inst->Alpha.Arg[i].Source, + swizzle_char(inst->Alpha.Arg[i].Swizzle), abs); + } + _mesa_printf("\n"); +} diff --git a/src/mesa/drivers/dri/r300/radeon_program_pair.h b/src/mesa/drivers/dri/r300/radeon_program_pair.h new file mode 100644 index 00000000000..b2bdd08d27c --- /dev/null +++ b/src/mesa/drivers/dri/r300/radeon_program_pair.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2008 Nicolai Haehnle. + * + * 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 (including the + * next paragraph) 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 COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS 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. + * + */ + +#ifndef __RADEON_PROGRAM_PAIR_H_ +#define __RADEON_PROGRAM_PAIR_H_ + +#include "radeon_program.h" + + +/** + * Represents a paired instruction, as found in R300 and R500 + * fragment programs. + */ +struct radeon_pair_instruction_source { + GLuint Index:8; + GLuint Constant:1; + GLuint Used:1; +}; + +struct radeon_pair_instruction_rgb { + GLuint Opcode:8; + GLuint DestIndex:8; + GLuint WriteMask:3; + GLuint OutputWriteMask:3; + GLuint Saturate:1; + + struct radeon_pair_instruction_source Src[3]; + + struct { + GLuint Source:2; + GLuint Swizzle:9; + GLuint Abs:1; + GLuint Negate:1; + } Arg[3]; +}; + +struct radeon_pair_instruction_alpha { + GLuint Opcode:8; + GLuint DestIndex:8; + GLuint WriteMask:1; + GLuint OutputWriteMask:1; + GLuint DepthWriteMask:1; + GLuint Saturate:1; + + struct radeon_pair_instruction_source Src[3]; + + struct { + GLuint Source:2; + GLuint Swizzle:3; + GLuint Abs:1; + GLuint Negate:1; + } Arg[3]; +}; + +struct radeon_pair_instruction { + struct radeon_pair_instruction_rgb RGB; + struct radeon_pair_instruction_alpha Alpha; +}; + + +/** + * + */ +struct radeon_pair_handler { + /** + * Fill in the proper hardware index for the given constant register. + * + * @return GL_FALSE on error. + */ + GLboolean (*EmitConst)(void*, GLuint file, GLuint index, GLuint *hwindex); + + /** + * Write a paired instruction to the hardware. + * + * @return GL_FALSE on error. + */ + GLboolean (*EmitPaired)(void*, struct radeon_pair_instruction*); + + /** + * Write a texture instruction to the hardware. + * Register indices have already been rewritten to the allocated + * hardware register numbers. + * + * @return GL_FALSE on error. + */ + GLboolean (*EmitTex)(void*, struct prog_instruction*); + + /** + * Called after a block of contiguous, independent texture + * instructions has been emitted. + */ + void (*EndTexBlock)(void*); + + GLuint MaxHwTemps; +}; + +GLboolean radeonPairProgram(GLcontext *ctx, struct gl_program *program, + const struct radeon_pair_handler*, void *userdata); + +void radeonPrintPairInstruction(struct radeon_pair_instruction *inst); + +#endif /* __RADEON_PROGRAM_PAIR_H_ */ -- cgit v1.2.3 From 11d711df360265f25dc5a96cc3a4c5a2d34f5b64 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 12 Jul 2008 01:19:19 +0200 Subject: r300: Explicitly set absolute value for the argument of RSQ This fixes the last r500 bug related to glean/fragProg1. --- src/mesa/drivers/dri/r300/radeon_program_alu.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.c b/src/mesa/drivers/dri/r300/radeon_program_alu.c index 8daa94c7268..f06ebfcdbf9 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.c @@ -153,6 +153,7 @@ static struct prog_src_register absolute(struct prog_src_register reg) { struct prog_src_register newreg = reg; newreg.Abs = 1; + newreg.NegateBase = 0; newreg.NegateAbs = 0; return newreg; } @@ -343,6 +344,12 @@ static void transform_POW(struct radeon_transform_context* t, emit1(t->Program, OPCODE_EX2, inst->DstReg, tempsrc); } +static void transform_RSQ(struct radeon_transform_context* t, + struct prog_instruction* inst) +{ + emit1(t->Program, OPCODE_RSQ, inst->DstReg, absolute(inst->SrcReg[0])); +} + static void transform_SGE(struct radeon_transform_context* t, struct prog_instruction* inst) { @@ -397,6 +404,9 @@ static void transform_XPD(struct radeon_transform_context* t, * using: * MOV, ADD, MUL, MAD, FRC, DP3, LG2, EX2, CMP * + * Transforms RSQ to Radeon's native RSQ by explicitly setting + * absolute value. + * * @note should be applicable to R300 and R500 fragment programs. */ GLboolean radeonTransformALU(struct radeon_transform_context* t, @@ -411,6 +421,7 @@ GLboolean radeonTransformALU(struct radeon_transform_context* t, case OPCODE_LIT: transform_LIT(t, inst); return GL_TRUE; case OPCODE_LRP: transform_LRP(t, inst); return GL_TRUE; case OPCODE_POW: transform_POW(t, inst); return GL_TRUE; + case OPCODE_RSQ: transform_RSQ(t, inst); return GL_TRUE; case OPCODE_SGE: transform_SGE(t, inst); return GL_TRUE; case OPCODE_SLT: transform_SLT(t, inst); return GL_TRUE; case OPCODE_SUB: transform_SUB(t, inst); return GL_TRUE; -- cgit v1.2.3 From 8774fcd89acc9e180e0cb135bd62646f58cb623e Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 12 Jul 2008 11:11:59 +0200 Subject: r300: Fix input register allocation in radeon_program_pair When an input is marked in gl_program.InputsRead but is not actually read in the final program (due to dead-code elimination or whatever), the order of input registers must still match gl_program.InputsRead. This is done even more explicitly now. --- src/mesa/drivers/dri/r300/radeon_program_pair.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/mesa/drivers/dri/r300/radeon_program_pair.c b/src/mesa/drivers/dri/r300/radeon_program_pair.c index 86180edcb5e..4eaac50412e 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_pair.c +++ b/src/mesa/drivers/dri/r300/radeon_program_pair.c @@ -167,6 +167,15 @@ static struct pair_register_translation *get_register(struct pair_state *s, GLui } } +static void alloc_hw_reg(struct pair_state *s, GLuint file, GLuint index, GLuint hwindex) +{ + struct pair_register_translation *t = get_register(s, file, index); + ASSERT(!s->HwTemps[hwindex].RefCount); + ASSERT(!t->Allocated); + s->HwTemps[hwindex].RefCount = t->RefCount; + t->Allocated = 1; + t->HwIndex = hwindex; +} static GLuint get_hw_reg(struct pair_state *s, GLuint file, GLuint index) { @@ -190,9 +199,7 @@ static GLuint get_hw_reg(struct pair_state *s, GLuint file, GLuint index) return 0; } - s->HwTemps[hwindex].RefCount = t->RefCount; - t->Allocated = 1; - t->HwIndex = hwindex; + alloc_hw_reg(s, file, index, hwindex); return hwindex; } @@ -430,27 +437,28 @@ static void allocate_input_registers(struct pair_state *s) { GLuint InputsRead = s->Program->InputsRead; int i; + GLuint hwindex = 0; /* Texcoords come first */ for (i = 0; i < s->Ctx->Const.MaxTextureUnits; i++) { if (InputsRead & (FRAG_BIT_TEX0 << i)) - get_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_TEX0+i); + alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_TEX0+i, hwindex++); } InputsRead &= ~FRAG_BITS_TEX_ANY; /* fragment position treated as a texcoord */ if (InputsRead & FRAG_BIT_WPOS) - get_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_WPOS); + alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_WPOS, hwindex++); InputsRead &= ~FRAG_BIT_WPOS; /* Then primary colour */ if (InputsRead & FRAG_BIT_COL0) - get_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL0); + alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL0, hwindex++); InputsRead &= ~FRAG_BIT_COL0; /* Secondary color */ if (InputsRead & FRAG_BIT_COL1) - get_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL1); + alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL1, hwindex++); InputsRead &= ~FRAG_BIT_COL1; /* Anything else */ -- cgit v1.2.3 From cf0ae102dbc34bf75e853c2ece630fe18dd4d41e Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 12 Jul 2008 12:04:28 +0200 Subject: r500: Set Saturate correctly in radeon_program_pair --- src/mesa/drivers/dri/r300/radeon_program_pair.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/r300/radeon_program_pair.c b/src/mesa/drivers/dri/r300/radeon_program_pair.c index 4eaac50412e..85ddf1dc50e 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_pair.c +++ b/src/mesa/drivers/dri/r300/radeon_program_pair.c @@ -682,9 +682,14 @@ static GLboolean fill_instruction_into_pair(struct pair_state *s, struct radeon_ pair->RGB.Opcode = OPCODE_REPL_ALPHA; else pair->RGB.Opcode = inst->Opcode; + if (inst->SaturateMode == SATURATE_ZERO_ONE) + pair->RGB.Saturate = 1; } - if (pairinst->NeedAlpha) + if (pairinst->NeedAlpha) { pair->Alpha.Opcode = inst->Opcode; + if (inst->SaturateMode == SATURATE_ZERO_ONE) + pair->Alpha.Saturate = 1; + } int nargs = _mesa_num_inst_src_regs(inst->Opcode); int i; -- cgit v1.2.3 From 2d766923c45b544cca17c7fefe625715cf1fd1fe Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 12 Jul 2008 12:20:28 +0200 Subject: r300: Fix saturate mode handling in radeon_program_alu --- src/mesa/drivers/dri/r300/radeon_program_alu.c | 110 ++++++++++++++----------- 1 file changed, 60 insertions(+), 50 deletions(-) diff --git a/src/mesa/drivers/dri/r300/radeon_program_alu.c b/src/mesa/drivers/dri/r300/radeon_program_alu.c index f06ebfcdbf9..e0a2bd0e934 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/radeon_program_alu.c @@ -39,24 +39,26 @@ static struct prog_instruction *emit1(struct gl_program* p, - gl_inst_opcode Opcode, struct prog_dst_register DstReg, + gl_inst_opcode Opcode, GLuint Saturate, struct prog_dst_register DstReg, struct prog_src_register SrcReg) { struct prog_instruction *fpi = radeonAppendInstructions(p, 1); fpi->Opcode = Opcode; + fpi->SaturateMode = Saturate; fpi->DstReg = DstReg; fpi->SrcReg[0] = SrcReg; return fpi; } static struct prog_instruction *emit2(struct gl_program* p, - gl_inst_opcode Opcode, struct prog_dst_register DstReg, + gl_inst_opcode Opcode, GLuint Saturate, struct prog_dst_register DstReg, struct prog_src_register SrcReg0, struct prog_src_register SrcReg1) { struct prog_instruction *fpi = radeonAppendInstructions(p, 1); fpi->Opcode = Opcode; + fpi->SaturateMode = Saturate; fpi->DstReg = DstReg; fpi->SrcReg[0] = SrcReg0; fpi->SrcReg[1] = SrcReg1; @@ -64,13 +66,14 @@ static struct prog_instruction *emit2(struct gl_program* p, } static struct prog_instruction *emit3(struct gl_program* p, - gl_inst_opcode Opcode, struct prog_dst_register DstReg, + gl_inst_opcode Opcode, GLuint Saturate, struct prog_dst_register DstReg, struct prog_src_register SrcReg0, struct prog_src_register SrcReg1, struct prog_src_register SrcReg2) { struct prog_instruction *fpi = radeonAppendInstructions(p, 1); fpi->Opcode = Opcode; + fpi->SaturateMode = Saturate; fpi->DstReg = DstReg; fpi->SrcReg[0] = SrcReg0; fpi->SrcReg[1] = SrcReg1; @@ -188,7 +191,7 @@ static void transform_ABS(struct radeon_transform_context* t, src.Abs = 1; src.NegateBase = 0; src.NegateAbs = 0; - emit1(t->Program, OPCODE_MOV, inst->DstReg, src); + emit1(t->Program, OPCODE_MOV, inst->SaturateMode, inst->DstReg, src); } static void transform_DPH(struct radeon_transform_context* t, @@ -198,7 +201,7 @@ static void transform_DPH(struct radeon_transform_context* t, if (src0.NegateAbs) { if (src0.Abs) { int tempreg = radeonFindFreeTemporary(t); - emit1(t->Program, OPCODE_MOV, dstreg(PROGRAM_TEMPORARY, tempreg), src0); + emit1(t->Program, OPCODE_MOV, 0, dstreg(PROGRAM_TEMPORARY, tempreg), src0); src0 = srcreg(src0.File, src0.Index); } else { src0.NegateAbs = 0; @@ -207,7 +210,7 @@ static void transform_DPH(struct radeon_transform_context* t, } set_swizzle(&src0, 3, SWIZZLE_ONE); set_negate_base(&src0, 3, 0); - emit2(t->Program, OPCODE_DP4, inst->DstReg, src0, inst->SrcReg[1]); + emit2(t->Program, OPCODE_DP4, inst->SaturateMode, inst->DstReg, src0, inst->SrcReg[1]); } /** @@ -217,7 +220,7 @@ static void transform_DPH(struct radeon_transform_context* t, static void transform_DST(struct radeon_transform_context* t, struct prog_instruction* inst) { - emit2(t->Program, OPCODE_MUL, inst->DstReg, + emit2(t->Program, OPCODE_MUL, inst->SaturateMode, inst->DstReg, swizzle(inst->SrcReg[0], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE), swizzle(inst->SrcReg[1], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_ONE, SWIZZLE_W)); } @@ -226,8 +229,9 @@ static void transform_FLR(struct radeon_transform_context* t, struct prog_instruction* inst) { int tempreg = radeonFindFreeTemporary(t); - emit1(t->Program, OPCODE_FRC, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0]); - emit2(t->Program, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg))); + emit1(t->Program, OPCODE_FRC, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0]); + emit2(t->Program, OPCODE_ADD, inst->SaturateMode, inst->DstReg, + inst->SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg))); } /** @@ -279,42 +283,42 @@ static void transform_LIT(struct radeon_transform_context* t, // tmp.x = max(0.0, Src.x); // tmp.y = max(0.0, Src.y); // tmp.w = clamp(Src.z, -128+eps, 128-eps); - emit2(t->Program, OPCODE_MAX, + emit2(t->Program, OPCODE_MAX, 0, dstregtmpmask(temp, WRITEMASK_XYW), inst->SrcReg[0], swizzle(srcreg(PROGRAM_CONSTANT, constant), SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO, constant_swizzle&3)); - emit2(t->Program, OPCODE_MIN, + emit2(t->Program, OPCODE_MIN, 0, dstregtmpmask(temp, WRITEMASK_Z), swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), negate(srcregswz(PROGRAM_CONSTANT, constant, constant_swizzle))); // tmp.w = Pow(tmp.y, tmp.w) - emit1(t->Program, OPCODE_LG2, + emit1(t->Program, OPCODE_LG2, 0, dstregtmpmask(temp, WRITEMASK_W), swizzle(srctemp, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y)); - emit2(t->Program, OPCODE_MUL, + emit2(t->Program, OPCODE_MUL, 0, dstregtmpmask(temp, WRITEMASK_W), swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), swizzle(srctemp, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)); - emit1(t->Program, OPCODE_EX2, + emit1(t->Program, OPCODE_EX2, 0, dstregtmpmask(temp, WRITEMASK_W), swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)); // tmp.z = (tmp.x > 0) ? tmp.w : 0.0 - emit3(t->Program, OPCODE_CMP, + emit3(t->Program, OPCODE_CMP, inst->SaturateMode, dstregtmpmask(temp, WRITEMASK_Z), negate(swizzle(srctemp, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)), swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), builtin_zero); // tmp.x, tmp.y, tmp.w = 1.0, tmp.x, 1.0 - emit1(t->Program, OPCODE_MOV, + emit1(t->Program, OPCODE_MOV, inst->SaturateMode, dstregtmpmask(temp, WRITEMASK_XYW), swizzle(srctemp, SWIZZLE_ONE, SWIZZLE_X, SWIZZLE_ONE, SWIZZLE_ONE)); if (needTemporary) - emit1(t->Program, OPCODE_MOV, inst->DstReg, srctemp); + emit1(t->Program, OPCODE_MOV, 0, inst->DstReg, srctemp); } static void transform_LRP(struct radeon_transform_context* t, @@ -322,10 +326,10 @@ static void transform_LRP(struct radeon_transform_context* t, { int tempreg = radeonFindFreeTemporary(t); - emit2(t->Program, OPCODE_ADD, + emit2(t->Program, OPCODE_ADD, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[1], negate(inst->SrcReg[2])); - emit3(t->Program, OPCODE_MAD, + emit3(t->Program, OPCODE_MAD, inst->SaturateMode, inst->DstReg, inst->SrcReg[0], srcreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[2]); } @@ -339,15 +343,15 @@ static void transform_POW(struct radeon_transform_context* t, tempdst.WriteMask = WRITEMASK_W; tempsrc.Swizzle = SWIZZLE_WWWW; - emit1(t->Program, OPCODE_LG2, tempdst, scalar(inst->SrcReg[0])); - emit2(t->Program, OPCODE_MUL, tempdst, tempsrc, scalar(inst->SrcReg[1])); - emit1(t->Program, OPCODE_EX2, inst->DstReg, tempsrc); + emit1(t->Program, OPCODE_LG2, 0, tempdst, scalar(inst->SrcReg[0])); + emit2(t->Program, OPCODE_MUL, 0, tempdst, tempsrc, scalar(inst->SrcReg[1])); + emit1(t->Program, OPCODE_EX2, inst->SaturateMode, inst->DstReg, tempsrc); } static void transform_RSQ(struct radeon_transform_context* t, struct prog_instruction* inst) { - emit1(t->Program, OPCODE_RSQ, inst->DstReg, absolute(inst->SrcReg[0])); + emit1(t->Program, OPCODE_RSQ, inst->SaturateMode, inst->DstReg, absolute(inst->SrcReg[0])); } static void transform_SGE(struct radeon_transform_context* t, @@ -355,8 +359,9 @@ static void transform_SGE(struct radeon_transform_context* t, { int tempreg = radeonFindFreeTemporary(t); - emit2(t->Program, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); - emit3(t->Program, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_zero, builtin_one); + emit2(t->Program, OPCODE_ADD, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); + emit3(t->Program, OPCODE_CMP, inst->SaturateMode, inst->DstReg, + srcreg(PROGRAM_TEMPORARY, tempreg), builtin_zero, builtin_one); } static void transform_SLT(struct radeon_transform_context* t, @@ -364,20 +369,21 @@ static void transform_SLT(struct radeon_transform_context* t, { int tempreg = radeonFindFreeTemporary(t); - emit2(t->Program, OPCODE_ADD, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); - emit3(t->Program, OPCODE_CMP, inst->DstReg, srcreg(PROGRAM_TEMPORARY, tempreg), builtin_one, builtin_zero); + emit2(t->Program, OPCODE_ADD, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1])); + emit3(t->Program, OPCODE_CMP, inst->SaturateMode, inst->DstReg, + srcreg(PROGRAM_TEMPORARY, tempreg), builtin_one, builtin_zero); } static void transform_SUB(struct radeon_transform_context* t, struct prog_instruction* inst) { - emit2(t->Program, OPCODE_ADD, inst->DstReg, inst->SrcReg[0], negate(inst->SrcReg[1])); + emit2(t->Program, OPCODE_ADD, inst->SaturateMode, inst->DstReg, inst->SrcReg[0], negate(inst->SrcReg[1])); } static void transform_SWZ(struct radeon_transform_context* t, struct prog_instruction* inst) { - emit1(t->Program, OPCODE_MOV, inst->DstReg, inst->SrcReg[0]); + emit1(t->Program, OPCODE_MOV, inst->SaturateMode, inst->DstReg, inst->SrcReg[0]); } static void transform_XPD(struct radeon_transform_context* t, @@ -385,10 +391,10 @@ static void transform_XPD(struct radeon_transform_context* t, { int tempreg = radeonFindFreeTemporary(t); - emit2(t->Program, OPCODE_MUL, dstreg(PROGRAM_TEMPORARY, tempreg), + emit2(t->Program, OPCODE_MUL, 0, dstreg(PROGRAM_TEMPORARY, tempreg), swizzle(inst->SrcReg[0], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W), swizzle(inst->SrcReg[1], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W)); - emit3(t->Program, OPCODE_MAD, inst->DstReg, + emit3(t->Program, OPCODE_MAD, inst->SaturateMode, inst->DstReg, swizzle(inst->SrcReg[0], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W), swizzle(inst->SrcReg[1], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W), negate(srcreg(PROGRAM_TEMPORARY, tempreg))); @@ -471,18 +477,18 @@ static void sin_approx(struct radeon_transform_context* t, { GLuint tempreg = radeonFindFreeTemporary(t); - emit2(t->Program, OPCODE_MUL, dstregtmpmask(tempreg, WRITEMASK_XY), + emit2(t->Program, OPCODE_MUL, 0, dstregtmpmask(tempreg, WRITEMASK_XY), swizzle(src, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), srcreg(PROGRAM_CONSTANT, constants[0])); - emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_X), + emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_X), swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y), absolute(swizzle(src, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)), swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)); - emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_Y), + emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_Y), swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), absolute(swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)), negate(swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X))); - emit3(t->Program, OPCODE_MAD, dst, + emit3(t->Program, OPCODE_MAD, 0, dst, swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y), swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)); @@ -511,13 +517,13 @@ GLboolean radeonTransformTrigSimple(struct radeon_transform_context* t, // MAD tmp.x, src, 1/(2*PI), 0.75 // FRC tmp.x, tmp.x // MAD tmp.z, tmp.x, 2*PI, -PI - emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_W), + emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W), swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z), swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)); - emit1(t->Program, OPCODE_FRC, dstregtmpmask(tempreg, WRITEMASK_W), + emit1(t->Program, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_W), swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)); - emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_W), + emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W), swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z))); @@ -526,13 +532,13 @@ GLboolean radeonTransformTrigSimple(struct radeon_transform_context* t, swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), constants); } else if (inst->Opcode == OPCODE_SIN) { - emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_W), + emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W), swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z), swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y)); - emit1(t->Program, OPCODE_FRC, dstregtmpmask(tempreg, WRITEMASK_W), + emit1(t->Program, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_W), swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)); - emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_W), + emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W), swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z))); @@ -541,13 +547,13 @@ GLboolean radeonTransformTrigSimple(struct radeon_transform_context* t, swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), constants); } else { - emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_XY), + emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_XY), swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z), swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W)); - emit1(t->Program, OPCODE_FRC, dstregtmpmask(tempreg, WRITEMASK_XY), + emit1(t->Program, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_XY), srcreg(PROGRAM_TEMPORARY, tempreg)); - emit3(t->Program, OPCODE_MAD, dstregtmpmask(tempreg, WRITEMASK_XY), + emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_XY), srcreg(PROGRAM_TEMPORARY, tempreg), swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W), negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z))); @@ -594,26 +600,30 @@ GLboolean radeonTransformTrigScale(struct radeon_transform_context* t, temp = radeonFindFreeTemporary(t); constant = _mesa_add_unnamed_constant(t->Program->Parameters, RCP_2PI, 1, &constant_swizzle); - emit2(t->Program, OPCODE_MUL, dstregtmpmask(temp, WRITEMASK_W), + emit2(t->Program, OPCODE_MUL, 0, dstregtmpmask(temp, WRITEMASK_W), swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X), srcregswz(PROGRAM_CONSTANT, constant, constant_swizzle)); - emit1(t->Program, OPCODE_FRC, dstregtmpmask(temp, WRITEMASK_W), + emit1(t->Program, OPCODE_FRC, 0, dstregtmpmask(temp, WRITEMASK_W), srcreg(PROGRAM_TEMPORARY, temp)); if (inst->Opcode == OPCODE_COS) { - emit1(t->Program, OPCODE_COS, inst->DstReg, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); + emit1(t->Program, OPCODE_COS, inst->SaturateMode, inst->DstReg, + srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); } else if (inst->Opcode == OPCODE_SIN) { - emit1(t->Program, OPCODE_SIN, inst->DstReg, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); + emit1(t->Program, OPCODE_SIN, inst->SaturateMode, + inst->DstReg, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); } else if (inst->Opcode == OPCODE_SCS) { struct prog_dst_register moddst = inst->DstReg; if (inst->DstReg.WriteMask & WRITEMASK_X) { moddst.WriteMask = WRITEMASK_X; - emit1(t->Program, OPCODE_COS, moddst, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); + emit1(t->Program, OPCODE_COS, inst->SaturateMode, moddst, + srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); } if (inst->DstReg.WriteMask & WRITEMASK_Y) { moddst.WriteMask = WRITEMASK_Y; - emit1(t->Program, OPCODE_SIN, moddst, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); + emit1(t->Program, OPCODE_SIN, inst->SaturateMode, moddst, + srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW)); } } -- cgit v1.2.3 From bfb27b5fc020437d95b1185f0fce850209744d92 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Mon, 30 Jun 2008 09:40:30 -0700 Subject: autoconf: Subsitute SHELL for all platforms Establish the shell that make will use from configure. This is exactly how autoconf/automake operate, with the environment variable CONFIG_SHELL respected to override the autoconf checks. In the usual case where the user just executes `./configure', autoconf will pick a shell from the current shell, sh, bash, ksh or sh5 that meets its base criteria. The special Solaris case of looking for a POSIX shell has been changed to just set the SHELL variable since autoconf substitutes this already. The EXTRA_CONFIG_LINES substitution is dropped as it should no longer be needed. --- configs/autoconf.in | 4 +--- configure.ac | 8 +++----- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/configs/autoconf.in b/configs/autoconf.in index 21d224fb329..d22c2c51839 100644 --- a/configs/autoconf.in +++ b/configs/autoconf.in @@ -27,6 +27,7 @@ ASM_API = @ASM_API@ # Misc tools and flags MAKE = @MAKE@ +SHELL = @SHELL@ MKLIB_OPTIONS = @MKLIB_OPTIONS@ MKDEP = @MKDEP@ MKDEP_OPTIONS = @MKDEP_OPTIONS@ @@ -101,6 +102,3 @@ DRI_DRIVER_INSTALL_DIR = @DRI_DRIVER_INSTALL_DIR@ # Where libGL will look for DRI hardware drivers DRI_DRIVER_SEARCH_DIR = $(DRI_DRIVER_INSTALL_DIR) - -# Additional per-platform configuration settings -@EXTRA_CONFIG_LINES@ diff --git a/configure.ac b/configure.ac index ec8b5ddbc75..acb29e44686 100644 --- a/configure.ac +++ b/configure.ac @@ -33,18 +33,16 @@ AC_CHECK_PROGS([MAKE], [gmake make]) AC_PATH_PROG([MKDEP], [makedepend]) AC_PATH_PROG([SED], [sed]) -dnl Platform-specific program settings -EXTRA_CONFIG_LINES="" -AC_SUBST([EXTRA_CONFIG_LINES]) +dnl We need a POSIX shell for parts of the build. Assume we have one +dnl in most cases. case "$host_os" in solaris*) # Solaris /bin/sh is too old/non-POSIX compliant AC_PATH_PROGS(POSIX_SHELL, [ksh93 ksh sh]) - EXTRA_CONFIG_LINES="SHELL=$POSIX_SHELL" + SHELL="$POSIX_SHELL" ;; esac - MKDEP_OPTIONS=-fdepend dnl Ask gcc where it's keeping its secret headers if test "x$GCC" = xyes; then -- cgit v1.2.3 From 9eee7f260f4474f9eea7384b94619b3f7fee017b Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Tue, 8 Jul 2008 07:44:58 -0700 Subject: Set $(SHELL) for all configs Most make implementations will use /bin/sh as the interpreter for commands and only use a different shell when the $(SHELL) make variable is set. This makes the setting explicit and allows $(SHELL) to be used in the commands themselves. --- configs/default | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/default b/configs/default index d5b40c5cd0c..5193c1442d9 100644 --- a/configs/default +++ b/configs/default @@ -25,6 +25,7 @@ LDFLAGS = GLU_CFLAGS = # Misc tools and flags +SHELL = /bin/sh MKLIB_OPTIONS = MKDEP = makedepend MKDEP_OPTIONS = -fdepend -- cgit v1.2.3 From 4f5d97ee9eae6f2adf27e2297f955b601483d61b Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Tue, 8 Jul 2008 07:49:31 -0700 Subject: Call minstall with $(SHELL) so the user controls the interpreter Running minstall directly means that /bin/sh is always used as hte interpreter. If the user needs or wants to use a different shell fo minstall, they can use the SHELL make variable. --- configs/autoconf.in | 1 - configs/default | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/configs/autoconf.in b/configs/autoconf.in index d22c2c51839..8ed1c93d11a 100644 --- a/configs/autoconf.in +++ b/configs/autoconf.in @@ -31,7 +31,6 @@ SHELL = @SHELL@ MKLIB_OPTIONS = @MKLIB_OPTIONS@ MKDEP = @MKDEP@ MKDEP_OPTIONS = @MKDEP_OPTIONS@ -INSTALL = $(TOP)/bin/minstall # Python and flags (generally only needed by the developers) PYTHON2 = python diff --git a/configs/default b/configs/default index 5193c1442d9..6c2594b6a9c 100644 --- a/configs/default +++ b/configs/default @@ -30,7 +30,7 @@ MKLIB_OPTIONS = MKDEP = makedepend MKDEP_OPTIONS = -fdepend MAKE = make -INSTALL = $(TOP)/bin/minstall +INSTALL = $(SHELL) $(TOP)/bin/minstall # Tools for regenerating glapi (generally only needed by the developers) PYTHON2 = python -- cgit v1.2.3 From db072baaaf6adcd176ea7e4d67b77177de7eca31 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Fri, 11 Jul 2008 13:54:48 -0700 Subject: Call mklib with $(SHELL) so the user controls the interpreter Respect the user's choice of shell when running mklib rather than always using /bin/sh. --- configs/default | 1 + progs/tools/trace/Makefile | 4 ++-- src/egl/drivers/demo/Makefile | 2 +- src/egl/drivers/dri/Makefile | 2 +- src/egl/main/Makefile | 2 +- src/glu/mesa/Makefile | 2 +- src/glu/sgi/Makefile | 2 +- src/glut/beos/Makefile | 5 ++--- src/glut/directfb/Makefile | 2 +- src/glut/fbdev/Makefile | 2 +- src/glut/ggi/Makefile | 2 +- src/glut/glx/Makefile | 2 +- src/glut/mini/Makefile | 2 +- src/glw/Makefile | 2 +- src/glx/mini/Makefile | 2 +- src/glx/x11/Makefile | 2 +- src/mesa/Makefile | 4 ++-- src/mesa/drivers/beos/Makefile | 2 +- src/mesa/drivers/directfb/Makefile | 2 +- src/mesa/drivers/dri/Makefile.template | 2 +- src/mesa/drivers/fbdev/Makefile | 3 +-- src/mesa/drivers/osmesa/Makefile | 6 ++---- src/mesa/drivers/x11/Makefile | 3 +-- 23 files changed, 27 insertions(+), 31 deletions(-) diff --git a/configs/default b/configs/default index 6c2594b6a9c..a14078fa269 100644 --- a/configs/default +++ b/configs/default @@ -26,6 +26,7 @@ GLU_CFLAGS = # Misc tools and flags SHELL = /bin/sh +MKLIB = $(SHELL) $(TOP)/bin/mklib MKLIB_OPTIONS = MKDEP = makedepend MKDEP_OPTIONS = -fdepend diff --git a/progs/tools/trace/Makefile b/progs/tools/trace/Makefile index 4b05fd87a5f..b5dd90a6d04 100644 --- a/progs/tools/trace/Makefile +++ b/progs/tools/trace/Makefile @@ -16,8 +16,8 @@ TRACER = gltrace.so default: $(TRACER) $(TRACER): $(OBJECTS) - $(TOP)/bin/mklib -o $(TRACER) -noprefix -cplusplus \ - -ldflags '$(LDFLAGS)' $(MKLIB_OPTIONS) $(OBJECTS) + $(MKLIB) -o $(TRACER) -noprefix -cplusplus -ldflags '$(LDFLAGS)' \ + $(MKLIB_OPTIONS) $(OBJECTS) gltrace.cc: gltrace.py PYTHONPATH=$(TOP)/src/mesa/glapi python gltrace.py -f $(TOP)/src/mesa/glapi/gl_API.xml > gltrace.cc diff --git a/src/egl/drivers/demo/Makefile b/src/egl/drivers/demo/Makefile index 9653c8805cc..2afb116ea7d 100644 --- a/src/egl/drivers/demo/Makefile +++ b/src/egl/drivers/demo/Makefile @@ -21,7 +21,7 @@ default: $(TOP)/$(LIB_DIR)/demodriver.so $(TOP)/$(LIB_DIR)/demodriver.so: $(OBJECTS) - $(TOP)/bin/mklib -o demodriver.so -noprefix -ldflags '$(LDFLAGS)' \ + $(MKLIB) -o demodriver.so -noprefix -ldflags '$(LDFLAGS)' \ -install $(TOP)/$(LIB_DIR) $(OBJECTS) diff --git a/src/egl/drivers/dri/Makefile b/src/egl/drivers/dri/Makefile index 52d46cac564..28d33f698b3 100644 --- a/src/egl/drivers/dri/Makefile +++ b/src/egl/drivers/dri/Makefile @@ -42,7 +42,7 @@ default: depend library Makefile library: $(TOP)/$(LIB_DIR)/libEGLdri.so $(TOP)/$(LIB_DIR)/libEGLdri.so: $(OBJECTS) - $(TOP)/bin/mklib -o EGLdri -ldflags '$(LDFLAGS)' -major 1 -minor 0 \ + $(MKLIB) -o EGLdri -ldflags '$(LDFLAGS)' -major 1 -minor 0 \ -install $(TOP)/$(LIB_DIR) -ldl $(OBJECTS) diff --git a/src/egl/main/Makefile b/src/egl/main/Makefile index 52e16a76e3a..40732fe8ad6 100644 --- a/src/egl/main/Makefile +++ b/src/egl/main/Makefile @@ -46,7 +46,7 @@ default: depend library library: $(TOP)/$(LIB_DIR)/libEGL.so $(TOP)/$(LIB_DIR)/libEGL.so: $(OBJECTS) - $(TOP)/bin/mklib -o EGL -ldflags '$(LDFLAGS)' -major 1 -minor 0 \ + $(MKLIB) -o EGL -ldflags '$(LDFLAGS)' -major 1 -minor 0 \ -install $(TOP)/$(LIB_DIR) -ldl $(OBJECTS) diff --git a/src/glu/mesa/Makefile b/src/glu/mesa/Makefile index 1064bbd2d4f..c468ce62100 100644 --- a/src/glu/mesa/Makefile +++ b/src/glu/mesa/Makefile @@ -45,7 +45,7 @@ $(TOP)/$(LIB_DIR): # Make the library: $(TOP)/$(LIB_DIR)/$(GLU_LIB_NAME): $(OBJECTS) - @ $(TOP)/bin/mklib -o $(GLU_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + @ $(MKLIB) -o $(GLU_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(GLU_MAJOR) -minor $(GLU_MINOR) -patch $(GLU_TINY) \ $(MKLIB_OPTIONS) -install $(TOP)/$(LIB_DIR) \ $(GLU_LIB_DEPS) $(OBJECTS) diff --git a/src/glu/sgi/Makefile b/src/glu/sgi/Makefile index 207247ad87a..63eca5cbe77 100644 --- a/src/glu/sgi/Makefile +++ b/src/glu/sgi/Makefile @@ -136,7 +136,7 @@ $(TOP)/$(LIB_DIR): # Make the library: $(TOP)/$(LIB_DIR)/$(GLU_LIB_NAME): $(OBJECTS) - $(TOP)/bin/mklib -o $(GLU_LIB) -linker '$(CXX)' -ldflags '$(LDFLAGS)' \ + $(MKLIB) -o $(GLU_LIB) -linker '$(CXX)' -ldflags '$(LDFLAGS)' \ -major $(GLU_MAJOR) -minor $(GLU_MINOR) -patch $(GLU_TINY) \ -cplusplus $(MKLIB_OPTIONS) -install $(TOP)/$(LIB_DIR) \ $(GLU_LIB_DEPS) $(OBJECTS) diff --git a/src/glut/beos/Makefile b/src/glut/beos/Makefile index 165f43a6ce3..c67ace50c5d 100644 --- a/src/glut/beos/Makefile +++ b/src/glut/beos/Makefile @@ -83,10 +83,9 @@ $(TOP)/$(LIB_DIR): # Make the library $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS) - @$(TOP)/bin/mklib -o $(GLUT_LIB) -ldflags '$(LDFLAGS)' \ + @$(MKLIB) -o $(GLUT_LIB) -ldflags '$(LDFLAGS)' $(MKLIB_OPTIONS) \ -major $(GLUT_MAJOR) -minor $(GLUT_MINOR) -patch $(GLUT_TINY) \ - -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) $(GLUT_LIB_DEPS) \ - $(OBJECTS) + -install $(TOP)/$(LIB_DIR) $(GLUT_LIB_DEPS) $(OBJECTS) clean: -rm -f *.o diff --git a/src/glut/directfb/Makefile b/src/glut/directfb/Makefile index 36b0ea34ed5..34c3743ef45 100644 --- a/src/glut/directfb/Makefile +++ b/src/glut/directfb/Makefile @@ -61,7 +61,7 @@ default: depend $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME) # Make the library $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS) - $(TOP)/bin/mklib -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + $(MKLIB) -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(GLUT_MAJOR) -minor $(GLUT_MINOR) -patch $(GLUT_TINY) \ $(GLUT_LIB_DEPS) -install $(TOP)/$(LIB_DIR) \ $(MKLIB_OPTIONS) $(OBJECTS) diff --git a/src/glut/fbdev/Makefile b/src/glut/fbdev/Makefile index ff74a2898dd..4081ccec74e 100644 --- a/src/glut/fbdev/Makefile +++ b/src/glut/fbdev/Makefile @@ -63,7 +63,7 @@ default: depend $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME) # Make the library $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS) - $(TOP)/bin/mklib -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + $(MKLIB) -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(GLUT_MAJOR) -minor $(GLUT_MINOR) -patch $(GLUT_TINY) \ $(GLUT_LIB_DEPS) -install $(TOP)/$(LIB_DIR) \ $(MKLIB_OPTIONS) $(OBJECTS) diff --git a/src/glut/ggi/Makefile b/src/glut/ggi/Makefile index c8805c27c02..1ae1ba0d707 100644 --- a/src/glut/ggi/Makefile +++ b/src/glut/ggi/Makefile @@ -32,7 +32,7 @@ default: $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME) # Make the library $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS) - $(TOP)/bin/mklib -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + $(MKLIB) -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(GLUT_MAJOR) -minor $(GLUT_MINOR) \ -patch $(GLUT_TINY) $(MKLIB_OPTIONS) -install $(TOP)/$(LIB_DIR) \ $(GLUT_LIB_DEPS) $(OBJECTS) diff --git a/src/glut/glx/Makefile b/src/glut/glx/Makefile index 660ce8e4f52..307a6d22164 100644 --- a/src/glut/glx/Makefile +++ b/src/glut/glx/Makefile @@ -91,7 +91,7 @@ default: $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME) # Make the library $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS) - $(TOP)/bin/mklib -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + $(MKLIB) -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(GLUT_MAJOR) -minor $(GLUT_MINOR) -patch $(GLUT_TINY) \ $(MKLIB_OPTIONS) -install $(TOP)/$(LIB_DIR) \ $(GLUT_LIB_DEPS) $(OBJECTS) diff --git a/src/glut/mini/Makefile b/src/glut/mini/Makefile index 3b5a73e09ae..e47d09edb71 100644 --- a/src/glut/mini/Makefile +++ b/src/glut/mini/Makefile @@ -55,7 +55,7 @@ default: depend $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME) # Make the library $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS) - $(TOP)/bin/mklib -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + $(MKLIB) -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(GLUT_MAJOR) -minor $(GLUT_MINOR) -patch $(GLUT_TINY) \ $(GLUT_LIB_DEPS) -install $(TOP)/$(LIB_DIR) \ $(MKLIB_OPTIONS) $(OBJECTS) diff --git a/src/glw/Makefile b/src/glw/Makefile index 0c11a9d8385..a9a174508f5 100644 --- a/src/glw/Makefile +++ b/src/glw/Makefile @@ -49,7 +49,7 @@ clean: # Make the library $(TOP)/$(LIB_DIR)/$(GLW_LIB_NAME): $(OBJECTS) - $(TOP)/bin/mklib -o $(GLW_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + $(MKLIB) -o $(GLW_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(MAJOR) -minor $(MINOR) -patch $(TINY) \ $(MKLIB_OPTIONS) -install $(TOP)/$(LIB_DIR) \ $(GLW_LIB_DEPS) $(OBJECTS) diff --git a/src/glx/mini/Makefile b/src/glx/mini/Makefile index 69c3d683e8c..aabc1d2be30 100644 --- a/src/glx/mini/Makefile +++ b/src/glx/mini/Makefile @@ -49,7 +49,7 @@ default: depend $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) $(TOP)/$(LIB_DIR)/miniglx.conf # Make libGL $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(OBJECTS) Makefile - @ $(TOP)/bin/mklib -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + @ $(MKLIB) -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major 1 -minor 2 $(MKLIB_OPTIONS) \ -install $(TOP)/$(LIB_DIR) $(GL_LIB_DEPS) $(OBJECTS) \ $(LIBDRM_LIB) $(PCIACCESS_LIB) diff --git a/src/glx/x11/Makefile b/src/glx/x11/Makefile index c45c7de6d6d..121f3dfac00 100644 --- a/src/glx/x11/Makefile +++ b/src/glx/x11/Makefile @@ -71,7 +71,7 @@ default: depend $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) # Make libGL $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(OBJECTS) Makefile - $(TOP)/bin/mklib -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + $(MKLIB) -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major 1 -minor 2 $(MKLIB_OPTIONS) \ -install $(TOP)/$(LIB_DIR) $(GL_LIB_DEPS) $(OBJECTS) diff --git a/src/mesa/Makefile b/src/mesa/Makefile index bd3627b5eb5..605e70083c5 100644 --- a/src/mesa/Makefile +++ b/src/mesa/Makefile @@ -30,11 +30,11 @@ default: depend asm_subdirs libmesa.a libglapi.a driver_subdirs # Make archive of core mesa object files libmesa.a: $(MESA_OBJECTS) - @ $(TOP)/bin/mklib -o mesa -static $(MESA_OBJECTS) + @ $(MKLIB) -o mesa -static $(MESA_OBJECTS) # Make archive of gl* API dispatcher functions only libglapi.a: $(GLAPI_OBJECTS) - @ $(TOP)/bin/mklib -o glapi -static $(GLAPI_OBJECTS) + @ $(MKLIB) -o glapi -static $(GLAPI_OBJECTS) ###################################################################### diff --git a/src/mesa/drivers/beos/Makefile b/src/mesa/drivers/beos/Makefile index 342d7ce0243..f26264de8b6 100644 --- a/src/mesa/drivers/beos/Makefile +++ b/src/mesa/drivers/beos/Makefile @@ -181,7 +181,7 @@ $(TOP)/$(LIB_DIR): mkdir $(TOP)/$(LIB_DIR) $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(OBJECTS) $(MESA_MODULES) $(GLU_MODULES) - @$(TOP)/bin/mklib -o $(GL_LIB) -ldflags '$(LDFLAGS)' -install $(TOP)/$(LIB_DIR) \ + @$(MKLIB) -o $(GL_LIB) -ldflags '$(LDFLAGS)' -install $(TOP)/$(LIB_DIR) \ -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(MESA_TINY) \ $(MKLIB_OPTIONS) $(GL_LIB_DEPS) $(OBJECTS) $(MESA_MODULES) $(GLU_MODULES) diff --git a/src/mesa/drivers/directfb/Makefile b/src/mesa/drivers/directfb/Makefile index ece0457cffa..94c82a2c9c9 100644 --- a/src/mesa/drivers/directfb/Makefile +++ b/src/mesa/drivers/directfb/Makefile @@ -37,7 +37,7 @@ default: directfb-libgl directfbgl_mesa # XXX this used to be in src/mesa/Makefile and is probably broken now directfb-libgl: $(LIBS) - @ $(TOP)/bin/mklib -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + @ $(MKLIB) -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(MESA_TINY) \ -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) $(LIBS) \ $(GL_LIB_DEPS) diff --git a/src/mesa/drivers/dri/Makefile.template b/src/mesa/drivers/dri/Makefile.template index 07e181e2cd8..4d1b057fb0c 100644 --- a/src/mesa/drivers/dri/Makefile.template +++ b/src/mesa/drivers/dri/Makefile.template @@ -68,7 +68,7 @@ default: symlinks depend $(LIBNAME) $(TOP)/$(LIB_DIR)/$(LIBNAME) $(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile $(TOP)/src/mesa/drivers/dri/Makefile.template - $(TOP)/bin/mklib -ldflags '$(LDFLAGS)' -noprefix -o $@ \ + $(MKLIB) -ldflags '$(LDFLAGS)' -noprefix -o $@ \ $(OBJECTS) $(MESA_MODULES) $(WINOBJ) $(DRI_LIB_DEPS) diff --git a/src/mesa/drivers/fbdev/Makefile b/src/mesa/drivers/fbdev/Makefile index c0ef54f604f..ee73f29a46a 100644 --- a/src/mesa/drivers/fbdev/Makefile +++ b/src/mesa/drivers/fbdev/Makefile @@ -25,8 +25,7 @@ default: $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(CORE_MESA) $(OBJECTS) - @ $(TOP)/bin/mklib -o $(GL_LIB) \ - -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + @ $(MKLIB) -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(MESA_TINY) \ -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \ $(CORE_MESA) $(OBJECTS) $(GL_LIB_DEPS) diff --git a/src/mesa/drivers/osmesa/Makefile b/src/mesa/drivers/osmesa/Makefile index fa8dffcb3ef..97f2b25a149 100644 --- a/src/mesa/drivers/osmesa/Makefile +++ b/src/mesa/drivers/osmesa/Makefile @@ -45,8 +45,7 @@ default: osmesa8: $(TOP)/lib/$(OSMESA_LIB_NAME) $(TOP)/lib/$(OSMESA_LIB_NAME): $(OBJECTS) - $(TOP)/bin/mklib -o $(OSMESA_LIB) \ - -linker "$(CC)" \ + $(MKLIB) -o $(OSMESA_LIB) -linker "$(CC)" \ -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(MESA_TINY) \ -install $(TOP)/$(LIB_DIR) \ $(MKLIB_OPTIONS) \ @@ -58,8 +57,7 @@ $(TOP)/lib/$(OSMESA_LIB_NAME): $(OBJECTS) # The libOSMesa16/libOSMesa32 libraries do not use libGL but rather are built # with all the other Mesa sources (compiled with -DCHAN_BITS=16/32 osmesa16: $(OBJECTS) $(CORE_MESA) - $(TOP)/bin/mklib -o $(OSMESA_LIB) \ - -linker "$(CC)" \ + $(MKLIB) -o $(OSMESA_LIB) -linker "$(CC)" \ -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(MESA_TINY) \ -install $(TOP)/$(LIB_DIR) \ $(MKLIB_OPTIONS) \ diff --git a/src/mesa/drivers/x11/Makefile b/src/mesa/drivers/x11/Makefile index 51226eeae11..4c2493d7e29 100644 --- a/src/mesa/drivers/x11/Makefile +++ b/src/mesa/drivers/x11/Makefile @@ -55,8 +55,7 @@ default: $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(OBJECTS) $(CORE_MESA) - @ $(TOP)/bin/mklib -o $(GL_LIB) \ - -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + @ $(MKLIB) -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(GL_MAJOR) -minor $(GL_MINOR) -patch $(GL_TINY) \ -install $(TOP)/$(LIB_DIR) \ $(MKLIB_OPTIONS) $(GL_LIB_DEPS) $(OBJECTS) $(CORE_MESA) -- cgit v1.2.3 From 3b8081603bf846285e56a6ecafaf182935fd8733 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Sat, 12 Jul 2008 10:04:44 -0700 Subject: Always pass -linker and -ldflags to mklib for shared libraries This just makes the use of mklib more consistent throughout Mesa where we always want to pass the linker and LDFLAGS when we might be making a shared library. --- progs/tools/trace/Makefile | 4 ++-- src/egl/drivers/demo/Makefile | 5 +++-- src/egl/drivers/dri/Makefile | 3 ++- src/egl/main/Makefile | 3 ++- src/glut/beos/Makefile | 5 +++-- src/mesa/drivers/beos/Makefile | 5 +++-- src/mesa/drivers/dri/Makefile.template | 2 +- src/mesa/drivers/osmesa/Makefile | 10 ++++------ src/mesa/drivers/x11/Makefile | 4 ++-- 9 files changed, 22 insertions(+), 19 deletions(-) diff --git a/progs/tools/trace/Makefile b/progs/tools/trace/Makefile index b5dd90a6d04..822e466ad1b 100644 --- a/progs/tools/trace/Makefile +++ b/progs/tools/trace/Makefile @@ -16,8 +16,8 @@ TRACER = gltrace.so default: $(TRACER) $(TRACER): $(OBJECTS) - $(MKLIB) -o $(TRACER) -noprefix -cplusplus -ldflags '$(LDFLAGS)' \ - $(MKLIB_OPTIONS) $(OBJECTS) + $(MKLIB) -o $(TRACER) -noprefix -cplusplus -linker '$(CXX)' \ + -ldflags '$(LDFLAGS)' $(MKLIB_OPTIONS) $(OBJECTS) gltrace.cc: gltrace.py PYTHONPATH=$(TOP)/src/mesa/glapi python gltrace.py -f $(TOP)/src/mesa/glapi/gl_API.xml > gltrace.cc diff --git a/src/egl/drivers/demo/Makefile b/src/egl/drivers/demo/Makefile index 2afb116ea7d..6ca25aa5d65 100644 --- a/src/egl/drivers/demo/Makefile +++ b/src/egl/drivers/demo/Makefile @@ -21,8 +21,9 @@ default: $(TOP)/$(LIB_DIR)/demodriver.so $(TOP)/$(LIB_DIR)/demodriver.so: $(OBJECTS) - $(MKLIB) -o demodriver.so -noprefix -ldflags '$(LDFLAGS)' \ - -install $(TOP)/$(LIB_DIR) $(OBJECTS) + $(MKLIB) -o demodriver.so -noprefix -linker '$(CC)' \ + -ldflags '$(LDFLAGS)' -install $(TOP)/$(LIB_DIR) \ + $(OBJECTS) diff --git a/src/egl/drivers/dri/Makefile b/src/egl/drivers/dri/Makefile index 28d33f698b3..af0c40fe2b7 100644 --- a/src/egl/drivers/dri/Makefile +++ b/src/egl/drivers/dri/Makefile @@ -42,7 +42,8 @@ default: depend library Makefile library: $(TOP)/$(LIB_DIR)/libEGLdri.so $(TOP)/$(LIB_DIR)/libEGLdri.so: $(OBJECTS) - $(MKLIB) -o EGLdri -ldflags '$(LDFLAGS)' -major 1 -minor 0 \ + $(MKLIB) -o EGLdri -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + -major 1 -minor 0 \ -install $(TOP)/$(LIB_DIR) -ldl $(OBJECTS) diff --git a/src/egl/main/Makefile b/src/egl/main/Makefile index 40732fe8ad6..7ab78197c7b 100644 --- a/src/egl/main/Makefile +++ b/src/egl/main/Makefile @@ -46,7 +46,8 @@ default: depend library library: $(TOP)/$(LIB_DIR)/libEGL.so $(TOP)/$(LIB_DIR)/libEGL.so: $(OBJECTS) - $(MKLIB) -o EGL -ldflags '$(LDFLAGS)' -major 1 -minor 0 \ + $(MKLIB) -o EGL -linker '$(CC)' -ldflags '$(LDFLAGS)' \ + -major 1 -minor 0 \ -install $(TOP)/$(LIB_DIR) -ldl $(OBJECTS) diff --git a/src/glut/beos/Makefile b/src/glut/beos/Makefile index c67ace50c5d..14f4f43f84a 100644 --- a/src/glut/beos/Makefile +++ b/src/glut/beos/Makefile @@ -83,9 +83,10 @@ $(TOP)/$(LIB_DIR): # Make the library $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS) - @$(MKLIB) -o $(GLUT_LIB) -ldflags '$(LDFLAGS)' $(MKLIB_OPTIONS) \ + @$(MKLIB) -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(GLUT_MAJOR) -minor $(GLUT_MINOR) -patch $(GLUT_TINY) \ - -install $(TOP)/$(LIB_DIR) $(GLUT_LIB_DEPS) $(OBJECTS) + -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \ + $(GLUT_LIB_DEPS) $(OBJECTS) clean: -rm -f *.o diff --git a/src/mesa/drivers/beos/Makefile b/src/mesa/drivers/beos/Makefile index f26264de8b6..c79dd24c390 100644 --- a/src/mesa/drivers/beos/Makefile +++ b/src/mesa/drivers/beos/Makefile @@ -181,9 +181,10 @@ $(TOP)/$(LIB_DIR): mkdir $(TOP)/$(LIB_DIR) $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(OBJECTS) $(MESA_MODULES) $(GLU_MODULES) - @$(MKLIB) -o $(GL_LIB) -ldflags '$(LDFLAGS)' -install $(TOP)/$(LIB_DIR) \ + @$(MKLIB) -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(MESA_TINY) \ - $(MKLIB_OPTIONS) $(GL_LIB_DEPS) $(OBJECTS) $(MESA_MODULES) $(GLU_MODULES) + -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) $(GL_LIB_DEPS) \ + $(OBJECTS) $(MESA_MODULES) $(GLU_MODULES) # $(GLU_OBJECTS): # cd $(GLU_DIR) && $(MAKE) $< ; diff --git a/src/mesa/drivers/dri/Makefile.template b/src/mesa/drivers/dri/Makefile.template index 4d1b057fb0c..95eeecc7c4f 100644 --- a/src/mesa/drivers/dri/Makefile.template +++ b/src/mesa/drivers/dri/Makefile.template @@ -68,7 +68,7 @@ default: symlinks depend $(LIBNAME) $(TOP)/$(LIB_DIR)/$(LIBNAME) $(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile $(TOP)/src/mesa/drivers/dri/Makefile.template - $(MKLIB) -ldflags '$(LDFLAGS)' -noprefix -o $@ \ + $(MKLIB) -o $@ -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \ $(OBJECTS) $(MESA_MODULES) $(WINOBJ) $(DRI_LIB_DEPS) diff --git a/src/mesa/drivers/osmesa/Makefile b/src/mesa/drivers/osmesa/Makefile index 97f2b25a149..8b2feee6b0e 100644 --- a/src/mesa/drivers/osmesa/Makefile +++ b/src/mesa/drivers/osmesa/Makefile @@ -45,10 +45,9 @@ default: osmesa8: $(TOP)/lib/$(OSMESA_LIB_NAME) $(TOP)/lib/$(OSMESA_LIB_NAME): $(OBJECTS) - $(MKLIB) -o $(OSMESA_LIB) -linker "$(CC)" \ + $(MKLIB) -o $(OSMESA_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(MESA_TINY) \ - -install $(TOP)/$(LIB_DIR) \ - $(MKLIB_OPTIONS) \ + -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \ $(OSMESA_LIB_DEPS) $(OBJECTS) @@ -57,10 +56,9 @@ $(TOP)/lib/$(OSMESA_LIB_NAME): $(OBJECTS) # The libOSMesa16/libOSMesa32 libraries do not use libGL but rather are built # with all the other Mesa sources (compiled with -DCHAN_BITS=16/32 osmesa16: $(OBJECTS) $(CORE_MESA) - $(MKLIB) -o $(OSMESA_LIB) -linker "$(CC)" \ + $(MKLIB) -o $(OSMESA_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(MESA_TINY) \ - -install $(TOP)/$(LIB_DIR) \ - $(MKLIB_OPTIONS) \ + -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \ $(OSMESA_LIB_DEPS) $(OBJECTS) $(CORE_MESA) diff --git a/src/mesa/drivers/x11/Makefile b/src/mesa/drivers/x11/Makefile index 4c2493d7e29..b025246e634 100644 --- a/src/mesa/drivers/x11/Makefile +++ b/src/mesa/drivers/x11/Makefile @@ -57,8 +57,8 @@ default: $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(OBJECTS) $(CORE_MESA) @ $(MKLIB) -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(GL_MAJOR) -minor $(GL_MINOR) -patch $(GL_TINY) \ - -install $(TOP)/$(LIB_DIR) \ - $(MKLIB_OPTIONS) $(GL_LIB_DEPS) $(OBJECTS) $(CORE_MESA) + -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \ + $(GL_LIB_DEPS) $(OBJECTS) $(CORE_MESA) -- cgit v1.2.3 From e81ba58bf4c20229677cdf89b5970b55cefb2199 Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Sat, 12 Jul 2008 21:13:03 +0200 Subject: r300_fragprog: Use nqssa+dce and program_pair for emit Share almost all code with r500_fragprog now. This also fixes Piglit's texrect-many test, which means that the compiz bicubic plugin should work with hardware acceleration now. --- src/mesa/drivers/dri/r300/Makefile | 1 + src/mesa/drivers/dri/r300/r300_context.h | 24 +- src/mesa/drivers/dri/r300/r300_fragprog.c | 61 +- src/mesa/drivers/dri/r300/r300_fragprog.h | 27 - src/mesa/drivers/dri/r300/r300_fragprog_emit.c | 1752 +++------------------ src/mesa/drivers/dri/r300/r300_fragprog_swizzle.c | 227 +++ src/mesa/drivers/dri/r300/r300_fragprog_swizzle.h | 42 + src/mesa/drivers/dri/r300/r300_state.c | 33 +- src/mesa/drivers/dri/r300/r500_fragprog.h | 30 - src/mesa/drivers/dri/r300/radeon_program_pair.c | 6 +- src/mesa/drivers/dri/r300/radeon_program_pair.h | 6 +- 11 files changed, 521 insertions(+), 1688 deletions(-) create mode 100644 src/mesa/drivers/dri/r300/r300_fragprog_swizzle.c create mode 100644 src/mesa/drivers/dri/r300/r300_fragprog_swizzle.h diff --git a/src/mesa/drivers/dri/r300/Makefile b/src/mesa/drivers/dri/r300/Makefile index 9baa1e71312..6ca934204f3 100644 --- a/src/mesa/drivers/dri/r300/Makefile +++ b/src/mesa/drivers/dri/r300/Makefile @@ -42,6 +42,7 @@ DRIVER_SOURCES = \ radeon_nqssadce.c \ r300_vertprog.c \ r300_fragprog.c \ + r300_fragprog_swizzle.c \ r300_fragprog_emit.c \ r500_fragprog.c \ r500_fragprog_emit.c \ diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h index 8e9c5cee5f3..98af6d8f10a 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -683,16 +683,25 @@ struct r300_fragment_program_external_state { }; +struct r300_fragment_program_node { + int tex_offset; /**< first tex instruction */ + int tex_end; /**< last tex instruction, relative to tex_offset */ + int alu_offset; /**< first ALU instruction */ + int alu_end; /**< last ALU instruction, relative to alu_offset */ + int flags; +}; + /** * Stores an R300 fragment program in its compiled-to-hardware form. */ struct r300_fragment_program_code { struct { - int length; + int length; /**< total # of texture instructions used */ GLuint inst[PFS_MAX_TEX_INST]; } tex; struct { + int length; /**< total # of ALU instructions used */ struct { GLuint inst0; GLuint inst1; @@ -701,21 +710,10 @@ struct r300_fragment_program_code { } inst[PFS_MAX_ALU_INST]; } alu; - struct { - int tex_offset; - int tex_end; - int alu_offset; - int alu_end; - int flags; - } node[4]; + struct r300_fragment_program_node node[4]; int cur_node; int first_node_has_tex; - int alu_offset; - int alu_end; - int tex_offset; - int tex_end; - /** * Remember which program register a given hardware constant * belongs to. diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c index 8a1d690ae4e..d390de54b8a 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog.c @@ -29,10 +29,8 @@ * \file * * Fragment program compiler. Perform transformations on the intermediate - * \ref radeon_program representation (which is essentially the Mesa - * program representation plus the notion of clauses) until the program - * is in a form where we can translate it more or less directly into - * machine-readable form. + * representation until the program is in a form where we can translate + * it more or less directly into machine-readable form. * * \author Ben Skeggs * \author Jerome Glisse @@ -47,8 +45,10 @@ #include "r300_context.h" #include "r300_fragprog.h" +#include "r300_fragprog_swizzle.h" #include "r300_state.h" +#include "radeon_nqssadce.h" #include "radeon_program_alu.h" @@ -133,25 +133,6 @@ static GLboolean transform_TEX( inst.SrcReg[0].Index = tempreg; } - /* Texture operations do not support swizzles etc. in hardware, - * so emit an additional arithmetic operation if necessary. - */ - if (inst.SrcReg[0].Swizzle != SWIZZLE_NOOP || - inst.SrcReg[0].Abs || inst.SrcReg[0].NegateBase || inst.SrcReg[0].NegateAbs) { - int tempreg = radeonFindFreeTemporary(t); - - tgt = radeonAppendInstructions(t->Program, 1); - - tgt->Opcode = OPCODE_MOV; - tgt->DstReg.File = PROGRAM_TEMPORARY; - tgt->DstReg.Index = tempreg; - tgt->SrcReg[0] = inst.SrcReg[0]; - - reset_srcreg(&inst.SrcReg[0]); - inst.SrcReg[0].File = PROGRAM_TEMPORARY; - inst.SrcReg[0].Index = tempreg; - } - if (inst.Opcode != OPCODE_KIL) { if (inst.DstReg.File != PROGRAM_TEMPORARY || inst.DstReg.WriteMask != WRITEMASK_XYZW) { @@ -339,6 +320,13 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) } +static void nqssadce_init(struct nqssadce_state* s) +{ + s->Outputs[FRAG_RESULT_COLR].Sourced = WRITEMASK_XYZW; + s->Outputs[FRAG_RESULT_DEPR].Sourced = WRITEMASK_W; +} + + static GLuint build_dtm(GLuint depthmode) { switch(depthmode) { @@ -417,7 +405,20 @@ void r300TranslateFragmentShader(r300ContextPtr r300, 3, transformations); if (RADEON_DEBUG & DEBUG_PIXEL) { - _mesa_printf("Fragment Program: After transformations:\n"); + _mesa_printf("Fragment Program: After native rewrite:\n"); + _mesa_print_program(compiler.program); + } + + struct radeon_nqssadce_descr nqssadce = { + .Init = &nqssadce_init, + .IsNativeSwizzle = &r300FPIsNativeSwizzle, + .BuildSwizzle = &r300FPBuildSwizzle, + .RewriteDepthOut = GL_TRUE + }; + radeonNqssaDce(r300->radeon.glCtx, compiler.program, &nqssadce); + + if (RADEON_DEBUG & DEBUG_PIXEL) { + _mesa_printf("Compiler: after NqSSA-DCE:\n"); _mesa_print_program(compiler.program); } @@ -451,22 +452,18 @@ void r300FragmentProgramDump( fprintf(stderr, "pc=%d*************************************\n", pc++); - fprintf(stderr, "Mesa program:\n"); - fprintf(stderr, "-------------\n"); - _mesa_print_program(&fp->mesa_program.Base); - fflush(stdout); - fprintf(stderr, "Hardware program\n"); fprintf(stderr, "----------------\n"); for (n = 0; n < (code->cur_node + 1); n++) { fprintf(stderr, "NODE %d: alu_offset: %d, tex_offset: %d, " - "alu_end: %d, tex_end: %d\n", n, + "alu_end: %d, tex_end: %d, flags: %08x\n", n, code->node[n].alu_offset, code->node[n].tex_offset, - code->node[n].alu_end, code->node[n].tex_end); + code->node[n].alu_end, code->node[n].tex_end, + code->node[n].flags); - if (code->tex.length) { + if (n > 0 || code->first_node_has_tex) { fprintf(stderr, " TEX:\n"); for (i = code->node[n].tex_offset; i <= code->node[n].tex_offset + code->node[n].tex_end; diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.h b/src/mesa/drivers/dri/r300/r300_fragprog.h index c76ae627015..b3a3cd2e04c 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog.h +++ b/src/mesa/drivers/dri/r300/r300_fragprog.h @@ -42,33 +42,6 @@ #include "r300_context.h" #include "radeon_program.h" -/* supported hw opcodes */ -#define PFS_OP_MAD 0 -#define PFS_OP_DP3 1 -#define PFS_OP_DP4 2 -#define PFS_OP_MIN 3 -#define PFS_OP_MAX 4 -#define PFS_OP_CMP 5 -#define PFS_OP_FRC 6 -#define PFS_OP_EX2 7 -#define PFS_OP_LG2 8 -#define PFS_OP_RCP 9 -#define PFS_OP_RSQ 10 -#define PFS_OP_REPL_ALPHA 11 -#define PFS_OP_CMPH 12 -#define MAX_PFS_OP 12 - -#define PFS_FLAG_SAT (1 << 0) -#define PFS_FLAG_ABS (1 << 1) - -#define ARG_NEG (1 << 5) -#define ARG_ABS (1 << 6) -#define ARG_MASK (127 << 0) -#define ARG_STRIDE 7 -#define SRC_CONST (1 << 5) -#define SRC_MASK (63 << 0) -#define SRC_STRIDE 6 - #define DRI_CONF_FP_OPTIMIZATION_SPEED 0 #define DRI_CONF_FP_OPTIMIZATION_QUALITY 1 diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c index 4786b4554df..9f0b7e35349 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_emit.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_emit.c @@ -36,1674 +36,308 @@ * \author Jerome Glisse * * \todo FogOption - * - * \todo Verify results of opcodes for accuracy, I've only checked them in - * specific cases. */ -#include "glheader.h" -#include "macros.h" -#include "enums.h" -#include "shader/prog_instruction.h" -#include "shader/prog_parameter.h" -#include "shader/prog_print.h" - -#include "r300_context.h" #include "r300_fragprog.h" -#include "r300_reg.h" -#include "r300_state.h" - -/* Mapping Mesa registers to R300 temporaries */ -struct reg_acc { - int reg; /* Assigned hw temp */ - unsigned int refcount; /* Number of uses by mesa program */ -}; - -/** - * Describe the current lifetime information for an R300 temporary - */ -struct reg_lifetime { - /* Index of the first slot where this register is free in the sense - that it can be used as a new destination register. - This is -1 if the register has been assigned to a Mesa register - and the last access to the register has not yet been emitted */ - int free; - - /* Index of the first slot where this register is currently reserved. - This is used to stop e.g. a scalar operation from being moved - before the allocation time of a register that was first allocated - for a vector operation. */ - int reserved; - - /* Index of the first slot in which the register can be used as a - source without losing the value that is written by the last - emitted instruction that writes to the register */ - int vector_valid; - int scalar_valid; - - /* Index to the slot where the register was last read. - This is also the first slot in which the register may be written again */ - int vector_lastread; - int scalar_lastread; -}; - -/** - * Store usage information about an ALU instruction slot during the - * compilation of a fragment program. - */ -#define SLOT_SRC_VECTOR (1<<0) -#define SLOT_SRC_SCALAR (1<<3) -#define SLOT_SRC_BOTH (SLOT_SRC_VECTOR | SLOT_SRC_SCALAR) -#define SLOT_OP_VECTOR (1<<16) -#define SLOT_OP_SCALAR (1<<17) -#define SLOT_OP_BOTH (SLOT_OP_VECTOR | SLOT_OP_SCALAR) - -struct r300_pfs_compile_slot { - /* Bitmask indicating which parts of the slot are used, using SLOT_ constants - defined above */ - unsigned int used; - - /* Selected sources */ - int vsrc[3]; - int ssrc[3]; -}; - -/** - * Store information during compilation of fragment programs. - */ -struct r300_pfs_compile_state { - struct r300_fragment_program_compiler *compiler; - int nrslots; /* number of ALU slots used so far */ - - /* Track which (parts of) slots are already filled with instructions */ - struct r300_pfs_compile_slot slot[PFS_MAX_ALU_INST]; - - /* Track the validity of R300 temporaries */ - struct reg_lifetime hwtemps[PFS_NUM_TEMP_REGS]; - - /* Used to map Mesa's inputs/temps onto hardware temps */ - int temp_in_use; - struct reg_acc temps[PFS_NUM_TEMP_REGS]; - struct reg_acc inputs[32]; /* don't actually need 32... */ +#include "radeon_program_pair.h" +#include "r300_fragprog_swizzle.h" +#include "r300_reg.h" - /* Track usage of hardware temps, for register allocation, - * indirection detection, etc. */ - GLuint used_in_node; - GLuint dest_in_node; -}; +#define PROG_CODE \ + struct r300_fragment_program_compiler *c = (struct r300_fragment_program_compiler*)data; \ + struct r300_fragment_program_code *code = c->code -/* - * Usefull macros and values - */ -#define ERROR(fmt, args...) do { \ +#define error(fmt, args...) do { \ fprintf(stderr, "%s::%s(): " fmt "\n", \ __FILE__, __FUNCTION__, ##args); \ - fp->error = GL_TRUE; \ } while(0) -#define PFS_INVAL 0xFFFFFFFF -#define COMPILE_STATE \ - struct r300_fragment_program *fp = cs->compiler->fp; \ - struct r300_fragment_program_code *code = cs->compiler->code; \ - (void)code; (void)fp - -#define SWIZZLE_XYZ 0 -#define SWIZZLE_XXX 1 -#define SWIZZLE_YYY 2 -#define SWIZZLE_ZZZ 3 -#define SWIZZLE_WWW 4 -#define SWIZZLE_YZX 5 -#define SWIZZLE_ZXY 6 -#define SWIZZLE_WZY 7 -#define SWIZZLE_111 8 -#define SWIZZLE_000 9 -#define SWIZZLE_HHH 10 - -#define swizzle(r, x, y, z, w) do_swizzle(cs, r, \ - ((SWIZZLE_##x<<0)| \ - (SWIZZLE_##y<<3)| \ - (SWIZZLE_##z<<6)| \ - (SWIZZLE_##w<<9)), \ - 0) - -#define REG_TYPE_INPUT 0 -#define REG_TYPE_OUTPUT 1 -#define REG_TYPE_TEMP 2 -#define REG_TYPE_CONST 3 - -#define REG_TYPE_SHIFT 0 -#define REG_INDEX_SHIFT 2 -#define REG_VSWZ_SHIFT 8 -#define REG_SSWZ_SHIFT 13 -#define REG_NEGV_SHIFT 18 -#define REG_NEGS_SHIFT 19 -#define REG_ABS_SHIFT 20 -#define REG_NO_USE_SHIFT 21 // Hack for refcounting -#define REG_VALID_SHIFT 22 // Does the register contain a defined value? -#define REG_BUILTIN_SHIFT 23 // Is it a builtin (like all zero/all one)? - -#define REG_TYPE_MASK (0x03 << REG_TYPE_SHIFT) -#define REG_INDEX_MASK (0x3F << REG_INDEX_SHIFT) -#define REG_VSWZ_MASK (0x1F << REG_VSWZ_SHIFT) -#define REG_SSWZ_MASK (0x1F << REG_SSWZ_SHIFT) -#define REG_NEGV_MASK (0x01 << REG_NEGV_SHIFT) -#define REG_NEGS_MASK (0x01 << REG_NEGS_SHIFT) -#define REG_ABS_MASK (0x01 << REG_ABS_SHIFT) -#define REG_NO_USE_MASK (0x01 << REG_NO_USE_SHIFT) -#define REG_VALID_MASK (0x01 << REG_VALID_SHIFT) -#define REG_BUILTIN_MASK (0x01 << REG_BUILTIN_SHIFT) - -#define REG(type, index, vswz, sswz, nouse, valid, builtin) \ - (((type << REG_TYPE_SHIFT) & REG_TYPE_MASK) | \ - ((index << REG_INDEX_SHIFT) & REG_INDEX_MASK) | \ - ((nouse << REG_NO_USE_SHIFT) & REG_NO_USE_MASK) | \ - ((valid << REG_VALID_SHIFT) & REG_VALID_MASK) | \ - ((builtin << REG_BUILTIN_SHIFT) & REG_BUILTIN_MASK) | \ - ((vswz << REG_VSWZ_SHIFT) & REG_VSWZ_MASK) | \ - ((sswz << REG_SSWZ_SHIFT) & REG_SSWZ_MASK)) -#define REG_GET_TYPE(reg) \ - ((reg & REG_TYPE_MASK) >> REG_TYPE_SHIFT) -#define REG_GET_INDEX(reg) \ - ((reg & REG_INDEX_MASK) >> REG_INDEX_SHIFT) -#define REG_GET_VSWZ(reg) \ - ((reg & REG_VSWZ_MASK) >> REG_VSWZ_SHIFT) -#define REG_GET_SSWZ(reg) \ - ((reg & REG_SSWZ_MASK) >> REG_SSWZ_SHIFT) -#define REG_GET_NO_USE(reg) \ - ((reg & REG_NO_USE_MASK) >> REG_NO_USE_SHIFT) -#define REG_GET_VALID(reg) \ - ((reg & REG_VALID_MASK) >> REG_VALID_SHIFT) -#define REG_GET_BUILTIN(reg) \ - ((reg & REG_BUILTIN_MASK) >> REG_BUILTIN_SHIFT) -#define REG_SET_TYPE(reg, type) \ - reg = ((reg & ~REG_TYPE_MASK) | \ - ((type << REG_TYPE_SHIFT) & REG_TYPE_MASK)) -#define REG_SET_INDEX(reg, index) \ - reg = ((reg & ~REG_INDEX_MASK) | \ - ((index << REG_INDEX_SHIFT) & REG_INDEX_MASK)) -#define REG_SET_VSWZ(reg, vswz) \ - reg = ((reg & ~REG_VSWZ_MASK) | \ - ((vswz << REG_VSWZ_SHIFT) & REG_VSWZ_MASK)) -#define REG_SET_SSWZ(reg, sswz) \ - reg = ((reg & ~REG_SSWZ_MASK) | \ - ((sswz << REG_SSWZ_SHIFT) & REG_SSWZ_MASK)) -#define REG_SET_NO_USE(reg, nouse) \ - reg = ((reg & ~REG_NO_USE_MASK) | \ - ((nouse << REG_NO_USE_SHIFT) & REG_NO_USE_MASK)) -#define REG_SET_VALID(reg, valid) \ - reg = ((reg & ~REG_VALID_MASK) | \ - ((valid << REG_VALID_SHIFT) & REG_VALID_MASK)) -#define REG_SET_BUILTIN(reg, builtin) \ - reg = ((reg & ~REG_BUILTIN_MASK) | \ - ((builtin << REG_BUILTIN_SHIFT) & REG_BUILTIN_MASK)) -#define REG_ABS(reg) \ - reg = (reg | REG_ABS_MASK) -#define REG_NEGV(reg) \ - reg = (reg | REG_NEGV_MASK) -#define REG_NEGS(reg) \ - reg = (reg | REG_NEGS_MASK) - -#define NOP_INST0 ( \ - (R300_ALU_OUTC_MAD) | \ - (R300_ALU_ARGC_ZERO << R300_ALU_ARG0C_SHIFT) | \ - (R300_ALU_ARGC_ZERO << R300_ALU_ARG1C_SHIFT) | \ - (R300_ALU_ARGC_ZERO << R300_ALU_ARG2C_SHIFT)) -#define NOP_INST1 ( \ - ((0 | SRC_CONST) << R300_ALU_SRC0C_SHIFT) | \ - ((0 | SRC_CONST) << R300_ALU_SRC1C_SHIFT) | \ - ((0 | SRC_CONST) << R300_ALU_SRC2C_SHIFT)) -#define NOP_INST2 ( \ - (R300_ALU_OUTA_MAD) | \ - (R300_ALU_ARGA_ZERO << R300_ALU_ARG0A_SHIFT) | \ - (R300_ALU_ARGA_ZERO << R300_ALU_ARG1A_SHIFT) | \ - (R300_ALU_ARGA_ZERO << R300_ALU_ARG2A_SHIFT)) -#define NOP_INST3 ( \ - ((0 | SRC_CONST) << R300_ALU_SRC0A_SHIFT) | \ - ((0 | SRC_CONST) << R300_ALU_SRC1A_SHIFT) | \ - ((0 | SRC_CONST) << R300_ALU_SRC2A_SHIFT)) - - -/* - * Datas structures for fragment program generation - */ - -/* description of r300 native hw instructions */ -static const struct { - const char *name; - int argc; - int v_op; - int s_op; -} r300_fpop[] = { - /* *INDENT-OFF* */ - {"MAD", 3, R300_ALU_OUTC_MAD, R300_ALU_OUTA_MAD}, - {"DP3", 2, R300_ALU_OUTC_DP3, R300_ALU_OUTA_DP4}, - {"DP4", 2, R300_ALU_OUTC_DP4, R300_ALU_OUTA_DP4}, - {"MIN", 2, R300_ALU_OUTC_MIN, R300_ALU_OUTA_MIN}, - {"MAX", 2, R300_ALU_OUTC_MAX, R300_ALU_OUTA_MAX}, - {"CMP", 3, R300_ALU_OUTC_CMP, R300_ALU_OUTA_CMP}, - {"FRC", 1, R300_ALU_OUTC_FRC, R300_ALU_OUTA_FRC}, - {"EX2", 1, R300_ALU_OUTC_REPL_ALPHA, R300_ALU_OUTA_EX2}, - {"LG2", 1, R300_ALU_OUTC_REPL_ALPHA, R300_ALU_OUTA_LG2}, - {"RCP", 1, R300_ALU_OUTC_REPL_ALPHA, R300_ALU_OUTA_RCP}, - {"RSQ", 1, R300_ALU_OUTC_REPL_ALPHA, R300_ALU_OUTA_RSQ}, - {"REPL_ALPHA", 1, R300_ALU_OUTC_REPL_ALPHA, PFS_INVAL}, - {"CMPH", 3, R300_ALU_OUTC_CMPH, PFS_INVAL}, - /* *INDENT-ON* */ -}; - -/* vector swizzles r300 can support natively, with a couple of - * cases we handle specially - * - * REG_VSWZ/REG_SSWZ is an index into this table - */ - -/* mapping from SWIZZLE_* to r300 native values for scalar insns */ -#define SWIZZLE_HALF 6 - -#define MAKE_SWZ3(x, y, z) (MAKE_SWIZZLE4(SWIZZLE_##x, \ - SWIZZLE_##y, \ - SWIZZLE_##z, \ - SWIZZLE_ZERO)) -/* native swizzles */ -static const struct r300_pfs_swizzle { - GLuint hash; /* swizzle value this matches */ - GLuint base; /* base value for hw swizzle */ - GLuint stride; /* difference in base between arg0/1/2 */ - GLuint flags; -} v_swiz[] = { - /* *INDENT-OFF* */ - {MAKE_SWZ3(X, Y, Z), R300_ALU_ARGC_SRC0C_XYZ, 4, SLOT_SRC_VECTOR}, - {MAKE_SWZ3(X, X, X), R300_ALU_ARGC_SRC0C_XXX, 4, SLOT_SRC_VECTOR}, - {MAKE_SWZ3(Y, Y, Y), R300_ALU_ARGC_SRC0C_YYY, 4, SLOT_SRC_VECTOR}, - {MAKE_SWZ3(Z, Z, Z), R300_ALU_ARGC_SRC0C_ZZZ, 4, SLOT_SRC_VECTOR}, - {MAKE_SWZ3(W, W, W), R300_ALU_ARGC_SRC0A, 1, SLOT_SRC_SCALAR}, - {MAKE_SWZ3(Y, Z, X), R300_ALU_ARGC_SRC0C_YZX, 1, SLOT_SRC_VECTOR}, - {MAKE_SWZ3(Z, X, Y), R300_ALU_ARGC_SRC0C_ZXY, 1, SLOT_SRC_VECTOR}, - {MAKE_SWZ3(W, Z, Y), R300_ALU_ARGC_SRC0CA_WZY, 1, SLOT_SRC_BOTH}, - {MAKE_SWZ3(ONE, ONE, ONE), R300_ALU_ARGC_ONE, 0, 0}, - {MAKE_SWZ3(ZERO, ZERO, ZERO), R300_ALU_ARGC_ZERO, 0, 0}, - {MAKE_SWZ3(HALF, HALF, HALF), R300_ALU_ARGC_HALF, 0, 0}, - {PFS_INVAL, 0, 0, 0}, - /* *INDENT-ON* */ -}; - -/* used during matching of non-native swizzles */ -#define SWZ_X_MASK (7 << 0) -#define SWZ_Y_MASK (7 << 3) -#define SWZ_Z_MASK (7 << 6) -#define SWZ_W_MASK (7 << 9) -static const struct { - GLuint hash; /* used to mask matching swizzle components */ - int mask; /* actual outmask */ - int count; /* count of components matched */ -} s_mask[] = { - /* *INDENT-OFF* */ - {SWZ_X_MASK | SWZ_Y_MASK | SWZ_Z_MASK, 1 | 2 | 4, 3}, - {SWZ_X_MASK | SWZ_Y_MASK, 1 | 2, 2}, - {SWZ_X_MASK | SWZ_Z_MASK, 1 | 4, 2}, - {SWZ_Y_MASK | SWZ_Z_MASK, 2 | 4, 2}, - {SWZ_X_MASK, 1, 1}, - {SWZ_Y_MASK, 2, 1}, - {SWZ_Z_MASK, 4, 1}, - {PFS_INVAL, PFS_INVAL, PFS_INVAL} - /* *INDENT-ON* */ -}; - -static const struct { - int base; /* hw value of swizzle */ - int stride; /* difference between SRC0/1/2 */ - GLuint flags; -} s_swiz[] = { - /* *INDENT-OFF* */ - {R300_ALU_ARGA_SRC0C_X, 3, SLOT_SRC_VECTOR}, - {R300_ALU_ARGA_SRC0C_Y, 3, SLOT_SRC_VECTOR}, - {R300_ALU_ARGA_SRC0C_Z, 3, SLOT_SRC_VECTOR}, - {R300_ALU_ARGA_SRC0A, 1, SLOT_SRC_SCALAR}, - {R300_ALU_ARGA_ZERO, 0, 0}, - {R300_ALU_ARGA_ONE, 0, 0}, - {R300_ALU_ARGA_HALF, 0, 0} - /* *INDENT-ON* */ -}; - -/* boiler-plate reg, for convenience */ -static const GLuint undef = REG(REG_TYPE_TEMP, - 0, - SWIZZLE_XYZ, - SWIZZLE_W, - GL_FALSE, - GL_FALSE, - GL_FALSE); - -/* constant one source */ -static const GLuint pfs_one = REG(REG_TYPE_CONST, - 0, - SWIZZLE_111, - SWIZZLE_ONE, - GL_FALSE, - GL_TRUE, - GL_TRUE); - -/* constant half source */ -static const GLuint pfs_half = REG(REG_TYPE_CONST, - 0, - SWIZZLE_HHH, - SWIZZLE_HALF, - GL_FALSE, - GL_TRUE, - GL_TRUE); - -/* constant zero source */ -static const GLuint pfs_zero = REG(REG_TYPE_CONST, - 0, - SWIZZLE_000, - SWIZZLE_ZERO, - GL_FALSE, - GL_TRUE, - GL_TRUE); - -/* - * Common functions prototypes - */ -static void emit_arith(struct r300_pfs_compile_state *cs, int op, - GLuint dest, int mask, - GLuint src0, GLuint src1, GLuint src2, int flags); - -/** - * Get an R300 temporary that can be written to in the given slot. - */ -static int get_hw_temp(struct r300_pfs_compile_state *cs, int slot) -{ - COMPILE_STATE; - int r; - - for (r = 0; r < PFS_NUM_TEMP_REGS; ++r) { - if (cs->hwtemps[r].free >= 0 && cs->hwtemps[r].free <= slot) - break; - } - - if (r >= PFS_NUM_TEMP_REGS) { - ERROR("Out of hardware temps\n"); - return 0; - } - // Reserved is used to avoid the following scenario: - // R300 temporary X is first assigned to Mesa temporary Y during vector ops - // R300 temporary X is then assigned to Mesa temporary Z for further vector ops - // Then scalar ops on Mesa temporary Z are emitted and move back in time - // to overwrite the value of temporary Y. - // End scenario. - cs->hwtemps[r].reserved = cs->hwtemps[r].free; - cs->hwtemps[r].free = -1; - - // Reset to some value that won't mess things up when the user - // tries to read from a temporary that hasn't been assigned a value yet. - // In the normal case, vector_valid and scalar_valid should be set to - // a sane value by the first emit that writes to this temporary. - cs->hwtemps[r].vector_valid = 0; - cs->hwtemps[r].scalar_valid = 0; - - if (r > code->max_temp_idx) - code->max_temp_idx = r; - - return r; -} - -/** - * Get an R300 temporary that will act as a TEX destination register. - */ -static int get_hw_temp_tex(struct r300_pfs_compile_state *cs) -{ - COMPILE_STATE; - int r; - - for (r = 0; r < PFS_NUM_TEMP_REGS; ++r) { - if (cs->used_in_node & (1 << r)) - continue; - - // Note: Be very careful here - if (cs->hwtemps[r].free >= 0 && cs->hwtemps[r].free <= 0) - break; - } - - if (r >= PFS_NUM_TEMP_REGS) - return get_hw_temp(cs, 0); /* Will cause an indirection */ - - cs->hwtemps[r].reserved = cs->hwtemps[r].free; - cs->hwtemps[r].free = -1; - - // Reset to some value that won't mess things up when the user - // tries to read from a temporary that hasn't been assigned a value yet. - // In the normal case, vector_valid and scalar_valid should be set to - // a sane value by the first emit that writes to this temporary. - cs->hwtemps[r].vector_valid = cs->nrslots; - cs->hwtemps[r].scalar_valid = cs->nrslots; - if (r > code->max_temp_idx) - code->max_temp_idx = r; - - return r; -} - -/** - * Mark the given hardware register as free. - */ -static void free_hw_temp(struct r300_pfs_compile_state *cs, int idx) +static GLboolean emit_const(void* data, GLuint file, GLuint index, GLuint *hwindex) { - // Be very careful here. Consider sequences like - // MAD r0, r1,r2,r3 - // TEX r4, ... - // The TEX instruction may be moved in front of the MAD instruction - // due to the way nodes work. We don't want to alias r1 and r4 in - // this case. - // I'm certain the register allocation could be further sanitized, - // but it's tricky because of stuff that can happen inside emit_tex - // and emit_arith. - cs->hwtemps[idx].free = cs->nrslots + 1; -} + PROG_CODE; -/** - * Create a new Mesa temporary register. - */ -static GLuint get_temp_reg(struct r300_pfs_compile_state *cs) -{ - COMPILE_STATE; - GLuint r = undef; - GLuint index; - - index = ffs(~cs->temp_in_use); - if (!index) { - ERROR("Out of program temps\n"); - return r; - } - - cs->temp_in_use |= (1 << --index); - cs->temps[index].refcount = 0xFFFFFFFF; - cs->temps[index].reg = -1; - - REG_SET_TYPE(r, REG_TYPE_TEMP); - REG_SET_INDEX(r, index); - REG_SET_VALID(r, GL_TRUE); - return r; -} - -/** - * Free a Mesa temporary and the associated R300 temporary. - */ -static void free_temp(struct r300_pfs_compile_state *cs, GLuint r) -{ - GLuint index = REG_GET_INDEX(r); - - if (!(cs->temp_in_use & (1 << index))) - return; - - if (REG_GET_TYPE(r) == REG_TYPE_TEMP) { - free_hw_temp(cs, cs->temps[index].reg); - cs->temps[index].reg = -1; - cs->temp_in_use &= ~(1 << index); - } else if (REG_GET_TYPE(r) == REG_TYPE_INPUT) { - free_hw_temp(cs, cs->inputs[index].reg); - cs->inputs[index].reg = -1; - } -} - -/** - * Emit a hardware constant/parameter. - */ -static GLuint emit_const4fv(struct r300_pfs_compile_state *cs, - struct prog_src_register srcreg) -{ - COMPILE_STATE; - GLuint reg = undef; - int index; - - for (index = 0; index < code->const_nr; ++index) { - if (code->constant[index].File == srcreg.File && - code->constant[index].Index == srcreg.Index) + for (*hwindex = 0; *hwindex < code->const_nr; ++*hwindex) { + if (code->constant[*hwindex].File == file && + code->constant[*hwindex].Index == index) break; } - if (index >= code->const_nr) { - if (index >= PFS_NUM_CONST_REGS) { - ERROR("Out of hw constants!\n"); - return reg; + if (*hwindex >= code->const_nr) { + if (*hwindex >= PFS_NUM_CONST_REGS) { + error("Out of hw constants!\n"); + return GL_FALSE; } code->const_nr++; - code->constant[index] = srcreg; + code->constant[*hwindex].File = file; + code->constant[*hwindex].Index = index; } - REG_SET_TYPE(reg, REG_TYPE_CONST); - REG_SET_INDEX(reg, index); - REG_SET_VALID(reg, GL_TRUE); - return reg; + return GL_TRUE; } -static INLINE GLuint negate(GLuint r) -{ - REG_NEGS(r); - REG_NEGV(r); - return r; -} -/* Hack, to prevent clobbering sources used multiple times when - * emulating non-native instructions +/** + * Mark a temporary register as used. */ -static INLINE GLuint keep(GLuint r) -{ - REG_SET_NO_USE(r, GL_TRUE); - return r; -} - -static INLINE GLuint absolute(GLuint r) -{ - REG_ABS(r); - return r; -} - -static int swz_native(struct r300_pfs_compile_state *cs, - GLuint src, GLuint * r, GLuint arbneg) -{ - COMPILE_STATE; - - /* Native swizzle, handle negation */ - src = (src & ~REG_NEGS_MASK) | (((arbneg >> 3) & 1) << REG_NEGS_SHIFT); - - if ((arbneg & 0x7) == 0x0) { - src = src & ~REG_NEGV_MASK; - *r = src; - } else if ((arbneg & 0x7) == 0x7) { - src |= REG_NEGV_MASK; - *r = src; - } else { - if (!REG_GET_VALID(*r)) - *r = get_temp_reg(cs); - src |= REG_NEGV_MASK; - emit_arith(cs, - PFS_OP_MAD, - *r, arbneg & 0x7, keep(src), pfs_one, pfs_zero, 0); - src = src & ~REG_NEGV_MASK; - emit_arith(cs, - PFS_OP_MAD, - *r, - (arbneg ^ 0x7) | WRITEMASK_W, - src, pfs_one, pfs_zero, 0); - } - - return 3; -} - -static int swz_emit_partial(struct r300_pfs_compile_state *cs, - GLuint src, - GLuint * r, int mask, int mc, GLuint arbneg) -{ - COMPILE_STATE; - GLuint tmp; - GLuint wmask = 0; - - if (!REG_GET_VALID(*r)) - *r = get_temp_reg(cs); - - /* A partial match, VSWZ/mask define what parts of the - * desired swizzle we match - */ - if (mc + s_mask[mask].count == 3) { - wmask = WRITEMASK_W; - src |= ((arbneg >> 3) & 1) << REG_NEGS_SHIFT; - } - - tmp = arbneg & s_mask[mask].mask; - if (tmp) { - tmp = tmp ^ s_mask[mask].mask; - if (tmp) { - emit_arith(cs, - PFS_OP_MAD, - *r, - arbneg & s_mask[mask].mask, - keep(src) | REG_NEGV_MASK, - pfs_one, pfs_zero, 0); - if (!wmask) { - REG_SET_NO_USE(src, GL_TRUE); - } else { - REG_SET_NO_USE(src, GL_FALSE); - } - emit_arith(cs, - PFS_OP_MAD, - *r, tmp | wmask, src, pfs_one, pfs_zero, 0); - } else { - if (!wmask) { - REG_SET_NO_USE(src, GL_TRUE); - } else { - REG_SET_NO_USE(src, GL_FALSE); - } - emit_arith(cs, - PFS_OP_MAD, - *r, - (arbneg & s_mask[mask].mask) | wmask, - src | REG_NEGV_MASK, pfs_one, pfs_zero, 0); - } - } else { - if (!wmask) { - REG_SET_NO_USE(src, GL_TRUE); - } else { - REG_SET_NO_USE(src, GL_FALSE); - } - emit_arith(cs, PFS_OP_MAD, - *r, - s_mask[mask].mask | wmask, - src, pfs_one, pfs_zero, 0); - } - - return s_mask[mask].count; -} - -static GLuint do_swizzle(struct r300_pfs_compile_state *cs, - GLuint src, GLuint arbswz, GLuint arbneg) -{ - COMPILE_STATE; - GLuint r = undef; - GLuint vswz; - int c_mask = 0; - int v_match = 0; - - /* If swizzling from something without an XYZW native swizzle, - * emit result to a temp, and do new swizzle from the temp. - */ -#if 0 - if (REG_GET_VSWZ(src) != SWIZZLE_XYZ || REG_GET_SSWZ(src) != SWIZZLE_W) { - GLuint temp = get_temp_reg(fp); - emit_arith(fp, - PFS_OP_MAD, - temp, WRITEMASK_XYZW, src, pfs_one, pfs_zero, 0); - src = temp; - } -#endif - - if (REG_GET_VSWZ(src) != SWIZZLE_XYZ || REG_GET_SSWZ(src) != SWIZZLE_W) { - GLuint vsrcswz = - (v_swiz[REG_GET_VSWZ(src)]. - hash & (SWZ_X_MASK | SWZ_Y_MASK | SWZ_Z_MASK)) | - REG_GET_SSWZ(src) << 9; - GLint i; - - GLuint newswz = 0; - GLuint offset; - for (i = 0; i < 4; ++i) { - offset = GET_SWZ(arbswz, i); - - newswz |= - (offset <= 3) ? GET_SWZ(vsrcswz, - offset) << i * - 3 : offset << i * 3; - } - - arbswz = newswz & (SWZ_X_MASK | SWZ_Y_MASK | SWZ_Z_MASK); - REG_SET_SSWZ(src, GET_SWZ(newswz, 3)); - } else { - /* set scalar swizzling */ - REG_SET_SSWZ(src, GET_SWZ(arbswz, 3)); - - } - do { - vswz = REG_GET_VSWZ(src); - do { - int chash; - - REG_SET_VSWZ(src, vswz); - chash = v_swiz[REG_GET_VSWZ(src)].hash & - s_mask[c_mask].hash; - - if (chash == (arbswz & s_mask[c_mask].hash)) { - if (s_mask[c_mask].count == 3) { - v_match += swz_native(cs, - src, &r, arbneg); - } else { - v_match += swz_emit_partial(cs, - src, - &r, - c_mask, - v_match, - arbneg); - } - - if (v_match == 3) - return r; - - /* Fill with something invalid.. all 0's was - * wrong before, matched SWIZZLE_X. So all - * 1's will be okay for now - */ - arbswz |= (PFS_INVAL & s_mask[c_mask].hash); - } - } while (v_swiz[++vswz].hash != PFS_INVAL); - REG_SET_VSWZ(src, SWIZZLE_XYZ); - } while (s_mask[++c_mask].hash != PFS_INVAL); - - ERROR("should NEVER get here\n"); - return r; -} - -static GLuint t_src(struct r300_pfs_compile_state *cs, - struct prog_src_register fpsrc) -{ - COMPILE_STATE; - GLuint r = undef; - - switch (fpsrc.File) { - case PROGRAM_TEMPORARY: - REG_SET_INDEX(r, fpsrc.Index); - REG_SET_VALID(r, GL_TRUE); - REG_SET_TYPE(r, REG_TYPE_TEMP); - break; - case PROGRAM_INPUT: - REG_SET_INDEX(r, fpsrc.Index); - REG_SET_VALID(r, GL_TRUE); - REG_SET_TYPE(r, REG_TYPE_INPUT); - break; - case PROGRAM_LOCAL_PARAM: - case PROGRAM_ENV_PARAM: - case PROGRAM_STATE_VAR: - case PROGRAM_NAMED_PARAM: - case PROGRAM_CONSTANT: - r = emit_const4fv(cs, fpsrc); - break; - case PROGRAM_BUILTIN: - switch(fpsrc.Swizzle) { - case SWIZZLE_1111: r = pfs_one; break; - case SWIZZLE_0000: r = pfs_zero; break; - default: - ERROR("bad PROGRAM_BUILTIN swizzle %u\n", fpsrc.Swizzle); - break; - } - break; - default: - ERROR("unknown SrcReg->File %x\n", fpsrc.File); - return r; - } - - /* no point swizzling ONE/ZERO/HALF constants... */ - if (REG_GET_VSWZ(r) < SWIZZLE_111 || REG_GET_SSWZ(r) < SWIZZLE_ZERO) - r = do_swizzle(cs, r, fpsrc.Swizzle, fpsrc.NegateBase); - if (fpsrc.Abs) - r = absolute(r); - if (fpsrc.NegateAbs) - r = negate(r); - return r; -} - -static GLuint t_scalar_src(struct r300_pfs_compile_state *cs, - struct prog_src_register fpsrc) +static void use_temporary(struct r300_fragment_program_code *code, GLuint index) { - struct prog_src_register src = fpsrc; - int sc = GET_SWZ(fpsrc.Swizzle, 0); /* X */ - - src.Swizzle = ((sc << 0) | (sc << 3) | (sc << 6) | (sc << 9)); - - return t_src(cs, src); + if (index > code->max_temp_idx) + code->max_temp_idx = index; } -static GLuint t_dst(struct r300_pfs_compile_state *cs, - struct prog_dst_register dest) -{ - COMPILE_STATE; - GLuint r = undef; - switch (dest.File) { - case PROGRAM_TEMPORARY: - REG_SET_INDEX(r, dest.Index); - REG_SET_VALID(r, GL_TRUE); - REG_SET_TYPE(r, REG_TYPE_TEMP); - return r; - case PROGRAM_OUTPUT: - REG_SET_TYPE(r, REG_TYPE_OUTPUT); - switch (dest.Index) { - case FRAG_RESULT_COLR: - case FRAG_RESULT_DEPR: - REG_SET_INDEX(r, dest.Index); - REG_SET_VALID(r, GL_TRUE); - return r; - default: - ERROR("Bad DstReg->Index 0x%x\n", dest.Index); - return r; - } - default: - ERROR("Bad DstReg->File 0x%x\n", dest.File); - return r; - } -} - -static int t_hw_src(struct r300_pfs_compile_state *cs, GLuint src, GLboolean tex) +static GLuint translate_rgb_opcode(GLuint opcode) { - COMPILE_STATE; - int idx; - int index = REG_GET_INDEX(src); - - switch (REG_GET_TYPE(src)) { - case REG_TYPE_TEMP: - /* NOTE: if reg==-1 here, a source is being read that - * hasn't been written to. Undefined results. - */ - if (cs->temps[index].reg == -1) - cs->temps[index].reg = get_hw_temp(cs, cs->nrslots); - - idx = cs->temps[index].reg; - - if (!REG_GET_NO_USE(src) && (--cs->temps[index].refcount == 0)) - free_temp(cs, src); - break; - case REG_TYPE_INPUT: - idx = cs->inputs[index].reg; - - if (!REG_GET_NO_USE(src) && (--cs->inputs[index].refcount == 0)) - free_hw_temp(cs, cs->inputs[index].reg); - break; - case REG_TYPE_CONST: - return (index | SRC_CONST); + switch(opcode) { + case OPCODE_CMP: return R300_ALU_OUTC_CMP; + case OPCODE_DP3: return R300_ALU_OUTC_DP3; + case OPCODE_DP4: return R300_ALU_OUTC_DP4; + case OPCODE_FRC: return R300_ALU_OUTC_FRC; default: - ERROR("Invalid type for source reg\n"); - return (0 | SRC_CONST); + error("translate_rgb_opcode(%i): Unknown opcode", opcode); + /* fall through */ + case OPCODE_NOP: + /* fall through */ + case OPCODE_MAD: return R300_ALU_OUTC_MAD; + case OPCODE_MAX: return R300_ALU_OUTC_MAX; + case OPCODE_MIN: return R300_ALU_OUTC_MIN; + case OPCODE_REPL_ALPHA: return R300_ALU_OUTC_REPL_ALPHA; } - - if (!tex) - cs->used_in_node |= (1 << idx); - - return idx; } -static int t_hw_dst(struct r300_pfs_compile_state *cs, - GLuint dest, GLboolean tex, int slot) +static GLuint translate_alpha_opcode(GLuint opcode) { - COMPILE_STATE; - int idx; - GLuint index = REG_GET_INDEX(dest); - assert(REG_GET_VALID(dest)); - - switch (REG_GET_TYPE(dest)) { - case REG_TYPE_TEMP: - if (cs->temps[REG_GET_INDEX(dest)].reg == -1) { - if (!tex) { - cs->temps[index].reg = get_hw_temp(cs, slot); - } else { - cs->temps[index].reg = get_hw_temp_tex(cs); - } - } - idx = cs->temps[index].reg; - - if (!REG_GET_NO_USE(dest) && (--cs->temps[index].refcount == 0)) - free_temp(cs, dest); - - cs->dest_in_node |= (1 << idx); - cs->used_in_node |= (1 << idx); - break; - case REG_TYPE_OUTPUT: - switch (index) { - case FRAG_RESULT_COLR: - code->node[code->cur_node].flags |= R300_RGBA_OUT; - break; - case FRAG_RESULT_DEPR: - fp->WritesDepth = GL_TRUE; - code->node[code->cur_node].flags |= R300_W_OUT; - break; - } - return index; - break; + switch(opcode) { + case OPCODE_CMP: return R300_ALU_OUTA_CMP; + case OPCODE_DP3: return R300_ALU_OUTA_DP4; + case OPCODE_DP4: return R300_ALU_OUTA_DP4; + case OPCODE_EX2: return R300_ALU_OUTA_EX2; + case OPCODE_FRC: return R300_ALU_OUTA_FRC; + case OPCODE_LG2: return R300_ALU_OUTA_LG2; default: - ERROR("invalid dest reg type %d\n", REG_GET_TYPE(dest)); - return 0; - } - - return idx; -} - -static void emit_nop(struct r300_pfs_compile_state *cs) -{ - COMPILE_STATE; - - if (cs->nrslots >= PFS_MAX_ALU_INST) { - ERROR("Out of ALU instruction slots\n"); - return; - } - - code->alu.inst[cs->nrslots].inst0 = NOP_INST0; - code->alu.inst[cs->nrslots].inst1 = NOP_INST1; - code->alu.inst[cs->nrslots].inst2 = NOP_INST2; - code->alu.inst[cs->nrslots].inst3 = NOP_INST3; - cs->nrslots++; -} - -static void emit_tex(struct r300_pfs_compile_state *cs, - struct prog_instruction *fpi, int opcode) -{ - COMPILE_STATE; - GLuint coord = t_src(cs, fpi->SrcReg[0]); - GLuint dest = undef; - GLuint din, uin; - int unit = fpi->TexSrcUnit; - int hwsrc, hwdest; - - /* Ensure correct node indirection */ - uin = cs->used_in_node; - din = cs->dest_in_node; - - /* Resolve source/dest to hardware registers */ - hwsrc = t_hw_src(cs, coord, GL_TRUE); - - if (opcode != R300_TEX_OP_KIL) { - dest = t_dst(cs, fpi->DstReg); - - hwdest = - t_hw_dst(cs, dest, GL_TRUE, - code->node[code->cur_node].alu_offset); - - /* Use a temp that hasn't been used in this node, rather - * than causing an indirection - */ - if (uin & (1 << hwdest)) { - free_hw_temp(cs, hwdest); - hwdest = get_hw_temp_tex(cs); - cs->temps[REG_GET_INDEX(dest)].reg = hwdest; - } - } else { - hwdest = 0; - unit = 0; - } - - /* Indirection if source has been written in this node, or if the - * dest has been read/written in this node - */ - if ((REG_GET_TYPE(coord) != REG_TYPE_CONST && - (din & (1 << hwsrc))) || (uin & (1 << hwdest))) { - - /* Finish off current node */ - if (code->node[code->cur_node].alu_offset == cs->nrslots) - emit_nop(cs); - - code->node[code->cur_node].alu_end = - cs->nrslots - code->node[code->cur_node].alu_offset - 1; - assert(code->node[code->cur_node].alu_end >= 0); - - if (++code->cur_node >= PFS_MAX_TEX_INDIRECT) { - ERROR("too many levels of texture indirection\n"); - return; - } - - /* Start new node */ - code->node[code->cur_node].tex_offset = code->tex.length; - code->node[code->cur_node].alu_offset = cs->nrslots; - code->node[code->cur_node].tex_end = -1; - code->node[code->cur_node].alu_end = -1; - code->node[code->cur_node].flags = 0; - cs->used_in_node = 0; - cs->dest_in_node = 0; + error("translate_rgb_opcode(%i): Unknown opcode", opcode); + /* fall through */ + case OPCODE_NOP: + /* fall through */ + case OPCODE_MAD: return R300_ALU_OUTA_MAD; + case OPCODE_MAX: return R300_ALU_OUTA_MAX; + case OPCODE_MIN: return R300_ALU_OUTA_MIN; + case OPCODE_RCP: return R300_ALU_OUTA_RCP; + case OPCODE_RSQ: return R300_ALU_OUTA_RSQ; } - - if (code->cur_node == 0) - code->first_node_has_tex = 1; - - code->tex.inst[code->tex.length++] = 0 | (hwsrc << R300_SRC_ADDR_SHIFT) - | (hwdest << R300_DST_ADDR_SHIFT) - | (unit << R300_TEX_ID_SHIFT) - | (opcode << R300_TEX_INST_SHIFT); - - cs->dest_in_node |= (1 << hwdest); - if (REG_GET_TYPE(coord) != REG_TYPE_CONST) - cs->used_in_node |= (1 << hwsrc); - - code->node[code->cur_node].tex_end++; } /** - * Returns the first slot where we could possibly allow writing to dest, - * according to register allocation. + * Emit one paired ALU instruction. */ -static int get_earliest_allowed_write(struct r300_pfs_compile_state *cs, - GLuint dest, int mask) +static GLboolean emit_alu(void* data, struct radeon_pair_instruction* inst) { - COMPILE_STATE; - int idx; - int pos; - GLuint index = REG_GET_INDEX(dest); - assert(REG_GET_VALID(dest)); + PROG_CODE; - switch (REG_GET_TYPE(dest)) { - case REG_TYPE_TEMP: - if (cs->temps[index].reg == -1) - return 0; - - idx = cs->temps[index].reg; - break; - case REG_TYPE_OUTPUT: - return 0; - default: - ERROR("invalid dest reg type %d\n", REG_GET_TYPE(dest)); - return 0; - } - - pos = cs->hwtemps[idx].reserved; - if (mask & WRITEMASK_XYZ) { - if (pos < cs->hwtemps[idx].vector_lastread) - pos = cs->hwtemps[idx].vector_lastread; - } - if (mask & WRITEMASK_W) { - if (pos < cs->hwtemps[idx].scalar_lastread) - pos = cs->hwtemps[idx].scalar_lastread; + if (code->alu.length >= PFS_MAX_ALU_INST) { + error("Too many ALU instructions"); + return GL_FALSE; } - return pos; -} - -/** - * Allocates a slot for an ALU instruction that can consist of - * a vertex part or a scalar part or both. - * - * Sources from src (src[0] to src[argc-1]) are added to the slot in the - * appropriate position (vector and/or scalar), and their positions are - * recorded in the srcpos array. - * - * This function emits instruction code for the source fetch and the - * argument selection. It does not emit instruction code for the - * opcode or the destination selection. - * - * @return the index of the slot - */ -static int find_and_prepare_slot(struct r300_pfs_compile_state *cs, - GLboolean emit_vop, - GLboolean emit_sop, - int argc, GLuint * src, GLuint dest, int mask) -{ - COMPILE_STATE; - int hwsrc[3]; - int srcpos[3]; - unsigned int used; - int tempused; - int tempvsrc[3]; - int tempssrc[3]; - int pos; - int regnr; - int i, j; + int ip = code->alu.length++; + int j; + code->node[code->cur_node].alu_end++; - // Determine instruction slots, whether sources are required on - // vector or scalar side, and the smallest slot number where - // all source registers are available - used = 0; - if (emit_vop) - used |= SLOT_OP_VECTOR; - if (emit_sop) - used |= SLOT_OP_SCALAR; + code->alu.inst[ip].inst0 = translate_rgb_opcode(inst->RGB.Opcode); + code->alu.inst[ip].inst2 = translate_alpha_opcode(inst->Alpha.Opcode); - pos = get_earliest_allowed_write(cs, dest, mask); + for(j = 0; j < 3; ++j) { + GLuint src = inst->RGB.Src[j].Index | (inst->RGB.Src[j].Constant << 5); + if (!inst->RGB.Src[j].Constant) + use_temporary(code, inst->RGB.Src[j].Index); + code->alu.inst[ip].inst1 |= src << (6*j); - if (code->node[code->cur_node].alu_offset > pos) - pos = code->node[code->cur_node].alu_offset; - for (i = 0; i < argc; ++i) { - if (!REG_GET_BUILTIN(src[i])) { - if (emit_vop) - used |= v_swiz[REG_GET_VSWZ(src[i])].flags << i; - if (emit_sop) - used |= s_swiz[REG_GET_SSWZ(src[i])].flags << i; - } + src = inst->Alpha.Src[j].Index | (inst->Alpha.Src[j].Constant << 5); + if (!inst->Alpha.Src[j].Constant) + use_temporary(code, inst->Alpha.Src[j].Index); + code->alu.inst[ip].inst3 |= src << (6*j); - hwsrc[i] = t_hw_src(cs, src[i], GL_FALSE); /* Note: sideeffects wrt refcounting! */ - regnr = hwsrc[i] & 31; + GLuint arg = r300FPTranslateRGBSwizzle(inst->RGB.Arg[j].Source, inst->RGB.Arg[j].Swizzle); + arg |= inst->RGB.Arg[j].Abs << 6; + arg |= inst->RGB.Arg[j].Negate << 5; + code->alu.inst[ip].inst0 |= arg << (7*j); - if (REG_GET_TYPE(src[i]) == REG_TYPE_TEMP) { - if (used & (SLOT_SRC_VECTOR << i)) { - if (cs->hwtemps[regnr].vector_valid > pos) - pos = cs->hwtemps[regnr].vector_valid; - } - if (used & (SLOT_SRC_SCALAR << i)) { - if (cs->hwtemps[regnr].scalar_valid > pos) - pos = cs->hwtemps[regnr].scalar_valid; - } - } + arg = r300FPTranslateAlphaSwizzle(inst->Alpha.Arg[j].Source, inst->Alpha.Arg[j].Swizzle); + arg |= inst->Alpha.Arg[j].Abs << 6; + arg |= inst->Alpha.Arg[j].Negate << 5; + code->alu.inst[ip].inst2 |= arg << (7*j); } - // Find a slot that fits - for (;; ++pos) { - if (cs->slot[pos].used & used & SLOT_OP_BOTH) - continue; - - if (pos >= cs->nrslots) { - if (cs->nrslots >= PFS_MAX_ALU_INST) { - ERROR("Out of ALU instruction slots\n"); - return -1; - } - - code->alu.inst[pos].inst0 = NOP_INST0; - code->alu.inst[pos].inst1 = NOP_INST1; - code->alu.inst[pos].inst2 = NOP_INST2; - code->alu.inst[pos].inst3 = NOP_INST3; - - cs->nrslots++; - } - // Note: When we need both parts (vector and scalar) of a source, - // we always try to put them into the same position. This makes the - // code easier to read, and it is optimal (i.e. one doesn't gain - // anything by splitting the parts). - // It also avoids headaches with swizzles that access both parts (i.e WXY) - tempused = cs->slot[pos].used; - for (i = 0; i < 3; ++i) { - tempvsrc[i] = cs->slot[pos].vsrc[i]; - tempssrc[i] = cs->slot[pos].ssrc[i]; - } - - for (i = 0; i < argc; ++i) { - int flags = (used >> i) & SLOT_SRC_BOTH; - - if (!flags) { - srcpos[i] = 0; - continue; - } - - for (j = 0; j < 3; ++j) { - if ((tempused >> j) & flags & SLOT_SRC_VECTOR) { - if (tempvsrc[j] != hwsrc[i]) - continue; - } - - if ((tempused >> j) & flags & SLOT_SRC_SCALAR) { - if (tempssrc[j] != hwsrc[i]) - continue; - } + if (inst->RGB.Saturate) + code->alu.inst[ip].inst0 |= R300_ALU_OUTC_CLAMP; + if (inst->Alpha.Saturate) + code->alu.inst[ip].inst2 |= R300_ALU_OUTA_CLAMP; - break; - } - - if (j == 3) - break; - - srcpos[i] = j; - tempused |= flags << j; - if (flags & SLOT_SRC_VECTOR) - tempvsrc[j] = hwsrc[i]; - if (flags & SLOT_SRC_SCALAR) - tempssrc[j] = hwsrc[i]; - } - - if (i == argc) - break; + if (inst->RGB.WriteMask) { + use_temporary(code, inst->RGB.DestIndex); + code->alu.inst[ip].inst1 |= + (inst->RGB.DestIndex << R300_ALU_DSTC_SHIFT) | + (inst->RGB.WriteMask << R300_ALU_DSTC_REG_MASK_SHIFT); } - - // Found a slot, reserve it - cs->slot[pos].used = tempused | (used & SLOT_OP_BOTH); - for (i = 0; i < 3; ++i) { - cs->slot[pos].vsrc[i] = tempvsrc[i]; - cs->slot[pos].ssrc[i] = tempssrc[i]; + if (inst->RGB.OutputWriteMask) { + code->alu.inst[ip].inst1 |= (inst->RGB.OutputWriteMask << R300_ALU_DSTC_OUTPUT_MASK_SHIFT); + code->node[code->cur_node].flags |= R300_RGBA_OUT; } - for (i = 0; i < argc; ++i) { - if (REG_GET_TYPE(src[i]) == REG_TYPE_TEMP) { - int regnr = hwsrc[i] & 31; - - if (used & (SLOT_SRC_VECTOR << i)) { - if (cs->hwtemps[regnr].vector_lastread < pos) - cs->hwtemps[regnr].vector_lastread = - pos; - } - if (used & (SLOT_SRC_SCALAR << i)) { - if (cs->hwtemps[regnr].scalar_lastread < pos) - cs->hwtemps[regnr].scalar_lastread = - pos; - } - } + if (inst->Alpha.WriteMask) { + use_temporary(code, inst->Alpha.DestIndex); + code->alu.inst[ip].inst3 |= + (inst->Alpha.DestIndex << R300_ALU_DSTA_SHIFT) | + R300_ALU_DSTA_REG; } - - // Emit the source fetch code - code->alu.inst[pos].inst1 &= ~R300_ALU_SRC_MASK; - code->alu.inst[pos].inst1 |= - ((cs->slot[pos].vsrc[0] << R300_ALU_SRC0C_SHIFT) | - (cs->slot[pos].vsrc[1] << R300_ALU_SRC1C_SHIFT) | - (cs->slot[pos].vsrc[2] << R300_ALU_SRC2C_SHIFT)); - - code->alu.inst[pos].inst3 &= ~R300_ALU_SRC_MASK; - code->alu.inst[pos].inst3 |= - ((cs->slot[pos].ssrc[0] << R300_ALU_SRC0A_SHIFT) | - (cs->slot[pos].ssrc[1] << R300_ALU_SRC1A_SHIFT) | - (cs->slot[pos].ssrc[2] << R300_ALU_SRC2A_SHIFT)); - - // Emit the argument selection code - if (emit_vop) { - int swz[3]; - - for (i = 0; i < 3; ++i) { - if (i < argc) { - swz[i] = (v_swiz[REG_GET_VSWZ(src[i])].base + - (srcpos[i] * - v_swiz[REG_GET_VSWZ(src[i])]. - stride)) | ((src[i] & REG_NEGV_MASK) - ? ARG_NEG : 0) | ((src[i] - & - REG_ABS_MASK) - ? - ARG_ABS - : 0); - } else { - swz[i] = R300_ALU_ARGC_ZERO; - } - } - - code->alu.inst[pos].inst0 &= - ~(R300_ALU_ARG0C_MASK | R300_ALU_ARG1C_MASK | - R300_ALU_ARG2C_MASK); - code->alu.inst[pos].inst0 |= - (swz[0] << R300_ALU_ARG0C_SHIFT) | (swz[1] << - R300_ALU_ARG1C_SHIFT) - | (swz[2] << R300_ALU_ARG2C_SHIFT); + if (inst->Alpha.OutputWriteMask) { + code->alu.inst[ip].inst3 |= R300_ALU_DSTA_OUTPUT; + code->node[code->cur_node].flags |= R300_RGBA_OUT; } - - if (emit_sop) { - int swz[3]; - - for (i = 0; i < 3; ++i) { - if (i < argc) { - swz[i] = (s_swiz[REG_GET_SSWZ(src[i])].base + - (srcpos[i] * - s_swiz[REG_GET_SSWZ(src[i])]. - stride)) | ((src[i] & REG_NEGS_MASK) - ? ARG_NEG : 0) | ((src[i] - & - REG_ABS_MASK) - ? - ARG_ABS - : 0); - } else { - swz[i] = R300_ALU_ARGA_ZERO; - } - } - - code->alu.inst[pos].inst2 &= - ~(R300_ALU_ARG0A_MASK | R300_ALU_ARG1A_MASK | - R300_ALU_ARG2A_MASK); - code->alu.inst[pos].inst2 |= - (swz[0] << R300_ALU_ARG0A_SHIFT) | (swz[1] << - R300_ALU_ARG1A_SHIFT) - | (swz[2] << R300_ALU_ARG2A_SHIFT); + if (inst->Alpha.DepthWriteMask) { + code->alu.inst[ip].inst3 |= R300_ALU_DSTA_DEPTH; + code->node[code->cur_node].flags |= R300_W_OUT; + c->fp->WritesDepth = GL_TRUE; } - return pos; + return GL_TRUE; } + /** - * Append an ALU instruction to the instruction list. + * Finish the current node without advancing to the next one. */ -static void emit_arith(struct r300_pfs_compile_state *cs, - int op, - GLuint dest, - int mask, - GLuint src0, GLuint src1, GLuint src2, int flags) +static GLboolean finish_node(struct r300_fragment_program_compiler *c) { - COMPILE_STATE; - GLuint src[3] = { src0, src1, src2 }; - int hwdest; - GLboolean emit_vop, emit_sop; - int vop, sop, argc; - int pos; - - vop = r300_fpop[op].v_op; - sop = r300_fpop[op].s_op; - argc = r300_fpop[op].argc; - - if (REG_GET_TYPE(dest) == REG_TYPE_OUTPUT && - REG_GET_INDEX(dest) == FRAG_RESULT_DEPR) { - if (mask & WRITEMASK_Z) { - mask = WRITEMASK_W; - } else { - return; - } - } - - emit_vop = GL_FALSE; - emit_sop = GL_FALSE; - if ((mask & WRITEMASK_XYZ) || vop == R300_ALU_OUTC_DP3) - emit_vop = GL_TRUE; - if ((mask & WRITEMASK_W) || vop == R300_ALU_OUTC_REPL_ALPHA) - emit_sop = GL_TRUE; - - pos = - find_and_prepare_slot(cs, emit_vop, emit_sop, argc, src, dest, - mask); - if (pos < 0) - return; - - hwdest = t_hw_dst(cs, dest, GL_FALSE, pos); /* Note: Side effects wrt register allocation */ - - if (flags & PFS_FLAG_SAT) { - vop |= R300_ALU_OUTC_CLAMP; - sop |= R300_ALU_OUTA_CLAMP; + struct r300_fragment_program_code *code = c->code; + struct r300_fragment_program_node *node = &code->node[code->cur_node]; + + if (node->alu_end < 0) { + /* Generate a single NOP for this node */ + struct radeon_pair_instruction inst; + _mesa_bzero(&inst, sizeof(inst)); + if (!emit_alu(c, &inst)) + return GL_FALSE; } - /* Throw the pieces together and get ALU/1 */ - if (emit_vop) { - code->alu.inst[pos].inst0 |= vop; - - code->alu.inst[pos].inst1 |= hwdest << R300_ALU_DSTC_SHIFT; - - if (REG_GET_TYPE(dest) == REG_TYPE_OUTPUT) { - if (REG_GET_INDEX(dest) == FRAG_RESULT_COLR) { - code->alu.inst[pos].inst1 |= - (mask & WRITEMASK_XYZ) << - R300_ALU_DSTC_OUTPUT_MASK_SHIFT; - } else - assert(0); + if (node->tex_end < 0) { + if (code->cur_node == 0) { + node->tex_end = 0; } else { - code->alu.inst[pos].inst1 |= - (mask & WRITEMASK_XYZ) << - R300_ALU_DSTC_REG_MASK_SHIFT; - - cs->hwtemps[hwdest].vector_valid = pos + 1; - } - } - - /* And now ALU/3 */ - if (emit_sop) { - code->alu.inst[pos].inst2 |= sop; - - if (mask & WRITEMASK_W) { - if (REG_GET_TYPE(dest) == REG_TYPE_OUTPUT) { - if (REG_GET_INDEX(dest) == FRAG_RESULT_COLR) { - code->alu.inst[pos].inst3 |= - (hwdest << R300_ALU_DSTA_SHIFT) | - R300_ALU_DSTA_OUTPUT; - } else if (REG_GET_INDEX(dest) == - FRAG_RESULT_DEPR) { - code->alu.inst[pos].inst3 |= - R300_ALU_DSTA_DEPTH; - } else - assert(0); - } else { - code->alu.inst[pos].inst3 |= - (hwdest << R300_ALU_DSTA_SHIFT) | - R300_ALU_DSTA_REG; - - cs->hwtemps[hwdest].scalar_valid = pos + 1; - } + error("Node %i has no TEX instructions", code->cur_node); + return GL_FALSE; } + } else { + if (code->cur_node == 0) + code->first_node_has_tex = 1; } - return; + return GL_TRUE; } -static void emit_instruction(struct r300_pfs_compile_state *cs, struct prog_instruction *fpi) -{ - COMPILE_STATE; - GLuint src[3], dest; - int flags, mask = 0; - if (fpi->SaturateMode == SATURATE_ZERO_ONE) - flags = PFS_FLAG_SAT; - else - flags = 0; +/** + * Begin a block of texture instructions. + * Create the necessary indirection. + */ +static GLboolean begin_tex(void* data) +{ + PROG_CODE; - if (fpi->Opcode != OPCODE_KIL) { - dest = t_dst(cs, fpi->DstReg); - mask = fpi->DstReg.WriteMask; + if (code->cur_node == 0) { + if (code->node[0].alu_end < 0 && + code->node[0].tex_end < 0) + return GL_TRUE; } - switch (fpi->Opcode) { - case OPCODE_ADD: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - emit_arith(cs, PFS_OP_MAD, dest, mask, - src[0], pfs_one, src[1], flags); - break; - case OPCODE_CMP: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - src[2] = t_src(cs, fpi->SrcReg[2]); - /* ARB_f_p - if src0.c < 0.0 ? src1.c : src2.c - * r300 - if src2.c < 0.0 ? src1.c : src0.c - */ - emit_arith(cs, PFS_OP_CMP, dest, mask, - src[2], src[1], src[0], flags); - break; - case OPCODE_DP3: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - emit_arith(cs, PFS_OP_DP3, dest, mask, - src[0], src[1], undef, flags); - break; - case OPCODE_DP4: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - emit_arith(cs, PFS_OP_DP4, dest, mask, - src[0], src[1], undef, flags); - break; - case OPCODE_EX2: - src[0] = t_scalar_src(cs, fpi->SrcReg[0]); - emit_arith(cs, PFS_OP_EX2, dest, mask, - src[0], undef, undef, flags); - break; - case OPCODE_FRC: - src[0] = t_src(cs, fpi->SrcReg[0]); - emit_arith(cs, PFS_OP_FRC, dest, mask, - src[0], undef, undef, flags); - break; - case OPCODE_KIL: - emit_tex(cs, fpi, R300_TEX_OP_KIL); - break; - case OPCODE_LG2: - src[0] = t_scalar_src(cs, fpi->SrcReg[0]); - emit_arith(cs, PFS_OP_LG2, dest, mask, - src[0], undef, undef, flags); - break; - case OPCODE_MAD: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - src[2] = t_src(cs, fpi->SrcReg[2]); - emit_arith(cs, PFS_OP_MAD, dest, mask, - src[0], src[1], src[2], flags); - break; - case OPCODE_MAX: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - emit_arith(cs, PFS_OP_MAX, dest, mask, - src[0], src[1], undef, flags); - break; - case OPCODE_MIN: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - emit_arith(cs, PFS_OP_MIN, dest, mask, - src[0], src[1], undef, flags); - break; - case OPCODE_MOV: - src[0] = t_src(cs, fpi->SrcReg[0]); - emit_arith(cs, PFS_OP_MAD, dest, mask, - src[0], pfs_one, pfs_zero, flags); - break; - case OPCODE_MUL: - src[0] = t_src(cs, fpi->SrcReg[0]); - src[1] = t_src(cs, fpi->SrcReg[1]); - emit_arith(cs, PFS_OP_MAD, dest, mask, - src[0], src[1], pfs_zero, flags); - break; - case OPCODE_RCP: - src[0] = t_scalar_src(cs, fpi->SrcReg[0]); - emit_arith(cs, PFS_OP_RCP, dest, mask, - src[0], undef, undef, flags); - break; - case OPCODE_RSQ: - src[0] = t_scalar_src(cs, fpi->SrcReg[0]); - emit_arith(cs, PFS_OP_RSQ, dest, mask, - absolute(src[0]), pfs_zero, pfs_zero, flags); - break; - case OPCODE_TEX: - emit_tex(cs, fpi, R300_TEX_OP_LD); - break; - case OPCODE_TXB: - emit_tex(cs, fpi, R300_TEX_OP_TXB); - break; - case OPCODE_TXP: - emit_tex(cs, fpi, R300_TEX_OP_TXP); - break; - default: - ERROR("unknown fpi->Opcode %d\n", fpi->Opcode); - break; + if (code->cur_node == 3) { + error("Too many texture indirections"); + return GL_FALSE; } -} - -static GLboolean parse_program(struct r300_pfs_compile_state *cs) -{ - COMPILE_STATE; - struct prog_instruction* fpi; - for(fpi = cs->compiler->program->Instructions; fpi->Opcode != OPCODE_END; ++fpi) { - emit_instruction(cs, fpi); - - if (fp->error) - return GL_FALSE; - } + if (!finish_node(c)) + return GL_FALSE; + struct r300_fragment_program_node *node = &code->node[++code->cur_node]; + node->alu_offset = code->alu.length; + node->alu_end = -1; + node->tex_offset = code->tex.length; + node->tex_end = -1; return GL_TRUE; } -/* - Init structures - * - Determine what hwregs each input corresponds to - */ -static void init_program(struct r300_pfs_compile_state *cs) +static GLboolean emit_tex(void* data, struct prog_instruction* inst) { - COMPILE_STATE; - struct gl_fragment_program *mp = &fp->mesa_program; - GLuint InputsRead = mp->Base.InputsRead; - GLuint temps_used = 0; /* for fp->temps[] */ - int i, j; - - /* New compile, reset tracking data */ - fp->optimization = - driQueryOptioni(&cs->compiler->r300->radeon.optionCache, "fp_optimization"); - fp->translated = GL_FALSE; - fp->error = GL_FALSE; - fp->WritesDepth = GL_FALSE; - code->tex.length = 0; - code->cur_node = 0; - code->first_node_has_tex = 0; - code->const_nr = 0; - code->max_temp_idx = 0; - code->node[0].alu_end = -1; - code->node[0].tex_end = -1; - - for (i = 0; i < PFS_MAX_ALU_INST; i++) { - for (j = 0; j < 3; j++) { - cs->slot[i].vsrc[j] = SRC_CONST; - cs->slot[i].ssrc[j] = SRC_CONST; - } - } - - /* Work out what temps the Mesa inputs correspond to, this must match - * what setup_rs_unit does, which shouldn't be a problem as rs_unit - * configures itself based on the fragprog's InputsRead - * - * NOTE: this depends on get_hw_temp() allocating registers in order, - * starting from register 0. - */ + PROG_CODE; - /* Texcoords come first */ - for (i = 0; i < cs->compiler->r300->radeon.glCtx->Const.MaxTextureUnits; i++) { - if (InputsRead & (FRAG_BIT_TEX0 << i)) { - cs->inputs[FRAG_ATTRIB_TEX0 + i].refcount = 0; - cs->inputs[FRAG_ATTRIB_TEX0 + i].reg = - get_hw_temp(cs, 0); - } - } - InputsRead &= ~FRAG_BITS_TEX_ANY; - - /* fragment position treated as a texcoord */ - if (InputsRead & FRAG_BIT_WPOS) { - cs->inputs[FRAG_ATTRIB_WPOS].refcount = 0; - cs->inputs[FRAG_ATTRIB_WPOS].reg = get_hw_temp(cs, 0); + if (code->tex.length >= PFS_MAX_TEX_INST) { + error("Too many TEX instructions"); + return GL_FALSE; } - InputsRead &= ~FRAG_BIT_WPOS; - /* Then primary colour */ - if (InputsRead & FRAG_BIT_COL0) { - cs->inputs[FRAG_ATTRIB_COL0].refcount = 0; - cs->inputs[FRAG_ATTRIB_COL0].reg = get_hw_temp(cs, 0); - } - InputsRead &= ~FRAG_BIT_COL0; + GLuint unit = inst->TexSrcUnit; + GLuint dest = inst->DstReg.Index; + GLuint opcode; - /* Secondary color */ - if (InputsRead & FRAG_BIT_COL1) { - cs->inputs[FRAG_ATTRIB_COL1].refcount = 0; - cs->inputs[FRAG_ATTRIB_COL1].reg = get_hw_temp(cs, 0); + switch(inst->Opcode) { + case OPCODE_KIL: opcode = R300_TEX_OP_KIL; break; + case OPCODE_TEX: opcode = R300_TEX_OP_LD; break; + case OPCODE_TXB: opcode = R300_TEX_OP_TXB; break; + case OPCODE_TXP: opcode = R300_TEX_OP_TXP; break; + default: + error("Unknown texture opcode %i", inst->Opcode); + return GL_FALSE; } - InputsRead &= ~FRAG_BIT_COL1; - /* Anything else */ - if (InputsRead) { - WARN_ONCE("Don't know how to handle inputs 0x%x\n", InputsRead); - /* force read from hwreg 0 for now */ - for (i = 0; i < 32; i++) - if (InputsRead & (1 << i)) - cs->inputs[i].reg = 0; + if (inst->Opcode == OPCODE_KIL) { + unit = 0; + dest = 0; + } else { + use_temporary(code, dest); } - /* Pre-parse the program, grabbing refcounts on input/temp regs. - * That way, we can free up the reg when it's no longer needed - */ - for (i = 0; i < cs->compiler->program->NumInstructions; ++i) { - struct prog_instruction *fpi = cs->compiler->program->Instructions + i; - int idx; - - for (j = 0; j < 3; j++) { - idx = fpi->SrcReg[j].Index; - switch (fpi->SrcReg[j].File) { - case PROGRAM_TEMPORARY: - if (!(temps_used & (1 << idx))) { - cs->temps[idx].reg = -1; - cs->temps[idx].refcount = 1; - temps_used |= (1 << idx); - } else - cs->temps[idx].refcount++; - break; - case PROGRAM_INPUT: - cs->inputs[idx].refcount++; - break; - default: - break; - } - } + use_temporary(code, inst->SrcReg[0].Index); - idx = fpi->DstReg.Index; - if (fpi->DstReg.File == PROGRAM_TEMPORARY) { - if (!(temps_used & (1 << idx))) { - cs->temps[idx].reg = -1; - cs->temps[idx].refcount = 1; - temps_used |= (1 << idx); - } else - cs->temps[idx].refcount++; - } - } - cs->temp_in_use = temps_used; + code->node[code->cur_node].tex_end++; + code->tex.inst[code->tex.length++] = + (inst->SrcReg[0].Index << R300_SRC_ADDR_SHIFT) | + (dest << R300_DST_ADDR_SHIFT) | + (unit << R300_TEX_ID_SHIFT) | + (opcode << R300_TEX_INST_SHIFT); + return GL_TRUE; } +static const struct radeon_pair_handler pair_handler = { + .EmitConst = &emit_const, + .EmitPaired = &emit_alu, + .EmitTex = &emit_tex, + .BeginTexBlock = &begin_tex, + .MaxHwTemps = PFS_NUM_TEMP_REGS +}; + /** * Final compilation step: Turn the intermediate radeon_program into * machine-readable instructions. */ GLboolean r300FragmentProgramEmit(struct r300_fragment_program_compiler *compiler) { - struct r300_pfs_compile_state cs; struct r300_fragment_program_code *code = compiler->code; - _mesa_memset(&cs, 0, sizeof(cs)); - cs.compiler = compiler; - init_program(&cs); + _mesa_bzero(code, sizeof(struct r300_fragment_program_code)); + code->node[0].alu_end = -1; + code->node[0].tex_end = -1; - if (!parse_program(&cs)) + if (!radeonPairProgram(compiler->r300->radeon.glCtx, compiler->program, &pair_handler, compiler)) return GL_FALSE; - /* Finish off */ - code->node[code->cur_node].alu_end = - cs.nrslots - code->node[code->cur_node].alu_offset - 1; - if (code->node[code->cur_node].tex_end < 0) - code->node[code->cur_node].tex_end = 0; - code->alu_offset = 0; - code->alu_end = cs.nrslots - 1; - code->tex_offset = 0; - code->tex_end = code->tex.length ? code->tex.length - 1 : 0; - assert(code->node[code->cur_node].alu_end >= 0); - assert(code->alu_end >= 0); + if (!finish_node(compiler)) + return GL_FALSE; return GL_TRUE; } diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_swizzle.c b/src/mesa/drivers/dri/r300/r300_fragprog_swizzle.c new file mode 100644 index 00000000000..a86d2bd4712 --- /dev/null +++ b/src/mesa/drivers/dri/r300/r300_fragprog_swizzle.c @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2008 Nicolai Haehnle. + * + * 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 (including the + * next paragraph) 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 COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS 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. + * + */ + +/** + * @file + * Utilities to deal with the somewhat odd restriction on R300 fragment + * program swizzles. + */ + +#include "r300_fragprog_swizzle.h" + +#include "r300_reg.h" +#include "radeon_nqssadce.h" + +#define MAKE_SWZ3(x, y, z) (MAKE_SWIZZLE4(SWIZZLE_##x, SWIZZLE_##y, SWIZZLE_##z, SWIZZLE_ZERO)) + +struct swizzle_data { + GLuint hash; /**< swizzle value this matches */ + GLuint base; /**< base value for hw swizzle */ + GLuint stride; /**< difference in base between arg0/1/2 */ +}; + +static const struct swizzle_data native_swizzles[] = { + {MAKE_SWZ3(X, Y, Z), R300_ALU_ARGC_SRC0C_XYZ, 4}, + {MAKE_SWZ3(X, X, X), R300_ALU_ARGC_SRC0C_XXX, 4}, + {MAKE_SWZ3(Y, Y, Y), R300_ALU_ARGC_SRC0C_YYY, 4}, + {MAKE_SWZ3(Z, Z, Z), R300_ALU_ARGC_SRC0C_ZZZ, 4}, + {MAKE_SWZ3(W, W, W), R300_ALU_ARGC_SRC0A, 1}, + {MAKE_SWZ3(Y, Z, X), R300_ALU_ARGC_SRC0C_YZX, 1}, + {MAKE_SWZ3(Z, X, Y), R300_ALU_ARGC_SRC0C_ZXY, 1}, + {MAKE_SWZ3(W, Z, Y), R300_ALU_ARGC_SRC0CA_WZY, 1}, + {MAKE_SWZ3(ONE, ONE, ONE), R300_ALU_ARGC_ONE, 0}, + {MAKE_SWZ3(ZERO, ZERO, ZERO), R300_ALU_ARGC_ZERO, 0} +}; + +static const int num_native_swizzles = sizeof(native_swizzles)/sizeof(native_swizzles[0]); + + +/** + * Find a native RGB swizzle that matches the given swizzle. + * Returns 0 if none found. + */ +static const struct swizzle_data* lookup_native_swizzle(GLuint swizzle) +{ + int i, comp; + + for(i = 0; i < num_native_swizzles; ++i) { + const struct swizzle_data* sd = &native_swizzles[i]; + for(comp = 0; comp < 3; ++comp) { + GLuint swz = GET_SWZ(swizzle, comp); + if (swz == SWIZZLE_NIL) + continue; + if (swz != GET_SWZ(sd->hash, comp)) + break; + } + if (comp == 3) + return sd; + } + + return 0; +} + + +/** + * Check whether the given instruction supports the swizzle and negate + * combinations in the given source register. + */ +GLboolean r300FPIsNativeSwizzle(GLuint opcode, struct prog_src_register reg) +{ + if (reg.Abs) + reg.NegateBase = 0; + + if (opcode == OPCODE_KIL || + opcode == OPCODE_TEX || + opcode == OPCODE_TXB || + opcode == OPCODE_TXP) { + int j; + + if (reg.Abs || reg.NegateBase != (15*reg.NegateAbs)) + return GL_FALSE; + + for(j = 0; j < 4; ++j) { + GLuint swz = GET_SWZ(reg.Swizzle, j); + if (swz == SWIZZLE_NIL) + continue; + if (swz != j) + return GL_FALSE; + } + + return GL_TRUE; + } + + GLuint relevant = 0; + int j; + + for(j = 0; j < 3; ++j) + if (GET_SWZ(reg.Swizzle, j) != SWIZZLE_NIL) + relevant |= 1 << j; + + if ((reg.NegateBase & relevant) && (reg.NegateBase & relevant) != relevant) + return GL_FALSE; + + if (!lookup_native_swizzle(reg.Swizzle)) + return GL_FALSE; + + return GL_TRUE; +} + + +/** + * Generate MOV dst, src using only native swizzles. + */ +void r300FPBuildSwizzle(struct nqssadce_state *s, struct prog_dst_register dst, struct prog_src_register src) +{ + if (src.Abs) + src.NegateBase = 0; + + while(dst.WriteMask) { + const struct swizzle_data *best_swizzle = 0; + GLuint best_matchcount = 0; + GLuint best_matchmask = 0; + GLboolean rgbnegate; + int i, comp; + + for(i = 0; i < num_native_swizzles; ++i) { + const struct swizzle_data *sd = &native_swizzles[i]; + GLuint matchcount = 0; + GLuint matchmask = 0; + for(comp = 0; comp < 3; ++comp) { + if (!GET_BIT(dst.WriteMask, comp)) + continue; + GLuint swz = GET_SWZ(src.Swizzle, comp); + if (swz == SWIZZLE_NIL) + continue; + if (swz == GET_SWZ(sd->hash, comp)) { + matchcount++; + matchmask |= 1 << comp; + } + } + if (matchcount > best_matchcount) { + best_swizzle = sd; + best_matchcount = matchcount; + best_matchmask = matchmask; + if (matchmask == (dst.WriteMask & WRITEMASK_XYZ)) + break; + } + } + + if ((src.NegateBase & best_matchmask) != 0) { + best_matchmask &= src.NegateBase; + rgbnegate = !src.NegateAbs; + } else { + rgbnegate = src.NegateAbs; + } + + struct prog_instruction *inst; + + _mesa_insert_instructions(s->Program, s->IP, 1); + inst = s->Program->Instructions + s->IP++; + inst->Opcode = OPCODE_MOV; + inst->DstReg = dst; + inst->DstReg.WriteMask &= (best_matchmask | WRITEMASK_W); + inst->SrcReg[0] = src; + /* Note: We rely on NqSSA/DCE to set unused swizzle components to NIL */ + + dst.WriteMask &= ~inst->DstReg.WriteMask; + } +} + + +/** + * Translate an RGB (XYZ) swizzle into the hardware code for the given + * instruction source. + */ +GLuint r300FPTranslateRGBSwizzle(GLuint src, GLuint swizzle) +{ + const struct swizzle_data* sd = lookup_native_swizzle(swizzle); + + if (!sd) { + _mesa_printf("Not a native swizzle: %08x\n", swizzle); + return 0; + } + + return sd->base + src*sd->stride; +} + + +/** + * Translate an Alpha (W) swizzle into the hardware code for the given + * instruction source. + */ +GLuint r300FPTranslateAlphaSwizzle(GLuint src, GLuint swizzle) +{ + if (swizzle < 3) + return swizzle + 3*src; + + switch(swizzle) { + case SWIZZLE_W: return R300_ALU_ARGA_SRC0A + src; + case SWIZZLE_ONE: return R300_ALU_ARGA_ONE; + case SWIZZLE_ZERO: return R300_ALU_ARGA_ZERO; + default: return R300_ALU_ARGA_ONE; + } +} diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_swizzle.h b/src/mesa/drivers/dri/r300/r300_fragprog_swizzle.h new file mode 100644 index 00000000000..3da99a9dbe2 --- /dev/null +++ b/src/mesa/drivers/dri/r300/r300_fragprog_swizzle.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2008 Nicolai Haehnle. + * + * 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 (including the + * next paragraph) 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 COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS 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. + * + */ + +#ifndef __R300_FRAGPROG_SWIZZLE_H_ +#define __R300_FRAGPROG_SWIZZLE_H_ + +#include "glheader.h" +#include "shader/prog_instruction.h" + +struct nqssadce_state; + +GLboolean r300FPIsNativeSwizzle(GLuint opcode, struct prog_src_register reg); +void r300FPBuildSwizzle(struct nqssadce_state*, struct prog_dst_register dst, struct prog_src_register src); + +GLuint r300FPTranslateRGBSwizzle(GLuint src, GLuint swizzle); +GLuint r300FPTranslateAlphaSwizzle(GLuint src, GLuint swizzle); + +#endif /* __R300_FRAGPROG_SWIZZLE_H_ */ diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index fbe5f664181..6931de4421d 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -2497,26 +2497,17 @@ static void r300SetupPixelShader(r300ContextPtr rmesa) r300SetupTextures(ctx); R300_STATECHANGE(rmesa, fpi[0]); - rmesa->hw.fpi[0].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_RGB_INST_0, code->alu_end + 1); - for (i = 0; i <= code->alu_end; i++) { - rmesa->hw.fpi[0].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst0; - } - R300_STATECHANGE(rmesa, fpi[1]); - rmesa->hw.fpi[1].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_RGB_ADDR_0, code->alu_end + 1); - for (i = 0; i <= code->alu_end; i++) { - rmesa->hw.fpi[1].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst1; - } - R300_STATECHANGE(rmesa, fpi[2]); - rmesa->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_ALPHA_INST_0, code->alu_end + 1); - for (i = 0; i <= code->alu_end; i++) { - rmesa->hw.fpi[2].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst2; - } - R300_STATECHANGE(rmesa, fpi[3]); - rmesa->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_ALPHA_ADDR_0, code->alu_end + 1); - for (i = 0; i <= code->alu_end; i++) { + rmesa->hw.fpi[0].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_RGB_INST_0, code->alu.length); + rmesa->hw.fpi[1].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_RGB_ADDR_0, code->alu.length); + rmesa->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_ALPHA_INST_0, code->alu.length); + rmesa->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_ALPHA_ADDR_0, code->alu.length); + for (i = 0; i < code->alu.length; i++) { + rmesa->hw.fpi[0].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst0; + rmesa->hw.fpi[1].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst1; + rmesa->hw.fpi[2].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst2; rmesa->hw.fpi[3].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst3; } @@ -2524,10 +2515,10 @@ static void r300SetupPixelShader(r300ContextPtr rmesa) rmesa->hw.fp.cmd[R300_FP_CNTL0] = code->cur_node | (code->first_node_has_tex << 3); rmesa->hw.fp.cmd[R300_FP_CNTL1] = code->max_temp_idx; rmesa->hw.fp.cmd[R300_FP_CNTL2] = - (code->alu_offset << R300_PFS_CNTL_ALU_OFFSET_SHIFT) | - (code->alu_end << R300_PFS_CNTL_ALU_END_SHIFT) | - (code->tex_offset << R300_PFS_CNTL_TEX_OFFSET_SHIFT) | - (code->tex_end << R300_PFS_CNTL_TEX_END_SHIFT); + (0 << R300_PFS_CNTL_ALU_OFFSET_SHIFT) | + ((code->alu.length-1) << R300_PFS_CNTL_ALU_END_SHIFT) | + (0 << R300_PFS_CNTL_TEX_OFFSET_SHIFT) | + ((code->tex.length ? code->tex.length-1 : 0) << R300_PFS_CNTL_TEX_END_SHIFT); /* I just want to say, the way these nodes are stored.. weird.. */ for (i = 0, k = (4 - (code->cur_node + 1)); i < 4; i++, k++) { if (i < (code->cur_node + 1)) { diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.h b/src/mesa/drivers/dri/r300/r500_fragprog.h index ed8f7f41cac..8641ceeb8f4 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.h +++ b/src/mesa/drivers/dri/r300/r500_fragprog.h @@ -45,36 +45,6 @@ #include "r300_state.h" #include "radeon_program.h" -/* supported hw opcodes */ -#define PFS_OP_MAD 0 -#define PFS_OP_DP3 1 -#define PFS_OP_DP4 2 -#define PFS_OP_MIN 3 -#define PFS_OP_MAX 4 -#define PFS_OP_CMP 5 -#define PFS_OP_FRC 6 -#define PFS_OP_EX2 7 -#define PFS_OP_LG2 8 -#define PFS_OP_RCP 9 -#define PFS_OP_RSQ 10 -#define PFS_OP_REPL_ALPHA 11 -#define PFS_OP_CMPH 12 -#define MAX_PFS_OP 12 - -#define PFS_FLAG_SAT (1 << 0) -#define PFS_FLAG_ABS (1 << 1) - -#define ARG_NEG (1 << 5) -#define ARG_ABS (1 << 6) -#define ARG_MASK (127 << 0) -#define ARG_STRIDE 7 -#define SRC_CONST (1 << 5) -#define SRC_MASK (63 << 0) -#define SRC_STRIDE 6 - -#define DRI_CONF_FP_OPTIMIZATION_SPEED 0 -#define DRI_CONF_FP_OPTIMIZATION_QUALITY 1 - struct r500_fragment_program; extern void r500TranslateFragmentShader(r300ContextPtr r300, diff --git a/src/mesa/drivers/dri/r300/radeon_program_pair.c b/src/mesa/drivers/dri/r300/radeon_program_pair.c index 85ddf1dc50e..8762422801e 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_pair.c +++ b/src/mesa/drivers/dri/r300/radeon_program_pair.c @@ -578,6 +578,9 @@ static void emit_all_tex(struct pair_state *s) if (s->Debug) _mesa_printf(" BEGIN_TEX\n"); + if (s->Handler->BeginTexBlock) + s->Error = s->Error || !s->Handler->BeginTexBlock(s->UserData); + for(pairinst = readytex; pairinst; pairinst = pairinst->NextReady) { int ip = pairinst - s->Instructions; struct prog_instruction *inst = s->Program->Instructions + ip; @@ -594,9 +597,6 @@ static void emit_all_tex(struct pair_state *s) s->Error = s->Error || !s->Handler->EmitTex(s->UserData, inst); } - if (s->Handler->EndTexBlock) - s->Handler->EndTexBlock(s->UserData); - if (s->Debug) _mesa_printf(" END_TEX\n"); } diff --git a/src/mesa/drivers/dri/r300/radeon_program_pair.h b/src/mesa/drivers/dri/r300/radeon_program_pair.h index b2bdd08d27c..4624a246298 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_pair.h +++ b/src/mesa/drivers/dri/r300/radeon_program_pair.h @@ -110,10 +110,10 @@ struct radeon_pair_handler { GLboolean (*EmitTex)(void*, struct prog_instruction*); /** - * Called after a block of contiguous, independent texture - * instructions has been emitted. + * Called before a block of contiguous, independent texture + * instructions is emitted. */ - void (*EndTexBlock)(void*); + GLboolean (*BeginTexBlock)(void*); GLuint MaxHwTemps; }; -- cgit v1.2.3 From 4fab47b13c214dc79e0ae5d8001521029ce34231 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Sun, 13 Jul 2008 19:00:46 +1000 Subject: glx/dri: only report DRI2 extensions when DRI2 is enabled. Fixes bug 15477 --- src/glx/x11/dri2_glx.c | 2 +- src/glx/x11/dri_common.c | 4 ++-- src/glx/x11/dri_common.h | 2 +- src/glx/x11/dri_glx.c | 2 +- src/glx/x11/drisw_glx.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/glx/x11/dri2_glx.c b/src/glx/x11/dri2_glx.c index b679c72c103..0be65bce624 100644 --- a/src/glx/x11/dri2_glx.c +++ b/src/glx/x11/dri2_glx.c @@ -308,7 +308,7 @@ static __GLXDRIscreen *dri2CreateScreen(__GLXscreenConfigs *psc, int screen, return NULL; } - driBindExtensions(psc); + driBindExtensions(psc, 1); psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs); psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs); diff --git a/src/glx/x11/dri_common.c b/src/glx/x11/dri_common.c index b159d193a51..8175f46c547 100644 --- a/src/glx/x11/dri_common.c +++ b/src/glx/x11/dri_common.c @@ -329,7 +329,7 @@ driConvertConfigs(const __DRIcoreExtension *core, } _X_HIDDEN void -driBindExtensions(__GLXscreenConfigs *psc) +driBindExtensions(__GLXscreenConfigs *psc, int dri2) { const __DRIextension **extensions; int i; @@ -386,7 +386,7 @@ driBindExtensions(__GLXscreenConfigs *psc) #endif #ifdef __DRI_TEX_BUFFER - if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) { + if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) && dri2) { psc->texBuffer = (__DRItexBufferExtension *) extensions[i]; __glXEnableDirectExtension(psc, "GLX_EXT_texture_from_pixmap"); } diff --git a/src/glx/x11/dri_common.h b/src/glx/x11/dri_common.h index 3556510335a..15f6cc87b9f 100644 --- a/src/glx/x11/dri_common.h +++ b/src/glx/x11/dri_common.h @@ -55,6 +55,6 @@ extern void ErrorMessageF(const char *f, ...); extern void *driOpenDriver(const char *driverName); -extern void driBindExtensions(__GLXscreenConfigs *psc); +extern void driBindExtensions(__GLXscreenConfigs *psc, int dri2); #endif /* _DRI_COMMON_H */ diff --git a/src/glx/x11/dri_glx.c b/src/glx/x11/dri_glx.c index d53f2d98541..82653f1625b 100644 --- a/src/glx/x11/dri_glx.c +++ b/src/glx/x11/dri_glx.c @@ -635,7 +635,7 @@ static __GLXDRIscreen *driCreateScreen(__GLXscreenConfigs *psc, int screen, return NULL; } - driBindExtensions(psc); + driBindExtensions(psc, 0); psp->destroyScreen = driDestroyScreen; psp->createContext = driCreateContext; diff --git a/src/glx/x11/drisw_glx.c b/src/glx/x11/drisw_glx.c index f7ff0011216..bcf7e144ef6 100644 --- a/src/glx/x11/drisw_glx.c +++ b/src/glx/x11/drisw_glx.c @@ -390,7 +390,7 @@ static __GLXDRIscreen *driCreateScreen(__GLXscreenConfigs *psc, int screen, goto handle_error; } - driBindExtensions(psc); + driBindExtensions(psc, 0); psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs); psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs); -- cgit v1.2.3