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
},
37 { "GL_ARB_texture_env_combine", NULL
},
38 { "GL_ARB_texture_env_dot3", NULL
},
43 nv10_clear(GLcontext
*ctx
, GLbitfield buffers
)
45 struct nouveau_channel
*chan
= context_chan(ctx
);
46 struct nouveau_grobj
*celsius
= context_eng3d(ctx
);
47 struct nouveau_framebuffer
*nfb
= to_nouveau_framebuffer(
50 nouveau_validate_framebuffer(ctx
);
52 /* Clear the LMA depth buffer, if present. */
53 if ((buffers
& BUFFER_BIT_DEPTH
) && ctx
->Depth
.Mask
&&
55 struct nouveau_surface
*s
= &to_nouveau_renderbuffer(
56 nfb
->base
._DepthBuffer
->Wrapped
)->surface
;
58 BEGIN_RING(chan
, celsius
, NV17TCL_LMA_DEPTH_FILL_VALUE
, 1);
59 OUT_RING(chan
, pack_zs_f(s
->format
, ctx
->Depth
.Clear
, 0));
60 BEGIN_RING(chan
, celsius
, NV17TCL_LMA_DEPTH_BUFFER_CLEAR
, 1);
64 nouveau_clear(ctx
, buffers
);
68 nv10_hwctx_init(GLcontext
*ctx
)
70 struct nouveau_channel
*chan
= context_chan(ctx
);
71 struct nouveau_grobj
*celsius
= context_eng3d(ctx
);
72 struct nouveau_hw_state
*hw
= &to_nouveau_context(ctx
)->hw
;
75 BEGIN_RING(chan
, celsius
, NV10TCL_DMA_NOTIFY
, 1);
76 OUT_RING(chan
, hw
->ntfy
->handle
);
78 BEGIN_RING(chan
, celsius
, NV10TCL_DMA_IN_MEMORY0
, 3);
79 OUT_RING(chan
, chan
->vram
->handle
);
80 OUT_RING(chan
, chan
->gart
->handle
);
81 OUT_RING(chan
, chan
->gart
->handle
);
82 BEGIN_RING(chan
, celsius
, NV10TCL_DMA_IN_MEMORY2
, 2);
83 OUT_RING(chan
, chan
->vram
->handle
);
84 OUT_RING(chan
, chan
->vram
->handle
);
86 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
89 BEGIN_RING(chan
, celsius
, NV10TCL_RT_HORIZ
, 2);
93 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1);
94 OUT_RING(chan
, 0x7ff << 16 | 0x800);
95 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_VERT(0), 1);
96 OUT_RING(chan
, 0x7ff << 16 | 0x800);
98 for (i
= 1; i
< 8; i
++) {
99 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(i
), 1);
101 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_VERT(i
), 1);
105 BEGIN_RING(chan
, celsius
, 0x290, 1);
106 OUT_RING(chan
, 0x10 << 16 | 1);
107 BEGIN_RING(chan
, celsius
, 0x3f4, 1);
110 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
113 if (context_chipset(ctx
) >= 0x17) {
114 BEGIN_RING(chan
, celsius
, NV17TCL_DMA_IN_MEMORY4
, 2);
115 OUT_RING(chan
, chan
->vram
->handle
);
116 OUT_RING(chan
, chan
->vram
->handle
);
118 BEGIN_RING(chan
, celsius
, 0xd84, 1);
121 BEGIN_RING(chan
, celsius
, NV17TCL_COLOR_MASK_ENABLE
, 1);
125 if (context_chipset(ctx
) >= 0x11) {
126 BEGIN_RING(chan
, celsius
, 0x120, 3);
131 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
135 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
139 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_ENABLE
, 1);
141 BEGIN_RING(chan
, celsius
, NV10TCL_ALPHA_FUNC_ENABLE
, 1);
143 BEGIN_RING(chan
, celsius
, NV10TCL_ALPHA_FUNC_FUNC
, 2);
144 OUT_RING(chan
, 0x207);
146 BEGIN_RING(chan
, celsius
, NV10TCL_TX_ENABLE(0), 2);
150 BEGIN_RING(chan
, celsius
, NV10TCL_BLEND_FUNC_ENABLE
, 1);
152 BEGIN_RING(chan
, celsius
, NV10TCL_DITHER_ENABLE
, 2);
155 BEGIN_RING(chan
, celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
157 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_WEIGHT_ENABLE
, 2);
160 BEGIN_RING(chan
, celsius
, NV10TCL_BLEND_FUNC_SRC
, 4);
164 OUT_RING(chan
, 0x8006);
165 BEGIN_RING(chan
, celsius
, NV10TCL_STENCIL_MASK
, 8);
166 OUT_RING(chan
, 0xff);
167 OUT_RING(chan
, 0x207);
169 OUT_RING(chan
, 0xff);
170 OUT_RING(chan
, 0x1e00);
171 OUT_RING(chan
, 0x1e00);
172 OUT_RING(chan
, 0x1e00);
173 OUT_RING(chan
, 0x1d01);
174 BEGIN_RING(chan
, celsius
, NV10TCL_NORMALIZE_ENABLE
, 1);
176 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_ENABLE
, 2);
179 BEGIN_RING(chan
, celsius
, NV10TCL_LIGHT_MODEL
, 1);
181 BEGIN_RING(chan
, celsius
, NV10TCL_SEPARATE_SPECULAR_ENABLE
, 1);
183 BEGIN_RING(chan
, celsius
, NV10TCL_ENABLED_LIGHTS
, 1);
185 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_OFFSET_POINT_ENABLE
, 3);
189 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_FUNC
, 1);
190 OUT_RING(chan
, 0x201);
191 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_WRITE_ENABLE
, 1);
193 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_TEST_ENABLE
, 1);
195 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_OFFSET_FACTOR
, 2);
198 BEGIN_RING(chan
, celsius
, NV10TCL_POINT_SIZE
, 1);
200 BEGIN_RING(chan
, celsius
, NV10TCL_POINT_PARAMETERS_ENABLE
, 2);
203 BEGIN_RING(chan
, celsius
, NV10TCL_LINE_WIDTH
, 1);
205 BEGIN_RING(chan
, celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
207 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_MODE_FRONT
, 2);
208 OUT_RING(chan
, 0x1b02);
209 OUT_RING(chan
, 0x1b02);
210 BEGIN_RING(chan
, celsius
, NV10TCL_CULL_FACE
, 2);
211 OUT_RING(chan
, 0x405);
212 OUT_RING(chan
, 0x901);
213 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_SMOOTH_ENABLE
, 1);
215 BEGIN_RING(chan
, celsius
, NV10TCL_CULL_FACE_ENABLE
, 1);
217 BEGIN_RING(chan
, celsius
, NV10TCL_TX_GEN_MODE_S(0), 8);
218 for (i
= 0; i
< 8; i
++)
221 BEGIN_RING(chan
, celsius
, NV10TCL_TX_MATRIX_ENABLE(0), 2);
224 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_EQUATION_CONSTANT
, 3);
225 OUT_RING(chan
, 0x3fc00000); /* -1.50 */
226 OUT_RING(chan
, 0xbdb8aa0a); /* -0.09 */
227 OUT_RING(chan
, 0); /* 0.00 */
229 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
232 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_MODE
, 2);
233 OUT_RING(chan
, 0x802);
235 /* for some reason VIEW_MATRIX_ENABLE need to be 6 instead of 4 when
236 * using texturing, except when using the texture matrix
238 BEGIN_RING(chan
, celsius
, NV10TCL_VIEW_MATRIX_ENABLE
, 1);
240 BEGIN_RING(chan
, celsius
, NV10TCL_COLOR_MASK
, 1);
241 OUT_RING(chan
, 0x01010101);
243 /* Set vertex component */
244 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_COL_4F_R
, 4);
245 OUT_RINGf(chan
, 1.0);
246 OUT_RINGf(chan
, 0.0);
247 OUT_RINGf(chan
, 0.0);
248 OUT_RINGf(chan
, 1.0);
249 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_COL2_3F_R
, 3);
253 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_NOR_3F_X
, 3);
256 OUT_RINGf(chan
, 1.0);
257 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_TX0_4F_S
, 4);
258 OUT_RINGf(chan
, 0.0);
259 OUT_RINGf(chan
, 0.0);
260 OUT_RINGf(chan
, 0.0);
261 OUT_RINGf(chan
, 1.0);
262 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_TX1_4F_S
, 4);
263 OUT_RINGf(chan
, 0.0);
264 OUT_RINGf(chan
, 0.0);
265 OUT_RINGf(chan
, 0.0);
266 OUT_RINGf(chan
, 1.0);
267 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_FOG_1F
, 1);
268 OUT_RINGf(chan
, 0.0);
269 BEGIN_RING(chan
, celsius
, NV10TCL_EDGEFLAG_ENABLE
, 1);
272 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_RANGE_NEAR
, 2);
274 OUT_RINGf(chan
, 16777216.0);
280 nv10_context_destroy(GLcontext
*ctx
)
282 struct nouveau_context
*nctx
= to_nouveau_context(ctx
);
284 nv04_surface_takedown(ctx
);
285 nv10_render_destroy(ctx
);
287 nouveau_grobj_free(&nctx
->hw
.eng3d
);
289 nouveau_context_deinit(ctx
);
294 nv10_context_create(struct nouveau_screen
*screen
, const GLvisual
*visual
,
295 GLcontext
*share_ctx
)
297 struct nouveau_context
*nctx
;
299 unsigned celsius_class
;
302 nctx
= CALLOC_STRUCT(nouveau_context
);
308 if (!nouveau_context_init(ctx
, screen
, visual
, share_ctx
))
311 driInitExtensions(ctx
, nv10_extensions
, GL_FALSE
);
314 ctx
->Const
.MaxTextureLevels
= 12;
315 ctx
->Const
.MaxTextureCoordUnits
= NV10_TEXTURE_UNITS
;
316 ctx
->Const
.MaxTextureImageUnits
= NV10_TEXTURE_UNITS
;
317 ctx
->Const
.MaxTextureUnits
= NV10_TEXTURE_UNITS
;
318 ctx
->Const
.MaxTextureMaxAnisotropy
= 2;
319 ctx
->Const
.MaxTextureLodBias
= 15;
320 ctx
->Driver
.Clear
= nv10_clear
;
323 ret
= nv04_surface_init(ctx
);
328 if (context_chipset(ctx
) >= 0x17)
329 celsius_class
= NV17TCL
;
330 else if (context_chipset(ctx
) >= 0x11)
331 celsius_class
= NV11TCL
;
333 celsius_class
= NV10TCL
;
335 ret
= nouveau_grobj_alloc(context_chan(ctx
), 0xbeef0001, celsius_class
,
340 nv10_hwctx_init(ctx
);
341 nv10_render_init(ctx
);
346 nv10_context_destroy(ctx
);
350 const struct nouveau_driver nv10_driver
= {
351 .context_create
= nv10_context_create
,
352 .context_destroy
= nv10_context_destroy
,
353 .surface_copy
= nv04_surface_copy
,
354 .surface_fill
= nv04_surface_fill
,
355 .emit
= (nouveau_state_func
[]) {
356 nv10_emit_alpha_func
,
357 nv10_emit_blend_color
,
358 nv10_emit_blend_equation
,
359 nv10_emit_blend_func
,
360 nv10_emit_clip_plane
,
361 nv10_emit_clip_plane
,
362 nv10_emit_clip_plane
,
363 nv10_emit_clip_plane
,
364 nv10_emit_clip_plane
,
365 nv10_emit_clip_plane
,
366 nv10_emit_color_mask
,
367 nv10_emit_color_material
,
369 nv10_emit_front_face
,
373 nv10_emit_framebuffer
,
375 nv10_emit_light_enable
,
376 nv10_emit_light_model
,
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_light_source
,
384 nv10_emit_light_source
,
385 nv10_emit_line_stipple
,
387 nv10_emit_logic_opcode
,
388 nv10_emit_material_ambient
,
389 nouveau_emit_nothing
,
390 nv10_emit_material_diffuse
,
391 nouveau_emit_nothing
,
392 nv10_emit_material_specular
,
393 nouveau_emit_nothing
,
394 nv10_emit_material_shininess
,
395 nouveau_emit_nothing
,
397 nv10_emit_point_mode
,
398 nv10_emit_point_parameter
,
399 nv10_emit_polygon_mode
,
400 nv10_emit_polygon_offset
,
401 nv10_emit_polygon_stipple
,
402 nv10_emit_projection
,
403 nv10_emit_render_mode
,
405 nv10_emit_shade_model
,
406 nv10_emit_stencil_func
,
407 nv10_emit_stencil_mask
,
408 nv10_emit_stencil_op
,
411 nouveau_emit_nothing
,
412 nouveau_emit_nothing
,
415 nouveau_emit_nothing
,
416 nouveau_emit_nothing
,
419 nouveau_emit_nothing
,
420 nouveau_emit_nothing
,
423 nouveau_emit_nothing
,
424 nouveau_emit_nothing
,
427 .num_emit
= NUM_NOUVEAU_STATE
,