Ian, thanks a lot for having a look at it.
Am 2003.06.27 03:19:00 +0200 schrieb(en) Ian Romanick: > Andreas Stenglein wrote: > > here is a patch that works at least for multiarb.c > > It is against HEAD from 19 June 2003 > > (I cleaned it up a bit but its not ready for merge: > > still some questions...) > > I've taken a quick peek at this patch, and I have a couple comments. I > hope to be able to look at it in more detail in the next week or so, but > I can't make any promises. > > > 1) could someone with an 8MB or 16MB Radeon check if the > > resulting max_texturesize is big enough? > > (just use mesa's glxinfo: glxinfo -l) > > I should be able to test this on an M6 w/8MB next. Keep in mind that > the amount of available AGP memory also plays a role. If the card only > has 1MB of available memory for textures, but there is 256MB of AGP > memory, it probably won't be a limitation. > > > 2) could someone try it out with a game/demo that > > makes use of the 3rd TMU? > > Other than multiarb, I think UT2k3 is the only option. Did anyone ever > get that working on R100? I know that someone (Keith?) finally got it > working on R200. I got the ut2003 demo 2206 and it worked on the radeon 7500. Some lighting/coloring is broken, (I saw some sort of that in another program) and it tries to use GL_TEXTURE_CUBE_MAP. Unfortunately it doesnt log which extensions it would use if they were available. And it doesnt log the implementation limits. @daniel: are there any switches to get more information? what is being drawn with the 3rd TMU ? would GL_NV_vertex_array_range really help so much or is this info of the README.linux outdated? > > > 3) could someone with knowledge about the vfmt and codegen > > stuff have a look on it? especially whether we need those > > dummys and what should be done in the fast-path and > > with vertex3f. > > That's where I'll try to focus my attention when I look at it deep. At > first glance (see my notes below), it look pretty good in this respect. > > > diff -ru trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.c > > tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.c > > --- trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.c Wed > > Jun 11 00:06:16 2003 > > +++ tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.c Thu Jun 26 > > 17:15:36 2003 > > @@ -314,6 +317,8 @@ > > 12, > > GL_FALSE ); > > > > + /* FIXME: we should verify that we dont get limits below the minimum > > requirements of OpenGL */ > > + > > ctx->Const.MaxTextureMaxAnisotropy = 16.0; > > > > /* No wide points. > > Yes and no. If we persist with the current memory sizing scheme, we'll > need to disable texture units if there is not enough memory to provide > the required minimum texture size. My opinion, however, is that we > should bag that scheme altogether. I think we'll leave that particular > issue for a (slightly) later date... ok > > > @@ -374,13 +379,15 @@ > > > > _math_matrix_ctr( &rmesa->TexGenMatrix[0] ); > > _math_matrix_ctr( &rmesa->TexGenMatrix[1] ); > > + _math_matrix_ctr( &rmesa->TexGenMatrix[2] ); > > _math_matrix_ctr( &rmesa->tmpmat ); > > _math_matrix_set_identity( &rmesa->TexGenMatrix[0] ); > > _math_matrix_set_identity( &rmesa->TexGenMatrix[1] ); > > + _math_matrix_set_identity( &rmesa->TexGenMatrix[2] ); > > _math_matrix_set_identity( &rmesa->tmpmat ); > > > > driInitExtensions( ctx, card_extensions, GL_TRUE ); > > - if( rmesa->dri.drmMinor >= 9 || getenv( "RADEON_RECTANGLE_FORCE_ENABLE")) /* > > FIXME! a.s. */ > > + if( rmesa->dri.drmMinor >= 9) > > _mesa_enable_extension( ctx, "GL_NV_texture_rectangle"); > > radeonInitDriverFuncs( ctx ); > > radeonInitIoctlFuncs( ctx ); > > The various bits of texture-rectangle cleanup like this should be > commited separately from the 3rd TMU stuff. It will make it easier to > grok the log messages & roll stuff back if needed. yes, right.. this getenv stuff more or less got merged by accident: I didnt know if we should bump the version number, so I just included some test and a "workaround". I think this cleanup could just be committed. OTOH I've found some use of MAX_TEXTURE_UNITS (the one defined in mesas config.h) in the extra layer for NPOT textures (radeon_swtcl.c). I think RADEON_MAX_TEXTURE_UNITS and maybe ctx->Const.MaxTextureUnits can be used there. Only keith knows ... > > > diff -ru trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h > > tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h > > --- trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h Wed > > Jun 11 00:06:16 2003 > > +++ tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h Thu Jun 26 > > 17:22:54 2003 > > @@ -635,30 +636,37 @@ > > GLuint prim; > > }; > > > > +/* FIXME: do we really need add. 2 to prevent segfault if someone */ > > +/* specifies GL_TEXTURE3 (esp. for the codegen-path) ? */ > > +#define RADEON_MAX_VERTEX_SIZE 19 /* 17 + 2 */ > > + > > If you're going to use a define for this, which is a good idea, you > should move the commentary about the chosen value out of radeon_vbinfo > and put it next to the define. > > I've done some thinking about this particular fast-path. I believe that > we should try to keep it as much as possible. I don't think there's any > compelling reason not to. I would point out two things here. > > 1. The extra 2 elements (or MAX_TEXTURE_COORD_ELEMENTS elements, which > is 2 right now, but will eventually grow to 3) is to give the appearance > of having a power-of-two number of texture units. This allows some > optimizations. > > 2. This is safe because the texture coordinates are always the last > elements in a vertex. Therefore the actual vertex data is packed into > the start of the buffer. > > > struct radeon_vbinfo { > > GLint counter, initial_counter; > > GLint *dmaptr; > > void (*notify)( void ); > > GLint vertex_size; > > > > - /* A maximum total of 15 elements per vertex: 3 floats for position, 3 > > + /* A maximum total of 17 elements per vertex: 3 floats for position, 3 > > * floats for normal, 4 floats for color, 4 bytes for secondary color, > > - * 2 floats for each texture unit (4 floats total). > > + * 2 floats for each texture unit (6 floats total). > > * > > - * As soon as the 3rd TMU is supported or cube maps (or 3D textures) are > > + * As soon as cube maps (or 3D textures) are > > * supported, this value will grow. > > * > > * The position data is never actually stored here, so 3 elements could be > > * trimmed out of the buffer. > > */ > > - union { float f; int i; radeon_color_t color; } vertex[15]; > > + union { float f; int i; radeon_color_t color; } vertex[RADEON_MAX_VERTEX_SIZE]; > > > > GLfloat *normalptr; > > GLfloat *floatcolorptr; > > radeon_color_t *colorptr; > > GLfloat *floatspecptr; > > radeon_color_t *specptr; > > - GLfloat *texcoordptr[2]; > > + GLfloat *texcoordptr[4]; /* this should be RADEON_MAX_TEXTURE_UNITS but */ > > + /* the extra one is needed in radeon_vtxfmt_c.c > > and */ > > + /* in the codegen-path if someone specifies > > GL_TEXTURE3 */ > > + /* maybe we should just use mesas > > MAX_TEXTURE_UNITS here */ > > 4 should be used. > > > GLenum *prim; /* &ctx->Driver.CurrentExecPrimitive */ > > GLuint primflags; > > > diff -ru trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_tcl.c > > tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_tcl.c > > --- trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_tcl.c Fri May 2 > > 13:01:54 2003 > > +++ tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_tcl.c Thu Jun 19 > > 14:02:42 2003 > > @@ -385,6 +385,16 @@ > > } > > } > > > > + if (ctx->Texture.Unit[2]._ReallyEnabled) { > > + if (ctx->Texture.Unit[2].TexGenEnabled) { > > + if (rmesa->TexGenNeedNormals[2]) { > > + inputs |= VERT_BIT_NORMAL; > > + } > > + } else { > > + inputs |= VERT_BIT_TEX2; > > + } > > + } > > + > > I don't remember, but could this be made into a loop? you are right, yes, maybe. but I thought it isnt a problem for 3TMUs, only for 6 (r200) ;) so it could be good to have it here, too. > > > stage->inputs = inputs; > > stage->active = 1; > > } > > diff -ru trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c > > tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c > > --- trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c Fri May 2 > > 13:01:56 2003 > > +++ tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c Thu Jun 26 > > 17:55:47 2003 > > @@ -626,6 +657,11 @@ > > rmesa->vb.floatspecptr = ctx->Current.Attrib[VERT_ATTRIB_COLOR1]; > > rmesa->vb.texcoordptr[0] = ctx->Current.Attrib[VERT_ATTRIB_TEX0]; > > rmesa->vb.texcoordptr[1] = ctx->Current.Attrib[VERT_ATTRIB_TEX1]; > > + rmesa->vb.texcoordptr[2] = ctx->Current.Attrib[VERT_ATTRIB_TEX2]; > > + rmesa->vb.texcoordptr[3] = ctx->Current.Attrib[VERT_ATTRIB_TEX0]; /* dummy to > > prevent segfault when someone */ > > + /* > > specifies GL_TEXTURE3 */ > > + /* > > question: could we use VERT_ATTRIB_TEX3, too without */ > > + /* the > > risk of "broken" vtxfmt and codegen path ? */ > > > > /* Run through and initialize the vertex components in the order > > * the hardware understands: > > It doesn't matter what you use. The spec says that if an app tries to > see the coord for a non-existant texture unit the results are undefined. > Over-writting a different texture unit's coordinate or doing nothing > are both equally valid. > > > diff -ru trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_c.c > > tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_c.c > > --- trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_c.c Fri > > May 2 13:01:56 2003 > > +++ tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_c.c Thu > > Jun 26 17:57:22 2003 > > @@ -548,12 +548,16 @@ > > * with 0x1F. Masking with 0x1F and then masking with 0x01 is redundant, so > > * the subtraction has been omitted. > > */ > > +/* question: should we continue using this and make the texcoordptr 4 elements > > + * or should we mask and verify that the index doesn't get bigger than > > 2 ? > > + * We have this issue in the codegen stuff, too > > + */ > > Yes (see my explanation above). > > > @@ -736,17 +740,20 @@ > > > > #define ACTIVE_ST0 RADEON_CP_VC_FRMT_ST0 > > #define ACTIVE_ST1 RADEON_CP_VC_FRMT_ST1 > > -#define ACTIVE_ST_ALL (RADEON_CP_VC_FRMT_ST1|RADEON_CP_VC_FRMT_ST0) > > +#define ACTIVE_ST2 RADEON_CP_VC_FRMT_ST2 > > +#define ACTIVE_ST_ALL > > (RADEON_CP_VC_FRMT_ST0|RADEON_CP_VC_FRMT_ST1|RADEON_CP_VC_FRMT_ST2) > > > > /* Each codegen function should be able to be fully specified by a > > * subsetted version of rmesa->vb.vertex_format. > > */ > > + /* question: this is strange... could someone explain ? */ > > #define MASK_NORM (ACTIVE_XYZW) > > #define MASK_COLOR (MASK_NORM|ACTIVE_NORM) > > #define MASK_SPEC (MASK_COLOR|ACTIVE_COLOR) > > #define MASK_ST0 (MASK_SPEC|ACTIVE_SPEC) > > #define MASK_ST1 (MASK_ST0|ACTIVE_ST0) > > -#define MASK_ST_ALL (MASK_ST1|ACTIVE_ST1) > > +#define MASK_ST2 (MASK_ST1|ACTIVE_ST1) > > +#define MASK_ST_ALL (MASK_ST2|ACTIVE_ST2) > > #define MASK_VERTEX (MASK_ST_ALL|ACTIVE_FPALPHA) > > You'll have to search through the list archives. I remember asking the > same thing once upon a time, but I don't recall the correct technical > answer. > > > diff -ru trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_sse.c > > tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_sse.c > > --- trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_sse.c Fri > > May 2 13:01:56 2003 > > +++ tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_sse.c Thu > > Jun 26 18:58:10 2003 > > @@ -178,13 +178,21 @@ > > if (RADEON_DEBUG & DEBUG_CODEGEN) > > fprintf(stderr, "%s 0x%08x\n", __FUNCTION__, key ); > > > > - if ((key & (RADEON_CP_VC_FRMT_ST0|RADEON_CP_VC_FRMT_ST1)) == > > - (RADEON_CP_VC_FRMT_ST0|RADEON_CP_VC_FRMT_ST1)) { > > - DFN ( _sse_MultiTexCoord2fv, rmesa->vb.dfn_cache.MultiTexCoord2fvARB ); > > - FIXUP(dfn->code, 18, 0xdeadbeef, (int)rmesa->vb.texcoordptr[0]); > > - } else { > > - DFN ( _sse_MultiTexCoord2fv_2, rmesa->vb.dfn_cache.MultiTexCoord2fvARB ); > > - FIXUP(dfn->code, 14, 0x0, (int)rmesa->vb.texcoordptr); > > +/* question: should we just let the case for RADEON_CP_VC_FRMT_ST0 for the */ > > +/* default path? Maybe some programs just use glMultiTexCoord2f(v)ARB for */ > > +/* every TMU, as GL_TEXTURE0_ARB is also allowed */ > > No. If some other set of texture units (say, 0 and 2 or just 1), are > enabled, masking the unit with 3 won't put the data in the correct place > in the vertex buffer. If just TMU 1 is enabled, it's coordinate needs > to be at the 0th position. Just masking w/3 would put it at the 1st > position, and the chip will get garbage. what I tried to ask was, if it would be better to disable the fast-path for the case RADEON_CP_VC_FRMT_ST0: (as it was before.) before TMU3-patch it was more or less: switch (statement) { case (RADEON_CP_VC_FRMT_ST0|RADEON_CP_VC_FRMT_ST1): fast-path(); break; default: default-path(); break; } > > > + switch (key & > > (RADEON_CP_VC_FRMT_ST0|RADEON_CP_VC_FRMT_ST1|RADEON_CP_VC_FRMT_ST2)) > > + { > > + case RADEON_CP_VC_FRMT_ST0: > > + case (RADEON_CP_VC_FRMT_ST0|RADEON_CP_VC_FRMT_ST1): > > + case (RADEON_CP_VC_FRMT_ST0|RADEON_CP_VC_FRMT_ST1|RADEON_CP_VC_FRMT_ST2): > > + DFN ( _sse_MultiTexCoord2fv, rmesa->vb.dfn_cache.MultiTexCoord2fvARB ); > > + FIXUP(dfn->code, 18, 0xdeadbeef, (int)rmesa->vb.texcoordptr[0]); > > + break; > > + default: > > + DFN ( _sse_MultiTexCoord2fv_2, rmesa->vb.dfn_cache.MultiTexCoord2fvARB ); > > + FIXUP(dfn->code, 14, 0x0, (int)rmesa->vb.texcoordptr); > > + break; > > } > > return dfn; > > } > > diff -ru trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_x86.c > > tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_x86.c > > --- trunk_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_x86.c Fri > > May 2 13:01:56 2003 > > +++ tex3_20030619/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_x86.c Thu > > Jun 26 18:11:45 2003 > > @@ -75,7 +75,7 @@ > > if (RADEON_DEBUG & DEBUG_CODEGEN) > > fprintf(stderr, "%s 0x%08x %d\n", __FUNCTION__, key, rmesa->vb.vertex_size > > ); > > > > - switch (rmesa->vb.vertex_size) { > > + switch (rmesa->vb.vertex_size) { /* FIXME: do we need something > > here for 3rd TMU? */ > > case 4: { > > > > DFN ( _x86_Vertex3f_4, rmesa->vb.dfn_cache.Vertex3f ); > > I don't think we have to do anything special. It should just picked up > by the default case. We may decide to put a fast path, but I don't > expect so. > greetings, Andreas ------------------------------------------------------- This SF.Net email sponsored by: Free pre-built ASP.NET sites including Data Reports, E-commerce, Portals, and Forums are available now. Download today and enter to win an XBOX or Visual Studio .NET. http://aspnet.click-url.com/go/psa00100006ave/direct;at.asp_061203_01/01 _______________________________________________ Dri-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/dri-devel