freedreno: Skip built-in shaders for clover
authorRob Clark <robdclark@chromium.org>
Sun, 8 Aug 2021 19:14:55 +0000 (12:14 -0700)
committerMarge Bot <eric+marge@anholt.net>
Thu, 21 Oct 2021 18:59:57 +0000 (18:59 +0000)
Avoids assert:

  ../src/compiler/glsl_types.cpp:1134: static const glsl_type *glsl_type::get_array_instance(const glsl_type *, unsigned int, unsigned int): Assertion `glsl_type_users > 0' failed.

caused by us trying to compile built-in shaders (ie. clear, gmem<->mem,
etc) before clover has initialized glsl_types.  But we don't need these
shaders for compute-only contexts.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13300>

src/gallium/drivers/freedreno/a2xx/fd2_context.c
src/gallium/drivers/freedreno/a3xx/fd3_context.c
src/gallium/drivers/freedreno/a4xx/fd4_context.c
src/gallium/drivers/freedreno/a5xx/fd5_context.c
src/gallium/drivers/freedreno/a6xx/fd6_context.c
src/gallium/drivers/freedreno/freedreno_context.c
src/gallium/drivers/freedreno/freedreno_context.h
src/gallium/drivers/freedreno/freedreno_program.c

index 3429fb0..ee1711c 100644 (file)
@@ -83,6 +83,7 @@ fd2_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
    pctx = &fd2_ctx->base.base;
    pctx->screen = pscreen;
 
+   fd2_ctx->base.flags = flags;
    fd2_ctx->base.dev = fd_device_ref(screen->dev);
    fd2_ctx->base.screen = fd_screen(pscreen);
 
index ec73d22..84c8026 100644 (file)
@@ -72,6 +72,7 @@ fd3_context_create(struct pipe_screen *pscreen, void *priv,
    pctx = &fd3_ctx->base.base;
    pctx->screen = pscreen;
 
+   fd3_ctx->base.flags = flags;
    fd3_ctx->base.dev = fd_device_ref(screen->dev);
    fd3_ctx->base.screen = fd_screen(pscreen);
    fd3_ctx->base.last.key = &fd3_ctx->last_key;
index 3d65198..58b6f2d 100644 (file)
@@ -72,6 +72,7 @@ fd4_context_create(struct pipe_screen *pscreen, void *priv,
    pctx = &fd4_ctx->base.base;
    pctx->screen = pscreen;
 
+   fd4_ctx->base.flags = flags;
    fd4_ctx->base.dev = fd_device_ref(screen->dev);
    fd4_ctx->base.screen = fd_screen(pscreen);
    fd4_ctx->base.last.key = &fd4_ctx->last_key;
index 26d0bd5..7296d51 100644 (file)
@@ -71,6 +71,7 @@ fd5_context_create(struct pipe_screen *pscreen, void *priv,
    pctx = &fd5_ctx->base.base;
    pctx->screen = pscreen;
 
+   fd5_ctx->base.flags = flags;
    fd5_ctx->base.dev = fd_device_ref(screen->dev);
    fd5_ctx->base.screen = fd_screen(pscreen);
    fd5_ctx->base.last.key = &fd5_ctx->last_key;
index 4da4e2d..7951e10 100644 (file)
@@ -210,6 +210,7 @@ fd6_context_create(struct pipe_screen *pscreen, void *priv,
    pctx = &fd6_ctx->base.base;
    pctx->screen = pscreen;
 
+   fd6_ctx->base.flags = flags;
    fd6_ctx->base.dev = fd_device_ref(screen->dev);
    fd6_ctx->base.screen = fd_screen(pscreen);
    fd6_ctx->base.last.key = &fd6_ctx->last_key;
index 2c2b33d..9656d64 100644 (file)
@@ -603,6 +603,7 @@ fd_context_init(struct fd_context *ctx, struct pipe_screen *pscreen,
    if (FD_DBG(BSTAT) || FD_DBG(MSGS))
       ctx->stats_users++;
 
+   ctx->flags = flags;
    ctx->screen = screen;
    ctx->pipe = fd_pipe_new2(screen->dev, FD_PIPE_3D, prio);
 
index 9da86bf..35135b4 100644 (file)
@@ -198,6 +198,8 @@ struct ir3_shader_key;
 struct fd_context {
    struct pipe_context base;
 
+   unsigned flags;      /* PIPE_CONTEXT_x */
+
    struct threaded_context *tc;
 
    struct list_head node; /* node in screen->context_list */
index 3a7963f..5b1532b 100644 (file)
@@ -204,6 +204,9 @@ fd_prog_init(struct pipe_context *pctx)
    pctx->bind_fs_state = fd_fs_state_bind;
    pctx->set_patch_vertices = fd_set_patch_vertices;
 
+   if (ctx->flags & PIPE_CONTEXT_COMPUTE_ONLY)
+      return;
+
    ctx->solid_prog.fs = assemble_tgsi(pctx, solid_fs, true);
    ctx->solid_prog.vs = assemble_tgsi(pctx, solid_vs, false);
 
@@ -238,6 +241,9 @@ fd_prog_fini(struct pipe_context *pctx)
    struct fd_context *ctx = fd_context(pctx);
    int i;
 
+   if (ctx->flags & PIPE_CONTEXT_COMPUTE_ONLY)
+      return;
+
    pctx->delete_vs_state(pctx, ctx->solid_prog.vs);
    pctx->delete_fs_state(pctx, ctx->solid_prog.fs);