broadcom/vc5: Shift the min/max lod fields by the BASE_LEVEL.
authorEric Anholt <eric@anholt.net>
Thu, 2 Nov 2017 19:49:46 +0000 (12:49 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 7 Nov 2017 17:40:25 +0000 (09:40 -0800)
The lod clamping is what limits you between base and last level, and the
base level field is just there to help decide where the min/mag change
happens.

Fixes tex-miplevel-selection GL2:texture()

src/gallium/drivers/vc5/vc5_emit.c
src/gallium/drivers/vc5/vc5_state.c

index 24682d90669dea5c6fb08cba42b0534b8ac018c4..c0b5d541978d6d98ecdc14dbaa0305bfbdec73c5 100644 (file)
@@ -130,9 +130,21 @@ emit_one_texture(struct vc5_context *vc5, struct vc5_texture_stateobj *stage_tex
                 .border_color_blue = swizzled_border_color(psampler, sview, 2),
                 .border_color_alpha = swizzled_border_color(psampler, sview, 3),
 
-                /* XXX: Disable min/maxlod for txf */
-                .max_level_of_detail = MIN2(MIN2(psampler->max_lod,
-                                                 VC5_MAX_MIP_LEVELS),
+                /* In the normal texturing path, the LOD gets clamped between
+                 * min/max, and the base_level field (set in the sampler view
+                 * from first_level) only decides where the min/mag switch
+                 * happens, so we need to use the LOD clamps to keep us
+                 * between min and max.
+                 *
+                 * For txf, the LOD clamp is still used, despite GL not
+                 * wanting that.  We will need to have a separate
+                 * TEXTURE_SHADER_STATE that ignores psview->min/max_lod to
+                 * support txf properly.
+                 */
+                .min_level_of_detail = (psview->u.tex.first_level +
+                                        MAX2(psampler->min_lod, 0)),
+                .max_level_of_detail = MIN2(psview->u.tex.first_level +
+                                            psampler->max_lod,
                                             psview->u.tex.last_level),
 
                 .texture_base_pointer = cl_address(rsc->bo,
index d88555354917bac3f081d18e7dfc34ba61588182..dc0ee12260bbc485917e039c27089ddd405c8d43 100644 (file)
@@ -524,7 +524,6 @@ vc5_create_sampler_state(struct pipe_context *pctx,
         }
 
         v3dx_pack(&so->texture_shader_state, TEXTURE_SHADER_STATE, tex) {
-                tex.min_level_of_detail = MAX2(cso->min_lod, 0.0);
                 tex.depth_compare_function = cso->compare_func;
                 tex.fixed_bias = cso->lod_bias;
         }