Ignore:
Timestamp:
May 23, 2000, 10:41:28 PM (25 years ago)
Author:
jeroen
Message:

* empty log message *

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/opengl/mesa/pipeline.c

    r2962 r3598  
    1 /* $Id: pipeline.c,v 1.2 2000-03-01 18:49:33 jeroen Exp $ */
     1/* $Id: pipeline.c,v 1.3 2000-05-23 20:40:43 jeroen Exp $ */
    22
    33/*
    44 * Mesa 3-D graphics library
    5  * Version:  3.1
     5 * Version:  3.3
    66 *
    77 * Copyright (C) 1999  Brian Paul   All Rights Reserved.
     
    2929 */
    3030
    31 #ifndef XFree86Server
    32 #include <stdio.h>
    33 #else
    34 #include "GL/xf86glx.h"
    35 #endif
     31#include "glheader.h"
    3632#include "bbox.h"
    3733#include "clip.h"
     
    5046#include "stages.h"
    5147#include "translate.h"
     48#include "state.h"
    5249#include "xform.h"
     50#include "mem.h"
    5351
    5452#ifndef MESA_VERBOSE
     
    7876{
    7977   fprintf(stderr,
    80            "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s\n",
    81            msg,
    82            flags,
    83            (flags & PIPE_OP_CVA_PREPARE)   ? "cva-prepare, " : "",
    84            (flags & PIPE_OP_VERT_XFORM)    ? "vert-xform, " : "",
    85            (flags & PIPE_OP_NORM_XFORM)    ? "norm-xform, " : "",
    86            (flags & PIPE_OP_LIGHT)         ? "light, " : "",
    87            (flags & PIPE_OP_FOG)           ? "fog, " : "",
    88            (flags & PIPE_OP_TEX0)          ? "tex-0, " : "",
    89            (flags & PIPE_OP_TEX1)          ? "tex-1, " : "",
    90            (flags & PIPE_OP_RAST_SETUP_0)  ? "rast-0, " : "",
    91            (flags & PIPE_OP_RAST_SETUP_1)  ? "rast-1, " : "",
    92            (flags & PIPE_OP_RENDER)        ? "render, " : "");
     78           "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s\n",
     79           msg,
     80           flags,
     81           (flags & PIPE_OP_CVA_PREPARE)   ? "cva-prepare, " : "",
     82           (flags & PIPE_OP_VERT_XFORM)    ? "vert-xform, " : "",
     83           (flags & PIPE_OP_NORM_XFORM)    ? "norm-xform, " : "",
     84           (flags & PIPE_OP_LIGHT)         ? "light, " : "",
     85           (flags & PIPE_OP_FOG)           ? "fog, " : "",
     86           (flags & PIPE_OP_TEX0)          ? "tex-0, " : "",
     87           (flags & PIPE_OP_TEX1)          ? "tex-1, " : "",
     88           (flags & PIPE_OP_RAST_SETUP_0)  ? "rast-0, " : "",
     89           (flags & PIPE_OP_RAST_SETUP_1)  ? "rast-1, " : "",
     90           (flags & PIPE_OP_RENDER)        ? "render, " : "");
    9391
    9492}
     
    111109   {
    112110      if (VB->ClipOrMask & CLIP_USER_BIT)
    113         MEMSET(VB->UserClipMask, 0, VB->Count);
     111        MEMSET(VB->UserClipMask, 0, VB->Count);
    114112
    115113      VB->ClipOrMask = 0;
     
    132130   {
    133131      if (ctx->Light.Enabled) {
    134         VB->Color[0] = VB->LitColor[0];
    135         VB->Color[1] = VB->LitColor[1];
    136         VB->Index[0] = VB->LitIndex[0];
    137         VB->Index[1] = VB->LitIndex[1];
     132        VB->Color[0] = VB->LitColor[0];
     133        VB->Color[1] = VB->LitColor[1];
     134        VB->Index[0] = VB->LitIndex[0];
     135        VB->Index[1] = VB->LitIndex[1];
    138136      } else {
    139         VB->Color[0] = VB->Color[1] = &ctx->CVA.v.Color;
    140         VB->Index[0] = VB->Index[1] = &ctx->CVA.v.Index;
     137        VB->Color[0] = VB->Color[1] = &ctx->CVA.v.Color;
     138        VB->Index[0] = VB->Index[1] = &ctx->CVA.v.Index;
    141139      }
    142140      VB->ColorPtr = VB->Color[0];
     
    177175   if (ctx->Driver.RegisterPipelineStages)
    178176      ctx->NrPipelineStages =
    179         ctx->Driver.RegisterPipelineStages( ctx->PipelineStage,
    180                                              gl_default_pipeline,
    181                                              gl_default_nr_stages );
     177        ctx->Driver.RegisterPipelineStages( ctx->PipelineStage,
     178                                             gl_default_pipeline,
     179                                             gl_default_nr_stages );
    182180   else
    183181   {
    184182      MEMCPY( ctx->PipelineStage,
    185               gl_default_pipeline,
    186               sizeof(*gl_default_pipeline) * gl_default_nr_stages );
     183              gl_default_pipeline,
     184              sizeof(*gl_default_pipeline) * gl_default_nr_stages );
    187185
    188186      ctx->NrPipelineStages = gl_default_nr_stages;
     
    201199
    202200#define VERT_CURRENT_DATA (VERT_TEX0_1234|VERT_TEX1_1234|VERT_RGBA| \
    203                            VERT_INDEX|VERT_EDGE|VERT_NORM| \
    204                            VERT_MATERIAL)
     201                           VERT_INDEX|VERT_EDGE|VERT_NORM| \
     202                           VERT_MATERIAL)
    205203
    206204/* Called prior to every recomputation of the CVA precalc data, except where
    207205 * the driver is able to calculate the pipeline unassisted.
    208206 */
    209 void gl_build_full_precalc_pipeline( GLcontext *ctx )
     207static void build_full_precalc_pipeline( GLcontext *ctx )
    210208{
    211209   struct gl_pipeline_stage *pipeline = ctx->PipelineStage;
     
    219217   GLuint oldinputs = pre->inputs;
    220218   GLuint fallback = (VERT_CURRENT_DATA & ctx->Current.Flag &
    221                       ~ctx->Array.Summary);
     219                      ~ctx->Array.Summary);
    222220   GLuint changed_outputs = (ctx->Array.NewArrayState |
    223                              (fallback & cva->orflag));
     221                             (fallback & cva->orflag));
    224222   GLuint available = fallback | ctx->Array.Flags;
    225223
     
    261259      if (pipeline[i].type & PIPE_PRECALC)
    262260      {
    263         if ((newstate & pipeline[i].cva_state_change) ||
    264              (changed_outputs & pipeline[i].inputs) ||
    265              !pipeline[i].inputs)
    266          {     
    267             changed_ops |= pipeline[i].ops;
    268             changed_outputs |= pipeline[i].outputs;
    269             pipeline[i].active &= ~PIPE_PRECALC;
    270 
    271             if ((pipeline[i].inputs & ~available) == 0 &&
    272                 (pipeline[i].ops & pre->ops) == 0)
    273             {
    274                pipeline[i].active |= PIPE_PRECALC;
    275                *stages++ = &pipeline[i];
    276             }
    277         }
    278 
    279         /* Incompatible with multiple stages structs implementing
    280           * the same stage.
    281           */
    282         available &= ~pipeline[i].outputs;
    283         pre->outputs &= ~pipeline[i].outputs;
    284 
    285         if (pipeline[i].active & PIPE_PRECALC) {
    286             pre->ops |= pipeline[i].ops;
    287             pre->outputs |= pipeline[i].outputs;
    288             available |= pipeline[i].outputs;
    289             pre->forbidden_inputs |= pipeline[i].pre_forbidden_inputs;
    290         }
     261        if ((newstate & pipeline[i].cva_state_change) ||
     262             (changed_outputs & pipeline[i].inputs) ||
     263             !pipeline[i].inputs)
     264         {
     265            changed_ops |= pipeline[i].ops;
     266            changed_outputs |= pipeline[i].outputs;
     267            pipeline[i].active &= ~PIPE_PRECALC;
     268
     269            if ((pipeline[i].inputs & ~available) == 0 &&
     270                (pipeline[i].ops & pre->ops) == 0)
     271            {
     272               pipeline[i].active |= PIPE_PRECALC;
     273               *stages++ = &pipeline[i];
     274            }
     275        }
     276
     277        /* Incompatible with multiple stages structs implementing
     278          * the same stage.
     279          */
     280        available &= ~pipeline[i].outputs;
     281        pre->outputs &= ~pipeline[i].outputs;
     282
     283        if (pipeline[i].active & PIPE_PRECALC) {
     284            pre->ops |= pipeline[i].ops;
     285            pre->outputs |= pipeline[i].outputs;
     286            available |= pipeline[i].outputs;
     287            pre->forbidden_inputs |= pipeline[i].pre_forbidden_inputs;
     288        }
    291289      }
    292290      else if (pipeline[i].active & PIPE_PRECALC)
    293291      {
    294         pipeline[i].active &= ~PIPE_PRECALC;
    295         changed_outputs |= pipeline[i].outputs;
    296         changed_ops |= pipeline[i].ops;
     292        pipeline[i].active &= ~PIPE_PRECALC;
     293        changed_outputs |= pipeline[i].outputs;
     294        changed_ops |= pipeline[i].ops;
    297295      }
    298296   }
     
    318316   if (!ctx->Driver.BuildPrecalcPipeline ||
    319317       !ctx->Driver.BuildPrecalcPipeline( ctx ))
    320       gl_build_full_precalc_pipeline( ctx );
     318      build_full_precalc_pipeline( ctx );
    321319
    322320   pre->data_valid = 0;
     
    331329
    332330
    333 static void gl_build_full_immediate_pipeline( GLcontext *ctx )
     331static void build_full_immediate_pipeline( GLcontext *ctx )
    334332{
    335333   struct gl_pipeline_stage *pipeline = ctx->PipelineStage;
     
    352350
    353351
    354    elt->outputs = 0;            /* not used */
     352   elt->outputs = 0;            /* not used */
    355353   elt->inputs = 0;
    356354
     
    359357
    360358      if ((pipeline[i].state_change & newstate) ||
    361           (pipeline[i].elt_forbidden_inputs & available))
     359          (pipeline[i].elt_forbidden_inputs & available))
    362360      {
    363         pipeline[i].check(ctx, &pipeline[i]);
     361        pipeline[i].check(ctx, &pipeline[i]);
    364362      }
    365363
    366364      if ((pipeline[i].type & PIPE_IMMEDIATE) &&
    367           (pipeline[i].ops & active_ops) == 0 &&
    368           (pipeline[i].elt_forbidden_inputs & available) == 0
    369         )
     365          (pipeline[i].ops & active_ops) == 0 &&
     366          (pipeline[i].elt_forbidden_inputs & available) == 0
     367        )
    370368      {
    371         if (pipeline[i].inputs & ~available)
    372             elt->forbidden_inputs |= pipeline[i].inputs & ~available;
    373         else
    374         {
    375             elt->inputs |= pipeline[i].inputs & ~generated;
    376             elt->forbidden_inputs |= pipeline[i].elt_forbidden_inputs;
    377             pipeline[i].active |= PIPE_IMMEDIATE;
    378             *stages++ = &pipeline[i];
    379             generated |= pipeline[i].outputs;
    380             available |= pipeline[i].outputs;
    381             active_ops |= pipeline[i].ops;
    382         }
     369        if (pipeline[i].inputs & ~available)
     370            elt->forbidden_inputs |= pipeline[i].inputs & ~available;
     371        else
     372        {
     373            elt->inputs |= pipeline[i].inputs & ~generated;
     374            elt->forbidden_inputs |= pipeline[i].elt_forbidden_inputs;
     375            pipeline[i].active |= PIPE_IMMEDIATE;
     376            *stages++ = &pipeline[i];
     377            generated |= pipeline[i].outputs;
     378            available |= pipeline[i].outputs;
     379            active_ops |= pipeline[i].ops;
     380        }
    383381      }
    384382   }
     
    403401   if (!ctx->Driver.BuildEltPipeline ||
    404402       !ctx->Driver.BuildEltPipeline( ctx )) {
    405       gl_build_full_immediate_pipeline( ctx );
     403      build_full_immediate_pipeline( ctx );
    406404   }
    407405
     
    433431
    434432      if (ctx->Visual->RGBAflag)
    435         flags |= VERT_RGBA;
     433        flags |= VERT_RGBA;
    436434      else
    437         flags |= VERT_INDEX;
     435        flags |= VERT_INDEX;
    438436
    439437      if (ctx->Texture.Enabled & 0xf) {
    440         if (ctx->Texture.Unit[0].EnvMode == GL_REPLACE)
    441             flags &= ~VERT_RGBA;
    442 
    443         flags |= VERT_TEX0_ANY;
     438        if (ctx->Texture.Unit[0].EnvMode == GL_REPLACE)
     439            flags &= ~VERT_RGBA;
     440
     441        flags |= VERT_TEX0_ANY;
    444442      }
    445443
    446444      if (ctx->Texture.Enabled & 0xf0)
    447         flags |= VERT_TEX1_ANY;
     445        flags |= VERT_TEX1_ANY;
    448446
    449447      if (ctx->Polygon.Unfilled)
    450         flags |= VERT_EDGE;
     448        flags |= VERT_EDGE;
    451449
    452450      if (ctx->RenderMode==GL_FEEDBACK)
    453451      {
    454         flags = (VERT_WIN|VERT_RGBA|VERT_INDEX|
    455                   VERT_NORM|VERT_EDGE|
    456                   VERT_TEX0_ANY|VERT_TEX1_ANY);
     452        flags = (VERT_WIN|VERT_RGBA|VERT_INDEX|
     453                  VERT_NORM|VERT_EDGE|
     454                  VERT_TEX0_ANY|VERT_TEX1_ANY);
    457455      }
    458456
     
    481479   struct gl_pipeline *pipe = VB->pipeline;
    482480   struct gl_pipeline_stage **stages = pipe->stages;
    483    short x;
    484 
    485    pipe->data_valid = 1;        /* optimized stages might want to reset this. */
     481   unsigned short x;
     482
     483   pipe->data_valid = 1;        /* optimized stages might want to reset this. */
    486484
    487485   START_FAST_MATH(x);
     
    498496{
    499497   fprintf(stderr,
    500            "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
    501            name,
    502            flags,
    503            (flags & VERT_OBJ_ANY)    ? "vertices (obj), " : "",
    504            (flags & VERT_ELT)        ? "array-elt, " : "",
    505            (flags & VERT_RGBA)       ? "colors, " : "",
    506            (flags & VERT_NORM)       ? "normals, " : "",
    507            (flags & VERT_INDEX)      ? "index, " : "",
    508            (flags & VERT_EDGE)       ? "edgeflag, " : "",
    509            (flags & VERT_MATERIAL)   ? "material, " : "",
    510            (flags & VERT_TEX0_ANY)   ? "texcoord0, " : "",
    511            (flags & VERT_TEX1_ANY)   ? "texcoord1, " : "",
    512            (flags & VERT_EVAL_ANY)   ? "eval-coord, " : "",
    513            (flags & VERT_EYE)        ? "eye, " : "",
    514            (flags & VERT_WIN)        ? "win, " : "",
    515            (flags & VERT_PRECALC_DATA) ? "precalc data, " : "",
    516            (flags & VERT_SETUP_FULL) ? "driver-data, " : "",
    517            (flags & VERT_SETUP_PART) ? "partial-driver-data, " : ""
     498           "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
     499           name,
     500           flags,
     501           (flags & VERT_OBJ_ANY)    ? "vertices (obj), " : "",
     502           (flags & VERT_ELT)        ? "array-elt, " : "",
     503           (flags & VERT_RGBA)       ? "colors, " : "",
     504           (flags & VERT_NORM)       ? "normals, " : "",
     505           (flags & VERT_INDEX)      ? "index, " : "",
     506           (flags & VERT_EDGE)       ? "edgeflag, " : "",
     507           (flags & VERT_MATERIAL)   ? "material, " : "",
     508           (flags & VERT_TEX0_ANY)   ? "texcoord0, " : "",
     509           (flags & VERT_TEX1_ANY)   ? "texcoord1, " : "",
     510           (flags & VERT_EVAL_ANY)   ? "eval-coord, " : "",
     511           (flags & VERT_EYE)        ? "eye, " : "",
     512           (flags & VERT_WIN)        ? "win, " : "",
     513           (flags & VERT_PRECALC_DATA) ? "precalc data, " : "",
     514           (flags & VERT_SETUP_FULL) ? "driver-data, " : "",
     515           (flags & VERT_SETUP_PART) ? "partial-driver-data, " : ""
    518516      );
    519517}
     
    522520{
    523521   fprintf(stderr,
    524            "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
    525            name,
    526            flags,
    527            (flags & DD_FEEDBACK)            ? "feedback, " : "",
    528            (flags & DD_SELECT)              ? "select, " : "",
    529            (flags & DD_FLATSHADE)           ? "flat-shade, " : "",
    530            (flags & DD_MULTIDRAW)           ? "multidraw, " : "",
    531            (flags & DD_SEPERATE_SPECULAR)   ? "seperate-specular, " : "",
    532            (flags & DD_TRI_LIGHT_TWOSIDE)   ? "tri-light-twoside, " : "",
    533            (flags & DD_TRI_UNFILLED)        ? "tri-unfilled, " : "",
    534            (flags & DD_TRI_STIPPLE)         ? "tri-stipple, " : "",
    535            (flags & DD_TRI_OFFSET)          ? "tri-offset, " : "",
    536            (flags & DD_TRI_CULL)            ? "tri-bf-cull, " : "",
    537            (flags & DD_LINE_SMOOTH)         ? "line-smooth, " : "",
    538            (flags & DD_LINE_STIPPLE)        ? "line-stipple, " : "",
    539            (flags & DD_LINE_WIDTH)          ? "line-wide, " : "",
    540            (flags & DD_POINT_SMOOTH)        ? "point-smooth, " : "",
    541            (flags & DD_POINT_SIZE)          ? "point-size, " : "",
    542            (flags & DD_POINT_ATTEN)         ? "point-atten, " : "",
    543            (flags & DD_LIGHTING_CULL)       ? "lighting-cull, " : "",
    544            (flags & DD_POINT_SW_RASTERIZE)  ? "sw-points, " : "",
    545            (flags & DD_LINE_SW_RASTERIZE)   ? "sw-lines, " : "",
    546            (flags & DD_TRI_SW_RASTERIZE)    ? "sw-tris, " : "",
    547            (flags & DD_QUAD_SW_RASTERIZE)   ? "sw-quads, " : "",
    548            (flags & DD_TRI_CULL_FRONT_BACK) ? "cull-all, " : ""
     522           "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
     523           name,
     524           flags,
     525           (flags & DD_FEEDBACK)            ? "feedback, " : "",
     526           (flags & DD_SELECT)              ? "select, " : "",
     527           (flags & DD_FLATSHADE)           ? "flat-shade, " : "",
     528           (flags & DD_MULTIDRAW)           ? "multidraw, " : "",
     529           (flags & DD_SEPERATE_SPECULAR)   ? "seperate-specular, " : "",
     530           (flags & DD_TRI_LIGHT_TWOSIDE)   ? "tri-light-twoside, " : "",
     531           (flags & DD_TRI_UNFILLED)        ? "tri-unfilled, " : "",
     532           (flags & DD_TRI_STIPPLE)         ? "tri-stipple, " : "",
     533           (flags & DD_TRI_OFFSET)          ? "tri-offset, " : "",
     534           (flags & DD_TRI_CULL)            ? "tri-bf-cull, " : "",
     535           (flags & DD_LINE_SMOOTH)         ? "line-smooth, " : "",
     536           (flags & DD_LINE_STIPPLE)        ? "line-stipple, " : "",
     537           (flags & DD_LINE_WIDTH)          ? "line-wide, " : "",
     538           (flags & DD_POINT_SMOOTH)        ? "point-smooth, " : "",
     539           (flags & DD_POINT_SIZE)          ? "point-size, " : "",
     540           (flags & DD_POINT_ATTEN)         ? "point-atten, " : "",
     541           (flags & DD_LIGHTING_CULL)       ? "lighting-cull, " : "",
     542           (flags & DD_POINT_SW_RASTERIZE)  ? "sw-points, " : "",
     543           (flags & DD_LINE_SW_RASTERIZE)   ? "sw-lines, " : "",
     544           (flags & DD_TRI_SW_RASTERIZE)    ? "sw-tris, " : "",
     545           (flags & DD_QUAD_SW_RASTERIZE)   ? "sw-quads, " : "",
     546           (flags & DD_TRI_CULL_FRONT_BACK) ? "cull-all, " : ""
    549547      );
    550548}
     
    569567   if (0)
    570568      for (i = 0 ; i < ctx->NrPipelineStages ; i++)
    571         if (pipeline[i].active & p->type) {
    572             fprintf(stderr,"%u: %s\n", i, pipeline[i].name);
    573        
    574             gl_print_vert_flags("\tinputs", pipeline[i].inputs);
    575             gl_print_vert_flags("\toutputs", pipeline[i].outputs);
    576        
    577             if (p->type == PIPE_PRECALC && pipeline[i].pre_forbidden_inputs)
    578                gl_print_vert_flags("\tforbidden",
    579                                    pipeline[i].pre_forbidden_inputs);
    580 
    581             if (p->type == PIPE_IMMEDIATE && pipeline[i].elt_forbidden_inputs)
    582                gl_print_vert_flags("\tforbidden",
    583                                    pipeline[i].elt_forbidden_inputs);
    584 
    585         }
     569        if (pipeline[i].active & p->type) {
     570            fprintf(stderr,"%u: %s\n", i, pipeline[i].name);
     571
     572            gl_print_vert_flags("\tinputs", pipeline[i].inputs);
     573            gl_print_vert_flags("\toutputs", pipeline[i].outputs);
     574
     575            if (p->type == PIPE_PRECALC && pipeline[i].pre_forbidden_inputs)
     576               gl_print_vert_flags("\tforbidden",
     577                                   pipeline[i].pre_forbidden_inputs);
     578
     579            if (p->type == PIPE_IMMEDIATE && pipeline[i].elt_forbidden_inputs)
     580               gl_print_vert_flags("\tforbidden",
     581                                   pipeline[i].elt_forbidden_inputs);
     582
     583        }
    586584
    587585
     
    590588      fprintf(stderr,"\nStages requiring precalculation:\n");
    591589      for ( i=0 ; stages[i] ; i++) {
    592         fprintf(stderr, "%u: %s\n", i, stages[i]->name);
    593         gl_print_vert_flags("\tinputs", stages[i]->inputs);
    594         gl_print_vert_flags("\toutputs", stages[i]->outputs);
    595         if (p->type == PIPE_PRECALC && pipeline[i].pre_forbidden_inputs)
    596             gl_print_vert_flags("\tforbidden",
    597                                 pipeline[i].pre_forbidden_inputs);
    598 
    599         if (p->type == PIPE_IMMEDIATE && pipeline[i].elt_forbidden_inputs)
    600             gl_print_vert_flags("\tforbidden",
    601                                 pipeline[i].elt_forbidden_inputs);
     590        fprintf(stderr, "%u: %s\n", i, stages[i]->name);
     591        gl_print_vert_flags("\tinputs", stages[i]->inputs);
     592        gl_print_vert_flags("\toutputs", stages[i]->outputs);
     593        if (p->type == PIPE_PRECALC && pipeline[i].pre_forbidden_inputs)
     594            gl_print_vert_flags("\tforbidden",
     595                                pipeline[i].pre_forbidden_inputs);
     596
     597        if (p->type == PIPE_IMMEDIATE && pipeline[i].elt_forbidden_inputs)
     598            gl_print_vert_flags("\tforbidden",
     599                                pipeline[i].elt_forbidden_inputs);
    602600      }
    603601   }
     
    631629
    632630      if (p->type == PIPE_PRECALC && stages[i]->pre_forbidden_inputs)
    633             gl_print_vert_flags("\tforbidden",
    634                                 stages[i]->pre_forbidden_inputs);
    635       }
    636 }
    637 
    638 
     631            gl_print_vert_flags("\tforbidden",
     632                                stages[i]->pre_forbidden_inputs);
     633      }
     634}
     635
     636
Note: See TracChangeset for help on using the changeset viewer.