<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 9, 2015 at 8:19 PM, Ilia Mirkin <span dir="ltr"><<a href="mailto:imirkin@alum.mit.edu" target="_blank">imirkin@alum.mit.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>On Wed, Sep 9, 2015 at 2:17 PM, Roland Scheidegger <<a href="mailto:sroland@vmware.com" target="_blank">sroland@vmware.com</a>> wrote:<br>
> Am 09.09.2015 um 12:35 schrieb Krzesimir Nowak:<br>
>> These functions will be used by textureQueryLod.<br>
>> ---<br>
>>  src/gallium/drivers/softpipe/sp_tex_sample.c | 100 +++++++++++++++++++++++++--<br>
>>  src/gallium/drivers/softpipe/sp_tex_sample.h |   7 ++<br>
>>  2 files changed, 101 insertions(+), 6 deletions(-)<br>
>><br>
>> diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c<br>
>> index cdec984..6e639e0 100644<br>
>> --- a/src/gallium/drivers/softpipe/sp_tex_sample.c<br>
>> +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c<br>
>> @@ -1937,6 +1937,38 @@ get_gather_component(const float lod_in[TGSI_QUAD_SIZE])<br>
>>  }<br>
>><br>
>>  static void<br>
>> +clamp_lod(const struct sp_sampler_view *sp_sview,<br>
>> +          const struct sp_sampler *sp_samp,<br>
>> +          const float lod[TGSI_QUAD_SIZE],<br>
>> +          float clamped[TGSI_QUAD_SIZE])<br>
>> +{<br>
>> +   const float min_lod = sp_samp->base.min_lod;<br>
>> +   const float max_lod = sp_samp->base.max_lod;<br>
>> +   const float min_level = sp_sview->base.u.tex.first_level;<br>
>> +   const float max_level = sp_sview->base.u.tex.last_level;<br>
>> +   int i;<br>
>> +<br>
>> +   for (i = 0; i < TGSI_QUAD_SIZE; i++) {<br>
>> +      float cl = lod[i];<br>
>> +<br>
>> +      cl = CLAMP(cl, min_lod, max_lod);<br>
>> +      /* XXX: Is min_level ever different from 0?<br>
> I think the comment is bogus. min_level can easily be different from 0,<br>
> at least when using ARB_texture_view afaik (playing around with base<br>
> level might also cause this to be non-zero, though I'm not too familiar<br>
> with what the state tracker does for those legacy GL weirdness things).<br>
<br>
</div></div>Either setting the base level or a texture view (or both!) can cause<br>
the min level to be 0.<br></blockquote><div><br></div><div>I believe you wanted to say that setting base level or a texture view can cause min level to be different from 0?<br></div><div><br></div><div>Anyway, I scrapped the comment.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div><br>
><br>
>> +       */<br>
>> +      cl = CLAMP(cl, 0, max_level - min_level);<br>
>> +      clamped[i] = cl;<br>
>> +   }<br>
>> +}<br>
>> +<br>
>> +static void<br>
>> +mip_level_linear(struct sp_sampler_view *sp_sview,<br>
>> +                 struct sp_sampler *sp_samp,<br>
>> +                 const float lod[TGSI_QUAD_SIZE],<br>
>> +                 float level[TGSI_QUAD_SIZE])<br>
>> +{<br>
>> +   clamp_lod(sp_sview, sp_samp, lod, level);<br>
>> +}<br>
>> +<br>
>> +static void<br>
>>  mip_filter_linear(struct sp_sampler_view *sp_sview,<br>
>>                    struct sp_sampler *sp_samp,<br>
>>                    img_filter_func min_filter,<br>
>> @@ -1998,6 +2030,23 @@ mip_filter_linear(struct sp_sampler_view *sp_sview,<br>
>>  }<br>
>><br>
>><br>
>> +static void<br>
>> +mip_level_nearest(struct sp_sampler_view *sp_sview,<br>
>> +                  struct sp_sampler *sp_samp,<br>
>> +                  const float lod[TGSI_QUAD_SIZE],<br>
>> +                  float level[TGSI_QUAD_SIZE])<br>
>> +{<br>
>> +   const int first_level = sp_sview->base.u.tex.first_level;<br>
>> +   int j;<br>
>> +<br>
>> +   clamp_lod(sp_sview, sp_samp, lod, level);<br>
>> +   for (j = 0; j < TGSI_QUAD_SIZE; j++)<br>
>> +      /* TODO: It should rather be:<br>
>> +       * level[j] = first_level + ceil(level[j] + 0.5F) - 1.0F;<br>
>> +       */<br>
>> +      level[j] = first_level + (int)(level[j] + 0.5F);<br>
>> +}<br>
>> +<br>
>>  /**<br>
>>   * Compute nearest mipmap level from texcoords.<br>
>>   * Then sample the texture level for four elements of a quad.<br>
>> @@ -2050,6 +2099,19 @@ mip_filter_nearest(struct sp_sampler_view *sp_sview,<br>
>><br>
>><br>
>>  static void<br>
>> +mip_level_none(struct sp_sampler_view *sp_sview,<br>
>> +               struct sp_sampler *sp_samp,<br>
>> +               const float lod[TGSI_QUAD_SIZE],<br>
>> +               float level[TGSI_QUAD_SIZE])<br>
>> +{<br>
>> +   int j;<br>
>> +<br>
>> +   for (j = 0; j < TGSI_QUAD_SIZE; j++) {<br>
>> +      level[j] = sp_sview->base.u.tex.first_level;<br>
>> +   }<br>
>> +}<br>
>> +<br>
>> +static void<br>
>>  mip_filter_none(struct sp_sampler_view *sp_sview,<br>
>>                  struct sp_sampler *sp_samp,<br>
>>                  img_filter_func min_filter,<br>
>> @@ -2088,6 +2150,15 @@ mip_filter_none(struct sp_sampler_view *sp_sview,<br>
>><br>
>><br>
>>  static void<br>
>> +mip_level_none_no_filter_select(struct sp_sampler_view *sp_sview,<br>
>> +                                struct sp_sampler *sp_samp,<br>
>> +                                const float lod[TGSI_QUAD_SIZE],<br>
>> +                                float level[TGSI_QUAD_SIZE])<br>
>> +{<br>
>> +   mip_level_none(sp_sview, sp_samp, lod, level);<br>
>> +}<br>
>> +<br>
>> +static void<br>
>>  mip_filter_none_no_filter_select(struct sp_sampler_view *sp_sview,<br>
>>                                   struct sp_sampler *sp_samp,<br>
>>                                   img_filter_func min_filter,<br>
>> @@ -2339,6 +2410,15 @@ img_filter_2d_ewa(struct sp_sampler_view *sp_sview,<br>
>>  }<br>
>><br>
>><br>
>> +static void<br>
>> +mip_level_linear_aniso(struct sp_sampler_view *sp_sview,<br>
>> +                       struct sp_sampler *sp_samp,<br>
>> +                       const float lod[TGSI_QUAD_SIZE],<br>
>> +                       float level[TGSI_QUAD_SIZE])<br>
>> +{<br>
>> +   mip_level_linear(sp_sview, sp_samp, lod, level);<br>
>> +}<br>
>> +<br>
>>  /**<br>
>>   * Sample 2D texture using an anisotropic filter.<br>
>>   */<br>
>> @@ -2450,6 +2530,14 @@ mip_filter_linear_aniso(struct sp_sampler_view *sp_sview,<br>
>>     }<br>
>>  }<br>
>><br>
>> +static void<br>
>> +mip_level_linear_2d_linear_repeat_POT(struct sp_sampler_view *sp_sview,<br>
>> +                                      struct sp_sampler *sp_samp,<br>
>> +                                      const float lod[TGSI_QUAD_SIZE],<br>
>> +                                      float level[TGSI_QUAD_SIZE])<br>
>> +{<br>
>> +   mip_level_linear(sp_sview, sp_samp, lod, level);<br>
>> +}<br>
>><br>
>>  /**<br>
>>   * Specialized version of mip_filter_linear with hard-wired calls to<br>
>> @@ -2515,12 +2603,12 @@ mip_filter_linear_2d_linear_repeat_POT(<br>
>>     }<br>
>>  }<br>
>><br>
>> -static struct sp_mip mip_linear = {mip_filter_linear};<br>
>> -static struct sp_mip mip_nearest = {mip_filter_nearest};<br>
>> -static struct sp_mip mip_none = {mip_filter_none};<br>
>> -static struct sp_mip mip_none_no_filter_select = {mip_filter_none_no_filter_select};<br>
>> -static struct sp_mip mip_linear_aniso = {mip_filter_linear_aniso};<br>
>> -static struct sp_mip mip_linear_2d_linear_repeat_POT = {mip_filter_linear_2d_linear_repeat_POT};<br>
>> +static struct sp_mip mip_linear = {mip_level_linear, mip_filter_linear};<br>
>> +static struct sp_mip mip_nearest = {mip_level_nearest, mip_filter_nearest};<br>
>> +static struct sp_mip mip_none = {mip_level_none, mip_filter_none};<br>
>> +static struct sp_mip mip_none_no_filter_select = {mip_level_none_no_filter_select, mip_filter_none_no_filter_select};<br>
>> +static struct sp_mip mip_linear_aniso = {mip_level_linear_aniso, mip_filter_linear_aniso};<br>
>> +static struct sp_mip mip_linear_2d_linear_repeat_POT = {mip_level_linear_2d_linear_repeat_POT, mip_filter_linear_2d_linear_repeat_POT};<br>
>><br>
>>  /**<br>
>>   * Do shadow/depth comparisons.<br>
>> diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.h b/src/gallium/drivers/softpipe/sp_tex_sample.h<br>
>> index 7739f59..89cf9d1 100644<br>
>> --- a/src/gallium/drivers/softpipe/sp_tex_sample.h<br>
>> +++ b/src/gallium/drivers/softpipe/sp_tex_sample.h<br>
>> @@ -87,6 +87,12 @@ typedef void (*mip_filter_func)(struct sp_sampler_view *sp_sview,<br>
>>                                  float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);<br>
>><br>
>><br>
>> +typedef void (*mip_level_func)(struct sp_sampler_view *sp_sview,<br>
>> +                               struct sp_sampler *sp_samp,<br>
>> +                               const float lod[TGSI_QUAD_SIZE],<br>
>> +                               float level[TGSI_QUAD_SIZE]);<br>
>> +<br>
>> +<br>
>>  typedef void (*convert_func)(struct sp_sampler_view *sp_sview,<br>
>>                               struct sp_sampler *sp_samp,<br>
>>                               const float s[TGSI_QUAD_SIZE],<br>
>> @@ -129,6 +135,7 @@ struct sp_sampler_view<br>
>>  };<br>
>><br>
>>  struct sp_mip {<br>
>> +   mip_level_func level;<br>
>>     mip_filter_func filter;<br>
>>  };<br>
>><br>
>><br>
><br>
</div></div>> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br></div></div>