Compare commits

..

15 Commits

Author SHA1 Message Date
Vladimir Dergachev
f50a1964d1 Cleanup !
I can not trigger any lockups now..
2005-01-02 06:16:44 +00:00
Vladimir Dergachev
d6be8dd651 I think I fixed the lockups issue. 2005-01-02 05:57:15 +00:00
Vladimir Dergachev
9a04b25c60 Get textures to work with NeHe lesson06.
The code is still disabled since we are displaying random image data instead of actual texture and because I had to put a sleep(1) in lesson06 drawing loop to prevent lockups.
2005-01-02 04:46:25 +00:00
Adam Jackson
3c80f5c56b linux-dri-x86 build fix from Andreas Stenglein. 2005-01-02 03:36:53 +00:00
Felix Kuehling
7a231da442 Improved the performance of software fallbacks by not waiting for idle
in every single span function. Instead flush and wait in the
SpanRenderStart hook and in wrappers around _swrast_Copy/Draw/ReadPixels.
Misc. cleanups in savagespan.c while I'm there.
2005-01-02 01:22:10 +00:00
Felix Kuehling
1067ce0cea Removed all direct hardware access (MMIO, BCI) from the Savage DRI
driver. It uses the new DRM version 2.0.x now, which has just been
committed to DRM CVS.
2005-01-01 20:40:14 +00:00
Felix Kuehling
467d64a177 Use DRM headers from $(DRM_SOURCE_PATH)/shared-core instead of .../shared. 2005-01-01 20:33:45 +00:00
Vladimir Dergachev
404d925b58 Add a convenience function to issue CP delays. 2005-01-01 18:41:43 +00:00
Vladimir Dergachev
e443d1ec47 Qualify the magic 20B0 register as SE_VTE_CNTL similar to R200. Looks like disabling Z offset and scaling displays gears properly, not sure why. Perhaps the meaning of the bits has changed ?
Cleanup code a bit.
2004-12-31 21:28:36 +00:00
Vladimir Dergachev
92d47e79f1 Sync with master copy. 2004-12-31 20:57:48 +00:00
Vladimir Dergachev
11374bdb86 Add texture drawing code. Note: it is broken at the moment and is disabled in CVS. However, all hooks are there.
Fix vertex buffer drawing code.
2004-12-31 19:39:03 +00:00
Vladimir Dergachev
24b5e49141 Rework slightly r300_get_primitive_type - make it clearer and more compact.. 2004-12-30 20:24:30 +00:00
Keith Whitwell
179cc373f1 Get scissor test working again. Passes glean scissor test. 2004-12-30 17:47:08 +00:00
Keith Whitwell
c664f0c515 Calculate DEPTH_SCALE correctly for polygon offset. 2004-12-30 16:30:26 +00:00
Keith Whitwell
8be4747fd6 Simplify viaBlit a bit more.
Implement masked clears.
2004-12-30 16:13:35 +00:00
32 changed files with 1414 additions and 1106 deletions

View File

@@ -18,7 +18,7 @@ WINOBJ=
WINLIB=-L$(MESA)/src/glx/mini
MINIGLX_INCLUDES = -I$(TOP)/src/glx/mini
INCLUDES = $(MINIGLX_INCLUDES) \
-I$(DRM_SOURCE_PATH)/shared \
-I$(DRM_SOURCE_PATH)/shared-core \
-I$(DRM_SOURCE_PATH)/libdrm \
$(SHARED_INCLUDES)
@@ -36,8 +36,7 @@ SHARED_INCLUDES = \
-I. \
-I$(TOP)/src/mesa/drivers/dri/common \
-Iserver \
-I$(DRM_SOURCE_PATH)/shared \
-I$(DRM_SOURCE_PATH)/linux \
-I$(DRM_SOURCE_PATH)/shared-core \
-I$(TOP)/include \
-I$(TOP)/include/GL/internal \
-I$(TOP)/src/mesa \
@@ -95,7 +94,7 @@ tags:
# Remove .o and backup files
clean:
-rm -f *.o */*.o *~ *.o *~ *.so server/*.o $(SYMLINKS)
-rm -f *.o */*.o *~ *.so *~ server/*.o $(SYMLINKS)
-rm -f depend depend.bak
include depend

View File

@@ -284,8 +284,8 @@ void r300InitCmdBuf(r300ContextPtr r300)
r300->hw.unk2080.cmd[0] = cmducs(0x2080, 1);
ALLOC_STATE( ovf, always, R300_OVF_CMDSIZE, "ovf", 0 );
r300->hw.ovf.cmd[R300_OVF_CMD_0] = cmducs(R300_VAP_OUTPUT_VTX_FMT_0, 2);
ALLOC_STATE( unk20B0, always, 3, "unk20B0", 0 );
r300->hw.unk20B0.cmd[0] = cmducs(0x20B0, 2);
ALLOC_STATE( vte, always, 3, "vte", 0 );
r300->hw.vte.cmd[0] = cmducs(R300_SE_VTE_CNTL, 2);
ALLOC_STATE( unk2134, always, 3, "unk2134", 0 );
r300->hw.unk2134.cmd[0] = cmducs(0x2134, 2);
ALLOC_STATE( unk2140, always, 2, "unk2140", 0 );
@@ -415,7 +415,7 @@ void r300InitCmdBuf(r300ContextPtr r300)
insert_at_tail(&r300->hw.atomlist, &r300->hw.vpt);
insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2080);
insert_at_tail(&r300->hw.atomlist, &r300->hw.ovf);
insert_at_tail(&r300->hw.atomlist, &r300->hw.unk20B0);
insert_at_tail(&r300->hw.atomlist, &r300->hw.vte);
insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2134);
insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2140);
insert_at_tail(&r300->hw.atomlist, &r300->hw.vir[0]);

View File

@@ -246,7 +246,7 @@ struct r300_hw_state {
struct r300_state_atom vpt; /* viewport (1D98) */
struct r300_state_atom unk2080; /* (2080) */
struct r300_state_atom ovf; /* output vertex format (2090) */
struct r300_state_atom unk20B0; /* (20B0) */
struct r300_state_atom vte; /* (20B0) */
struct r300_state_atom unk2134; /* (2134) */
struct r300_state_atom unk2140; /* (2140) */
struct r300_state_atom vir[2]; /* vap input route (2150/21E0) */

View File

@@ -96,6 +96,16 @@ static __inline__ uint32_t cmdpacket3(int packet)
return cmd.u;
}
static __inline__ uint32_t cmdcpdelay(unsigned short count)
{
drm_r300_cmd_header_t cmd;
cmd.delay.cmd_type = R300_CMD_CP_DELAY;
cmd.delay.count = count;
return cmd.u;
}
/* Prepare to write a register value to register at address reg.
If num_extra > 0 then the following extra values are written
to registers with address +4, +8 and so on.. */
@@ -181,4 +191,15 @@ cmd=(drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa, \
cmd[0].header.cmd_type=R300_CMD_END3D;
}
void static inline cp_delay(PREFIX unsigned short count)
{
LOCAL_VARS
cmd=(drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa, \
0, \
__FUNCTION__); \
cmd[0].i=cmdcpdelay(count);
}
#endif

View File

@@ -70,6 +70,19 @@ I am fairly certain that they are correct unless stated otherwise in comments.
# define R300_VAP_OUTPUT_VTX_FMT_1__TEX_7_COMP_CNT_SHIFT 21
/* END */
#define R300_SE_VTE_CNTL 0x20b0
# define R300_VPORT_X_SCALE_ENA 0x00000001
# define R300_VPORT_X_OFFSET_ENA 0x00000002
# define R300_VPORT_Y_SCALE_ENA 0x00000004
# define R300_VPORT_Y_OFFSET_ENA 0x00000008
# define R300_VPORT_Z_SCALE_ENA 0x00000010
# define R300_VPORT_Z_OFFSET_ENA 0x00000020
# define R300_VTX_XY_FMT 0x00000100
# define R300_VTX_Z_FMT 0x00000200
# define R300_VTX_W0_FMT 0x00000400
# define R300_VTX_W0_NORMALIZE 0x00000800
# define R300_VTX_ST_DENORMALIZED 0x00001000
/* BEGIN: Vertex data assembly - lots of uncertainties */
/* gap */
/* Where do we get our vertex data?

View File

@@ -72,81 +72,69 @@ static int r300_get_primitive_type(r300ContextPtr rmesa,
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *VB = &tnl->vb;
GLuint i;
int type=-1;
int type=-1, min_vertices=0;
char *name="UNKNOWN";
if(end<=start)return -1; /* do we need to watch for this ? */
fprintf(stderr, "[%d-%d]", start, end);
switch (prim & PRIM_MODE_MASK) {
case GL_LINES:
fprintf(stderr, "L ");
case GL_POINTS:
name="P";
type=R300_VAP_VF_CNTL__PRIM_POINTS;
min_vertices=1;
break;
case GL_LINES:
name="L";
type=R300_VAP_VF_CNTL__PRIM_LINES;
if(end<start+2){
fprintf(stderr, "Not enough vertices\n");
return -1; /* need enough vertices for Q */
}
break;
case GL_LINE_STRIP:
fprintf(stderr, "LS ");
min_vertices=2;
break;
case GL_LINE_STRIP:
name="LS";
type=R300_VAP_VF_CNTL__PRIM_LINE_STRIP;
if(end<start+2){
fprintf(stderr, "Not enough vertices\n");
return -1; /* need enough vertices for Q */
}
min_vertices=2;
break;
case GL_LINE_LOOP:
fprintf(stderr, "LL ");
case GL_LINE_LOOP:
name="LL";
min_vertices=2;
return -1;
if(end<start+2){
fprintf(stderr, "Not enough vertices\n");
return -1; /* need enough vertices for Q */
}
break;
case GL_TRIANGLES:
fprintf(stderr, "T ");
case GL_TRIANGLES:
name="T";
type=R300_VAP_VF_CNTL__PRIM_TRIANGLES;
if(end<start+3){
fprintf(stderr, "Not enough vertices\n");
return -1; /* need enough vertices for Q */
}
min_vertices=3;
break;
case GL_TRIANGLE_STRIP:
fprintf(stderr, "TS ");
case GL_TRIANGLE_STRIP:
name="TS";
type=R300_VAP_VF_CNTL__PRIM_TRIANGLE_STRIP;
if(end<start+3){
fprintf(stderr, "Not enough vertices\n");
return -1; /* need enough vertices for Q */
}
min_vertices=3;
break;
case GL_TRIANGLE_FAN:
fprintf(stderr, "TF ");
case GL_TRIANGLE_FAN:
name="TF";
type=R300_VAP_VF_CNTL__PRIM_TRIANGLE_FAN;
if(end<start+3){
fprintf(stderr, "Not enough vertices\n");
return -1; /* need enough vertices for Q */
}
min_vertices=3;
break;
case GL_QUADS:
fprintf(stderr, "Q ");
case GL_QUADS:
name="Q";
type=R300_VAP_VF_CNTL__PRIM_QUADS;
if(end<start+4){
fprintf(stderr, "Not enough vertices\n");
return -1; /* need enough vertices for Q */
}
min_vertices=4;
break;
case GL_QUAD_STRIP:
fprintf(stderr, "QS ");
case GL_QUAD_STRIP:
name="QS";
type=R300_VAP_VF_CNTL__PRIM_QUAD_STRIP;
if(end<start+4){
fprintf(stderr, "Not enough vertices\n");
return -1; /* need enough vertices for Q */
}
min_vertices=4;
break;
default:
default:
fprintf(stderr, "Cannot handle primitive %02x ", prim & PRIM_MODE_MASK);
return -1;
break;
}
}
#if 0
fprintf(stderr, "[%d-%d]%s ", start, end, name);
#endif
if(start+min_vertices>=end){
fprintf(stderr, "Not enough vertices\n");
return -1;
}
return type;
}
@@ -180,6 +168,7 @@ static void r300_render_flat_primitive(r300ContextPtr rmesa,
LOCAL_VARS
type=r300_get_primitive_type(rmesa, ctx, start, end, prim);
if(type<0)return;
@@ -220,6 +209,9 @@ static GLboolean r300_run_flat_render(GLcontext *ctx,
AOS_DATA vb_arrays[2];
LOCAL_VARS
/* Flush state - make sure command buffer is nice and large */
r300Flush(ctx);
if (RADEON_DEBUG == DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
@@ -251,10 +243,14 @@ static GLboolean r300_run_flat_render(GLcontext *ctx,
reg_start(0x4f18,0);
e32(0x00000003);
r300EmitState(rmesa);
rmesa->hw.vte.cmd[1] = R300_VPORT_X_SCALE_ENA
| R300_VPORT_X_OFFSET_ENA
| R300_VPORT_Y_SCALE_ENA
| R300_VPORT_Y_OFFSET_ENA
| R300_VTX_W0_FMT;
R300_STATECHANGE(rmesa, vte);
reg_start(0x20b0,0);
e32(0x0000043f);
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);
@@ -277,9 +273,14 @@ static GLboolean r300_run_flat_render(GLcontext *ctx,
r300_render_flat_primitive(rmesa, ctx, start, start + length, prim);
}
end_3d(PASS_PREFIX_VOID);
/* This sequence is required after any 3d drawing packet
I suspect it work arounds a bug (or deficiency) in hardware */
reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
e32(0x0000000a);
fprintf(stderr, "\n");
reg_start(0x4f18,0);
e32(0x00000003);
return GL_FALSE;
}
@@ -287,7 +288,8 @@ static GLboolean r300_run_flat_render(GLcontext *ctx,
/* We use the start part of GART texture buffer for vertices */
#define R300_MAX_AOS_ARRAYS 16
/* 8 is somewhat bogus... it is probably something like 24 */
#define R300_MAX_AOS_ARRAYS 8
static void upload_vertex_buffer(r300ContextPtr rmesa,
GLcontext *ctx, AOS_DATA *array, int *n_arrays)
@@ -312,7 +314,7 @@ static void upload_vertex_buffer(r300ContextPtr rmesa,
} else { \
for(i=0;i<VB->Count;i++){ \
/* copy one vertex at a time*/ \
memcpy(rsp->gartTextures.map+offset, VEC_ELT(v, GLfloat, i), v->size*4); \
memcpy(rsp->gartTextures.map+offset+i*v->size*4, VEC_ELT(v, GLfloat, i), v->size*4); \
} \
} \
/* v->flags &= ~((1<<v->size)-1);*/ \
@@ -325,24 +327,8 @@ static void upload_vertex_buffer(r300ContextPtr rmesa,
array[idx].reg=r; \
offset+=v->size*4*VB->Count; \
idx++; \
/* Fill in the rest with the components of default_vector */\
/* \
if(v->size<4){ \
array[idx].element_size=4-v->size; \
array[idx].stride=0; \
array[idx].format=(f); \
array[idx].ncomponents=4-v->size; \
array[idx].offset=rsp->gartTextures.handle+v->size*4;\
array[idx].reg=r; \
idx++; \
} \
*/\
}
/* Put a copy of default vector */
memcpy(rsp->gartTextures.map, default_vector, 16);
offset+=16;
UPLOAD_VECTOR(VB->ObjPtr, REG_COORDS, AOS_FORMAT_FLOAT);
UPLOAD_VECTOR(VB->ColorPtr[0], REG_COLOR0, AOS_FORMAT_FLOAT_COLOR);
@@ -407,9 +393,6 @@ static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
r300EmitState(rmesa);
reg_start(0x20b0,0);
e32(0x0000043f);
FLAT_COLOR_PIPELINE.vertex_shader.matrix[0].length=16;
memcpy(FLAT_COLOR_PIPELINE.vertex_shader.matrix[0].body.f, ctx->_ModelProjectMatrix.m, 16*4);
@@ -418,12 +401,9 @@ static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
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;
program_pipeline(PASS_PREFIX &FLAT_COLOR_PIPELINE);
reg_start(R300_RE_OCCLUSION_CNTL, 0);
e32(R300_OCCLUSION_ON);
set_quad0(PASS_PREFIX 1.0,1.0,1.0,1.0);
set_init21(PASS_PREFIX 0.0,1.0);
@@ -435,7 +415,7 @@ static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
/* 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;
vb_arrays2[j].offset+=vb_arrays2[j].stride*start*4;
}
setup_AOS(PASS_PREFIX vb_arrays2, n_arrays);
@@ -443,6 +423,15 @@ static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
r300_render_vb_flat_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 */
reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
e32(0x0000000a);
reg_start(0x4f18,0);
e32(0x00000003);
end_3d(PASS_PREFIX_VOID);
/* Flush state - we are done drawing.. */
@@ -451,6 +440,215 @@ static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
return GL_FALSE;
}
/* Textures... */
/* Immediate implementation - vertex data is sent via command stream */
static void r300_render_tex_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;
LOCAL_VARS
type=r300_get_primitive_type(rmesa, ctx, start, end, prim);
fprintf(stderr,"ObjPtr: size=%d stride=%d\n",
VB->ObjPtr->size, VB->ObjPtr->stride);
fprintf(stderr,"ColorPtr[0]: size=%d stride=%d\n",
VB->ColorPtr[0]->size, VB->ColorPtr[0]->stride);
fprintf(stderr,"TexCoordPtr[0]: size=%d stride=%d\n",
VB->TexCoordPtr[0]->size, VB->TexCoordPtr[0]->stride);
if(type<0)return;
start_immediate_packet(end-start, type, 12);
for(i=start;i<end;i++){
#if 0
fprintf(stderr, "* (%f %f %f %f) (%f %f %f %f)\n",
VEC_ELT(VB->ObjPtr, GLfloat, i)[0],
VEC_ELT(VB->ObjPtr, GLfloat, i)[1],
VEC_ELT(VB->ObjPtr, GLfloat, i)[2],
VEC_ELT(VB->ObjPtr, GLfloat, i)[3],
VEC_ELT(VB->ColorPtr[0], GLfloat, i)[0],
VEC_ELT(VB->ColorPtr[0], GLfloat, i)[1],
VEC_ELT(VB->ColorPtr[0], GLfloat, i)[2],
VEC_ELT(VB->ColorPtr[0], GLfloat, i)[3]
);
#endif
/* coordinates */
output_vector(VB->ObjPtr, i);
/* color components */
output_vector(VB->ColorPtr[0], i);
/* texture coordinates */
output_vector(VB->TexCoordPtr[0], i);
}
}
static GLboolean r300_run_tex_render(GLcontext *ctx,
struct tnl_pipeline_stage *stage)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *VB = &tnl->vb;
GLuint i;
AOS_DATA vb_arrays[3];
/* Only do 2d textures */
struct gl_texture_object *to=ctx->Texture.Unit[0].Current2D;
radeonScreenPtr rsp=rmesa->radeon.radeonScreen;
LOCAL_VARS
/* Flush state - make sure command buffer is nice and large */
r300Flush(ctx);
//fprintf(stderr, "You can enable texture drawing in %s:%s \n", __FILE__, __FUNCTION__);
//return GL_TRUE;
if (RADEON_DEBUG == DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
/* setup array of structures data */
/* Note: immediate vertex data includes all coordinates.
To save bandwidth use either VBUF or state-based vertex generation */
/* xyzw */
vb_arrays[0].element_size=4;
vb_arrays[0].stride=4;
vb_arrays[0].offset=0; /* Not used */
vb_arrays[0].format=AOS_FORMAT_FLOAT;
vb_arrays[0].ncomponents=4;
vb_arrays[0].reg=REG_COORDS;
/* color */
vb_arrays[1].element_size=4;
vb_arrays[1].stride=4;
vb_arrays[1].offset=0; /* Not used */
vb_arrays[1].format=AOS_FORMAT_FLOAT_COLOR;
vb_arrays[1].ncomponents=4;
vb_arrays[1].reg=REG_COLOR0;
/* texture coordinates */
vb_arrays[2].element_size=4;
vb_arrays[2].stride=4;
vb_arrays[2].offset=0; /* Not used */
vb_arrays[2].format=AOS_FORMAT_FLOAT;
vb_arrays[2].ncomponents=4;
vb_arrays[2].reg=REG_TEX0;
/* Fill texture with some random data */
for(i=0;i<100000;i++)((int *)(rsp->gartTextures.map))[i]=rand();
/* needed before starting 3d operation .. */
reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
e32(0x0000000a);
reg_start(0x4f18,0);
e32(0x00000003);
rmesa->hw.vte.cmd[1] = R300_VPORT_X_SCALE_ENA
| R300_VPORT_X_OFFSET_ENA
| R300_VPORT_Y_SCALE_ENA
| R300_VPORT_Y_OFFSET_ENA
| R300_VTX_W0_FMT;
R300_STATECHANGE(rmesa, vte);
r300EmitState(rmesa);
SINGLE_TEXTURE_PIPELINE.vertex_shader.matrix[0].length=16;
memcpy(SINGLE_TEXTURE_PIPELINE.vertex_shader.matrix[0].body.f, ctx->_ModelProjectMatrix.m, 16*4);
SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.length=4;
SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.body.f[0]=0.0;
SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.body.f[1]=0.0;
SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.body.f[2]=1.0;
SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.body.f[3]=0.0;
/* Put it in the beginning of texture memory */
SINGLE_TEXTURE_PIPELINE.texture_unit[0].offset=rsp->gartTextures.handle;
/* Upload texture, a hack, really we can do a lot better */
#if 0
memcpy(rsp->gartTextures.map, to->Image[0][0]->Data, to->Image[0][0]->RowStride*to->Image[0][0]->Height*4);
#endif
/* Program RS unit. This needs to be moved into R300 pipeline */
reg_start(R300_RS_CNTL_0,1);
/* R300_RS_CNTL_0(4300) */
e32(0x00040084);
/* RS_INST_COUNT(4304) */
e32(0x000000c0);
reg_start(R300_RS_ROUTE_0,0);
e32(0x00024008);
reg_start(R300_RS_INTERP_0,7);
/* X_MEM0_0(4310) */
e32(0x00d10000);
/* X_MEM0_1(4314) */
e32(0x00d10044);
/* X_MEM0_2(4318) */
e32(0x00d10084);
/* X_MEM0_3(431c) */
e32(0x00d100c4);
/* X_MEM0_4(4320) */
e32(0x00d10004);
/* X_MEM0_5(4324) */
e32(0x00d10004);
/* X_MEM0_6(4328) */
e32(0x00d10004);
/* X_MEM0_7(432c) */
e32(0x00d10004);
reg_start(R300_RS_CNTL_0,0);
e32(0x00040084);
/* Magic register - note it is right after 20b0 */
reg_start(0x20b4,0);
e32(0x0000000c);
program_pipeline(PASS_PREFIX &SINGLE_TEXTURE_PIPELINE);
/* We need LOAD_VBPNTR to setup AOS_ATTR fields.. the offsets are irrelevant */
setup_AOS(PASS_PREFIX vb_arrays, 3);
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;
r300_render_tex_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 */
reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
e32(0x0000000a);
reg_start(0x4f18,0);
e32(0x00000003);
fprintf(stderr, "\n");
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
@@ -469,7 +667,11 @@ static GLboolean r300_run_render(GLcontext *ctx,
fprintf(stderr, "%s\n", __FUNCTION__);
#if 1
return r300_run_flat_render(ctx, stage);
/* Just switch between pipelines.. We could possibly do better.. (?) */
if(ctx->Texture.Unit[0].Enabled)
return r300_run_tex_render(ctx, stage);
else
return r300_run_flat_render(ctx, stage);
#else
return GL_TRUE;
#endif
@@ -562,7 +764,8 @@ static void r300_check_render(GLcontext *ctx, struct tnl_pipeline_stage *stage)
FALLBACK_IF(ctx->Stencil.Enabled); // GL_STENCIL_TEST
FALLBACK_IF(ctx->Multisample.Enabled); // GL_MULTISAMPLE_ARB
for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
/* One step at a time - let one texture pass.. */
for (i = 1; i < ctx->Const.MaxTextureUnits; i++)
FALLBACK_IF(ctx->Texture.Unit[i].Enabled);

View File

@@ -327,8 +327,14 @@ void r300ResetHwState(r300ContextPtr r300)
r300->hw.ovf.cmd[R300_OVF_FMT_0] = 0x00000003;
r300->hw.ovf.cmd[R300_OVF_FMT_1] = 0x00000000;
r300->hw.unk20B0.cmd[1] = 0x0000040A;
r300->hw.unk20B0.cmd[2] = 0x00000008;
r300->hw.vte.cmd[1] = R300_VPORT_X_SCALE_ENA
| R300_VPORT_X_OFFSET_ENA
| R300_VPORT_Y_SCALE_ENA
| R300_VPORT_Y_OFFSET_ENA
| R300_VPORT_Z_SCALE_ENA
| R300_VPORT_Z_OFFSET_ENA
| R300_VTX_W0_FMT;
r300->hw.vte.cmd[2] = 0x00000008;
r300->hw.unk2134.cmd[1] = 0x00FFFFFF;
r300->hw.unk2134.cmd[2] = 0x00000000;

View File

@@ -16,7 +16,7 @@
#include "matrix.h"
#include "extensions.h"
#if defined(USE_X86_ASM)
#include "X86/common_x86_asm.h"
#include "x86/common_x86_asm.h"
#endif
#include "simple_list.h"
#include "mm.h"

View File

@@ -6,7 +6,7 @@
#include "s3v_vb.h"
#include "s3v_lock.h"
#if defined(USE_X86_ASM)
#include "X86/common_x86_asm.h"
#include "x86/common_x86_asm.h"
#endif
#include "context.h"

View File

@@ -25,8 +25,7 @@ DRIVER_SOURCES = \
savagetex.c \
savagetris.c \
savageioctl.c \
savagespan.c \
savagedma.c
savagespan.c
C_SOURCES = \
$(COMMON_SOURCES) \

View File

@@ -341,8 +341,8 @@ typedef enum
TPS_256
} TexPaletteSize;
#define MAX_MIPMAP_LOD_BIAS 255
#define MIN_MIPMAP_LOD_BIAS -255
#define MAX_MIPMAP_LOD_BIAS 255
#define MIN_MIPMAP_LOD_BIAS -255
typedef enum
{
@@ -627,107 +627,6 @@ typedef union {
#define SAVAGE_HW_NO_UV1 ((1<<6) | (1<<7))
#define SAVAGE_HW_SKIPFLAGS 0x000000ff
#define SAVAGE_HW_TRIANGLE_TYPE (3UL<<25)
#define SAVAGE_HW_TRIANGLE_CONT (1UL<<24)
#define SAVAGE_HW_TRIANGLE_LIST (0<<25)
#define SAVAGE_HW_TRIANGLE_STRIP (1<<25)
#define SAVAGE_HW_TRIANGLE_FAN (2<<25)
#define SAVAGE_HW_QUAD (3<<25)
#define __HW_TEXTURE_CHANGED 0x00002FE
#define __HW_HAS_SCISSORS_CHANGED 0x00001800
#define __HW_ALL_CHANGED 0x1FFFFFF
/*Frank 2001/11/14 Wait commands*/
#define WAIT_3D_IDLE 0xC0010000
#define WAIT_3D_2D_IDLE 0xC0030000
#define SET_REGISTER(index, count) \
((CMD_SetRegister << 27) | (0x6000000) | ((count) << 16) | (index))
/*frank 2001/11/20 */
#define MAXLOOP 0xFFFFFF
/*#define MAXFIFO 0x7F00*/
#define MAXFIFO 0x1FF00
/* get eventtag from shadow status */
/* here we use eventTag1 because eventTag0 is used by HWXvMC*/
#define GET_EVENTTAG \
(((*(volatile GLuint *)(imesa->MMIO_BASE+0x48c04)) & 0xffff0000L)>>16)
#define SHADOW_WAIT(imesa ) do \
{ \
int loop=0; \
imesa->shadowCounter = (imesa->shadowCounter + 1) & 0xffff;\
if(imesa->shadowCounter == 0)\
imesa->shadowCounter = MAX_SHADOWCOUNTER;\
*(volatile GLuint *)imesa->BCIBase = imesa->shadowCounter | 0x98400000L;\
while(\
(GET_EVENTTAG) != imesa->shadowCounter &&\
(loop++ < MAXLOOP));\
}while(0);
#define SHADOW_WAIT_IDLE(imesa ) do \
{ \
int loop=0; \
imesa->shadowCounter = (imesa->shadowCounter + 1) & 0xffff;\
if(imesa->shadowCounter == 0)\
imesa->shadowCounter = MAX_SHADOWCOUNTER;\
/* *(volatile GLuint *)imesa->BCIBase = WAIT_3D_IDLE;\*/\
*(volatile GLuint *)imesa->BCIBase = imesa->shadowCounter | 0x98400000L;\
while ( \
(GET_EVENTTAG) != imesa->shadowCounter && \
(loop++ < MAXLOOP)); \
}while(0);
#if 0
#define ALT_STATUS_WORD0 (* (volatile GLuint *)(imesa->MMIO_BASE+0x48c60))
#define PAGE_PENDING(result) do{\
result=((ALT_STATUS_WORD0 & 0x08000000)?GL_TRUE:GL_FALSE);\
}while(0)
#define WAIT_FOR_FIFO(count) do{\
int loop = 0; \
int slots = MAXFIFO-count; \
while(((ALT_STATUS_WORD0 &0x001fffff)>slots)&&(loop++<MAXLOOP)); \
}while(0)
#define WAIT_IDLE_EMPTY do{\
int loop = 0; \
if (/*imesa->shadowStatus*/0)\
{\
SHADOW_WAIT_IDLE(imesa);\
}\
else\
{ \
while(((ALT_STATUS_WORD0 &0x00ffffff)!=0x00E00000L)&&(loop++<MAXLOOP));\
}\
}while(0)
#define WAIT_IDLE do{\
int loop = 0; \
if (imesa->shadowStatus)\
while((((*imesa->shadowPointer) & 0x0E000000L)!=0x0E000000L)&&(loop++<MAXLOOP));\
else\
while(((ALT_STATUS_WORD0 &0x00E00000)!=0x00E00000L)&&(loop++<MAXLOOP)); \
}while(0)
#endif /* 0 */
#define SAVAGE_DRAW_PRIMITIVE(count, typeandvertexSkip, isCont) \
( ((count)<<16) | (typeandvertexSkip) | (isCont | (1<<31)));
static __inline volatile GLuint * SAVAGE_GET_BCI_POINTER(savageContextPtr imesa, GLuint count)
{
WAIT_FOR_FIFO(count);
return (volatile GLuint *)(imesa->BCIBase);
}
/*use this set bci cmd now!*/
#define WRITE_CMD(buf,cmd,type) do {\
*((type*)buf)=cmd;\
buf++;\
}while(0)
#endif

View File

@@ -41,11 +41,6 @@ typedef struct {
} savageRegion, *savageRegionPtr;
typedef struct {
savageRegion front;
savageRegion back;
savageRegion depth;
savageRegion aperture;
int chipset;
int width;
int height;
@@ -53,31 +48,34 @@ typedef struct {
int cpp; /* for front and back buffers */
int zpp;
int agpMode;
unsigned int bufferSize;
#if 0
int bitsPerPixel;
#endif
unsigned int frontFormat;
unsigned int frontOffset;
unsigned int frontPitch;
unsigned int frontBitmapDesc;
unsigned int backOffset;
unsigned int backBitmapDesc;
unsigned int depthOffset;
unsigned int depthBitmapDesc;
unsigned int backPitch;
unsigned int backPitchBits;
unsigned int aperturePitch;
unsigned int textureOffset[SAVAGE_NR_TEX_HEAPS];
unsigned int textureSize[SAVAGE_NR_TEX_HEAPS];
unsigned int logTextureGranularity[SAVAGE_NR_TEX_HEAPS];
drmAddress texVirtual[SAVAGE_NR_TEX_HEAPS];
__DRIscreenPrivate *driScrnPriv;
drmBufMapPtr bufs;
int use_copy_buf;
unsigned int sarea_priv_offset;
__DRIscreenPrivate *driScrnPriv;
savageRegion aperture;
savageRegion agpTextures;
drmBufMapPtr bufs;
unsigned int sarea_priv_offset;
/* Configuration cache with default values for all contexts */
driOptionCache optionCache;
@@ -87,7 +85,6 @@ typedef struct {
#include "savagecontext.h"
extern void savageGetLock( savageContextPtr imesa, GLuint flags );
extern void savageEmitHwStateLocked( savageContextPtr imesa );
extern void savageEmitScissorValues( savageContextPtr imesa, int box_nr, int emit );
extern void savageEmitDrawingRectangle( savageContextPtr imesa );
extern void savageXMesaSetBackClipRects( savageContextPtr imesa );

View File

@@ -55,8 +55,6 @@
#include "savage_dri.h"
#include "savagedma.h"
#include "xmlpool.h"
/* Configuration
@@ -85,6 +83,8 @@ static const struct dri_debug_control debug_control[] =
{ "fall", DEBUG_FALLBACKS },
{ "api", DEBUG_VERBOSE_API },
{ "lru", DEBUG_VERBOSE_LRU },
{ "verb", DEBUG_VERBOSE_MSG },
{ "dma", DEBUG_DMA },
{ NULL, 0 }
};
#ifndef SAVAGE_DEBUG
@@ -131,7 +131,6 @@ savageInitDriver(__DRIscreenPrivate *sPriv)
savageScreenPrivate *savageScreen;
SAVAGEDRIPtr gDRIPriv = (SAVAGEDRIPtr)sPriv->pDevPriv;
/* Allocate the private area */
savageScreen = (savageScreenPrivate *)Xmalloc(sizeof(savageScreenPrivate));
if (!savageScreen)
@@ -146,23 +145,19 @@ savageInitDriver(__DRIscreenPrivate *sPriv)
savageScreen->mem=gDRIPriv->mem;
savageScreen->cpp=gDRIPriv->cpp;
savageScreen->zpp=gDRIPriv->zpp;
savageScreen->frontPitch=gDRIPriv->frontPitch;
savageScreen->frontOffset=gDRIPriv->frontOffset;
savageScreen->frontBitmapDesc = gDRIPriv->frontBitmapDesc;
savageScreen->agpMode=gDRIPriv->agpMode;
savageScreen->bufferSize=gDRIPriv->bufferSize;
if (gDRIPriv->cpp == 4)
savageScreen->frontFormat = DV_PF_8888;
else
savageScreen->frontFormat = DV_PF_565;
savageScreen->frontOffset=gDRIPriv->frontOffset;
savageScreen->backOffset = gDRIPriv->backOffset;
savageScreen->backBitmapDesc = gDRIPriv->backBitmapDesc;
savageScreen->depthOffset=gDRIPriv->depthOffset;
savageScreen->depthBitmapDesc = gDRIPriv->depthBitmapDesc;
#if 0
savageScreen->backPitch = gDRIPriv->auxPitch;
savageScreen->backPitchBits = gDRIPriv->auxPitchBits;
#endif
savageScreen->textureOffset[SAVAGE_CARD_HEAP] =
gDRIPriv->textureOffset;
savageScreen->textureSize[SAVAGE_CARD_HEAP] =
@@ -171,57 +166,32 @@ savageInitDriver(__DRIscreenPrivate *sPriv)
gDRIPriv->logTextureGranularity;
savageScreen->textureOffset[SAVAGE_AGP_HEAP] =
gDRIPriv->agpTextures.handle;
gDRIPriv->agpTextureHandle;
savageScreen->textureSize[SAVAGE_AGP_HEAP] =
gDRIPriv->agpTextures.size;
gDRIPriv->agpTextureSize;
savageScreen->logTextureGranularity[SAVAGE_AGP_HEAP] =
gDRIPriv->logAgpTextureGranularity;
savageScreen->back.handle = gDRIPriv->backbuffer;
savageScreen->back.size = gDRIPriv->backbufferSize;
savageScreen->back.map =
(drmAddress)(((unsigned int)sPriv->pFB)+gDRIPriv->backOffset);
savageScreen->depth.handle = gDRIPriv->depthbuffer;
savageScreen->depth.size = gDRIPriv->depthbufferSize;
savageScreen->depth.map =
(drmAddress)(((unsigned int)sPriv->pFB)+gDRIPriv->depthOffset);
savageScreen->sarea_priv_offset = gDRIPriv->sarea_priv_offset;
savageScreen->agpTextures.handle = gDRIPriv->agpTextureHandle;
savageScreen->agpTextures.size = gDRIPriv->agpTextureSize;
if (drmMap(sPriv->fd,
savageScreen->agpTextures.handle,
savageScreen->agpTextures.size,
(drmAddress *)&(savageScreen->agpTextures.map)) != 0)
{
Xfree(savageScreen);
sPriv->private = NULL;
return GL_FALSE;
}
savageScreen->texVirtual[SAVAGE_CARD_HEAP] =
(drmAddress)(((unsigned int)sPriv->pFB)+gDRIPriv->textureOffset);
if (drmMap(sPriv->fd,
gDRIPriv->registers.handle,
gDRIPriv->registers.size,
(drmAddress *)&(gDRIPriv->registers.map)) != 0)
{
Xfree(savageScreen);
sPriv->private = NULL;
return GL_FALSE;
}
if (drmMap(sPriv->fd,
gDRIPriv->agpTextures.handle,
gDRIPriv->agpTextures.size,
(drmAddress *)&(gDRIPriv->agpTextures.map)) != 0)
{
Xfree(savageScreen);
sPriv->private = NULL;
return GL_FALSE;
}
/* agp texture*/
savageScreen->texVirtual[SAVAGE_AGP_HEAP] =
(drmAddress)(gDRIPriv->agpTextures.map);
(drmAddress)(savageScreen->agpTextures.map);
gDRIPriv->BCIcmdBuf.map = (drmAddress *)
((unsigned int)gDRIPriv->registers.map+0x00010000);
savageScreen->aperture.handle = gDRIPriv->aperture.handle;
savageScreen->aperture.size = gDRIPriv->aperture.size;
savageScreen->aperture.handle = gDRIPriv->apertureHandle;
savageScreen->aperture.size = gDRIPriv->apertureSize;
savageScreen->aperturePitch = gDRIPriv->aperturePitch;
if (drmMap(sPriv->fd,
savageScreen->aperture.handle,
savageScreen->aperture.size,
@@ -230,8 +200,12 @@ savageInitDriver(__DRIscreenPrivate *sPriv)
Xfree(savageScreen);
sPriv->private = NULL;
return GL_FALSE;
}
}
savageScreen->bufs = drmMapBufs(sPriv->fd);
savageScreen->sarea_priv_offset = gDRIPriv->sarea_priv_offset;
/* parse information in __driConfigOptions */
driParseOptionInfo (&savageScreen->optionCache,
__driConfigOptions, __driNConfigOptions);
@@ -251,6 +225,8 @@ savageDestroyScreen(__DRIscreenPrivate *sPriv)
{
savageScreenPrivate *savageScreen = (savageScreenPrivate *)sPriv->private;
drmUnmapBufs(savageScreen->bufs);
/* free all option information */
driDestroyOptionInfo (&savageScreen->optionCache);
@@ -295,7 +271,6 @@ savageCreateContext( const __GLcontextModes *mesaVis,
savageContextPtr imesa;
__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
struct dd_function_table functions;
SAVAGEDRIPtr gDRIPriv = (SAVAGEDRIPtr)sPriv->pDevPriv;
savageScreenPrivate *savageScreen = (savageScreenPrivate *)sPriv->private;
drm_savage_sarea_t *saPriv=(drm_savage_sarea_t *)(((char*)sPriv->pSAREA)+
savageScreen->sarea_priv_offset);
@@ -323,6 +298,12 @@ savageCreateContext( const __GLcontextModes *mesaVis,
}
driContextPriv->driverPrivate = imesa;
imesa->cmdBuf.size = SAVAGE_CMDBUF_SIZE;
imesa->cmdBuf.base = imesa->cmdBuf.write =
malloc(SAVAGE_CMDBUF_SIZE * sizeof(drm_savage_cmd_header_t));
if (!imesa->cmdBuf.base)
return GL_FALSE;
/* Parse configuration files */
driParseConfigFiles (&imesa->optionCache, &savageScreen->optionCache,
sPriv->myNum, "savage");
@@ -398,26 +379,14 @@ savageCreateContext( const __GLcontextModes *mesaVis,
/* DMA buffer */
/*The shadow pointer*/
imesa->shadowPointer =
(volatile GLuint *)((((GLuint)(&saPriv->shadow_status)) + 31) & 0xffffffe0L) ;
/* here we use eventTag1 because eventTag0 is used by HWXvMC*/
imesa->eventTag1 = (volatile GLuint *)(imesa->shadowPointer + 6);
/* imesa->eventTag1=(volatile GLuint *)(imesa->MMIO_BASE+0x48c04);*/
imesa->shadowCounter = MAX_SHADOWCOUNTER;
imesa->shadowStatus = GL_TRUE;/*Will judge by 2d message */
imesa->MMIO_BASE = (GLuint)gDRIPriv->registers.map;
imesa->BCIBase= (GLuint)gDRIPriv->BCIcmdBuf.map;
for(i=0;i<5;i++)
{
imesa->apertureBase[i] = ((GLuint)savageScreen->aperture.map +
0x01000000 * i );
}
imesa->aperturePitch = gDRIPriv->aperturePitch;
imesa->aperturePitch = savageScreen->aperturePitch;
/* change texHeap initialize to support two kind of texture heap*/
/* here is some parts of initialization, others in InitDriver() */
@@ -440,7 +409,17 @@ savageCreateContext( const __GLcontextModes *mesaVis,
imesa->depth_scale = (imesa->savageScreen->zpp == 2) ?
(1.0F/0x10000):(1.0F/0x1000000);
imesa->vertex_dma_buffer = NULL;
imesa->bufferSize = savageScreen->bufferSize;
imesa->dmaVtxBuf.total = 0;
imesa->dmaVtxBuf.used = 0;
imesa->dmaVtxBuf.flushed = 0;
imesa->clientVtxBuf.total = 16384;
imesa->clientVtxBuf.used = 0;
imesa->clientVtxBuf.flushed = 0;
imesa->clientVtxBuf.buf = (u_int32_t *)malloc(16384*4);
imesa->vtxBuf = &imesa->clientVtxBuf;
/* Uninitialized vertex format. Force setting the vertex state in
* savageRenderStart.
@@ -450,6 +429,7 @@ savageCreateContext( const __GLcontextModes *mesaVis,
/* Utah stuff
*/
imesa->new_state = ~0;
imesa->new_gl_state = ~0;
imesa->RenderIndex = ~0;
imesa->dirty = ~0;
imesa->lostContext = GL_TRUE;
@@ -483,8 +463,6 @@ savageCreateContext( const __GLcontextModes *mesaVis,
ctx->DriverCtx = (void *) imesa;
imesa->glCtx = ctx;
if (savageDMAInit(imesa) == GL_FALSE)
return GL_FALSE;
#ifndef SAVAGE_DEBUG
SAVAGE_DEBUG = driParseDebugString( getenv( "SAVAGE_DEBUG" ),
@@ -501,8 +479,7 @@ savageCreateContext( const __GLcontextModes *mesaVis,
savageDDInitState( imesa );
if (driQueryOptionb(&imesa->optionCache, "no_rast"))
FALLBACK(ctx, SAVAGE_FALLBACK_NORAST, GL_TRUE);
imesa->no_rast = driQueryOptionb(&imesa->optionCache, "no_rast");
driContextPriv->driverPrivate = (void *) imesa;
@@ -529,8 +506,10 @@ savageDestroyContext(__DRIcontextPrivate *driContextPriv)
}
foreach_s (t, next_t, &(imesa->SwappedOut))
savageDestroyTexObj(imesa, t);
/*free the dma buffer*/
savageDMAClose(imesa);
free(imesa->cmdBuf.base);
free(imesa->clientVtxBuf.buf);
_swsetup_DestroyContext(imesa->glCtx );
_tnl_DestroyContext( imesa->glCtx );
_ac_DestroyContext( imesa->glCtx );
@@ -753,10 +732,13 @@ void savageGetLock( savageContextPtr imesa, GLuint flags )
* more broken than usual.
*/
if (sarea->ctxOwner != me) {
imesa->dirty |= (SAVAGE_UPLOAD_CTX |
SAVAGE_UPLOAD_CLIPRECTS |
imesa->dirty |= (SAVAGE_UPLOAD_LOCAL |
SAVAGE_UPLOAD_GLOBAL |
SAVAGE_UPLOAD_FOGTBL |
SAVAGE_UPLOAD_TEX0 |
SAVAGE_UPLOAD_TEX1);
SAVAGE_UPLOAD_TEX1 |
SAVAGE_UPLOAD_TEXGLOBAL |
SAVAGE_UPLOAD_CLIPRECTS);
imesa->lostContext = GL_TRUE;
sarea->ctxOwner = me;
}
@@ -794,8 +776,6 @@ void savageGetLock( savageContextPtr imesa, GLuint flags )
savageResetGlobalLRU( imesa , heap );
}
imesa->dirty |= SAVAGE_UPLOAD_TEX0IMAGE;
imesa->dirty |= SAVAGE_UPLOAD_TEX1IMAGE;
imesa->texAge[heap] = sarea->texAge[heap];
}
} /* end of for loop */
@@ -948,10 +928,9 @@ void * __driCreateNewScreen( __DRInativeDisplay *dpy, int scrn, __DRIscreen *psc
{
__DRIscreenPrivate *psp;
static const __DRIversion ddx_expected = { 1, 0, 0 };
static const __DRIversion ddx_expected = { 2, 0, 0 };
static const __DRIversion dri_expected = { 4, 0, 0 };
static const __DRIversion drm_expected = { 1, 0, 0 };
static const __DRIversion drm_expected = { 2, 0, 0 };
if ( ! driCheckDriDdxDrmVersions2( "Savage",
dri_version, & dri_expected,

View File

@@ -42,7 +42,6 @@ typedef struct savage_texture_object_t *savageTextureObjectPtr;
#include "tnl/t_vertex.h"
#include "savagetex.h"
#include "savagedma.h"
#include "xmlconfig.h"
@@ -69,10 +68,26 @@ typedef struct savage_texture_object_t *savageTextureObjectPtr;
#define SAVAGE_NEW_TEXTURE 0x1
#define SAVAGE_NEW_CULL 0x2
/* What needs to be changed for the current vertex dma buffer?
* This will go away!
*/
#define SAVAGE_UPLOAD_LOCAL 0x1 /* DrawLocalCtrl (S4) or
DrawCtrl and ZBufCtrl (S3D) */
#define SAVAGE_UPLOAD_TEX0 0x2 /* texture unit 0 */
#define SAVAGE_UPLOAD_TEX1 0x4 /* texture unit 1 (S4 only) */
#define SAVAGE_UPLOAD_FOGTBL 0x8 /* fog table */
#define SAVAGE_UPLOAD_GLOBAL 0x10 /* most global regs */
#define SAVAGE_UPLOAD_TEXGLOBAL 0x20 /* TexBlendColor (S4 only) */
#define SAVAGE_UPLOAD_CLIPRECTS 0x1000 /* FIXME: get rid of this */
/*define the max numer of vertex in vertex buf*/
#define SAVAGE_MAX_VERTEXS 0x10000
/* Don't make it too big. We don't want to buffer up a whole frame
* that would force the application to wait later. */
#define SAVAGE_CMDBUF_SIZE 1024
#define SAVAGE_MAX_VERTS_PENDING 1024
/* Use the templated vertex formats:
*/
#define TAG(x) savage##x
@@ -113,6 +128,18 @@ typedef void (*savage_point_func)( savageContextPtr, savageVertex * );
imesa->savageScreen->deviceID == CHIP_S3TRISTAR64CDDR )
struct savage_vtxbuf_t {
GLuint total, used, flushed; /* in 32 bit units */
GLuint idx; /* for DMA buffers */
u_int32_t *buf;
};
struct savage_cmdbuf_t {
GLuint size; /* size in qwords */
drm_savage_cmd_header_t *base; /* initial state starts here */
drm_savage_cmd_header_t *start; /* drawing/state commands start here */
drm_savage_cmd_header_t *write; /* append stuff here */
};
struct savage_context_t {
@@ -143,11 +170,12 @@ struct savage_context_t {
GLuint new_gl_state;
GLboolean ptexHack;
GLuint BCIBase;
GLuint MMIO_BASE;
/* Command buffer */
struct savage_cmdbuf_t cmdBuf;
/* DMA command buffer */
DMABuffer_t DMABuf;
/* Vertex buffers */
struct savage_vtxbuf_t dmaVtxBuf, clientVtxBuf;
struct savage_vtxbuf_t *vtxBuf;
/* aperture base */
GLuint apertureBase[5];
@@ -179,7 +207,8 @@ struct savage_context_t {
GLenum raster_primitive;
GLenum render_primitive;
GLuint DrawPrimitiveCmd;
GLuint skip;
GLubyte HwPrim;
GLuint HwVertexSize;
/* Fallback rasterization functions
@@ -194,8 +223,9 @@ struct savage_context_t {
GLuint ClearColor;
GLfloat depth_scale;
GLfloat hw_viewport[16];
/* DRI stuff */
drmBufPtr vertex_dma_buffer;
/* DRI stuff */
GLuint bufferSize;
GLuint vertsPending;
GLframebuffer *glBuffer;
@@ -225,8 +255,8 @@ struct savage_context_t {
GLuint backup_streamFIFO;
GLuint NotFirstFrame;
GLboolean inSwap;
GLuint lastSwap;
GLuint secondLastSwap;
GLuint ctxAge;
GLuint dirtyAge;
GLuint any_contend; /* throttle me harder */
@@ -235,7 +265,7 @@ struct savage_context_t {
GLboolean scissorChanged;
drm_clip_rect_t draw_rect;
drm_clip_rect_t scissor_rect;
drm_clip_rect_t tmp_boxes[2][SAVAGE_NR_SAREA_CLIPRECTS];
/*Texture aging and DMA based aging*/
unsigned int texAge[SAVAGE_NR_TEX_HEAPS];
@@ -259,16 +289,11 @@ struct savage_context_t {
GLboolean hw_stencil;
/*shadow pointer*/
volatile GLuint *shadowPointer;
volatile GLuint *eventTag1;
GLuint shadowCounter;
GLboolean shadowStatus;
/* Configuration cache
*/
driOptionCache optionCache;
int texture_depth;
GLint texture_depth;
GLboolean no_rast;
};
#define SAVAGE_CONTEXT(ctx) ((savageContextPtr)(ctx->DriverCtx))
@@ -283,6 +308,8 @@ extern int SAVAGE_DEBUG;
#define DEBUG_FALLBACKS 0x001
#define DEBUG_VERBOSE_API 0x002
#define DEBUG_VERBOSE_LRU 0x004
#define DEBUG_VERBOSE_MSG 0x008
#define DEBUG_DMA 0x010
#define TARGET_FRONT 0x0
#define TARGET_BACK 0x1

View File

@@ -38,6 +38,10 @@
#include "savagecontext.h"
#include "extensions.h"
#include "utils.h"
#define DRIVER_DATE "20050101"
/***************************************
* Mesa's Driver Functions
@@ -46,11 +50,33 @@
static const GLubyte *savageDDGetString( GLcontext *ctx, GLenum name )
{
static char *cardNames[S3_LAST] = {
"Unknown",
"Savage3D",
"Savage/MX/IX",
"Savage4",
"ProSavage",
"Twister",
"ProSavageDDR",
"SuperSavage",
"Savage2000"
};
static char buffer[128];
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
savageScreenPrivate *screen = imesa->savageScreen;
enum S3CHIPTAGS chipset = screen->chipset;
unsigned offset;
if (chipset < S3_SAVAGE3D || chipset >= S3_LAST)
chipset = S3_UNKNOWN; /* should not happen */
switch (name) {
case GL_VENDOR:
return (GLubyte *)"S3 Graphics Inc.";
case GL_RENDERER:
return (GLubyte *)"Mesa DRI SAVAGE Linux_1.1.18";
offset = driGetRendererString( buffer, cardNames[chipset], DRIVER_DATE,
screen->agpMode );
return (GLubyte *)buffer;
default:
return 0;
}

View File

@@ -30,20 +30,7 @@
#include <time.h>
#include <unistd.h>
/* Commit does not depend on whether we use real DMA or fake it via the BCI */
void savageDMACommit (savageContextPtr imesa, void *endPtr) {
DMABufferPtr dmaBuff = &imesa->DMABuf;
GLuint end = (GLuint)endPtr;
/* make sure that enough space was allocated */
assert (end <= dmaBuff->allocEnd);
dmaBuff->allocEnd = dmaBuff->end = end;
/* TODO: check commands, either here or in flush */
}
#if SAVAGE_CMD_DMA
#if 0
/* flag =
0 return -1 if no available page
1 wait until a page be available */
@@ -219,139 +206,4 @@ int savageDMAClose (savageContextPtr imesa)
return GL_TRUE;
}
#else
/* Allocate space in faked DMA buffer */
void *savageDMAAlloc (savageContextPtr imesa, GLuint size) {
DMABufferPtr dmaBuff = &imesa->DMABuf;
/* make sure that everything has been filled in and committed */
assert (dmaBuff->end == dmaBuff->allocEnd);
size *= sizeof (u_int32_t); /* size in bytes */
if (dmaBuff->end + size >= dmaBuff->buf->linear + DMA_PAGE_SIZE) {
/* need kick off */
savageDMAFlush (imesa);
}
dmaBuff->allocEnd = dmaBuff->end + size;
return (void *)dmaBuff->end;
}
/* Flush DMA buffer via BCI (faked DMA) */
void savageDMAFlush(savageContextPtr imesa) {
volatile u_int32_t* BCIbase;
DMABufferPtr dmaBuff = &imesa->DMABuf;
u_int32_t *entry;
/* make sure that everything has been filled in and committed */
assert (dmaBuff->allocEnd == dmaBuff->end);
if (dmaBuff->start == dmaBuff->end) /* no command? */
return;
/* get bci base */
BCIbase = (volatile u_int32_t *)SAVAGE_GET_BCI_POINTER(
imesa, (dmaBuff->end - dmaBuff->start) / sizeof (u_int32_t));
for (entry = (u_int32_t *)dmaBuff->start;
entry < (u_int32_t *)dmaBuff->end; ++entry)
*BCIbase = *entry;
dmaBuff->end = dmaBuff->allocEnd = dmaBuff->start;
}
/* Init faked DMA */
int savageDMAInit (savageContextPtr imesa) {
DMABufferPtr dmaBuff = &imesa->DMABuf;
drm_savage_alloc_cont_mem_t * req;
req = (drm_savage_alloc_cont_mem_t *)
malloc (sizeof(drm_savage_alloc_cont_mem_t));
if (!req)
return GL_FALSE;
req->linear = (GLuint)malloc (DMA_PAGE_SIZE);
if (!req->linear) {
free (req);
return GL_FALSE;
}
dmaBuff->buf = req;
dmaBuff->start = dmaBuff->end = dmaBuff->allocEnd = req->linear;
dmaBuff->usingPage = 0;
dmaBuff->kickFlag = GL_FALSE;
return GL_TRUE;
}
/* Close faked DMA */
int savageDMAClose (savageContextPtr imesa) {
DMABufferPtr dmaBuff = &imesa->DMABuf;
drm_savage_alloc_cont_mem_t * req = dmaBuff->buf;
free ((void *)req->linear);
free (req);
return GL_TRUE;
}
#endif
/* Faked vertex buffers
*
* This is a dirty hack, knowing that it will go away soon when real
* vertex DMA is implemented and eventually moved to the DRM.
*/
static u_int32_t vertex_data[16384]; /* 64KB */
static drmBuf vertex_buffer = {
0, /* idx */
65536, /* total = 64KB */
0, /* used */
(drmAddress)vertex_data /* address */
};
void savageFakeVertices (savageContextPtr imesa, drmBufPtr buffer) {
GLuint vertexStride = imesa->HwVertexSize; /* stride in dwords */
GLuint vertexSize = imesa->HwVertexSize; /* the real vertex size in dwords */
GLuint nVertices = buffer->used / (vertexStride*4);
u_int32_t *data = (u_int32_t*)buffer->address;
u_int32_t vertexFormat = imesa->DrawPrimitiveCmd & SAVAGE_HW_SKIPFLAGS;
GLuint i, j, left;
/* we have the monopoly on vertex buffers ;-) */
assert (buffer == &vertex_buffer);
assert (buffer->used % (vertexStride*4) == 0); /* whole vertices */
assert (nVertices % 3 == 0); /* triangle lists */
/* Flush (pseodo) DMA before accessing the BCI directly. */
savageDMAFlush(imesa);
left = nVertices;
while (left != 0) {
/* Can emit up to 255 vertices (85 triangles) with one command. */
GLuint count = left > 255 ? 255 : left;
/* Don't go through another buffering mechanism, copy to BCI
* directly. */
volatile u_int32_t *vb = SAVAGE_GET_BCI_POINTER(imesa,
count*vertexSize + 1);
WRITE_CMD (vb, SAVAGE_DRAW_PRIMITIVE(
count, SAVAGE_HW_TRIANGLE_LIST | vertexFormat, 0),
u_int32_t);
for (i = 0; i < count; ++i) {
for (j = 0; j < vertexSize; ++j)
WRITE_CMD (vb, data[j], u_int32_t);
data += vertexStride;
}
left -= count;
}
/* clear the vertex buffer for the next set of vertices */
vertex_buffer.used = 0;
}
drmBufPtr savageFakeGetBuffer (savageContextPtr imesa) {
assert (vertex_buffer.used == 0); /* has been flushed */
return &vertex_buffer;
}

View File

@@ -49,8 +49,4 @@ void savageDMAFlush (savageContextPtr imesa);
int savageDMAInit (savageContextPtr imesa);
int savageDMAClose (savageContextPtr);
/* faked implementation of vertex buffers */
void savageFakeVertices (savageContextPtr imesa, drmBufPtr buffer);
drmBufPtr savageFakeGetBuffer (savageContextPtr imesa);
#endif

View File

@@ -37,16 +37,86 @@
#include "savagecontext.h"
#include "savageioctl.h"
#include "savage_bci.h"
#include "savagedma.h"
#include "savagestate.h"
#include "drm.h"
#include <sys/ioctl.h>
#include <sys/timeb.h>
extern GLuint bcicount;
#define DEPTH_SCALE_16 ((1<<16)-1)
#define DEPTH_SCALE_24 ((1<<24)-1)
void savageGetDMABuffer( savageContextPtr imesa )
{
int idx = 0;
int size = 0;
drmDMAReq dma;
int retcode;
drmBufPtr buf;
if (SAVAGE_DEBUG & DEBUG_DMA)
fprintf(stderr, "Getting dma buffer\n");
dma.context = imesa->hHWContext;
dma.send_count = 0;
dma.send_list = NULL;
dma.send_sizes = NULL;
dma.flags = 0;
dma.request_count = 1;
dma.request_size = imesa->bufferSize;
dma.request_list = &idx;
dma.request_sizes = &size;
dma.granted_count = 0;
if (SAVAGE_DEBUG & DEBUG_DMA)
fprintf(stderr, "drmDMA (get) ctx %d count %d size 0x%x\n",
dma.context, dma.request_count,
dma.request_size);
while (1) {
retcode = drmDMA(imesa->driFd, &dma);
if (SAVAGE_DEBUG & DEBUG_DMA)
fprintf(stderr, "retcode %d sz %d idx %d count %d\n",
retcode,
dma.request_sizes[0],
dma.request_list[0],
dma.granted_count);
if (retcode == 0 &&
dma.request_sizes[0] &&
dma.granted_count)
break;
if (SAVAGE_DEBUG & DEBUG_DMA)
fprintf(stderr, "\n\nflush");
}
buf = &(imesa->savageScreen->bufs->list[idx]);
if (SAVAGE_DEBUG & DEBUG_DMA)
fprintf(stderr,
"drmDMA (get) returns size[0] 0x%x idx[0] %d\n"
"dma_buffer now: buf idx: %d size: %d used: %d addr %p\n",
dma.request_sizes[0], dma.request_list[0],
buf->idx, buf->total,
buf->used, buf->address);
imesa->dmaVtxBuf.total = buf->total / 4;
imesa->dmaVtxBuf.used = 0;
imesa->dmaVtxBuf.flushed = 0;
imesa->dmaVtxBuf.idx = buf->idx;
imesa->dmaVtxBuf.buf = (u_int32_t *)buf->address;
if (SAVAGE_DEBUG & DEBUG_DMA)
fprintf(stderr, "finished getbuffer\n");
}
#if 0
/* Still keeping this around because it demonstrates page flipping and
* automatic z-clear. */
static void savage_BCI_clear(GLcontext *ctx, drm_savage_clear_t *pclear)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
@@ -113,7 +183,7 @@ static void savage_BCI_clear(GLcontext *ctx, drm_savage_clear_t *pclear)
imesa->regs.s4.zBufCtrl.ni.frameID =
~imesa->regs.s4.zBufCtrl.ni.frameID;
imesa->dirty |= SAVAGE_UPLOAD_CTX;
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
else
{
@@ -157,8 +227,6 @@ static void savage_BCI_clear(GLcontext *ctx, drm_savage_clear_t *pclear)
savageDMAFlush (imesa);
}
struct timeb a,b;
static void savage_BCI_swap(savageContextPtr imesa)
{
int nbox = imesa->sarea->nbox;
@@ -186,7 +254,7 @@ static void savage_BCI_swap(savageContextPtr imesa)
imesa->readMap = (char *)imesa->apertureBase[imesa->toggle];
imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->backOffset>>11;
imesa->dirty |= SAVAGE_UPLOAD_CTX;
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
bciptr = SAVAGE_GET_BCI_POINTER(imesa,3);
*(bciptr) = 0x960100B0;
*(bciptr) = (imesa->savageScreen->frontOffset);
@@ -220,97 +288,113 @@ static void savage_BCI_swap(savageContextPtr imesa)
}
}
#endif
static GLboolean intersect_rect( drm_clip_rect_t *out,
const drm_clip_rect_t *a,
const drm_clip_rect_t *b )
{
*out = *a;
if (b->x1 > out->x1) out->x1 = b->x1;
if (b->y1 > out->y1) out->y1 = b->y1;
if (b->x2 < out->x2) out->x2 = b->x2;
if (b->y2 < out->y2) out->y2 = b->y2;
return ((out->x1 < out->x2) && (out->y1 < out->y2));
}
static GLuint savageIntersectClipRects(drm_clip_rect_t *dest,
const drm_clip_rect_t *src,
GLuint nsrc,
const drm_clip_rect_t *clip)
{
GLuint i, ndest;
for (i = 0, ndest = 0; i < nsrc; ++i, ++src) {
if (intersect_rect(dest, src, clip)) {
dest++;
ndest++;
}
}
return ndest;
}
static void savageDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
GLint cx, GLint cy, GLint cw, GLint ch )
{
savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
__DRIdrawablePrivate *dPriv = imesa->driDrawable;
const GLuint colorMask = *((GLuint *) &ctx->Color.ColorMask);
drm_savage_clear_t clear;
int i;
GLuint colorMask, depthMask, clearColor, clearDepth, flags;
clear.flags = 0;
clear.clear_color = imesa->ClearColor;
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
fprintf (stderr, "%s\n", __FUNCTION__);
clearColor = imesa->ClearColor;
if(imesa->savageScreen->zpp == 2)
clear.clear_depth = (GLuint) (ctx->Depth.Clear * DEPTH_SCALE_16);
clearDepth = (GLuint) (ctx->Depth.Clear * DEPTH_SCALE_16);
else
clear.clear_depth = (GLuint) (ctx->Depth.Clear * DEPTH_SCALE_24);
clearDepth = (GLuint) (ctx->Depth.Clear * DEPTH_SCALE_24);
FLUSH_BATCH( imesa );
colorMask = *((GLuint *) &ctx->Color.ColorMask);
depthMask = 0;
if ((mask & DD_FRONT_LEFT_BIT) && ((colorMask&0xffffffUL)==0xffffffUL) ){
clear.flags |= SAVAGE_FRONT;
flags = 0;
if (mask & DD_FRONT_LEFT_BIT) {
flags |= SAVAGE_FRONT;
mask &= ~DD_FRONT_LEFT_BIT;
}
if ((mask & DD_BACK_LEFT_BIT) && ((colorMask&0xffffffUL)==0xffffffUL) ) {
clear.flags |= SAVAGE_BACK;
if (mask & DD_BACK_LEFT_BIT) {
flags |= SAVAGE_BACK;
mask &= ~DD_BACK_LEFT_BIT;
}
if ((mask & DD_DEPTH_BIT) && ctx->Depth.Mask) {
clear.flags |= SAVAGE_DEPTH;
flags |= SAVAGE_DEPTH;
depthMask |=
(imesa->savageScreen->zpp == 2) ? 0xffffffff : 0x00ffffff;
mask &= ~DD_DEPTH_BIT;
}
if((mask & DD_STENCIL_BIT) && imesa->hw_stencil)
{
clear.flags |= SAVAGE_STENCIL;
mask &= ~DD_STENCIL_BIT;
flags |= SAVAGE_DEPTH;
depthMask |= 0xff000000;
mask &= ~DD_STENCIL_BIT;
}
if (clear.flags) {
LOCK_HARDWARE( imesa );
savageFlushVertices(imesa);
/* flip top to bottom */
cy = dPriv->h-cy-ch;
cx += imesa->drawX;
cy += imesa->drawY;
for (i = 0 ; i < imesa->numClipRects ; ) {
int nr = MIN2(i + SAVAGE_NR_SAREA_CLIPRECTS, imesa->numClipRects);
drm_clip_rect_t *box = imesa->pClipRects;
drm_clip_rect_t *b = imesa->sarea->boxes;
int n = 0;
if (!all) {
for ( ; i < nr ; i++) {
GLint x = box[i].x1;
GLint y = box[i].y1;
GLint w = box[i].x2 - x;
GLint h = box[i].y2 - y;
if (x < cx) w -= cx - x, x = cx;
if (y < cy) h -= cy - y, y = cy;
if (x + w > cx + cw) w = cx + cw - x;
if (y + h > cy + ch) h = cy + ch - y;
if (w <= 0) continue;
if (h <= 0) continue;
b->x1 = x;
b->y1 = y;
b->x2 = x + w;
b->y2 = y + h;
b++;
n++;
}
} else {
for ( ; i < nr ; i++) {
*b++ = *(drm_clip_rect_t *)&box[i];
n++;
}
}
imesa->sarea->nbox = n;
savage_BCI_clear(ctx,&clear);
if (flags) {
GLboolean depthCleared = GL_FALSE;
if (flags & (SAVAGE_FRONT|SAVAGE_BACK)) {
drm_savage_cmd_header_t *cmd;
cmd = savageAllocCmdBuf(imesa, sizeof(drm_savage_cmd_header_t));
cmd[0].clear0.cmd = SAVAGE_CMD_CLEAR;
if ((flags & SAVAGE_DEPTH) &&
clearDepth == clearColor && depthMask == colorMask) {
cmd[0].clear0.flags = flags;
depthCleared = GL_TRUE;
} else
cmd[0].clear0.flags = flags & (SAVAGE_FRONT|SAVAGE_BACK);
cmd[1].clear1.mask = colorMask;
cmd[1].clear1.value = clearColor;
}
UNLOCK_HARDWARE( imesa );
imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS|SAVAGE_UPLOAD_CTX;
if ((flags & SAVAGE_DEPTH) && !depthCleared) {
drm_savage_cmd_header_t *cmd;
cmd = savageAllocCmdBuf(imesa, sizeof(drm_savage_cmd_header_t));
cmd[0].clear0.cmd = SAVAGE_CMD_CLEAR;
cmd[0].clear0.flags = SAVAGE_DEPTH;
cmd[1].clear1.mask = depthMask;
cmd[1].clear1.value = clearDepth;
}
imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS;
}
if (mask)
@@ -318,7 +402,11 @@ static void savageDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
}
/* This is necessary as to prevent annyoing stuttering effects with
* some games, though it does reduce the frame rate (glxgears)
* slightly. I believe this is due to texture uploads which do not go
* through the Savage command pipeline yet. */
#define SYNC_FRAMES 1
/*
* Copy the back buffer to the front buffer.
@@ -326,11 +414,9 @@ static void savageDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
void savageSwapBuffers( __DRIdrawablePrivate *dPriv )
{
savageContextPtr imesa;
drm_clip_rect_t *pbox;
int nbox;
int i;
GLboolean pending;
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
fprintf (stderr, "%s\n================================\n", __FUNCTION__);
assert(dPriv);
assert(dPriv->driContextPriv);
@@ -342,38 +428,30 @@ void savageSwapBuffers( __DRIdrawablePrivate *dPriv )
FLUSH_BATCH(imesa);
LOCK_HARDWARE( imesa );
WAIT_IDLE_EMPTY;
PAGE_PENDING(pending);
#if SYNC_FRAMES
imesa->lastSwap = savageEmitEvent( imesa, 0 );
#endif
if (imesa->lastSwap != 0)
savageWaitEvent( imesa, imesa->lastSwap );
if(!pending)
{
pbox = dPriv->pClipRects;
nbox = dPriv->numClipRects;
for (i = 0 ; i < nbox ; )
{
int nr = MIN2(i + SAVAGE_NR_SAREA_CLIPRECTS, dPriv->numClipRects);
drm_clip_rect_t *b = (drm_clip_rect_t *)imesa->sarea->boxes;
imesa->sarea->nbox = nr - i;
for ( ; i < nr ; i++)
*b++ = pbox[i];
savage_BCI_swap(imesa) ;
drm_savage_cmd_header_t *cmd = savageAllocCmdBuf(imesa, 0);
cmd->cmd.cmd = SAVAGE_CMD_SWAP;
imesa->inSwap = GL_TRUE; /* ignore scissors in savageFlushCmdBuf */
savageFlushCmdBuf(imesa, GL_FALSE);
imesa->inSwap = GL_FALSE;
}
}
UNLOCK_HARDWARE( imesa );
#if !SYNC_FRAMES
imesa->lastSwap = savageEmitEvent( imesa, 0 );
#endif
}
/* This waits for *everybody* to finish rendering -- overkill.
*/
void savageDmaFinish( savageContextPtr imesa )
{
savageDMAFlush(imesa);
WAIT_IDLE_EMPTY;
savageWaitEvent( imesa, savageEmitEventLocked( imesa, SAVAGE_WAIT_3D ) );
}
@@ -393,152 +471,189 @@ void savageWaitAge( savageContextPtr imesa, int age )
}
void savageFlushVerticesLocked( savageContextPtr imesa )
unsigned int savageEmitEventLocked( savageContextPtr imesa, unsigned int flags )
{
drmBufPtr buffer = imesa->vertex_dma_buffer;
drm_savage_event_emit_t event;
int ret;
event.count = 0;
event.flags = flags;
ret = drmCommandWriteRead( imesa->driFd, DRM_SAVAGE_BCI_EVENT_EMIT,
&event, sizeof(event) );
if (ret) {
fprintf (stderr, "emit event returned %d\n", ret);
exit (1);
}
return event.count;
}
unsigned int savageEmitEvent( savageContextPtr imesa, unsigned int flags )
{
unsigned int ret;
LOCK_HARDWARE( imesa );
ret = savageEmitEventLocked( imesa, flags );
UNLOCK_HARDWARE( imesa );
return ret;
}
if (!buffer)
return;
imesa->vertex_dma_buffer = NULL;
/* Lot's of stuff to do here. For now there is a fake DMA implementation
* in savagedma.c that emits drawing commands. Cliprects are not handled
* yet. */
if (buffer->used) {
/* State must be updated "per primitive" because hardware
* culling must be disabled for unfilled primitives, points
* and lines. */
savageEmitHwStateLocked (imesa);
savageFakeVertices (imesa, buffer);
void savageWaitEvent( savageContextPtr imesa, unsigned int count )
{
drm_savage_event_wait_t event;
int ret;
event.count = count;
event.flags = 0;
ret = drmCommandWriteRead( imesa->driFd, DRM_SAVAGE_BCI_EVENT_WAIT,
&event, sizeof(event) );
if (ret) {
fprintf (stderr, "wait event returned %d\n", ret);
exit (1);
}
}
void savageFlushVertices( savageContextPtr imesa )
void savageFlushVertices( savageContextPtr imesa )
{
struct savage_vtxbuf_t *buffer = imesa->vtxBuf;
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
fprintf (stderr, "%s\n", __FUNCTION__);
if (!buffer->total)
return;
if (buffer->used > buffer->flushed) {
drm_savage_cmd_header_t *cmd;
/* State must be updated "per primitive" because hardware
* culling must be disabled for unfilled primitives, points
* and lines. */
savageEmitChangedState (imesa);
cmd = savageAllocCmdBuf(imesa, 0);
cmd->prim.cmd = buffer == &imesa->dmaVtxBuf ?
SAVAGE_CMD_DMA_PRIM : SAVAGE_CMD_VB_PRIM;
cmd->prim.prim = imesa->HwPrim;
cmd->prim.skip = imesa->skip;
cmd->prim.start = buffer->flushed / imesa->HwVertexSize;
cmd->prim.count = buffer->used / imesa->HwVertexSize - cmd->prim.start;
buffer->flushed = buffer->used;
/* Make sure we don't buffer too many vertices without
* telling the hardware. */
imesa->vertsPending += cmd->prim.count;
if (imesa->vertsPending > SAVAGE_MAX_VERTS_PENDING) {
savageFlushCmdBuf(imesa, GL_FALSE);
imesa->vertsPending = 0;
}
}
}
void savageFlushCmdBufLocked( savageContextPtr imesa, GLboolean discard )
{
__DRIdrawablePrivate *dPriv = imesa->driDrawable;
drm_savage_cmdbuf_t cmdbuf;
drm_savage_cmd_header_t *start;
int ret;
/* If we lost the context we must restore the initial state (at
* the start of the command buffer). */
if (imesa->lostContext) {
start = imesa->cmdBuf.base;
imesa->lostContext = GL_FALSE;
} else
start = imesa->cmdBuf.start;
if (!imesa->dmaVtxBuf.total)
discard = GL_FALSE;
if ((SAVAGE_DEBUG & DEBUG_DMA) && discard)
fprintf (stderr, "Discarding DMA buffer, used=%u\n",
imesa->dmaVtxBuf.used);
cmdbuf.dma_idx = imesa->dmaVtxBuf.idx;
cmdbuf.discard = discard;
cmdbuf.vb_addr = imesa->clientVtxBuf.buf;
cmdbuf.vb_size = imesa->clientVtxBuf.total*4;
cmdbuf.vb_stride = imesa->HwVertexSize;
cmdbuf.cmd_addr = start;
cmdbuf.size = (imesa->cmdBuf.write - start);
if (!imesa->inSwap && imesa->glCtx->Scissor.Enabled) {
drm_clip_rect_t *box = dPriv->pClipRects, *ibox;
GLuint nbox = dPriv->numClipRects, nibox;
ibox = malloc(dPriv->numClipRects*sizeof(drm_clip_rect_t));
if (!ibox) {
fprintf(stderr, "Out of memory.\n");
exit(1);
}
nibox = savageIntersectClipRects(ibox, box, nbox, &imesa->scissor_rect);
cmdbuf.nbox = nibox;
cmdbuf.box_addr = ibox;
} else {
cmdbuf.nbox = dPriv->numClipRects;
cmdbuf.box_addr = dPriv->pClipRects;
}
ret = drmCommandWrite( imesa->driFd, DRM_SAVAGE_BCI_CMDBUF,
&cmdbuf, sizeof(cmdbuf) );
if (ret) {
fprintf (stderr, "cmdbuf ioctl returned %d\n", ret);
exit(1);
}
if (cmdbuf.box_addr != dPriv->pClipRects) {
free(cmdbuf.box_addr);
}
if (discard) {
imesa->dmaVtxBuf.total = 0;
imesa->dmaVtxBuf.used = 0;
imesa->dmaVtxBuf.flushed = 0;
}
imesa->clientVtxBuf.used = 0;
imesa->clientVtxBuf.flushed = 0;
imesa->cmdBuf.write = imesa->cmdBuf.base;
/* Save the current state at the start of the command buffer. That
* state will only be emitted, if the context was lost since the
* last command buffer. */
savageEmitOldState(imesa);
imesa->cmdBuf.start = imesa->cmdBuf.write;
}
void savageFlushCmdBuf( savageContextPtr imesa, GLboolean discard )
{
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
fprintf (stderr, "%s\n", __FUNCTION__);
LOCK_HARDWARE(imesa);
savageFlushVerticesLocked (imesa);
savageFlushCmdBufLocked (imesa, discard);
UNLOCK_HARDWARE(imesa);
}
int savage_check_copy(int fd)
{
return 0;
}
static void savageDDFlush( GLcontext *ctx )
{
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
fprintf (stderr, "%s\n", __FUNCTION__);
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
savageFlushVertices (imesa);
LOCK_HARDWARE(imesa);
savageFlushVerticesLocked (imesa);
savageDMAFlush (imesa);
savageFlushCmdBufLocked(imesa, GL_FALSE);
UNLOCK_HARDWARE(imesa);
}
static void savageDDFinish( GLcontext *ctx )
{
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
fprintf (stderr, "%s\n", __FUNCTION__);
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
savageFlushVertices (imesa);
LOCK_HARDWARE(imesa);
savageFlushVerticesLocked (imesa);
savageFlushCmdBufLocked(imesa, GL_FALSE);
savageDmaFinish (imesa);
UNLOCK_HARDWARE(imesa);
}
#define ALT_STATUS_WORD0 (* (volatile GLuint *)(imesa->MMIO_BASE+0x48c60))
#define STATUS_WORD0 (* (volatile GLuint *)(imesa->MMIO_BASE+0x48c00))
#define MAXFIFO_S4 0x7F00
#define MAXFIFO_S3D 0x7F00
static GLboolean savagePagePending_s4( savageContextPtr imesa ) {
return (ALT_STATUS_WORD0 & 0x08000000) ? GL_TRUE : GL_FALSE;
}
static GLboolean savagePagePending_s3d( savageContextPtr imesa ) {
return GL_FALSE;
}
static void savageWaitForFIFO_s4( savageContextPtr imesa, unsigned count ) {
int loop = 0;
int slots = MAXFIFO_S4-count;
while((ALT_STATUS_WORD0 & 0x001fffff) > slots && loop++ < MAXLOOP);
}
static void savageWaitForFIFO_s3d( savageContextPtr imesa, unsigned count ) {
int loop = 0;
int slots = MAXFIFO_S3D-count;
while((STATUS_WORD0 & 0x0001ffff) > slots && loop++ < MAXLOOP);
}
static void savageWaitIdleEmpty_s4( savageContextPtr imesa ) {
int loop = 0;
while((ALT_STATUS_WORD0 & 0x00ffffff) != 0x00E00000L && loop++ < MAXLOOP);
}
static void savageWaitIdleEmpty_s3d( savageContextPtr imesa ) {
int loop = 0;
while((STATUS_WORD0 & 0x000fffff) != 0x000E0000L && loop++ < MAXLOOP);
}
GLboolean (*savagePagePending)( savageContextPtr imesa ) = NULL;
void (*savageWaitForFIFO)( savageContextPtr imesa, unsigned count ) = NULL;
void (*savageWaitIdleEmpty)( savageContextPtr imesa ) = NULL;
void savageDDInitIoctlFuncs( GLcontext *ctx )
{
ctx->Driver.Clear = savageDDClear;
ctx->Driver.Flush = savageDDFlush;
ctx->Driver.Finish = savageDDFinish;
if (SAVAGE_CONTEXT( ctx )->savageScreen->chipset >= S3_SAVAGE4) {
savagePagePending = savagePagePending_s4;
savageWaitForFIFO = savageWaitForFIFO_s4;
savageWaitIdleEmpty = savageWaitIdleEmpty_s4;
} else {
savagePagePending = savagePagePending_s3d;
savageWaitForFIFO = savageWaitForFIFO_s3d;
savageWaitIdleEmpty = savageWaitIdleEmpty_s3d;
}
}
#if SAVAGE_CMD_DMA
/* Alloc a continuous memory */
/* return: 0 error when kernel alloc pages(can try a half memory size)
>0 sucess
<0 Other error*/
int savageAllocDMABuffer(savageContextPtr imesa, drm_savage_alloc_cont_mem_t *req)
{
int ret;
if (req ==NULL)
return 0;
if ((ret=ioctl(imesa->driFd, DRM_IOCTL_SAVAGE_ALLOC_CONTINUOUS_MEM, req)) <=0)
return ret;
return 1;
}
/* get the physics address*/
GLuint savageGetPhyAddress(savageContextPtr imesa,void * pointer)
{
drm_savage_get_physcis_address_t req;
int ret;
req.v_address = (GLuint )pointer;
ret = ioctl(imesa->driFd, DRM_IOCTL_SAVAGE_GET_PHYSICS_ADDRESS,&req);
return req.p_address;
}
/* free the buffer got by savageAllocDMABuffe*/
int savageFreeDMABuffer(savageContextPtr imesa, drm_savage_alloc_cont_mem_t *req)
{
GLuint ret;
if (req ==NULL)
return 0;
if ((ret=ioctl(imesa->driFd, DRM_IOCTL_SAVAGE_FREE_CONTINUOUS_MEM, req)) <=0)
return ret;
return 1;
}
#endif

View File

@@ -27,17 +27,22 @@
#define SAVAGE_IOCTL_H
#include "savagecontext.h"
#include "savagedma.h"
void savageGetGeneralDmaBufferLocked( savageContextPtr mmesa );
void savageFlushVertices( savageContextPtr mmesa );
void savageFlushVerticesLocked( savageContextPtr mmesa );
void savageFlushGeneralLocked( savageContextPtr imesa );
void savageWaitAgeLocked( savageContextPtr imesa, int age );
void savageWaitAge( savageContextPtr imesa, int age );
unsigned int savageEmitEventLocked( savageContextPtr imesa, unsigned int flags );
unsigned int savageEmitEvent( savageContextPtr imesa, unsigned int flags );
void savageWaitEvent( savageContextPtr imesa, unsigned int event);
void savageFlushCmdBufLocked( savageContextPtr imesa, GLboolean discard );
void savageFlushCmdBuf( savageContextPtr imesa, GLboolean discard );
void savageDmaFinish( savageContextPtr imesa );
void savageRegetLockQuiescent( savageContextPtr imesa );
@@ -46,54 +51,69 @@ void savageDDInitIoctlFuncs( GLcontext *ctx );
void savageSwapBuffers( __DRIdrawablePrivate *dPriv );
int savage_check_copy(int fd);
extern GLboolean (*savagePagePending)( savageContextPtr imesa );
extern void (*savageWaitForFIFO)( savageContextPtr imesa, unsigned count );
extern void (*savageWaitIdleEmpty)( savageContextPtr imesa );
#define PAGE_PENDING(result) do { \
result = savagePagePending(imesa); \
} while (0)
#define WAIT_FOR_FIFO(count) do { \
savageWaitForFIFO(imesa, count); \
} while (0)
#define WAIT_IDLE_EMPTY do { \
savageWaitIdleEmpty(imesa); \
savageWaitEvent(imesa, \
savageEmitEvent(imesa, SAVAGE_WAIT_3D|SAVAGE_WAIT_2D)); \
} while (0)
#if SAVAGE_CMD_DMA
int savageAllocDMABuffer(savageContextPtr imesa, drm_savage_alloc_cont_mem_t *req);
GLuint savageGetPhyAddress(savageContextPtr imesa,void * pointer);
int savageFreeDMABuffer(savageContextPtr, drm_savage_alloc_cont_mem_t*);
#endif
#define FLUSH_BATCH(imesa) do { \
if (imesa->vertex_dma_buffer) savageFlushVertices(imesa); \
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG) \
fprintf (stderr, "FLUSH_BATCH in %s\n", __FUNCTION__); \
savageFlushVertices(imesa); \
savageFlushCmdBuf(imesa, GL_FALSE); \
} while (0)
extern void savageGetDMABuffer( savageContextPtr imesa );
static __inline
u_int32_t *savageAllocDmaLow( savageContextPtr imesa, GLuint bytes )
u_int32_t *savageAllocVtxBuf( savageContextPtr imesa, GLuint words )
{
struct savage_vtxbuf_t *buffer = imesa->vtxBuf;
u_int32_t *head;
if (!imesa->vertex_dma_buffer) {
LOCK_HARDWARE(imesa);
imesa->vertex_dma_buffer = savageFakeGetBuffer (imesa);
UNLOCK_HARDWARE(imesa);
} else if (imesa->vertex_dma_buffer->used + bytes >
imesa->vertex_dma_buffer->total) {
LOCK_HARDWARE(imesa);
savageFlushVerticesLocked( imesa );
imesa->vertex_dma_buffer = savageFakeGetBuffer (imesa);
UNLOCK_HARDWARE(imesa);
if (buffer == &imesa->dmaVtxBuf) {
if (!buffer->total) {
LOCK_HARDWARE(imesa);
savageGetDMABuffer(imesa);
UNLOCK_HARDWARE(imesa);
} else if (buffer->used + words > buffer->total) {
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
fprintf (stderr, "... flushing DMA buffer in %s\n",
__FUNCTION__);
savageFlushVertices( imesa );
LOCK_HARDWARE(imesa);
savageFlushCmdBufLocked(imesa, GL_TRUE); /* discard DMA buffer */
savageGetDMABuffer(imesa);
UNLOCK_HARDWARE(imesa);
}
} else if (buffer->used + words > buffer->total) {
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
fprintf (stderr, "... flushing client vertex buffer in %s\n",
__FUNCTION__);
savageFlushVertices( imesa );
LOCK_HARDWARE(imesa);
savageFlushCmdBufLocked(imesa, GL_FALSE); /* free clientVtxBuf */
UNLOCK_HARDWARE(imesa);
}
head = (u_int32_t *)((u_int8_t *)imesa->vertex_dma_buffer->address +
imesa->vertex_dma_buffer->used);
head = &buffer->buf[buffer->used];
imesa->vertex_dma_buffer->used += bytes;
buffer->used += words;
return head;
}
static __inline
drm_savage_cmd_header_t *savageAllocCmdBuf( savageContextPtr imesa, GLuint bytes )
{
drm_savage_cmd_header_t *ret;
GLuint qwords = ((bytes + 7) >> 3) + 1; /* round up */
assert (qwords < imesa->cmdBuf.size);
if (imesa->cmdBuf.write - imesa->cmdBuf.base + qwords > imesa->cmdBuf.size) {
savageFlushCmdBuf(imesa, GL_FALSE);
}
ret = (drm_savage_cmd_header_t *)imesa->cmdBuf.write;
imesa->cmdBuf.write += qwords;
return ret;
}
#endif

View File

@@ -33,6 +33,7 @@
#define DBG 0
#define LOCAL_VARS \
savageContextPtr imesa = SAVAGE_CONTEXT(ctx); \
__DRIdrawablePrivate *dPriv = imesa->mesa_drawable; \
savageScreenPrivate *savageScreen = imesa->savageScreen; \
GLuint cpp = savageScreen->cpp; \
@@ -48,6 +49,7 @@
(void) read_buf; (void) buf; (void) p
#define LOCAL_DEPTH_VARS \
savageContextPtr imesa = SAVAGE_CONTEXT(ctx); \
__DRIdrawablePrivate *dPriv = imesa->mesa_drawable; \
savageScreenPrivate *savageScreen = imesa->savageScreen; \
GLuint zpp = savageScreen->zpp; \
@@ -77,8 +79,7 @@
#define Y_FLIP(_y) (height - _y - 1)
#define HW_LOCK() savageContextPtr imesa = SAVAGE_CONTEXT(ctx); \
WAIT_IDLE_EMPTY;\
#define HW_LOCK()
#define HW_CLIPLOOP() \
do { \
@@ -95,11 +96,7 @@
} \
} while (0)
#if 0
#define HW_UNLOCK() \
UNLOCK_HARDWARE(imesa);
#endif
#define HW_UNLOCK() { }
#define HW_UNLOCK()
/* 16 bit, 565 rgb color spanline and pixel functions
@@ -164,55 +161,47 @@ do { \
/* 16 bit depthbuffer functions.
*/
#define WRITE_DEPTH( _x, _y, d ) \
do{ \
*(GLushort *)(buf + (_x<<1) + _y*pitch) = d; \
}while(0)
*(GLushort *)(buf + ((_x)<<1) + (_y)*pitch) = d
#define READ_DEPTH( d, _x, _y ) \
do{ \
d = *(GLushort *)(buf + (_x<<1) + _y*pitch); \
}while(0)
/* d = 0xffff; */
d = *(GLushort *)(buf + ((_x)<<1) + (_y)*pitch)
#define TAG(x) savage##x##_16
#include "depthtmp.h"
/* 8-bit stencil /24-bit depth depthbuffer functions.
*/
#define WRITE_DEPTH( _x, _y, d ) { \
GLuint tmp = *(GLuint *)(buf + (_x<<2) + _y*pitch); \
tmp &= 0xFF000000; \
tmp |= d; \
#define WRITE_DEPTH( _x, _y, d ) do { \
GLuint tmp = *(GLuint *)(buf + ((_x)<<2) + (_y)*pitch); \
tmp &= 0xFF000000; \
tmp |= d; \
*(GLuint *)(buf + (_x<<2) + _y*pitch) = tmp; \
}
} while(0)
#define READ_DEPTH( d, _x, _y ) \
d = *(GLuint *)(buf + (_x<<2) + _y*pitch) & 0x00FFFFFF;
/* d = 0x00ffffff; */
d = *(GLuint *)(buf + ((_x)<<2) + (_y)*pitch)
#define TAG(x) savage##x##_8_24
#include "depthtmp.h"
#define WRITE_STENCIL( _x, _y, d ) { \
GLuint tmp = *(GLuint *)(buf + (_x<<2) + _y*pitch); \
tmp &= 0x00FFFFFF; \
tmp |= (((GLuint)d)<<24) & 0xFF000000; \
*(GLuint *)(buf + (_x<<2) + _y*pitch) = tmp; \
}
#define READ_STENCIL( d, _x, _y ) \
d = (GLstencil)((*(GLuint *)(buf + (_x<<2) + _y*pitch) & 0xFF000000) >> 24);
#define WRITE_STENCIL( _x, _y, d ) do { \
GLuint tmp = *(GLuint *)(buf + ((_x)<<2) + (_y)*pitch); \
tmp &= 0x00FFFFFF; \
tmp |= (((GLuint)d)<<24) & 0xFF000000; \
*(GLuint *)(buf + ((_x)<<2) + (_y)*pitch) = tmp; \
} while(0)
#define READ_STENCIL( d, _x, _y ) \
d = (GLstencil)((*(GLuint *)(buf + ((_x)<<2) + (_y)*pitch) & 0xFF000000) >> 24)
#define TAG(x) savage##x##_8_24
#include "stenciltmp.h"
/*
* This function is called to specify which buffer to read and write
@@ -241,6 +230,58 @@ static void savageDDSetBuffer(GLcontext *ctx, GLframebuffer *buffer,
? imesa->driDrawable : imesa->driReadable;
}
/*
* Wrappers around _swrast_Copy/Draw/ReadPixels that make sure all
* primitives are flushed and the hardware is idle before accessing
* the frame buffer.
*/
static void
savageCopyPixels( GLcontext *ctx,
GLint srcx, GLint srcy, GLsizei width, GLsizei height,
GLint destx, GLint desty,
GLenum type )
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
FLUSH_BATCH(imesa);
WAIT_IDLE_EMPTY;
_swrast_CopyPixels(ctx, srcx, srcy, width, height, destx, desty, type);
}
static void
savageDrawPixels( GLcontext *ctx,
GLint x, GLint y,
GLsizei width, GLsizei height,
GLenum format, GLenum type,
const struct gl_pixelstore_attrib *packing,
const GLvoid *pixels )
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
FLUSH_BATCH(imesa);
WAIT_IDLE_EMPTY;
_swrast_DrawPixels(ctx, x, y, width, height, format, type, packing, pixels);
}
static void
savageReadPixels( GLcontext *ctx,
GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type,
const struct gl_pixelstore_attrib *packing,
GLvoid *pixels )
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
FLUSH_BATCH(imesa);
WAIT_IDLE_EMPTY;
_swrast_ReadPixels(ctx, x, y, width, height, format, type, packing, pixels);
}
/*
* Make sure the hardware is idle when span-rendering.
*/
static void savageSpanRenderStart( GLcontext *ctx )
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
FLUSH_BATCH(imesa);
WAIT_IDLE_EMPTY;
}
void savageDDInitSpanFuncs( GLcontext *ctx )
{
@@ -277,6 +318,7 @@ void savageDDInitSpanFuncs( GLcontext *ctx )
case 2:
swdd->ReadDepthSpan = savageReadDepthSpan_16;
swdd->WriteDepthSpan = savageWriteDepthSpan_16;
swdd->WriteMonoDepthSpan = savageWriteMonoDepthSpan_16;
swdd->ReadDepthPixels = savageReadDepthPixels_16;
swdd->WriteDepthPixels = savageWriteDepthPixels_16;
@@ -284,6 +326,7 @@ void savageDDInitSpanFuncs( GLcontext *ctx )
case 4:
swdd->ReadDepthSpan = savageReadDepthSpan_8_24;
swdd->WriteDepthSpan = savageWriteDepthSpan_8_24;
swdd->WriteMonoDepthSpan = savageWriteMonoDepthSpan_8_24;
swdd->ReadDepthPixels = savageReadDepthPixels_8_24;
swdd->WriteDepthPixels = savageWriteDepthPixels_8_24;
swdd->ReadStencilSpan = savageReadStencilSpan_8_24;
@@ -301,11 +344,13 @@ void savageDDInitSpanFuncs( GLcontext *ctx )
swdd->ReadCI32Span =NULL;
swdd->ReadCI32Pixels =NULL;
swdd->SpanRenderStart = savageSpanRenderStart;
/* Pixel path fallbacks.
*/
ctx->Driver.Accum = _swrast_Accum;
ctx->Driver.Bitmap = _swrast_Bitmap;
ctx->Driver.CopyPixels = _swrast_CopyPixels;
ctx->Driver.DrawPixels = _swrast_DrawPixels;
ctx->Driver.ReadPixels = _swrast_ReadPixels;
ctx->Driver.CopyPixels = savageCopyPixels;
ctx->Driver.DrawPixels = savageDrawPixels;
ctx->Driver.ReadPixels = savageReadPixels;
}

View File

@@ -69,16 +69,10 @@ static __inline__ GLuint savagePackColor(GLuint format,
static void savageDDAlphaFunc_s4(GLcontext *ctx, GLenum func, GLfloat ref)
{
/* This can be done in BlendFunc*/
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
imesa->dirty |= SAVAGE_UPLOAD_CTX;
savageBlendFunc_s4(ctx);
}
static void savageDDAlphaFunc_s3d(GLcontext *ctx, GLenum func, GLfloat ref)
{
/* This can be done in BlendFunc*/
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
imesa->dirty |= SAVAGE_UPLOAD_CTX;
savageBlendFunc_s3d(ctx);
}
@@ -103,6 +97,9 @@ static void savageDDBlendEquationSeparate(GLcontext *ctx,
static void savageBlendFunc_s4(GLcontext *ctx)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
u_int32_t drawLocalCtrl = imesa->regs.s4.drawLocalCtrl.ui;
u_int32_t drawCtrl0 = imesa->regs.s4.drawCtrl0.ui;
u_int32_t drawCtrl1 = imesa->regs.s4.drawCtrl1.ui;
/* set up draw control register (including blending, alpha
* test, and shading model)
@@ -266,11 +263,17 @@ static void savageBlendFunc_s4(GLcontext *ctx)
/*imesa->regs.s4.drawLocalCtrl.ni.zUpdateEn =
~drawLocalCtrl.ni.wrZafterAlphaTst;*/
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (drawLocalCtrl != imesa->regs.s4.drawLocalCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
if (drawCtrl0 != imesa->regs.s4.drawCtrl0.ui ||
drawCtrl1 != imesa->regs.s4.drawCtrl1.ui)
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
static void savageBlendFunc_s3d(GLcontext *ctx)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
u_int32_t drawCtrl = imesa->regs.s3d.drawCtrl.ui;
u_int32_t zBufCtrl = imesa->regs.s3d.zBufCtrl.ui;
/* set up draw control register (including blending, alpha
* test, dithering, and shading model)
@@ -432,7 +435,9 @@ static void savageBlendFunc_s3d(GLcontext *ctx)
imesa->regs.s3d.zBufCtrl.ni.wrZafterAlphaTst =
imesa->regs.s3d.drawCtrl.ni.alphaTestEn;
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (drawCtrl != imesa->regs.s3d.drawCtrl.ui ||
zBufCtrl != imesa->regs.s3d.zBufCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
}
static void savageDDBlendFuncSeparate_s4( GLcontext *ctx, GLenum sfactorRGB,
@@ -456,7 +461,9 @@ static void savageDDDepthFunc_s4(GLcontext *ctx, GLenum func)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
ZCmpFunc zmode;
#define depthIndex 0
u_int32_t drawLocalCtrl = imesa->regs.s4.drawLocalCtrl.ui;
u_int32_t zBufCtrl = imesa->regs.s4.zBufCtrl.ui;
u_int32_t zWatermarks = imesa->regs.s4.zWatermarks.ui; /* FIXME: in DRM */
/* set up z-buffer control register (global)
* set up z-buffer offset register (global)
@@ -513,14 +520,20 @@ static void savageDDDepthFunc_s4(GLcontext *ctx, GLenum func)
imesa->regs.s4.drawLocalCtrl.ni.flushPdZbufWrites = GL_FALSE;
imesa->regs.s4.zWatermarks.ni.wLow = 8;
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (drawLocalCtrl != imesa->regs.s4.drawLocalCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
if (zBufCtrl != imesa->regs.s4.zBufCtrl.ui ||
zWatermarks != imesa->regs.s4.zWatermarks.ui)
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
static void savageDDDepthFunc_s3d(GLcontext *ctx, GLenum func)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
ZCmpFunc zmode;
#define depthIndex 0
u_int32_t drawCtrl = imesa->regs.s3d.drawCtrl.ui;
u_int32_t zBufCtrl = imesa->regs.s3d.zBufCtrl.ui;
u_int32_t zWatermarks = imesa->regs.s3d.zWatermarks.ui; /* FIXME: in DRM */
/* set up z-buffer control register (global)
* set up z-buffer offset register (global)
@@ -565,14 +578,18 @@ static void savageDDDepthFunc_s3d(GLcontext *ctx, GLenum func)
imesa->regs.s3d.zWatermarks.ni.wLow = 8;
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (drawCtrl != imesa->regs.s3d.drawCtrl.ui ||
zBufCtrl != imesa->regs.s3d.zBufCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
if (zWatermarks != imesa->regs.s3d.zWatermarks.ui)
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
static void savageDDDepthMask_s4(GLcontext *ctx, GLboolean flag)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
u_int32_t drawLocalCtrl = imesa->regs.s4.drawLocalCtrl.ui;
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (flag)
{
imesa->regs.s4.drawLocalCtrl.ni.flushPdZbufWrites = GL_TRUE;
@@ -582,12 +599,15 @@ static void savageDDDepthMask_s4(GLcontext *ctx, GLboolean flag)
imesa->regs.s4.drawLocalCtrl.ni.flushPdZbufWrites = GL_FALSE;
}
savageDDDepthFunc_s4(ctx,ctx->Depth.Func);
if (drawLocalCtrl != imesa->regs.s4.drawLocalCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
}
static void savageDDDepthMask_s3d(GLcontext *ctx, GLboolean flag)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
u_int32_t drawCtrl = imesa->regs.s3d.drawCtrl.ui;
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (flag)
{
imesa->regs.s3d.drawCtrl.ni.flushPdZbufWrites = GL_TRUE;
@@ -597,6 +617,9 @@ static void savageDDDepthMask_s3d(GLcontext *ctx, GLboolean flag)
imesa->regs.s3d.drawCtrl.ni.flushPdZbufWrites = GL_FALSE;
}
savageDDDepthFunc_s3d(ctx,ctx->Depth.Func);
if (drawCtrl != imesa->regs.s3d.drawCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
}
@@ -629,6 +652,7 @@ static void savageDDScissor( GLcontext *ctx, GLint x, GLint y,
static void savageDDDrawBuffer(GLcontext *ctx, GLenum mode )
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
u_int32_t destCtrl = imesa->regs.s4.destCtrl.ui;
/*
* _DrawDestMask is easier to cope with than <mode>.
@@ -641,7 +665,6 @@ static void savageDDDrawBuffer(GLcontext *ctx, GLenum mode )
imesa->readMap = (char *)imesa->apertureBase[TARGET_FRONT];
imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->frontOffset>>11;
imesa->NotFirstFrame = GL_FALSE;
imesa->dirty |= SAVAGE_UPLOAD_BUFFERS | SAVAGE_UPLOAD_CTX;
savageXMesaSetFrontClipRects( imesa );
FALLBACK( ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_FALSE );
break;
@@ -651,7 +674,6 @@ static void savageDDDrawBuffer(GLcontext *ctx, GLenum mode )
imesa->readMap = (char *)imesa->apertureBase[TARGET_BACK];
imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->backOffset>>11;
imesa->NotFirstFrame = GL_FALSE;
imesa->dirty |= SAVAGE_UPLOAD_BUFFERS | SAVAGE_UPLOAD_CTX;
savageXMesaSetBackClipRects( imesa );
FALLBACK( ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_FALSE );
break;
@@ -664,6 +686,9 @@ static void savageDDDrawBuffer(GLcontext *ctx, GLenum mode )
* gets called.
*/
_swrast_DrawBuffer(ctx, mode);
if (destCtrl != imesa->regs.s4.destCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
static void savageDDReadBuffer(GLcontext *ctx, GLenum mode )
@@ -800,12 +825,12 @@ static void savageUpdateCull( GLcontext *ctx )
if (imesa->savageScreen->chipset >= S3_SAVAGE4) {
if (imesa->regs.s4.drawCtrl1.ni.cullMode != cullMode) {
imesa->regs.s4.drawCtrl1.ni.cullMode = cullMode;
imesa->dirty |= SAVAGE_UPLOAD_CTX;
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
} else {
if (imesa->regs.s3d.drawCtrl.ni.cullMode != cullMode) {
imesa->regs.s3d.drawCtrl.ni.cullMode = cullMode;
imesa->dirty |= SAVAGE_UPLOAD_CTX;
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
}
}
#endif /* end #if HW_CULL */
@@ -846,7 +871,7 @@ static void savageDDColorMask_s4(GLcontext *ctx,
{
imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn = GL_FALSE;
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
/* TODO: need a software fallback */
}
static void savageDDColorMask_s3d(GLcontext *ctx,
@@ -873,7 +898,7 @@ static void savageDDColorMask_s3d(GLcontext *ctx,
{
imesa->regs.s3d.zBufCtrl.ni.drawUpdateEn = GL_FALSE;
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
/* TODO: need a software fallback */
}
@@ -886,6 +911,7 @@ static void savageDDColorMask_s3d(GLcontext *ctx,
*/
static void savageUpdateSpecular_s4(GLcontext *ctx) {
savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
u_int32_t drawLocalCtrl = imesa->regs.s4.drawLocalCtrl.ui;
if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR &&
ctx->Light.Enabled) {
@@ -895,10 +921,13 @@ static void savageUpdateSpecular_s4(GLcontext *ctx) {
imesa->regs.s4.drawLocalCtrl.ni.specShadeEn = GL_FALSE;
/*FALLBACK (ctx, SAVAGE_FALLBACK_SPECULAR, GL_FALSE);*/
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (drawLocalCtrl != imesa->regs.s4.drawLocalCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
}
static void savageUpdateSpecular_s3d(GLcontext *ctx) {
savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
u_int32_t drawCtrl = imesa->regs.s3d.drawCtrl.ui;
if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR &&
ctx->Light.Enabled) {
@@ -908,7 +937,9 @@ static void savageUpdateSpecular_s3d(GLcontext *ctx) {
imesa->regs.s3d.drawCtrl.ni.specShadeEn = GL_FALSE;
/*FALLBACK (ctx, SAVAGE_FALLBACK_SPECULAR, GL_FALSE);*/
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (drawCtrl != imesa->regs.s3d.drawCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
}
static void savageDDLightModelfv_s4(GLcontext *ctx, GLenum pname,
@@ -925,6 +956,7 @@ static void savageDDLightModelfv_s3d(GLcontext *ctx, GLenum pname,
static void savageDDShadeModel_s4(GLcontext *ctx, GLuint mod)
{
savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
u_int32_t drawLocalCtrl = imesa->regs.s4.drawLocalCtrl.ui;
if (mod == GL_SMOOTH)
{
@@ -934,11 +966,14 @@ static void savageDDShadeModel_s4(GLcontext *ctx, GLuint mod)
{
imesa->regs.s4.drawLocalCtrl.ni.flatShadeEn = GL_TRUE;
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (drawLocalCtrl != imesa->regs.s4.drawLocalCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
}
static void savageDDShadeModel_s3d(GLcontext *ctx, GLuint mod)
{
savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
u_int32_t drawCtrl = imesa->regs.s3d.drawCtrl.ui;
if (mod == GL_SMOOTH)
{
@@ -948,7 +983,9 @@ static void savageDDShadeModel_s3d(GLcontext *ctx, GLuint mod)
{
imesa->regs.s3d.drawCtrl.ni.flatShadeEn = GL_TRUE;
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (drawCtrl != imesa->regs.s3d.drawCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
}
@@ -962,6 +999,7 @@ static void savageDDFogfv(GLcontext *ctx, GLenum pname, const GLfloat *param)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
GLuint fogClr;
u_int32_t fogCtrl = imesa->regs.s4.fogCtrl.ui;
/*if ((ctx->Fog.Enabled) &&(pname == GL_FOG_COLOR))*/
if (ctx->Fog.Enabled)
@@ -981,17 +1019,19 @@ static void savageDDFogfv(GLcontext *ctx, GLenum pname, const GLfloat *param)
imesa->regs.s4.fogCtrl.ni.fogEn = 0;
imesa->regs.s4.fogCtrl.ni.fogMode = 0;
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (fogCtrl != imesa->regs.s4.fogCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
static void savageStencilFunc(GLcontext *);
static void savageDDStencilFunc(GLcontext *ctx, GLenum func, GLint ref,
GLuint mask)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
SCmpFunc a=0;
u_int32_t zBufCtrl = imesa->regs.s4.zBufCtrl.ui;
u_int32_t stencilCtrl = imesa->regs.s4.stencilCtrl.ui;
imesa->regs.s4.zBufCtrl.ni.stencilRefVal = ctx->Stencil.Ref[0];
imesa->regs.s4.stencilCtrl.ni.readMask = ctx->Stencil.ValueMask[0];
@@ -1012,22 +1052,26 @@ static void savageDDStencilFunc(GLcontext *ctx, GLenum func, GLint ref,
imesa->regs.s4.stencilCtrl.ni.cmpFunc = a;
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (zBufCtrl != imesa->regs.s4.zBufCtrl.ui ||
stencilCtrl != imesa->regs.s4.stencilCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
static void savageDDStencilMask(GLcontext *ctx, GLuint mask)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
imesa->regs.s4.stencilCtrl.ni.writeMask = ctx->Stencil.WriteMask[0];
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (imesa->regs.s4.stencilCtrl.ni.writeMask != ctx->Stencil.WriteMask[0]) {
imesa->regs.s4.stencilCtrl.ni.writeMask = ctx->Stencil.WriteMask[0];
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
}
static void savageDDStencilOp(GLcontext *ctx, GLenum fail, GLenum zfail,
GLenum zpass)
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
u_int32_t stencilCtrl = imesa->regs.s4.stencilCtrl.ui;
switch (ctx->Stencil.FailFunc[0])
{
@@ -1114,7 +1158,8 @@ static void savageDDStencilOp(GLcontext *ctx, GLenum fail, GLenum zfail,
break;
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (stencilCtrl != imesa->regs.s4.stencilCtrl.ui)
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
}
@@ -1128,11 +1173,9 @@ static void savageDDEnable_s4(GLcontext *ctx, GLenum cap, GLboolean state)
switch(cap) {
case GL_ALPHA_TEST:
/* we should consider the disable case*/
imesa->dirty |= SAVAGE_UPLOAD_CTX;
savageBlendFunc_s4(ctx);
break;
case GL_BLEND:
imesa->dirty |= SAVAGE_UPLOAD_CTX;
/*Can't find Enable bit in the 3D registers.*/
/* For some reason enable(GL_BLEND) affects ColorLogicOpEnabled.
*/
@@ -1146,7 +1189,6 @@ static void savageDDEnable_s4(GLcontext *ctx, GLenum cap, GLboolean state)
savageBlendFunc_s4(ctx);
break;
case GL_DEPTH_TEST:
imesa->dirty |= SAVAGE_UPLOAD_CTX;
savageDDDepthFunc_s4(ctx,ctx->Depth.Func);
break;
case GL_SCISSOR_TEST:
@@ -1154,7 +1196,6 @@ static void savageDDEnable_s4(GLcontext *ctx, GLenum cap, GLboolean state)
imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS;
break;
case GL_STENCIL_TEST:
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (!imesa->hw_stencil)
FALLBACK (ctx, SAVAGE_FALLBACK_STENCIL, state);
else {
@@ -1167,11 +1208,10 @@ static void savageDDEnable_s4(GLcontext *ctx, GLenum cap, GLboolean state)
imesa->regs.s4.zBufCtrl.ni.zBufEn = GL_TRUE;
imesa->regs.s4.drawLocalCtrl.ni.zUpdateEn = GL_FALSE;
}
imesa->dirty |= SAVAGE_UPLOAD_CTX;
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL | SAVAGE_UPLOAD_LOCAL;
}
break;
case GL_FOG:
imesa->dirty |= SAVAGE_UPLOAD_CTX;
savageDDFogfv(ctx,0,0);
break;
case GL_CULL_FACE:
@@ -1188,7 +1228,6 @@ static void savageDDEnable_s4(GLcontext *ctx, GLenum cap, GLboolean state)
#endif
break;
case GL_DITHER:
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (state)
{
if ( ctx->Color.DitherFlag )
@@ -1200,6 +1239,7 @@ static void savageDDEnable_s4(GLcontext *ctx, GLenum cap, GLboolean state)
{
imesa->regs.s4.drawCtrl1.ni.ditherEn=GL_FALSE;
}
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
break;
case GL_LIGHTING:
@@ -1223,11 +1263,9 @@ static void savageDDEnable_s3d(GLcontext *ctx, GLenum cap, GLboolean state)
switch(cap) {
case GL_ALPHA_TEST:
/* we should consider the disable case*/
imesa->dirty |= SAVAGE_UPLOAD_CTX;
savageBlendFunc_s3d(ctx);
break;
case GL_BLEND:
imesa->dirty |= SAVAGE_UPLOAD_CTX;
/*Can't find Enable bit in the 3D registers.*/
/* For some reason enable(GL_BLEND) affects ColorLogicOpEnabled.
*/
@@ -1241,7 +1279,6 @@ static void savageDDEnable_s3d(GLcontext *ctx, GLenum cap, GLboolean state)
savageBlendFunc_s3d(ctx);
break;
case GL_DEPTH_TEST:
imesa->dirty |= SAVAGE_UPLOAD_CTX;
savageDDDepthFunc_s3d(ctx,ctx->Depth.Func);
break;
case GL_SCISSOR_TEST:
@@ -1252,7 +1289,6 @@ static void savageDDEnable_s3d(GLcontext *ctx, GLenum cap, GLboolean state)
FALLBACK (ctx, SAVAGE_FALLBACK_STENCIL, state);
break;
case GL_FOG:
imesa->dirty |= SAVAGE_UPLOAD_CTX;
savageDDFogfv(ctx,0,0);
break;
case GL_CULL_FACE:
@@ -1269,7 +1305,6 @@ static void savageDDEnable_s3d(GLcontext *ctx, GLenum cap, GLboolean state)
#endif
break;
case GL_DITHER:
imesa->dirty |= SAVAGE_UPLOAD_CTX;
if (state)
{
if ( ctx->Color.DitherFlag )
@@ -1281,6 +1316,7 @@ static void savageDDEnable_s3d(GLcontext *ctx, GLenum cap, GLboolean state)
{
imesa->regs.s3d.drawCtrl.ni.ditherEn=GL_FALSE;
}
imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
break;
case GL_LIGHTING:
@@ -1303,8 +1339,7 @@ void savageDDUpdateHwState( GLcontext *ctx )
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
if (imesa->new_state) {
FLUSH_BATCH(imesa);
savageFlushVertices(imesa);
if (imesa->new_state & SAVAGE_NEW_TEXTURE) {
savageUpdateTextureState( ctx );
}
@@ -1368,20 +1403,20 @@ void savageEmitDrawingRectangle( savageContextPtr imesa )
imesa->regs.ni.changed.ni.fDrawCtrl1Changed=GL_TRUE;*/
savageCalcViewport (imesa->glCtx);
imesa->dirty |= SAVAGE_UPLOAD_BUFFERS;
}
static void savageDDPrintDirty( const char *msg, GLuint state )
{
fprintf(stderr, "%s (0x%x): %s%s%s%s%s\n",
fprintf(stderr, "%s (0x%x): %s%s%s%s%s%s%s\n",
msg,
(unsigned int) state,
(state & SAVAGE_UPLOAD_TEX0IMAGE) ? "upload-tex0, " : "",
(state & SAVAGE_UPLOAD_TEX1IMAGE) ? "upload-tex1, " : "",
(state & SAVAGE_UPLOAD_CTX) ? "upload-ctx, " : "",
(state & SAVAGE_UPLOAD_BUFFERS) ? "upload-bufs, " : "",
(state & SAVAGE_UPLOAD_LOCAL) ? "upload-local, " : "",
(state & SAVAGE_UPLOAD_TEX0) ? "upload-tex0, " : "",
(state & SAVAGE_UPLOAD_TEX1) ? "upload-tex1, " : "",
(state & SAVAGE_UPLOAD_FOGTBL) ? "upload-fogtbl, " : "",
(state & SAVAGE_UPLOAD_GLOBAL) ? "upload-global, " : "",
(state & SAVAGE_UPLOAD_TEXGLOBAL) ? "upload-texglobal, " : "",
(state & SAVAGE_UPLOAD_CLIPRECTS) ? "upload-cliprects, " : ""
);
}
@@ -1400,18 +1435,32 @@ static GLboolean savageGlobalRegChanged (savageContextPtr imesa,
}
return GL_FALSE;
}
static void savageEmitOldRegs (savageContextPtr imesa,
GLuint first, GLuint last, GLboolean global) {
GLuint n = last-first+1;
drm_savage_cmd_header_t *cmd = savageAllocCmdBuf(imesa, n*4);
cmd->state.cmd = SAVAGE_CMD_STATE;
cmd->state.global = global;
cmd->state.count = n;
cmd->state.start = first;
memcpy(cmd+1, &imesa->oldRegs.ui[first-SAVAGE_FIRST_REG], n*4);
}
static void savageEmitContiguousRegs (savageContextPtr imesa,
GLuint first, GLuint last) {
GLuint i;
u_int32_t *pBCIBase;
pBCIBase = savageDMAAlloc (imesa, last - first + 2);
WRITE_CMD (pBCIBase, SET_REGISTER(first, last - first + 1), u_int32_t);
for (i = first - SAVAGE_FIRST_REG; i <= last - SAVAGE_FIRST_REG; ++i) {
WRITE_CMD (pBCIBase, imesa->regs.ui[i], u_int32_t);
GLuint n = last-first+1;
drm_savage_cmd_header_t *cmd = savageAllocCmdBuf(imesa, n*4);
cmd->state.cmd = SAVAGE_CMD_STATE;
cmd->state.global = savageGlobalRegChanged(imesa, first, last);
cmd->state.count = n;
cmd->state.start = first;
memcpy(cmd+1, &imesa->regs.ui[first-SAVAGE_FIRST_REG], n*4);
/* savageAllocCmdBuf may need to flush the cmd buffer and backup
* the current hardware state. It should see the "old" (current)
* state that has actually been emitted to the hardware. Therefore
* this update is done *after* savageAllocCmdBuf. */
for (i = first - SAVAGE_FIRST_REG; i <= last - SAVAGE_FIRST_REG; ++i)
imesa->oldRegs.ui[i] = imesa->regs.ui[i];
}
savageDMACommit (imesa, pBCIBase);
}
static void savageEmitChangedRegs (savageContextPtr imesa,
GLuint first, GLuint last) {
@@ -1445,8 +1494,6 @@ static void savageEmitChangedRegChunk (savageContextPtr imesa,
}
static void savageUpdateRegister_s4(savageContextPtr imesa)
{
u_int32_t *pBCIBase;
/*
* Scissors updates drawctrl0 and drawctrl 1
*/
@@ -1470,23 +1517,12 @@ static void savageUpdateRegister_s4(savageContextPtr imesa)
/* the savage4 uses the contiguous range of BCI registers 0x1e-0x39
* 0x1e-0x27 are local, no need to check them for global changes */
if (imesa->lostContext || savageGlobalRegChanged (imesa, 0x28, 0x39)) {
pBCIBase = savageDMAAlloc (imesa, 1);
WRITE_CMD (pBCIBase, WAIT_3D_IDLE, u_int32_t);
savageDMACommit (imesa, pBCIBase);
}
if (imesa->lostContext)
savageEmitContiguousRegs (imesa, 0x1e, 0x39);
else
savageEmitChangedRegs (imesa, 0x1e, 0x39);
savageEmitContiguousRegs (imesa, 0x1e, 0x39);
imesa->dirty=0;
imesa->lostContext = GL_FALSE;
}
static void savageUpdateRegister_s3d(savageContextPtr imesa)
{
u_int32_t *pBCIBase;
if (imesa->scissorChanged)
{
if(imesa->scissor)
@@ -1519,63 +1555,55 @@ static void savageUpdateRegister_s3d(savageContextPtr imesa)
imesa->regs.s3d.drawCtrl.ni.flushPdZbufWrites = GL_TRUE;
/* the savage3d uses two contiguous ranges of BCI registers:
* 0x18-0x1c and 0x20-0x38. The first range is local. */
if (imesa->lostContext || savageGlobalRegChanged (imesa, 0x20, 0x38)) {
pBCIBase = savageDMAAlloc (imesa, 1);
WRITE_CMD (pBCIBase, WAIT_3D_IDLE, u_int32_t);
savageDMACommit (imesa, pBCIBase);
}
* 0x18-0x1c and 0x20-0x38. Some texture registers need to be
* emitted in one chunk or we get some funky rendering errors. */
/* FIXME: watermark registers aren't programmed correctly ATM */
if (imesa->lostContext) {
savageEmitContiguousRegs (imesa, 0x18, 0x1c);
savageEmitContiguousRegs (imesa, 0x20, 0x36);
} else {
/* On the Savage IX texture registers (at least some of them)
* have to be emitted as one chunk. */
savageEmitChangedRegs (imesa, 0x18, 0x19);
savageEmitChangedRegChunk (imesa, 0x1a, 0x1c);
savageEmitChangedRegs (imesa, 0x20, 0x36);
}
savageEmitChangedRegs (imesa, 0x18, 0x19);
savageEmitChangedRegChunk (imesa, 0x1a, 0x1c);
savageEmitChangedRegs (imesa, 0x20, 0x36);
imesa->dirty=0;
imesa->lostContext = GL_FALSE;
}
void savageEmitOldState( savageContextPtr imesa )
{
assert(imesa->cmdBuf.write == imesa->cmdBuf.base);
if (imesa->savageScreen->chipset >= S3_SAVAGE4) {
savageEmitOldRegs (imesa, 0x1e, 0x39, GL_TRUE);
} else {
savageEmitOldRegs (imesa, 0x18, 0x1c, GL_TRUE);
savageEmitOldRegs (imesa, 0x20, 0x36, GL_FALSE);
}
}
/* Push the state into the sarea and/or texture memory.
*/
void savageEmitHwStateLocked( savageContextPtr imesa )
void savageEmitChangedState( savageContextPtr imesa )
{
if (SAVAGE_DEBUG & DEBUG_VERBOSE_API)
savageDDPrintDirty( "\n\n\nsavageEmitHwStateLocked", imesa->dirty );
if (imesa->dirty & ~SAVAGE_UPLOAD_CLIPRECTS)
{
if (imesa->dirty & (SAVAGE_UPLOAD_CTX | SAVAGE_UPLOAD_TEX0 | \
SAVAGE_UPLOAD_TEX1 | SAVAGE_UPLOAD_BUFFERS))
if (imesa->dirty & (SAVAGE_UPLOAD_GLOBAL | SAVAGE_UPLOAD_LOCAL |
SAVAGE_UPLOAD_TEX0 | SAVAGE_UPLOAD_TEX1 |
SAVAGE_UPLOAD_FOGTBL | SAVAGE_UPLOAD_TEXGLOBAL))
{
/*SAVAGE_STATE_COPY(imesa);*/
/* update state to hw*/
if (imesa->driDrawable &&imesa->driDrawable->numClipRects ==0 )
{
return ;
}
if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
fprintf (stderr, "... emitting state\n");
if (imesa->savageScreen->chipset >= S3_SAVAGE4)
savageUpdateRegister_s4(imesa);
else
savageUpdateRegister_s3d(imesa);
}
imesa->sarea->dirty |= (imesa->dirty &
~(SAVAGE_UPLOAD_TEX1|SAVAGE_UPLOAD_TEX0));
imesa->dirty &= SAVAGE_UPLOAD_CLIPRECTS;
}
}
static void savageDDInitState_s4( savageContextPtr imesa )
{
#if 1
@@ -1719,7 +1747,6 @@ static void savageDDInitState_s3d( savageContextPtr imesa )
}
void savageDDInitState( savageContextPtr imesa ) {
memset (imesa->regs.ui, 0, SAVAGE_NR_REGS*sizeof(u_int32_t));
memset (imesa->oldRegs.ui, 0, SAVAGE_NR_REGS*sizeof(u_int32_t));
memset (imesa->globalRegMask.ui, 0xff, SAVAGE_NR_REGS*sizeof(u_int32_t));
if (imesa->savageScreen->chipset >= S3_SAVAGE4)
savageDDInitState_s4 (imesa);
@@ -1789,6 +1816,13 @@ void savageDDInitState( savageContextPtr imesa ) {
imesa->readMap = (char *)imesa->apertureBase[TARGET_BACK];
}
}
memcpy (imesa->oldRegs.ui, imesa->regs.ui, SAVAGE_NR_REGS*sizeof(u_int32_t));
/* Emit the initial state to the (empty) command buffer. */
assert (imesa->cmdBuf.write == imesa->cmdBuf.base);
savageEmitOldState(imesa);
imesa->cmdBuf.start = imesa->cmdBuf.write;
}

View File

@@ -28,43 +28,13 @@
#include "savagecontext.h"
void savageEmitOldState( savageContextPtr imesa );
void savageEmitChangedState( savageContextPtr imesa );
extern void savageDDUpdateHwState( GLcontext *ctx );
extern void savageDDInitState( savageContextPtr imesa );
extern void savageDDInitStateFuncs( GLcontext *ctx );
extern void savageDDRenderStart(GLcontext *ctx);
extern void savageDDRenderEnd(GLcontext *ctx);
/*frank 2001/11/13 add macro for sarea state copy*/
#if 0
#define SAVAGE_STATE_COPY(ctx) { \
ctx->sarea->setup[0]=ctx->Registers.DrawLocalCtrl.ui; \
ctx->sarea->setup[1]=ctx->Registers.TexPalAddr.ui; \
ctx->sarea->setup[2]=ctx->Registers.TexCtrl[0].ui; \
ctx->sarea->setup[3]=ctx->Registers.TexCtrl[1].ui; \
ctx->sarea->setup[4]=ctx->Registers.TexAddr[0].ui; \
ctx->sarea->setup[5]=ctx->Registers.TexAddr[1].ui; \
ctx->sarea->setup[6]=ctx->Registers.TexBlendCtrl[0].ui; \
ctx->sarea->setup[7]=ctx->Registers.TexBlendCtrl[1].ui; \
ctx->sarea->setup[8]=ctx->Registers.TexXprClr.ui; \
ctx->sarea->setup[9]=ctx->Registers.TexDescr.ui; \
ctx->sarea->setup[10]=ctx->Registers.FogTable.ni.ulEntry[0]; \
ctx->sarea->setup[11]=ctx->Registers.FogTable.ni.ulEntry[1]; \
ctx->sarea->setup[12]=ctx->Registers.FogTable.ni.ulEntry[2]; \
ctx->sarea->setup[13]=ctx->Registers.FogTable.ni.ulEntry[3]; \
ctx->sarea->setup[14]=ctx->Registers.FogTable.ni.ulEntry[4]; \
ctx->sarea->setup[15]=ctx->Registers.FogTable.ni.ulEntry[5]; \
ctx->sarea->setup[16]=ctx->Registers.FogTable.ni.ulEntry[6]; \
ctx->sarea->setup[17]=ctx->Registers.FogTable.ni.ulEntry[7]; \
ctx->sarea->setup[18]=ctx->Registers.FogCtrl.ui; \
ctx->sarea->setup[19]=ctx->Registers.StencilCtrl.ui; \
ctx->sarea->setup[20]=ctx->Registers.ZBufCtrl.ui; \
ctx->sarea->setup[21]=ctx->Registers.ZBufOffset.ui; \
ctx->sarea->setup[22]=ctx->Registers.DestCtrl.ui; \
ctx->sarea->setup[23]=ctx->Registers.DrawCtrl0.ui; \
ctx->sarea->setup[24]=ctx->Registers.DrawCtrl1.ui; \
ctx->sarea->setup[25]=ctx->Registers.ZWatermarks.ui; \
ctx->sarea->setup[26]=ctx->Registers.DestTexWatermarks.ui; \
ctx->sarea->setup[27]=ctx->Registers.TexBlendColor.ui; \
}
#endif
#endif

View File

@@ -606,7 +606,7 @@ void savagePrintGlobalLRU( savageContextPtr imesa , GLuint heap)
{
int i, j;
drm_savage_tex_region_t *list = imesa->sarea->texList[heap];
drm_tex_region_t *list = imesa->sarea->texList[heap];
for (i = 0, j = SAVAGE_NR_TEX_REGIONS ; i < SAVAGE_NR_TEX_REGIONS ; i++) {
@@ -628,7 +628,7 @@ void savagePrintGlobalLRU( savageContextPtr imesa , GLuint heap)
void savageResetGlobalLRU( savageContextPtr imesa, GLuint heap )
{
drm_savage_tex_region_t *list = imesa->sarea->texList[heap];
drm_tex_region_t *list = imesa->sarea->texList[heap];
int sz = 1 << imesa->savageScreen->logTextureGranularity[heap];
int i;
@@ -661,7 +661,7 @@ static void savageUpdateTexLRU( savageContextPtr imesa, savageTextureObjectPtr t
int logsz = imesa->savageScreen->logTextureGranularity[heap];
int start = t->MemBlock->ofs >> logsz;
int end = (t->MemBlock->ofs + t->MemBlock->size - 1) >> logsz;
drm_savage_tex_region_t *list = imesa->sarea->texList[heap];
drm_tex_region_t *list = imesa->sarea->texList[heap];
imesa->texAge[heap] = ++imesa->sarea->texAge[heap];
@@ -787,16 +787,19 @@ int savageUploadTexImages( savageContextPtr imesa, savageTextureObjectPtr t )
ofs = t->MemBlock->ofs;
t->texParams.hwPhysAddress = imesa->savageScreen->textureOffset[heap] + ofs;
t->BufAddr = (char *)((GLuint) imesa->savageScreen->texVirtual[heap] + ofs);
imesa->dirty |= SAVAGE_UPLOAD_CTX;
imesa->dirty |= SAVAGE_UPLOAD_GLOBAL; /* FIXME: really needed? */
}
/* Let the world know we've used this memory recently.
*/
LOCK_HARDWARE(imesa);
savageUpdateTexLRU( imesa, t );
UNLOCK_HARDWARE(imesa);
if (t->dirty_images) {
savageFlushVertices (imesa);
LOCK_HARDWARE(imesa);
savageFlushVerticesLocked (imesa);
savageFlushCmdBufLocked (imesa, GL_FALSE);
savageDmaFinish (imesa);
if (SAVAGE_DEBUG & DEBUG_VERBOSE_LRU)
fprintf(stderr, "*");
@@ -1436,8 +1439,7 @@ static void savageUpdateTextureState_s4( GLcontext *ctx )
imesa->CurrentTexObj[1] = 0;
savageUpdateTex0State_s4( ctx );
savageUpdateTex1State_s4( ctx );
imesa->dirty |= (SAVAGE_UPLOAD_CTX |
SAVAGE_UPLOAD_TEX0 |
imesa->dirty |= (SAVAGE_UPLOAD_TEX0 |
SAVAGE_UPLOAD_TEX1);
}
static void savageUpdateTextureState_s3d( GLcontext *ctx )
@@ -1446,8 +1448,7 @@ static void savageUpdateTextureState_s3d( GLcontext *ctx )
if (imesa->CurrentTexObj[0]) imesa->CurrentTexObj[0]->bound &= ~1;
imesa->CurrentTexObj[0] = 0;
savageUpdateTexState_s3d( ctx );
imesa->dirty |= (SAVAGE_UPLOAD_CTX |
SAVAGE_UPLOAD_TEX0);
imesa->dirty |= (SAVAGE_UPLOAD_TEX0);
}
void savageUpdateTextureState( GLcontext *ctx)
{

View File

@@ -100,7 +100,7 @@ static void __inline__ savage_draw_triangle (savageContextPtr imesa,
savageVertexPtr v1,
savageVertexPtr v2) {
GLuint vertsize = imesa->HwVertexSize;
u_int32_t *vb = savageAllocDmaLow (imesa, 3*4*vertsize);
u_int32_t *vb = savageAllocVtxBuf (imesa, 3*vertsize);
GLuint j;
EMIT_VERT (j, vb, vertsize, 0, v0);
@@ -114,7 +114,7 @@ static void __inline__ savage_draw_quad (savageContextPtr imesa,
savageVertexPtr v2,
savageVertexPtr v3) {
GLuint vertsize = imesa->HwVertexSize;
u_int32_t *vb = savageAllocDmaLow (imesa, 6*4*vertsize);
u_int32_t *vb = savageAllocVtxBuf (imesa, 6*vertsize);
GLuint j;
EMIT_VERT (j, vb, vertsize, 0, v0);
@@ -128,7 +128,7 @@ static void __inline__ savage_draw_quad (savageContextPtr imesa,
static __inline__ void savage_draw_point (savageContextPtr imesa,
savageVertexPtr tmp) {
GLuint vertsize = imesa->HwVertexSize;
u_int32_t *vb = savageAllocDmaLow (imesa, 6*4*vertsize);
u_int32_t *vb = savageAllocVtxBuf (imesa, 6*vertsize);
const GLfloat x = tmp->v.x;
const GLfloat y = tmp->v.y;
const GLfloat sz = imesa->glCtx->Point._Size * .5;
@@ -163,7 +163,7 @@ static __inline__ void savage_draw_line (savageContextPtr imesa,
savageVertexPtr v0,
savageVertexPtr v1 ) {
GLuint vertsize = imesa->HwVertexSize;
u_int32_t *vb = savageAllocDmaLow (imesa, 6*4*vertsize);
u_int32_t *vb = savageAllocVtxBuf (imesa, 6*vertsize);
GLfloat width = imesa->glCtx->Line._Width;
GLfloat dx, dy, ix, iy;
GLuint j;
@@ -220,7 +220,7 @@ static void __inline__ savage_ptex_tri (savageContextPtr imesa,
savageVertexPtr v1,
savageVertexPtr v2) {
GLuint vertsize = imesa->HwVertexSize;
u_int32_t *vb = savageAllocDmaLow (imesa, 3*4*vertsize);
u_int32_t *vb = savageAllocVtxBuf (imesa, 3*vertsize);
savageVertex tmp;
GLuint j;
@@ -233,7 +233,7 @@ static __inline__ void savage_ptex_line (savageContextPtr imesa,
savageVertexPtr v0,
savageVertexPtr v1 ) {
GLuint vertsize = imesa->HwVertexSize;
u_int32_t *vb = savageAllocDmaLow (imesa, 6*4*vertsize);
u_int32_t *vb = savageAllocVtxBuf (imesa, 6*vertsize);
GLfloat width = imesa->glCtx->Line._Width;
GLfloat dx, dy, ix, iy;
savageVertex tmp0, tmp1;
@@ -278,7 +278,7 @@ static __inline__ void savage_ptex_line (savageContextPtr imesa,
static __inline__ void savage_ptex_point (savageContextPtr imesa,
savageVertexPtr v0) {
GLuint vertsize = imesa->HwVertexSize;
u_int32_t *vb = savageAllocDmaLow (imesa, 6*4*vertsize);
u_int32_t *vb = savageAllocVtxBuf (imesa, 6*vertsize);
const GLfloat x = v0->v.x;
const GLfloat y = v0->v.y;
const GLfloat sz = imesa->glCtx->Point._Size * .5;
@@ -428,9 +428,9 @@ do { \
savageContextPtr imesa = SAVAGE_CONTEXT(ctx); \
GLuint color[n], spec[n]; \
GLuint coloroffset = \
((imesa->DrawPrimitiveCmd & SAVAGE_HW_NO_W) ? 3 : 4); \
((imesa->skip & SAVAGE_SKIP_W) ? 3 : 4); \
GLboolean specoffset = \
((imesa->DrawPrimitiveCmd & SAVAGE_HW_NO_CS) ? 0 : coloroffset+1);\
((imesa->skip & SAVAGE_SKIP_C1) ? 0 : coloroffset+1); \
(void) color; (void) spec; (void) coloroffset; (void) specoffset;
/***********************************************************************
@@ -756,6 +756,16 @@ static void savageChooseRenderState(GLcontext *ctx)
imesa->RenderIndex = index;
}
if (imesa->savageScreen->chipset < S3_SAVAGE4 && (flags & DD_FLATSHADE)) {
if (imesa->HwPrim != SAVAGE_PRIM_TRILIST_201)
savageFlushVertices(imesa);
imesa->HwPrim = SAVAGE_PRIM_TRILIST_201;
} else {
if (imesa->HwPrim != SAVAGE_PRIM_TRILIST)
savageFlushVertices(imesa);
imesa->HwPrim = SAVAGE_PRIM_TRILIST;
}
}
/**********************************************************************/
@@ -766,6 +776,9 @@ static void savageRunPipeline( GLcontext *ctx )
{
savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
if (imesa->no_rast)
FALLBACK(ctx, SAVAGE_FALLBACK_NORAST, GL_TRUE);
if (imesa->new_state)
savageDDUpdateHwState( ctx );
@@ -777,6 +790,9 @@ static void savageRunPipeline( GLcontext *ctx )
}
_tnl_run_pipeline( ctx );
if (imesa->no_rast)
FALLBACK(ctx, SAVAGE_FALLBACK_NORAST, GL_FALSE);
}
/**********************************************************************/
@@ -858,7 +874,7 @@ do { \
imesa->vertex_attrs[imesa->vertex_attr_count].format = (STYLE); \
imesa->vertex_attr_count++; \
setupIndex |= (INDEX); \
drawCmd &= ~(SKIP); \
skip &= ~(SKIP); \
} while (0)
#define EMIT_PAD( N ) \
@@ -891,11 +907,8 @@ static void savageRenderStart( GLcontext *ctx )
struct vertex_buffer *VB = &tnl->vb;
GLuint index = tnl->render_inputs;
GLuint setupIndex = SAVAGE_EMIT_XYZ;
GLuint drawCmd = SAVAGE_HW_SKIPFLAGS;
GLubyte skip;
GLboolean ptexHack;
if (imesa->savageScreen->chipset < S3_SAVAGE4)
drawCmd &= ~SAVAGE_HW_NO_UV1;
drawCmd &= ~SAVAGE_HW_NO_Z; /* all mesa vertices have a z coordinate */
/* Check if we need to apply the ptex hack. Choose a new render
* state if necessary. (Note: this can't be done in
@@ -917,66 +930,115 @@ static void savageRenderStart( GLcontext *ctx )
VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
imesa->vertex_attr_count = 0;
/* EMIT_ATTR's must be in order as they tell t_vertex.c how to
* build up a hardware vertex.
*/
if ((index & _TNL_BITS_TEX_ANY) || !(ctx->_TriangleCaps & DD_FLATSHADE)) {
EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, SAVAGE_EMIT_W, SAVAGE_HW_NO_W );
}
else {
EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, 0, 0 );
}
if (imesa->savageScreen->chipset < S3_SAVAGE4) {
skip = SAVAGE_SKIP_ALL_S3D;
skip &= ~SAVAGE_SKIP_Z; /* all mesa vertices have a z coordinate */
/* t_context.c always includes a diffuse color */
EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA, SAVAGE_EMIT_C0, SAVAGE_HW_NO_CD );
/* EMIT_ATTR's must be in order as they tell t_vertex.c how to
* build up a hardware vertex.
*/
if ((index & _TNL_BITS_TEX_ANY) || !(ctx->_TriangleCaps & DD_FLATSHADE)) {
EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, SAVAGE_EMIT_W, SAVAGE_SKIP_W );
}
else {
EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, 0, 0 );
EMIT_PAD( 4 );
skip &= ~SAVAGE_SKIP_W;
}
/* t_context.c always includes a diffuse color */
EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA, SAVAGE_EMIT_C0, SAVAGE_SKIP_C0 );
if (index & (_TNL_BIT_COLOR1|_TNL_BIT_FOG)) {
if ((index & _TNL_BIT_COLOR1))
EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, SAVAGE_EMIT_C1, SAVAGE_HW_NO_CS );
EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, SAVAGE_EMIT_C1, SAVAGE_SKIP_C1 );
else
EMIT_PAD( 3 );
if ((index & _TNL_BIT_FOG))
EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, SAVAGE_EMIT_FOG, SAVAGE_HW_NO_CS );
EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, SAVAGE_EMIT_FOG, SAVAGE_SKIP_C1 );
else
EMIT_PAD( 1 );
}
skip &= ~SAVAGE_SKIP_C1;
if (index & _TNL_BIT_TEX(0)) {
if (ptexHack)
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_3F_XYW, SAVAGE_EMIT_STQ0, SAVAGE_HW_NO_UV0);
else if (VB->TexCoordPtr[0]->size == 4)
assert (0); /* should be caught by savageCheckPTexHack */
else if (VB->TexCoordPtr[0]->size >= 2)
/* The chromium menu emits some 3D tex coords even though no
* 3D texture is enabled. Ignore the 3rd coordinate. */
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_2F, SAVAGE_EMIT_ST0, SAVAGE_HW_NO_UV0 );
if (index & _TNL_BIT_TEX(0)) {
if (ptexHack)
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_3F_XYW, SAVAGE_EMIT_STQ0, SAVAGE_SKIP_ST0);
else if (VB->TexCoordPtr[0]->size == 4)
assert (0); /* should be caught by savageCheckPTexHack */
else if (VB->TexCoordPtr[0]->size >= 2)
/* The chromium menu emits some 3D tex coords even though no
* 3D texture is enabled. Ignore the 3rd coordinate. */
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_2F, SAVAGE_EMIT_ST0, SAVAGE_SKIP_ST0 );
else if (VB->TexCoordPtr[0]->size == 1) {
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_1F, SAVAGE_EMIT_S0, SAVAGE_SKIP_S0 );
EMIT_PAD( 4 );
} else
EMIT_PAD( 8 );
} else
EMIT_PAD( 8 );
skip &= ~SAVAGE_SKIP_ST0;
} else {
skip = SAVAGE_SKIP_ALL_S4;
skip &= ~SAVAGE_SKIP_Z; /* all mesa vertices have a z coordinate */
/* EMIT_ATTR's must be in order as they tell t_vertex.c how to
* build up a hardware vertex.
*/
if ((index & _TNL_BITS_TEX_ANY) || !(ctx->_TriangleCaps & DD_FLATSHADE))
EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, SAVAGE_EMIT_W, SAVAGE_SKIP_W );
else
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_1F, SAVAGE_EMIT_S0, SAVAGE_HW_NO_U0 );
}
if (index & _TNL_BIT_TEX(1)) {
if (VB->TexCoordPtr[1]->size == 4)
/* Projective textures are not supported by the hardware */
assert (0); /* should be caught by savageCheckPTexHack */
else if (VB->TexCoordPtr[1]->size >= 2)
EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_2F, SAVAGE_EMIT_ST1, SAVAGE_HW_NO_UV1 );
else
EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_1F, SAVAGE_EMIT_S1, SAVAGE_HW_NO_U1 );
EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, 0, 0 );
/* t_context.c always includes a diffuse color */
EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA, SAVAGE_EMIT_C0, SAVAGE_SKIP_C0 );
if (index & (_TNL_BIT_COLOR1|_TNL_BIT_FOG)) {
if ((index & _TNL_BIT_COLOR1))
EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, SAVAGE_EMIT_C1, SAVAGE_SKIP_C1 );
else
EMIT_PAD( 3 );
if ((index & _TNL_BIT_FOG))
EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, SAVAGE_EMIT_FOG, SAVAGE_SKIP_C1 );
else
EMIT_PAD( 1 );
}
if (index & _TNL_BIT_TEX(0)) {
if (ptexHack)
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_3F_XYW, SAVAGE_EMIT_STQ0, SAVAGE_SKIP_ST0);
else if (VB->TexCoordPtr[0]->size == 4)
assert (0); /* should be caught by savageCheckPTexHack */
else if (VB->TexCoordPtr[0]->size >= 2)
/* The chromium menu emits some 3D tex coords even though no
* 3D texture is enabled. Ignore the 3rd coordinate. */
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_2F, SAVAGE_EMIT_ST0, SAVAGE_SKIP_ST0 );
else
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_1F, SAVAGE_EMIT_S0, SAVAGE_SKIP_S0 );
}
if (index & _TNL_BIT_TEX(1)) {
if (VB->TexCoordPtr[1]->size == 4)
/* projective textures are not supported by the hardware */
assert (0); /* should be caught by savageCheckPTexHack */
else if (VB->TexCoordPtr[1]->size >= 2)
EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_2F, SAVAGE_EMIT_ST1, SAVAGE_SKIP_ST1 );
else
EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_1F, SAVAGE_EMIT_S1, SAVAGE_SKIP_S1 );
}
}
/* Need to change the vertex emit code if the SetupIndex changed or
* is set for the first time (indicated by vertex_size == 0). */
if (setupIndex != imesa->SetupIndex || imesa->vertex_size == 0) {
imesa->vertex_size =
GLuint hwVertexSize;
imesa->vertex_size =
_tnl_install_attrs( ctx,
imesa->vertex_attrs,
imesa->vertex_attr_count,
imesa->hw_viewport, 0 );
imesa->vertex_size >>= 2;
imesa->SetupIndex = setupIndex;
imesa->skip = skip;
imesa->DrawPrimitiveCmd = drawCmd;
imesa->HwVertexSize = imesa->vertex_size;
hwVertexSize = imesa->vertex_size;
if (setupIndex & SAVAGE_EMIT_Q0) {
/* The vertex setup code emits homogenous texture
* coordinates. They are converted to normal 2D coords by
@@ -984,10 +1046,28 @@ static void savageRenderStart( GLcontext *ctx )
* vertex sizes. Functions that emit vertices to the hardware
* need to use HwVertexSize, anything that manipulates the
* vertices generated by t_vertex uses vertex_size. */
imesa->HwVertexSize--;
hwVertexSize--;
assert (imesa->ptexHack);
} else
assert (!imesa->ptexHack);
if (hwVertexSize != imesa->HwVertexSize) {
/* Changing the vertex size: flush vertex and command buffer and
* discard the DMA buffer, if we were using one. */
savageFlushVertices(imesa);
savageFlushCmdBuf(imesa, GL_TRUE);
if (hwVertexSize == 8) {
if (SAVAGE_DEBUG & DEBUG_DMA)
fprintf (stderr, "Using DMA, skip=0x%02x\n", skip);
/* we can use vertex dma */
imesa->vtxBuf = &imesa->dmaVtxBuf;
} else {
if (SAVAGE_DEBUG & DEBUG_DMA)
fprintf (stderr, "Not using DMA, skip=0x%02x\n", skip);
imesa->vtxBuf = &imesa->clientVtxBuf;
}
imesa->HwVertexSize = hwVertexSize;
}
}
/* Update hardware state and get the lock */
@@ -1040,7 +1120,6 @@ void savageFallback( GLcontext *ctx, GLuint bit, GLboolean mode )
imesa->Fallback |= bit;
if (oldfallback == 0) {
/* the first fallback */
FLUSH_BATCH( imesa );
_swsetup_Wakeup( ctx );
imesa->RenderIndex = ~0;
}

View File

@@ -29,6 +29,11 @@
#include "xf86drm.h"
#include "drm.h"
/* Totals 2 Mbytes which equals 2^16 32-byte vertices divided among up
* to 32 clients. */
#define SAVAGE_NUM_BUFFERS 32
#define SAVAGE_BUFFER_SIZE (1 << 16) /* 64k */
#define SAVAGE_DEFAULT_AGP_MODE 1
#define SAVAGE_MAX_AGP_MODE 4
@@ -68,14 +73,17 @@ typedef struct _server{
unsigned int frontOffset;
unsigned int frontPitch;
unsigned int frontbufferSize;
unsigned int frontBitmapDesc;
unsigned int backOffset;
unsigned int backPitch;
unsigned int backbufferSize;
unsigned int backBitmapDesc;
unsigned int depthOffset;
unsigned int depthPitch;
unsigned int depthbufferSize;
unsigned int depthBitmapDesc;
unsigned int textureOffset;
int textureSize;
@@ -89,12 +97,7 @@ typedef struct _server{
drmRegion status;
/* AGP mappings */
#if 0
drmRegion warp;
drmRegion primary;
drmRegion buffers;
#endif
drmRegion agpTextures;
int logAgpTextureGranularity;
@@ -114,71 +117,41 @@ typedef struct {
int cpp;
int zpp;
int agpMode;
int agpMode; /* 0 for PCI cards */
unsigned int sarea_priv_offset;
unsigned int bufferSize; /* size of DMA buffers */
drm_handle_t frontbuffer;
unsigned int frontbufferSize;
unsigned int frontOffset;
unsigned int frontPitch;
unsigned int frontBitmapDesc; /*Bitmap Descriptior*/
unsigned int IsfrontTiled;
drm_handle_t backbuffer;
unsigned int backbufferSize;
unsigned int backOffset;
unsigned int backPitch;
unsigned int backBitmapDesc; /*Bitmap Descriptior*/
drm_handle_t depthbuffer;
unsigned int depthbufferSize;
unsigned int depthOffset;
unsigned int depthPitch;
unsigned int depthBitmapDesc; /*Bitmap Descriptior*/
drm_handle_t textures;
drm_handle_t xvmcSurfHandle;
unsigned int textureOffset;
unsigned int textureSize;
int logTextureGranularity;
/* Allow calculation of setup dma addresses.
*/
unsigned int agpBufferOffset;
unsigned int agpTextureOffset;
unsigned int agpTextureSize;
drmRegion agpTextures;
int logAgpTextureGranularity;
/* unsigned int mAccess;*/
drmRegion aperture;
/* Linear aperture */
drm_handle_t apertureHandle;
unsigned int apertureSize;
unsigned int aperturePitch; /* in byte */
/* Status page (probably not needed, but no harm, read-only) */
drm_handle_t statusHandle;
unsigned int statusSize;
drmRegion registers;
drmRegion BCIcmdBuf;
drmRegion status;
/* AGP textures */
drm_handle_t agpTextureHandle;
unsigned int agpTextureSize;
int logAgpTextureGranularity;
#if 0
drmRegion primary;
drmRegion buffers;
#endif
/*For shadow status*/
unsigned long sareaPhysAddr;
unsigned int sarea_priv_offset;
int shadowStatus;
/* Not sure about this one */
drm_handle_t xvmcSurfHandle; /* ? */
} SAVAGEDRIRec, *SAVAGEDRIPtr;
#endif

View File

@@ -40,7 +40,7 @@
#include "matrix.h"
#include "extensions.h"
#if defined(USE_X86_ASM)
#include "X86/common_x86_asm.h"
#include "x86/common_x86_asm.h"
#endif
#include "simple_list.h"
#include "mm.h"

View File

@@ -27,7 +27,7 @@
#include "trident_context.h"
#include "trident_lock.h"
#if defined(USE_X86_ASM)
#include "X86/common_x86_asm.h"
#include "x86/common_x86_asm.h"
#endif
#include "swrast/swrast.h"

View File

@@ -356,6 +356,7 @@ viaCreateContext(const __GLcontextModes *mesaVis,
vmesa->depth_max = (GLfloat)0xffff;
vmesa->depth_clear_mask = 0xf << 28;
vmesa->ClearDepth = 0xffff;
vmesa->polygon_offset_scale = 1.0 / vmesa->depth_max;
break;
case 24:
vmesa->hasDepth = GL_TRUE;
@@ -370,6 +371,7 @@ viaCreateContext(const __GLcontextModes *mesaVis,
vmesa->have_hw_stencil = GL_TRUE;
vmesa->stencilBits = mesaVis->stencilBits;
vmesa->stencil_clear_mask = 0x1 << 28;
vmesa->polygon_offset_scale = 2.0 / vmesa->depth_max;
break;
case 32:
vmesa->hasDepth = GL_TRUE;
@@ -380,6 +382,7 @@ viaCreateContext(const __GLcontextModes *mesaVis,
vmesa->depth_clear_mask = 0;
vmesa->ClearDepth = 0xffffffff;
vmesa->depth_clear_mask = 0xf << 28;
vmesa->polygon_offset_scale = 2.0 / vmesa->depth_max;
break;
default:
assert(0);
@@ -658,8 +661,16 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv,
(GLframebuffer *)driDrawPriv->driverPrivate,
(GLframebuffer *)driReadPriv->driverPrivate);
if (VIA_DEBUG) fprintf(stderr, "Context %d MakeCurrent\n", vmesa->hHWContext);
viaXMesaWindowMoved(vmesa);
/* These are probably needed only the first time a context is
* made current:
*/
viaXMesaWindowMoved(vmesa);
ctx->Driver.Scissor(ctx,
ctx->Scissor.X,
ctx->Scissor.Y,
ctx->Scissor.Width,
ctx->Scissor.Height);
}
else {

View File

@@ -103,6 +103,7 @@ struct via_context_t {
GLuint depth_clear_mask;
GLuint stencil_clear_mask;
GLfloat depth_max;
GLfloat polygon_offset_scale;
GLubyte *dma;
viaRegion tex;
@@ -212,6 +213,8 @@ struct via_context_t {
GLenum TexEnvImageFmt[2];
GLuint ClearColor;
GLuint ClearMask;
/* DRI stuff
*/
GLuint needClip;

View File

@@ -90,77 +90,61 @@ void viaCheckDma(viaContextPtr vmesa, GLuint bytes)
} while (0)
static void viaBlit(viaContextPtr vmesa, GLuint bpp,GLuint srcBase,
GLuint srcPitch,GLuint dstBase,GLuint dstPitch,
GLuint w,GLuint h,int xdir,int ydir, GLuint blitMode,
static void viaBlit(viaContextPtr vmesa, GLuint bpp,
GLuint srcBase, GLuint srcPitch,
GLuint dstBase, GLuint dstPitch,
GLuint w, GLuint h,
GLuint blitMode,
GLuint color, GLuint nMask )
{
GLuint dwGEMode = 0, srcY=0, srcX, dstY=0, dstX;
GLuint cmd;
GLuint dwGEMode, srcX, dstX, cmd;
RING_VARS;
if (VIA_DEBUG)
fprintf(stderr, "%s bpp %d src %x/%x dst %x/%x w %d h %d dir %d,%d mode: %x color: 0x%08x mask 0x%08x\n",
__FUNCTION__, bpp, srcBase, srcPitch, dstBase, dstPitch, w,h, xdir, ydir, blitMode, color, nMask);
fprintf(stderr, "%s bpp %d src %x/%x dst %x/%x w %d h %d mode: %x color: 0x%08x mask 0x%08x\n",
__FUNCTION__, bpp, srcBase, srcPitch, dstBase, dstPitch, w,h, blitMode, color, nMask);
if (!w || !h)
return;
srcX = srcBase & 31;
dstX = dstBase & 31;
switch (bpp) {
case 16:
dwGEMode |= VIA_GEM_16bpp;
srcX >>= 1;
dstX >>= 1;
dwGEMode = VIA_GEM_16bpp;
srcX = (srcBase & 0x1f) >> 1;
dstX = (dstBase & 0x1f) >> 1;
break;
case 32:
dwGEMode |= VIA_GEM_32bpp;
srcX >>= 2;
dstX >>= 2;
dwGEMode = VIA_GEM_32bpp;
srcX = (srcBase & 0x1f) >> 2;
dstX = (dstBase & 0x1f) >> 2;
break;
default:
dwGEMode |= VIA_GEM_8bpp;
break;
}
cmd = 0;
if (xdir < 0) {
cmd |= VIA_GEC_DECX;
srcX += (w - 1);
dstX += (w - 1);
}
if (ydir < 0) {
cmd |= VIA_GEC_DECY;
srcY += (h - 1);
dstY += (h - 1);
return;
}
switch(blitMode) {
case VIA_BLIT_FILL:
BEGIN_RING((2 + 9) * 2);
SetReg2DAGP(VIA_REG_GEMODE, dwGEMode);
SetReg2DAGP( VIA_REG_FGCOLOR, color);
cmd |= VIA_GEC_BLT | VIA_GEC_FIXCOLOR_PAT | (VIA_BLIT_FILL << 24);
cmd = VIA_GEC_BLT | VIA_GEC_FIXCOLOR_PAT | (VIA_BLIT_FILL << 24);
break;
case VIA_BLIT_COPY:
BEGIN_RING((2 + 9) * 2);
SetReg2DAGP(VIA_REG_GEMODE, dwGEMode);
SetReg2DAGP( VIA_REG_KEYCONTROL, 0x0);
cmd |= VIA_GEC_BLT | (VIA_BLIT_COPY << 24);
cmd = VIA_GEC_BLT | (VIA_BLIT_COPY << 24);
break;
default:
return;
}
BEGIN_RING(22);
SetReg2DAGP( VIA_REG_GEMODE, dwGEMode);
SetReg2DAGP( VIA_REG_FGCOLOR, color);
SetReg2DAGP( 0x2C, nMask);
SetReg2DAGP( VIA_REG_SRCBASE, (srcBase & ~31) >> 3);
SetReg2DAGP( VIA_REG_DSTBASE, (dstBase & ~31) >> 3);
SetReg2DAGP( VIA_REG_SRCBASE, (srcBase & ~0x1f) >> 3);
SetReg2DAGP( VIA_REG_DSTBASE, (dstBase & ~0x1f) >> 3);
SetReg2DAGP( VIA_REG_PITCH, VIA_PITCH_ENABLE |
(srcPitch >> 3) | (((dstPitch) >> 3) << 16));
SetReg2DAGP( VIA_REG_SRCPOS, ((srcY << 16) | srcX));
SetReg2DAGP( VIA_REG_DSTPOS, ((dstY << 16) | dstX));
(srcPitch >> 3) | ((dstPitch >> 3) << 16));
SetReg2DAGP( VIA_REG_SRCPOS, srcX);
SetReg2DAGP( VIA_REG_DSTPOS, dstX);
SetReg2DAGP( VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1)));
SetReg2DAGP( VIA_REG_GECMD, cmd);
SetReg2DAGP( 0x2C, 0x00000000);
@@ -192,7 +176,6 @@ static void viaFillBuffer(viaContextPtr vmesa,
offset, buffer->pitch,
offset, buffer->pitch,
w, h,
0, 0,
VIA_BLIT_FILL, pixel, mask);
}
}
@@ -204,7 +187,6 @@ static void viaClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
{
viaContextPtr vmesa = VIA_CONTEXT(ctx);
__DRIdrawablePrivate *dPriv = vmesa->driDrawable;
const GLuint colorMask = *((GLuint *)&ctx->Color.ColorMask);
int flag = 0;
GLuint i = 0;
GLuint clear_depth_mask = 0xf << 28;
@@ -212,12 +194,12 @@ static void viaClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
VIA_FLUSH_DMA(vmesa);
if ((mask & DD_FRONT_LEFT_BIT) && colorMask == ~0) {
if (mask & DD_FRONT_LEFT_BIT) {
flag |= VIA_FRONT;
mask &= ~DD_FRONT_LEFT_BIT;
}
if ((mask & DD_BACK_LEFT_BIT) && colorMask == ~0) {
if (mask & DD_BACK_LEFT_BIT) {
flag |= VIA_BACK;
mask &= ~DD_BACK_LEFT_BIT;
}
@@ -239,9 +221,9 @@ static void viaClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
mask &= ~DD_STENCIL_BIT;
}
else {
fprintf(stderr, "XXX: Clear stencil writemask %x -- need triangles (or a ROP?)\n",
ctx->Stencil.WriteMask[0]);
/* Fixme - clear with triangles */
if (VIA_DEBUG)
fprintf(stderr, "XXX: Clear stencil writemask %x -- need triangles (or a ROP?)\n",
ctx->Stencil.WriteMask[0]);
}
}
}
@@ -293,11 +275,11 @@ static void viaClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
}
if (flag & VIA_FRONT) {
viaFillBuffer(vmesa, &vmesa->front, boxes, nr, vmesa->ClearColor, 0);
viaFillBuffer(vmesa, &vmesa->front, boxes, nr, vmesa->ClearColor, vmesa->ClearMask);
}
if (flag & VIA_BACK) {
viaFillBuffer(vmesa, &vmesa->back, boxes, nr, vmesa->ClearColor, 0); /* FIXME: masks */
viaFillBuffer(vmesa, &vmesa->back, boxes, nr, vmesa->ClearColor, vmesa->ClearMask);
}
if (flag & VIA_DEPTH) {
@@ -341,7 +323,7 @@ static void viaDoSwapBuffers(viaContextPtr vmesa,
src, back->pitch,
dest, front->pitch,
w, h,
0,0,VIA_BLIT_COPY, 0, 0);
VIA_BLIT_COPY, 0, 0);
}
}
@@ -513,11 +495,9 @@ static void via_emit_cliprect(viaContextPtr vmesa,
GLuint pitch = buffer->pitch;
GLuint offset = buffer->orig;
GLuint clipL = b->x1 - vmesa->drawX;
GLuint clipR = b->x2 - vmesa->drawX;
GLuint clipT = b->y1 - vmesa->drawY;
GLuint clipB = b->y2 - vmesa->drawY;
if (0)
fprintf(stderr, "emit cliprect for box %d,%d %d,%d\n", b->x1, b->y1, b->x2, b->y2);
vb[0] = HC_HEADER2;
vb[1] = (HC_ParaType_NotTex << 16);
@@ -526,8 +506,8 @@ static void via_emit_cliprect(viaContextPtr vmesa,
vb[3] = (HC_SubA_HClipLR << 24) | 0x0;
}
else {
vb[2] = (HC_SubA_HClipTB << 24) | (clipT << 12) | clipB;
vb[3] = (HC_SubA_HClipLR << 24) | (clipL << 12) | clipR;
vb[2] = (HC_SubA_HClipTB << 24) | (b->y1 << 12) | b->y2;
vb[3] = (HC_SubA_HClipLR << 24) | (b->x1 << 12) | b->x2;
}
vb[4] = ((HC_SubA_HDBBasL << 24) | (offset & 0xFFFFFF));
@@ -543,6 +523,11 @@ static int intersect_rect(drm_clip_rect_t *out,
drm_clip_rect_t *b)
{
*out = *a;
if (0)
fprintf(stderr, "intersect %d,%d %d,%d and %d,%d %d,%d\n",
a->x1, a->y1, a->x2, a->y2,
b->x1, b->y1, b->x2, b->y2);
if (b->x1 > out->x1) out->x1 = b->x1;
if (b->x2 < out->x2) out->x2 = b->x2;
@@ -575,6 +560,9 @@ void viaFlushDmaLocked(viaContextPtr vmesa, GLuint flags)
int i;
RING_VARS;
if (VIA_DEBUG)
fprintf(stderr, "%s\n", __FUNCTION__);
if (*(GLuint *)vmesa->driHwLock != (DRM_LOCK_HELD|vmesa->hHWContext) &&
*(GLuint *)vmesa->driHwLock != (DRM_LOCK_HELD|DRM_LOCK_CONT|vmesa->hHWContext)) {
fprintf(stderr, "%s called without lock held\n", __FUNCTION__);
@@ -640,35 +628,42 @@ void viaFlushDmaLocked(viaContextPtr vmesa, GLuint flags)
dump_dma( vmesa );
if (flags & VIA_NO_CLIPRECTS) {
if (0) fprintf(stderr, "%s VIA_NO_CLIPRECTS\n", __FUNCTION__);
assert(vmesa->dmaCliprectAddr == 0);
fire_buffer( vmesa );
}
else if (!vmesa->dmaCliprectAddr) {
/* Contains only state. Could just dump the packet?
*/
if (0) fprintf(stderr, "no dmaCliprectAddr\n");
if (0) fprintf(stderr, "%s: no dmaCliprectAddr\n", __FUNCTION__);
if (0) fire_buffer( vmesa );
}
else if (vmesa->numClipRects) {
int ret;
drm_clip_rect_t *pbox = vmesa->pClipRects;
if (0) fprintf(stderr, "%s: %d cliprects\n", __FUNCTION__, vmesa->numClipRects);
for (i = 0; i < vmesa->numClipRects; i++) {
if (vmesa->glCtx->Scissor.Enabled) {
drm_clip_rect_t b;
if (!intersect_rect(&b, &pbox[i], &vmesa->scissorRect))
continue;
via_emit_cliprect(vmesa, &b);
}
else {
via_emit_cliprect(vmesa, &pbox[i]);
}
ret = fire_buffer(vmesa);
if (ret)
drm_clip_rect_t b;
b.x1 = pbox[i].x1 - (vmesa->drawX + vmesa->drawXoff);
b.x2 = pbox[i].x2 - (vmesa->drawX + vmesa->drawXoff);
b.y1 = pbox[i].y1 - vmesa->drawY;
b.y2 = pbox[i].y2 - vmesa->drawY;
if (vmesa->glCtx->Scissor.Enabled &&
!intersect_rect(&b, &b, &vmesa->scissorRect))
continue;
b.x1 += vmesa->drawXoff;
b.x2 += vmesa->drawXoff;
via_emit_cliprect(vmesa, &b);
if (fire_buffer(vmesa) != 0)
goto done;
}
} else {
if (0) fprintf(stderr, "%s: no cliprects\n", __FUNCTION__);
UNLOCK_HARDWARE(vmesa);
sched_yield();
LOCK_HARDWARE(vmesa);
@@ -760,6 +755,9 @@ GLuint *viaAllocDmaFunc(viaContextPtr vmesa, int bytes, const char *func, int li
GLuint *viaExtendPrimitive(viaContextPtr vmesa, int bytes)
{
if (0)
fprintf(stderr, "%s %d\n", __FUNCTION__, bytes);
assert(vmesa->dmaLastPrim);
if (vmesa->dmaLow + bytes > VIA_DMA_HIGHWATER) {
viaWrapPrimitive(vmesa);

View File

@@ -615,7 +615,8 @@ static void viaScissor(GLcontext *ctx, GLint x, GLint y,
if (!vmesa->driDrawable)
return;
if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
if (VIA_DEBUG)
fprintf(stderr, "%s %d,%d %dx%d, drawH %d\n", __FUNCTION__, x,y,w,h, vmesa->driDrawable->h);
if (ctx->Scissor.Enabled) {
VIA_FLUSH_DMA(vmesa); /* don't pipeline cliprect changes */
@@ -628,6 +629,19 @@ static void viaScissor(GLcontext *ctx, GLint x, GLint y,
if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__);
}
static void viaEnable(GLcontext *ctx, GLenum cap, GLboolean state)
{
viaContextPtr vmesa = VIA_CONTEXT(ctx);
switch (cap) {
case GL_SCISSOR_TEST:
VIA_FLUSH_DMA(vmesa);
break;
default:
break;
}
}
/* Fallback to swrast for select and feedback.
@@ -684,6 +698,26 @@ static void viaClearColor(GLcontext *ctx, const GLfloat color[4])
}
#define WRITEMASK_ALPHA_SHIFT 31
#define WRITEMASK_RED_SHIFT 30
#define WRITEMASK_GREEN_SHIFT 29
#define WRITEMASK_BLUE_SHIFT 28
static void viaColorMask(GLcontext *ctx,
GLboolean r, GLboolean g,
GLboolean b, GLboolean a)
{
viaContextPtr vmesa = VIA_CONTEXT( ctx );
if (VIA_DEBUG)
fprintf(stderr, "%s r(%d) g(%d) b(%d) a(%d)\n", __FUNCTION__, r, g, b, a);
vmesa->ClearMask = (((!r) << WRITEMASK_RED_SHIFT) |
((!g) << WRITEMASK_GREEN_SHIFT) |
((!b) << WRITEMASK_BLUE_SHIFT) |
((!a) << WRITEMASK_ALPHA_SHIFT));
}
/* =============================================================
*/
@@ -1256,12 +1290,13 @@ static void viaChooseColorState(GLcontext *ctx)
vmesa->regHROP = HC_HROP_P;
vmesa->regHFBBMSKL = (*(GLuint *)&ctx->Color.ColorMask[0]) & 0xFFFFFF;
vmesa->regHROP |= ((*(GLuint *)&ctx->Color.ColorMask[0]) >> 24) & 0xFF;
vmesa->regHROP |= ctx->Color.ColorMask[3];
if ((GLuint)((GLuint *)&ctx->Color.ColorMask[0]) & 0xFF000000)
if (ctx->Color.ColorMask[3])
vmesa->regEnable |= HC_HenAW_MASK;
else
vmesa->regEnable &= (~HC_HenAW_MASK);
vmesa->regEnable &= ~HC_HenAW_MASK;
if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
}
@@ -1585,11 +1620,13 @@ void viaInitStateFuncs(GLcontext *ctx)
ctx->Driver.BlendEquationSeparate = viaBlendEquationSeparate;
ctx->Driver.BlendFuncSeparate = viaBlendFuncSeparate;
ctx->Driver.ClearColor = viaClearColor;
ctx->Driver.ColorMask = viaColorMask;
ctx->Driver.DrawBuffer = viaDrawBuffer;
ctx->Driver.RenderMode = viaRenderMode;
ctx->Driver.Scissor = viaScissor;
ctx->Driver.DepthRange = viaDepthRange;
ctx->Driver.Viewport = viaViewport;
ctx->Driver.Enable = viaEnable;
/* Pixel path fallbacks.
*/

View File

@@ -222,7 +222,7 @@ static struct {
} while (0)
#define DEPTH_SCALE (1.0 / 0xffff)
#define DEPTH_SCALE vmesa->polygon_offset_scale
#define UNFILLED_TRI unfilled_tri
#define UNFILLED_QUAD unfilled_quad
#define VERT_X(_v) _v->v.x
@@ -790,9 +790,11 @@ static void viaRenderPrimitive( GLcontext *ctx, GLuint prim )
void viaFinishPrimitive(viaContextPtr vmesa)
{
if (VIA_DEBUG) fprintf(stderr, "%s\n", __FUNCTION__);
if (VIA_DEBUG)
fprintf(stderr, "%s\n", __FUNCTION__);
if (!vmesa->dmaLastPrim) {
if (!vmesa->dmaLastPrim || !vmesa->dmaCliprectAddr) {
assert(0);
}
else if (vmesa->dmaLow != vmesa->dmaLastPrim) {
GLuint cmdA = vmesa->regCmdA_End | HC_HPLEND_MASK | HC_HPMValidN_MASK | HC_HE3Fire_MASK;
@@ -818,6 +820,9 @@ void viaFinishPrimitive(viaContextPtr vmesa)
viaFlushDma( vmesa );
}
else {
if (VIA_DEBUG)
fprintf(stderr, "remove empty primitive\n");
/* Remove the primitive header:
*/
vmesa->dmaLastPrim = 0;