st/mesa: also clamp and quantize per-unit lod bias
authorMarek Olšák <marek.olsak@amd.com>
Tue, 25 Jul 2017 15:33:05 +0000 (17:33 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 26 Jul 2017 17:53:26 +0000 (19:53 +0200)
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/mesa/state_tracker/st_atom_sampler.c
src/mesa/state_tracker/st_cb_texture.c
src/mesa/state_tracker/st_texture.h

index 208b6f7a1df5c8009bc84891d37fb6bb1cb4aadb..d9e8de3c9e050088b590109c1e57e3603c419769 100644 (file)
@@ -105,6 +105,7 @@ 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));
@@ -119,7 +120,7 @@ st_convert_sampler(const struct st_context *st,
    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.
@@ -241,9 +242,9 @@ st_convert_sampler_from_unit(const struct st_context *st,
 
    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;
 }
 
index d0a7b55c587a304200b321fdf088bce62f4e4460..db2913ed9e37afb9e4de258852208e53c306ab45 100644 (file)
@@ -2972,7 +2972,7 @@ st_NewTextureHandle(struct gl_context *ctx, struct gl_texture_object *texObj,
       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);
index a6f6ee8ebef199df2831f04d222e13448e47d84e..8448f4c6f0293b1ea8ef8e184710af3c16bc653e 100644 (file)
@@ -281,6 +281,7 @@ 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