2 * Copyright (C) 2009 Francisco Jerez.
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial
15 * portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 #include "nouveau_driver.h"
28 #include "nouveau_context.h"
29 #include "nouveau_gldefs.h"
30 #include "nouveau_util.h"
31 #include "nv10_3d.xml.h"
32 #include "nv10_driver.h"
35 nv10_emit_cull_face(struct gl_context
*ctx
, int emit
)
37 struct nouveau_pushbuf
*push
= context_push(ctx
);
38 GLenum mode
= ctx
->Polygon
.CullFaceMode
;
40 BEGIN_NV04(push
, NV10_3D(CULL_FACE_ENABLE
), 1);
41 PUSH_DATAb(push
, ctx
->Polygon
.CullFlag
);
43 BEGIN_NV04(push
, NV10_3D(CULL_FACE
), 1);
44 PUSH_DATA (push
, (mode
== GL_FRONT
? NV10_3D_CULL_FACE_FRONT
:
45 mode
== GL_BACK
? NV10_3D_CULL_FACE_BACK
:
46 NV10_3D_CULL_FACE_FRONT_AND_BACK
));
50 nv10_emit_front_face(struct gl_context
*ctx
, int emit
)
52 struct nouveau_pushbuf
*push
= context_push(ctx
);
54 BEGIN_NV04(push
, NV10_3D(FRONT_FACE
), 1);
55 PUSH_DATA (push
, ctx
->Polygon
.FrontFace
== GL_CW
?
56 NV10_3D_FRONT_FACE_CW
: NV10_3D_FRONT_FACE_CCW
);
60 nv10_emit_line_mode(struct gl_context
*ctx
, int emit
)
62 struct nouveau_pushbuf
*push
= context_push(ctx
);
63 GLboolean smooth
= ctx
->Line
.SmoothFlag
&&
64 ctx
->Hint
.LineSmooth
== GL_NICEST
;
66 BEGIN_NV04(push
, NV10_3D(LINE_WIDTH
), 1);
67 PUSH_DATA (push
, MAX2(smooth
? 0 : 1,
68 ctx
->Line
.Width
) * 8);
69 BEGIN_NV04(push
, NV10_3D(LINE_SMOOTH_ENABLE
), 1);
70 PUSH_DATAb(push
, smooth
);
74 nv10_emit_line_stipple(struct gl_context
*ctx
, int emit
)
79 nv10_emit_point_mode(struct gl_context
*ctx
, int emit
)
81 struct nouveau_pushbuf
*push
= context_push(ctx
);
83 BEGIN_NV04(push
, NV10_3D(POINT_SIZE
), 1);
84 PUSH_DATA (push
, (uint32_t)(ctx
->Point
.Size
* 8));
86 BEGIN_NV04(push
, NV10_3D(POINT_SMOOTH_ENABLE
), 1);
87 PUSH_DATAb(push
, ctx
->Point
.SmoothFlag
);
91 nv10_emit_polygon_mode(struct gl_context
*ctx
, int emit
)
93 struct nouveau_pushbuf
*push
= context_push(ctx
);
95 BEGIN_NV04(push
, NV10_3D(POLYGON_MODE_FRONT
), 2);
96 PUSH_DATA (push
, nvgl_polygon_mode(ctx
->Polygon
.FrontMode
));
97 PUSH_DATA (push
, nvgl_polygon_mode(ctx
->Polygon
.BackMode
));
99 BEGIN_NV04(push
, NV10_3D(POLYGON_SMOOTH_ENABLE
), 1);
100 PUSH_DATAb(push
, ctx
->Polygon
.SmoothFlag
);
104 nv10_emit_polygon_offset(struct gl_context
*ctx
, int emit
)
106 struct nouveau_pushbuf
*push
= context_push(ctx
);
108 BEGIN_NV04(push
, NV10_3D(POLYGON_OFFSET_POINT_ENABLE
), 3);
109 PUSH_DATAb(push
, ctx
->Polygon
.OffsetPoint
);
110 PUSH_DATAb(push
, ctx
->Polygon
.OffsetLine
);
111 PUSH_DATAb(push
, ctx
->Polygon
.OffsetFill
);
113 BEGIN_NV04(push
, NV10_3D(POLYGON_OFFSET_FACTOR
), 2);
114 PUSH_DATAf(push
, ctx
->Polygon
.OffsetFactor
);
115 PUSH_DATAf(push
, ctx
->Polygon
.OffsetUnits
);
119 nv10_emit_polygon_stipple(struct gl_context
*ctx
, int emit
)