diff --git a/src/mesa/drivers/dri/r300/Makefile b/src/mesa/drivers/dri/r300/Makefile index 6ca9342..d109f82 100644 --- a/src/mesa/drivers/dri/r300/Makefile +++ b/src/mesa/drivers/dri/r300/Makefile @@ -53,7 +53,7 @@ DRIVER_SOURCES = \ C_SOURCES = $(COMMON_SOURCES) $(DRIVER_SOURCES) -DRIVER_DEFINES = -DCOMPILE_R300 -DR200_MERGED=0 \ +DRIVER_DEFINES = -DCOMPILE_R300 \ -DRADEON_COMMON=1 -DRADEON_COMMON_FOR_R300 SYMLINKS = \ diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c index 3743627..a828110 100644 --- a/src/mesa/drivers/dri/r300/r300_context.c +++ b/src/mesa/drivers/dri/r300/r300_context.c @@ -388,9 +388,7 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual, tcl_mode = driQueryOptioni(&r300->radeon.optionCache, "tcl_mode"); if (driQueryOptionb(&r300->radeon.optionCache, "no_rast")) { fprintf(stderr, "disabling 3D acceleration\n"); -#if R200_MERGED - FALLBACK(&r300->radeon, RADEON_FALLBACK_DISABLE, 1); -#endif + FALLBACK(ctx, RADEON_FALLBACK_DISABLE, 1); } if (tcl_mode == DRI_CONF_TCL_SW || !(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL)) { diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h index c15e9fa..79a9647 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -830,9 +830,9 @@ struct r300_state { }; -#define R300_FALLBACK_NONE 0 -#define R300_FALLBACK_TCL 1 -#define R300_FALLBACK_RAST 2 +#define R300_TCL_FALLBACK_NONE 0 +#define R300_TCL_FALLBACK_TCL 1 +#define R300_TCL_FALLBACK_RAST 2 /* r300_swtcl.c */ @@ -902,6 +902,10 @@ struct r300_context { struct gl_vertex_program *curr_vp; struct r300_vertex_program *selected_vp; + /* Rasterization and vertex state: + */ + GLuint Fallback; + /* Vertex buffers */ struct r300_dma dma; diff --git a/src/mesa/drivers/dri/r300/r300_emit.c b/src/mesa/drivers/dri/r300/r300_emit.c index 80bd338..8ea6428 100644 --- a/src/mesa/drivers/dri/r300/r300_emit.c +++ b/src/mesa/drivers/dri/r300/r300_emit.c @@ -429,7 +429,7 @@ int r300EmitArrays(GLcontext * ctx) } if (nr > R300_MAX_AOS_ARRAYS) { - return R300_FALLBACK_TCL; + return R300_TCL_FALLBACK_TCL; } for (i = 0; i < nr; i++) { @@ -446,7 +446,7 @@ int r300EmitArrays(GLcontext * ctx) if (r300IsGartMemory(rmesa, vb->AttribPtr[tab[i]]->data, 4)) { if (vb->AttribPtr[tab[i]]->stride % 4) { - return R300_FALLBACK_TCL; + return R300_TCL_FALLBACK_TCL; } rmesa->state.aos[i].address = (void *)(vb->AttribPtr[tab[i]]->data); rmesa->state.aos[i].start = 0; @@ -484,7 +484,7 @@ int r300EmitArrays(GLcontext * ctx) rmesa->state.aos[i].aos_offset, rmesa->state.aos[i].aos_stride, vb->AttribPtr[tab[i]]->size); - return R300_FALLBACK_TCL; + return R300_TCL_FALLBACK_TCL; } } @@ -512,7 +512,7 @@ int r300EmitArrays(GLcontext * ctx) rmesa->state.aos_count = nr; - return R300_FALLBACK_NONE; + return R300_TCL_FALLBACK_NONE; } #ifdef USER_BUFFERS diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c index 292f87a..f3a9d03 100644 --- a/src/mesa/drivers/dri/r300/r300_render.c +++ b/src/mesa/drivers/dri/r300/r300_render.c @@ -339,11 +339,11 @@ static GLboolean r300RunRender(GLcontext * ctx, if (1 || RADEON_DEBUG & DEBUG_FALLBACKS) \ WARN_ONCE("Software fallback:%s\n", \ #expr); \ - return R300_FALLBACK_RAST; \ + return R300_TCL_FALLBACK_RAST; \ } \ } while(0) -static int r300Fallback(GLcontext * ctx) +static int r300TclFallback(GLcontext * ctx) { r300ContextPtr r300 = R300_CONTEXT(ctx); /* Do we need to use new-style shaders? @@ -388,7 +388,7 @@ static int r300Fallback(GLcontext * ctx) FALLBACK_IF(ctx->Point.SmoothFlag); } - return R300_FALLBACK_NONE; + return R300_TCL_FALLBACK_NONE; } static GLboolean r300RunNonTCLRender(GLcontext * ctx, @@ -399,11 +399,11 @@ static GLboolean r300RunNonTCLRender(GLcontext * ctx, if (RADEON_DEBUG & DEBUG_PRIMS) fprintf(stderr, "%s\n", __FUNCTION__); - if (r300Fallback(ctx) >= R300_FALLBACK_RAST) - return GL_TRUE; - if (!(rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL)) - return GL_TRUE; + return GL_TRUE; + + if (r300TclFallback(ctx) >= R300_TCL_FALLBACK_RAST) + return GL_TRUE; return r300RunRender(ctx, stage); } @@ -422,7 +422,7 @@ static GLboolean r300RunTCLRender(GLcontext * ctx, if (hw_tcl_on == GL_FALSE) return GL_TRUE; - if (r300Fallback(ctx) >= R300_FALLBACK_TCL) { + if (r300TclFallback(ctx) >= R300_TCL_FALLBACK_TCL) { hw_tcl_on = GL_FALSE; return GL_TRUE; } diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index 6a5c363..671ebfa 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -600,9 +600,7 @@ static void r300SetStencilState(GLcontext * ctx, GLboolean state) ~R300_STENCIL_ENABLE; } } else { -#if R200_MERGED - FALLBACK(&r300->radeon, RADEON_FALLBACK_STENCIL, state); -#endif + FALLBACK(ctx, RADEON_FALLBACK_STENCIL, state); } } @@ -2761,9 +2759,7 @@ void r300InitState(r300ContextPtr r300) static void r300RenderMode(GLcontext * ctx, GLenum mode) { - r300ContextPtr rmesa = R300_CONTEXT(ctx); - (void)rmesa; - (void)mode; + FALLBACK(ctx, RADEON_FALLBACK_RENDER_MODE, (mode != GL_RENDER)); } void r300UpdateClipPlanes( GLcontext *ctx ) diff --git a/src/mesa/drivers/dri/r300/r300_swtcl.c b/src/mesa/drivers/dri/r300/r300_swtcl.c index b6e7ce1..d1c0968 100644 --- a/src/mesa/drivers/dri/r300/r300_swtcl.c +++ b/src/mesa/drivers/dri/r300/r300_swtcl.c @@ -695,3 +695,83 @@ void r300EmitVbufPrim(r300ContextPtr rmesa, GLuint primitive, GLuint vertex_nr) start_packet3(CP_PACKET3(R300_PACKET3_3D_DRAW_VBUF_2, 0), 0); e32(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (num_verts << 16) | type); } + +/**********************************************************************/ +/* Transition to/from hardware rasterization. */ +/**********************************************************************/ + +static const char * const fallbackStrings[] = { + "Texture mode", + "glDrawBuffer(GL_FRONT_AND_BACK)", + "glEnable(GL_STENCIL) without hw stencil buffer", + "glRenderMode(selection or feedback)", + "glBlendEquation", + "glBlendFunc", + "RADEON_NO_RAST", + "Mixing GL_CLAMP_TO_BORDER and GL_CLAMP (or GL_MIRROR_CLAMP_ATI)" +}; + + +static const char *getFallbackString(GLuint bit) +{ + int i = 0; + while (bit > 1) { + i++; + bit >>= 1; + } + return fallbackStrings[i]; +} + +void radeonFallback(GLcontext *ctx, GLuint bit, GLboolean mode) +{ + r300ContextPtr rmesa = R300_CONTEXT(ctx); + TNLcontext *tnl = TNL_CONTEXT(ctx); + GLuint oldfallback = rmesa->Fallback; + + if (mode) { + rmesa->Fallback |= bit; + if (oldfallback == 0) { + R300_FIREVERTICES(rmesa); + //TCL_FALLBACK( ctx, R200_TCL_FALLBACK_RASTER, GL_TRUE ); + _swsetup_Wakeup(ctx); + rmesa->swtcl.RenderIndex = ~0; + if (RADEON_DEBUG & DEBUG_FALLBACKS) { + fprintf(stderr, "R300 begin rasterization fallback: 0x%x %s\n", + bit, getFallbackString(bit)); + } + } + } else { + rmesa->Fallback &= ~bit; + if (oldfallback == bit) { + + _swrast_flush(ctx); + tnl->Driver.Render.Start = r300RenderStart; + tnl->Driver.Render.PrimitiveNotify = r300RenderPrimitive; + tnl->Driver.Render.Finish = r300RenderFinish; + + tnl->Driver.Render.BuildVertices = _tnl_build_vertices; + tnl->Driver.Render.CopyPV = _tnl_copy_pv; + tnl->Driver.Render.Interp = _tnl_interp; + + tnl->Driver.Render.ResetLineStipple = r300ResetLineStipple; +// TCL_FALLBACK( ctx, R300_TCL_FALLBACK_RASTER, GL_FALSE ); +// if (rmesa->TclFallback) { + /* These are already done if rmesa->TclFallback goes to + * zero above. But not if it doesn't (R200_NO_TCL for + * example?) + */ +/* + _tnl_invalidate_vertex_state( ctx, ~0 ); + _tnl_invalidate_vertices( ctx, ~0 ); + RENDERINPUTS_ZERO( rmesa->tnl_index_bitset ); + r200ChooseVertexState( ctx ); + r200ChooseRenderState( ctx ); + } +*/ + if (RADEON_DEBUG & DEBUG_FALLBACKS) { + fprintf(stderr, "R300 end rasterization fallback: 0x%x %s\n", + bit, getFallbackString(bit)); + } + } + } +} diff --git a/src/mesa/drivers/dri/r300/radeon_context.h b/src/mesa/drivers/dri/r300/radeon_context.h index 47cbc22..b66b969 100644 --- a/src/mesa/drivers/dri/r300/radeon_context.h +++ b/src/mesa/drivers/dri/r300/radeon_context.h @@ -64,17 +64,13 @@ typedef struct radeon_context *radeonContextPtr; #define RADEON_FALLBACK_DISABLE 0x0040 #define RADEON_FALLBACK_BORDER_MODE 0x0080 -#if R200_MERGED extern void radeonFallback(GLcontext * ctx, GLuint bit, GLboolean mode); -#define FALLBACK( radeon, bit, mode ) do { \ +#define FALLBACK( ctx, bit, mode ) do { \ if ( 0 ) fprintf( stderr, "FALLBACK in %s: #%d=%d\n", \ __FUNCTION__, bit, mode ); \ - radeonFallback( (radeon)->glCtx, bit, mode ); \ + radeonFallback( ctx, bit, mode ); \ } while (0) -#else -#define FALLBACK( radeon, bit, mode ) fprintf(stderr, "%s:%s\n", __LINE__, __FILE__); -#endif /* TCL fallbacks */ extern void radeonTclFallback(GLcontext * ctx, GLuint bit, GLboolean mode);