2 * Copyright (C) 2009-2010 Francisco Jerez.
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:
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.
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.
27 #include "nouveau_driver.h"
28 #include "nouveau_context.h"
29 #include "nouveau_fbo.h"
30 #include "nouveau_util.h"
31 #include "nouveau_class.h"
32 #include "nv04_driver.h"
33 #include "nv10_driver.h"
35 static const struct dri_extension nv10_extensions
[] = {
36 { "GL_EXT_texture_rectangle", NULL
},
41 nv10_clear(GLcontext
*ctx
, GLbitfield buffers
)
43 struct nouveau_channel
*chan
= context_chan(ctx
);
44 struct nouveau_grobj
*celsius
= context_eng3d(ctx
);
45 struct nouveau_framebuffer
*nfb
= to_nouveau_framebuffer(
48 nouveau_validate_framebuffer(ctx
);
50 /* Clear the LMA depth buffer, if present. */
51 if ((buffers
& BUFFER_BIT_DEPTH
) && ctx
->Depth
.Mask
&&
53 struct nouveau_surface
*s
= &to_nouveau_renderbuffer(
54 nfb
->base
._DepthBuffer
->Wrapped
)->surface
;
56 BEGIN_RING(chan
, celsius
, NV17TCL_LMA_DEPTH_FILL_VALUE
, 1);
57 OUT_RING(chan
, pack_zs_f(s
->format
, ctx
->Depth
.Clear
, 0));
58 BEGIN_RING(chan
, celsius
, NV17TCL_LMA_DEPTH_BUFFER_CLEAR
, 1);
62 nouveau_clear(ctx
, buffers
);
66 nv10_hwctx_init(GLcontext
*ctx
)
68 struct nouveau_channel
*chan
= context_chan(ctx
);
69 struct nouveau_grobj
*celsius
= context_eng3d(ctx
);
70 struct nouveau_hw_state
*hw
= &to_nouveau_context(ctx
)->hw
;
73 BEGIN_RING(chan
, celsius
, NV10TCL_DMA_NOTIFY
, 1);
74 OUT_RING(chan
, hw
->ntfy
->handle
);
76 BEGIN_RING(chan
, celsius
, NV10TCL_DMA_IN_MEMORY0
, 3);
77 OUT_RING(chan
, chan
->vram
->handle
);
78 OUT_RING(chan
, chan
->gart
->handle
);
79 OUT_RING(chan
, chan
->gart
->handle
);
80 BEGIN_RING(chan
, celsius
, NV10TCL_DMA_IN_MEMORY2
, 2);
81 OUT_RING(chan
, chan
->vram
->handle
);
82 OUT_RING(chan
, chan
->vram
->handle
);
84 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
87 BEGIN_RING(chan
, celsius
, NV10TCL_RT_HORIZ
, 2);
91 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1);
92 OUT_RING(chan
, 0x7ff << 16 | 0x800);
93 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_VERT(0), 1);
94 OUT_RING(chan
, 0x7ff << 16 | 0x800);
96 for (i
= 1; i
< 8; i
++) {
97 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(i
), 1);
99 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_VERT(i
), 1);
103 BEGIN_RING(chan
, celsius
, 0x290, 1);
104 OUT_RING(chan
, 0x10 << 16 | 1);
105 BEGIN_RING(chan
, celsius
, 0x3f4, 1);
108 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
111 if (context_chipset(ctx
) >= 0x17) {
112 BEGIN_RING(chan
, celsius
, NV17TCL_DMA_IN_MEMORY4
, 2);
113 OUT_RING(chan
, chan
->vram
->handle
);
114 OUT_RING(chan
, chan
->vram
->handle
);
116 BEGIN_RING(chan
, celsius
, 0xd84, 1);
119 BEGIN_RING(chan
, celsius
, NV17TCL_COLOR_MASK_ENABLE
, 1);
123 if (context_chipset(ctx
) >= 0x11) {
124 BEGIN_RING(chan
, celsius
, 0x120, 3);
129 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
133 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
137 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_ENABLE
, 1);
139 BEGIN_RING(chan
, celsius
, NV10TCL_ALPHA_FUNC_ENABLE
, 1);
141 BEGIN_RING(chan
, celsius
, NV10TCL_ALPHA_FUNC_FUNC
, 2);
142 OUT_RING(chan
, 0x207);
144 BEGIN_RING(chan
, celsius
, NV10TCL_TX_ENABLE(0), 2);
148 BEGIN_RING(chan
, celsius
, NV10TCL_BLEND_FUNC_ENABLE
, 1);
150 BEGIN_RING(chan
, celsius
, NV10TCL_DITHER_ENABLE
, 2);
153 BEGIN_RING(chan
, celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
155 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_WEIGHT_ENABLE
, 2);
158 BEGIN_RING(chan
, celsius
, NV10TCL_BLEND_FUNC_SRC
, 4);
162 OUT_RING(chan
, 0x8006);
163 BEGIN_RING(chan
, celsius
, NV10TCL_STENCIL_MASK
, 8);
164 OUT_RING(chan
, 0xff);
165 OUT_RING(chan
, 0x207);
167 OUT_RING(chan
, 0xff);
168 OUT_RING(chan
, 0x1e00);
169 OUT_RING(chan
, 0x1e00);
170 OUT_RING(chan
, 0x1e00);
171 OUT_RING(chan
, 0x1d01);
172 BEGIN_RING(chan
, celsius
, NV10TCL_NORMALIZE_ENABLE
, 1);
174 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_ENABLE
, 2);
177 BEGIN_RING(chan
, celsius
, NV10TCL_LIGHT_MODEL
, 1);
179 BEGIN_RING(chan
, celsius
, NV10TCL_SEPARATE_SPECULAR_ENABLE
, 1);
181 BEGIN_RING(chan
, celsius
, NV10TCL_ENABLED_LIGHTS
, 1);
183 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_OFFSET_POINT_ENABLE
, 3);
187 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_FUNC
, 1);
188 OUT_RING(chan
, 0x201);
189 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_WRITE_ENABLE
, 1);
191 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_TEST_ENABLE
, 1);
193 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_OFFSET_FACTOR
, 2);
196 BEGIN_RING(chan
, celsius
, NV10TCL_POINT_SIZE
, 1);
198 BEGIN_RING(chan
, celsius
, NV10TCL_POINT_PARAMETERS_ENABLE
, 2);
201 BEGIN_RING(chan
, celsius
, NV10TCL_LINE_WIDTH
, 1);
203 BEGIN_RING(chan
, celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
205 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_MODE_FRONT
, 2);
206 OUT_RING(chan
, 0x1b02);
207 OUT_RING(chan
, 0x1b02);
208 BEGIN_RING(chan
, celsius
, NV10TCL_CULL_FACE
, 2);
209 OUT_RING(chan
, 0x405);
210 OUT_RING(chan
, 0x901);
211 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_SMOOTH_ENABLE
, 1);
213 BEGIN_RING(chan
, celsius
, NV10TCL_CULL_FACE_ENABLE
, 1);
215 BEGIN_RING(chan
, celsius
, NV10TCL_TX_GEN_MODE_S(0), 8);
216 for (i
= 0; i
< 8; i
++)
219 BEGIN_RING(chan
, celsius
, NV10TCL_TX_MATRIX_ENABLE(0), 2);
222 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_EQUATION_CONSTANT
, 3);
223 OUT_RING(chan
, 0x3fc00000); /* -1.50 */
224 OUT_RING(chan
, 0xbdb8aa0a); /* -0.09 */
225 OUT_RING(chan
, 0); /* 0.00 */
227 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
230 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_MODE
, 2);
231 OUT_RING(chan
, 0x802);
233 /* for some reason VIEW_MATRIX_ENABLE need to be 6 instead of 4 when
234 * using texturing, except when using the texture matrix
236 BEGIN_RING(chan
, celsius
, NV10TCL_VIEW_MATRIX_ENABLE
, 1);
238 BEGIN_RING(chan
, celsius
, NV10TCL_COLOR_MASK
, 1);
239 OUT_RING(chan
, 0x01010101);
241 /* Set vertex component */
242 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_COL_4F_R
, 4);
243 OUT_RINGf(chan
, 1.0);
244 OUT_RINGf(chan
, 0.0);
245 OUT_RINGf(chan
, 0.0);
246 OUT_RINGf(chan
, 1.0);
247 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_COL2_3F_R
, 3);
251 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_NOR_3F_X
, 3);
254 OUT_RINGf(chan
, 1.0);
255 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_TX0_4F_S
, 4);
256 OUT_RINGf(chan
, 0.0);
257 OUT_RINGf(chan
, 0.0);
258 OUT_RINGf(chan
, 0.0);
259 OUT_RINGf(chan
, 1.0);
260 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_TX1_4F_S
, 4);
261 OUT_RINGf(chan
, 0.0);
262 OUT_RINGf(chan
, 0.0);
263 OUT_RINGf(chan
, 0.0);
264 OUT_RINGf(chan
, 1.0);
265 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_FOG_1F
, 1);
266 OUT_RINGf(chan
, 0.0);
267 BEGIN_RING(chan
, celsius
, NV10TCL_EDGEFLAG_ENABLE
, 1);
270 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_RANGE_NEAR
, 2);
272 OUT_RINGf(chan
, 16777216.0);
278 nv10_context_destroy(GLcontext
*ctx
)
280 struct nouveau_context
*nctx
= to_nouveau_context(ctx
);
282 nv04_surface_takedown(ctx
);
283 nv10_render_destroy(ctx
);
285 nouveau_grobj_free(&nctx
->hw
.eng3d
);
287 nouveau_context_deinit(ctx
);
292 nv10_context_create(struct nouveau_screen
*screen
, const GLvisual
*visual
,
293 GLcontext
*share_ctx
)
295 struct nouveau_context
*nctx
;
297 unsigned celsius_class
;
300 nctx
= CALLOC_STRUCT(nouveau_context
);
306 if (!nouveau_context_init(ctx
, screen
, visual
, share_ctx
))
309 driInitExtensions(ctx
, nv10_extensions
, GL_FALSE
);
312 ctx
->Const
.MaxTextureLevels
= 12;
313 ctx
->Const
.MaxTextureCoordUnits
= NV10_TEXTURE_UNITS
;
314 ctx
->Const
.MaxTextureImageUnits
= NV10_TEXTURE_UNITS
;
315 ctx
->Const
.MaxTextureUnits
= NV10_TEXTURE_UNITS
;
316 ctx
->Const
.MaxTextureMaxAnisotropy
= 2;
317 ctx
->Const
.MaxTextureLodBias
= 15;
318 ctx
->Driver
.Clear
= nv10_clear
;
321 ret
= nv04_surface_init(ctx
);
326 if (context_chipset(ctx
) >= 0x17)
327 celsius_class
= NV17TCL
;
328 else if (context_chipset(ctx
) >= 0x11)
329 celsius_class
= NV11TCL
;
331 celsius_class
= NV10TCL
;
333 ret
= nouveau_grobj_alloc(context_chan(ctx
), 0xbeef0001, celsius_class
,
338 nv10_hwctx_init(ctx
);
339 nv10_render_init(ctx
);
344 nv10_context_destroy(ctx
);
348 const struct nouveau_driver nv10_driver
= {
349 .context_create
= nv10_context_create
,
350 .context_destroy
= nv10_context_destroy
,
351 .surface_copy
= nv04_surface_copy
,
352 .surface_fill
= nv04_surface_fill
,
353 .emit
= (nouveau_state_func
[]) {
354 nv10_emit_alpha_func
,
355 nv10_emit_blend_color
,
356 nv10_emit_blend_equation
,
357 nv10_emit_blend_func
,
358 nv10_emit_clip_plane
,
359 nv10_emit_clip_plane
,
360 nv10_emit_clip_plane
,
361 nv10_emit_clip_plane
,
362 nv10_emit_clip_plane
,
363 nv10_emit_clip_plane
,
364 nv10_emit_color_mask
,
365 nv10_emit_color_material
,
367 nv10_emit_front_face
,
371 nv10_emit_framebuffer
,
373 nv10_emit_light_enable
,
374 nv10_emit_light_model
,
375 nv10_emit_light_source
,
376 nv10_emit_light_source
,
377 nv10_emit_light_source
,
378 nv10_emit_light_source
,
379 nv10_emit_light_source
,
380 nv10_emit_light_source
,
381 nv10_emit_light_source
,
382 nv10_emit_light_source
,
383 nv10_emit_line_stipple
,
385 nv10_emit_logic_opcode
,
386 nv10_emit_material_ambient
,
387 nouveau_emit_nothing
,
388 nv10_emit_material_diffuse
,
389 nouveau_emit_nothing
,
390 nv10_emit_material_specular
,
391 nouveau_emit_nothing
,
392 nv10_emit_material_shininess
,
393 nouveau_emit_nothing
,
395 nv10_emit_point_mode
,
396 nv10_emit_point_parameter
,
397 nv10_emit_polygon_mode
,
398 nv10_emit_polygon_offset
,
399 nv10_emit_polygon_stipple
,
400 nv10_emit_projection
,
401 nv10_emit_render_mode
,
403 nv10_emit_shade_model
,
404 nv10_emit_stencil_func
,
405 nv10_emit_stencil_mask
,
406 nv10_emit_stencil_op
,
409 nouveau_emit_nothing
,
410 nouveau_emit_nothing
,
413 nouveau_emit_nothing
,
414 nouveau_emit_nothing
,
417 nouveau_emit_nothing
,
418 nouveau_emit_nothing
,
421 nouveau_emit_nothing
,
422 nouveau_emit_nothing
,
425 .num_emit
= NUM_NOUVEAU_STATE
,