@@ -107,6 +107,15 @@ static bool check_texture_possibly_dirty(NV2AState *d,
107
107
return possibly_dirty ;
108
108
}
109
109
110
+ static inline float convert_lod_bias (uint32_t lod_bias )
111
+ {
112
+ int sign_extended_bias = lod_bias ;
113
+ if (lod_bias & (1 << 12 )) {
114
+ sign_extended_bias |= ~NV_PGRAPH_TEXFILTER0_MIPMAP_LOD_BIAS ;
115
+ }
116
+ return (float )sign_extended_bias / 256.f ;
117
+ }
118
+
110
119
static void apply_texture_parameters (TextureBinding * binding ,
111
120
const BasicColorFormatInfo * f ,
112
121
unsigned int dimensionality ,
@@ -120,6 +129,8 @@ static void apply_texture_parameters(TextureBinding *binding,
120
129
unsigned int addru = GET_MASK (address , NV_PGRAPH_TEXADDRESS0_ADDRU );
121
130
unsigned int addrv = GET_MASK (address , NV_PGRAPH_TEXADDRESS0_ADDRV );
122
131
unsigned int addrp = GET_MASK (address , NV_PGRAPH_TEXADDRESS0_ADDRP );
132
+ unsigned int lod_bias =
133
+ GET_MASK (filter , NV_PGRAPH_TEXFILTER0_MIPMAP_LOD_BIAS );
123
134
124
135
if (f -> linear ) {
125
136
/* somtimes games try to set mipmap min filters on linear textures.
@@ -146,6 +157,10 @@ static void apply_texture_parameters(TextureBinding *binding,
146
157
pgraph_texture_mag_filter_gl_map [mag_filter ]);
147
158
binding -> mag_filter = mag_filter ;
148
159
}
160
+ if (lod_bias != binding -> lod_bias ) {
161
+ binding -> lod_bias = lod_bias ;
162
+ glTexParameterf (binding -> gl_target , GL_TEXTURE_LOD_BIAS , convert_lod_bias (lod_bias ));
163
+ }
149
164
150
165
/* Texture wrapping */
151
166
assert (addru < ARRAY_SIZE (pgraph_texture_addr_gl_map ));
0 commit comments