summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/r300/r300_render.c
diff options
context:
space:
mode:
authorAapo Tahkola <aet@rasterburn.org>2005-02-08 01:49:03 +0000
committerAapo Tahkola <aet@rasterburn.org>2005-02-08 01:49:03 +0000
commit27f75a863e0d7e2bcfbfab1ebddb1d83e4ca4199 (patch)
treee346cf2066f0282fc101d91bac55a6d76157b10a /src/mesa/drivers/dri/r300/r300_render.c
parent049290c584f19d5f551b234292e76154e2857179 (diff)
To cut the long and boring story short, polygon offsets should now work. vb mode colorbuffer clears are still mysticly broken by offsets... Maybe we need to merge zbs and unk42B4 together?
Diffstat (limited to 'src/mesa/drivers/dri/r300/r300_render.c')
-rw-r--r--src/mesa/drivers/dri/r300/r300_render.c70
1 files changed, 64 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c
index 1a66215fa2..7623e9e23a 100644
--- a/src/mesa/drivers/dri/r300/r300_render.c
+++ b/src/mesa/drivers/dri/r300/r300_render.c
@@ -58,6 +58,64 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "r300_emit.h"
+#if 0
+/* Turns out we might not need this after all... */
+static void update_zbias(GLcontext * ctx, int prim)
+{
+ r300ContextPtr rmesa = R300_CONTEXT(ctx);
+ int enabled = 0;
+ uint32_t values[4];
+ //return ;
+ switch(prim & PRIM_MODE_MASK) {
+ case GL_POINTS:
+ if(ctx->Polygon.OffsetPoint == GL_TRUE)
+ enabled=1;
+ break;
+ case GL_LINES:
+ case GL_LINE_STRIP:
+ case GL_LINE_LOOP:
+ if(ctx->Polygon.OffsetLine == GL_TRUE)
+ enabled=1;
+ break;
+ case GL_TRIANGLES:
+ case GL_TRIANGLE_STRIP:
+ case GL_TRIANGLE_FAN:
+ case GL_QUADS:
+ case GL_QUAD_STRIP:
+ case GL_POLYGON:
+ if(ctx->Polygon.OffsetFill == GL_TRUE)
+ enabled=1;
+ break;
+ default:
+ fprintf(stderr, "%s:%s Do not know how to handle primitive %02x - help me !\n",
+ __FILE__, __FUNCTION__,
+ prim & PRIM_MODE_MASK);
+
+ }
+
+ if(enabled){
+ values[0]=values[2]=r300PackFloat32(ctx->Polygon.OffsetFactor * 12.0);
+ values[1]=values[3]=r300PackFloat32(ctx->Polygon.OffsetUnits * 4.0);
+ }else{
+ values[0]=values[2]=r300PackFloat32(0.0);
+ values[1]=values[3]=r300PackFloat32(0.0);
+ }
+
+ if(values[0] != rmesa->hw.zbs.cmd[R300_ZBS_T_FACTOR] ||
+ values[1] != rmesa->hw.zbs.cmd[R300_ZBS_T_CONSTANT] ||
+ values[2] != rmesa->hw.zbs.cmd[R300_ZBS_W_FACTOR] ||
+ values[3] != rmesa->hw.zbs.cmd[R300_ZBS_W_CONSTANT]){
+
+ R300_STATECHANGE(rmesa, zbs);
+ rmesa->hw.zbs.cmd[R300_ZBS_T_FACTOR] = values[0];
+ rmesa->hw.zbs.cmd[R300_ZBS_T_CONSTANT] = values[1];
+ rmesa->hw.zbs.cmd[R300_ZBS_W_FACTOR] = values[2];
+ rmesa->hw.zbs.cmd[R300_ZBS_W_CONSTANT] = values[3];
+
+ }
+}
+#endif
+
/**********************************************************************
* Hardware rasterization
*
@@ -206,7 +264,7 @@ static void r300_render_immediate_primitive(r300ContextPtr rmesa,
#endif
if(type<0)return;
-
+
if(!VB->ObjPtr){
WARN_ONCE("FIXME: Don't know how to handle GL_ARB_vertex_buffer_object correctly\n");
return;
@@ -362,6 +420,7 @@ static GLboolean r300_run_immediate_render(GLcontext *ctx,
GLuint prim = VB->Primitive[i].mode;
GLuint start = VB->Primitive[i].start;
GLuint length = VB->Primitive[i].count;
+
r300_render_immediate_primitive(rmesa, ctx, start, start + length, prim);
}
@@ -537,7 +596,6 @@ static GLboolean r300_run_vb_render(GLcontext *ctx,
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
@@ -554,8 +612,8 @@ static GLboolean r300_run_render(GLcontext *ctx,
if (RADEON_DEBUG == DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
-
-
+
+
#if 1
#if 1
@@ -637,7 +695,7 @@ static void r300_check_render(GLcontext *ctx, struct tnl_pipeline_stage *stage)
// I failed to figure out how dither works in hardware,
// let's just ignore it for now
//FALLBACK_IF(ctx->Color.DitherFlag);
-
+
/* I'm almost certain I forgot something here */
#if 0 /* This should work now.. */
FALLBACK_IF(ctx->Color.AlphaEnabled); // GL_ALPHA_TEST
@@ -657,7 +715,7 @@ static void r300_check_render(GLcontext *ctx, struct tnl_pipeline_stage *stage)
FALLBACK_IF(ctx->Polygon.StippleFlag); // GL_POLYGON_STIPPLE
//FALLBACK_IF(ctx->Stencil.Enabled); // GL_STENCIL_TEST
FALLBACK_IF(ctx->Multisample.Enabled); // GL_MULTISAMPLE_ARB
-
+
/* One step at a time - let one texture pass.. */
for (i = 1; i < ctx->Const.MaxTextureUnits; i++)
FALLBACK_IF(ctx->Texture.Unit[i].Enabled);