Re-enable fallbacks.

This commit is contained in:
Aapo Tahkola 2005-11-01 16:59:13 +00:00
parent e7d6bb9dc4
commit 6aa6d440d9
4 changed files with 57 additions and 95 deletions

View file

@ -876,6 +876,7 @@ extern GLboolean r300CreateContext(const __GLcontextModes * glVisual,
void translate_vertex_shader(struct r300_vertex_program *vp);
extern void r300InitShaderFuncs(struct dd_function_table *functions);
extern int r300VertexProgUpdateParams(GLcontext *ctx, struct r300_vertex_program *vp, float *dst);
extern GLboolean r300Fallback(GLcontext *ctx);
#ifdef RADEON_VTXFMT_A
extern void radeon_init_vtxfmt_a(r300ContextPtr rmesa);

View file

@ -770,6 +770,48 @@ void dump_dt(struct dt *dt, int count)
}
#endif
#define FALLBACK_IF(expr) \
do { \
if (expr) { \
if (1 || RADEON_DEBUG & DEBUG_FALLBACKS) \
WARN_ONCE("fallback:%s\n", #expr); \
return GL_TRUE; \
} \
} while(0)
GLboolean r300Fallback(GLcontext *ctx)
{
FALLBACK_IF(ctx->RenderMode != GL_RENDER); // We do not do SELECT or FEEDBACK (yet ?)
#if 0 /* These should work now.. */
FALLBACK_IF(ctx->Color.DitherFlag);
FALLBACK_IF(ctx->Color.AlphaEnabled); // GL_ALPHA_TEST
FALLBACK_IF(ctx->Color.BlendEnabled); // GL_BLEND
FALLBACK_IF(ctx->Polygon.OffsetFill); // GL_POLYGON_OFFSET_FILL
#endif
FALLBACK_IF(ctx->Polygon.OffsetPoint); // GL_POLYGON_OFFSET_POINT
FALLBACK_IF(ctx->Polygon.OffsetLine); // GL_POLYGON_OFFSET_LINE
//FALLBACK_IF(ctx->Stencil.Enabled); // GL_STENCIL_TEST
//FALLBACK_IF(ctx->Fog.Enabled); // GL_FOG disable as swtcl doesnt seem to support this
//FALLBACK_IF(ctx->Polygon.SmoothFlag); // GL_POLYGON_SMOOTH disabling to get blender going
FALLBACK_IF(ctx->Polygon.StippleFlag); // GL_POLYGON_STIPPLE
FALLBACK_IF(ctx->Multisample.Enabled); // GL_MULTISAMPLE_ARB
FALLBACK_IF(ctx->Line.StippleFlag);
/* HW doesnt appear to directly support these */
FALLBACK_IF(ctx->Line.SmoothFlag); // GL_LINE_SMOOTH
FALLBACK_IF(ctx->Point.SmoothFlag); // GL_POINT_SMOOTH
/* Rest could be done with vertex fragments */
if (ctx->Extensions.NV_point_sprite || ctx->Extensions.ARB_point_sprite)
FALLBACK_IF(ctx->Point.PointSprite); // GL_POINT_SPRITE_NV
return GL_FALSE;
}
/**
* Called by the pipeline manager to render a batch of primitives.
* We can return true to pass on to the next stage (i.e. software
@ -783,6 +825,8 @@ static GLboolean r300_run_render(GLcontext *ctx,
if (RADEON_DEBUG & DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
if (r300Fallback(ctx))
return GL_TRUE;
#if 0
return r300_run_immediate_render(ctx, stage);
#else
@ -790,97 +834,12 @@ static GLboolean r300_run_render(GLcontext *ctx,
#endif
}
/**
* Called by the pipeline manager once before rendering.
* We check the GL state here to
* a) decide whether we can do the current state in hardware and
* b) update hardware registers
*/
#define FALLBACK_IF(expr) \
do { \
if (expr) { \
if (1 || RADEON_DEBUG & DEBUG_FALLBACKS) \
WARN_ONCE("fallback:%s\n", #expr); \
/*stage->active = GL_FALSE*/; \
return; \
} \
} while(0)
static void r300_check_render(GLcontext *ctx, struct tnl_pipeline_stage *stage)
{
if (RADEON_DEBUG & DEBUG_STATE)
fprintf(stderr, "%s\n", __FUNCTION__);
/* We only support rendering in hardware for now */
if (ctx->RenderMode != GL_RENDER) {
//stage->active = GL_FALSE;
return;
}
/* I'm almost certain I forgot something here */
#if 0 /* These should work now.. */
FALLBACK_IF(ctx->Color.DitherFlag);
FALLBACK_IF(ctx->Color.AlphaEnabled); // GL_ALPHA_TEST
FALLBACK_IF(ctx->Color.BlendEnabled); // GL_BLEND
FALLBACK_IF(ctx->Polygon.OffsetFill); // GL_POLYGON_OFFSET_FILL
#endif
//FALLBACK_IF(ctx->Polygon.OffsetPoint); // GL_POLYGON_OFFSET_POINT
//FALLBACK_IF(ctx->Polygon.OffsetLine); // GL_POLYGON_OFFSET_LINE
//FALLBACK_IF(ctx->Stencil.Enabled); // GL_STENCIL_TEST
//FALLBACK_IF(ctx->Fog.Enabled); // GL_FOG disable as swtcl doesnt seem to support this
//FALLBACK_IF(ctx->Polygon.SmoothFlag); // GL_POLYGON_SMOOTH disabling to get blender going
FALLBACK_IF(ctx->Polygon.StippleFlag); // GL_POLYGON_STIPPLE
FALLBACK_IF(ctx->Multisample.Enabled); // GL_MULTISAMPLE_ARB
FALLBACK_IF(ctx->RenderMode != GL_RENDER); // We do not do SELECT or FEEDBACK (yet ?)
#if 0 /* ut2k3 fails to start if this is on */
/* One step at a time - let one texture pass.. */
for (i = 1; i < ctx->Const.MaxTextureUnits; i++)
FALLBACK_IF(ctx->Texture.Unit[i].Enabled);
#endif
/* Assumed factor reg is found but pattern is still missing */
//FALLBACK_IF(ctx->Line.StippleFlag); // GL_LINE_STIPPLE disabling to get blender going
/* HW doesnt appear to directly support these */
//FALLBACK_IF(ctx->Line.SmoothFlag); // GL_LINE_SMOOTH disabling to get blender going
FALLBACK_IF(ctx->Point.SmoothFlag); // GL_POINT_SMOOTH
/* Rest could be done with vertex fragments */
if (ctx->Extensions.NV_point_sprite || ctx->Extensions.ARB_point_sprite)
FALLBACK_IF(ctx->Point.PointSprite); // GL_POINT_SPRITE_NV
//GL_POINT_DISTANCE_ATTENUATION_ARB
//GL_POINT_FADE_THRESHOLD_SIZE_ARB
/* let r300_run_render do its job */
#if 0
stage->active = GL_FALSE;
#endif
}
static void dtr(struct tnl_pipeline_stage *stage)
{
(void)stage;
}
static GLboolean r300_create_render(GLcontext *ctx,
struct tnl_pipeline_stage *stage)
{
return GL_TRUE;
}
const struct tnl_pipeline_stage _r300_render_stage = {
"r300 hw rasterize",
NULL,
r300_create_render,
dtr, /* destructor */
r300_check_render, /* check */
NULL,
NULL,
NULL,
r300_run_render /* run */
};
@ -918,8 +877,8 @@ static void r300_check_tcl_render(GLcontext *ctx, struct tnl_pipeline_stage *sta
const struct tnl_pipeline_stage _r300_tcl_stage = {
"r300 tcl",
NULL,
r300_create_render,
dtr, /* destructor */
r300_check_tcl_render, /* check */
NULL,
NULL,
NULL,
r300_run_tcl_render /* run */
};

View file

@ -2261,9 +2261,7 @@ static void r300RenderMode( GLcontext *ctx, GLenum mode )
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
(void)rmesa;
WARN_ONCE("TODO: fallback properly when rendering mode is not GL_RENDER\n"
"\tThe way things are now neither selection nor feedback modes work\n")
// FALLBACK( rmesa, R300_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
(void)mode;
}
/**

View file

@ -18,7 +18,11 @@ static int setup_arrays(r300ContextPtr rmesa, GLint start)
GLcontext *ctx;
GLuint enabled = 0;
ctx = rmesa->radeon.glCtx;
ctx = rmesa->radeon.glCtx;
if (r300Fallback(ctx)) {
WARN_ONCE("No fallbacks in vtxftm_a yet.\n");
//return -1;
}
memset(rmesa->state.VB.AttribPtr, 0, VERT_ATTRIB_MAX*sizeof(struct dt));