+#include "main/samplerobj.h"
+
+void
+nv20_emit_tex_gen(struct gl_context *ctx, int emit)
+{
+ const int i = emit - NOUVEAU_STATE_TEX_GEN0;
+ struct nouveau_context *nctx = to_nouveau_context(ctx);
+ struct nouveau_pushbuf *push = context_push(ctx);
+ struct gl_texture_unit *unit = &ctx->Texture.Unit[i];
+ int j;
+
+ for (j = 0; j < 4; j++) {
+ if (nctx->fallback == HWTNL && (unit->TexGenEnabled & 1 << j)) {
+ struct gl_texgen *coord = get_texgen_coord(unit, j);
+ float *k = get_texgen_coeff(coord);
+
+ if (k) {
+ BEGIN_NV04(push, NV20_3D(TEX_GEN_COEFF(i, j)), 4);
+ PUSH_DATAp(push, k, 4);
+ }
+
+ BEGIN_NV04(push, NV20_3D(TEX_GEN_MODE(i, j)), 1);
+ PUSH_DATA (push, nvgl_texgen_mode(coord->Mode));
+
+ } else {
+ BEGIN_NV04(push, NV20_3D(TEX_GEN_MODE(i, j)), 1);
+ PUSH_DATA (push, 0);
+ }
+ }
+}
+
+void
+nv20_emit_tex_mat(struct gl_context *ctx, int emit)
+{
+ const int i = emit - NOUVEAU_STATE_TEX_MAT0;
+ struct nouveau_context *nctx = to_nouveau_context(ctx);
+ struct nouveau_pushbuf *push = context_push(ctx);
+
+ if (nctx->fallback == HWTNL &&
+ (ctx->Texture._TexMatEnabled & 1 << i)) {
+ BEGIN_NV04(push, NV20_3D(TEX_MATRIX_ENABLE(i)), 1);
+ PUSH_DATA (push, 1);
+
+ BEGIN_NV04(push, NV20_3D(TEX_MATRIX(i,0)), 16);
+ PUSH_DATAm(push, ctx->TextureMatrixStack[i].Top->m);
+
+ } else {
+ BEGIN_NV04(push, NV20_3D(TEX_MATRIX_ENABLE(i)), 1);
+ PUSH_DATA (push, 0);
+ }
+}
+
+static uint32_t
+get_tex_format_pot(struct gl_texture_image *ti)
+{
+ switch (ti->TexFormat) {
+ case MESA_FORMAT_B8G8R8A8_UNORM:
+ return NV20_3D_TEX_FORMAT_FORMAT_A8R8G8B8;
+
+ case MESA_FORMAT_B5G5R5A1_UNORM:
+ return NV20_3D_TEX_FORMAT_FORMAT_A1R5G5B5;
+
+ case MESA_FORMAT_B4G4R4A4_UNORM:
+ return NV20_3D_TEX_FORMAT_FORMAT_A4R4G4B4;
+
+ case MESA_FORMAT_B8G8R8X8_UNORM:
+ return NV20_3D_TEX_FORMAT_FORMAT_X8R8G8B8;
+
+ case MESA_FORMAT_B5G6R5_UNORM:
+ return NV20_3D_TEX_FORMAT_FORMAT_R5G6B5;
+
+ case MESA_FORMAT_A_UNORM8:
+ case MESA_FORMAT_I_UNORM8:
+ return NV20_3D_TEX_FORMAT_FORMAT_I8;
+
+ case MESA_FORMAT_L_UNORM8:
+ return NV20_3D_TEX_FORMAT_FORMAT_L8;
+
+ case MESA_FORMAT_RGB_DXT1:
+ case MESA_FORMAT_RGBA_DXT1:
+ return NV20_3D_TEX_FORMAT_FORMAT_DXT1;
+
+ case MESA_FORMAT_RGBA_DXT3:
+ return NV20_3D_TEX_FORMAT_FORMAT_DXT3;
+
+ case MESA_FORMAT_RGBA_DXT5:
+ return NV20_3D_TEX_FORMAT_FORMAT_DXT5;
+
+ default:
+ assert(0);
+ }
+}