xref: /aosp_15_r20/external/mesa3d/src/glx/eval.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3  * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4  *
5  * SPDX-License-Identifier: SGI-B-2.0
6  */
7 
8 #include "packrender.h"
9 
10 /*
11 ** Routines to pack evaluator maps into the transport buffer.  Maps are
12 ** allowed to have extra arbitrary data, so these routines extract just
13 ** the information that the GL needs.
14 */
15 
16 void
__glFillMap1f(GLint k,GLint order,GLint stride,const GLfloat * points,GLubyte * pc)17 __glFillMap1f(GLint k, GLint order, GLint stride,
18               const GLfloat * points, GLubyte * pc)
19 {
20    if (stride == k) {
21       /* Just copy the data */
22       __GLX_PUT_FLOAT_ARRAY(0, points, order * k);
23    }
24    else {
25       GLint i;
26 
27       for (i = 0; i < order; i++) {
28          __GLX_PUT_FLOAT_ARRAY(0, points, k);
29          points += stride;
30          pc += k * __GLX_SIZE_FLOAT32;
31       }
32    }
33 }
34 
35 void
__glFillMap1d(GLint k,GLint order,GLint stride,const GLdouble * points,GLubyte * pc)36 __glFillMap1d(GLint k, GLint order, GLint stride,
37               const GLdouble * points, GLubyte * pc)
38 {
39    if (stride == k) {
40       /* Just copy the data */
41       __GLX_PUT_DOUBLE_ARRAY(0, points, order * k);
42    }
43    else {
44       GLint i;
45       for (i = 0; i < order; i++) {
46          __GLX_PUT_DOUBLE_ARRAY(0, points, k);
47          points += stride;
48          pc += k * __GLX_SIZE_FLOAT64;
49       }
50    }
51 }
52 
53 void
__glFillMap2f(GLint k,GLint majorOrder,GLint minorOrder,GLint majorStride,GLint minorStride,const GLfloat * points,GLfloat * data)54 __glFillMap2f(GLint k, GLint majorOrder, GLint minorOrder,
55               GLint majorStride, GLint minorStride,
56               const GLfloat * points, GLfloat * data)
57 {
58    GLint i, j, x;
59 
60    if ((minorStride == k) && (majorStride == minorOrder * k)) {
61       /* Just copy the data */
62       __GLX_MEM_COPY(data, points, majorOrder * majorStride *
63                      __GLX_SIZE_FLOAT32);
64       return;
65    }
66    for (i = 0; i < majorOrder; i++) {
67       for (j = 0; j < minorOrder; j++) {
68          for (x = 0; x < k; x++) {
69             data[x] = points[x];
70          }
71          points += minorStride;
72          data += k;
73       }
74       points += majorStride - minorStride * minorOrder;
75    }
76 }
77 
78 void
__glFillMap2d(GLint k,GLint majorOrder,GLint minorOrder,GLint majorStride,GLint minorStride,const GLdouble * points,GLdouble * data)79 __glFillMap2d(GLint k, GLint majorOrder, GLint minorOrder,
80               GLint majorStride, GLint minorStride,
81               const GLdouble * points, GLdouble * data)
82 {
83    int i, j, x;
84 
85    if ((minorStride == k) && (majorStride == minorOrder * k)) {
86       /* Just copy the data */
87       __GLX_MEM_COPY(data, points, majorOrder * majorStride *
88                      __GLX_SIZE_FLOAT64);
89       return;
90    }
91 
92 #ifdef __GLX_ALIGN64
93    x = k * __GLX_SIZE_FLOAT64;
94 #endif
95    for (i = 0; i < majorOrder; i++) {
96       for (j = 0; j < minorOrder; j++) {
97 #ifdef __GLX_ALIGN64
98          __GLX_MEM_COPY(data, points, x);
99 #else
100          for (x = 0; x < k; x++) {
101             data[x] = points[x];
102          }
103 #endif
104          points += minorStride;
105          data += k;
106       }
107       points += majorStride - minorStride * minorOrder;
108    }
109 }
110