Subversion Repositories Kolibri OS

Rev

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