Home | History | Annotate | Download | only in swrast
      1 /*
      2  * Mesa 3-D graphics library
      3  * Version:  7.0
      4  *
      5  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 #include "main/glheader.h"
     26 #include "main/colormac.h"
     27 #include "main/feedback.h"
     28 #include "main/macros.h"
     29 
     30 #include "s_context.h"
     31 #include "s_feedback.h"
     32 #include "s_triangle.h"
     33 
     34 
     35 
     36 static void
     37 feedback_vertex(struct gl_context * ctx, const SWvertex * v, const SWvertex * pv)
     38 {
     39    GLfloat win[4];
     40    const GLfloat *vtc = v->attrib[FRAG_ATTRIB_TEX0];
     41    const GLfloat *color = v->attrib[FRAG_ATTRIB_COL0];
     42 
     43    win[0] = v->attrib[FRAG_ATTRIB_WPOS][0];
     44    win[1] = v->attrib[FRAG_ATTRIB_WPOS][1];
     45    win[2] = v->attrib[FRAG_ATTRIB_WPOS][2] / ctx->DrawBuffer->_DepthMaxF;
     46    win[3] = 1.0F / v->attrib[FRAG_ATTRIB_WPOS][3];
     47 
     48    _mesa_feedback_vertex(ctx, win, color, vtc);
     49 }
     50 
     51 
     52 /*
     53  * Put triangle in feedback buffer.
     54  */
     55 void
     56 _swrast_feedback_triangle(struct gl_context *ctx, const SWvertex *v0,
     57                           const SWvertex *v1, const SWvertex *v2)
     58 {
     59    if (!_swrast_culltriangle(ctx, v0, v1, v2)) {
     60       _mesa_feedback_token(ctx, (GLfloat) (GLint) GL_POLYGON_TOKEN);
     61       _mesa_feedback_token(ctx, (GLfloat) 3); /* three vertices */
     62 
     63       if (ctx->Light.ShadeModel == GL_SMOOTH) {
     64          feedback_vertex(ctx, v0, v0);
     65          feedback_vertex(ctx, v1, v1);
     66          feedback_vertex(ctx, v2, v2);
     67       }
     68       else {
     69          feedback_vertex(ctx, v0, v2);
     70          feedback_vertex(ctx, v1, v2);
     71          feedback_vertex(ctx, v2, v2);
     72       }
     73    }
     74 }
     75 
     76 
     77 void
     78 _swrast_feedback_line(struct gl_context *ctx, const SWvertex *v0,
     79                       const SWvertex *v1)
     80 {
     81    GLenum token = GL_LINE_TOKEN;
     82    SWcontext *swrast = SWRAST_CONTEXT(ctx);
     83 
     84    if (swrast->StippleCounter == 0)
     85       token = GL_LINE_RESET_TOKEN;
     86 
     87    _mesa_feedback_token(ctx, (GLfloat) (GLint) token);
     88 
     89    if (ctx->Light.ShadeModel == GL_SMOOTH) {
     90       feedback_vertex(ctx, v0, v0);
     91       feedback_vertex(ctx, v1, v1);
     92    }
     93    else {
     94       feedback_vertex(ctx, v0, v1);
     95       feedback_vertex(ctx, v1, v1);
     96    }
     97 
     98    swrast->StippleCounter++;
     99 }
    100 
    101 
    102 void
    103 _swrast_feedback_point(struct gl_context *ctx, const SWvertex *v)
    104 {
    105    _mesa_feedback_token(ctx, (GLfloat) (GLint) GL_POINT_TOKEN);
    106    feedback_vertex(ctx, v, v);
    107 }
    108 
    109 
    110 void
    111 _swrast_select_triangle(struct gl_context *ctx, const SWvertex *v0,
    112                         const SWvertex *v1, const SWvertex *v2)
    113 {
    114    if (!_swrast_culltriangle(ctx, v0, v1, v2)) {
    115       const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
    116 
    117       _mesa_update_hitflag( ctx, v0->attrib[FRAG_ATTRIB_WPOS][2] * zs );
    118       _mesa_update_hitflag( ctx, v1->attrib[FRAG_ATTRIB_WPOS][2] * zs );
    119       _mesa_update_hitflag( ctx, v2->attrib[FRAG_ATTRIB_WPOS][2] * zs );
    120    }
    121 }
    122 
    123 
    124 void
    125 _swrast_select_line(struct gl_context *ctx, const SWvertex *v0, const SWvertex *v1)
    126 {
    127    const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
    128    _mesa_update_hitflag( ctx, v0->attrib[FRAG_ATTRIB_WPOS][2] * zs );
    129    _mesa_update_hitflag( ctx, v1->attrib[FRAG_ATTRIB_WPOS][2] * zs );
    130 }
    131 
    132 
    133 void
    134 _swrast_select_point(struct gl_context *ctx, const SWvertex *v)
    135 {
    136    const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
    137    _mesa_update_hitflag( ctx, v->attrib[FRAG_ATTRIB_WPOS][2] * zs );
    138 }
    139