mesa: Branch 'master'

Patrice Mandin pmandin at kemper.freedesktop.org
Thu Jan 18 21:11:33 UTC 2007


 src/mesa/drivers/dri/nouveau/Makefile     |    1 
 src/mesa/drivers/dri/nouveau/nv50_state.c |  567 ++++++++++++++++++++++++++++++
 2 files changed, 568 insertions(+)

New commits:
diff-tree 3c59483ed7c5700a58f47ca9b4a61214d02c9307 (from 62efc4ba3eb53ca75abbe9b52feabe49a5fd56b5)
Author: Patrice Mandin <patrice at manoir.racoon.city>
Date:   Thu Jan 18 22:07:17 2007 +0100

    nouveau: preliminary nv50 state

diff --git a/src/mesa/drivers/dri/nouveau/Makefile b/src/mesa/drivers/dri/nouveau/Makefile
index 9eb40fb..7ffba27 100644
--- a/src/mesa/drivers/dri/nouveau/Makefile
+++ b/src/mesa/drivers/dri/nouveau/Makefile
@@ -31,6 +31,7 @@ DRIVER_SOURCES = \
 	nv10_state.c             \
 	nv20_state.c             \
 	nv30_state.c             \
+	nv50_state.c             \
 	nouveau_state_cache.c    \
 	nv20_vertprog.c          \
 	nv30_fragprog.c          \
diff --git a/src/mesa/drivers/dri/nouveau/nv50_state.c b/src/mesa/drivers/dri/nouveau/nv50_state.c
new file mode 100644
index 0000000..d03c6bf
--- /dev/null
+++ b/src/mesa/drivers/dri/nouveau/nv50_state.c
@@ -0,0 +1,567 @@
+/**************************************************************************
+
+Copyright 2006 Nouveau
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+on the rights to use, copy, modify, merge, publish, distribute, sub
+license, and/or sell copies of the Software, and to permit persons to whom
+the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ERIC ANHOLT OR SILICON INTEGRATED SYSTEMS CORP BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+**************************************************************************/
+
+#include "nouveau_context.h"
+#include "nouveau_object.h"
+#include "nouveau_fifo.h"
+#include "nouveau_reg.h"
+#include "nouveau_state.h"
+
+#include "tnl/t_pipeline.h"
+
+#include "mtypes.h"
+#include "colormac.h"
+
+static void nv50AlphaFunc(GLcontext *ctx, GLenum func, GLfloat ref)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+	GLubyte ubRef;
+	CLAMPED_FLOAT_TO_UBYTE(ubRef, ref);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_ALPHA_FUNC_REF, 2);
+	OUT_RING_CACHE(ubRef);
+	OUT_RING_CACHE(func);
+}
+
+static void nv50BlendColor(GLcontext *ctx, const GLfloat color[4])
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); 
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_BLEND_COLOR_R, 4);
+	OUT_RING_CACHEf(color[0]);
+	OUT_RING_CACHEf(color[1]);
+	OUT_RING_CACHEf(color[2]);
+	OUT_RING_CACHEf(color[3]);
+}
+
+static void nv50BlendEquationSeparate(GLcontext *ctx, GLenum modeRGB, GLenum modeA)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_BLEND_EQUATION_RGB, 1);
+	OUT_RING_CACHE(modeRGB);
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_BLEND_EQUATION_ALPHA, 1);
+	OUT_RING_CACHE(modeA);
+}
+
+
+static void nv50BlendFuncSeparate(GLcontext *ctx, GLenum sfactorRGB, GLenum dfactorRGB,
+		GLenum sfactorA, GLenum dfactorA)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_BLEND_FUNC_SRC_RGB, 2);
+	OUT_RING_CACHE(sfactorRGB);	/* FIXME, sometimes has |0x4000 */
+	OUT_RING_CACHE(dfactorRGB);	/* FIXME, sometimes has |0x4000 */
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_BLEND_FUNC_SRC_ALPHA, 2);
+	OUT_RING_CACHE(sfactorA);	/* FIXME, sometimes has |0x4000 */
+	OUT_RING_CACHE(dfactorA);	/* FIXME, sometimes has |0x4000 */
+}
+
+static void nv50Clear(GLcontext *ctx, GLbitfield mask)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+	GLuint hw_bufs = 0;
+
+	if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT))
+		hw_bufs |= 0x3c;
+	if (mask & (BUFFER_BIT_STENCIL))
+		hw_bufs |= 0x02;
+	if (mask & (BUFFER_BIT_DEPTH))
+		hw_bufs |= 0x01;
+
+	if (hw_bufs) {
+		BEGIN_RING_SIZE(NvSub3D, NV50_TCL_PRIMITIVE_3D_CLEAR_BUFFERS, 1);
+		OUT_RING(hw_bufs);
+	}
+}
+
+static void nv50ClearColor(GLcontext *ctx, const GLfloat color[4])
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_CLEAR_COLOR_R, 4);
+	OUT_RING_CACHEf(color[0]);
+	OUT_RING_CACHEf(color[1]);
+	OUT_RING_CACHEf(color[2]);
+	OUT_RING_CACHEf(color[3]);
+}
+
+static void nv50ClearDepth(GLcontext *ctx, GLclampd d)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_CLEAR_DEPTH, 1);
+	OUT_RING_CACHEf(d);
+}
+
+/* we're don't support indexed buffers
+   void (*ClearIndex)(GLcontext *ctx, GLuint index)
+ */
+
+static void nv50ClearStencil(GLcontext *ctx, GLint s)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_CLEAR_STENCIL, 1);
+	OUT_RING_CACHE(s);
+}
+
+static void nv50ClipPlane(GLcontext *ctx, GLenum plane, const GLfloat *equation)
+{
+	/* Only using shaders */
+}
+
+static void nv50ColorMask(GLcontext *ctx, GLboolean rmask, GLboolean gmask,
+		GLboolean bmask, GLboolean amask )
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+	int i;
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_COLOR_MASK(0), 8);
+	for (i=0; i<8; i++) {
+		OUT_RING_CACHE(((amask && 0x01) << 12) | ((bmask && 0x01) << 8) | ((gmask && 0x01)<< 4) | ((rmask && 0x01) << 0));
+	}
+}
+
+static void nv50ColorMaterial(GLcontext *ctx, GLenum face, GLenum mode)
+{
+	// TODO I need love
+}
+
+static void nv50CullFace(GLcontext *ctx, GLenum mode)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_CULL_FACE, 1);
+	OUT_RING_CACHE(mode);
+}
+
+static void nv50FrontFace(GLcontext *ctx, GLenum mode)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_FRONT_FACE, 1);
+	OUT_RING_CACHE(mode);
+}
+
+static void nv50DepthFunc(GLcontext *ctx, GLenum func)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_DEPTH_FUNC, 1);
+	OUT_RING_CACHE(func);
+}
+
+static void nv50DepthMask(GLcontext *ctx, GLboolean flag)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_DEPTH_WRITE_ENABLE, 1);
+	OUT_RING_CACHE(flag);
+}
+
+static void nv50DepthRange(GLcontext *ctx, GLclampd nearval, GLclampd farval)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_DEPTH_RANGE_NEAR, 2);
+	OUT_RING_CACHEf(nearval);
+	OUT_RING_CACHEf(farval);
+}
+
+/** Specify the current buffer for writing */
+//void (*DrawBuffer)( GLcontext *ctx, GLenum buffer );
+/** Specify the buffers for writing for fragment programs*/
+//void (*DrawBuffers)( GLcontext *ctx, GLsizei n, const GLenum *buffers );
+
+static void nv50Enable(GLcontext *ctx, GLenum cap, GLboolean state)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+	switch(cap)
+	{
+		case GL_ALPHA_TEST:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_ALPHA_FUNC_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+//		case GL_AUTO_NORMAL:
+//		case GL_BLEND:
+//		case GL_CLIP_PLANE0:
+//		case GL_CLIP_PLANE1:
+//		case GL_CLIP_PLANE2:
+//		case GL_CLIP_PLANE3:
+//		case GL_CLIP_PLANE4:
+//		case GL_CLIP_PLANE5:
+		case GL_COLOR_LOGIC_OP:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_LOGIC_OP_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+//		case GL_COLOR_MATERIAL:
+//		case GL_COLOR_SUM_EXT:
+//		case GL_COLOR_TABLE:
+//		case GL_CONVOLUTION_1D:
+//		case GL_CONVOLUTION_2D:
+		case GL_CULL_FACE:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_CULL_FACE_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+		case GL_DEPTH_TEST:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_DEPTH_TEST_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+//		case GL_DITHER:
+//		case GL_FOG:
+//		case GL_HISTOGRAM:
+//		case GL_INDEX_LOGIC_OP:
+//		case GL_LIGHT0:
+//		case GL_LIGHT1:
+//		case GL_LIGHT2:
+//		case GL_LIGHT3:
+//		case GL_LIGHT4:
+//		case GL_LIGHT5:
+//		case GL_LIGHT6:
+//		case GL_LIGHT7:
+//		case GL_LIGHTING:
+		case GL_LINE_SMOOTH:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_LINE_SMOOTH_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+		case GL_LINE_STIPPLE:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_LINE_STIPPLE_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+//		case GL_MAP1_COLOR_4:
+//		case GL_MAP1_INDEX:
+//		case GL_MAP1_NORMAL:
+//		case GL_MAP1_TEXTURE_COORD_1:
+//		case GL_MAP1_TEXTURE_COORD_2:
+//		case GL_MAP1_TEXTURE_COORD_3:
+//		case GL_MAP1_TEXTURE_COORD_4:
+//		case GL_MAP1_VERTEX_3:
+//		case GL_MAP1_VERTEX_4:
+//		case GL_MAP2_COLOR_4:
+//		case GL_MAP2_INDEX:
+//		case GL_MAP2_NORMAL:
+//		case GL_MAP2_TEXTURE_COORD_1:
+//		case GL_MAP2_TEXTURE_COORD_2:
+//		case GL_MAP2_TEXTURE_COORD_3:
+//		case GL_MAP2_TEXTURE_COORD_4:
+//		case GL_MAP2_VERTEX_3:
+//		case GL_MAP2_VERTEX_4:
+//		case GL_MINMAX:
+//		case GL_NORMALIZE:
+//		case GL_POINT_SMOOTH:
+		case GL_POLYGON_OFFSET_POINT:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_OFFSET_POINT_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+		case GL_POLYGON_OFFSET_LINE:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_OFFSET_LINE_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+		case GL_POLYGON_OFFSET_FILL:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_OFFSET_FILL_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+		case GL_POLYGON_SMOOTH:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_SMOOTH_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+		case GL_POLYGON_STIPPLE:
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_STIPPLE_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+//		case GL_POST_COLOR_MATRIX_COLOR_TABLE:
+//		case GL_POST_CONVOLUTION_COLOR_TABLE:
+//		case GL_RESCALE_NORMAL:
+//		case GL_SCISSOR_TEST:
+//		case GL_SEPARABLE_2D:
+		case GL_STENCIL_TEST:
+			// TODO BACK and FRONT ?
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_FRONT_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_BACK_ENABLE, 1);
+			OUT_RING_CACHE(state);
+			break;
+//		case GL_TEXTURE_GEN_Q:
+//		case GL_TEXTURE_GEN_R:
+//		case GL_TEXTURE_GEN_S:
+//		case GL_TEXTURE_GEN_T:
+//		case GL_TEXTURE_1D:
+//		case GL_TEXTURE_2D:
+//		case GL_TEXTURE_3D:
+	}
+}
+
+static void nv50Fogfv(GLcontext *ctx, GLenum pname, const GLfloat *params)
+{
+	/* Only using shaders */
+}
+   
+static void nv50Hint(GLcontext *ctx, GLenum target, GLenum mode)
+{
+	// TODO I need love (fog and line_smooth hints)
+}
+
+// void (*IndexMask)(GLcontext *ctx, GLuint mask);
+
+static void nv50Lightfv(GLcontext *ctx, GLenum light, GLenum pname, const GLfloat *params )
+{
+	/* Only with shaders */
+}
+
+/** Set the lighting model parameters */
+void (*LightModelfv)(GLcontext *ctx, GLenum pname, const GLfloat *params);
+
+
+static void nv50LineStipple(GLcontext *ctx, GLint factor, GLushort pattern )
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_LINE_STIPPLE_PATTERN, 1);
+	OUT_RING_CACHE((pattern << 8) | factor);
+}
+
+static void nv50LineWidth(GLcontext *ctx, GLfloat width)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_LINE_WIDTH, 1);
+	OUT_RING_CACHEf(width);
+}
+
+static void nv50LogicOpcode(GLcontext *ctx, GLenum opcode)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_LOGIC_OP_OP, 1);
+	OUT_RING_CACHE(opcode);
+}
+
+static void nv50PointParameterfv(GLcontext *ctx, GLenum pname, const GLfloat *params)
+{
+	/*TODO: not sure what goes here. */
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+	
+}
+
+/** Specify the diameter of rasterized points */
+static void nv50PointSize(GLcontext *ctx, GLfloat size)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POINT_SIZE, 1);
+	OUT_RING_CACHEf(size);
+}
+
+/** Select a polygon rasterization mode */
+static void nv50PolygonMode(GLcontext *ctx, GLenum face, GLenum mode)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_MODE_FRONT, 1);
+		OUT_RING_CACHE(mode);
+	}
+	if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_MODE_BACK, 1);
+		OUT_RING_CACHE(mode);
+	}
+}
+
+/** Set the scale and units used to calculate depth values */
+static void nv50PolygonOffset(GLcontext *ctx, GLfloat factor, GLfloat units)
+{
+        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+ 
+        BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_OFFSET_FACTOR, 1);
+        OUT_RING_CACHEf(factor);
+        BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_OFFSET_UNITS, 1);
+        OUT_RING_CACHEf(units);
+}
+
+/** Set the polygon stippling pattern */
+static void nv50PolygonStipple(GLcontext *ctx, const GLubyte *mask )
+{
+        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+        BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_POLYGON_STIPPLE_PATTERN(0), 32);
+        OUT_RING_CACHEp(mask, 32);
+}
+
+/* Specifies the current buffer for reading */
+void (*ReadBuffer)( GLcontext *ctx, GLenum buffer );
+/** Set rasterization mode */
+void (*RenderMode)(GLcontext *ctx, GLenum mode );
+
+/** Define the scissor box */
+static void nv50Scissor(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+}
+
+/** Select flat or smooth shading */
+static void nv50ShadeModel(GLcontext *ctx, GLenum mode)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_SHADE_MODEL, 1);
+	OUT_RING_CACHE(mode);
+}
+
+/** OpenGL 2.0 two-sided StencilFunc */
+static void nv50StencilFuncSeparate(GLcontext *ctx, GLenum face, GLenum func,
+		GLint ref, GLuint mask)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_FRONT_FUNC_FUNC, 1);
+		OUT_RING_CACHE(func);
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_FRONT_FUNC_REF, 1);
+		OUT_RING_CACHE(ref);
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_FRONT_FUNC_MASK, 1);
+		OUT_RING_CACHE(mask);
+	}
+	if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_BACK_FUNC_FUNC, 2);
+		OUT_RING_CACHE(func);
+		OUT_RING_CACHE(ref);
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_BACK_FUNC_MASK, 1);
+		OUT_RING_CACHE(mask);
+	}
+}
+
+/** OpenGL 2.0 two-sided StencilMask */
+static void nv50StencilMaskSeparate(GLcontext *ctx, GLenum face, GLuint mask)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_FRONT_MASK, 1);
+		OUT_RING_CACHE(mask);
+	}
+	if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_BACK_MASK, 1);
+		OUT_RING_CACHE(mask);
+	}
+}
+
+/** OpenGL 2.0 two-sided StencilOp */
+static void nv50StencilOpSeparate(GLcontext *ctx, GLenum face, GLenum fail,
+		GLenum zfail, GLenum zpass)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_FRONT_OP_FAIL, 3);
+		OUT_RING_CACHE(fail);
+		OUT_RING_CACHE(zfail);
+		OUT_RING_CACHE(zpass);
+	}
+	if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
+		BEGIN_RING_CACHE(NvSub3D, NV50_TCL_PRIMITIVE_3D_STENCIL_BACK_OP_FAIL, 3);
+		OUT_RING_CACHE(fail);
+		OUT_RING_CACHE(zfail);
+		OUT_RING_CACHE(zpass);
+	}
+}
+
+/** Control the generation of texture coordinates */
+void (*TexGen)(GLcontext *ctx, GLenum coord, GLenum pname,
+		const GLfloat *params);
+/** Set texture environment parameters */
+void (*TexEnv)(GLcontext *ctx, GLenum target, GLenum pname,
+		const GLfloat *param);
+/** Set texture parameters */
+void (*TexParameter)(GLcontext *ctx, GLenum target,
+		struct gl_texture_object *texObj,
+		GLenum pname, const GLfloat *params);
+
+static void nv50TextureMatrix(GLcontext *ctx, GLuint unit, const GLmatrix *mat)
+{
+	/* Only with shaders */
+}
+
+static void nv50WindowMoved(nouveauContextPtr nmesa)
+{
+}
+
+static GLboolean nv50InitCard(nouveauContextPtr nmesa)
+{
+	return GL_FALSE;
+}
+
+static GLboolean nv50BindBuffers(nouveauContextPtr nmesa, int num_color,
+      				 nouveau_renderbuffer **color,
+				 nouveau_renderbuffer *depth)
+{
+	return GL_FALSE;
+}
+
+void nv50InitStateFuncs(GLcontext *ctx, struct dd_function_table *func)
+{
+	nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+	func->AlphaFunc			= nv50AlphaFunc;
+	func->BlendColor		= nv50BlendColor;
+	func->BlendEquationSeparate	= nv50BlendEquationSeparate;
+	func->BlendFuncSeparate		= nv50BlendFuncSeparate;
+	func->Clear			= nv50Clear;
+	func->ClearColor		= nv50ClearColor;
+	func->ClearDepth		= nv50ClearDepth;
+	func->ClearStencil		= nv50ClearStencil;
+	func->ClipPlane			= nv50ClipPlane;
+	func->ColorMask			= nv50ColorMask;
+	func->ColorMaterial		= nv50ColorMaterial;
+	func->CullFace			= nv50CullFace;
+	func->FrontFace			= nv50FrontFace;
+	func->DepthFunc			= nv50DepthFunc;
+	func->DepthMask			= nv50DepthMask;
+	func->DepthRange		= nv50DepthRange;
+	func->Enable			= nv50Enable;
+	func->Fogfv			= nv50Fogfv;
+	func->Hint			= nv50Hint;
+	func->Lightfv			= nv50Lightfv;
+/*	func->LightModelfv		= nv50LightModelfv;	 */
+	func->LineStipple		= nv50LineStipple;
+	func->LineWidth			= nv50LineWidth;
+	func->LogicOpcode		= nv50LogicOpcode;
+	func->PointParameterfv		= nv50PointParameterfv;
+	func->PointSize			= nv50PointSize;
+	func->PolygonMode		= nv50PolygonMode;
+	func->PolygonOffset		= nv50PolygonOffset;
+	func->PolygonStipple		= nv50PolygonStipple;
+/*	func->ReadBuffer		= nv50ReadBuffer;	*/
+/*	func->RenderMode		= nv50RenderMode;	*/
+	func->Scissor			= nv50Scissor;
+	func->ShadeModel		= nv50ShadeModel;
+	func->StencilFuncSeparate	= nv50StencilFuncSeparate;
+	func->StencilMaskSeparate	= nv50StencilMaskSeparate;
+	func->StencilOpSeparate		= nv50StencilOpSeparate;
+/*	func->TexGen			= nv50TexGen;		*/
+/*	func->TexParameter		= nv50TexParameter;	*/
+	func->TextureMatrix		= nv50TextureMatrix;
+
+	nmesa->hw_func.InitCard		= nv50InitCard;
+	nmesa->hw_func.BindBuffers	= nv50BindBuffers;
+	nmesa->hw_func.WindowMoved	= nv50WindowMoved;
+}



More information about the mesa-commit mailing list