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

Ramin Azarmehr ramin.azarmehr at gmail.com
Fri Jun 8 21:39:10 UTC 2018


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.

---
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);
    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;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/virglrenderer-devel/attachments/20180608/3f230ba9/attachment.html>


More information about the virglrenderer-devel mailing list