[Mesa-dev] [PATCH] st/mesa: also clamp and quantize per-unit lod bias

Nicolai Hähnle nhaehnle at gmail.com
Wed Jul 26 15:48:51 UTC 2017


On 25.07.2017 18:51, Samuel Pitoiset wrote:
> This should probably go to stable too.

It's not strictly a bug fix, but I guess it's small enough for 17.2.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


> Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> 
> On 07/25/2017 05:36 PM, Marek Olšák wrote:
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> ---
>>   src/mesa/state_tracker/st_atom_sampler.c | 7 ++++---
>>   src/mesa/state_tracker/st_cb_texture.c   | 2 +-
>>   src/mesa/state_tracker/st_texture.h      | 1 +
>>   3 files changed, 6 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_atom_sampler.c 
>> b/src/mesa/state_tracker/st_atom_sampler.c
>> index 208b6f7..d9e8de3 100644
>> --- a/src/mesa/state_tracker/st_atom_sampler.c
>> +++ b/src/mesa/state_tracker/st_atom_sampler.c
>> @@ -98,35 +98,36 @@ gl_filter_to_img_filter(GLenum filter)
>>   }
>>   /**
>>    * Convert a gl_sampler_object to a pipe_sampler_state object.
>>    */
>>   void
>>   st_convert_sampler(const struct st_context *st,
>>                      const struct gl_texture_object *texobj,
>>                      const struct gl_sampler_object *msamp,
>> +                   float tex_unit_lod_bias,
>>                      struct pipe_sampler_state *sampler)
>>   {
>>      memset(sampler, 0, sizeof(*sampler));
>>      sampler->wrap_s = gl_wrap_xlate(msamp->WrapS);
>>      sampler->wrap_t = gl_wrap_xlate(msamp->WrapT);
>>      sampler->wrap_r = gl_wrap_xlate(msamp->WrapR);
>>      sampler->min_img_filter = gl_filter_to_img_filter(msamp->MinFilter);
>>      sampler->min_mip_filter = gl_filter_to_mip_filter(msamp->MinFilter);
>>      sampler->mag_img_filter = gl_filter_to_img_filter(msamp->MagFilter);
>>      if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB)
>>         sampler->normalized_coords = 1;
>> -   sampler->lod_bias = msamp->LodBias;
>> +   sampler->lod_bias = msamp->LodBias + tex_unit_lod_bias;
>>      /* Reduce the number of states by allowing only the values that 
>> AMD GCN
>>       * can represent. Apps use lod_bias for smooth transitions to 
>> bigger mipmap
>>       * levels.
>>       */
>>      sampler->lod_bias = CLAMP(sampler->lod_bias, -16, 16);
>>      sampler->lod_bias = floorf(sampler->lod_bias * 256) / 256;
>>      sampler->min_lod = MAX2(msamp->MinLod, 0.0f);
>>      sampler->max_lod = msamp->MaxLod;
>>      if (sampler->max_lod < sampler->min_lod) {
>> @@ -234,23 +235,23 @@ st_convert_sampler_from_unit(const struct 
>> st_context *st,
>>      const struct gl_texture_object *texobj;
>>      struct gl_context *ctx = st->ctx;
>>      const struct gl_sampler_object *msamp;
>>      texobj = ctx->Texture.Unit[texUnit]._Current;
>>      assert(texobj);
>>      assert(texobj->Target != GL_TEXTURE_BUFFER);
>>      msamp = _mesa_get_samplerobj(ctx, texUnit);
>> -   st_convert_sampler(st, texobj, msamp, sampler);
>> +   st_convert_sampler(st, texobj, msamp, 
>> ctx->Texture.Unit[texUnit].LodBias,
>> +                      sampler);
>> -   sampler->lod_bias += ctx->Texture.Unit[texUnit].LodBias;
>>      sampler->seamless_cube_map |= ctx->Texture.CubeMapSeamless;
>>   }
>>   /**
>>    * Update the gallium driver's sampler state for fragment, vertex or
>>    * geometry shader stage.
>>    */
>>   static void
>>   update_shader_samplers(struct st_context *st,
>> diff --git a/src/mesa/state_tracker/st_cb_texture.c 
>> b/src/mesa/state_tracker/st_cb_texture.c
>> index f66e1bd..eba9c30 100644
>> --- a/src/mesa/state_tracker/st_cb_texture.c
>> +++ b/src/mesa/state_tracker/st_cb_texture.c
>> @@ -2965,21 +2965,21 @@ st_NewTextureHandle(struct gl_context *ctx, 
>> struct gl_texture_object *texObj,
>>      struct st_context *st = st_context(ctx);
>>      struct st_texture_object *stObj = st_texture_object(texObj);
>>      struct pipe_context *pipe = st->pipe;
>>      struct pipe_sampler_view *view;
>>      struct pipe_sampler_state sampler = {0};
>>      if (texObj->Target != GL_TEXTURE_BUFFER) {
>>         if (!st_finalize_texture(ctx, pipe, texObj, 0))
>>            return 0;
>> -      st_convert_sampler(st, texObj, sampObj, &sampler);
>> +      st_convert_sampler(st, texObj, sampObj, 0, &sampler);
>>         view = st_get_texture_sampler_view_from_stobj(st, stObj, 
>> sampObj, 0);
>>      } else {
>>         view = st_get_buffer_sampler_view_from_stobj(st, stObj);
>>      }
>>      return pipe->create_texture_handle(pipe, view, &sampler);
>>   }
>>   static void
>> diff --git a/src/mesa/state_tracker/st_texture.h 
>> b/src/mesa/state_tracker/st_texture.h
>> index a6f6ee8..8448f4c 100644
>> --- a/src/mesa/state_tracker/st_texture.h
>> +++ b/src/mesa/state_tracker/st_texture.h
>> @@ -274,20 +274,21 @@ st_convert_image(const struct st_context *st, 
>> const struct gl_image_unit *u,
>>   void
>>   st_convert_image_from_unit(const struct st_context *st,
>>                              struct pipe_image_view *img,
>>                              GLuint imgUnit);
>>   void
>>   st_convert_sampler(const struct st_context *st,
>>                      const struct gl_texture_object *texobj,
>>                      const struct gl_sampler_object *msamp,
>> +                   float tex_unit_lod_bias,
>>                      struct pipe_sampler_state *sampler);
>>   void
>>   st_convert_sampler_from_unit(const struct st_context *st,
>>                                struct pipe_sampler_state *sampler,
>>                                GLuint texUnit);
>>   void
>>   st_update_single_texture(struct st_context *st,
>>                            struct pipe_sampler_view **sampler_view,
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list