X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fnouveau%2Fnv04_state_tex.c;h=15eaa71531bde56b67f1d1b30b248439ba51208a;hb=d4bf9baa43e2cf7b4b877141ee472779ced219bf;hp=99ea310c65fc9efb329414407eeafb4bbc49473a;hpb=bfb5dc68fcc9f5dee71f66d9499b8bdcde9627ea;p=mesa.git diff --git a/src/mesa/drivers/dri/nouveau/nv04_state_tex.c b/src/mesa/drivers/dri/nouveau/nv04_state_tex.c index 99ea310c65f..15eaa71531b 100644 --- a/src/mesa/drivers/dri/nouveau/nv04_state_tex.c +++ b/src/mesa/drivers/dri/nouveau/nv04_state_tex.c @@ -29,90 +29,74 @@ #include "nouveau_texture.h" #include "nouveau_util.h" #include "nouveau_gldefs.h" -#include "nouveau_class.h" +#include "nv_object.xml.h" +#include "nv04_3d.xml.h" #include "nv04_driver.h" +#include "main/samplerobj.h" static uint32_t get_tex_format(struct gl_texture_image *ti) { switch (ti->TexFormat) { - case MESA_FORMAT_A8: - case MESA_FORMAT_L8: + case MESA_FORMAT_A_UNORM8: + case MESA_FORMAT_L_UNORM8: + case MESA_FORMAT_I_UNORM8: return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_Y8; - case MESA_FORMAT_ARGB1555: + case MESA_FORMAT_B5G5R5A1_UNORM: return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_A1R5G5B5; - case MESA_FORMAT_ARGB4444: + case MESA_FORMAT_B4G4R4A4_UNORM: return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_A4R4G4B4; - case MESA_FORMAT_RGB565: + case MESA_FORMAT_B5G6R5_UNORM: return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_R5G6B5; - case MESA_FORMAT_ARGB8888: + case MESA_FORMAT_B8G8R8A8_UNORM: return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_A8R8G8B8; - default: - assert(0); - } -} - -static inline unsigned -get_wrap_mode(unsigned wrap) -{ - switch (wrap) { - case GL_REPEAT: - return 0x1; - case GL_MIRRORED_REPEAT: - return 0x2; - case GL_CLAMP: - case GL_CLAMP_TO_EDGE: - return 0x3; - case GL_CLAMP_TO_BORDER: - return 0x4; + case MESA_FORMAT_B8G8R8X8_UNORM: + return NV04_TEXTURED_TRIANGLE_FORMAT_COLOR_X8R8G8B8; default: assert(0); } } void -nv04_emit_tex_obj(GLcontext *ctx, int emit) +nv04_emit_tex_obj(struct gl_context *ctx, int emit) { + struct nv04_context *nv04 = to_nv04_context(ctx); const int i = emit - NOUVEAU_STATE_TEX_OBJ0; - struct nouveau_channel *chan = context_chan(ctx); - struct nouveau_grobj *fahrenheit = nv04_context_engine(ctx); - struct nouveau_bo_context *bctx = context_bctx_i(ctx, TEXTURE, i); - const int bo_flags = NOUVEAU_BO_RD | NOUVEAU_BO_GART | NOUVEAU_BO_VRAM; struct nouveau_surface *s; uint32_t format = 0xa0, filter = 0x1010; - if (i && !nv04_mtex_engine(fahrenheit)) - return; - - if (ctx->Texture.Unit[i]._ReallyEnabled) { + if (ctx->Texture.Unit[i]._Current) { struct gl_texture_object *t = ctx->Texture.Unit[i]._Current; struct gl_texture_image *ti = t->Image[0][t->BaseLevel]; + const struct gl_sampler_object *sa = _mesa_get_samplerobj(ctx, i); int lod_max = 1, lod_bias = 0; - nouveau_texture_validate(ctx, t); + if (!nouveau_texture_validate(ctx, t)) + return; + s = &to_nouveau_texture(t)->surfaces[t->BaseLevel]; - if (t->MinFilter != GL_NEAREST && - t->MinFilter != GL_LINEAR) { - lod_max = CLAMP(MIN2(t->MaxLod, t->_MaxLambda), + if (sa->MinFilter != GL_NEAREST && + sa->MinFilter != GL_LINEAR) { + lod_max = CLAMP(MIN2(sa->MaxLod, t->_MaxLambda), 0, 15) + 1; lod_bias = CLAMP(ctx->Texture.Unit[i].LodBias + - t->LodBias, 0, 15); + sa->LodBias, -16, 15) * 8; } - format |= get_wrap_mode(t->WrapT) << 28 | - get_wrap_mode(t->WrapS) << 24 | + format |= nvgl_wrap_mode(sa->WrapT) << 28 | + nvgl_wrap_mode(sa->WrapS) << 24 | ti->HeightLog2 << 20 | ti->WidthLog2 << 16 | lod_max << 12 | get_tex_format(ti); - filter |= log2i(t->MaxAnisotropy) << 31 | - nvgl_filter_mode(t->MagFilter) << 28 | - log2i(t->MaxAnisotropy) << 27 | - nvgl_filter_mode(t->MinFilter) << 24 | - lod_bias << 16; + filter |= log2i(sa->MaxAnisotropy) << 31 | + nvgl_filter_mode(sa->MagFilter) << 28 | + log2i(sa->MaxAnisotropy) << 27 | + nvgl_filter_mode(sa->MinFilter) << 24 | + (lod_bias & 0xff) << 16; } else { s = &to_nv04_context(ctx)->dummy_texture; @@ -126,37 +110,7 @@ nv04_emit_tex_obj(GLcontext *ctx, int emit) NV04_TEXTURED_TRIANGLE_FILTER_MAGNIFY_NEAREST; } - if (nv04_mtex_engine(fahrenheit)) { - nouveau_bo_markl(bctx, fahrenheit, - NV04_MULTITEX_TRIANGLE_OFFSET(i), - s->bo, 0, bo_flags); - - nouveau_bo_mark(bctx, fahrenheit, - NV04_MULTITEX_TRIANGLE_FORMAT(i), - s->bo, format, 0, - NV04_MULTITEX_TRIANGLE_FORMAT_DMA_A, - NV04_MULTITEX_TRIANGLE_FORMAT_DMA_B, - bo_flags | NOUVEAU_BO_OR); - - BEGIN_RING(chan, fahrenheit, NV04_MULTITEX_TRIANGLE_FILTER(i), 1); - OUT_RING(chan, filter); - - } else { - nouveau_bo_markl(bctx, fahrenheit, - NV04_TEXTURED_TRIANGLE_OFFSET, - s->bo, 0, bo_flags); - - nouveau_bo_mark(bctx, fahrenheit, - NV04_TEXTURED_TRIANGLE_FORMAT, - s->bo, format, 0, - NV04_TEXTURED_TRIANGLE_FORMAT_DMA_A, - NV04_TEXTURED_TRIANGLE_FORMAT_DMA_B, - bo_flags | NOUVEAU_BO_OR); - - BEGIN_RING(chan, fahrenheit, NV04_TEXTURED_TRIANGLE_COLORKEY, 1); - OUT_RING(chan, 0); - - BEGIN_RING(chan, fahrenheit, NV04_TEXTURED_TRIANGLE_FILTER, 1); - OUT_RING(chan, filter); - } + nv04->texture[i] = s; + nv04->format[i] = format; + nv04->filter[i] = filter; }