<div dir="ltr"><div>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_<wbr>common(). So, we'll get "illegal shader" errors at initialization stage if vrend_state.max_draw_buffers is set in fill_caps (tested that). <br></div><div>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.<br></div><div><br></div><div>---</div>diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c<br>index 8fd113b..c7f41a4 100644<br>--- a/src/vrend_renderer.c<br>+++ b/src/vrend_renderer.c<br>@@ -123,6 +123,7 @@ struct global_renderer_state {<br>    /* these appeared broken on at least one driver */<br>    bool use_explicit_locations;<br>    uint32_t max_uniform_blocks;<br>+   uint32_t max_draw_buffers;<br>    struct list_head active_ctx_list;<br> <br>    /* threaded sync */<br>@@ -4297,6 +4298,7 @@ int vrend_renderer_init(struct vrend_if_cbs *cbs, uint32_t flags)<br>    if (vrend_state.have_debug_cb) {<br>       glDisable(GL_DEBUG_OUTPUT);<br>    }<br>+   glGetIntegerv(GL_MAX_DRAW_BUFFERS, (GLint *) &vrend_state.max_draw_buffers);<br> <br>    vrend_clicbs->destroy_gl_context(gl_context);<br>    list_inithead(&vrend_state.fence_list);<br>@@ -4463,6 +4465,7 @@ struct vrend_context *vrend_create_context(int id, uint32_t nlen, const char *de<br>    grctx->shader_cfg.use_gles = vrend_state.use_gles;<br>    grctx->shader_cfg.use_core_profile = vrend_state.use_core_profile;<br>    grctx->shader_cfg.use_explicit_locations = vrend_state.use_explicit_locations;<br>+   grctx->shader_cfg.max_draw_buffers = vrend_state.max_draw_buffers;<br>    vrend_renderer_create_sub_ctx(grctx, 0);<br>    vrend_renderer_set_sub_ctx(grctx, 0);<br> <br>@@ -6734,8 +6737,7 @@ static bool vrend_renderer_fill_caps_common(uint32_t set, UNUSED uint32_t versio<br> <br> <br>    /* Common limits for all backends. */<br>-   glGetIntegerv(GL_MAX_DRAW_BUFFERS, &max);<br>-   caps->v1.max_render_targets = max;<br>+   caps->v1.max_render_targets = vrend_state.max_draw_buffers;<br> <br>    glGetIntegerv(GL_MAX_SAMPLES, &max);<br>    caps->v1.max_samples = max;<br>diff --git a/src/vrend_shader.c b/src/vrend_shader.c<br>index 8cc695a..d477d67 100644<br>--- a/src/vrend_shader.c<br>+++ b/src/vrend_shader.c<br>@@ -994,7 +994,7 @@ static int emit_cbuf_writes(struct dump_ctx *ctx)<br>    int i;<br>    char *sret;<br> <br>-   for (i = ctx->num_outputs; i < 8; i++) {<br>+   for (i = ctx->num_outputs; i < ctx->cfg->max_draw_buffers; i++) {<br>       snprintf(buf, 255, "fsout_c%d = fsout_c0;\n", i);<br>       sret = add_str_to_glsl_main(ctx, buf);<br>       if (!sret)<br>@@ -2963,7 +2963,7 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)<br>       }<br>    }<br>    if (ctx->write_all_cbufs) {<br>-      for (i = 0; i < 8; i++) {<br>+      for (i = 0; i < ctx->cfg->max_draw_buffers; i++) {<br>          if (ctx->cfg->use_gles)<br>             snprintf(buf, 255, "layout (location=%d) out vec4 fsout_c%d;\n", i, i);<br>          else<br>diff --git a/src/vrend_shader.h b/src/vrend_shader.h<br>index 149f389..bcfa78e 100644<br>--- a/src/vrend_shader.h<br>+++ b/src/vrend_shader.h<br>@@ -90,6 +90,7 @@ struct vrend_shader_key {<br> <br> struct vrend_shader_cfg {<br>    int glsl_version;<br>+   int max_draw_buffers;<br>    bool use_gles;<br>    bool use_core_profile;<br>    bool use_explicit_locations;<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 8, 2018 at 6:21 PM, Gurchetan Singh <span dir="ltr"><<a href="mailto:gurchetansingh@chromium.org" target="_blank">gurchetansingh@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Fri, Jun 8, 2018 at 2:39 PM Ramin Azarmehr <<a href="mailto:ramin.azarmehr@gmail.com">ramin.azarmehr@gmail.com</a>> wrote:<br>
><br>
> Not all platforms have 8 render targets. So, get the maximum draw buffers at runtime, and pass to shader.<br>
> 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.<br>
><br>
> 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.<br>
<br>
</span>Posting style is definitely fine, please do send more patches :-)<br>
<span class=""><br>
> ---<br>
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c<br>
> index 8fd113b..f43c944 100644<br>
> --- a/src/vrend_renderer.c<br>
> +++ b/src/vrend_renderer.c<br>
> @@ -4466,6 +4466,7 @@ struct vrend_context *vrend_create_context(int id, uint32_t nlen, const char *de<br>
>     vrend_renderer_create_sub_ctx(<wbr>grctx, 0);<br>
>     vrend_renderer_set_sub_ctx(<wbr>grctx, 0);<br>
><br>
> +   glGetIntegerv(GL_MAX_DRAW_<wbr>BUFFERS, &grctx->shader_cfg.max_draw_<wbr>buffers);<br>
<br>
</span>nit: typically this code derives the shader_cfg from the vrend_state.<br>
Since we already query for GL_MAX_DRAW_BUFFERS in<br>
vrend_renderer_fill_caps_<wbr>common, can you just add a field vrend_state<br>
(like max_uniform_blocks) and copy it in vrend_create_context?<br>
<div><div class="h5"><br>
>     vrender_get_glsl_version(&<wbr>grctx->shader_cfg.glsl_<wbr>version);<br>
><br>
>     list_addtail(&grctx->ctx_<wbr>entry, &vrend_state.active_ctx_list);<wbr>diff --git a/src/vrend_shader.c b/src/vrend_shader.c<br>
> index 8cc695a..d477d67 100644<br>
> --- a/src/vrend_shader.c<br>
> +++ b/src/vrend_shader.c<br>
> @@ -994,7 +994,7 @@ static int emit_cbuf_writes(struct dump_ctx *ctx)<br>
>     int i;<br>
>     char *sret;<br>
><br>
> -   for (i = ctx->num_outputs; i < 8; i++) {<br>
> +   for (i = ctx->num_outputs; i < ctx->cfg->max_draw_buffers; i++) {<br>
>        snprintf(buf, 255, "fsout_c%d = fsout_c0;\n", i);<br>
>        sret = add_str_to_glsl_main(ctx, buf);<br>
>        if (!sret)<br>
> @@ -2963,7 +2963,7 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)<br>
>        }<br>
>     }<br>
>     if (ctx->write_all_cbufs) {<br>
> -      for (i = 0; i < 8; i++) {<br>
> +      for (i = 0; i < ctx->cfg->max_draw_buffers; i++) {<br>
>           if (ctx->cfg->use_gles)<br>
>              snprintf(buf, 255, "layout (location=%d) out vec4 fsout_c%d;\n", i, i);<br>
>           elsediff --git a/src/vrend_shader.h b/src/vrend_shader.h<br>
> index 149f389..bcfa78e 100644<br>
> --- a/src/vrend_shader.h<br>
> +++ b/src/vrend_shader.h<br>
> @@ -90,6 +90,7 @@ struct vrend_shader_key {<br>
><br>
>  struct vrend_shader_cfg {<br>
>     int glsl_version;<br>
> +   int max_draw_buffers;<br>
>     bool use_gles;<br>
>     bool use_core_profile;<br>
>     bool use_explicit_locations;<br>
</div></div>> ______________________________<wbr>_________________<br>
> virglrenderer-devel mailing list<br>
> <a href="mailto:virglrenderer-devel@lists.freedesktop.org">virglrenderer-devel@lists.<wbr>freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/<wbr>virglrenderer-devel</a><br>
</blockquote></div><br></div>