1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 Francisco Jerez.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a copy of this software and associated documentation files (the
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_driver.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_context.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_gldefs.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_util.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv10_3d.xml.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv10_driver.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_alpha_func(struct gl_context *ctx, int emit)
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_ENABLE), 1);
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATAb(push, ctx->Color.AlphaEnabled);
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_FUNC), 2);
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_comparison_op(ctx->Color.AlphaFunc));
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, FLOAT_TO_UBYTE(ctx->Color.AlphaRef));
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_blend_color(struct gl_context *ctx, int emit)
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(BLEND_COLOR), 1);
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, FLOAT_TO_UBYTE(ctx->Color.BlendColor[3]) << 24 |
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 FLOAT_TO_UBYTE(ctx->Color.BlendColor[0]) << 16 |
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 FLOAT_TO_UBYTE(ctx->Color.BlendColor[1]) << 8 |
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 FLOAT_TO_UBYTE(ctx->Color.BlendColor[2]) << 0);
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_blend_equation(struct gl_context *ctx, int emit)
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(BLEND_FUNC_ENABLE), 1);
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATAb(push, ctx->Color.BlendEnabled);
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(BLEND_EQUATION), 1);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_blend_eqn(ctx->Color.Blend[0].EquationRGB));
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_blend_func(struct gl_context *ctx, int emit)
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(BLEND_FUNC_SRC), 2);
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_blend_func(ctx->Color.Blend[0].SrcRGB));
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_blend_func(ctx->Color.Blend[0].DstRGB));
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_color_mask(struct gl_context *ctx, int emit)
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(COLOR_MASK), 1);
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, ((ctx->Color.ColorMask[0][3] ? 1 << 24 : 0) |
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			(ctx->Color.ColorMask[0][0] ? 1 << 16 : 0) |
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			(ctx->Color.ColorMask[0][1] ? 1 << 8 : 0) |
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			(ctx->Color.ColorMask[0][2] ? 1 << 0 : 0)));
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_depth(struct gl_context *ctx, int emit)
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(DEPTH_TEST_ENABLE), 1);
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATAb(push, ctx->Depth.Test);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(DEPTH_WRITE_ENABLE), 1);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATAb(push, ctx->Depth.Mask);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(DEPTH_FUNC), 1);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_comparison_op(ctx->Depth.Func));
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_dither(struct gl_context *ctx, int emit)
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(DITHER_ENABLE), 1);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATAb(push, ctx->Color.DitherFlag);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_logic_opcode(struct gl_context *ctx, int emit)
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(!ctx->Color.ColorLogicOpEnabled
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       || context_chipset(ctx) >= 0x11);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV11_3D(COLOR_LOGIC_OP_ENABLE), 2);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATAb(push, ctx->Color.ColorLogicOpEnabled);
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_logicop_func(ctx->Color.LogicOp));
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_shade_model(struct gl_context *ctx, int emit)
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(SHADE_MODEL), 1);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, ctx->Light.ShadeModel == GL_SMOOTH ?
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 NV10_3D_SHADE_MODEL_SMOOTH : NV10_3D_SHADE_MODEL_FLAT);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_stencil_func(struct gl_context *ctx, int emit)
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(STENCIL_ENABLE), 1);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATAb(push, ctx->Stencil.Enabled);
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(STENCIL_FUNC_FUNC), 3);
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_comparison_op(ctx->Stencil.Function[0]));
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, ctx->Stencil.Ref[0]);
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, ctx->Stencil.ValueMask[0]);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_stencil_mask(struct gl_context *ctx, int emit)
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(STENCIL_MASK), 1);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, ctx->Stencil.WriteMask[0]);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv10_emit_stencil_op(struct gl_context *ctx, int emit)
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct nouveau_pushbuf *push = context_push(ctx);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BEGIN_NV04(push, NV10_3D(STENCIL_OP_FAIL), 3);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_stencil_op(ctx->Stencil.FailFunc[0]));
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_stencil_op(ctx->Stencil.ZFailFunc[0]));
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	PUSH_DATA (push, nvgl_stencil_op(ctx->Stencil.ZPassFunc[0]));
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
171