Support for blend color(not tested), "proper line width/point size" clamps and fix for glxinfo problem.

This commit is contained in:
Aapo Tahkola 2005-02-14 13:14:16 +00:00
parent 8352666a9d
commit 0340663eb7
4 changed files with 69 additions and 19 deletions

View File

@ -219,7 +219,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
ctx = r300->radeon.glCtx;
if(ctx->Visual.doubleBufferMode == 0){
fprintf(stderr, "Help me! Single buffer mode doesnt work yet.\n");
exit(-1);
}
ctx->Const.MaxTextureImageUnits = driQueryOptioni(&r300->radeon.optionCache,
"texture_image_units");

View File

@ -1005,6 +1005,13 @@ I am fairly certain that they are correct unless stated otherwise in comments.
# define R300_ALPHA_TEST_GREATER (5 << 8)
# define R300_ALPHA_TEST_NEQUAL (6 << 8)
# define R300_ALPHA_TEST_PASS (7 << 8)
/* // Possibly more correct values:
# define R300_ALPHA_TEST_LEQUAL (3 << 8)
# define R300_ALPHA_TEST_EQUAL (2 << 8)
# define R300_ALPHA_TEST_GEQUAL (6 << 8)
# define R300_ALPHA_TEST_GREATER (4 << 8)
# define R300_ALPHA_TEST_NEQUAL (5 << 8)
*/
# define R300_ALPHA_TEST_OP_MASK (7 << 8)
# define R300_ALPHA_TEST_ENABLE (1 << 11)

View File

@ -485,7 +485,7 @@ static GLboolean r300_run_immediate_render(GLcontext *ctx,
efloat(1.0);
#endif
/* Why do we need this for immediate mode?? */
/* Why do we need this for immediate mode?? Vertex processor needs it to know proper regs */
// r300EmitLOAD_VBPNTR(rmesa, 0);
for(i=0; i < VB->PrimitiveCount; i++){
@ -543,7 +543,7 @@ static GLboolean r300_run_vb_render(GLcontext *ctx,
r300ReleaseArrays(ctx);
r300EmitArrays(ctx, rmesa->state.render_inputs);
// LOCK_HARDWARE(&(rmesa->radeon));
reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);

View File

@ -98,6 +98,7 @@ static void r300AlphaFunc(GLcontext * ctx, GLenum func, GLfloat ref)
break;
case GL_ALWAYS:
pp_misc |= R300_ALPHA_TEST_PASS;
//pp_misc &= ~R300_ALPHA_TEST_ENABLE;
break;
}
@ -108,7 +109,17 @@ static void r300BlendColor(GLcontext * ctx, const GLfloat cf[4])
{
GLubyte color[4];
r300ContextPtr rmesa = R300_CONTEXT(ctx);
fprintf(stderr, "%s:%s is not implemented yet. Fixme !\n", __FILE__, __FUNCTION__);
R300_STATECHANGE(rmesa, unk4E10);
/* Ordering might be wrong */
CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]);
CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]);
CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]);
CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]);
rmesa->hw.unk4E10.cmd[1]=radeonPackColor(4, color[0], color[1], color[2], color[3]);
//fprintf(stderr, "%s:%s is not implemented yet. Fixme !\n", __FILE__, __FUNCTION__);
#if 0
R200_STATECHANGE(rmesa, ctx);
CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]);
@ -641,7 +652,8 @@ static void r300PointSize(GLcontext * ctx, GLfloat size)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
/* TODO: Validate point size */
size = ctx->Point._Size;
R300_STATECHANGE(r300, ps);
r300->hw.ps.cmd[R300_PS_POINTSIZE] =
((int)(size * 6) << R300_POINTSIZE_X_SHIFT) |
@ -660,10 +672,8 @@ static void r300PointSize(GLcontext * ctx, GLfloat size)
static void r300LineWidth(GLcontext *ctx, GLfloat widthf)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
/* IMHO mesa isnt clamping line widths according to ctx->Const.*LineWidth
before calling this from the dd function table.
Since r300ResetHwState calls these with clamped values,
they must be set properly. */
widthf = ctx->Line._Width;
R300_STATECHANGE(r300, lcntl);
r300->hw.lcntl.cmd[1] = (int)(widthf * 6.0);
@ -696,9 +706,40 @@ static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode)
r300ContextPtr r300 = R300_CONTEXT(ctx);
unsigned long hw_mode=0;
hw_mode=r300->hw.unk4288.cmd[1];
//hw_mode=r300->hw.unk4288.cmd[1];
hw_mode |= 1; /* enables point mode by default */
switch (ctx->Polygon.FrontMode) {
case GL_LINE:
hw_mode &= ~PM_NOT_FRONT;
hw_mode |= PM_FRONT_LINE;
break;
case GL_POINT:
hw_mode &= ~PM_NOT_FRONT;
hw_mode &= ~PM_FRONT_LINE;
break;
/* I dont think fgl properly handles these... In any case, test program is needed */
case GL_FILL:
break;
}
switch (ctx->Polygon.BackMode) {
case GL_LINE:
hw_mode &= ~PM_NOT_BACK;
hw_mode |= PM_BACK_LINE;
break;
case GL_POINT:
hw_mode &= ~PM_NOT_BACK;
hw_mode &= ~PM_BACK_LINE;
break;
case GL_FILL:
break;
}
if(hw_mode == 1)
hw_mode = 0;
#if 0
switch (face) {
case GL_FRONT:
//fprintf(stderr, "front\n");
@ -710,8 +751,7 @@ static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode)
case GL_POINT:
hw_mode &= ~PM_FRONT_LINE;
break;
case GL_FILL: /* No idea */
hw_mode = 0;
case GL_FILL:
break;
}
break;
@ -726,8 +766,7 @@ static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode)
case GL_POINT:
hw_mode &= ~PM_BACK_LINE;
break;
case GL_FILL: /* No idea */
hw_mode = 0;
case GL_FILL:
break;
}
break;
@ -751,6 +790,7 @@ static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode)
}
break;
}
#endif
//if( front and back fill) hw_mode=0;
@ -1887,7 +1927,7 @@ void r300ResetHwState(r300ContextPtr r300)
r300->hw.unk4214.cmd[1] = 0x00050005;
r300PointSize(ctx, ctx->Point._Size);
r300PointSize(ctx, 0.0);
#if 0
r300->hw.ps.cmd[R300_PS_POINTSIZE] = (6 << R300_POINTSIZE_X_SHIFT) |
(6 << R300_POINTSIZE_Y_SHIFT);
@ -1897,7 +1937,7 @@ void r300ResetHwState(r300ContextPtr r300)
r300->hw.unk4230.cmd[2] = 0x00020006;
r300->hw.unk4230.cmd[3] = r300PackFloat32(1.0 / 192.0);
r300LineWidth(ctx, ctx->Line._Width);
r300LineWidth(ctx, 0.0);
#ifdef EXP_C
static int foobar=0;
@ -1968,7 +2008,8 @@ void r300ResetHwState(r300ContextPtr r300)
r300->hw.unk4BC8.cmd[1] = 0;
r300->hw.unk4BC8.cmd[2] = 0;
r300->hw.unk4BC8.cmd[3] = 0;
//r300AlphaFunc(ctx, ctx->Color.AlphaFunc, ctx->Color.AlphaRef);
#if 0
r300->hw.at.cmd[R300_AT_ALPHA_TEST] = 0;
#endif
@ -1982,8 +2023,11 @@ void r300ResetHwState(r300ContextPtr r300)
r300->hw.bld.cmd[R300_BLD_CBLEND] = 0;
r300->hw.bld.cmd[R300_BLD_ABLEND] = 0;
#endif
r300BlendColor(ctx, ctx->Color.BlendColor);
#if 0
r300->hw.unk4E10.cmd[1] = 0;
#endif
r300->hw.unk4E10.cmd[2] = 0;
r300->hw.unk4E10.cmd[3] = 0;