- r300-bufmgr.patch: remove start/end offset properly + r500 FP

This commit is contained in:
Dave Airlie 2008-12-22 02:14:32 +00:00
parent 981a0d7018
commit fd5faaeb56
2 changed files with 243 additions and 216 deletions

View File

@ -18,7 +18,7 @@
Summary: Mesa graphics libraries Summary: Mesa graphics libraries
Name: mesa Name: mesa
Version: 7.3 Version: 7.3
Release: 0.3%{?dist} Release: 0.4%{?dist}
License: MIT License: MIT
Group: System Environment/Libraries Group: System Environment/Libraries
URL: http://www.mesa3d.org URL: http://www.mesa3d.org
@ -430,6 +430,9 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/mesa-demos-data %{_libdir}/mesa-demos-data
%changelog %changelog
* Mon Dec 22 2008 Dave Airlie <airlied@redhat.com> 7.3-0.4
- r300-bufmgr.patch: remove start/end offset properly + r500 FP
* Sun Dec 21 2008 Dave Airlie <airlied@redhat.com> 7.3-0.3 * Sun Dec 21 2008 Dave Airlie <airlied@redhat.com> 7.3-0.3
- r300-bufmgr.patch: make radeon/r200 work - r300-bufmgr.patch: make radeon/r200 work

View File

@ -64,12 +64,12 @@ index 6ca9342..cbb09e6 100644
+ radeon_bo_legacy.h \ + radeon_bo_legacy.h \
+ radeon_cs_legacy.h + radeon_cs_legacy.h
+ +
+DRI_LIB_DEPS += -ldrm_radeon +DRI_LIB_DEPS += -ldrm-radeon
##### TARGETS ##### ##### TARGETS #####
diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.c diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.c
index c9e1dfe..ca9d36a 100644 index c9e1dfe..4eac518 100644
--- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c --- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c
+++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c +++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c
@@ -44,6 +44,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -44,6 +44,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@ -129,8 +129,7 @@ index c9e1dfe..ca9d36a 100644
- -
- cmd.buf = (char *)(r300->cmdbuf.cmd_buf + start); - cmd.buf = (char *)(r300->cmdbuf.cmd_buf + start);
- cmd.bufsz = (r300->cmdbuf.count_used - start) * 4; - cmd.bufsz = (r300->cmdbuf.count_used - start) * 4;
+ int ret = 0; -
- if (r300->radeon.state.scissor.enabled) { - if (r300->radeon.state.scissor.enabled) {
- cmd.nbox = r300->radeon.state.scissor.numClipRects; - cmd.nbox = r300->radeon.state.scissor.numClipRects;
- cmd.boxes = - cmd.boxes =
@ -138,19 +137,20 @@ index c9e1dfe..ca9d36a 100644
- } else { - } else {
- cmd.nbox = r300->radeon.numClipRects; - cmd.nbox = r300->radeon.numClipRects;
- cmd.boxes = (drm_clip_rect_t *) r300->radeon.pClipRects; - cmd.boxes = (drm_clip_rect_t *) r300->radeon.pClipRects;
+ if (r300->cmdbuf.flushing) { - }
+ fprintf(stderr, "Recursive call into r300FlushCmdBufLocked!\n");
+ exit(-1);
}
- -
- ret = drmCommandWrite(r300->radeon.dri.fd, - ret = drmCommandWrite(r300->radeon.dri.fd,
- DRM_RADEON_CMDBUF, &cmd, sizeof(cmd)); - DRM_RADEON_CMDBUF, &cmd, sizeof(cmd));
- + int ret = 0;
- if (RADEON_DEBUG & DEBUG_SYNC) { - if (RADEON_DEBUG & DEBUG_SYNC) {
- fprintf(stderr, "Syncing in %s (from %s)\n\n", - fprintf(stderr, "Syncing in %s (from %s)\n\n",
- __FUNCTION__, caller); - __FUNCTION__, caller);
- radeonWaitForIdleLocked(&r300->radeon); - radeonWaitForIdleLocked(&r300->radeon);
- } + if (r300->cmdbuf.flushing) {
+ fprintf(stderr, "Recursive call into r300FlushCmdBufLocked!\n");
+ exit(-1);
}
- -
- r300->dma.nr_released_bufs = 0; - r300->dma.nr_released_bufs = 0;
- r300->cmdbuf.count_used = 0; - r300->cmdbuf.count_used = 0;
@ -289,7 +289,7 @@ index c9e1dfe..ca9d36a 100644
} }
/** /**
@@ -211,39 +209,169 @@ void r300EmitState(r300ContextPtr r300) @@ -211,39 +209,208 @@ void r300EmitState(r300ContextPtr r300)
if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_PRIMS)) if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_PRIMS))
fprintf(stderr, "%s\n", __FUNCTION__); fprintf(stderr, "%s\n", __FUNCTION__);
@ -378,6 +378,45 @@ index c9e1dfe..ca9d36a 100644
+ } + }
+} +}
+ +
+void emit_r500fp(r300ContextPtr r300, struct r300_state_atom * atom)
+{
+ BATCH_LOCALS(r300);
+ drm_r300_cmd_header_t cmd;
+ uint32_t addr, ndw, i, sz;
+ int type, clamp, stride;
+
+ if (!r300->radeon.radeonScreen->kernel_mm) {
+ uint32_t dwords;
+ dwords = (*atom->check) (r300, atom);
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
+ OUT_BATCH_TABLE(atom->cmd, dwords);
+ END_BATCH();
+ return;
+ }
+
+ cmd.u = atom->cmd[0];
+ sz = cmd.r500fp.count;
+ addr = ((cmd.r500fp.adrhi_flags & 1) << 8) | cmd.r500fp.adrlo;
+ type = !!(cmd.r500fp.adrhi_flags & R500FP_CONSTANT_TYPE);
+ clamp = !!(cmd.r500fp.adrhi_flags & R500FP_CONSTANT_CLAMP);
+
+ addr |= (type << 16);
+ addr |= (clamp << 17);
+
+ stride = type ? 4 : 6;
+
+ ndw = sz * stride;
+ if (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]);
+ }
+ }
+}
+
+static void emit_tex_offsets(r300ContextPtr r300, struct r300_state_atom * atom) +static void emit_tex_offsets(r300ContextPtr r300, struct r300_state_atom * atom)
+{ +{
+ BATCH_LOCALS(r300); + BATCH_LOCALS(r300);
@ -396,14 +435,14 @@ index c9e1dfe..ca9d36a 100644
+ } else if (!t) { + } else if (!t) {
+ OUT_BATCH(r300->radeon.radeonScreen->texOffset[0]); + OUT_BATCH(r300->radeon.radeonScreen->texOffset[0]);
+ } else { + } else {
+ if (t->bo) { + if (t->bo) {
+ OUT_BATCH_RELOC(t->tile_bits, t->bo, 0, + OUT_BATCH_RELOC(t->tile_bits, t->bo, 0,
+ RADEON_GEM_DOMAIN_VRAM, 0, 0); + RADEON_GEM_DOMAIN_VRAM, 0, 0);
+ } else { + } else {
+ OUT_BATCH(t->override_offset); + OUT_BATCH(t->override_offset);
+ } + }
+ } + }
+ END_BATCH(); + END_BATCH();
+ } + }
+ } + }
+} +}
@ -416,9 +455,9 @@ index c9e1dfe..ca9d36a 100644
+ GLframebuffer *fb = r300->radeon.dri.drawable->driverPrivate; + GLframebuffer *fb = r300->radeon.dri.drawable->driverPrivate;
+ +
+ rrb = r300->radeon.state.color.rrb; + rrb = r300->radeon.state.color.rrb;
+ if (r300->radeon.radeonScreen->driScreen->dri2.enabled) { + if (r300->radeon.radeonScreen->driScreen->dri2.enabled) {
+ rrb = fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer; + rrb = fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
+ } + }
+ if (!rrb || !rrb->bo) { + if (!rrb || !rrb->bo) {
+ fprintf(stderr, "no rrb\n"); + fprintf(stderr, "no rrb\n");
+ return; + return;
@ -452,13 +491,13 @@ index c9e1dfe..ca9d36a 100644
+ return; + return;
+ +
+ zbpitch = (rrb->pitch / rrb->cpp); + zbpitch = (rrb->pitch / rrb->cpp);
+ if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE) { + if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE) {
+ zbpitch |= R300_DEPTHMACROTILE_ENABLE; + zbpitch |= R300_DEPTHMACROTILE_ENABLE;
+ } + }
+ if (rrb->bo->flags & RADEON_BO_FLAGS_MICRO_TILE){ + if (rrb->bo->flags & RADEON_BO_FLAGS_MICRO_TILE){
+ zbpitch |= R300_DEPTHMICROTILE_TILED; + zbpitch |= R300_DEPTHMICROTILE_TILED;
+ } + }
+ +
+ BEGIN_BATCH(4); + BEGIN_BATCH(4);
+ OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1); + OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1);
+ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0); + OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
@ -469,7 +508,7 @@ index c9e1dfe..ca9d36a 100644
static int check_always(r300ContextPtr r300, struct r300_state_atom *atom) static int check_always(r300ContextPtr r300, struct r300_state_atom *atom)
{ {
return atom->cmd_size; return atom->cmd_size;
@@ -252,13 +380,17 @@ static int check_always(r300ContextPtr r300, struct r300_state_atom *atom) @@ -252,27 +419,33 @@ static int check_always(r300ContextPtr r300, struct r300_state_atom *atom)
static int check_variable(r300ContextPtr r300, struct r300_state_atom *atom) static int check_variable(r300ContextPtr r300, struct r300_state_atom *atom)
{ {
int cnt; int cnt;
@ -489,25 +528,25 @@ index c9e1dfe..ca9d36a 100644
cnt = vpu_count(atom->cmd); cnt = vpu_count(atom->cmd);
return cnt ? (cnt * 4) + 1 : 0; return cnt ? (cnt * 4) + 1 : 0;
} }
@@ -266,6 +398,7 @@ static int check_vpu(r300ContextPtr r300, struct r300_state_atom *atom)
static int check_r500fp(r300ContextPtr r300, struct r300_state_atom *atom) -static int check_r500fp(r300ContextPtr r300, struct r300_state_atom *atom)
+int check_r500fp(r300ContextPtr r300, struct r300_state_atom *atom)
{ {
int cnt; int cnt;
+ +
cnt = r500fp_count(atom->cmd); cnt = r500fp_count(atom->cmd);
return cnt ? (cnt * 6) + 1 : 0; return cnt ? (cnt * 6) + 1 : 0;
} }
@@ -273,7 +406,8 @@ static int check_r500fp(r300ContextPtr r300, struct r300_state_atom *atom)
static int check_r500fp_const(r300ContextPtr r300, struct r300_state_atom *atom) -static int check_r500fp_const(r300ContextPtr r300, struct r300_state_atom *atom)
+int check_r500fp_const(r300ContextPtr r300, struct r300_state_atom *atom)
{ {
int cnt; int cnt;
- cnt = r500fp_count(atom->cmd);
+ +
+ cnt = r500fp_count(atom->cmd); cnt = r500fp_count(atom->cmd);
return cnt ? (cnt * 4) + 1 : 0; return cnt ? (cnt * 4) + 1 : 0;
} }
@@ -318,92 +491,92 @@ void r300InitCmdBuf(r300ContextPtr r300)
@@ -318,92 +452,92 @@ void r300InitCmdBuf(r300ContextPtr r300)
/* Initialize state atoms */ /* Initialize state atoms */
ALLOC_STATE(vpt, always, R300_VPT_CMDSIZE, 0); ALLOC_STATE(vpt, always, R300_VPT_CMDSIZE, 0);
@ -635,7 +674,7 @@ index c9e1dfe..ca9d36a 100644
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
r300->hw.ri.cmd[R300_RI_CMD_0 + i +1] = r300->hw.ri.cmd[R300_RI_CMD_0 + i +1] =
(R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_S_SHIFT) | (R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_S_SHIFT) |
@@ -412,133 +546,144 @@ void r300InitCmdBuf(r300ContextPtr r300) @@ -412,133 +585,146 @@ void r300InitCmdBuf(r300ContextPtr r300)
(R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT); (R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT);
} }
ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0); ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0);
@ -673,11 +712,13 @@ index c9e1dfe..ca9d36a 100644
ALLOC_STATE(r500fp, r500fp, R500_FPI_CMDSIZE, 0); ALLOC_STATE(r500fp, r500fp, R500_FPI_CMDSIZE, 0);
- r300->hw.r500fp.cmd[R300_FPI_CMD_0] = cmdr500fp(0, 0, 0, 0); - r300->hw.r500fp.cmd[R300_FPI_CMD_0] = cmdr500fp(0, 0, 0, 0);
+ r300->hw.r500fp.cmd[R300_FPI_CMD_0] = + r300->hw.r500fp.cmd[R300_FPI_CMD_0] =
+ cmdr500fp(r300->radeon.radeonScreen, 0, 0, 0, 0); + cmdr500fp(r300->radeon.radeonScreen, 0, 0, 0, 0);
+ r300->hw.r500fp.emit = emit_r500fp;
ALLOC_STATE(r500fp_const, r500fp_const, R500_FPP_CMDSIZE, 0); ALLOC_STATE(r500fp_const, r500fp_const, R500_FPP_CMDSIZE, 0);
- r300->hw.r500fp_const.cmd[R300_FPI_CMD_0] = cmdr500fp(0, 0, 1, 0); - r300->hw.r500fp_const.cmd[R300_FPI_CMD_0] = cmdr500fp(0, 0, 1, 0);
+ r300->hw.r500fp_const.cmd[R300_FPI_CMD_0] = + r300->hw.r500fp_const.cmd[R300_FPI_CMD_0] =
+ cmdr500fp(r300->radeon.radeonScreen, 0, 0, 1, 0); + cmdr500fp(r300->radeon.radeonScreen, 0, 0, 1, 0);
+ r300->hw.r500fp_const.emit = emit_r500fp;
} else { } else {
ALLOC_STATE(fp, always, R300_FP_CMDSIZE, 0); ALLOC_STATE(fp, always, R300_FP_CMDSIZE, 0);
- r300->hw.fp.cmd[R300_FP_CMD_0] = cmdpacket0(R300_US_CONFIG, 3); - r300->hw.fp.cmd[R300_FP_CMD_0] = cmdpacket0(R300_US_CONFIG, 3);
@ -783,7 +824,7 @@ index c9e1dfe..ca9d36a 100644
- cmdvpu(R300_PVS_CODE_START, 0); - cmdvpu(R300_PVS_CODE_START, 0);
+ r300->hw.vpi.cmd[0] = + r300->hw.vpi.cmd[0] =
+ cmdvpu(r300->radeon.radeonScreen, R300_PVS_CODE_START, 0); + cmdvpu(r300->radeon.radeonScreen, R300_PVS_CODE_START, 0);
+ r300->hw.vpi.emit = emit_vpu; + r300->hw.vpi.emit = emit_vpu;
if (is_r500) { if (is_r500) {
ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0); ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0);
@ -791,23 +832,24 @@ index c9e1dfe..ca9d36a 100644
- cmdvpu(R500_PVS_CONST_START, 0); - cmdvpu(R500_PVS_CONST_START, 0);
+ r300->hw.vpp.cmd[0] = + r300->hw.vpp.cmd[0] =
+ cmdvpu(r300->radeon.radeonScreen, R500_PVS_CONST_START, 0); + cmdvpu(r300->radeon.radeonScreen, R500_PVS_CONST_START, 0);
+ r300->hw.vpp.emit = emit_vpu; + r300->hw.vpp.emit = emit_vpu;
ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0); ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0);
- r300->hw.vps.cmd[R300_VPS_CMD_0] = - r300->hw.vps.cmd[R300_VPS_CMD_0] =
- cmdvpu(R500_POINT_VPORT_SCALE_OFFSET, 1); - cmdvpu(R500_POINT_VPORT_SCALE_OFFSET, 1);
+ r300->hw.vps.cmd[0] = + r300->hw.vps.cmd[0] =
+ cmdvpu(r300->radeon.radeonScreen, R500_POINT_VPORT_SCALE_OFFSET, 1); + cmdvpu(r300->radeon.radeonScreen, R500_POINT_VPORT_SCALE_OFFSET, 1);
+ r300->hw.vps.emit = emit_vpu; + r300->hw.vps.emit = emit_vpu;
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0); - ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
- r300->hw.vpucp[i].cmd[R300_VPUCP_CMD_0] = - r300->hw.vpucp[i].cmd[R300_VPUCP_CMD_0] =
- cmdvpu(R500_PVS_UCP_START + i, 1); - cmdvpu(R500_PVS_UCP_START + i, 1);
+ r300->hw.vpucp[i].cmd[0] = + ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
+ cmdvpu(r300->radeon.radeonScreen, + r300->hw.vpucp[i].cmd[0] =
+ cmdvpu(r300->radeon.radeonScreen,
+ R500_PVS_UCP_START + i, 1); + R500_PVS_UCP_START + i, 1);
+ r300->hw.vpucp[i].emit = emit_vpu; + r300->hw.vpucp[i].emit = emit_vpu;
} }
} else { } else {
ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0); ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0);
@ -815,14 +857,14 @@ index c9e1dfe..ca9d36a 100644
- cmdvpu(R300_PVS_CONST_START, 0); - cmdvpu(R300_PVS_CONST_START, 0);
+ r300->hw.vpp.cmd[0] = + r300->hw.vpp.cmd[0] =
+ cmdvpu(r300->radeon.radeonScreen, R300_PVS_CONST_START, 0); + cmdvpu(r300->radeon.radeonScreen, R300_PVS_CONST_START, 0);
+ r300->hw.vpp.emit = emit_vpu; + r300->hw.vpp.emit = emit_vpu;
ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0); ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0);
- r300->hw.vps.cmd[R300_VPS_CMD_0] = - r300->hw.vps.cmd[R300_VPS_CMD_0] =
- cmdvpu(R300_POINT_VPORT_SCALE_OFFSET, 1); - cmdvpu(R300_POINT_VPORT_SCALE_OFFSET, 1);
+ r300->hw.vps.cmd[0] = + r300->hw.vps.cmd[0] =
+ cmdvpu(r300->radeon.radeonScreen, R300_POINT_VPORT_SCALE_OFFSET, 1); + cmdvpu(r300->radeon.radeonScreen, R300_POINT_VPORT_SCALE_OFFSET, 1);
+ r300->hw.vps.emit = emit_vpu; + r300->hw.vps.emit = emit_vpu;
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0); ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
@ -830,12 +872,12 @@ index c9e1dfe..ca9d36a 100644
- cmdvpu(R300_PVS_UCP_START + i, 1); - cmdvpu(R300_PVS_UCP_START + i, 1);
+ r300->hw.vpucp[i].cmd[0] = + r300->hw.vpucp[i].cmd[0] =
+ cmdvpu(r300->radeon.radeonScreen, + cmdvpu(r300->radeon.radeonScreen,
+ R300_PVS_UCP_START + i, 1); + R300_PVS_UCP_START + i, 1);
+ r300->hw.vpucp[i].emit = emit_vpu; + r300->hw.vpucp[i].emit = emit_vpu;
} }
} }
} }
@@ -546,33 +691,34 @@ void r300InitCmdBuf(r300ContextPtr r300) @@ -546,33 +732,34 @@ void r300InitCmdBuf(r300ContextPtr r300)
/* Textures */ /* Textures */
ALLOC_STATE(tex.filter, variable, mtu + 1, 0); ALLOC_STATE(tex.filter, variable, mtu + 1, 0);
r300->hw.tex.filter.cmd[R300_TEX_CMD_0] = r300->hw.tex.filter.cmd[R300_TEX_CMD_0] =
@ -879,7 +921,7 @@ index c9e1dfe..ca9d36a 100644
r300->hw.is_dirty = GL_TRUE; r300->hw.is_dirty = GL_TRUE;
r300->hw.all_dirty = GL_TRUE; r300->hw.all_dirty = GL_TRUE;
@@ -587,6 +733,7 @@ void r300InitCmdBuf(r300ContextPtr r300) @@ -587,6 +774,7 @@ void r300InitCmdBuf(r300ContextPtr r300)
if (size > 64 * 256) if (size > 64 * 256)
size = 64 * 256; size = 64 * 256;
@ -887,7 +929,7 @@ index c9e1dfe..ca9d36a 100644
if (RADEON_DEBUG & (DEBUG_IOCTL | DEBUG_DMA)) { if (RADEON_DEBUG & (DEBUG_IOCTL | DEBUG_DMA)) {
fprintf(stderr, "sizeof(drm_r300_cmd_header_t)=%zd\n", fprintf(stderr, "sizeof(drm_r300_cmd_header_t)=%zd\n",
sizeof(drm_r300_cmd_header_t)); sizeof(drm_r300_cmd_header_t));
@@ -597,10 +744,19 @@ void r300InitCmdBuf(r300ContextPtr r300) @@ -597,10 +785,19 @@ void r300InitCmdBuf(r300ContextPtr r300)
size * 4, r300->hw.max_state_size * 4); size * 4, r300->hw.max_state_size * 4);
} }
@ -910,7 +952,7 @@ index c9e1dfe..ca9d36a 100644
} }
/** /**
@@ -610,66 +766,13 @@ void r300DestroyCmdBuf(r300ContextPtr r300) @@ -610,66 +807,13 @@ void r300DestroyCmdBuf(r300ContextPtr r300)
{ {
struct r300_state_atom *atom; struct r300_state_atom *atom;
@ -984,7 +1026,7 @@ index c9e1dfe..ca9d36a 100644
+ } + }
} }
diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.h b/src/mesa/drivers/dri/r300/r300_cmdbuf.h diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.h b/src/mesa/drivers/dri/r300/r300_cmdbuf.h
index a8eaa58..1a249c8 100644 index a8eaa58..bb7e0bf 100644
--- a/src/mesa/drivers/dri/r300/r300_cmdbuf.h --- a/src/mesa/drivers/dri/r300/r300_cmdbuf.h
+++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.h +++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.h
@@ -37,6 +37,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -37,6 +37,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@ -995,7 +1037,7 @@ index a8eaa58..1a249c8 100644
extern int r300FlushCmdBufLocked(r300ContextPtr r300, const char *caller); extern int r300FlushCmdBufLocked(r300ContextPtr r300, const char *caller);
extern int r300FlushCmdBuf(r300ContextPtr r300, const char *caller); extern int r300FlushCmdBuf(r300ContextPtr r300, const char *caller);
@@ -45,72 +46,90 @@ extern void r300EmitState(r300ContextPtr r300); @@ -45,72 +46,92 @@ extern void r300EmitState(r300ContextPtr r300);
extern void r300InitCmdBuf(r300ContextPtr r300); extern void r300InitCmdBuf(r300ContextPtr r300);
extern void r300DestroyCmdBuf(r300ContextPtr r300); extern void r300DestroyCmdBuf(r300ContextPtr r300);
@ -1015,75 +1057,22 @@ index a8eaa58..1a249c8 100644
- * \param dwords The number of dwords we need to be free on the command buffer - * \param dwords The number of dwords we need to be free on the command buffer
+ * Every function writing to the command buffer needs to declare this + * Every function writing to the command buffer needs to declare this
+ * to get the necessary local variables. + * to get the necessary local variables.
+ */
+#define BATCH_LOCALS(r300) \
+ const r300ContextPtr b_l_r300 = r300
+
+/**
+ * Prepare writing n dwords to the command buffer,
+ * including producing any necessary state emits on buffer wraparound.
+ */
+#define BEGIN_BATCH(n) r300BeginBatch(b_l_r300, n, 1, __FILE__, __FUNCTION__, __LINE__)
+
+/**
+ * Same as BEGIN_BATCH, but do not cause automatic state emits.
+ */
+#define BEGIN_BATCH_NO_AUTOSTATE(n) r300BeginBatch(b_l_r300, n, 0, __FILE__, __FUNCTION__, __LINE__)
+
+/**
+ * Write one dword to the command buffer.
+ */
+#define OUT_BATCH(data) \
+ do { \
+ radeon_cs_write_dword(b_l_r300->cmdbuf.cs, data);\
+ } while(0)
+
+/**
+ * Write a relocated dword to the command buffer.
+ */
+#define OUT_BATCH_RELOC(data, bo, offset, rd, wd, flags) \
+ do { \
+ if (offset) {\
+ fprintf(stderr, "(%s:%s:%d) offset : %d\n",\
+ __FILE__, __FUNCTION__, __LINE__, offset);\
+ }\
+ radeon_cs_write_dword(b_l_r300->cmdbuf.cs, offset);\
+ radeon_cs_write_reloc(b_l_r300->cmdbuf.cs, \
+ bo, \
+ offset, \
+ (bo)->size, \
+ rd, \
+ wd, \
+ flags);\
+ } while(0)
+
+/**
+ * Write n dwords from ptr to the command buffer.
*/ */
-static INLINE void r300EnsureCmdBufSpace(r300ContextPtr r300, -static INLINE void r300EnsureCmdBufSpace(r300ContextPtr r300,
- int dwords, const char *caller) - int dwords, const char *caller)
-{ -{
- assert(dwords < r300->cmdbuf.size); - assert(dwords < r300->cmdbuf.size);
+#define OUT_BATCH_TABLE(ptr,n) \ +#define BATCH_LOCALS(r300) \
+ do { \ + const r300ContextPtr b_l_r300 = r300
+ int _i; \
+ for (_i=0; _i < n; _i++) {\
+ radeon_cs_write_dword(b_l_r300->cmdbuf.cs, ptr[_i]);\
+ }\
+ } while(0)
- if (r300->cmdbuf.count_used + dwords > r300->cmdbuf.size) - if (r300->cmdbuf.count_used + dwords > r300->cmdbuf.size)
- r300FlushCmdBuf(r300, caller); - r300FlushCmdBuf(r300, caller);
-} -}
+/** +/**
+ * Finish writing dwords to the command buffer. + * Prepare writing n dwords to the command buffer,
+ * The number of (direct or indirect) OUT_BATCH calls between the previous + * including producing any necessary state emits on buffer wraparound.
+ * BEGIN_BATCH and END_BATCH must match the number specified at BEGIN_BATCH time.
+ */ + */
+#define END_BATCH() \ +#define BEGIN_BATCH(n) r300BeginBatch(b_l_r300, n, 1, __FILE__, __FUNCTION__, __LINE__)
+ do { \
+ radeon_cs_end(b_l_r300->cmdbuf.cs, __FILE__, __FUNCTION__, __LINE__);\
+ } while(0)
/** /**
- * Allocate the given number of dwords in the command buffer and return - * Allocate the given number of dwords in the command buffer and return
@ -1091,8 +1080,7 @@ index a8eaa58..1a249c8 100644
- * When necessary, these functions cause a flush. r300AllocCmdBuf() also - * When necessary, these functions cause a flush. r300AllocCmdBuf() also
- * causes state reemission after a flush. This is necessary to ensure - * causes state reemission after a flush. This is necessary to ensure
- * correct hardware state after an unlock. - * correct hardware state after an unlock.
+ * After the last END_BATCH() of rendering, this indicates that flushing + * Same as BEGIN_BATCH, but do not cause automatic state emits.
+ * the command buffer now is okay.
*/ */
-static INLINE uint32_t *r300RawAllocCmdBuf(r300ContextPtr r300, -static INLINE uint32_t *r300RawAllocCmdBuf(r300ContextPtr r300,
- int dwords, const char *caller) - int dwords, const char *caller)
@ -1138,12 +1126,68 @@ index a8eaa58..1a249c8 100644
-extern void r300EmitLOAD_VBPNTR(r300ContextPtr rmesa, int start); -extern void r300EmitLOAD_VBPNTR(r300ContextPtr rmesa, int start);
-extern void r300EmitVertexShader(r300ContextPtr rmesa); -extern void r300EmitVertexShader(r300ContextPtr rmesa);
-extern void r300EmitPixelShader(r300ContextPtr rmesa); -extern void r300EmitPixelShader(r300ContextPtr rmesa);
+#define BEGIN_BATCH_NO_AUTOSTATE(n) r300BeginBatch(b_l_r300, n, 0, __FILE__, __FUNCTION__, __LINE__)
+
+/**
+ * Write one dword to the command buffer.
+ */
+#define OUT_BATCH(data) \
+ do { \
+ radeon_cs_write_dword(b_l_r300->cmdbuf.cs, data);\
+ } while(0)
+
+/**
+ * Write a relocated dword to the command buffer.
+ */
+#define OUT_BATCH_RELOC(data, bo, offset, rd, wd, flags) \
+ do { \
+ if (offset) {\
+ fprintf(stderr, "(%s:%s:%d) offset : %d\n",\
+ __FILE__, __FUNCTION__, __LINE__, offset);\
+ }\
+ radeon_cs_write_dword(b_l_r300->cmdbuf.cs, offset);\
+ radeon_cs_write_reloc(b_l_r300->cmdbuf.cs, \
+ bo, \
+ rd, \
+ wd, \
+ flags);\
+ } while(0)
+
+/**
+ * Write n dwords from ptr to the command buffer.
+ */
+#define OUT_BATCH_TABLE(ptr,n) \
+ do { \
+ int _i; \
+ for (_i=0; _i < n; _i++) {\
+ radeon_cs_write_dword(b_l_r300->cmdbuf.cs, ptr[_i]);\
+ }\
+ } while(0)
+
+/**
+ * Finish writing dwords to the command buffer.
+ * The number of (direct or indirect) OUT_BATCH calls between the previous
+ * BEGIN_BATCH and END_BATCH must match the number specified at BEGIN_BATCH time.
+ */
+#define END_BATCH() \
+ do { \
+ radeon_cs_end(b_l_r300->cmdbuf.cs, __FILE__, __FUNCTION__, __LINE__);\
+ } while(0)
+
+/**
+ * After the last END_BATCH() of rendering, this indicates that flushing
+ * the command buffer now is okay.
+ */
+#define COMMIT_BATCH() \ +#define COMMIT_BATCH() \
+ do { \ + do { \
+ } while(0) + } while(0)
+ +
+void emit_vpu(r300ContextPtr r300, struct r300_state_atom * atom); +void emit_vpu(r300ContextPtr r300, struct r300_state_atom * atom);
+int check_vpu(r300ContextPtr r300, struct r300_state_atom *atom); +int check_vpu(r300ContextPtr r300, struct r300_state_atom *atom);
+
+void emit_r500fp(r300ContextPtr r300, struct r300_state_atom * atom);
+int check_r500fp(r300ContextPtr r300, struct r300_state_atom *atom);
+int check_r500fp_const(r300ContextPtr r300, struct r300_state_atom *atom);
#endif /* __R300_CMDBUF_H__ */ #endif /* __R300_CMDBUF_H__ */
diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c
@ -2256,7 +2300,7 @@ index 89d7383..db43cc3 100644
extern int r300PrimitiveType(r300ContextPtr rmesa, int prim); extern int r300PrimitiveType(r300ContextPtr rmesa, int prim);
extern int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim); extern int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim);
diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.c b/src/mesa/drivers/dri/r300/r300_ioctl.c diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.c b/src/mesa/drivers/dri/r300/r300_ioctl.c
index ee85e22..a86841c 100644 index ee85e22..6d7b191 100644
--- a/src/mesa/drivers/dri/r300/r300_ioctl.c --- a/src/mesa/drivers/dri/r300/r300_ioctl.c
+++ b/src/mesa/drivers/dri/r300/r300_ioctl.c +++ b/src/mesa/drivers/dri/r300/r300_ioctl.c
@@ -46,6 +46,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -46,6 +46,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@ -2528,7 +2572,7 @@ index ee85e22..a86841c 100644
(R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_SHIFT) | (R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_SHIFT) |
(R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_SHIFT) | (R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_SHIFT) |
(R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_SHIFT) | (R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_SHIFT) |
@@ -226,238 +259,267 @@ static void r300EmitClearState(GLcontext * ctx) @@ -226,238 +259,276 @@ static void r300EmitClearState(GLcontext * ctx)
<< R300_SWIZZLE1_SHIFT))); << R300_SWIZZLE1_SHIFT)));
/* R300_VAP_INPUT_CNTL_0, R300_VAP_INPUT_CNTL_1 */ /* R300_VAP_INPUT_CNTL_0, R300_VAP_INPUT_CNTL_1 */
@ -2757,7 +2801,9 @@ index ee85e22..a86841c 100644
- e32(R500_US_CODE_START_ADDR(0) | R500_US_CODE_END_ADDR(1)); - e32(R500_US_CODE_START_ADDR(0) | R500_US_CODE_END_ADDR(1));
- e32(R500_US_CODE_RANGE_ADDR(0) | R500_US_CODE_RANGE_SIZE(1)); - e32(R500_US_CODE_RANGE_ADDR(0) | R500_US_CODE_RANGE_SIZE(1));
- e32(R500_US_CODE_OFFSET_ADDR(0)); - e32(R500_US_CODE_OFFSET_ADDR(0));
- + struct r300_state_atom r500fp;
+ uint32_t _cmd[10];
+ R300_STATECHANGE(r300, fp); + R300_STATECHANGE(r300, fp);
R300_STATECHANGE(r300, r500fp); R300_STATECHANGE(r300, r500fp);
- r500fp_start_fragment(0, 6); - r500fp_start_fragment(0, 6);
@ -2811,44 +2857,49 @@ index ee85e22..a86841c 100644
+ OUT_BATCH(R500_US_CODE_START_ADDR(0) | R500_US_CODE_END_ADDR(1)); + OUT_BATCH(R500_US_CODE_START_ADDR(0) | R500_US_CODE_END_ADDR(1));
+ OUT_BATCH(R500_US_CODE_RANGE_ADDR(0) | R500_US_CODE_RANGE_SIZE(1)); + OUT_BATCH(R500_US_CODE_RANGE_ADDR(0) | R500_US_CODE_RANGE_SIZE(1));
+ OUT_BATCH(R500_US_CODE_OFFSET_ADDR(0)); + OUT_BATCH(R500_US_CODE_OFFSET_ADDR(0));
+
+ OUT_BATCH(cmdr500fp(r300->radeon.radeonScreen, 0, 1, 0, 0));
+ OUT_BATCH(R500_INST_TYPE_OUT |
+ R500_INST_TEX_SEM_WAIT |
+ R500_INST_LAST |
+ R500_INST_RGB_OMASK_R |
+ R500_INST_RGB_OMASK_G |
+ R500_INST_RGB_OMASK_B |
+ R500_INST_ALPHA_OMASK |
+ R500_INST_RGB_CLAMP |
+ R500_INST_ALPHA_CLAMP);
+ OUT_BATCH(R500_RGB_ADDR0(0) |
+ R500_RGB_ADDR1(0) |
+ R500_RGB_ADDR1_CONST |
+ R500_RGB_ADDR2(0) |
+ R500_RGB_ADDR2_CONST);
+ OUT_BATCH(R500_ALPHA_ADDR0(0) |
+ R500_ALPHA_ADDR1(0) |
+ R500_ALPHA_ADDR1_CONST |
+ R500_ALPHA_ADDR2(0) |
+ R500_ALPHA_ADDR2_CONST);
+ OUT_BATCH(R500_ALU_RGB_SEL_A_SRC0 |
+ R500_ALU_RGB_R_SWIZ_A_R |
+ R500_ALU_RGB_G_SWIZ_A_G |
+ R500_ALU_RGB_B_SWIZ_A_B |
+ R500_ALU_RGB_SEL_B_SRC0 |
+ R500_ALU_RGB_R_SWIZ_B_R |
+ R500_ALU_RGB_B_SWIZ_B_G |
+ R500_ALU_RGB_G_SWIZ_B_B);
+ OUT_BATCH(R500_ALPHA_OP_CMP |
+ R500_ALPHA_SWIZ_A_A |
+ R500_ALPHA_SWIZ_B_A);
+ OUT_BATCH(R500_ALU_RGBA_OP_CMP |
+ R500_ALU_RGBA_R_SWIZ_0 |
+ R500_ALU_RGBA_G_SWIZ_0 |
+ R500_ALU_RGBA_B_SWIZ_0 |
+ R500_ALU_RGBA_A_SWIZ_0);
+ END_BATCH(); + END_BATCH();
+
+ r500fp.check = check_r500fp;
+ r500fp.cmd = _cmd;
+ r500fp.cmd[0] = cmdr500fp(r300->radeon.radeonScreen, 0, 1, 0, 0);
+ r500fp.cmd[1] = R500_INST_TYPE_OUT |
+ R500_INST_TEX_SEM_WAIT |
+ R500_INST_LAST |
+ R500_INST_RGB_OMASK_R |
+ R500_INST_RGB_OMASK_G |
+ R500_INST_RGB_OMASK_B |
+ R500_INST_ALPHA_OMASK |
+ R500_INST_RGB_CLAMP |
+ R500_INST_ALPHA_CLAMP;
+ r500fp.cmd[2] = R500_RGB_ADDR0(0) |
+ R500_RGB_ADDR1(0) |
+ R500_RGB_ADDR1_CONST |
+ R500_RGB_ADDR2(0) |
+ R500_RGB_ADDR2_CONST;
+ r500fp.cmd[3] = R500_ALPHA_ADDR0(0) |
+ R500_ALPHA_ADDR1(0) |
+ R500_ALPHA_ADDR1_CONST |
+ R500_ALPHA_ADDR2(0) |
+ R500_ALPHA_ADDR2_CONST;
+ r500fp.cmd[4] = R500_ALU_RGB_SEL_A_SRC0 |
+ R500_ALU_RGB_R_SWIZ_A_R |
+ R500_ALU_RGB_G_SWIZ_A_G |
+ R500_ALU_RGB_B_SWIZ_A_B |
+ R500_ALU_RGB_SEL_B_SRC0 |
+ R500_ALU_RGB_R_SWIZ_B_R |
+ R500_ALU_RGB_B_SWIZ_B_G |
+ R500_ALU_RGB_G_SWIZ_B_B;
+ r500fp.cmd[5] = R500_ALPHA_OP_CMP |
+ R500_ALPHA_SWIZ_A_A |
+ R500_ALPHA_SWIZ_B_A;
+ r500fp.cmd[6] = R500_ALU_RGBA_OP_CMP |
+ R500_ALU_RGBA_R_SWIZ_0 |
+ R500_ALU_RGBA_G_SWIZ_0 |
+ R500_ALU_RGBA_B_SWIZ_0 |
+ R500_ALU_RGBA_A_SWIZ_0;
+
+ r500fp.cmd[7] = 0;
+ emit_r500fp(r300, &r500fp);
} }
- reg_start(R300_VAP_PVS_STATE_FLUSH_REG, 0); - reg_start(R300_VAP_PVS_STATE_FLUSH_REG, 0);
@ -2893,12 +2944,12 @@ index ee85e22..a86841c 100644
else else
- vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT); - vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT);
+ vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT); + vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT);
+
+ R300_STATECHANGE(r300, vap_cntl);
- R300_STATECHANGE(rmesa, vap_cntl); - R300_STATECHANGE(rmesa, vap_cntl);
- reg_start(R300_VAP_CNTL, 0); - reg_start(R300_VAP_CNTL, 0);
- e32(vap_cntl); - e32(vap_cntl);
+ R300_STATECHANGE(r300, vap_cntl);
+
+ BEGIN_BATCH(2); + BEGIN_BATCH(2);
+ OUT_BATCH_REGVAL(R300_VAP_CNTL, vap_cntl); + OUT_BATCH_REGVAL(R300_VAP_CNTL, vap_cntl);
+ END_BATCH(); + END_BATCH();
@ -2918,12 +2969,12 @@ index ee85e22..a86841c 100644
- -
R300_STATECHANGE(r300, vpi); R300_STATECHANGE(r300, vpi);
- vsf_start_fragment(0x0, 8); - vsf_start_fragment(0x0, 8);
-
- e32(PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE, 0, 0xf, PVS_DST_REG_OUT)); - e32(PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE, 0, 0xf, PVS_DST_REG_OUT));
- e32(PVS_SRC_OPERAND(0, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT, VSF_FLAG_NONE)); - e32(PVS_SRC_OPERAND(0, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT, VSF_FLAG_NONE));
- e32(PVS_SRC_OPERAND(0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_REG_INPUT, VSF_FLAG_NONE)); - e32(PVS_SRC_OPERAND(0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_REG_INPUT, VSF_FLAG_NONE));
- e32(0x0); - e32(0x0);
-
- e32(PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE, 1, 0xf, PVS_DST_REG_OUT)); - e32(PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE, 1, 0xf, PVS_DST_REG_OUT));
- e32(PVS_SRC_OPERAND(1, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT, VSF_FLAG_NONE)); - e32(PVS_SRC_OPERAND(1, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT, VSF_FLAG_NONE));
- e32(PVS_SRC_OPERAND(1, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_REG_INPUT, VSF_FLAG_NONE)); - e32(PVS_SRC_OPERAND(1, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_REG_INPUT, VSF_FLAG_NONE));
@ -2938,9 +2989,9 @@ index ee85e22..a86841c 100644
+ OUT_BATCH(1 << R300_PVS_LAST_VTX_SRC_INST_SHIFT); + OUT_BATCH(1 << R300_PVS_LAST_VTX_SRC_INST_SHIFT);
+ END_BATCH(); + END_BATCH();
+ +
+ vpu.check = check_vpu; + vpu.check = check_vpu;
+ vpu.cmd = _cmd; + vpu.cmd = _cmd;
+ vpu.cmd[0] = cmdvpu(r300->radeon.radeonScreen, 0, 2); + vpu.cmd[0] = cmdvpu(r300->radeon.radeonScreen, 0, 2);
+ +
+ vpu.cmd[1] = PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE, + vpu.cmd[1] = PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE,
+ 0, 0xf, PVS_DST_REG_OUT); + 0, 0xf, PVS_DST_REG_OUT);
@ -2959,6 +3010,7 @@ index ee85e22..a86841c 100644
+ vpu.cmd[6] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_X, + vpu.cmd[6] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_X,
+ PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z, + PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z,
+ PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT, + PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT,
+
+ VSF_FLAG_NONE); + VSF_FLAG_NONE);
+ vpu.cmd[7] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_FORCE_0, + vpu.cmd[7] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_FORCE_0,
+ PVS_SRC_SELECT_FORCE_0, + PVS_SRC_SELECT_FORCE_0,
@ -2966,11 +3018,11 @@ index ee85e22..a86841c 100644
+ PVS_SRC_SELECT_FORCE_0, + PVS_SRC_SELECT_FORCE_0,
+ PVS_SRC_REG_INPUT, VSF_FLAG_NONE); + PVS_SRC_REG_INPUT, VSF_FLAG_NONE);
+ vpu.cmd[8] = 0x0; + vpu.cmd[8] = 0x0;
+ emit_vpu(r300, &vpu); + emit_vpu(r300, &vpu);
} }
} }
@@ -468,9 +530,11 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask) @@ -468,9 +539,11 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
{ {
r300ContextPtr r300 = R300_CONTEXT(ctx); r300ContextPtr r300 = R300_CONTEXT(ctx);
__DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable; __DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable;
@ -2983,7 +3035,7 @@ index ee85e22..a86841c 100644
if (RADEON_DEBUG & DEBUG_IOCTL) if (RADEON_DEBUG & DEBUG_IOCTL)
fprintf(stderr, "r300Clear\n"); fprintf(stderr, "r300Clear\n");
@@ -482,6 +546,12 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask) @@ -482,6 +555,12 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
return; return;
} }
@ -2996,7 +3048,7 @@ index ee85e22..a86841c 100644
if (mask & BUFFER_BIT_FRONT_LEFT) { if (mask & BUFFER_BIT_FRONT_LEFT) {
flags |= BUFFER_BIT_FRONT_LEFT; flags |= BUFFER_BIT_FRONT_LEFT;
mask &= ~BUFFER_BIT_FRONT_LEFT; mask &= ~BUFFER_BIT_FRONT_LEFT;
@@ -509,26 +579,28 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask) @@ -509,26 +588,28 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
_swrast_Clear(ctx, mask); _swrast_Clear(ctx, mask);
} }
@ -3030,19 +3082,15 @@ index ee85e22..a86841c 100644
} }
void r300Flush(GLcontext * ctx) void r300Flush(GLcontext * ctx)
@@ -538,302 +610,13 @@ void r300Flush(GLcontext * ctx) @@ -538,302 +619,13 @@ void r300Flush(GLcontext * ctx)
if (RADEON_DEBUG & DEBUG_IOCTL) if (RADEON_DEBUG & DEBUG_IOCTL)
fprintf(stderr, "%s\n", __FUNCTION__); fprintf(stderr, "%s\n", __FUNCTION__);
- if (rmesa->dma.flush) - if (rmesa->dma.flush)
- rmesa->dma.flush( rmesa ); - rmesa->dma.flush( rmesa );
+ if (rmesa->swtcl.flush) { -
+ rmesa->swtcl.flush(rmesa);
+ }
- if (rmesa->cmdbuf.count_used > rmesa->cmdbuf.count_reemit) - if (rmesa->cmdbuf.count_used > rmesa->cmdbuf.count_reemit)
+ if (rmesa->cmdbuf.cs->cdw) { - r300FlushCmdBuf(rmesa, __FUNCTION__);
r300FlushCmdBuf(rmesa, __FUNCTION__);
-} -}
- -
-#ifdef USER_BUFFERS -#ifdef USER_BUFFERS
@ -3114,7 +3162,7 @@ index ee85e22..a86841c 100644
- r300_mem_free(rmesa, region->buf->id); - r300_mem_free(rmesa, region->buf->id);
- FREE(region->buf); - FREE(region->buf);
- rmesa->dma.nr_released_bufs++; - rmesa->dma.nr_released_bufs++;
} - }
- -
- region->buf = 0; - region->buf = 0;
- region->start = 0; - region->start = 0;
@ -3173,12 +3221,16 @@ index ee85e22..a86841c 100644
- if (rmesa->dma.flush) { - if (rmesa->dma.flush) {
- rmesa->dma.flush(rmesa); - rmesa->dma.flush(rmesa);
- } - }
- + if (rmesa->swtcl.flush) {
+ rmesa->swtcl.flush(rmesa);
+ }
- if (rmesa->dma.current.buf) - if (rmesa->dma.current.buf)
- r300ReleaseDmaRegion(rmesa, &rmesa->dma.current, __FUNCTION__); - r300ReleaseDmaRegion(rmesa, &rmesa->dma.current, __FUNCTION__);
- -
- if (rmesa->dma.nr_released_bufs > 4) - if (rmesa->dma.nr_released_bufs > 4)
- r300FlushCmdBuf(rmesa, __FUNCTION__); + if (rmesa->cmdbuf.cs->cdw) {
r300FlushCmdBuf(rmesa, __FUNCTION__);
- -
- dma.context = rmesa->radeon.dri.hwContext; - dma.context = rmesa->radeon.dri.hwContext;
- dma.send_count = 0; - dma.send_count = 0;
@ -3259,7 +3311,7 @@ index ee85e22..a86841c 100644
- -
- FREE(region->buf); - FREE(region->buf);
- rmesa->dma.nr_released_bufs++; - rmesa->dma.nr_released_bufs++;
- } }
- -
- region->buf = 0; - region->buf = 0;
- region->start = 0; - region->start = 0;
@ -4245,10 +4297,10 @@ index 778db96..8b3fe43 100644
# define R300_TXO_ENDIAN_NO_SWAP (0 << 0) # define R300_TXO_ENDIAN_NO_SWAP (0 << 0)
# define R300_TXO_ENDIAN_BYTE_SWAP (1 << 0) # define R300_TXO_ENDIAN_BYTE_SWAP (1 << 0)
diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c
index 292f87a..dd9da80 100644 index 292f87a..ccc00b3 100644
--- a/src/mesa/drivers/dri/r300/r300_render.c --- a/src/mesa/drivers/dri/r300/r300_render.c
+++ b/src/mesa/drivers/dri/r300/r300_render.c +++ b/src/mesa/drivers/dri/r300/r300_render.c
@@ -175,89 +175,171 @@ int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim) @@ -175,89 +175,163 @@ int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim)
static void r300EmitElts(GLcontext * ctx, void *elts, unsigned long n_elts) static void r300EmitElts(GLcontext * ctx, void *elts, unsigned long n_elts)
{ {
r300ContextPtr rmesa = R300_CONTEXT(ctx); r300ContextPtr rmesa = R300_CONTEXT(ctx);
@ -4321,8 +4373,6 @@ index 292f87a..dd9da80 100644
+ OUT_BATCH(vertex_count); + OUT_BATCH(vertex_count);
+ radeon_cs_write_reloc(rmesa->cmdbuf.cs, + radeon_cs_write_reloc(rmesa->cmdbuf.cs,
+ rmesa->state.elt_dma_bo, + rmesa->state.elt_dma_bo,
+ 0,
+ rmesa->state.elt_dma_bo->size,
+ RADEON_GEM_DOMAIN_GTT, 0, 0); + RADEON_GEM_DOMAIN_GTT, 0, 0);
+ } + }
+ END_BATCH(); + END_BATCH();
@ -4420,16 +4470,12 @@ index 292f87a..dd9da80 100644
+ offset * 4 * rmesa->state.aos[i + 0].stride; + offset * 4 * rmesa->state.aos[i + 0].stride;
+ radeon_cs_write_reloc(rmesa->cmdbuf.cs, + radeon_cs_write_reloc(rmesa->cmdbuf.cs,
+ rmesa->state.aos[i+0].bo, + rmesa->state.aos[i+0].bo,
+ voffset,
+ rmesa->state.aos[i+0].bo->size,
+ RADEON_GEM_DOMAIN_GTT, + RADEON_GEM_DOMAIN_GTT,
+ 0, 0); + 0, 0);
+ voffset = rmesa->state.aos[i + 1].offset + + voffset = rmesa->state.aos[i + 1].offset +
+ offset * 4 * rmesa->state.aos[i + 1].stride; + offset * 4 * rmesa->state.aos[i + 1].stride;
+ radeon_cs_write_reloc(rmesa->cmdbuf.cs, + radeon_cs_write_reloc(rmesa->cmdbuf.cs,
+ rmesa->state.aos[i+1].bo, + rmesa->state.aos[i+1].bo,
+ voffset,
+ rmesa->state.aos[i+1].bo->size,
+ RADEON_GEM_DOMAIN_GTT, + RADEON_GEM_DOMAIN_GTT,
+ 0, 0); + 0, 0);
+ } + }
@ -4438,8 +4484,6 @@ index 292f87a..dd9da80 100644
+ offset * 4 * rmesa->state.aos[nr - 1].stride; + offset * 4 * rmesa->state.aos[nr - 1].stride;
+ radeon_cs_write_reloc(rmesa->cmdbuf.cs, + radeon_cs_write_reloc(rmesa->cmdbuf.cs,
+ rmesa->state.aos[nr-1].bo, + rmesa->state.aos[nr-1].bo,
+ voffset,
+ rmesa->state.aos[nr-1].bo->size,
+ RADEON_GEM_DOMAIN_GTT, + RADEON_GEM_DOMAIN_GTT,
+ 0, 0); + 0, 0);
} }
@ -4469,7 +4513,7 @@ index 292f87a..dd9da80 100644
int type, num_verts; int type, num_verts;
TNLcontext *tnl = TNL_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *vb = &tnl->vb; struct vertex_buffer *vb = &tnl->vb;
@@ -268,6 +350,12 @@ static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx, @@ -268,6 +342,12 @@ static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx,
if (type < 0 || num_verts <= 0) if (type < 0 || num_verts <= 0)
return; return;
@ -4482,7 +4526,7 @@ index 292f87a..dd9da80 100644
if (vb->Elts) { if (vb->Elts) {
if (num_verts > 65535) { if (num_verts > 65535) {
/* not implemented yet */ /* not implemented yet */
@@ -287,11 +375,12 @@ static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx, @@ -287,11 +367,12 @@ static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx,
*/ */
r300EmitElts(ctx, vb->Elts, num_verts); r300EmitElts(ctx, vb->Elts, num_verts);
r300EmitAOS(rmesa, rmesa->state.aos_count, start); r300EmitAOS(rmesa, rmesa->state.aos_count, start);
@ -4496,7 +4540,7 @@ index 292f87a..dd9da80 100644
} }
static GLboolean r300RunRender(GLcontext * ctx, static GLboolean r300RunRender(GLcontext * ctx,
@@ -302,7 +391,6 @@ static GLboolean r300RunRender(GLcontext * ctx, @@ -302,7 +383,6 @@ static GLboolean r300RunRender(GLcontext * ctx,
TNLcontext *tnl = TNL_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *vb = &tnl->vb; struct vertex_buffer *vb = &tnl->vb;
@ -4504,7 +4548,7 @@ index 292f87a..dd9da80 100644
if (RADEON_DEBUG & DEBUG_PRIMS) if (RADEON_DEBUG & DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__); fprintf(stderr, "%s\n", __FUNCTION__);
@@ -324,10 +412,6 @@ static GLboolean r300RunRender(GLcontext * ctx, @@ -324,10 +404,6 @@ static GLboolean r300RunRender(GLcontext * ctx,
r300EmitCacheFlush(rmesa); r300EmitCacheFlush(rmesa);
@ -9433,10 +9477,10 @@ index 0000000..62cdfad
+#endif +#endif
diff --git a/src/mesa/drivers/dri/radeon/radeon_cs_legacy.c b/src/mesa/drivers/dri/radeon/radeon_cs_legacy.c diff --git a/src/mesa/drivers/dri/radeon/radeon_cs_legacy.c b/src/mesa/drivers/dri/radeon/radeon_cs_legacy.c
new file mode 100644 new file mode 100644
index 0000000..20956ff index 0000000..11b9f89
--- /dev/null --- /dev/null
+++ b/src/mesa/drivers/dri/radeon/radeon_cs_legacy.c +++ b/src/mesa/drivers/dri/radeon/radeon_cs_legacy.c
@@ -0,0 +1,424 @@ @@ -0,0 +1,404 @@
+/* +/*
+ * Copyright © 2008 Nicolai Haehnle + * Copyright © 2008 Nicolai Haehnle
+ * Copyright © 2008 Jérôme Glisse + * Copyright © 2008 Jérôme Glisse
@ -9533,8 +9577,6 @@ index 0000000..20956ff
+ +
+static int cs_write_reloc(struct radeon_cs *cs, +static int cs_write_reloc(struct radeon_cs *cs,
+ struct radeon_bo *bo, + struct radeon_bo *bo,
+ uint32_t start_offset,
+ uint32_t end_offset,
+ uint32_t read_domain, + uint32_t read_domain,
+ uint32_t write_domain, + uint32_t write_domain,
+ uint32_t flags) + uint32_t flags)
@ -9556,25 +9598,11 @@ index 0000000..20956ff
+ if (write_domain == RADEON_GEM_DOMAIN_CPU) { + if (write_domain == RADEON_GEM_DOMAIN_CPU) {
+ return -EINVAL; + return -EINVAL;
+ } + }
+ /* check reloc window */
+ if (end_offset > bo->size) {
+ return -EINVAL;
+ }
+ if (start_offset > end_offset) {
+ return -EINVAL;
+ }
+ /* check if bo is already referenced */ + /* check if bo is already referenced */
+ for(i = 0; i < cs->crelocs; i++) { + for(i = 0; i < cs->crelocs; i++) {
+ uint32_t *indices; + uint32_t *indices;
+ +
+ if (relocs[i].base.bo->handle == bo->handle) { + if (relocs[i].base.bo->handle == bo->handle) {
+ /* update start and end offset */
+ if (start_offset < relocs[i].base.start_offset) {
+ relocs[i].base.start_offset = start_offset;
+ }
+ if (end_offset > relocs[i].base.end_offset) {
+ relocs[i].base.end_offset = end_offset;
+ }
+ /* Check domains must be in read or write. As we check already + /* Check domains must be in read or write. As we check already
+ * checked that in argument one of the read or write domain was + * checked that in argument one of the read or write domain was
+ * set we only need to check that if previous reloc as the read + * set we only need to check that if previous reloc as the read
@ -9611,8 +9639,6 @@ index 0000000..20956ff
+ } + }
+ cs->relocs = relocs; + cs->relocs = relocs;
+ relocs[cs->crelocs].base.bo = bo; + relocs[cs->crelocs].base.bo = bo;
+ relocs[cs->crelocs].base.start_offset = start_offset;
+ relocs[cs->crelocs].base.end_offset = end_offset;
+ relocs[cs->crelocs].base.read_domain = read_domain; + relocs[cs->crelocs].base.read_domain = read_domain;
+ relocs[cs->crelocs].base.write_domain = write_domain; + relocs[cs->crelocs].base.write_domain = write_domain;
+ relocs[cs->crelocs].base.flags = flags; + relocs[cs->crelocs].base.flags = flags;
@ -9688,8 +9714,6 @@ index 0000000..20956ff
+ for (j = 0; j < relocs[i].cindices; j++) { + for (j = 0; j < relocs[i].cindices; j++) {
+ uint32_t soffset, eoffset; + uint32_t soffset, eoffset;
+ +
+ soffset = relocs[i].base.start_offset;
+ eoffset = relocs[i].base.end_offset;
+ r = radeon_bo_legacy_validate(relocs[i].base.bo, + r = radeon_bo_legacy_validate(relocs[i].base.bo,
+ &soffset, &eoffset); + &soffset, &eoffset);
+ if (r) { + if (r) {