[virglrenderer-devel] shader: get maximum number of render targets dynamically

Gurchetan Singh gurchetansingh at chromium.org
Fri Jun 8 22:21:38 UTC 2018


On Fri, Jun 8, 2018 at 2:39 PM Ramin Azarmehr <ramin.azarmehr at gmail.com> wrote:
>
> Not all platforms have 8 render targets. So, get the maximum draw buffers at runtime, and pass to shader.
> e.g., on i.MX8 QuadMax platform (dual GPU), there are only 4 draw buffers per GPU, causing shader compile failures with current virgl code.
>
> P.S.: I'm new to this mailing list system; please advise if there's any problem with my posting style so I can correct before posting my other patches. Thanks.

Posting style is definitely fine, please do send more patches :-)

> ---
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
> index 8fd113b..f43c944 100644
> --- a/src/vrend_renderer.c
> +++ b/src/vrend_renderer.c
> @@ -4466,6 +4466,7 @@ struct vrend_context *vrend_create_context(int id, uint32_t nlen, const char *de
>     vrend_renderer_create_sub_ctx(grctx, 0);
>     vrend_renderer_set_sub_ctx(grctx, 0);
>
> +   glGetIntegerv(GL_MAX_DRAW_BUFFERS, &grctx->shader_cfg.max_draw_buffers);

nit: typically this code derives the shader_cfg from the vrend_state.
Since we already query for GL_MAX_DRAW_BUFFERS in
vrend_renderer_fill_caps_common, can you just add a field vrend_state
(like max_uniform_blocks) and copy it in vrend_create_context?

>     vrender_get_glsl_version(&grctx->shader_cfg.glsl_version);
>
>     list_addtail(&grctx->ctx_entry, &vrend_state.active_ctx_list);diff --git a/src/vrend_shader.c b/src/vrend_shader.c
> index 8cc695a..d477d67 100644
> --- a/src/vrend_shader.c
> +++ b/src/vrend_shader.c
> @@ -994,7 +994,7 @@ static int emit_cbuf_writes(struct dump_ctx *ctx)
>     int i;
>     char *sret;
>
> -   for (i = ctx->num_outputs; i < 8; i++) {
> +   for (i = ctx->num_outputs; i < ctx->cfg->max_draw_buffers; i++) {
>        snprintf(buf, 255, "fsout_c%d = fsout_c0;\n", i);
>        sret = add_str_to_glsl_main(ctx, buf);
>        if (!sret)
> @@ -2963,7 +2963,7 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
>        }
>     }
>     if (ctx->write_all_cbufs) {
> -      for (i = 0; i < 8; i++) {
> +      for (i = 0; i < ctx->cfg->max_draw_buffers; i++) {
>           if (ctx->cfg->use_gles)
>              snprintf(buf, 255, "layout (location=%d) out vec4 fsout_c%d;\n", i, i);
>           elsediff --git a/src/vrend_shader.h b/src/vrend_shader.h
> index 149f389..bcfa78e 100644
> --- a/src/vrend_shader.h
> +++ b/src/vrend_shader.h
> @@ -90,6 +90,7 @@ struct vrend_shader_key {
>
>  struct vrend_shader_cfg {
>     int glsl_version;
> +   int max_draw_buffers;
>     bool use_gles;
>     bool use_core_profile;
>     bool use_explicit_locations;
> _______________________________________________
> virglrenderer-devel mailing list
> virglrenderer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel


More information about the virglrenderer-devel mailing list