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

Jakob Bornecrantz jakob at collabora.com
Mon Jun 11 15:34:50 UTC 2018


On 2018-06-11 15:46, Ramin Azarmehr wrote:
> Thank you Gurchetan. The problem is that the context 0 (master) is 
> created in vrend_renderer_init(), before caps parameters are populated 
> in vrend_renderer_fill_caps_common(). So, we'll get "illegal shader" 
> errors at initialization stage if vrend_state.max_draw_buffers is set in 
> fill_caps (tested that).
> In the following patch I added max_draw_buffers to vrend_state, but set 
> it at vrend_renderer_init() before context 0 is created. Let me know if 
> this is fine.

Thanks for your patch! The changes are
Reviewed-by: Jakob Bornecrantz <jakob at collabora.com>

But it looks like your email client baldy messed up the patch, maybe 
resend it via git send-email or something similar?

Cheers, Jakob.

> 
> ---
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
> index 8fd113b..c7f41a4 100644
> --- a/src/vrend_renderer.c
> +++ b/src/vrend_renderer.c
> @@ -123,6 +123,7 @@ struct global_renderer_state {
>      /* these appeared broken on at least one driver */
>      bool use_explicit_locations;
>      uint32_t max_uniform_blocks;
> +   uint32_t max_draw_buffers;
>      struct list_head active_ctx_list;
> 
>      /* threaded sync */
> @@ -4297,6 +4298,7 @@ int vrend_renderer_init(struct vrend_if_cbs *cbs, 
> uint32_t flags)
>      if (vrend_state.have_debug_cb) {
>         glDisable(GL_DEBUG_OUTPUT);
>      }
> +   glGetIntegerv(GL_MAX_DRAW_BUFFERS, (GLint *) 
> &vrend_state.max_draw_buffers);
> 
>      vrend_clicbs->destroy_gl_context(gl_context);
>      list_inithead(&vrend_state.fence_list);
> @@ -4463,6 +4465,7 @@ struct vrend_context *vrend_create_context(int id, 
> uint32_t nlen, const char *de
>      grctx->shader_cfg.use_gles = vrend_state.use_gles;
>      grctx->shader_cfg.use_core_profile = vrend_state.use_core_profile;
>      grctx->shader_cfg.use_explicit_locations = 
> vrend_state.use_explicit_locations;
> +   grctx->shader_cfg.max_draw_buffers = vrend_state.max_draw_buffers;
>      vrend_renderer_create_sub_ctx(grctx, 0);
>      vrend_renderer_set_sub_ctx(grctx, 0);
> 
> @@ -6734,8 +6737,7 @@ static bool 
> vrend_renderer_fill_caps_common(uint32_t set, UNUSED uint32_t versio
> 
> 
>      /* Common limits for all backends. */
> -   glGetIntegerv(GL_MAX_DRAW_BUFFERS, &max);
> -   caps->v1.max_render_targets = max;
> +   caps->v1.max_render_targets = vrend_state.max_draw_buffers;
> 
>      glGetIntegerv(GL_MAX_SAMPLES, &max);
>      caps->v1.max_samples = max;
> 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);
>            else
> diff --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;
> 
> 
> On Fri, Jun 8, 2018 at 6:21 PM, Gurchetan Singh 
> <gurchetansingh at chromium.org <mailto:gurchetansingh at chromium.org>> wrote:
> 
>     On Fri, Jun 8, 2018 at 2:39 PM Ramin Azarmehr
>     <ramin.azarmehr at gmail.com <mailto: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
>     <mailto:virglrenderer-devel at lists.freedesktop.org>
>      >
>     https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel
>     <https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel>
> 
> 
> 
> 
> _______________________________________________
> 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