Here is code to make r300 predict state emission size. Testing is "It
compiles it works style". So code might still have bugs.

I didn't change primitive emission prediction code. I think that someone
with better knowledge of r300 rendering paths should look at it if there
should be some improvement.
From 98af748681b9d67cc2974393588ec9c350575903 Mon Sep 17 00:00:00 2001
From: Pauli Nieminen <[email protected]>
Date: Fri, 14 Aug 2009 14:19:40 +0300
Subject: [PATCH 7/7] r300: Use state emit size prediction for r300.

There is also fixes to state atom check functions to return correct emit sizes.
Too small prediction could be fatal if we overflow the buffer when emiting.
---
 src/mesa/drivers/dri/r300/r300_cmdbuf.c |  267 +++++++++++++++++--------------
 src/mesa/drivers/dri/r300/r300_draw.c   |    2 +-
 src/mesa/drivers/dri/r300/r300_swtcl.c  |    2 +-
 3 files changed, 148 insertions(+), 123 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.c
index bd46f9a..e8616bb 100644
--- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c
+++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c
@@ -73,6 +73,24 @@ static unsigned packet0_count(r300ContextPtr r300, uint32_t *pkt)
 #define vpu_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->vpu.count)
 #define r500fp_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->r500fp.count)
 
+int check_vpu(GLcontext *ctx, struct radeon_state_atom *atom)
+{
+	r300ContextPtr r300 = R300_CONTEXT(ctx);
+	int cnt;
+	int extra = 1;
+	cnt = vpu_count(atom->cmd);
+
+	if (r300->radeon.radeonScreen->kernel_mm) {
+		if (r300->vap_flush_needed)
+			extra = 15;
+		else
+			extra = 5;
+	}
+
+	return cnt ? (cnt * 4) + extra : 0;
+}
+
+
 void emit_vpu(GLcontext *ctx, struct radeon_state_atom * atom)
 {
 	r300ContextPtr r300 = R300_CONTEXT(ctx);
@@ -80,22 +98,15 @@ void emit_vpu(GLcontext *ctx, struct radeon_state_atom * atom)
 	drm_r300_cmd_header_t cmd;
 	uint32_t addr, ndw, i;
 
-	if (!r300->radeon.radeonScreen->kernel_mm) {
-		uint32_t dwords;
-		dwords = (*atom->check) (ctx, atom);
-		BEGIN_BATCH_NO_AUTOSTATE(dwords);
-		OUT_BATCH_TABLE(atom->cmd, dwords);
-		END_BATCH();
-		return;
-	}
-
 	cmd.u = atom->cmd[0];
 	addr = (cmd.vpu.adrhi << 8) | cmd.vpu.adrlo;
-	ndw = cmd.vpu.count * 4;
+	ndw = atom->check(ctx, atom);
 	if (ndw) {
+		BEGIN_BATCH_NO_AUTOSTATE(ndw);
 
+		ndw -= 5;
 		if (r300->vap_flush_needed) {
-			BEGIN_BATCH_NO_AUTOSTATE(15 + ndw);
+			ndw -= 10;
 
 			/* flush processing vertices */
 			OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0);
@@ -104,8 +115,6 @@ void emit_vpu(GLcontext *ctx, struct radeon_state_atom * atom)
 			OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0xffffff);
 			OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG, 0);
 			r300->vap_flush_needed = GL_FALSE;
-		} else {
-			BEGIN_BATCH_NO_AUTOSTATE(5 + ndw);
 		}
 		OUT_BATCH_REGVAL(R300_VAP_PVS_VECTOR_INDX_REG, addr);
 		OUT_BATCH(CP_PACKET0(R300_VAP_PVS_UPLOAD_DATA, ndw-1) | RADEON_ONE_REG_WR);
@@ -123,16 +132,11 @@ void emit_r500fp(GLcontext *ctx, struct radeon_state_atom * atom)
 	BATCH_LOCALS(&r300->radeon);
 	drm_r300_cmd_header_t cmd;
 	uint32_t addr, ndw, i, sz;
-	int type, clamp, stride;
+	int type, clamp;
 
-	if (!r300->radeon.radeonScreen->kernel_mm) {
-		uint32_t dwords;
-		dwords = (*atom->check) (ctx, atom);
-		BEGIN_BATCH_NO_AUTOSTATE(dwords);
-		OUT_BATCH_TABLE(atom->cmd, dwords);
-		END_BATCH();
+	ndw = atom->check(ctx, atom);
+	if (!ndw)
 		return;
-	}
 
 	cmd.u = atom->cmd[0];
 	sz = cmd.r500fp.count;
@@ -143,20 +147,38 @@ void emit_r500fp(GLcontext *ctx, struct radeon_state_atom * atom)
 	addr |= (type << 16);
 	addr |= (clamp << 17);
 
-	stride = type ? 4 : 6;
 
-	ndw = sz * stride;
-	if (ndw) {
 
-		BEGIN_BATCH_NO_AUTOSTATE(3 + ndw);
-		OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_INDEX, 0));
-		OUT_BATCH(addr);
-		OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_DATA, ndw-1) | RADEON_ONE_REG_WR);
-		for (i = 0; i < ndw; i++) {
-			OUT_BATCH(atom->cmd[i+1]);
-		}
-		END_BATCH();
+	BEGIN_BATCH_NO_AUTOSTATE(ndw);
+	OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_INDEX, 0));
+	OUT_BATCH(addr);
+	OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_DATA, ndw-1) | RADEON_ONE_REG_WR);
+	ndw-=3;
+	for (i = 0; i < ndw; i++) {
+		OUT_BATCH(atom->cmd[i+1]);
 	}
+	END_BATCH();
+}
+
+static int check_tex_offsets(GLcontext *ctx, struct radeon_state_atom * atom)
+{
+	r300ContextPtr r300 = R300_CONTEXT(ctx);
+	int numtmus = packet0_count(r300, r300->hw.tex.offset.cmd);
+	int dw = 0, i;
+	if (atom->cmd[0] == CP_PACKET2) {
+		return dw;
+	}
+	for(i = 0; i < numtmus; ++i) {
+		radeonTexObj *t = r300->hw.textures[i];
+		if (!t && !r300->radeon.radeonScreen->kernel_mm) {
+			dw += 0;
+		} else if (t && t->image_override && !t->bo) {
+			if (!r300->radeon.radeonScreen->kernel_mm)
+				dw += 2;
+		} else
+			dw += 4;
+	}
+	return dw;
 }
 
 static void emit_tex_offsets(GLcontext *ctx, struct radeon_state_atom * atom)
@@ -246,6 +268,14 @@ void r300_emit_scissor(GLcontext *ctx)
     OUT_BATCH((x2 << R300_SCISSORS_X_SHIFT)|(y2 << R300_SCISSORS_Y_SHIFT));
     END_BATCH();
 }
+static int check_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
+{
+	r300ContextPtr r300 = R300_CONTEXT(ctx);
+	uint32_t dw = 6 + 3 + 6;
+	if (r300->radeon.radeonScreen->kernel_mm)
+		dw += 2;
+	return dw;
+}
 
 static void emit_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
 {
@@ -255,7 +285,7 @@ static void emit_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
 	uint32_t cbpitch;
 	uint32_t offset = r300->radeon.state.color.draw_offset;
 	uint32_t dw = 6;
-    int i;
+	int i;
 
 	rrb = radeon_get_colorbuffer(&r300->radeon);
 	if (!rrb || !rrb->bo) {
@@ -337,13 +367,23 @@ static void emit_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
     }
 }
 
+static int check_zb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
+{
+	r300ContextPtr r300 = R300_CONTEXT(ctx);
+	uint32_t dw;
+	dw = 6;
+	if (r300->radeon.radeonScreen->kernel_mm)
+		dw += 2;
+	return dw;
+}
+
 static void emit_zb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
 {
 	r300ContextPtr r300 = R300_CONTEXT(ctx);
 	BATCH_LOCALS(&r300->radeon);
 	struct radeon_renderbuffer *rrb;
 	uint32_t zbpitch;
-	uint32_t dw;
+	uint32_t dw = atom->check(ctx, atom);
 
 	rrb = radeon_get_depthbuffer(&r300->radeon);
 	if (!rrb)
@@ -359,9 +399,6 @@ static void emit_zb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
 	    }
 	}
 
-	dw = 6;
-    	if (r300->radeon.radeonScreen->kernel_mm)
-		dw += 2;
 	BEGIN_BATCH_NO_AUTOSTATE(dw);
 	OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1);
 	OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
@@ -373,46 +410,6 @@ static void emit_zb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
 	END_BATCH();
 }
 
-static void emit_gb_misc(GLcontext *ctx, struct radeon_state_atom * atom)
-{
-	r300ContextPtr r300 = R300_CONTEXT(ctx);
-	BATCH_LOCALS(&r300->radeon);
-    if (!r300->radeon.radeonScreen->driScreen->dri2.enabled) {
-        BEGIN_BATCH_NO_AUTOSTATE(4);
-        OUT_BATCH(atom->cmd[0]);
-        OUT_BATCH(atom->cmd[1]);
-        OUT_BATCH(atom->cmd[2]);
-        OUT_BATCH(atom->cmd[3]);
-        END_BATCH();
-    }
-}
-
-static void emit_threshold_misc(GLcontext *ctx, struct radeon_state_atom * atom)
-{
-	r300ContextPtr r300 = R300_CONTEXT(ctx);
-	BATCH_LOCALS(&r300->radeon);
-    if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
-        BEGIN_BATCH_NO_AUTOSTATE(3);
-        OUT_BATCH(atom->cmd[0]);
-        OUT_BATCH(atom->cmd[1]);
-        OUT_BATCH(atom->cmd[2]);
-        END_BATCH();
-    }
-}
-
-static void emit_shade_misc(GLcontext *ctx, struct radeon_state_atom * atom)
-{
-	r300ContextPtr r300 = R300_CONTEXT(ctx);
-	BATCH_LOCALS(&r300->radeon);
-
-    if (!r300->radeon.radeonScreen->driScreen->dri2.enabled) {
-        BEGIN_BATCH_NO_AUTOSTATE(2);
-        OUT_BATCH(atom->cmd[0]);
-        OUT_BATCH(atom->cmd[1]);
-        END_BATCH();
-    }
-}
-
 static void emit_zstencil_format(GLcontext *ctx, struct radeon_state_atom * atom)
 {
 	r300ContextPtr r300 = R300_CONTEXT(ctx);
@@ -430,6 +427,8 @@ static void emit_zstencil_format(GLcontext *ctx, struct radeon_state_atom * atom
 	    format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
 	}
 
+
+	BEGIN_BATCH_NO_AUTOSTATE(atom->cmd_size);
 	OUT_BATCH(atom->cmd[0]);
 	atom->cmd[1] &= ~0xf;
 	atom->cmd[1] |= format;
@@ -437,6 +436,12 @@ static void emit_zstencil_format(GLcontext *ctx, struct radeon_state_atom * atom
 	OUT_BATCH(atom->cmd[2]);
 	OUT_BATCH(atom->cmd[3]);
 	OUT_BATCH(atom->cmd[4]);
+	END_BATCH();
+}
+
+static int check_never(GLcontext *ctx, struct radeon_state_atom *atom)
+{
+   return 0;
 }
 
 static int check_always(GLcontext *ctx, struct radeon_state_atom *atom)
@@ -455,28 +460,29 @@ static int check_variable(GLcontext *ctx, struct radeon_state_atom *atom)
 	return cnt ? cnt + 1 : 0;
 }
 
-int check_vpu(GLcontext *ctx, struct radeon_state_atom *atom)
-{
-	int cnt;
-
-	cnt = vpu_count(atom->cmd);
-	return cnt ? (cnt * 4) + 1 : 0;
-}
-
 int check_r500fp(GLcontext *ctx, struct radeon_state_atom *atom)
 {
 	int cnt;
-
+	r300ContextPtr r300 = R300_CONTEXT(ctx);
+	int extra = 1;
 	cnt = r500fp_count(atom->cmd);
-	return cnt ? (cnt * 6) + 1 : 0;
+	if (r300->radeon.radeonScreen->kernel_mm)
+		extra = 3;
+
+	return cnt ? (cnt * 6) + extra : 0;
 }
 
 int check_r500fp_const(GLcontext *ctx, struct radeon_state_atom *atom)
 {
 	int cnt;
+	r300ContextPtr r300 = R300_CONTEXT(ctx);
+	int extra = 1;
+	cnt = r500fp_count(atom->cmd);
+	if (r300->radeon.radeonScreen->kernel_mm)
+		extra = 3;
 
 	cnt = r500fp_count(atom->cmd);
-	return cnt ? (cnt * 4) + 1 : 0;
+	return cnt ? (cnt * 4) + extra : 0;
 }
 
 #define ALLOC_STATE( ATOM, CHK, SZ, IDX )				\
@@ -566,9 +572,12 @@ void r300InitCmdBuf(r300ContextPtr r300)
 
 	ALLOC_STATE(gb_enable, always, 2, 0);
 	r300->hw.gb_enable.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GB_ENABLE, 1);
-	ALLOC_STATE(gb_misc, always, R300_GB_MISC_CMDSIZE, 0);
+	if (!r300->radeon.radeonScreen->driScreen->dri2.enabled) {
+                ALLOC_STATE(gb_misc, always, R300_GB_MISC_CMDSIZE, 0);
+        } else {
+                ALLOC_STATE(gb_misc, never, R300_GB_MISC_CMDSIZE, 0);
+        }
 	r300->hw.gb_misc.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GB_MSPOS0, 3);
-	r300->hw.gb_misc.emit = emit_gb_misc;
 	ALLOC_STATE(gb_misc2, always, R300_GB_MISC2_CMDSIZE, 0);
     r300->hw.gb_misc2.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, 0x401C, 2);
 	ALLOC_STATE(txe, always, R300_TXE_CMDSIZE, 0);
@@ -585,9 +594,12 @@ void r300InitCmdBuf(r300ContextPtr r300)
 	r300->hw.lcntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_LINE_CNTL, 1);
 	ALLOC_STATE(ga_line_stipple, always, 4, 0);
 	r300->hw.ga_line_stipple.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_LINE_STIPPLE_VALUE, 3);
-	ALLOC_STATE(shade, always, 2, 0);
+        if (!r300->radeon.radeonScreen->driScreen->dri2.enabled) {
+		ALLOC_STATE(shade, always, 2, 0);
+        } else {
+		ALLOC_STATE(shade, never, 2, 0);
+        }
 	r300->hw.shade.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_ENHANCE, 1);
-	r300->hw.shade.emit = emit_shade_misc;
 	ALLOC_STATE(shade2, always, 4, 0);
 	r300->hw.shade2.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, 0x4278, 3);
 	ALLOC_STATE(polygon_mode, always, 4, 0);
@@ -636,11 +648,14 @@ void r300InitCmdBuf(r300ContextPtr r300)
 		ALLOC_STATE(r500fp, r500fp, R500_FPI_CMDSIZE, 0);
 		r300->hw.r500fp.cmd[R300_FPI_CMD_0] =
 			cmdr500fp(r300->radeon.radeonScreen, 0, 0, 0, 0);
-		r300->hw.r500fp.emit = emit_r500fp;
+		if (r300->radeon.radeonScreen->kernel_mm)
+			r300->hw.r500fp.emit = emit_r500fp;
+
 		ALLOC_STATE(r500fp_const, r500fp_const, R500_FPP_CMDSIZE, 0);
 		r300->hw.r500fp_const.cmd[R300_FPI_CMD_0] =
 			cmdr500fp(r300->radeon.radeonScreen, 0, 0, 1, 0);
-		r300->hw.r500fp_const.emit = emit_r500fp;
+		if (r300->radeon.radeonScreen->kernel_mm)
+			r300->hw.r500fp_const.emit = emit_r500fp;
 	} else {
 		ALLOC_STATE(fp, always, R300_FP_CMDSIZE, 0);
 		r300->hw.fp.cmd[R300_FP_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_CONFIG, 3);
@@ -683,15 +698,18 @@ void r300InitCmdBuf(r300ContextPtr r300)
 	}
 	ALLOC_STATE(rop, always, 2, 0);
 	r300->hw.rop.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_ROPCNTL, 1);
-	ALLOC_STATE(cb, always, R300_CB_CMDSIZE, 0);
+	ALLOC_STATE(cb, cb_offset, R300_CB_CMDSIZE, 0);
 	r300->hw.cb.emit = &emit_cb_offset;
 	ALLOC_STATE(rb3d_dither_ctl, always, 10, 0);
 	r300->hw.rb3d_dither_ctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_DITHER_CTL, 9);
 	ALLOC_STATE(rb3d_aaresolve_ctl, always, 2, 0);
 	r300->hw.rb3d_aaresolve_ctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_AARESOLVE_CTL, 1);
-    ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold, always, 3, 0);
-    r300->hw.rb3d_discard_src_pixel_lte_threshold.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD, 2);
-	r300->hw.rb3d_discard_src_pixel_lte_threshold.emit = emit_threshold_misc;
+	if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
+		ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold, always, 3, 0);
+	} else {
+		ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold, never, 3, 0);
+	}
+	r300->hw.rb3d_discard_src_pixel_lte_threshold.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD, 2);
 	ALLOC_STATE(zs, always, R300_ZS_CMDSIZE, 0);
 	r300->hw.zs.cmd[R300_ZS_CMD_0] =
 	    cmdpacket0(r300->radeon.radeonScreen, R300_ZB_CNTL, 3);
@@ -701,7 +719,7 @@ void r300InitCmdBuf(r300ContextPtr r300)
 	    cmdpacket0(r300->radeon.radeonScreen, R300_ZB_FORMAT, 4);
 	r300->hw.zstencil_format.emit = emit_zstencil_format;
 
-	ALLOC_STATE(zb, always, R300_ZB_CMDSIZE, 0);
+	ALLOC_STATE(zb, zb_offset, R300_ZB_CMDSIZE, 0);
 	r300->hw.zb.emit = emit_zb_offset;
 	ALLOC_STATE(zb_depthclearvalue, always, 2, 0);
 	r300->hw.zb_depthclearvalue.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_ZB_DEPTHCLEARVALUE, 1);
@@ -718,43 +736,50 @@ void r300InitCmdBuf(r300ContextPtr r300)
 		ALLOC_STATE(vpi, vpu, R300_VPI_CMDSIZE, 0);
 		r300->hw.vpi.cmd[0] =
 		    cmdvpu(r300->radeon.radeonScreen, R300_PVS_CODE_START, 0);
-		r300->hw.vpi.emit = emit_vpu;
+		if (r300->radeon.radeonScreen->kernel_mm)
+			r300->hw.vpi.emit = emit_vpu;
 
 		if (is_r500) {
 		    ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0);
 		    r300->hw.vpp.cmd[0] =
 			cmdvpu(r300->radeon.radeonScreen, R500_PVS_CONST_START, 0);
-		    r300->hw.vpp.emit = emit_vpu;
+		    if (r300->radeon.radeonScreen->kernel_mm)
+			    r300->hw.vpp.emit = emit_vpu;
 
 		    ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0);
 		    r300->hw.vps.cmd[0] =
 			cmdvpu(r300->radeon.radeonScreen, R500_POINT_VPORT_SCALE_OFFSET, 1);
-		    r300->hw.vps.emit = emit_vpu;
+		    if (r300->radeon.radeonScreen->kernel_mm)
+			    r300->hw.vps.emit = emit_vpu;
 
-			for (i = 0; i < 6; i++) {
-			  ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
-			  r300->hw.vpucp[i].cmd[0] =
-				  cmdvpu(r300->radeon.radeonScreen,
-                           R500_PVS_UCP_START + i, 1);
-				r300->hw.vpucp[i].emit = emit_vpu;
-			}
+		    for (i = 0; i < 6; i++) {
+			    ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
+			    r300->hw.vpucp[i].cmd[0] =
+					cmdvpu(r300->radeon.radeonScreen,
+					R500_PVS_UCP_START + i, 1);
+			    if (r300->radeon.radeonScreen->kernel_mm)
+				    r300->hw.vpucp[i].emit = emit_vpu;
+		    }
 		} else {
-		    ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0);
-		    r300->hw.vpp.cmd[0] =
-			cmdvpu(r300->radeon.radeonScreen, R300_PVS_CONST_START, 0);
-		    r300->hw.vpp.emit = emit_vpu;
-
-		    ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0);
-		    r300->hw.vps.cmd[0] =
-			cmdvpu(r300->radeon.radeonScreen, R300_POINT_VPORT_SCALE_OFFSET, 1);
-		    r300->hw.vps.emit = emit_vpu;
+			ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0);
+			r300->hw.vpp.cmd[0] =
+				cmdvpu(r300->radeon.radeonScreen, R300_PVS_CONST_START, 0);
+			if (r300->radeon.radeonScreen->kernel_mm)
+				r300->hw.vpp.emit = emit_vpu;
+
+			ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0);
+			r300->hw.vps.cmd[0] =
+				cmdvpu(r300->radeon.radeonScreen, R300_POINT_VPORT_SCALE_OFFSET, 1);
+			if (r300->radeon.radeonScreen->kernel_mm)
+				r300->hw.vps.emit = emit_vpu;
 
 			for (i = 0; i < 6; i++) {
 				ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
 				r300->hw.vpucp[i].cmd[0] =
 					cmdvpu(r300->radeon.radeonScreen,
-					       R300_PVS_UCP_START + i, 1);
-				r300->hw.vpucp[i].emit = emit_vpu;
+							R300_PVS_UCP_START + i, 1);
+				if (r300->radeon.radeonScreen->kernel_mm)
+					r300->hw.vpucp[i].emit = emit_vpu;
 			}
 		}
 	}
@@ -778,7 +803,7 @@ void r300InitCmdBuf(r300ContextPtr r300)
 	ALLOC_STATE(tex.pitch, variable, mtu + 1, 0);
 	r300->hw.tex.pitch.cmd[R300_TEX_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_TX_FORMAT2_0, 0);
 
-	ALLOC_STATE(tex.offset, variable, 1, 0);
+	ALLOC_STATE(tex.offset, tex_offsets, 1, 0);
 	r300->hw.tex.offset.cmd[R300_TEX_CMD_0] =
 	    cmdpacket0(r300->radeon.radeonScreen, R300_TX_OFFSET_0, 0);
 	r300->hw.tex.offset.emit = &emit_tex_offsets;
diff --git a/src/mesa/drivers/dri/r300/r300_draw.c b/src/mesa/drivers/dri/r300/r300_draw.c
index aedc6cf..17f73b6 100644
--- a/src/mesa/drivers/dri/r300/r300_draw.c
+++ b/src/mesa/drivers/dri/r300/r300_draw.c
@@ -429,7 +429,7 @@ static GLboolean r300TryDrawPrims(GLcontext *ctx,
 	/* ensure we have the cmd buf space in advance to cover
  	 * the state + DMA AOS pointers */
 	rcommonEnsureCmdBufSpace(&r300->radeon,
-                           r300->radeon.hw.max_state_size + (50*sizeof(int)),
+                           radeonCountEmitSize( &r300->radeon ) + (50*sizeof(int)),
                            __FUNCTION__);
 
 	r300SetVertexFormat(ctx, arrays, max_index + 1, bo, &nr_bo);
diff --git a/src/mesa/drivers/dri/r300/r300_swtcl.c b/src/mesa/drivers/dri/r300/r300_swtcl.c
index a634cb5..93447b9 100644
--- a/src/mesa/drivers/dri/r300/r300_swtcl.c
+++ b/src/mesa/drivers/dri/r300/r300_swtcl.c
@@ -611,7 +611,7 @@ void r300_swtcl_flush(GLcontext *ctx, uint32_t current_offset)
 	r300ContextPtr rmesa = R300_CONTEXT(ctx);
 
 	rcommonEnsureCmdBufSpace(&rmesa->radeon,
-			   rmesa->radeon.hw.max_state_size + (12*sizeof(int)),
+			   radeonCountEmitSize( &rmesa->radeon ) + (12*sizeof(int)),
 			   __FUNCTION__);
 	radeonEmitState(&rmesa->radeon);
     r300_emit_scissor(ctx);
-- 
1.6.3.3

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to