[virglrenderer-devel] [PATCH] virglrenderer: add ARB_cull_distance support.

Jakob Bornecrantz jakob at collabora.com
Thu Mar 22 01:10:31 UTC 2018


Looks good.

Tested-by: Jakob Bornecrantz <jakob at collabora.com>
Reviewed-by: Jakob Bornecrantz <jakob at collabora.com>

Cheers, Jakob.

On 2018-03-21 00:32, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> This was pretty trivial to implement, so let's just get it out of the way.
> ---
>   src/vrend_renderer.c |  7 +++++++
>   src/vrend_shader.c   | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>   2 files changed, 49 insertions(+), 7 deletions(-)
> 
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
> index b3c09c5..654d3d3 100644
> --- a/src/vrend_renderer.c
> +++ b/src/vrend_renderer.c
> @@ -6756,6 +6756,13 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
>         caps->v1.bset.shader_stencil_export = 1;
>      }
>   
> +   if (gl_ver >= 45) {
> +     caps->v1.bset.has_cull = 1;
> +   } else {
> +     if (epoxy_has_gl_extension("GL_ARB_cull_distance"))
> +        caps->v1.bset.has_cull = 1;
> +   }
> +
>      if (epoxy_has_gl_extension("GL_EXT_texture_mirror_clamp")) {
>         caps->v1.bset.mirror_clamp = true;
>      }
> diff --git a/src/vrend_shader.c b/src/vrend_shader.c
> index 2e52d32..aa2c282 100644
> --- a/src/vrend_shader.c
> +++ b/src/vrend_shader.c
> @@ -134,6 +134,8 @@ struct dump_ctx {
>      int num_clip_dist;
>      int glsl_ver_required;
>      int color_in_mask;
> +   /* only used when cull is enabled */
> +   uint8_t num_cull_dist_prop, num_clip_dist_prop;
>      bool front_face_emitted;
>      bool has_ints;
>      bool has_instanceid;
> @@ -748,6 +750,14 @@ iter_property(struct tgsi_iterate_context *iter,
>      if (prop->Property.PropertyName == TGSI_PROPERTY_GS_INVOCATIONS) {
>         ctx->gs_num_invocations = prop->u[0].Data;
>      }
> +
> +   if (prop->Property.PropertyName == TGSI_PROPERTY_NUM_CLIPDIST_ENABLED) {
> +      ctx->num_clip_dist_prop = prop->u[0].Data;
> +   }
> +
> +   if (prop->Property.PropertyName == TGSI_PROPERTY_NUM_CULLDIST_ENABLED) {
> +      ctx->num_cull_dist_prop = prop->u[0].Data;
> +   }
>      return TRUE;
>   }
>   
> @@ -989,7 +999,8 @@ static int emit_clip_dist_movs(struct dump_ctx *ctx)
>      char buf[255];
>      int i;
>      char *sret;
> -
> +   bool has_prop = (ctx->num_clip_dist_prop + ctx->num_cull_dist_prop) > 0;
> +   int ndists;
>      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);
> @@ -999,7 +1010,10 @@ static int emit_clip_dist_movs(struct dump_ctx *ctx)
>         }
>         return 0;
>      }
> -   for (i = 0; i < ctx->num_clip_dist; i++) {
> +   ndists = ctx->num_clip_dist;
> +   if (has_prop)
> +      ndists = ctx->num_clip_dist_prop + ctx->num_cull_dist_prop;
> +   for (i = 0; i < ndists; i++) {
>         int clipidx = i < 4 ? 0 : 1;
>         char swiz = i & 3;
>         char wm = 0;
> @@ -1011,8 +1025,14 @@ static int emit_clip_dist_movs(struct dump_ctx *ctx)
>         default:
>            return EINVAL;
>         }
> -      snprintf(buf, 255, "gl_ClipDistance[%d] = clip_dist_temp[%d].%c;\n",
> -               i, clipidx, wm);
> +      bool is_cull = false;
> +      if (has_prop) {
> +         if (i >= ctx->num_clip_dist_prop && i < ctx->num_clip_dist_prop + ctx->num_cull_dist_prop)
> +            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,
> +               is_cull ? i - ctx->num_clip_dist_prop : i, clipidx, wm);
>         sret = add_str_to_glsl_main(ctx, buf);
>         if (!sret)
>            return ENOMEM;
> @@ -2288,6 +2308,8 @@ 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)
> +         STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_cull_distance : require\n");
>      }
>      return glsl_hdr;
>   }
> @@ -2462,17 +2484,30 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
>            STRCAT_WITH_RET(glsl_hdr, buf);
>         }
>         if (ctx->num_clip_dist || ctx->key->clip_plane_enable) {
> -
> +         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);
>            if (ctx->key->clip_plane_enable) {
>               snprintf(buf, 255, "uniform vec4 clipp[8];\n");
>               STRCAT_WITH_RET(glsl_hdr, buf);
>            }
>            if (ctx->key->gs_present) {
>               ctx->vs_has_pervertex = true;
> -            snprintf(buf, 255, "out gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize;\n float gl_ClipDistance[%d];\n};\n", ctx->num_clip_dist ? ctx->num_clip_dist : 8);
> +            snprintf(buf, 255, "out gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize;\n%s%s};\n", clip_buf, cull_buf);
>               STRCAT_WITH_RET(glsl_hdr, buf);
>            } else {
> -            snprintf(buf, 255, "out float gl_ClipDistance[%d];\n", ctx->num_clip_dist ? ctx->num_clip_dist : 8);
> +            snprintf(buf, 255, "%s%s", clip_buf, cull_buf);
>               STRCAT_WITH_RET(glsl_hdr, buf);
>            }
>            snprintf(buf, 255, "vec4 clip_dist_temp[2];\n");
> 



More information about the virglrenderer-devel mailing list