mesa/st: Tie depth_clamp lowering into the FS
authorGert Wollny <gert.wollny@collabora.com>
Thu, 25 Jul 2019 08:34:48 +0000 (10:34 +0200)
committerGert Wollny <gw.fossdev@gmail.com>
Thu, 1 Aug 2019 05:58:53 +0000 (05:58 +0000)
v1 implemented by Erik Faye-Lund <erik.faye-lund@collabora.com>
v2: Use different call for FS
v3: Use file scope defined depth_range_state

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/state_tracker/st_atom_shader.c
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_program.h

index 97abe72d3ef5d232185945242fdc5dd772224868..a10cc21021c54df0d6acdeb8383907ce3d9ef39e 100644 (file)
@@ -131,6 +131,11 @@ st_update_fp( struct st_context *st )
          st->ctx->Multisample.MinSampleShadingValue *
          _mesa_geometric_samples(st->ctx->DrawBuffer) > 1;
 
+      key.lower_depth_clamp =
+         st->clamp_frag_depth_in_shader &&
+         (st->ctx->Transform.DepthClampNear ||
+          st->ctx->Transform.DepthClampFar);
+
       if (stfp->ati_fs) {
          key.fog = st->ctx->Fog._PackedEnabledMode;
 
index 23e9f15cd60192a7f43b9c20e1f2651bb344127b..fa7552b2592b1e53ad74cc532878f21853568f09 100644 (file)
@@ -1365,6 +1365,16 @@ st_create_fp_variant(struct st_context *st,
       }
    }
 
+   if (key->lower_depth_clamp) {
+      unsigned depth_range_const = _mesa_add_state_reference(params, depth_range_state);
+
+      const struct tgsi_token *tokens;
+      tokens = st_tgsi_lower_depth_clamp_fs(tgsi.tokens, depth_range_const);
+      if (tgsi.tokens != stfp->tgsi.tokens)
+         tgsi_free_tokens(tgsi.tokens);
+      tgsi.tokens = tokens;
+   }
+
    if (ST_DEBUG & DEBUG_TGSI) {
       tgsi_dump(tgsi.tokens, 0);
       debug_printf("\n");
index ef55fe333204f90bf696cc51c3ebfb63b91b98b7..eefa340e5cb69d047c46c53678c64e9158b68ea8 100644 (file)
@@ -123,6 +123,9 @@ struct st_fp_variant_key
    /** needed for ATI_fragment_shader */
    GLuint fog:2;
 
+   /** for ARB_depth_clamp */
+   GLuint lower_depth_clamp:1;
+
    /** needed for ATI_fragment_shader */
    char texture_targets[MAX_NUM_FRAGMENT_REGISTERS_ATI];