[virglrenderer-devel] [PATCH 12/21] tessellation: add clip distance support. (v2)

Dave Airlie airlied at gmail.com
Wed Jun 13 00:56:46 UTC 2018


From: Dave Airlie <airlied at redhat.com>

Just add clip dist support for tess shaders.

v2: drop create_swizzled changes no need at this point
---
 src/vrend_shader.c | 47 +++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 4 deletions(-)

diff --git a/src/vrend_shader.c b/src/vrend_shader.c
index 8710a85..4686c29 100644
--- a/src/vrend_shader.c
+++ b/src/vrend_shader.c
@@ -628,7 +628,9 @@ iter_declaration(struct tgsi_iterate_context *iter,
          }
          /* fallthrough */
       case TGSI_SEMANTIC_CLIPDIST:
-         if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) {
+         if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY ||
+             iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL ||
+             iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) {
             name_prefix = "gl_ClipDistance";
             ctx->inputs[i].glsl_predefined_no_emit = true;
             ctx->inputs[i].glsl_no_index = true;
@@ -763,8 +765,10 @@ iter_declaration(struct tgsi_iterate_context *iter,
          ctx->outputs[i].glsl_no_index = true;
          ctx->num_clip_dist += 4;
          if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX &&
-             ctx->key->gs_present)
+             (ctx->key->gs_present || ctx->key->tcs_present))
             require_glsl_ver(ctx, 150);
+         if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL)
+            ctx->outputs[i].glsl_gl_block = true;
          break;
       case TGSI_SEMANTIC_CLIPVERTEX:
          name_prefix = "gl_ClipVertex";
@@ -1306,9 +1310,13 @@ static int emit_clip_dist_movs(struct dump_ctx *ctx)
    char *sret;
    bool has_prop = (ctx->num_clip_dist_prop + ctx->num_cull_dist_prop) > 0;
    int ndists;
+   const char *prefix="";
+
+   if (ctx->prog_type == PIPE_SHADER_TESS_CTRL)
+      prefix = "gl_out[gl_InvocationID].";
    if (ctx->num_clip_dist == 0 && ctx->key->clip_plane_enable) {
       for (i = 0; i < 8; i++) {
-         snprintf(buf, 255, "gl_ClipDistance[%d] = dot(%s, clipp[%d]);\n", i, ctx->has_clipvertex ? "clipv_tmp" : "gl_Position", i);
+         snprintf(buf, 255, "%sgl_ClipDistance[%d] = dot(%s, clipp[%d]);\n", prefix, i, ctx->has_clipvertex ? "clipv_tmp" : "gl_Position", i);
          sret = add_str_to_glsl_main(ctx, buf);
          if (!sret)
             return ENOMEM;
@@ -1336,7 +1344,7 @@ static int emit_clip_dist_movs(struct dump_ctx *ctx)
             is_cull = true;
       }
       const char *clip_cull = is_cull ? "Cull" : "Clip";
-      snprintf(buf, 255, "gl_%sDistance[%d] = clip_dist_temp[%d].%c;\n", clip_cull,
+      snprintf(buf, 255, "%sgl_%sDistance[%d] = clip_dist_temp[%d].%c;\n", prefix, clip_cull,
                is_cull ? i - ctx->num_clip_dist_prop : i, clipidx, wm);
       sret = add_str_to_glsl_main(ctx, buf);
       if (!sret)
@@ -2826,6 +2834,13 @@ iter_instruction(struct tgsi_iterate_context *iter,
          if (handle_vertex_proc_exit(ctx) == FALSE)
             return FALSE;
       } else if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL) {
+         ret = emit_clip_dist_movs(ctx);
+         if (ret)
+            return FALSE;
+      } else if (iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) {
+         ret = emit_clip_dist_movs(ctx);
+         if (ret)
+            return FALSE;
          if (!ctx->key->gs_present) {
             ret = emit_prescale(ctx);
             if (ret)
@@ -3356,6 +3371,30 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
       }
    }
 
+   if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL || ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) {
+      if (ctx->num_in_clip_dist || ctx->key->prev_stage_pervertex_out) {
+         int clip_dist, cull_dist;
+         char clip_var[64] = {}, cull_var[64] = {};
+
+         clip_dist = ctx->key->prev_stage_num_clip_out ? ctx->key->prev_stage_num_clip_out : ctx->num_in_clip_dist;
+         cull_dist = ctx->key->prev_stage_num_cull_out;
+
+         if (clip_dist)
+            snprintf(clip_var, 64, "float gl_ClipDistance[%d];\n", clip_dist);
+         if (cull_dist)
+            snprintf(cull_var, 64, "float gl_CullDistance[%d];\n", cull_dist);
+
+         snprintf(buf, 255, "in gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize; \n %s%s} gl_in[];\n", clip_var, cull_var);
+         STRCAT_WITH_RET(glsl_hdr, buf);
+      }
+      if (ctx->num_clip_dist) {
+         snprintf(buf, 255, "out gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize;\n float gl_ClipDistance[%d];\n} gl_out[];\n", ctx->num_clip_dist ? ctx->num_clip_dist : 8);
+         STRCAT_WITH_RET(glsl_hdr, buf);
+         snprintf(buf, 255, "vec4 clip_dist_temp[2];\n");
+         STRCAT_WITH_RET(glsl_hdr, buf);
+      }
+   }
+
    if (ctx->so) {
       char outtype[6] = {0};
       for (i = 0; i < ctx->so->num_outputs; i++) {
-- 
2.14.3



More information about the virglrenderer-devel mailing list