Mesa (mesa_7_5_branch): gallium: fix texcoords for cubemap mipmap generation

Brian Paul brianp at kemper.freedesktop.org
Tue May 5 16:12:58 UTC 2009


Module: Mesa
Branch: mesa_7_5_branch
Commit: 79ada8c6331a801a0475f38a540670b14e168f19
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=79ada8c6331a801a0475f38a540670b14e168f19

Author: Brian Paul <brianp at vmware.com>
Date:   Tue May  5 10:11:51 2009 -0600

gallium: fix texcoords for cubemap mipmap generation

We need to use (s,t,r) cubemap coords when sampling from the cubemap texture
so the rendered quad gets texture samples from the correct cube face.

---

 src/gallium/auxiliary/util/u_gen_mipmap.c |   96 ++++++++++++++++++++++++++---
 1 files changed, 86 insertions(+), 10 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_gen_mipmap.c b/src/gallium/auxiliary/util/u_gen_mipmap.c
index 690412a..6fa13a8 100644
--- a/src/gallium/auxiliary/util/u_gen_mipmap.c
+++ b/src/gallium/auxiliary/util/u_gen_mipmap.c
@@ -1316,7 +1316,6 @@ util_create_gen_mipmap(struct pipe_context *pipe,
    for (i = 0; i < 4; i++) {
       ctx->vertices[i][0][2] = 0.0f; /* z */
       ctx->vertices[i][0][3] = 1.0f; /* w */
-      ctx->vertices[i][1][2] = 0.0f; /* r */
       ctx->vertices[i][1][3] = 1.0f; /* q */
    }
 
@@ -1350,29 +1349,104 @@ get_next_slot(struct gen_mipmap_state *ctx)
 
 
 static unsigned
-set_vertex_data(struct gen_mipmap_state *ctx, float width, float height)
+set_vertex_data(struct gen_mipmap_state *ctx,
+                enum pipe_texture_target tex_target,
+                uint face, float width, float height)
 {
    unsigned offset;
 
+   /* vert[0].position */
    ctx->vertices[0][0][0] = 0.0f; /*x*/
    ctx->vertices[0][0][1] = 0.0f; /*y*/
-   ctx->vertices[0][1][0] = 0.0f; /*s*/
-   ctx->vertices[0][1][1] = 0.0f; /*t*/
 
+   /* vert[1].position */
    ctx->vertices[1][0][0] = width;
    ctx->vertices[1][0][1] = 0.0f;
-   ctx->vertices[1][1][0] = 1.0f;
-   ctx->vertices[1][1][1] = 0.0f;
 
+   /* vert[2].position */
    ctx->vertices[2][0][0] = width;
    ctx->vertices[2][0][1] = height;
-   ctx->vertices[2][1][0] = 1.0f;
-   ctx->vertices[2][1][1] = 1.0f;
 
+   /* vert[3].position */
    ctx->vertices[3][0][0] = 0.0f;
    ctx->vertices[3][0][1] = height;
-   ctx->vertices[3][1][0] = 0.0f;
-   ctx->vertices[3][1][1] = 1.0f;
+
+   /* Setup vertex texcoords.  This is a little tricky for cube maps. */
+   if (tex_target == PIPE_TEXTURE_CUBE) {
+      static const float st[4][2] = {
+         {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}
+      };
+      float rx, ry, rz;
+      uint i;
+
+      /* loop over quad verts */
+      for (i = 0; i < 4; i++) {
+         /* Compute sc = +/-scale and tc = +/-scale.
+          * Not +/-1 to avoid cube face selection ambiguity near the edges,
+          * though that can still sometimes happen with this scale factor...
+          */
+         const float scale = 0.9999;
+         const float sc = (2.0f * st[i][0] - 1.0f) * scale;
+         const float tc = (2.0f * st[i][1] - 1.0f) * scale;
+
+         switch (face) {
+         case PIPE_TEX_FACE_POS_X:
+            rx = 1.0f;
+            ry = -tc;
+            rz = -sc;
+            break;
+         case PIPE_TEX_FACE_NEG_X:
+            rx = -1.0f;
+            ry = -tc;
+            rz = sc;
+            break;
+         case PIPE_TEX_FACE_POS_Y:
+            rx = sc;
+            ry = 1.0f;
+            rz = tc;
+            break;
+         case PIPE_TEX_FACE_NEG_Y:
+            rx = sc;
+            ry = -1.0f;
+            rz = -tc;
+            break;
+         case PIPE_TEX_FACE_POS_Z:
+            rx = sc;
+            ry = -tc;
+            rz = 1.0f;
+            break;
+         case PIPE_TEX_FACE_NEG_Z:
+            rx = -sc;
+            ry = -tc;
+            rz = -1.0f;
+            break;
+         default:
+            assert(0);
+         }
+
+         ctx->vertices[i][1][0] = rx; /*s*/
+         ctx->vertices[i][1][1] = ry; /*t*/
+         ctx->vertices[i][1][2] = rz; /*r*/
+      }
+   }
+   else {
+      /* 1D/2D */
+      ctx->vertices[0][1][0] = 0.0f; /*s*/
+      ctx->vertices[0][1][1] = 0.0f; /*t*/
+      ctx->vertices[0][1][2] = 0.0f; /*r*/
+
+      ctx->vertices[1][1][0] = 1.0f;
+      ctx->vertices[1][1][1] = 0.0f;
+      ctx->vertices[1][1][2] = 0.0f;
+
+      ctx->vertices[2][1][0] = 1.0f;
+      ctx->vertices[2][1][1] = 1.0f;
+      ctx->vertices[2][1][2] = 0.0f;
+
+      ctx->vertices[3][1][0] = 0.0f;
+      ctx->vertices[3][1][1] = 1.0f;
+      ctx->vertices[3][1][2] = 0.0f;
+   }
 
    offset = get_next_slot( ctx );
 
@@ -1503,6 +1577,8 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,
 
       /* quad coords in window coords (bypassing vs, clip and viewport) */
       offset = set_vertex_data(ctx,
+                               pt->target,
+                               face,
                                (float) pt->width[dstLevel],
                                (float) pt->height[dstLevel]);
 




More information about the mesa-commit mailing list