summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/nouveau/nv20_state_tex.c
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2010-03-18 14:18:55 +0100
committerFrancisco Jerez <currojerez@riseup.net>2010-03-18 15:02:36 +0100
commitc944fb5ffe7cf16154d6395001f43a6c965cab1f (patch)
treea0533cefa8ebf06d2ecdc528ad930dd89ab7a8fb /src/mesa/drivers/dri/nouveau/nv20_state_tex.c
parent1a812ab57a71d16e45ca44de7ae0570d2bd46674 (diff)
dri/nouveau: Implement texcoord generation.
Diffstat (limited to 'src/mesa/drivers/dri/nouveau/nv20_state_tex.c')
-rw-r--r--src/mesa/drivers/dri/nouveau/nv20_state_tex.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c
index d7ac4c57bc..bb8a79c2c9 100644
--- a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c
+++ b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c
@@ -32,9 +32,44 @@
#include "nouveau_util.h"
#include "nv20_driver.h"
+#define TX_GEN_MODE(i, j) (NV20TCL_TX_GEN_MODE_S(i) + 4 * (j))
+#define TX_GEN_COEFF(i, j) (NV20TCL_TX_GEN_COEFF_S_A(i) + 16 * (j))
#define TX_MATRIX(i) (NV20TCL_TX0_MATRIX(0) + 64 * (i))
void
+nv20_emit_tex_gen(GLcontext *ctx, int emit)
+{
+ const int i = emit - NOUVEAU_STATE_TEX_GEN0;
+ struct nouveau_context *nctx = to_nouveau_context(ctx);
+ struct nouveau_channel *chan = context_chan(ctx);
+ struct nouveau_grobj *kelvin = context_eng3d(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_RING(chan, kelvin, TX_GEN_COEFF(i, j), 4);
+ OUT_RINGf(chan, k[0]);
+ OUT_RINGf(chan, k[1]);
+ OUT_RINGf(chan, k[2]);
+ OUT_RINGf(chan, k[3]);
+ }
+
+ BEGIN_RING(chan, kelvin, TX_GEN_MODE(i, j), 1);
+ OUT_RING(chan, nvgl_texgen_mode(coord->Mode));
+
+ } else {
+ BEGIN_RING(chan, kelvin, TX_GEN_MODE(i, j), 1);
+ OUT_RING(chan, 0);
+ }
+ }
+}
+
+void
nv20_emit_tex_mat(GLcontext *ctx, int emit)
{
const int i = emit - NOUVEAU_STATE_TEX_MAT0;