Merge branch 'master' of git+ssh://znh@git.freedesktop.org/git/mesa/mesa into 965...
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_state.c
1 /**************************************************************************
2
3 Copyright 2006 Jeremy Kolb
4 All Rights Reserved.
5
6 Permission is hereby granted, free of charge, to any person obtaining a
7 copy of this software and associated documentation files (the "Software"),
8 to deal in the Software without restriction, including without limitation
9 on the rights to use, copy, modify, merge, publish, distribute, sub
10 license, and/or sell copies of the Software, and to permit persons to whom
11 the Software is furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice (including the next
14 paragraph) shall be included in all copies or substantial portions of the
15 Software.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
20 ERIC ANHOLT OR SILICON INTEGRATED SYSTEMS CORP BE LIABLE FOR ANY CLAIM,
21 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
23 USE OR OTHER DEALINGS IN THE SOFTWARE.
24
25 **************************************************************************/
26
27 #include "nouveau_context.h"
28 #include "nouveau_state.h"
29 #include "nouveau_swtcl.h"
30 #include "nouveau_fifo.h"
31
32 #include "swrast/swrast.h"
33 #include "tnl/tnl.h"
34 #include "swrast_setup/swrast_setup.h"
35
36 #include "tnl/t_pipeline.h"
37
38 #include "mtypes.h"
39 #include "colormac.h"
40
41 static __inline__ GLuint nouveauPackColor(GLuint format,
42 GLubyte r, GLubyte g,
43 GLubyte b, GLubyte a)
44 {
45 switch (format) {
46 case 2:
47 return PACK_COLOR_565( r, g, b );
48 case 4:
49 return PACK_COLOR_8888( r, g, b, a);
50 default:
51 fprintf(stderr, "unknown format %d\n", (int)format);
52 return 0;
53 }
54 }
55
56 static void nouveauCalcViewport(GLcontext *ctx)
57 {
58 /* Calculate the Viewport Matrix */
59
60 nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
61 const GLfloat *v = ctx->Viewport._WindowMap.m;
62 GLfloat *m = nmesa->viewport.m;
63 GLfloat xoffset = nmesa->drawX, yoffset = nmesa->drawY + nmesa->drawH;
64
65 nmesa->depth_scale = 1.0 / ctx->DrawBuffer->_DepthMaxF;
66
67 m[MAT_SX] = v[MAT_SX];
68 m[MAT_TX] = v[MAT_TX] + xoffset + SUBPIXEL_X;
69 m[MAT_SY] = - v[MAT_SY];
70 m[MAT_TY] = (-v[MAT_TY]) + yoffset + SUBPIXEL_Y;
71 m[MAT_SZ] = v[MAT_SZ] * nmesa->depth_scale;
72 m[MAT_TZ] = v[MAT_TZ] * nmesa->depth_scale;
73
74 nmesa->hw_func.WindowMoved(nmesa);
75 }
76
77 static void nouveauViewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
78 {
79 /*
80 * Need to send (at least on an nv35 the following:
81 * cons = 4 (this may be bytes per pixel)
82 *
83 * The viewport:
84 * 445 0x0000bee0 {size: 0x0 channel: 0x1 cmd: 0x00009ee0} <-- VIEWPORT_SETUP/HEADER ?
85 * 446 0x00000000 {size: 0x0 channel: 0x0 cmd: 0x00000000} <-- x * cons
86 * 447 0x00000c80 {size: 0x0 channel: 0x0 cmd: 0x00000c80} <-- (height + x) * cons
87 * 448 0x00000000 {size: 0x0 channel: 0x0 cmd: 0x00000000} <-- y * cons
88 * 449 0x00000960 {size: 0x0 channel: 0x0 cmd: 0x00000960} <-- (width + y) * cons
89 * 44a 0x00082a00 {size: 0x2 channel: 0x1 cmd: 0x00000a00} <-- VIEWPORT_DIMS
90 * 44b 0x04000000 <-- (Width_from_glViewport << 16) | x
91 * 44c 0x03000000 <-- (Height_from_glViewport << 16) | (win_height - height - y)
92 *
93 */
94
95 nouveauCalcViewport(ctx);
96 }
97
98 static void nouveauDepthRange(GLcontext *ctx, GLclampd near, GLclampd far)
99 {
100 nouveauCalcViewport(ctx);
101 }
102
103 static void nouveauDDUpdateHWState(GLcontext *ctx)
104 {
105 nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
106 int new_state = nmesa->new_state;
107
108 if ( new_state || nmesa->new_render_state & _NEW_TEXTURE )
109 {
110 nmesa->new_state = 0;
111
112 /* Update the various parts of the context's state.
113 */
114 /*
115 if ( new_state & NOUVEAU_NEW_ALPHA )
116 nouveauUpdateAlphaMode( ctx );
117
118 if ( new_state & NOUVEAU_NEW_DEPTH )
119 nouveauUpdateZMode( ctx );
120
121 if ( new_state & NOUVEAU_NEW_FOG )
122 nouveauUpdateFogAttrib( ctx );
123
124 if ( new_state & NOUVEAU_NEW_CLIP )
125 nouveauUpdateClipping( ctx );
126
127 if ( new_state & NOUVEAU_NEW_CULL )
128 nouveauUpdateCull( ctx );
129
130 if ( new_state & NOUVEAU_NEW_MASKS )
131 nouveauUpdateMasks( ctx );
132
133 if ( new_state & NOUVEAU_NEW_WINDOW )
134 nouveauUpdateWindow( ctx );
135
136 if ( nmesa->new_render_state & _NEW_TEXTURE ) {
137 nouveauUpdateTextureState( ctx );
138 }*/
139 }
140 }
141
142 static void nouveauDDInvalidateState(GLcontext *ctx, GLuint new_state)
143 {
144 _swrast_InvalidateState( ctx, new_state );
145 _swsetup_InvalidateState( ctx, new_state );
146 _vbo_InvalidateState( ctx, new_state );
147 _tnl_InvalidateState( ctx, new_state );
148 NOUVEAU_CONTEXT(ctx)->new_render_state |= new_state;
149 }
150
151 /* Initialize the context's hardware state. */
152 void nouveauDDInitState(nouveauContextPtr nmesa)
153 {
154 uint32_t type = nmesa->screen->card->type;
155 switch(type)
156 {
157 case NV_03:
158 /* Unimplemented */
159 break;
160 case NV_04:
161 case NV_05:
162 nv04InitStateFuncs(nmesa->glCtx, &nmesa->glCtx->Driver);
163 break;
164 case NV_10:
165 case NV_11:
166 case NV_17:
167 nv10InitStateFuncs(nmesa->glCtx, &nmesa->glCtx->Driver);
168 break;
169 case NV_20:
170 nv20InitStateFuncs(nmesa->glCtx, &nmesa->glCtx->Driver);
171 break;
172 case NV_30:
173 case NV_40:
174 case NV_44:
175 nv30InitStateFuncs(nmesa->glCtx, &nmesa->glCtx->Driver);
176 break;
177 case NV_50:
178 nv50InitStateFuncs(nmesa->glCtx, &nmesa->glCtx->Driver);
179 break;
180 default:
181 break;
182 }
183 nouveau_state_cache_init(nmesa);
184 }
185
186 /* Initialize the driver's state functions */
187 void nouveauDDInitStateFuncs(GLcontext *ctx)
188 {
189 ctx->Driver.UpdateState = nouveauDDInvalidateState;
190
191 ctx->Driver.ClearIndex = NULL;
192 ctx->Driver.ClearColor = NULL; //nouveauDDClearColor;
193 ctx->Driver.ClearStencil = NULL; //nouveauDDClearStencil;
194 ctx->Driver.DrawBuffer = NULL; //nouveauDDDrawBuffer;
195 ctx->Driver.ReadBuffer = NULL; //nouveauDDReadBuffer;
196
197 ctx->Driver.IndexMask = NULL;
198 ctx->Driver.ColorMask = NULL; //nouveauDDColorMask;
199 ctx->Driver.AlphaFunc = NULL; //nouveauDDAlphaFunc;
200 ctx->Driver.BlendEquationSeparate = NULL; //nouveauDDBlendEquationSeparate;
201 ctx->Driver.BlendFuncSeparate = NULL; //nouveauDDBlendFuncSeparate;
202 ctx->Driver.ClearDepth = NULL; //nouveauDDClearDepth;
203 ctx->Driver.CullFace = NULL; //nouveauDDCullFace;
204 ctx->Driver.FrontFace = NULL; //nouveauDDFrontFace;
205 ctx->Driver.DepthFunc = NULL; //nouveauDDDepthFunc;
206 ctx->Driver.DepthMask = NULL; //nouveauDDDepthMask;
207 ctx->Driver.Enable = NULL; //nouveauDDEnable;
208 ctx->Driver.Fogfv = NULL; //nouveauDDFogfv;
209 ctx->Driver.Hint = NULL;
210 ctx->Driver.Lightfv = NULL;
211 ctx->Driver.LightModelfv = NULL; //nouveauDDLightModelfv;
212 ctx->Driver.LogicOpcode = NULL; //nouveauDDLogicOpCode;
213 ctx->Driver.PolygonMode = NULL;
214 ctx->Driver.PolygonStipple = NULL; //nouveauDDPolygonStipple;
215 ctx->Driver.RenderMode = NULL; //nouveauDDRenderMode;
216 ctx->Driver.Scissor = NULL; //nouveauDDScissor;
217 ctx->Driver.ShadeModel = NULL; //nouveauDDShadeModel;
218 ctx->Driver.StencilFuncSeparate = NULL; //nouveauDDStencilFuncSeparate;
219 ctx->Driver.StencilMaskSeparate = NULL; //nouveauDDStencilMaskSeparate;
220 ctx->Driver.StencilOpSeparate = NULL; //nouveauDDStencilOpSeparate;
221
222 ctx->Driver.DepthRange = nouveauDepthRange;
223 ctx->Driver.Viewport = nouveauViewport;
224
225 /* Pixel path fallbacks.
226 */
227 ctx->Driver.Accum = _swrast_Accum;
228 ctx->Driver.Bitmap = _swrast_Bitmap;
229 ctx->Driver.CopyPixels = _swrast_CopyPixels;
230 ctx->Driver.DrawPixels = _swrast_DrawPixels;
231 ctx->Driver.ReadPixels = _swrast_ReadPixels;
232
233 /* Swrast hooks for imaging extensions:
234 */
235 ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
236 ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
237 ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
238 ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;
239 }
240
241 #define STATE_INIT(a) if (ctx->Driver.a) ctx->Driver.a
242
243 void nouveauInitState(GLcontext *ctx)
244 {
245 /*
246 * Mesa should do this for us:
247 */
248
249 STATE_INIT(AlphaFunc)( ctx,
250 ctx->Color.AlphaFunc,
251 ctx->Color.AlphaRef);
252
253 STATE_INIT(BlendColor)( ctx,
254 ctx->Color.BlendColor );
255
256 STATE_INIT(BlendEquationSeparate)( ctx,
257 ctx->Color.BlendEquationRGB,
258 ctx->Color.BlendEquationA);
259
260 STATE_INIT(BlendFuncSeparate)( ctx,
261 ctx->Color.BlendSrcRGB,
262 ctx->Color.BlendDstRGB,
263 ctx->Color.BlendSrcA,
264 ctx->Color.BlendDstA);
265
266 STATE_INIT(ClearColor)( ctx, ctx->Color.ClearColor);
267 STATE_INIT(ClearDepth)( ctx, ctx->Depth.Clear);
268 STATE_INIT(ClearStencil)( ctx, ctx->Stencil.Clear);
269
270 STATE_INIT(ColorMask)( ctx,
271 ctx->Color.ColorMask[RCOMP],
272 ctx->Color.ColorMask[GCOMP],
273 ctx->Color.ColorMask[BCOMP],
274 ctx->Color.ColorMask[ACOMP]);
275
276 STATE_INIT(CullFace)( ctx, ctx->Polygon.CullFaceMode );
277 STATE_INIT(DepthFunc)( ctx, ctx->Depth.Func );
278 STATE_INIT(DepthMask)( ctx, ctx->Depth.Mask );
279
280 STATE_INIT(Enable)( ctx, GL_ALPHA_TEST, ctx->Color.AlphaEnabled );
281 STATE_INIT(Enable)( ctx, GL_BLEND, ctx->Color.BlendEnabled );
282 STATE_INIT(Enable)( ctx, GL_COLOR_LOGIC_OP, ctx->Color.ColorLogicOpEnabled );
283 STATE_INIT(Enable)( ctx, GL_COLOR_SUM, ctx->Fog.ColorSumEnabled );
284 STATE_INIT(Enable)( ctx, GL_CULL_FACE, ctx->Polygon.CullFlag );
285 STATE_INIT(Enable)( ctx, GL_DEPTH_TEST, ctx->Depth.Test );
286 STATE_INIT(Enable)( ctx, GL_DITHER, ctx->Color.DitherFlag );
287 STATE_INIT(Enable)( ctx, GL_FOG, ctx->Fog.Enabled );
288 STATE_INIT(Enable)( ctx, GL_LIGHTING, ctx->Light.Enabled );
289 STATE_INIT(Enable)( ctx, GL_LINE_SMOOTH, ctx->Line.SmoothFlag );
290 STATE_INIT(Enable)( ctx, GL_LINE_STIPPLE, ctx->Line.StippleFlag );
291 STATE_INIT(Enable)( ctx, GL_POINT_SMOOTH, ctx->Point.SmoothFlag );
292 STATE_INIT(Enable)( ctx, GL_POLYGON_OFFSET_FILL, ctx->Polygon.OffsetFill);
293 STATE_INIT(Enable)( ctx, GL_POLYGON_OFFSET_LINE, ctx->Polygon.OffsetLine);
294 STATE_INIT(Enable)( ctx, GL_POLYGON_OFFSET_POINT, ctx->Polygon.OffsetPoint);
295 STATE_INIT(Enable)( ctx, GL_POLYGON_SMOOTH, ctx->Polygon.SmoothFlag );
296 STATE_INIT(Enable)( ctx, GL_POLYGON_STIPPLE, ctx->Polygon.StippleFlag );
297 STATE_INIT(Enable)( ctx, GL_SCISSOR_TEST, ctx->Scissor.Enabled );
298 STATE_INIT(Enable)( ctx, GL_STENCIL_TEST, ctx->Stencil.Enabled );
299 STATE_INIT(Enable)( ctx, GL_TEXTURE_1D, GL_FALSE );
300 STATE_INIT(Enable)( ctx, GL_TEXTURE_2D, GL_FALSE );
301 STATE_INIT(Enable)( ctx, GL_TEXTURE_RECTANGLE_NV, GL_FALSE );
302 STATE_INIT(Enable)( ctx, GL_TEXTURE_3D, GL_FALSE );
303 STATE_INIT(Enable)( ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE );
304
305 STATE_INIT(Fogfv)( ctx, GL_FOG_COLOR, ctx->Fog.Color );
306 STATE_INIT(Fogfv)( ctx, GL_FOG_MODE, 0 );
307 STATE_INIT(Fogfv)( ctx, GL_FOG_DENSITY, &ctx->Fog.Density );
308 STATE_INIT(Fogfv)( ctx, GL_FOG_START, &ctx->Fog.Start );
309 STATE_INIT(Fogfv)( ctx, GL_FOG_END, &ctx->Fog.End );
310
311 STATE_INIT(FrontFace)( ctx, ctx->Polygon.FrontFace );
312
313 {
314 GLfloat f = (GLfloat)ctx->Light.Model.ColorControl;
315 STATE_INIT(LightModelfv)( ctx, GL_LIGHT_MODEL_COLOR_CONTROL, &f );
316 }
317
318 STATE_INIT(LineStipple)( ctx, ctx->Line.StippleFactor, ctx->Line.StipplePattern );
319 STATE_INIT(LineWidth)( ctx, ctx->Line.Width );
320 STATE_INIT(LogicOpcode)( ctx, ctx->Color.LogicOp );
321 STATE_INIT(PointSize)( ctx, ctx->Point.Size );
322 STATE_INIT(PolygonMode)( ctx, GL_FRONT, ctx->Polygon.FrontMode );
323 STATE_INIT(PolygonMode)( ctx, GL_BACK, ctx->Polygon.BackMode );
324 STATE_INIT(PolygonOffset)( ctx,
325 ctx->Polygon.OffsetFactor,
326 ctx->Polygon.OffsetUnits );
327 STATE_INIT(PolygonStipple)( ctx, (const GLubyte *)ctx->PolygonStipple );
328 STATE_INIT(ShadeModel)( ctx, ctx->Light.ShadeModel );
329 STATE_INIT(StencilFuncSeparate)( ctx, GL_FRONT,
330 ctx->Stencil.Function[0],
331 ctx->Stencil.Ref[0],
332 ctx->Stencil.ValueMask[0] );
333 STATE_INIT(StencilFuncSeparate)( ctx, GL_BACK,
334 ctx->Stencil.Function[1],
335 ctx->Stencil.Ref[1],
336 ctx->Stencil.ValueMask[1] );
337 STATE_INIT(StencilMaskSeparate)( ctx, GL_FRONT, ctx->Stencil.WriteMask[0] );
338 STATE_INIT(StencilMaskSeparate)( ctx, GL_BACK, ctx->Stencil.WriteMask[1] );
339 STATE_INIT(StencilOpSeparate)( ctx, GL_FRONT,
340 ctx->Stencil.FailFunc[0],
341 ctx->Stencil.ZFailFunc[0],
342 ctx->Stencil.ZPassFunc[0]);
343 STATE_INIT(StencilOpSeparate)( ctx, GL_BACK,
344 ctx->Stencil.FailFunc[1],
345 ctx->Stencil.ZFailFunc[1],
346 ctx->Stencil.ZPassFunc[1]);
347 }