Bring vertex buffer code up to date..

This commit is contained in:
Vladimir Dergachev
2005-01-10 05:24:28 +00:00
parent 6867117b58
commit 8c231d2e28
2 changed files with 65 additions and 52 deletions
+26 -12
View File
@@ -59,7 +59,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
/**
* Send the current command buffer via ioctl to the hardware.
*/
int r300FlushCmdBuf(r300ContextPtr r300, const char* caller)
int r300FlushCmdBufLocked(r300ContextPtr r300, const char* caller)
{
int ret;
int i;
@@ -81,8 +81,6 @@ int r300FlushCmdBuf(r300ContextPtr r300, const char* caller)
r300->cmdbuf.cmd_buf[i]);
}
LOCK_HARDWARE(&r300->radeon);
cmd.buf = (char*)(r300->cmdbuf.cmd_buf + start);
cmd.bufsz = (r300->cmdbuf.count_used - start) * 4;
@@ -97,27 +95,43 @@ int r300FlushCmdBuf(r300ContextPtr r300, const char* caller)
if (cmd.nbox) {
ret = drmCommandWrite(r300->radeon.dri.fd,
DRM_RADEON_CMDBUF, &cmd, sizeof(cmd));
if (ret) {
UNLOCK_HARDWARE(&r300->radeon);
fprintf(stderr, "drmCommandWrite: %d\n", ret);
exit(-1);
}
if (RADEON_DEBUG & DEBUG_SYNC) {
fprintf(stderr, "Syncing in %s\n\n", __FUNCTION__);
radeonWaitForIdleLocked(&r300->radeon);
}
} else {
ret = 0;
if (RADEON_DEBUG & DEBUG_IOCTL)
fprintf(stderr, "%s: No cliprects\n", __FUNCTION__);
}
UNLOCK_HARDWARE(&r300->radeon);
r300->cmdbuf.count_used = 0;
r300->cmdbuf.count_reemit = 0;
return 0;
return ret;
}
int r300FlushCmdBuf(r300ContextPtr r300, const char* caller)
{
int ret;
int i;
drm_radeon_cmd_buffer_t cmd;
int start;
LOCK_HARDWARE(&r300->radeon);
ret=r300FlushCmdBufLocked(r300, caller);
UNLOCK_HARDWARE(&r300->radeon);
if (ret) {
fprintf(stderr, "drmRadeonCmdBuffer: %d (exiting)\n", ret);
exit(ret);
}
return ret;
}
+39 -40
View File
@@ -340,9 +340,17 @@ static void upload_vertex_buffer(r300ContextPtr rmesa,
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *VB = &tnl->vb;
int offset=0, idx=0;
int i,j;
int idx=0;
int i,j,k;
radeonScreenPtr rsp=rmesa->radeon.radeonScreen;
/* A hack - we don't want to overwrite vertex buffers, so we
just use AGP space for them.. Fix me ! */
static int offset=0;
if(offset>2*1024*1024){
//fprintf(stderr, "Wrapping agp vertex buffer offset\n");
offset=0;
}
/* Not the most efficient implementation, but, for now, I just want something that
works */
/* to do - make single memcpy per column (is it possible ?) */
@@ -351,7 +359,7 @@ static void upload_vertex_buffer(r300ContextPtr rmesa,
{ \
/* Is the data dirty ? */ \
if (v->flags & ((1<<v->size)-1)) { \
fprintf(stderr, "size=%d vs stride=%d\n", v->size, v->stride); \
/* fprintf(stderr, "size=%d vs stride=%d\n", v->size, v->stride); */ \
if(v->size*4==v->stride){\
/* fast path */ \
memcpy(rsp->gartTextures.map+offset, v->data, v->stride*VB->Count); \
@@ -375,6 +383,10 @@ static void upload_vertex_buffer(r300ContextPtr rmesa,
UPLOAD_VECTOR(VB->ObjPtr, REG_COORDS, AOS_FORMAT_FLOAT);
UPLOAD_VECTOR(VB->ColorPtr[0], REG_COLOR0, AOS_FORMAT_FLOAT_COLOR);
/* texture coordinates */
for(k=0;k < ctx->Const.MaxTextureUnits;k++)
if(ctx->Texture.Unit[k].Enabled)
UPLOAD_VECTOR(VB->TexCoordPtr[k], REG_TEX0+i, AOS_FORMAT_FLOAT);
*n_arrays=idx;
if(idx>=R300_MAX_AOS_ARRAYS){
@@ -383,16 +395,13 @@ if(idx>=R300_MAX_AOS_ARRAYS){
}
}
static void r300_render_vb_flat_primitive(r300ContextPtr rmesa,
static void r300_render_vb_primitive(r300ContextPtr rmesa,
GLcontext *ctx,
int start,
int end,
int prim)
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *VB = &tnl->vb;
GLuint i;
int k, type, n_arrays;
int type;
LOCAL_VARS
if(end<=start)return; /* do we need to watch for this ? */
@@ -403,7 +412,7 @@ static void r300_render_vb_flat_primitive(r300ContextPtr rmesa,
fire_AOS(PASS_PREFIX end-start, type);
}
static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
static GLboolean r300_run_vb_render(GLcontext *ctx,
struct tnl_pipeline_stage *stage)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
@@ -411,16 +420,11 @@ static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
struct vertex_buffer *VB = &tnl->vb;
int i, j, n_arrays;
AOS_DATA vb_arrays[R300_MAX_AOS_ARRAYS];
AOS_DATA vb_arrays2[R300_MAX_AOS_ARRAYS];
LOCAL_VARS
if (RADEON_DEBUG == DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
/* setup array of structures data */
upload_vertex_buffer(rmesa, ctx, vb_arrays, &n_arrays);
fprintf(stderr, "Using %d AOS arrays\n", n_arrays);
reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
e32(0x0000000a);
@@ -428,42 +432,31 @@ static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
reg_start(0x4f18,0);
e32(0x00000003);
r300_setup_routing(rmesa, ctx, GL_FALSE);
r300_setup_routing(ctx, GL_FALSE);
r300EmitState(rmesa);
FLAT_COLOR_PIPELINE.vertex_shader.matrix[0].length=16;
memcpy(FLAT_COLOR_PIPELINE.vertex_shader.matrix[0].body.f, ctx->_ModelProjectMatrix.m, 16*4);
FLAT_COLOR_PIPELINE.vertex_shader.unknown2.length=4;
FLAT_COLOR_PIPELINE.vertex_shader.unknown2.body.f[0]=0.0;
FLAT_COLOR_PIPELINE.vertex_shader.unknown2.body.f[1]=0.0;
FLAT_COLOR_PIPELINE.vertex_shader.unknown2.body.f[2]=1.0;
FLAT_COLOR_PIPELINE.vertex_shader.unknown2.body.f[3]=0.0;
/* setup array of structures data */
LOCK_HARDWARE(&(rmesa->radeon));
program_pipeline(PASS_PREFIX &FLAT_COLOR_PIPELINE);
set_quad0(PASS_PREFIX 1.0,1.0,1.0,1.0);
set_init21(PASS_PREFIX 0.0,1.0);
upload_vertex_buffer(rmesa, ctx, vb_arrays, &n_arrays);
//fprintf(stderr, "Using %d AOS arrays\n", n_arrays);
for(i=0;i<n_arrays;i++)
rmesa->state.aos[i].offset=vb_arrays[i].offset;
for(i=0; i < VB->PrimitiveCount; i++){
GLuint prim = VB->Primitive[i].mode;
GLuint start = VB->Primitive[i].start;
GLuint length = VB->Primitive[i].count;
/* We need LOAD_VBPNTR to setup AOS_ATTR fields.. */
r300EmitLOAD_VBPNTR(rmesa, start);
/* copy arrays */
memcpy(vb_arrays2, vb_arrays, sizeof(AOS_DATA)*n_arrays);
for(j=0;j<n_arrays;j++){
vb_arrays2[j].offset+=vb_arrays2[j].stride*start*4;
}
setup_AOS(PASS_PREFIX vb_arrays2, n_arrays);
r300_render_vb_flat_primitive(rmesa, ctx, start, start + length, prim);
r300_render_vb_primitive(rmesa, ctx, start, start + length, prim);
}
/* This sequence is required after any 3d drawing packet
I suspect it work arounds a bug (or deficiency) in hardware */
I suspect it works around a bug (or deficiency) in hardware */
reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
e32(0x0000000a);
@@ -474,8 +467,10 @@ static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
end_3d(PASS_PREFIX_VOID);
/* Flush state - we are done drawing.. */
r300Flush(ctx);
fprintf(stderr, "\n");
r300FlushCmdBufLocked(ctx, __FUNCTION__);
radeonWaitForIdleLocked(&(rmesa->radeon));
UNLOCK_HARDWARE(&(rmesa->radeon));
return GL_FALSE;
}
@@ -500,7 +495,11 @@ static GLboolean r300_run_render(GLcontext *ctx,
#if 1
#if 0
return r300_run_immediate_render(ctx, stage);
#else
return r300_run_vb_render(ctx, stage);
#endif
#else
return GL_TRUE;
#endif