hi gemers.
about pix_altivec functions:
right now, altivec support in Gem looks like this:
<snip pix_text.h>
virtual void pix_test :: processImage(imageStruct &image);
virtual void pix_test :: processImageAltivec(imageStruct &image);
</snip>
<snip pix_text.cpp>
void pix_test :: processImage(imageStruct &image)
{
#ifdef ALTIVEC
processImageAltivec(image);
return
#else
// some slow code
#endif
}
void pix_test :: processImageAltivec(imageStruct &image)
{
#ifdef ALTIVEC
// some fast code
#endif
}
</snip>
now my question: wouldn't it be better to make more use of inheritance ?
and call the altivec-processing directly from GemPixObj, if altivec is
supported by the machine ?
i write this with MMX and SSE2 in mind:
i guess, all modern apple-computers have altivec;
all modern pcs have mmx, but only some of them have sse2 (i guess
pentium-4 only, but amd will support it in the future).
i would rather decide at runtime whether any parallel processing is
available, and then call the appropriate function. the fallback of all
those altivec/mmx-functions would of course be the generic-processing.
so i was thinking of something like
<snip GemPixObj.h>
virtual void processYUVImage(imageStruct &image);
virtual void processYUVImageAltivec(imageStruct &image);
</snip>
<snip GemPixObj.cpp>
void GemPixObj :: render(GemState *state){
//...
switch(state->image->image.format){
//...
case GL_YCBCR_422_GEM:
switch (m_haveSIMD){
case SIMD_ALTIVEC:
processYUVImageAltivec(state->image->image);
break;
default:
processYUVImage(state->image->image);
}
//...
}
}
void GemPixObj :: processYUVImage(imageStruct &image){
processImage(image);
}
void GemPixObj :: processYUVImageAltivec(imageStruct &image)
processYUVImage(image);
}
</snip>
<snip pix_test.h>
virtual void pix_test :: processImage(imageStruct &image);
#ifdef ALTIVEC
virtual void pix_test :: processImageAltivec(imageStruct &image);
#endif
</snip>
<snip pix_test.cpp>
void pix_test :: processImage(imageStruct &image)
{
// some slow code
}
#ifdef ALTIVEC
void pix_test :: processImageAltivec(imageStruct &image)
{
// some fast code
}
#endif
</snip>
GemPixObj::m_haveSIMD could be SIMD_ALTIVEC, SIMD_MMX, SIMD_SSE2 (or
whatever)
pros (i can think of right now):
code that is the same is rather in the parent-class than in each child.
this would make it possible to turn on/off SIMD on the fly. (probably
not a very good argument, but handy for profiling / showing the
advantages of SIMD).
furthermore it would keep the #ifdef-nightmare a bit more clean ( i believe)
the number of function-calls would be reduced by one (at the cost of one
case-loop)
i don't know whether G5-ALTIVEC-compiles can be executed on G4's - would
it be possible if the PPC970-code would be capsuled in an if-clause ?
drawbacks:
- a little work to be done (i have already started to do so, but haven't
yet committed it because i don't know, whether my idea is really good)
- there has to be a naming scheme for SIMD-processing. i have noticed,
that in PixDualObj's the naming is rather arbitrary:
pix_subtract::processYUVAltivec() vs.
pix_chroma_key::processYUV_YUVAltivec()
any comments ?
mfg.as.r
IOhannes