static void nv30Lightfv(GLcontext *ctx, GLenum light, GLenum pname, const GLfloat *params ) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); GLint p = light - GL_LIGHT0; struct gl_light *l = &ctx->Light.Light[p]; int spotlight_update = SPOTLIGHT_NO_UPDATE; if (NOUVEAU_CARD_USING_SHADERS) return; /* not sure where the fourth param value goes...*/ switch(pname) { case GL_AMBIENT: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_AMBIENT_R(p), 3); OUT_RING_CACHEf(params[0]); OUT_RING_CACHEf(params[1]); OUT_RING_CACHEf(params[2]); break; case GL_DIFFUSE: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_DIFFUSE_R(p), 3); OUT_RING_CACHEf(params[0]); OUT_RING_CACHEf(params[1]); OUT_RING_CACHEf(params[2]); break; case GL_SPECULAR: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_SPECULAR_R(p), 3); OUT_RING_CACHEf(params[0]); OUT_RING_CACHEf(params[1]); OUT_RING_CACHEf(params[2]); break; case GL_POSITION: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_POSITION_X(p), 3); OUT_RING_CACHEf(params[0]); OUT_RING_CACHEf(params[1]); OUT_RING_CACHEf(params[2]); break; case GL_SPOT_DIRECTION: spotlight_update = SPOTLIGHT_UPDATE_DIRECTION; break; case GL_SPOT_EXPONENT: spotlight_update = SPOTLIGHT_UPDATE_EXPONENT; break; case GL_SPOT_CUTOFF: spotlight_update = SPOTLIGHT_UPDATE_ALL; break; case GL_CONSTANT_ATTENUATION: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_CONSTANT_ATTENUATION(p), 1); OUT_RING_CACHEf(*params); break; case GL_LINEAR_ATTENUATION: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_LINEAR_ATTENUATION(p), 1); OUT_RING_CACHEf(*params); break; case GL_QUADRATIC_ATTENUATION: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_QUADRATIC_ATTENUATION(p), 1); OUT_RING_CACHEf(*params); break; default: break; } switch(spotlight_update) { case SPOTLIGHT_UPDATE_DIRECTION: { GLfloat x,y,z; GLfloat spot_light_coef_a = 1.0 / (l->_CosCutoff - 1.0); x = spot_light_coef_a * l->_NormDirection[0]; y = spot_light_coef_a * l->_NormDirection[1]; z = spot_light_coef_a * l->_NormDirection[2]; BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_DIR_X(p), 3); OUT_RING_CACHEf(x); OUT_RING_CACHEf(y); OUT_RING_CACHEf(z); } break; case SPOTLIGHT_UPDATE_EXPONENT: { GLfloat cc,lc,qc; cc = 1.0; /* FIXME: These need to be correctly computed */ lc = 0.0; qc = 2.0; BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_A(p), 3); OUT_RING_CACHEf(cc); OUT_RING_CACHEf(lc); OUT_RING_CACHEf(qc); } break; case SPOTLIGHT_UPDATE_ALL: { GLfloat cc,lc,qc, x,y,z, c; GLfloat spot_light_coef_a = 1.0 / (l->_CosCutoff - 1.0); cc = 1.0; /* FIXME: These need to be correctly computed */ lc = 0.0; qc = 2.0; x = spot_light_coef_a * l->_NormDirection[0]; y = spot_light_coef_a * l->_NormDirection[1]; z = spot_light_coef_a * l->_NormDirection[2]; c = spot_light_coef_a + 1.0; BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_A(p), 7); OUT_RING_CACHEf(cc); OUT_RING_CACHEf(lc); OUT_RING_CACHEf(qc); OUT_RING_CACHEf(x); OUT_RING_CACHEf(y); OUT_RING_CACHEf(z); OUT_RING_CACHEf(c); } break; default: break; } }
static void nv30LineStipple(GLcontext *ctx, GLint factor, GLushort pattern ) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LINE_STIPPLE_PATTERN, 1); OUT_RING_CACHE((pattern << 16) | factor); }
static void nv30Enable(GLcontext *ctx, GLenum cap, GLboolean state) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); switch(cap) { case GL_ALPHA_TEST: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_ENABLE, 1); OUT_RING_CACHE(state); break; // case GL_AUTO_NORMAL: case GL_BLEND: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_BLEND_FUNC_ENABLE, 1); OUT_RING_CACHE(state); break; case GL_CLIP_PLANE0: case GL_CLIP_PLANE1: case GL_CLIP_PLANE2: case GL_CLIP_PLANE3: case GL_CLIP_PLANE4: case GL_CLIP_PLANE5: if (NOUVEAU_CARD_USING_SHADERS) { nouveauShader *nvs = (nouveauShader *)ctx->VertexProgram._Current; if (nvs) nvs->translated = GL_FALSE; } else { BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLIP_PLANE_ENABLE(cap-GL_CLIP_PLANE0), 1); OUT_RING_CACHE(state); } break; case GL_COLOR_LOGIC_OP: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_COLOR_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, NV30_TCL_PRIMITIVE_3D_CULL_FACE_ENABLE, 1); OUT_RING_CACHE(state); break; case GL_DEPTH_TEST: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_TEST_ENABLE, 1); OUT_RING_CACHE(state); break; case GL_DITHER: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DITHER_ENABLE, 1); OUT_RING_CACHE(state); break; case GL_FOG: if (NOUVEAU_CARD_USING_SHADERS) break; BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_ENABLE, 1); OUT_RING_CACHE(state); break; // 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: { uint32_t mask=0x11<<(2*(cap-GL_LIGHT0)); if (NOUVEAU_CARD_USING_SHADERS) break; nmesa->enabled_lights=((nmesa->enabled_lights&mask)|(mask*state)); if (nmesa->lighting_enabled) { BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ENABLED_LIGHTS, 1); OUT_RING_CACHE(nmesa->enabled_lights); } break; } case GL_LIGHTING: if (NOUVEAU_CARD_USING_SHADERS) break; nmesa->lighting_enabled=state; BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ENABLED_LIGHTS, 1); if (nmesa->lighting_enabled) OUT_RING_CACHE(nmesa->enabled_lights); else OUT_RING_CACHE(0x0); break; // case GL_LINE_SMOOTH: // case GL_LINE_STIPPLE: // 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: if (nmesa->screen->card->type != NV_44) { BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_NORMALIZE_ENABLE, 1); OUT_RING_CACHE(state); } break; // case GL_POINT_SMOOTH: case GL_POLYGON_OFFSET_POINT: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_POINT_ENABLE, 1); OUT_RING_CACHE(state); break; case GL_POLYGON_OFFSET_LINE: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_LINE_ENABLE, 1); OUT_RING_CACHE(state); break; case GL_POLYGON_OFFSET_FILL: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_FILL_ENABLE, 1); OUT_RING_CACHE(state); break; case GL_POLYGON_SMOOTH: BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_SMOOTH_ENABLE, 1); OUT_RING_CACHE(state); break; case GL_POLYGON_STIPPLE: BEGIN_RING_CACHE(NvSub3D, NV30_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: /* No enable bit, nv30Scissor will adjust to max range */ ctx->Driver.Scissor(ctx, ctx->Scissor.X, ctx->Scissor.Y, ctx->Scissor.Width, ctx->Scissor.Height); break; // case GL_SEPARABLE_2D: case GL_STENCIL_TEST: // TODO BACK and FRONT ? BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_ENABLE, 1); OUT_RING_CACHE(state); BEGIN_RING_CACHE(NvSub3D, NV30_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 nv30Fogfv(GLcontext *ctx, GLenum pname, const GLfloat *params) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); if (NOUVEAU_CARD_USING_SHADERS) return; switch(pname) { case GL_FOG_MODE: { int mode = 0; /* The modes are different in GL and the card. */ switch(ctx->Fog.Mode) { case GL_LINEAR: mode = 0x804; break; case GL_EXP: mode = 0x802; break; case GL_EXP2: mode = 0x803; break; } BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_MODE, 1); OUT_RING_CACHE (mode); break; } case GL_FOG_COLOR: { GLubyte c[4]; UNCLAMPED_FLOAT_TO_RGBA_CHAN(c,params); BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_COLOR, 1); /* nvidia ignores the alpha channel */ OUT_RING_CACHE(PACK_COLOR_8888_REV(c[0],c[1],c[2],c[3])); break; } case GL_FOG_DENSITY: case GL_FOG_START: case GL_FOG_END: { GLfloat f=0., c=0.; switch(ctx->Fog.Mode) { case GL_LINEAR: f = -1.0/(ctx->Fog.End - ctx->Fog.Start); c = ctx->Fog.Start/(ctx->Fog.End - ctx->Fog.Start) + 2.001953; break; case GL_EXP: f = -0.090168*ctx->Fog.Density; c = 1.5; case GL_EXP2: f = -0.212330*ctx->Fog.Density; c = 1.5; } BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_EQUATION_LINEAR, 1); OUT_RING_CACHE(f); BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_EQUATION_CONSTANT, 1); OUT_RING_CACHE(c); BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_EQUATION_QUADRATIC, 1); OUT_RING_CACHE(0); /* Is this always the same? */ break; } // case GL_FOG_COORD_SRC: default: break; } }
static void nv30DepthFunc(GLcontext *ctx, GLenum func) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_FUNC, 1); OUT_RING_CACHE(func); }
static void nv30DepthMask(GLcontext *ctx, GLboolean flag) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_WRITE_ENABLE, 1); OUT_RING_CACHE(flag); }
static void nv20BlendEquationSeparate(GLcontext *ctx, GLenum modeRGB, GLenum modeA) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); BEGIN_RING_CACHE(NvSub3D, NV20_TCL_PRIMITIVE_3D_BLEND_EQUATION, 1); OUT_RING_CACHE((modeA<<16) | modeRGB); }
static void nv30FrontFace(GLcontext *ctx, GLenum mode) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FRONT_FACE, 1); OUT_RING_CACHE(mode); }
/** Specify the diameter of rasterized points */ static void nv20PointSize(GLcontext *ctx, GLfloat size) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); BEGIN_RING_CACHE(NvSub3D, NV20_TCL_PRIMITIVE_3D_POINT_SIZE, 1); OUT_RING_CACHEf(size); }
/** Set the polygon stippling pattern */ static void nv20PolygonStipple(GLcontext *ctx, const GLubyte *mask ) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); BEGIN_RING_CACHE(NvSub3D, NV20_TCL_PRIMITIVE_3D_POLYGON_STIPPLE_PATTERN(0), 32); OUT_RING_CACHEp(mask, 32); }
static void nv20PointParameterfv(GLcontext *ctx, GLenum pname, const GLfloat *params) { /*TODO: not sure what goes here. */ nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); }
static void nv20LogicOpcode(GLcontext *ctx, GLenum opcode) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); BEGIN_RING_CACHE(NvSub3D, NV20_TCL_PRIMITIVE_3D_COLOR_LOGIC_OP_OP, 1); OUT_RING_CACHE(opcode); }
static void nv20LineWidth(GLcontext *ctx, GLfloat width) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); BEGIN_RING_CACHE(NvSub3D, NV20_TCL_PRIMITIVE_3D_LINE_WIDTH, 1); OUT_RING_CACHEf(width); }
/* glFinish */ static void nouveauFinish( GLcontext *ctx ) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); nouveauFlush( ctx ); nouveauWaitForIdle( nmesa ); }
/* glFlush */ static void nouveauFlush( GLcontext *ctx ) { nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); FIRE_RING(); }