diff --git a/misc/n64/gpu.c b/misc/n64/gpu.c index ec488d930..bb119eef6 100644 --- a/misc/n64/gpu.c +++ b/misc/n64/gpu.c @@ -110,6 +110,11 @@ static void gpuSetTexSize(uint16_t width, uint16_t height) gpu_set_word(offsetof(gpu_state, tex_size[0]), (width << 16) | height); } +static void gpuSetTexOffset(uint16_t width, uint16_t height) +{ + gpu_set_word(offsetof(gpu_state, tex_offset[0]), (width << 16) | height); +} + static inline void write_shorts(rspq_write_t *w, const uint16_t *s, uint32_t count) { diff --git a/src/Graphics_N64.c b/src/Graphics_N64.c index 1ea54c9d8..5e7267670 100644 --- a/src/Graphics_N64.c +++ b/src/Graphics_N64.c @@ -225,8 +225,26 @@ void Gfx_DeleteTexture(GfxResourceID* texId) { *texId = NULL; } -void Gfx_EnableMipmaps(void) { } -void Gfx_DisableMipmaps(void) { } +static cc_bool bilinear_mode; +static void SetFilterMode(cc_bool bilinear) { + if (bilinear_mode == bilinear) return; + bilinear_mode = bilinear; + + uint64_t mode = bilinear ? FILTER_BILINEAR : FILTER_POINT; + __rdpq_mode_change_som(SOM_SAMPLE_MASK, mode << SOM_SAMPLE_SHIFT); + + int offset = bilinear ? -((1 << TEX_SHIFT) / 2) : 0; + gpuSetTexOffset(offset, offset); +} + +void Gfx_EnableMipmaps(void) { + // TODO move back to texture instead? + SetFilterMode(Gfx.Mipmaps); +} + +void Gfx_DisableMipmaps(void) { + SetFilterMode(FILTER_POINT); +} /*########################################################################################################################*