Skip to content

Commit 4719126

Browse files
authored
gx: add get texture filters (#175)
* gx: avoid data duplication in texture filter map * gx: add GX_GetTexObjFilterMode() Without this function there is no way to retrieve the texture minification and magnification filters.
1 parent 2cb532d commit 4719126

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

gc/ogc/gx.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4110,6 +4110,21 @@ u16 GX_GetTexObjWidth(const GXTexObj* obj);
41104110
*/
41114111
void GX_GetTexObjLOD(const GXTexObj* obj, f32 *minlod, f32 *maxlod);
41124112

4113+
/*!
4114+
* \fn void GX_GetTexObjFilterMode(const GXTexObj* obj, u8 *minfilt, u8 *magfilt)
4115+
* \brief Returns the filter mode for the texture object \a obj.
4116+
*
4117+
* \note Use GX_InitTexObjLOD() or GX_InitTexObjFilterMode() to initialize the
4118+
* texture filter mode.
4119+
*
4120+
* \param[in] obj ptr to a texture object
4121+
* \param[out] minfilt minification filter mode; will be one of \ref texfilter
4122+
* \param[out] maxfilt magnification filter mode; will be \a GX_NEAR or \a GX_LINEAR
4123+
*
4124+
* \return none
4125+
*/
4126+
void GX_GetTexObjFilterMode(const GXTexObj *obj, u8 *minfilt, u8 *magfilt);
4127+
41134128
/*!
41144129
* \fn void GX_GetTexObjAll(const GXTexObj* obj, void** image_ptr, u16* width, u16* height, u8* format, u8* wrap_s, u8* wrap_t, u8* mipmap);
41154130
* \brief Returns the parameters described by a texture object. Texture objects are used to describe all the parameters associated with a texture, including size, format, wrap modes, filter modes, etc. Texture objects are initialized using either GX_InitTexObj() or, for color index format textures, GX_InitTexObjCI().

libogc/gx.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ static const u8 _gxteximg1ids[8] = {0x8C,0x8D,0x8E,0x8F,0xAC,0xAD,0xAE,0xAF};
105105
static const u8 _gxteximg2ids[8] = {0x90,0x91,0x92,0x93,0xB0,0xB1,0xB2,0xB3};
106106
static const u8 _gxteximg3ids[8] = {0x94,0x95,0x96,0x97,0xB4,0xB5,0xB6,0xB7};
107107
static const u8 _gxtextlutids[8] = {0x98,0x99,0x9A,0x9B,0xB8,0xB9,0xBA,0xBB};
108+
static const u8 _gx2HWFiltConv[] = {0x00,0x04,0x01,0x05,0x02,0x06,0x00,0x00};
108109

109110
#if defined(HW_RVL)
110111

@@ -3034,6 +3035,22 @@ void GX_GetTexObjLOD(const GXTexObj *obj, f32 *minlod, f32 *maxlod)
30343035
*maxlod = _SHIFTR(ptr->tex_lod, 8, 8) / 16.0f;
30353036
}
30363037

3038+
void GX_GetTexObjFilterMode(const GXTexObj *obj, u8 *minfilt, u8 *magfilt)
3039+
{
3040+
const struct __gx_texobj *ptr = (const struct __gx_texobj*)obj;
3041+
u8 hw_filt, i;
3042+
3043+
*magfilt = ptr->tex_filt & 0x10 ? GX_LINEAR : GX_NEAR;
3044+
hw_filt = _SHIFTR(ptr->tex_filt, 5, 3);
3045+
for (i = 0; i < sizeof(_gx2HWFiltConv); i++)
3046+
if (_gx2HWFiltConv[i] == hw_filt) {
3047+
*minfilt = i;
3048+
break;
3049+
}
3050+
if (i == sizeof(_gx2HWFiltConv)) /* we didn't find it */
3051+
*minfilt = GX_NEAR;
3052+
}
3053+
30373054
void GX_GetTexObjAll(const GXTexObj *obj, void** image_ptr, u16* width, u16* height,
30383055
u8* format, u8* wrap_s, u8* wrap_t, u8* mipmap)
30393056
{
@@ -3290,15 +3307,13 @@ void GX_InitTexObjCI(GXTexObj *obj,void *img_ptr,u16 wd,u16 ht,u8 fmt,u8 wrap_s,
32903307
void GX_InitTexObjLOD(GXTexObj *obj,u8 minfilt,u8 magfilt,f32 minlod,f32 maxlod,f32 lodbias,u8 biasclamp,u8 edgelod,u8 maxaniso)
32913308
{
32923309
struct __gx_texobj *ptr = (struct __gx_texobj*)obj;
3293-
static const u8 GX2HWFiltConv[] = {0x00,0x04,0x01,0x05,0x02,0x06,0x00,0x00};
3294-
//static const u8 HW2GXFiltConv[] = {0x00,0x02,0x04,0x00,0x01,0x03,0x05,0x00};
32953310

32963311
if(lodbias<-4.0f) lodbias = -4.0f;
32973312
else if(lodbias==4.0f) lodbias = 3.99f;
32983313

32993314
ptr->tex_filt = (ptr->tex_filt&~0x1fe00)|(_SHIFTL(((u32)(32.0f*lodbias)),9,8));
33003315
ptr->tex_filt = (ptr->tex_filt&~0x10)|(_SHIFTL((magfilt==GX_LINEAR?1:0),4,1));
3301-
ptr->tex_filt = (ptr->tex_filt&~0xe0)|(_SHIFTL(GX2HWFiltConv[minfilt],5,3));
3316+
ptr->tex_filt = (ptr->tex_filt&~0xe0)|(_SHIFTL(_gx2HWFiltConv[minfilt],5,3));
33023317
ptr->tex_filt = (ptr->tex_filt&~0x100)|(_SHIFTL(!(edgelod&0xff),8,1));
33033318
ptr->tex_filt = (ptr->tex_filt&~0x180000)|(_SHIFTL(maxaniso,19,2));
33043319
ptr->tex_filt = (ptr->tex_filt&~0x200000)|(_SHIFTL(biasclamp,21,1));
@@ -3335,10 +3350,9 @@ void GX_InitTexObjWrapMode(GXTexObj *obj,u8 wrap_s,u8 wrap_t)
33353350
void GX_InitTexObjFilterMode(GXTexObj *obj,u8 minfilt,u8 magfilt)
33363351
{
33373352
struct __gx_texobj *ptr = (struct __gx_texobj*)obj;
3338-
static const u8 GX2HWFiltConv[] = {0x00,0x04,0x01,0x05,0x02,0x06,0x00,0x00};
33393353

33403354
ptr->tex_filt = (ptr->tex_filt&~0x10)|(_SHIFTL((magfilt==GX_LINEAR?1:0),4,1));
3341-
ptr->tex_filt = (ptr->tex_filt&~0xe0)|(_SHIFTL(GX2HWFiltConv[minfilt],5,3));
3355+
ptr->tex_filt = (ptr->tex_filt&~0xe0)|(_SHIFTL(_gx2HWFiltConv[minfilt],5,3));
33423356
}
33433357

33443358
void GX_InitTexObjMinLOD(GXTexObj *obj,f32 minlod)

0 commit comments

Comments
 (0)