Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #ifndef DO_DEBUG_VERTS
  2. #define DO_DEBUG_VERTS 0
  3. #endif
  4.  
  5. #ifndef PRINT_VERTEX
  6. #define PRINT_VERTEX(x)
  7. #endif
  8.  
  9. #if defined(USE_X86_ASM)
  10. #define COPY_DWORDS( j, vb, vertsize, v )                               \
  11. do {                                                                    \
  12.         int __tmp;                                                      \
  13.         __asm__ __volatile__( "rep ; movsl"                             \
  14.                               : "=%c" (j), "=D" (vb), "=S" (__tmp)      \
  15.                               : "0" (vertsize),                         \
  16.                                 "D" ((long)vb),                         \
  17.                                 "S" ((long)v) );                        \
  18. } while (0)
  19. #else
  20. #define COPY_DWORDS( j, vb, vertsize, v )                               \
  21. do {                                                                    \
  22.    for ( j = 0 ; j < vertsize ; j++ )                                   \
  23.       vb[j] = ((GLuint *)v)[j];                                         \
  24.    vb += vertsize;                                                      \
  25. } while (0)
  26. #endif
  27.  
  28.  
  29.  
  30. #if HAVE_QUADS
  31. static __inline void TAG(quad)( CTX_ARG,
  32.                                 VERTEX *v0,
  33.                                 VERTEX *v1,
  34.                                 VERTEX *v2,
  35.                                 VERTEX *v3 )
  36. {
  37.    GLuint vertsize = GET_VERTEX_DWORDS();
  38.    GLuint *vb = (GLuint *)ALLOC_VERTS( 4, vertsize);
  39.    GLuint j;
  40.  
  41.    if (DO_DEBUG_VERTS) {
  42.       fprintf(stderr, "%s\n", __func__);
  43.       PRINT_VERTEX(v0);
  44.       PRINT_VERTEX(v1);
  45.       PRINT_VERTEX(v2);
  46.       PRINT_VERTEX(v3);
  47.    }
  48.      
  49.    COPY_DWORDS( j, vb, vertsize, v0 );
  50.    COPY_DWORDS( j, vb, vertsize, v1 );
  51.    COPY_DWORDS( j, vb, vertsize, v2 );
  52.    COPY_DWORDS( j, vb, vertsize, v3 );
  53. }
  54. #else
  55. static __inline void TAG(quad)( CTX_ARG,
  56.                                 VERTEX *v0,
  57.                                 VERTEX *v1,
  58.                                 VERTEX *v2,
  59.                                 VERTEX *v3 )
  60. {
  61.    GLuint vertsize = GET_VERTEX_DWORDS();
  62.    GLuint *vb = (GLuint *)ALLOC_VERTS(  6, vertsize);
  63.    GLuint j;
  64.  
  65.    if (DO_DEBUG_VERTS) {
  66.       fprintf(stderr, "%s\n", __func__);
  67.       PRINT_VERTEX(v0);
  68.       PRINT_VERTEX(v1);
  69.       PRINT_VERTEX(v2);
  70.       PRINT_VERTEX(v3);
  71.    }
  72.  
  73.    COPY_DWORDS( j, vb, vertsize, v0 );
  74.    COPY_DWORDS( j, vb, vertsize, v1 );
  75.    COPY_DWORDS( j, vb, vertsize, v3 );
  76.    COPY_DWORDS( j, vb, vertsize, v1 );
  77.    COPY_DWORDS( j, vb, vertsize, v2 );
  78.    COPY_DWORDS( j, vb, vertsize, v3 );
  79. }
  80. #endif
  81.  
  82.  
  83. static __inline void TAG(triangle)( CTX_ARG,
  84.                                     VERTEX *v0,
  85.                                     VERTEX *v1,
  86.                                     VERTEX *v2 )
  87. {
  88.    GLuint vertsize = GET_VERTEX_DWORDS();
  89.    GLuint *vb = (GLuint *)ALLOC_VERTS( 3, vertsize);
  90.    GLuint j;
  91.  
  92.    if (DO_DEBUG_VERTS) {
  93.       fprintf(stderr, "%s\n", __func__);
  94.       PRINT_VERTEX(v0);
  95.       PRINT_VERTEX(v1);
  96.       PRINT_VERTEX(v2);
  97.    }
  98.  
  99.    COPY_DWORDS( j, vb, vertsize, v0 );
  100.    COPY_DWORDS( j, vb, vertsize, v1 );
  101.    COPY_DWORDS( j, vb, vertsize, v2 );
  102. }
  103.  
  104.  
  105. #if HAVE_LINES
  106. static __inline void TAG(line)( CTX_ARG,
  107.                                 VERTEX *v0,
  108.                                 VERTEX *v1 )
  109. {
  110.    GLuint vertsize = GET_VERTEX_DWORDS();
  111.    GLuint *vb = (GLuint *)ALLOC_VERTS( 2, vertsize);
  112.    GLuint j;
  113.  
  114.    COPY_DWORDS( j, vb, vertsize, v0 );
  115.    COPY_DWORDS( j, vb, vertsize, v1 );
  116. }
  117. #endif
  118.  
  119. #if HAVE_POINTS
  120. static __inline void TAG(point)( CTX_ARG,
  121.                                  VERTEX *v0 )
  122. {
  123.    GLuint vertsize = GET_VERTEX_DWORDS();
  124.    GLuint *vb = (GLuint *)ALLOC_VERTS( 1, vertsize);
  125.    int j;
  126.  
  127.    COPY_DWORDS( j, vb, vertsize, v0 );
  128. }
  129. #endif
  130.  
  131.  
  132. static void TAG(fast_clipped_poly)( struct gl_context *ctx, const GLuint *elts,
  133.                                     GLuint n )
  134. {
  135.    LOCAL_VARS
  136.    GLuint vertsize = GET_VERTEX_DWORDS();
  137.    GLuint *vb = (GLuint *)ALLOC_VERTS( (n-2) * 3, vertsize );
  138.    const GLuint *start = (const GLuint *)VERT(elts[0]);
  139.    GLuint i,j;
  140.  
  141.    if (DO_DEBUG_VERTS) {
  142.       fprintf(stderr, "%s\n", __func__);
  143.       PRINT_VERTEX(VERT(elts[0]));
  144.       PRINT_VERTEX(VERT(elts[1]));
  145.    }
  146.  
  147.    for (i = 2 ; i < n ; i++) {
  148.       if (DO_DEBUG_VERTS) {
  149.          PRINT_VERTEX(VERT(elts[i]));
  150.       }
  151.  
  152.       COPY_DWORDS( j, vb, vertsize, VERT(elts[i-1]) );
  153.       COPY_DWORDS( j, vb, vertsize, VERT(elts[i]) );
  154.       COPY_DWORDS( j, vb, vertsize, start );
  155.    }
  156. }
  157.  
  158.