[virglrenderer-devel] [PATCH 3/3] shader: start plumbing number of cull outputs through

Dave Airlie airlied at gmail.com
Mon Mar 26 21:21:00 UTC 2018


From: Dave Airlie <airlied at redhat.com>

This fixes the remaining cull distance tests by making sure
we pipe the cull distance sizing through all the shaders properly.
---
 src/vrend_renderer.c |  1 +
 src/vrend_shader.c   | 66 +++++++++++++++++++++++++++++++++++++++++-----------
 src/vrend_shader.h   |  2 ++
 3 files changed, 56 insertions(+), 13 deletions(-)

diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 038a9dc..f032596 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -2130,6 +2130,7 @@ static inline void vrend_fill_shader_key(struct vrend_context *ctx,
    if ((type == PIPE_SHADER_GEOMETRY || type == PIPE_SHADER_FRAGMENT) && ctx->sub->shaders[PIPE_SHADER_VERTEX]) {
       key->prev_stage_pervertex_out = ctx->sub->shaders[PIPE_SHADER_VERTEX]->sinfo.has_pervertex_out;
       key->prev_stage_num_clip_out = ctx->sub->shaders[PIPE_SHADER_VERTEX]->sinfo.num_clip_out;
+      key->prev_stage_num_cull_out = ctx->sub->shaders[PIPE_SHADER_VERTEX]->sinfo.num_cull_out;
    }
 }
 
diff --git a/src/vrend_shader.c b/src/vrend_shader.c
index a7afb83..3f5fb22 100644
--- a/src/vrend_shader.c
+++ b/src/vrend_shader.c
@@ -1530,7 +1530,11 @@ create_swizzled_clipdist(struct dump_ctx *ctx,
 {
    char clipdistvec[4][64] = {};
    int idx;
+   bool has_prev_vals = (ctx->key->prev_stage_num_cull_out + ctx->key->prev_stage_num_clip_out) > 0;
+   int num_culls = has_prev_vals ? ctx->key->prev_stage_num_cull_out : 0;
+   int num_clips = has_prev_vals ? ctx->key->prev_stage_num_clip_out : ctx->num_in_clip_dist;
    for (unsigned cc = 0; cc < 4; cc++) {
+      const char *cc_name = ctx->inputs[input_idx].glsl_name;
       idx = ctx->inputs[input_idx].sid * 4;
       if (cc == 0)
          idx += src->Register.SwizzleX;
@@ -1540,10 +1544,24 @@ create_swizzled_clipdist(struct dump_ctx *ctx,
          idx += src->Register.SwizzleZ;
       else if (cc == 3)
          idx += src->Register.SwizzleW;
+
+      if (num_culls) {
+         if (idx >= num_clips) {
+            idx -= num_clips;
+            cc_name = "gl_CullDistance";
+         }
+         if (ctx->key->prev_stage_num_cull_out)
+            if (idx >= ctx->key->prev_stage_num_cull_out)
+               idx = 0;
+      } else {
+         if (ctx->key->prev_stage_num_clip_out)
+            if (idx >= ctx->key->prev_stage_num_clip_out)
+               idx = 0;
+      }
       if (gl_in)
-         snprintf(clipdistvec[cc], 64, "%sgl_in%s.%s[%d]", prefix, arrayname, ctx->inputs[input_idx].glsl_name, idx);
+         snprintf(clipdistvec[cc], 64, "%sgl_in%s.%s[%d]", prefix, arrayname, cc_name, idx);
       else
-         snprintf(clipdistvec[cc], 64, "%s%s%s[%d]", prefix, arrayname, ctx->inputs[input_idx].glsl_name, idx);
+         snprintf(clipdistvec[cc], 64, "%s%s%s[%d]", prefix, arrayname, cc_name, idx);
    }
    snprintf(result, 255, "%s(vec4(%s,%s,%s,%s))", stypeprefix, clipdistvec[0], clipdistvec[1], clipdistvec[2], clipdistvec[3]);
 }
@@ -2332,7 +2350,7 @@ static char *emit_header(struct dump_ctx *ctx, char *glsl_hdr)
          STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_sample_shading : require\n");
       if (ctx->uses_gpu_shader5)
          STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_gpu_shader5 : require\n");
-      if (ctx->num_cull_dist_prop)
+      if (ctx->num_cull_dist_prop || ctx->key->prev_stage_num_cull_out)
          STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_cull_distance : require\n");
    }
    return glsl_hdr;
@@ -2546,20 +2564,36 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
       snprintf(buf, 255, "uniform float winsys_adjust_y;\n");
       STRCAT_WITH_RET(glsl_hdr, buf);
       if (ctx->num_in_clip_dist || ctx->key->clip_plane_enable || ctx->key->prev_stage_pervertex_out) {
-         int clip_dist;
+         int clip_dist, cull_dist;
+         char clip_var[64] = {}, cull_var[64] = {};
 
-         if (ctx->key->prev_stage_pervertex_out)
-            clip_dist = ctx->key->prev_stage_num_clip_out;
-         else if (ctx->num_in_clip_dist)
-            clip_dist = ctx->num_in_clip_dist;
-         else
-            clip_dist = 8;
+         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 float gl_ClipDistance[%d];\n} gl_in[];\n", clip_dist);
+         snprintf(buf, 255, "in gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize; \n %s%s\n} gl_in[];\n", clip_var, cull_var);
          STRCAT_WITH_RET(glsl_hdr, buf);
       }
       if (ctx->num_clip_dist) {
-         snprintf(buf, 255, "out float gl_ClipDistance[%d];\n", ctx->num_clip_dist);
+         bool has_prop = (ctx->num_clip_dist_prop + ctx->num_cull_dist_prop) > 0;
+         int num_clip_dists = ctx->num_clip_dist ? ctx->num_clip_dist : 8;
+         int num_cull_dists = 0;
+         char cull_buf[64] = { 0 };
+         char clip_buf[64] = { 0 };
+         if (has_prop) {
+            num_clip_dists = ctx->num_clip_dist_prop;
+            num_cull_dists = ctx->num_cull_dist_prop;
+            if (num_clip_dists)
+               snprintf(clip_buf, 64, "out float gl_ClipDistance[%d];\n", num_clip_dists);
+            if (num_cull_dists)
+               snprintf(cull_buf, 64, "out float gl_CullDistance[%d];\n", num_cull_dists);
+         } else
+            snprintf(clip_buf, 64, "out float gl_ClipDistance[%d];\n", num_clip_dists);
+         snprintf(buf, 255, "%s%s\n", clip_buf, cull_buf);
          STRCAT_WITH_RET(glsl_hdr, buf);
          snprintf(buf, 255, "vec4 clip_dist_temp[2];\n");
          STRCAT_WITH_RET(glsl_hdr, buf);
@@ -2571,6 +2605,10 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
          snprintf(buf, 255, "in float gl_ClipDistance[%d];\n", ctx->key->prev_stage_num_clip_out);
          STRCAT_WITH_RET(glsl_hdr, buf);
       }
+      if (ctx->key->prev_stage_num_cull_out) {
+         snprintf(buf, 255, "in float gl_CullDistance[%d];\n", ctx->key->prev_stage_num_cull_out);
+         STRCAT_WITH_RET(glsl_hdr, buf);
+      }
    }
 
    if (ctx->so) {
@@ -2780,7 +2818,9 @@ char *vrend_convert_shader(struct vrend_shader_cfg *cfg,
    free(glsl_hdr);
    sinfo->num_ucp = ctx.key->clip_plane_enable ? 8 : 0;
    sinfo->has_pervertex_out = ctx.vs_has_pervertex;
-   sinfo->num_clip_out = (ctx.num_clip_dist ? ctx.num_clip_dist : 8);
+   bool has_prop = (ctx.num_clip_dist_prop + ctx.num_cull_dist_prop) > 0;
+   sinfo->num_clip_out = has_prop ? ctx.num_clip_dist_prop : (ctx.num_clip_dist ? ctx.num_clip_dist : 8);
+   sinfo->num_cull_out = has_prop ? ctx.num_cull_dist_prop : 0;
    sinfo->samplers_used_mask = ctx.samplers_used;
    sinfo->num_consts = ctx.num_consts;
    sinfo->num_ubos = ctx.num_ubo;
diff --git a/src/vrend_shader.h b/src/vrend_shader.h
index 098a23e..e54a85c 100644
--- a/src/vrend_shader.h
+++ b/src/vrend_shader.h
@@ -45,6 +45,7 @@ struct vrend_shader_info {
    int glsl_ver;
    bool has_pervertex_out;
    uint8_t num_clip_out;
+   uint8_t num_cull_out;
    uint32_t shadow_samp_mask;
    int gs_out_prim;
    uint32_t attrib_input_mask;
@@ -66,6 +67,7 @@ struct vrend_shader_key {
    bool flatshade;
    bool prev_stage_pervertex_out;
    uint8_t prev_stage_num_clip_out;
+   uint8_t prev_stage_num_cull_out;
    float alpha_ref_val;
    uint32_t cbufs_are_a8_bitmask;
 };
-- 
2.14.3



More information about the virglrenderer-devel mailing list