iris: add support for gl_ClipVertex in tess eval shaders
authorTimothy Arceri <tarceri@itsqueeze.com>
Fri, 28 Jun 2019 12:25:57 +0000 (22:25 +1000)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 1 Aug 2019 23:12:37 +0000 (16:12 -0700)
Required for OpenGL compat support.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_program.c
src/gallium/drivers/iris/iris_state.c
src/intel/compiler/brw_compiler.h

index ed8ffc008aa459fdd411bfe46692a572ab4c6ad2..8a098f50b201de7f84fc5c7b43889c2b1632368a 100644 (file)
@@ -473,6 +473,8 @@ struct iris_vtable {
    void (*populate_tcs_key)(const struct iris_context *ice,
                             struct brw_tcs_prog_key *key);
    void (*populate_tes_key)(const struct iris_context *ice,
+                            const struct shader_info *info,
+                            gl_shader_stage last_stage,
                             struct brw_tes_prog_key *key);
    void (*populate_gs_key)(const struct iris_context *ice,
                            const struct shader_info *info,
index 1453390b02de666d4c12bd850b62e1fc656c4ec2..d5986f4809c65499628cbb6199a568744a162124 100644 (file)
@@ -1246,6 +1246,15 @@ iris_compile_tes(struct iris_context *ice,
 
    nir_shader *nir = nir_shader_clone(mem_ctx, ish->nir);
 
+   if (key->nr_userclip_plane_consts) {
+      nir_function_impl *impl = nir_shader_get_entrypoint(nir);
+      nir_lower_clip_vs(nir, (1 << key->nr_userclip_plane_consts) - 1, true);
+      nir_lower_io_to_temporaries(nir, impl, true, false);
+      nir_lower_global_vars_to_local(nir);
+      nir_lower_vars_to_ssa(nir);
+      nir_shader_gather_info(nir, impl);
+   }
+
    iris_setup_uniforms(compiler, mem_ctx, nir, prog_data, &system_values,
                        &num_system_values, &num_cbufs);
 
@@ -1307,7 +1316,7 @@ iris_update_compiled_tes(struct iris_context *ice)
 
    struct brw_tes_prog_key key = { KEY_INIT(devinfo->gen) };
    get_unified_tess_slots(ice, &key.inputs_read, &key.patch_inputs_read);
-   ice->vtbl.populate_tes_key(ice, &key);
+   ice->vtbl.populate_tes_key(ice, &ish->nir->info, last_vue_stage(ice), &key);
 
    struct iris_compiled_shader *old = ice->shaders.prog[IRIS_CACHE_TES];
    struct iris_compiled_shader *shader =
@@ -2011,6 +2020,10 @@ iris_create_tes_state(struct pipe_context *ctx,
    struct iris_uncompiled_shader *ish = iris_create_shader_state(ctx, state);
    struct shader_info *info = &ish->nir->info;
 
+   /* User clip planes */
+   if (ish->nir->info.clip_distance_array_size == 0)
+      ish->nos |= (1ull << IRIS_NOS_RASTERIZER);
+
    if (screen->precompile) {
       const struct gen_device_info *devinfo = &screen->devinfo;
       struct brw_tes_prog_key key = {
index 60b30739df8ff7e52d98fce9bf743b90994945cf..2c3b18b19bc99e0e8efa917c37083025f8bc4594 100644 (file)
@@ -2181,12 +2181,15 @@ iris_set_clip_state(struct pipe_context *ctx,
    struct iris_context *ice = (struct iris_context *) ctx;
    struct iris_shader_state *shs = &ice->state.shaders[MESA_SHADER_VERTEX];
    struct iris_shader_state *gshs = &ice->state.shaders[MESA_SHADER_GEOMETRY];
+   struct iris_shader_state *tshs = &ice->state.shaders[MESA_SHADER_TESS_EVAL];
 
    memcpy(&ice->state.clip_planes, state, sizeof(*state));
 
-   ice->state.dirty |= IRIS_DIRTY_CONSTANTS_VS | IRIS_DIRTY_CONSTANTS_GS;
+   ice->state.dirty |= IRIS_DIRTY_CONSTANTS_VS | IRIS_DIRTY_CONSTANTS_GS |
+                       IRIS_DIRTY_CONSTANTS_TES;
    shs->sysvals_need_upload = true;
    gshs->sysvals_need_upload = true;
+   tshs->sysvals_need_upload = true;
 }
 
 /**
@@ -3363,8 +3366,16 @@ iris_populate_tcs_key(const struct iris_context *ice,
  */
 static void
 iris_populate_tes_key(const struct iris_context *ice,
+                      const struct shader_info *info,
+                      gl_shader_stage last_stage,
                       struct brw_tes_prog_key *key)
 {
+   const struct iris_rasterizer_state *cso_rast = ice->state.cso_rast;
+
+   if (info->clip_distance_array_size == 0 &&
+       (info->outputs_written & (VARYING_BIT_POS | VARYING_BIT_CLIP_VERTEX)) &&
+       last_stage == MESA_SHADER_TESS_EVAL)
+      key->nr_userclip_plane_consts = cso_rast->num_clip_plane_consts;
 }
 
 /**
index 781e357f2f27db6e46c39232fd5748ba87f9a3f0..614410e3fb7c4f3ea4e711cbfe72cf8bf101e0f0 100644 (file)
@@ -317,6 +317,15 @@ struct brw_tes_prog_key
 
    /** A bitfield of per-vertex inputs read. */
    uint64_t inputs_read;
+
+   /**
+    * How many user clipping planes are being uploaded to the tessellation
+    * evaluation shader as push constants.
+    *
+    * These are used for lowering legacy gl_ClipVertex/gl_Position clipping to
+    * clip distances.
+    */
+   unsigned nr_userclip_plane_consts:4;
 };
 
 /** The program key for Geometry Shaders. */