Get Polygon offset fill to work.

Make WARN_ONCE message more informative.
This commit is contained in:
Vladimir Dergachev 2005-02-03 03:43:01 +00:00
parent 94a20cbadf
commit f46de6f23b
5 changed files with 68 additions and 23 deletions

View File

@ -301,6 +301,8 @@ void r300InitCmdBuf(r300ContextPtr r300)
/* Initialize state atoms */
ALLOC_STATE( vpt, always, R300_VPT_CMDSIZE, "vpt", 0 );
r300->hw.vpt.cmd[R300_VPT_CMD_0] = cmducs(R300_SE_VPORT_XSCALE, 6);
ALLOC_STATE( zbs, always, R300_ZBS_CMDSIZE, "zbs", 0 );
r300->hw.zbs.cmd[R300_ZBS_CMD_0] = cmducs(R300_SE_ZBIAS_FACTOR, 2);
ALLOC_STATE( unk2080, always, 2, "unk2080", 0 );
r300->hw.unk2080.cmd[0] = cmducs(0x2080, 1);
ALLOC_STATE( vte, always, 3, "vte", 0 );
@ -460,6 +462,7 @@ void r300InitCmdBuf(r300ContextPtr r300)
r300->hw.atomlist.name = "atom-list";
insert_at_tail(&r300->hw.atomlist, &r300->hw.vpt);
insert_at_tail(&r300->hw.atomlist, &r300->hw.zbs);
insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2080);
insert_at_tail(&r300->hw.atomlist, &r300->hw.vte);
insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2134);

View File

@ -57,11 +57,11 @@ typedef struct r300_context *r300ContextPtr;
/* Checkpoint.. for convenience */
#define CPT { fprintf(stderr, "%s:%s line %d\n", __FILE__, __FUNCTION__, __LINE__); }
#define WARN_ONCE(a) { \
static int warn=1; \
if(warn){ \
static int warn##__LINE__=1; \
if(warn##__LINE__){ \
fprintf(stderr, "%s:%s line %d ***WARN_ONCE*** " a, \
__FILE__, __FUNCTION__, __LINE__); \
warn=0;\
warn##__LINE__=0;\
} \
}
@ -209,6 +209,11 @@ struct r300_state_atom {
#define R300_VPT_ZOFFSET 6
#define R300_VPT_CMDSIZE 7
#define R300_ZBS_CMD_0 0
#define R300_ZBS_FACTOR 1
#define R300_ZBS_CONSTANT 2
#define R300_ZBS_CMDSIZE 3
#define R300_VIR_CMD_0 0 /* vir is variable size (at least 1) */
#define R300_VIR_CNTL_0 1
#define R300_VIR_CNTL_1 2
@ -371,6 +376,7 @@ struct r300_hw_state {
int max_state_size; /* in dwords */
struct r300_state_atom vpt; /* viewport (1D98) */
struct r300_state_atom zbs; /* zbias (1DB0) */
struct r300_state_atom unk2080; /* (2080) */
struct r300_state_atom vof; /* VAP output format register 0x2090 */
struct r300_state_atom vte; /* (20B0) */

View File

@ -16,6 +16,8 @@ I am fairly certain that they are correct unless stated otherwise in comments.
#define R300_SE_VPORT_ZSCALE 0x1DA8
#define R300_SE_VPORT_ZOFFSET 0x1DAC
#define R300_SE_ZBIAS_FACTOR 0x1DB0
#define R300_SE_ZBIAS_CONSTANT 0x1DB4
/* This register is written directly and also starts data section in many 3d CP_PACKET3's */
#define R300_VAP_VF_CNTL 0x2084
@ -634,9 +636,9 @@ I am fairly certain that they are correct unless stated otherwise in comments.
# define R300_TX_FORMAT_DXT3 0x10
# define R300_TX_FORMAT_DXT5 0x11
# define R300_TX_FORMAT_D3DMFT_CxV8U8 0x12 /* no swizzle */
# define R300_TX_FORMA_A8R8G8B8 0x13 /* no swizzle */
# define R300_TX_FORMA_B8G8_B8G8 0x14 /* no swizzle */
# define R300_TX_FORMA_G8R8_G8B8 0x15 /* no swizzle */
# define R300_TX_FORMAT_A8R8G8B8 0x13 /* no swizzle */
# define R300_TX_FORMAT_B8G8_B8G8 0x14 /* no swizzle */
# define R300_TX_FORMAT_G8R8_G8B8 0x15 /* no swizzle */
/* 0x16 - some 16 bit green format.. ?? */
/* gap */
/* Floating point formats */

View File

@ -208,18 +208,22 @@ static void r300_render_immediate_primitive(r300ContextPtr rmesa,
if(type<0)return;
if(!VB->ObjPtr){
fprintf(stderr, "FIXME: Dont know how to handle GL_ARB_vertex_buffer_object "
"correctly\n");
WARN_ONCE("FIXME: Don't know how to handle GL_ARB_vertex_buffer_object correctly\n");
return;
}
/* A packet cannot have more than 16383 data words.. */
if(((end-start)*4*rmesa->state.aos_count)>16380){
fprintf(stderr, "%s:%s: Too many vertices to paint. Fix me !\n");
WARN_ONCE("Too many vertices to paint. Fix me !\n");
return;
}
//fprintf(stderr, "aos_count=%d start=%d end=%d\n", rmesa->state.aos_count, start, end);
if(rmesa->state.aos_count==0){
WARN_ONCE("Aeiee ! aos_count==0, while it shouldn't. Skipping rendering\n");
return;
}
start_immediate_packet(end-start, type, 4*rmesa->state.aos_count);
for(i=start;i<end;i++){
@ -622,7 +626,7 @@ static void r300_check_render(GLcontext *ctx, struct tnl_pipeline_stage *stage)
FALLBACK_IF(ctx->Polygon.OffsetPoint); // GL_POLYGON_OFFSET_POINT
FALLBACK_IF(ctx->Polygon.OffsetLine); // GL_POLYGON_OFFSET_LINE
//FALLBACK_IF(ctx->Polygon.OffsetFill); // GL_POLYGON_OFFSET_FILL
if(ctx->Polygon.OffsetFill)WARN_ONCE("Polygon.OffsetFill not implemented, ignoring\n");
//if(ctx->Polygon.OffsetFill)WARN_ONCE("Polygon.OffsetFill not implemented, ignoring\n");
FALLBACK_IF(ctx->Polygon.SmoothFlag); // GL_POLYGON_SMOOTH
FALLBACK_IF(ctx->Polygon.StippleFlag); // GL_POLYGON_STIPPLE
//FALLBACK_IF(ctx->Stencil.Enabled); // GL_STENCIL_TEST

View File

@ -417,9 +417,8 @@ static void r300UpdateCulling(GLcontext* ctx)
if (ctx->Polygon.FrontFace == GL_CW)
val |= R300_FRONT_FACE_CW;
else
val |= R300_FRONT_FACE_CCW;
val |= R300_FRONT_FACE_CCW;
}
r300->hw.cul.cmd[R300_CUL_CULL] = val;
}
@ -479,15 +478,8 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
case GL_STENCIL_TEST:
{
static int stencil=1;
if(stencil){
fprintf(stderr, "%s:%s - do not know how to enable stencil. Help me !\n",
__FILE__, __FUNCTION__);
stencil=0;
}
}
WARN_ONCE("Do not know how to enable stencil. Help me !\n");
if (r300->state.hw_stencil) {
//fprintf(stderr, "Stencil %s\n", state ? "enabled" : "disabled");
R300_STATECHANGE(r300, zs);
@ -506,6 +498,14 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
case GL_CULL_FACE:
r300UpdateCulling(ctx);
break;
case GL_POLYGON_OFFSET_FILL:
R300_STATECHANGE(r300, unk42B4);
if (state) {
r300->hw.unk42B4.cmd[1] = (1<<1);
} else {
r300->hw.unk42B4.cmd[1] = 0;
}
break;
case GL_VERTEX_PROGRAM_ARB:
//TCL_FALLBACK(rmesa->glCtx, R200_TCL_FALLBACK_TCL_DISABLE, state);
break;
@ -684,6 +684,9 @@ static void r300PointSize(GLcontext * ctx, GLfloat size)
return R300_ZS_DECR_WRAP;
case GL_INVERT:
return R300_ZS_INVERT;
default:
WARN_ONCE("Do not know how to translate stencil op");
return R300_ZS_KEEP;
}
}
@ -804,6 +807,28 @@ static void r300DepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval)
r300UpdateWindow(ctx);
}
/* =============================================================
* Polygon state
*/
static void r300PolygonOffset(GLcontext * ctx, GLfloat factor, GLfloat units)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
GLfloat constant = units * rmesa->state.depth.scale;
/* factor *= 2; */
/* constant *= 2; */
/* fprintf(stderr, "%s f:%f u:%f\n", __FUNCTION__, factor, constant); */
WARN_ONCE("ZBIAS registers locations might not be correct\n");
R200_STATECHANGE(rmesa, zbs);
rmesa->hw.zbs.cmd[R300_ZBS_FACTOR] = r300PackFloat32(factor);
rmesa->hw.zbs.cmd[R300_ZBS_CONSTANT] = r300PackFloat32(constant);
}
/* Routing and texture-related */
void r300_setup_routing(GLcontext *ctx, GLboolean immediate)
@ -1637,8 +1662,10 @@ void r300ResetHwState(r300ContextPtr r300)
r300->hw.unk42A0.cmd[1] = 0x00000000;
#if 0
r300->hw.unk42B4.cmd[1] = 0x00000000;
#endif
r300->hw.unk42C0.cmd[1] = 0x4B7FFFFF;
r300->hw.unk42C0.cmd[2] = 0x00000000;
@ -1836,4 +1863,7 @@ void r300InitStateFuncs(struct dd_function_table* functions)
functions->Viewport = r300Viewport;
functions->DepthRange = r300DepthRange;
functions->PointSize = r300PointSize;
functions->PolygonOffset = r300PolygonOffset;
}