nv04_state_raster.c revision 210bcf6d156aba5994f25f1bd9c50586ebc3bada
1bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/* 2bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Copyright (C) 2009 Francisco Jerez. 3bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * All Rights Reserved. 4bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * 5bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Permission is hereby granted, free of charge, to any person obtaining 6bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * a copy of this software and associated documentation files (the 7bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * "Software"), to deal in the Software without restriction, including 8bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * without limitation the rights to use, copy, modify, merge, publish, 9bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * distribute, sublicense, and/or sell copies of the Software, and to 10bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * permit persons to whom the Software is furnished to do so, subject to 11bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * the following conditions: 12bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * 13bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * The above copyright notice and this permission notice (including the 14bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * next paragraph) shall be included in all copies or substantial 15bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * portions of the Software. 16bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * 17bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * 25bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez */ 26bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 27bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_driver.h" 28bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_context.h" 29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_util.h" 30bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_class.h" 31bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv04_driver.h" 32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic unsigned 34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_comparison_op(unsigned op) 35bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez switch (op) { 37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_NEVER: 38bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x1; 39bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_LESS: 40bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x2; 41bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_EQUAL: 42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x3; 43bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_LEQUAL: 44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x4; 45bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_GREATER: 46bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x5; 47bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_NOTEQUAL: 48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x6; 49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_GEQUAL: 50bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x7; 51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_ALWAYS: 52bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x8; 53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez default: 54bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez assert(0); 55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 58bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic unsigned 59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_stencil_op(unsigned op) 60bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez switch (op) { 62bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_KEEP: 63bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x1; 64394672659ddc1175747bae29fbf9957365d61e4cAndrew Randrianasulu case GL_ZERO: 65394672659ddc1175747bae29fbf9957365d61e4cAndrew Randrianasulu return 0x2; 66394672659ddc1175747bae29fbf9957365d61e4cAndrew Randrianasulu case GL_REPLACE: 67394672659ddc1175747bae29fbf9957365d61e4cAndrew Randrianasulu return 0x3; 68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_INCR: 69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x4; 70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_DECR: 71bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x5; 72bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_INVERT: 73bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x6; 74210bcf6d156aba5994f25f1bd9c50586ebc3badaAndrew Randrianasulu case GL_INCR_WRAP: 75210bcf6d156aba5994f25f1bd9c50586ebc3badaAndrew Randrianasulu return 0x7; 76210bcf6d156aba5994f25f1bd9c50586ebc3badaAndrew Randrianasulu case GL_DECR_WRAP: 77210bcf6d156aba5994f25f1bd9c50586ebc3badaAndrew Randrianasulu return 0x8; 78bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez default: 79bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez assert(0); 80bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 81bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 82bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 83bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic unsigned 84bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_texenv_mode(unsigned mode) 85bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 86bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez switch (mode) { 87bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_REPLACE: 88bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x1; 89bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_DECAL: 90bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x3; 91bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_MODULATE: 92bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x4; 93bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez default: 94bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez assert(0); 95bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 96bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 97bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 98bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic unsigned 99bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_blend_func(unsigned func) 100bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 101bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez switch (func) { 102bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_ZERO: 103bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x1; 104bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_ONE: 105bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x2; 106bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_SRC_COLOR: 107bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x3; 108bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_ONE_MINUS_SRC_COLOR: 109bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x4; 110bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_SRC_ALPHA: 111bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x5; 112bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_ONE_MINUS_SRC_ALPHA: 113bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x6; 114bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_DST_ALPHA: 115bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x7; 116bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_ONE_MINUS_DST_ALPHA: 117bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x8; 118bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_DST_COLOR: 119bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0x9; 120bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_ONE_MINUS_DST_COLOR: 121bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0xa; 122bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case GL_SRC_ALPHA_SATURATE: 123bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return 0xb; 124bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez default: 125bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez assert(0); 126bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 127bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 128bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 129bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid 130bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznv04_defer_control(GLcontext *ctx, int emit) 131bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 132bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, CONTROL); 133bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 134bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 135bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid 136bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznv04_emit_control(GLcontext *ctx, int emit) 137bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 138bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_channel *chan = context_chan(ctx); 139bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_grobj *fahrenheit = nv04_context_engine(ctx); 140bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 141bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (nv04_mtex_engine(fahrenheit)) { 142bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int cull_mode = ctx->Polygon.CullFaceMode; 143bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int front_face = ctx->Polygon.FrontFace; 144bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez uint32_t ctrl0 = 1 << 30 | 145bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NV04_MULTITEX_TRIANGLE_CONTROL0_ORIGIN; 146bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez uint32_t ctrl1 = 0, ctrl2 = 0; 147bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 148bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Color mask. */ 149bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.ColorMask[0][RCOMP]) 150bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_RED_WRITE; 151bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.ColorMask[0][GCOMP]) 152bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_GREEN_WRITE; 153bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.ColorMask[0][BCOMP]) 154bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_BLUE_WRITE; 155bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.ColorMask[0][ACOMP]) 156bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_ALPHA_WRITE; 157bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 158bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Dithering. */ 159bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.DitherFlag) 160bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_DITHER_ENABLE; 161bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 162bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Cull mode. */ 163bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (!ctx->Polygon.CullFlag) 164bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_CULL_MODE_NONE; 165bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else if (cull_mode == GL_FRONT_AND_BACK) 166bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_CULL_MODE_BOTH; 167bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else 168bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= (cull_mode == GL_FRONT) ^ (front_face == GL_CCW) ? 169bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NV04_MULTITEX_TRIANGLE_CONTROL0_CULL_MODE_CW : 170bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NV04_MULTITEX_TRIANGLE_CONTROL0_CULL_MODE_CCW; 171bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 172bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Depth test. */ 173bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Depth.Test) 174bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_Z_ENABLE; 175bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 176bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Depth.Mask) 177bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_Z_WRITE; 178bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 179bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= get_comparison_op(ctx->Depth.Func) << 16; 180bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 181bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Alpha test. */ 182bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.AlphaEnabled) 183bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_ALPHA_ENABLE; 184bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 185bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= get_comparison_op(ctx->Color.AlphaFunc) << 8 | 186bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez FLOAT_TO_UBYTE(ctx->Color.AlphaRef); 187bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 188bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Stencil test. */ 189bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Stencil.WriteMask[0]) 190bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_STENCIL_WRITE; 191bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 192bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Stencil.Enabled) 193bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl1 |= NV04_MULTITEX_TRIANGLE_CONTROL1_STENCIL_ENABLE; 194bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 195bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl1 |= get_comparison_op(ctx->Stencil.Function[0]) << 4 | 196bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Stencil.Ref[0] << 8 | 197bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Stencil.ValueMask[0] << 16 | 198bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Stencil.WriteMask[0] << 24; 199bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 200bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl2 |= get_stencil_op(ctx->Stencil.ZPassFunc[0]) << 8 | 201bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez get_stencil_op(ctx->Stencil.ZFailFunc[0]) << 4 | 202bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez get_stencil_op(ctx->Stencil.FailFunc[0]); 203bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 204bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez BEGIN_RING(chan, fahrenheit, NV04_MULTITEX_TRIANGLE_CONTROL0, 3); 205bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez OUT_RING(chan, ctrl0); 206bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez OUT_RING(chan, ctrl1); 207bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez OUT_RING(chan, ctrl2); 208bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 209bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } else { 210bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int cull_mode = ctx->Polygon.CullFaceMode; 211bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int front_face = ctx->Polygon.FrontFace; 212bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez uint32_t ctrl = 1 << 30 | 213bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NV04_TEXTURED_TRIANGLE_CONTROL_ORIGIN; 214bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 215bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Dithering. */ 216bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.DitherFlag) 217bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_DITHER_ENABLE; 218bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 219bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Cull mode. */ 220bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (!ctx->Polygon.CullFlag) 221bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_NONE; 222bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else if (cull_mode == GL_FRONT_AND_BACK) 223bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_BOTH; 224bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else 225bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl |= (cull_mode == GL_FRONT) ^ (front_face == GL_CCW) ? 226bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_CW : 227bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_CCW; 228bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 229bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Depth test. */ 230bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Depth.Test) 231bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_Z_ENABLE; 232bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Depth.Mask) 233bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_Z_WRITE; 234bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 235bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl |= get_comparison_op(ctx->Depth.Func) << 16; 236bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 237bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Alpha test. */ 238bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.AlphaEnabled) 239bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_ALPHA_ENABLE; 240bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 241bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctrl |= get_comparison_op(ctx->Color.AlphaFunc) << 8 | 242bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez FLOAT_TO_UBYTE(ctx->Color.AlphaRef); 243bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 244bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez BEGIN_RING(chan, fahrenheit, NV04_TEXTURED_TRIANGLE_CONTROL, 1); 245bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez OUT_RING(chan, ctrl); 246bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 247bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 248bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 249bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid 250bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznv04_defer_blend(GLcontext *ctx, int emit) 251bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 252bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, BLEND); 253bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 254bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 255bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid 256bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznv04_emit_blend(GLcontext *ctx, int emit) 257bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 258bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_channel *chan = context_chan(ctx); 259bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_grobj *fahrenheit = nv04_context_engine(ctx); 260bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 261bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (nv04_mtex_engine(fahrenheit)) { 262bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez uint32_t blend = 0x2 << 4 | 263bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NV04_MULTITEX_TRIANGLE_BLEND_TEXTURE_PERSPECTIVE_ENABLE; 264bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 265bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Alpha blending. */ 266bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= get_blend_func(ctx->Color.BlendDstRGB) << 28 | 267bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez get_blend_func(ctx->Color.BlendSrcRGB) << 24; 268bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 269bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.BlendEnabled) 270bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= NV04_MULTITEX_TRIANGLE_BLEND_BLEND_ENABLE; 271bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 272bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Shade model. */ 273bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Light.ShadeModel == GL_SMOOTH) 274bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= NV04_MULTITEX_TRIANGLE_BLEND_SHADE_MODE_GOURAUD; 275bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else 276bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= NV04_MULTITEX_TRIANGLE_BLEND_SHADE_MODE_FLAT; 277bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 278bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Fog. */ 279bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Fog.Enabled) 280bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= NV04_MULTITEX_TRIANGLE_BLEND_FOG_ENABLE; 281bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 282bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez BEGIN_RING(chan, fahrenheit, NV04_MULTITEX_TRIANGLE_BLEND, 1); 283bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez OUT_RING(chan, blend); 284bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 285bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez BEGIN_RING(chan, fahrenheit, NV04_MULTITEX_TRIANGLE_FOGCOLOR, 1); 286bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez OUT_RING(chan, pack_rgba_f(MESA_FORMAT_ARGB8888, 287bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Fog.Color)); 288bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 289bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } else { 290bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez uint32_t blend = 0x2 << 4 | 291bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NV04_TEXTURED_TRIANGLE_BLEND_TEXTURE_PERSPECTIVE_ENABLE; 292bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 293bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Alpha blending. */ 294bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= get_blend_func(ctx->Color.BlendDstRGB) << 28 | 295bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez get_blend_func(ctx->Color.BlendSrcRGB) << 24; 296bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 297bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Color.BlendEnabled) 298bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= NV04_TEXTURED_TRIANGLE_BLEND_BLEND_ENABLE; 299bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 300bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Shade model. */ 301bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Light.ShadeModel == GL_SMOOTH) 302bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= NV04_TEXTURED_TRIANGLE_BLEND_SHADE_MODE_GOURAUD; 303bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else 304bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= NV04_TEXTURED_TRIANGLE_BLEND_SHADE_MODE_FLAT; 305bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 306bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Texture environment. */ 307e7ca0e126e1b838d7650eb480adfd548723bcea9Francisco Jerez if (ctx->Texture._EnabledUnits) 308e7ca0e126e1b838d7650eb480adfd548723bcea9Francisco Jerez blend |= get_texenv_mode(ctx->Texture.Unit[0].EnvMode); 309e7ca0e126e1b838d7650eb480adfd548723bcea9Francisco Jerez else 310e7ca0e126e1b838d7650eb480adfd548723bcea9Francisco Jerez blend |= get_texenv_mode(GL_MODULATE); 311bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 312bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Fog. */ 313bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Fog.Enabled) 314bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez blend |= NV04_TEXTURED_TRIANGLE_BLEND_FOG_ENABLE; 315bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 316bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez BEGIN_RING(chan, fahrenheit, NV04_TEXTURED_TRIANGLE_BLEND, 1); 317bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez OUT_RING(chan, blend); 318bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 319bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez BEGIN_RING(chan, fahrenheit, NV04_TEXTURED_TRIANGLE_FOGCOLOR, 1); 320bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez OUT_RING(chan, pack_rgba_f(MESA_FORMAT_ARGB8888, 321bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Fog.Color)); 322bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 323bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 324