1 /*
2 * Copyright (C) 2009 Francisco Jerez.
3 * All Rights Reserved.
4 *
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:
12 *
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.
16 *
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.
24 *
25 */
26
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"
33
34 void
nv10_emit_alpha_func(struct gl_context * ctx,int emit)35 nv10_emit_alpha_func(struct gl_context *ctx, int emit)
36 {
37 struct nouveau_pushbuf *push = context_push(ctx);
38
39 BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_ENABLE), 1);
40 PUSH_DATAb(push, ctx->Color.AlphaEnabled);
41
42 BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_FUNC), 2);
43 PUSH_DATA (push, nvgl_comparison_op(ctx->Color.AlphaFunc));
44 PUSH_DATA (push, FLOAT_TO_UBYTE(ctx->Color.AlphaRef));
45 }
46
47 void
nv10_emit_blend_color(struct gl_context * ctx,int emit)48 nv10_emit_blend_color(struct gl_context *ctx, int emit)
49 {
50 struct nouveau_pushbuf *push = context_push(ctx);
51
52 BEGIN_NV04(push, NV10_3D(BLEND_COLOR), 1);
53 PUSH_DATA (push, FLOAT_TO_UBYTE(ctx->Color.BlendColor[3]) << 24 |
54 FLOAT_TO_UBYTE(ctx->Color.BlendColor[0]) << 16 |
55 FLOAT_TO_UBYTE(ctx->Color.BlendColor[1]) << 8 |
56 FLOAT_TO_UBYTE(ctx->Color.BlendColor[2]) << 0);
57 }
58
59 void
nv10_emit_blend_equation(struct gl_context * ctx,int emit)60 nv10_emit_blend_equation(struct gl_context *ctx, int emit)
61 {
62 struct nouveau_pushbuf *push = context_push(ctx);
63
64 BEGIN_NV04(push, NV10_3D(BLEND_FUNC_ENABLE), 1);
65 PUSH_DATAb(push, ctx->Color.BlendEnabled);
66
67 BEGIN_NV04(push, NV10_3D(BLEND_EQUATION), 1);
68 PUSH_DATA (push, nvgl_blend_eqn(ctx->Color.Blend[0].EquationRGB));
69 }
70
71 void
nv10_emit_blend_func(struct gl_context * ctx,int emit)72 nv10_emit_blend_func(struct gl_context *ctx, int emit)
73 {
74 struct nouveau_pushbuf *push = context_push(ctx);
75
76 BEGIN_NV04(push, NV10_3D(BLEND_FUNC_SRC), 2);
77 PUSH_DATA (push, nvgl_blend_func(ctx->Color.Blend[0].SrcRGB));
78 PUSH_DATA (push, nvgl_blend_func(ctx->Color.Blend[0].DstRGB));
79 }
80
81 void
nv10_emit_color_mask(struct gl_context * ctx,int emit)82 nv10_emit_color_mask(struct gl_context *ctx, int emit)
83 {
84 struct nouveau_pushbuf *push = context_push(ctx);
85
86 BEGIN_NV04(push, NV10_3D(COLOR_MASK), 1);
87 PUSH_DATA (push, ((ctx->Color.ColorMask[0][3] ? 1 << 24 : 0) |
88 (ctx->Color.ColorMask[0][0] ? 1 << 16 : 0) |
89 (ctx->Color.ColorMask[0][1] ? 1 << 8 : 0) |
90 (ctx->Color.ColorMask[0][2] ? 1 << 0 : 0)));
91 }
92
93 void
nv10_emit_depth(struct gl_context * ctx,int emit)94 nv10_emit_depth(struct gl_context *ctx, int emit)
95 {
96 struct nouveau_pushbuf *push = context_push(ctx);
97
98 BEGIN_NV04(push, NV10_3D(DEPTH_TEST_ENABLE), 1);
99 PUSH_DATAb(push, ctx->Depth.Test);
100 BEGIN_NV04(push, NV10_3D(DEPTH_WRITE_ENABLE), 1);
101 PUSH_DATAb(push, ctx->Depth.Mask);
102 BEGIN_NV04(push, NV10_3D(DEPTH_FUNC), 1);
103 PUSH_DATA (push, nvgl_comparison_op(ctx->Depth.Func));
104 }
105
106 void
nv10_emit_dither(struct gl_context * ctx,int emit)107 nv10_emit_dither(struct gl_context *ctx, int emit)
108 {
109 struct nouveau_pushbuf *push = context_push(ctx);
110
111 BEGIN_NV04(push, NV10_3D(DITHER_ENABLE), 1);
112 PUSH_DATAb(push, ctx->Color.DitherFlag);
113 }
114
115 void
nv10_emit_logic_opcode(struct gl_context * ctx,int emit)116 nv10_emit_logic_opcode(struct gl_context *ctx, int emit)
117 {
118 struct nouveau_pushbuf *push = context_push(ctx);
119
120 assert(!ctx->Color.ColorLogicOpEnabled
121 || context_chipset(ctx) >= 0x11);
122
123 BEGIN_NV04(push, NV11_3D(COLOR_LOGIC_OP_ENABLE), 2);
124 PUSH_DATAb(push, ctx->Color.ColorLogicOpEnabled);
125 PUSH_DATA (push, nvgl_logicop_func(ctx->Color.LogicOp));
126 }
127
128 void
nv10_emit_shade_model(struct gl_context * ctx,int emit)129 nv10_emit_shade_model(struct gl_context *ctx, int emit)
130 {
131 struct nouveau_pushbuf *push = context_push(ctx);
132
133 BEGIN_NV04(push, NV10_3D(SHADE_MODEL), 1);
134 PUSH_DATA (push, ctx->Light.ShadeModel == GL_SMOOTH ?
135 NV10_3D_SHADE_MODEL_SMOOTH : NV10_3D_SHADE_MODEL_FLAT);
136 }
137
138 void
nv10_emit_stencil_func(struct gl_context * ctx,int emit)139 nv10_emit_stencil_func(struct gl_context *ctx, int emit)
140 {
141 struct nouveau_pushbuf *push = context_push(ctx);
142
143 BEGIN_NV04(push, NV10_3D(STENCIL_ENABLE), 1);
144 PUSH_DATAb(push, ctx->Stencil.Enabled);
145
146 BEGIN_NV04(push, NV10_3D(STENCIL_FUNC_FUNC), 3);
147 PUSH_DATA (push, nvgl_comparison_op(ctx->Stencil.Function[0]));
148 PUSH_DATA (push, ctx->Stencil.Ref[0]);
149 PUSH_DATA (push, ctx->Stencil.ValueMask[0]);
150 }
151
152 void
nv10_emit_stencil_mask(struct gl_context * ctx,int emit)153 nv10_emit_stencil_mask(struct gl_context *ctx, int emit)
154 {
155 struct nouveau_pushbuf *push = context_push(ctx);
156
157 BEGIN_NV04(push, NV10_3D(STENCIL_MASK), 1);
158 PUSH_DATA (push, ctx->Stencil.WriteMask[0]);
159 }
160
161 void
nv10_emit_stencil_op(struct gl_context * ctx,int emit)162 nv10_emit_stencil_op(struct gl_context *ctx, int emit)
163 {
164 struct nouveau_pushbuf *push = context_push(ctx);
165
166 BEGIN_NV04(push, NV10_3D(STENCIL_OP_FAIL), 3);
167 PUSH_DATA (push, nvgl_stencil_op(ctx->Stencil.FailFunc[0]));
168 PUSH_DATA (push, nvgl_stencil_op(ctx->Stencil.ZFailFunc[0]));
169 PUSH_DATA (push, nvgl_stencil_op(ctx->Stencil.ZPassFunc[0]));
170 }
171