1 /**************************************************************************
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:
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
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.
25 **************************************************************************/
27 #include "nouveau_context.h"
28 #include "nouveau_object.h"
29 #include "nouveau_fifo.h"
30 #include "nouveau_reg.h"
32 #include "tnl/t_pipeline.h"
37 static void nv30AlphaFunc(GLcontext
*ctx
, GLenum func
, GLfloat ref
)
39 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
41 CLAMPED_FLOAT_TO_UBYTE(ubRef
, ref
);
43 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_FUNC
, 2);
44 OUT_RING(func
); /* NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_FUNC */
45 OUT_RING(ubRef
); /* NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_REF */
48 static void nv30BlendColor(GLcontext
*ctx
, const GLfloat color
[4])
50 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
53 CLAMPED_FLOAT_TO_UBYTE(cf
[0], color
[0]);
54 CLAMPED_FLOAT_TO_UBYTE(cf
[1], color
[1]);
55 CLAMPED_FLOAT_TO_UBYTE(cf
[2], color
[2]);
56 CLAMPED_FLOAT_TO_UBYTE(cf
[3], color
[3]);
58 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_BLEND_COLOR
, 1);
59 OUT_RING(PACK_COLOR_8888(cf
[3], cf
[1], cf
[2], cf
[0]));
62 static void nv30BlendEquationSeparate(GLcontext
*ctx
, GLenum modeRGB
, GLenum modeA
)
64 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
65 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_BLEND_EQUATION
, 1);
66 OUT_RING((modeA
<<16) | modeRGB
);
70 static void nv30BlendFuncSeparate(GLcontext
*ctx
, GLenum sfactorRGB
, GLenum dfactorRGB
,
71 GLenum sfactorA
, GLenum dfactorA
)
73 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
74 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_BLEND_FUNC_SRC
, 2);
75 OUT_RING((sfactorA
<<16) | sfactorRGB
);
76 OUT_RING((dfactorA
<<16) | dfactorRGB
);
79 static void nv30ClearColor(GLcontext
*ctx
, const GLfloat color
[4])
81 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
83 UNCLAMPED_FLOAT_TO_RGBA_CHAN(c
,color
);
84 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_CLEAR_VALUE_ARGB
, 1);
85 OUT_RING(PACK_COLOR_8888(c
[3],c
[0],c
[1],c
[2]));
88 static void nv30ClearDepth(GLcontext
*ctx
, GLclampd d
)
90 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
91 nmesa
->clear_value
=((nmesa
->clear_value
&0x000000FF)|(((uint32_t)(d
*0xFFFFFF))<<8));
92 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_CLEAR_VALUE_DEPTH
, 1);
93 OUT_RING(nmesa
->clear_value
);
96 /* we're don't support indexed buffers
97 void (*ClearIndex)(GLcontext *ctx, GLuint index)
100 static void nv30ClearStencil(GLcontext
*ctx
, GLint s
)
102 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
103 nmesa
->clear_value
=((nmesa
->clear_value
&0xFFFFFF00)|(s
&0x000000FF));
104 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_CLEAR_VALUE_DEPTH
, 1);
105 OUT_RING(nmesa
->clear_value
);
108 static void nv30ClipPlane(GLcontext
*ctx
, GLenum plane
, const GLfloat
*equation
)
110 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
111 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_CLIP_PLANE_A(plane
), 4);
112 OUT_RINGf(equation
[0]);
113 OUT_RINGf(equation
[1]);
114 OUT_RINGf(equation
[2]);
115 OUT_RINGf(equation
[3]);
118 static void nv30ColorMask(GLcontext
*ctx
, GLboolean rmask
, GLboolean gmask
,
119 GLboolean bmask
, GLboolean amask
)
121 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
122 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_COLOR_MASK
, 1);
123 OUT_RING(((amask
&& 0x01) << 24) | ((rmask
&& 0x01) << 16) | ((gmask
&& 0x01)<< 8) | ((bmask
&& 0x01) << 0));
126 static void nv30ColorMaterial(GLcontext
*ctx
, GLenum face
, GLenum mode
)
131 static void nv30CullFace(GLcontext
*ctx
, GLenum mode
)
133 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
134 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_CULL_FACE
, 1);
138 static void nv30FrontFace(GLcontext
*ctx
, GLenum mode
)
140 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
141 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_FRONT_FACE
, 1);
145 static void nv30DepthFunc(GLcontext
*ctx
, GLenum func
)
147 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
148 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_DEPTH_FUNC
, 1);
152 static void nv30DepthMask(GLcontext
*ctx
, GLboolean flag
)
154 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
155 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_DEPTH_WRITE_ENABLE
, 1);
159 static void nv30DepthRange(GLcontext
*ctx
, GLclampd nearval
, GLclampd farval
)
161 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
162 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_DEPTH_RANGE_NEAR
, 2);
167 /** Specify the current buffer for writing */
168 //void (*DrawBuffer)( GLcontext *ctx, GLenum buffer );
169 /** Specify the buffers for writing for fragment programs*/
170 //void (*DrawBuffers)( GLcontext *ctx, GLsizei n, const GLenum *buffers );
172 static void nv30Enable(GLcontext
*ctx
, GLenum cap
, GLboolean state
)
174 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
178 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_ENABLE
, 1);
181 // case GL_AUTO_NORMAL:
183 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_BLEND_FUNC_ENABLE
, 1);
192 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_CLIP_PLANE_ENABLE(cap
-GL_CLIP_PLANE0
), 1);
195 case GL_COLOR_LOGIC_OP
:
196 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_COLOR_LOGIC_OP_ENABLE
, 1);
199 // case GL_COLOR_MATERIAL:
200 // case GL_COLOR_SUM_EXT:
201 // case GL_COLOR_TABLE:
202 // case GL_CONVOLUTION_1D:
203 // case GL_CONVOLUTION_2D:
205 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_CULL_FACE_ENABLE
, 1);
209 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_DEPTH_TEST_ENABLE
, 1);
213 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_DITHER_ENABLE
, 1);
217 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_FOG_ENABLE
, 1);
220 // case GL_HISTOGRAM:
221 // case GL_INDEX_LOGIC_OP:
231 uint32_t mask
=0x11<<(2*(cap
-GL_LIGHT0
));
232 nmesa
->enabled_lights
=((nmesa
->enabled_lights
&mask
)|(mask
*state
));
233 if (nmesa
->lighting_enabled
)
235 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_ENABLED_LIGHTS
, 1);
236 OUT_RING(nmesa
->enabled_lights
);
241 nmesa
->lighting_enabled
=state
;
242 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_ENABLED_LIGHTS
, 1);
243 if (nmesa
->lighting_enabled
)
244 OUT_RING(nmesa
->enabled_lights
);
248 // case GL_LINE_SMOOTH:
249 // case GL_LINE_STIPPLE:
250 // case GL_MAP1_COLOR_4:
251 // case GL_MAP1_INDEX:
252 // case GL_MAP1_NORMAL:
253 // case GL_MAP1_TEXTURE_COORD_1:
254 // case GL_MAP1_TEXTURE_COORD_2:
255 // case GL_MAP1_TEXTURE_COORD_3:
256 // case GL_MAP1_TEXTURE_COORD_4:
257 // case GL_MAP1_VERTEX_3:
258 // case GL_MAP1_VERTEX_4:
259 // case GL_MAP2_COLOR_4:
260 // case GL_MAP2_INDEX:
261 // case GL_MAP2_NORMAL:
262 // case GL_MAP2_TEXTURE_COORD_1:
263 // case GL_MAP2_TEXTURE_COORD_2:
264 // case GL_MAP2_TEXTURE_COORD_3:
265 // case GL_MAP2_TEXTURE_COORD_4:
266 // case GL_MAP2_VERTEX_3:
267 // case GL_MAP2_VERTEX_4:
270 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_NORMALIZE_ENABLE
, 1);
273 // case GL_POINT_SMOOTH:
274 case GL_POLYGON_OFFSET_POINT
:
275 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_POINT_ENABLE
, 1);
278 case GL_POLYGON_OFFSET_LINE
:
279 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_LINE_ENABLE
, 1);
282 case GL_POLYGON_OFFSET_FILL
:
283 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_FILL_ENABLE
, 1);
286 case GL_POLYGON_SMOOTH
:
287 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_POLYGON_SMOOTH_ENABLE
, 1);
290 case GL_POLYGON_STIPPLE
:
291 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_POLYGON_STIPPLE_ENABLE
, 1);
294 // case GL_POST_COLOR_MATRIX_COLOR_TABLE:
295 // case GL_POST_CONVOLUTION_COLOR_TABLE:
296 // case GL_RESCALE_NORMAL:
297 // case GL_SCISSOR_TEST:
298 // case GL_SEPARABLE_2D:
299 case GL_STENCIL_TEST
:
300 // TODO BACK and FRONT ?
301 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_ENABLE
, 1);
304 // case GL_TEXTURE_GEN_Q:
305 // case GL_TEXTURE_GEN_R:
306 // case GL_TEXTURE_GEN_S:
307 // case GL_TEXTURE_GEN_T:
308 // case GL_TEXTURE_1D:
309 // case GL_TEXTURE_2D:
310 // case GL_TEXTURE_3D:
314 static void nv30Fogfv(GLcontext
*ctx
, GLenum pname
, const GLfloat
*params
)
316 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
320 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_FOG_MODE
, 1);
323 /* TODO: unsure about the rest.*/
330 static void nv30Hint(GLcontext
*ctx
, GLenum target
, GLenum mode
)
332 // TODO I need love (fog and line_smooth hints)
335 // void (*IndexMask)(GLcontext *ctx, GLuint mask);
337 static void nv30Lightfv(GLcontext
*ctx
, GLenum light
, GLenum pname
, const GLfloat
*params
)
339 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
340 /* not sure where the fourth param value goes...*/
344 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_AMBIENT_A(light
), 3);
345 OUT_RINGf(params
[0]);
346 OUT_RINGf(params
[1]);
347 OUT_RINGf(params
[2]);
350 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_DIFFUSE_A(light
), 3);
351 OUT_RINGf(params
[0]);
352 OUT_RINGf(params
[1]);
353 OUT_RINGf(params
[2]);
356 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_SPECULAR_A(light
), 3);
357 OUT_RINGf(params
[0]);
358 OUT_RINGf(params
[1]);
359 OUT_RINGf(params
[2]);
361 case GL_SPOT_DIRECTION
:
362 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_DIR_X(light
), 3);
363 OUT_RINGf(params
[0]);
364 OUT_RINGf(params
[1]);
365 OUT_RINGf(params
[2]);
368 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_POSITION_X(light
), 3);
369 OUT_RINGf(params
[0]);
370 OUT_RINGf(params
[1]);
371 OUT_RINGf(params
[2]);
373 case GL_SPOT_EXPONENT
:
374 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_EXPONENT(light
), 1);
378 /* you can't factor these */
379 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_A(light
), 1);
380 OUT_RINGf(params
[0]);
381 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_B(light
), 1);
382 OUT_RINGf(params
[1]);
383 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_C(light
), 1);
384 OUT_RINGf(params
[2]);
386 case GL_CONSTANT_ATTENUATION
:
387 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_CONSTANT_ATTENUATION(light
), 1);
390 case GL_LINEAR_ATTENUATION
:
391 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_LINEAR_ATTENUATION(light
), 1);
394 case GL_QUADRATIC_ATTENUATION
:
395 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LIGHT_QUADRATIC_ATTENUATION(light
), 1);
403 /** Set the lighting model parameters */
404 static void (*LightModelfv
)(GLcontext
*ctx
, GLenum pname
, const GLfloat
*params
);
407 static void nv30LineStipple(GLcontext
*ctx
, GLint factor
, GLushort pattern
)
409 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
410 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LINE_STIPPLE_PATTERN
, 1);
411 OUT_RING((pattern
<< 16) | factor
);
414 static void nv30LineWidth(GLcontext
*ctx
, GLfloat width
)
416 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
419 CLAMPED_FLOAT_TO_UBYTE(ubWidth
, width
);
421 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_LINE_WIDTH_SMOOTH
, 1);
425 static void nv30LogicOpcode(GLcontext
*ctx
, GLenum opcode
)
427 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
428 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_COLOR_LOGIC_OP_OP
, 1);
432 static void nv30PointParameterfv(GLcontext
*ctx
, GLenum pname
, const GLfloat
*params
)
434 /*TODO: not sure what goes here. */
435 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
439 /** Specify the diameter of rasterized points */
440 static void nv30PointSize(GLcontext
*ctx
, GLfloat size
)
442 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
443 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_POINT_SIZE
, 1);
447 /** Select a polygon rasterization mode */
448 static void nv30PolygonMode(GLcontext
*ctx
, GLenum face
, GLenum mode
)
450 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
452 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
453 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_POLYGON_MODE_FRONT
, 1);
456 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
457 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_POLYGON_MODE_BACK
, 1);
462 /** Set the scale and units used to calculate depth values */
463 void (*PolygonOffset
)(GLcontext
*ctx
, GLfloat factor
, GLfloat units
);
464 /** Set the polygon stippling pattern */
465 void (*PolygonStipple
)(GLcontext
*ctx
, const GLubyte
*mask
);
466 /* Specifies the current buffer for reading */
467 void (*ReadBuffer
)( GLcontext
*ctx
, GLenum buffer
);
468 /** Set rasterization mode */
469 void (*RenderMode
)(GLcontext
*ctx
, GLenum mode
);
470 /** Define the scissor box */
471 void (*Scissor
)(GLcontext
*ctx
, GLint x
, GLint y
, GLsizei w
, GLsizei h
);
472 /** Select flat or smooth shading */
473 void nv30ShadeModel(GLcontext
*ctx
, GLenum mode
)
475 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
477 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_SHADE_MODEL
, 1);
481 /** OpenGL 2.0 two-sided StencilFunc */
482 static void nv30StencilFuncSeparate(GLcontext
*ctx
, GLenum face
, GLenum func
,
483 GLint ref
, GLuint mask
)
485 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
487 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
488 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_FUNC_FUNC
, 3);
493 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
494 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_FUNC_FUNC
, 3);
501 /** OpenGL 2.0 two-sided StencilMask */
502 static void nv30StencilMaskSeparate(GLcontext
*ctx
, GLenum face
, GLuint mask
)
504 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
506 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
507 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_MASK
, 1);
510 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
511 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_MASK
, 1);
516 /** OpenGL 2.0 two-sided StencilOp */
517 static void nv30StencilOpSeparate(GLcontext
*ctx
, GLenum face
, GLenum fail
,
518 GLenum zfail
, GLenum zpass
)
520 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
522 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
523 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_OP_FAIL
, 3);
528 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
529 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_OP_FAIL
, 3);
536 /** Control the generation of texture coordinates */
537 void (*TexGen
)(GLcontext
*ctx
, GLenum coord
, GLenum pname
,
538 const GLfloat
*params
);
539 /** Set texture environment parameters */
540 void (*TexEnv
)(GLcontext
*ctx
, GLenum target
, GLenum pname
,
541 const GLfloat
*param
);
542 /** Set texture parameters */
543 void (*TexParameter
)(GLcontext
*ctx
, GLenum target
,
544 struct gl_texture_object
*texObj
,
545 GLenum pname
, const GLfloat
*params
);
546 void (*TextureMatrix
)(GLcontext
*ctx
, GLuint unit
, const GLmatrix
*mat
);
548 /** Set the viewport */
549 static void nv30Viewport(GLcontext
*ctx
, GLint x
, GLint y
, GLsizei w
, GLsizei h
)
551 /* TODO: Where do the VIEWPORT_XFRM_* regs come in? */
552 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
553 BEGIN_RING_SIZE(NvSub3D
, NV30_TCL_PRIMITIVE_3D_VIEWPORT_DIMS_0
, 2);
554 OUT_RING((w
<< 16) | x
);
555 OUT_RING((h
<< 16) | y
);
558 void nv30InitStateFuncs(struct dd_function_table
*func
)
560 func
->AlphaFunc
= nv30AlphaFunc
;
561 func
->BlendColor
= nv30BlendColor
;
562 func
->BlendEquationSeparate
= nv30BlendEquationSeparate
;
563 func
->BlendFuncSeparate
= nv30BlendFuncSeparate
;
564 func
->ClearColor
= nv30ClearColor
;
565 func
->ClearDepth
= nv30ClearDepth
;
566 func
->ClearStencil
= nv30ClearStencil
;
567 func
->ClipPlane
= nv30ClipPlane
;
568 func
->ColorMask
= nv30ColorMask
;
569 func
->ColorMaterial
= nv30ColorMaterial
;
570 func
->CullFace
= nv30CullFace
;
571 func
->FrontFace
= nv30FrontFace
;
572 func
->DepthFunc
= nv30DepthFunc
;
573 func
->DepthMask
= nv30DepthMask
;
574 func
->DepthRange
= nv30DepthRange
;
575 func
->Enable
= nv30Enable
;
576 func
->Fogfv
= nv30Fogfv
;
577 func
->Hint
= nv30Hint
;
578 func
->Lightfv
= nv30Lightfv
;
579 /* func->LightModelfv = nv30LightModelfv; */
580 func
->LineStipple
= nv30LineStipple
;
581 func
->LineWidth
= nv30LineWidth
;
582 func
->LogicOpcode
= nv30LogicOpcode
;
583 func
->PointParameterfv
= nv30PointParameterfv
;
584 func
->PointSize
= nv30PointSize
;
585 func
->PolygonMode
= nv30PolygonMode
;
587 func
->PolygonOffset
= nv30PolygonOffset
;
588 func
->PolygonStipple
= nv30PolygonStipple
;
589 func
->ReadBuffer
= nv30ReadBuffer
;
590 func
->RenderMode
= nv30RenderMode
;
591 func
->Scissor
= nv30Scissor
;
593 func
->ShadeModel
= nv30ShadeModel
;
594 func
->StencilFuncSeparate
= nv30StencilFuncSeparate
;
595 func
->StencilMaskSeparate
= nv30StencilMaskSeparate
;
596 func
->StencilOpSeparate
= nv30StencilOpSeparate
;
598 func
->TexGen
= nv30TexGen
;
599 func
->TexParameter
= nv30TexParameter
;
600 func
->TextureMatrix
= nv30TextureMatrix
;
602 func
->Viewport
= nv30Viewport
;