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 34void 35nv10_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 47void 48nv10_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 59void 60nv10_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 71void 72nv10_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 81void 82nv10_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 93void 94nv10_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 106void 107nv10_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 115void 116nv10_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 128void 129nv10_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 138void 139nv10_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 152void 153nv10_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 161void 162nv10_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