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