add 'normalized_coords' field to pipe_sampler_state
authorBrian <brian.paul@tungstengraphics.com>
Mon, 15 Oct 2007 17:47:53 +0000 (11:47 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 15 Oct 2007 17:47:53 +0000 (11:47 -0600)
This controls whether texcoords are interpreted as-is or scaled up from [0,1].
Fixes glDrawPixels/glBitmap problems on i915 when image is non power-of-two.
Also, cleans up the CSO sampler state for i915 a bit.

src/mesa/pipe/i915simple/i915_state.c
src/mesa/pipe/i915simple/i915_state_sampler.c
src/mesa/pipe/p_state.h
src/mesa/pipe/softpipe/sp_tex_sample.c
src/mesa/state_tracker/st_atom_sampler.c
src/mesa/state_tracker/st_cb_drawpixels.c

index 4a31747fe85ab809a3c588fd1ed62ae2995803de..8da5662e3fe3e6a6e8c230f5688f30bc33318019 100644 (file)
@@ -262,6 +262,9 @@ i915_create_sampler_state(struct pipe_context *pipe,
        (translate_wrap_mode(wt) << SS3_TCY_ADDR_MODE_SHIFT) |
        (translate_wrap_mode(wr) << SS3_TCZ_ADDR_MODE_SHIFT));
 
+   if (sampler->normalized_coords)
+      cso->state[1] |= SS3_NORMALIZED_COORDS;
+
    {
       ubyte r = float_to_ubyte(sampler->border_color[0]);
       ubyte g = float_to_ubyte(sampler->border_color[1]);
index 3b736f9c551bbd9c3806e44313a9f359e3e8d68b..8dec6781cd5c481f43a71ef958f18efc5959097b 100644 (file)
@@ -127,10 +127,6 @@ static void update_sampler(struct i915_context *i915,
 #endif
 
    state[1] |= (unit << SS3_TEXTUREMAP_INDEX_SHIFT);
-
-   if (is_power_of_two_texture(mt)) {
-      state[1] |= SS3_NORMALIZED_COORDS;
-   }
 }
 
 void i915_update_samplers( struct i915_context *i915 )
index 99ec574124c3dc9025b2976b5244b56f0772b6e4..da62aa1b274e4123b4c06463e217fa46c302fd31 100644 (file)
@@ -243,6 +243,7 @@ struct pipe_sampler_state
    unsigned compare:1;       /**< shadow/depth compare enabled? */
    unsigned compare_mode:1;  /**< PIPE_TEX_COMPARE_x */
    unsigned compare_func:3;  /**< PIPE_FUNC_x */
+   unsigned normalized_coords:1;  /**< Are coords normalized to [0,1]? */
    float shadow_ambient; /**< shadow test fail color/intensity */
    float min_lod;
    float max_lod;
index aab26f0b0e80327fb58887324a84b76103edc76c..6ff84119e5fc394c6266b811630cc78831df1b46 100644 (file)
@@ -427,8 +427,9 @@ compute_lambda(struct tgsi_sampler *sampler,
       float dsdy = s[QUAD_TOP_LEFT]     - s[QUAD_BOTTOM_LEFT];
       dsdx = FABSF(dsdx);
       dsdy = FABSF(dsdy);
-      /* XXX only multiply by width for NORMALIZEd texcoords */
-      rho = MAX2(dsdx, dsdy) * sampler->texture->width0;
+      rho = MAX2(dsdx, dsdy);
+      if (sampler->state->normalized_coords)
+         rho *= sampler->texture->width0;
    }
    if (t) {
       float dtdx = t[QUAD_BOTTOM_RIGHT] - t[QUAD_BOTTOM_LEFT];
@@ -436,8 +437,9 @@ compute_lambda(struct tgsi_sampler *sampler,
       float max;
       dtdx = FABSF(dtdx);
       dtdy = FABSF(dtdy);
-      /* XXX only multiply by height for NORMALIZEd texcoords */
-      max = MAX2(dtdx, dtdy) * sampler->texture->height0;
+      max = MAX2(dtdx, dtdy);
+      if (sampler->state->normalized_coords)
+         max *= sampler->texture->height0;
       rho = MAX2(rho, max);
    }
    if (p) {
@@ -446,8 +448,9 @@ compute_lambda(struct tgsi_sampler *sampler,
       float max;
       dpdx = FABSF(dpdx);
       dpdy = FABSF(dpdy);
-      /* XXX only multiply by depth for NORMALIZEd texcoords */
-      max = MAX2(dpdx, dpdy) * sampler->texture->depth0;
+      max = MAX2(dpdx, dpdy);
+      if (sampler->state->normalized_coords)
+         max *= sampler->texture->depth0;
       rho = MAX2(rho, max);
    }
 
@@ -647,8 +650,13 @@ sp_get_samples_2d_common(struct tgsi_sampler *sampler,
    choose_mipmap_levels(sampler, s, t, p, lodbias,
                         &level0, &level1, &levelBlend, &imgFilter);
 
-   width = sampler->texture->level[level0].width;
-   height = sampler->texture->level[level0].height;
+   if (sampler->state->normalized_coords) {
+      width = sampler->texture->level[level0].width;
+      height = sampler->texture->level[level0].height;
+   }
+   else {
+      width = height = 1.0;
+   }
 
    assert(width > 0);
 
index 151d724863011dd4b6b2bbccc17561a48d72ea80..38de35933e8828485b9deaf0bc57cf213b87c39e 100644 (file)
@@ -136,6 +136,9 @@ update_samplers(struct st_context *st)
          sampler.min_mip_filter = gl_filter_to_mip_filter(texobj->MinFilter);
          sampler.mag_img_filter = gl_filter_to_img_filter(texobj->MagFilter);
 
+         if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB)
+            sampler.normalized_coords = 1;
+
          sampler.lod_bias = st->ctx->Texture.Unit[u].LodBias;
 #if 1
          sampler.min_lod = texobj->MinLod;
index e3479deb7957e11590035bbdb441c3b4b2cd39e8..7d115209f4f8ec736e9a36e4affcb1a80d1cf426 100644 (file)
@@ -558,6 +558,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
       sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
       sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
       sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
+      sampler.normalized_coords = 1;
       cso = st_cached_sampler_state(ctx->st, &sampler);
       pipe->bind_sampler_state(pipe, unit, cso->data);
    }