On 09/09/2015 04:35 AM, Krzesimir Nowak wrote:
These functions will be used by textureQueryLod.
---
  src/gallium/drivers/softpipe/sp_tex_sample.c | 100 +++++++++++++++++++++++++--
  src/gallium/drivers/softpipe/sp_tex_sample.h |   7 ++
  2 files changed, 101 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c 
b/src/gallium/drivers/softpipe/sp_tex_sample.c
index cdec984..6e639e0 100644
--- a/src/gallium/drivers/softpipe/sp_tex_sample.c
+++ b/src/gallium/drivers/softpipe/sp_tex_sample.c
@@ -1937,6 +1937,38 @@ get_gather_component(const float lod_in[TGSI_QUAD_SIZE])
  }

  static void
+clamp_lod(const struct sp_sampler_view *sp_sview,
+          const struct sp_sampler *sp_samp,
+          const float lod[TGSI_QUAD_SIZE],
+          float clamped[TGSI_QUAD_SIZE])

Can you add a comment on this function too? We also have compute_lambda_lod() which does lod clamping so the comments could help to explain what's different between them.


+{
+   const float min_lod = sp_samp->base.min_lod;
+   const float max_lod = sp_samp->base.max_lod;
+   const float min_level = sp_sview->base.u.tex.first_level;
+   const float max_level = sp_sview->base.u.tex.last_level;
+   int i;
+
+   for (i = 0; i < TGSI_QUAD_SIZE; i++) {
+      float cl = lod[i];
+
+      cl = CLAMP(cl, min_lod, max_lod);
+      /* XXX: Is min_level ever different from 0?
+       */
+      cl = CLAMP(cl, 0, max_level - min_level);
+      clamped[i] = cl;
+   }
+}
+
+static void
+mip_level_linear(struct sp_sampler_view *sp_sview,
+                 struct sp_sampler *sp_samp,
+                 const float lod[TGSI_QUAD_SIZE],
+                 float level[TGSI_QUAD_SIZE])
+{
+   clamp_lod(sp_sview, sp_samp, lod, level);
+}
+
+static void
  mip_filter_linear(struct sp_sampler_view *sp_sview,
                    struct sp_sampler *sp_samp,
                    img_filter_func min_filter,
@@ -1998,6 +2030,23 @@ mip_filter_linear(struct sp_sampler_view *sp_sview,
  }


+static void
+mip_level_nearest(struct sp_sampler_view *sp_sview,
+                  struct sp_sampler *sp_samp,
+                  const float lod[TGSI_QUAD_SIZE],
+                  float level[TGSI_QUAD_SIZE])
+{
+   const int first_level = sp_sview->base.u.tex.first_level;
+   int j;
+
+   clamp_lod(sp_sview, sp_samp, lod, level);
+   for (j = 0; j < TGSI_QUAD_SIZE; j++)
+      /* TODO: It should rather be:
+       * level[j] = first_level + ceil(level[j] + 0.5F) - 1.0F;
+       */
+      level[j] = first_level + (int)(level[j] + 0.5F);
+}
+
  /**
   * Compute nearest mipmap level from texcoords.
   * Then sample the texture level for four elements of a quad.
@@ -2050,6 +2099,19 @@ mip_filter_nearest(struct sp_sampler_view *sp_sview,


  static void
+mip_level_none(struct sp_sampler_view *sp_sview,
+               struct sp_sampler *sp_samp,
+               const float lod[TGSI_QUAD_SIZE],
+               float level[TGSI_QUAD_SIZE])
+{
+   int j;
+
+   for (j = 0; j < TGSI_QUAD_SIZE; j++) {
+      level[j] = sp_sview->base.u.tex.first_level;
+   }
+}
+
+static void
  mip_filter_none(struct sp_sampler_view *sp_sview,
                  struct sp_sampler *sp_samp,
                  img_filter_func min_filter,
@@ -2088,6 +2150,15 @@ mip_filter_none(struct sp_sampler_view *sp_sview,


  static void
+mip_level_none_no_filter_select(struct sp_sampler_view *sp_sview,
+                                struct sp_sampler *sp_samp,
+                                const float lod[TGSI_QUAD_SIZE],
+                                float level[TGSI_QUAD_SIZE])
+{
+   mip_level_none(sp_sview, sp_samp, lod, level);
+}
+
+static void
  mip_filter_none_no_filter_select(struct sp_sampler_view *sp_sview,
                                   struct sp_sampler *sp_samp,
                                   img_filter_func min_filter,
@@ -2339,6 +2410,15 @@ img_filter_2d_ewa(struct sp_sampler_view *sp_sview,
  }


+static void
+mip_level_linear_aniso(struct sp_sampler_view *sp_sview,
+                       struct sp_sampler *sp_samp,
+                       const float lod[TGSI_QUAD_SIZE],
+                       float level[TGSI_QUAD_SIZE])
+{
+   mip_level_linear(sp_sview, sp_samp, lod, level);
+}
+
  /**
   * Sample 2D texture using an anisotropic filter.
   */
@@ -2450,6 +2530,14 @@ mip_filter_linear_aniso(struct sp_sampler_view *sp_sview,
     }
  }

+static void
+mip_level_linear_2d_linear_repeat_POT(struct sp_sampler_view *sp_sview,
+                                      struct sp_sampler *sp_samp,
+                                      const float lod[TGSI_QUAD_SIZE],
+                                      float level[TGSI_QUAD_SIZE])
+{
+   mip_level_linear(sp_sview, sp_samp, lod, level);
+}

  /**
   * Specialized version of mip_filter_linear with hard-wired calls to
@@ -2515,12 +2603,12 @@ mip_filter_linear_2d_linear_repeat_POT(
     }
  }

-static struct sp_mip mip_linear = {mip_filter_linear};
-static struct sp_mip mip_nearest = {mip_filter_nearest};
-static struct sp_mip mip_none = {mip_filter_none};
-static struct sp_mip mip_none_no_filter_select = 
{mip_filter_none_no_filter_select};
-static struct sp_mip mip_linear_aniso = {mip_filter_linear_aniso};
-static struct sp_mip mip_linear_2d_linear_repeat_POT = 
{mip_filter_linear_2d_linear_repeat_POT};
+static struct sp_mip mip_linear = {mip_level_linear, mip_filter_linear};
+static struct sp_mip mip_nearest = {mip_level_nearest, mip_filter_nearest};
+static struct sp_mip mip_none = {mip_level_none, mip_filter_none};
+static struct sp_mip mip_none_no_filter_select = 
{mip_level_none_no_filter_select, mip_filter_none_no_filter_select};
+static struct sp_mip mip_linear_aniso = {mip_level_linear_aniso, 
mip_filter_linear_aniso};
+static struct sp_mip mip_linear_2d_linear_repeat_POT = 
{mip_level_linear_2d_linear_repeat_POT, mip_filter_linear_2d_linear_repeat_POT};

Can you wrap the long lines to 78 chars or less?

Otherwise,
Reviewed-by: Brian Paul <bri...@vmware.com>


  /**
   * Do shadow/depth comparisons.
diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.h 
b/src/gallium/drivers/softpipe/sp_tex_sample.h
index 7739f59..89cf9d1 100644
--- a/src/gallium/drivers/softpipe/sp_tex_sample.h
+++ b/src/gallium/drivers/softpipe/sp_tex_sample.h
@@ -87,6 +87,12 @@ typedef void (*mip_filter_func)(struct sp_sampler_view 
*sp_sview,
                                  float 
rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);


+typedef void (*mip_level_func)(struct sp_sampler_view *sp_sview,
+                               struct sp_sampler *sp_samp,
+                               const float lod[TGSI_QUAD_SIZE],
+                               float level[TGSI_QUAD_SIZE]);
+
+
  typedef void (*convert_func)(struct sp_sampler_view *sp_sview,
                               struct sp_sampler *sp_samp,
                               const float s[TGSI_QUAD_SIZE],
@@ -129,6 +135,7 @@ struct sp_sampler_view
  };

  struct sp_mip {
+   mip_level_func level;
     mip_filter_func filter;
  };



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to