Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.1:Rings:1-MinimalX
Mesa
U_gallium-add-PIPE_SHADER_CAP_MAX_UNROLL_ITERAT...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File U_gallium-add-PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HI.patch of Package Mesa
From 814f31457e9ae83d4f1e39236f704721b279b73d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= <marek.olsak@amd.com> Date: Tue, 20 Oct 2015 18:26:02 +0200 Subject: [PATCH] gallium: add PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT This avoids a serious r600g bug leading to a GPU hang. The chances this bug will get fixed are pretty low now. I deeply regret listening to others and not pushing this patch, leaving other users with a GPU-crashing driver. Yes, it should be fixed in the compiler and it's ugly, but users couldn't care less about that. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=86720 Cc: 11.0 10.6 <mesa-stable@lists.freedesktop.org> Reviewed-by: Brian Paul <brianp@vmware.com> --- src/gallium/auxiliary/gallivm/lp_bld_limits.h | 2 ++ src/gallium/auxiliary/tgsi/tgsi_exec.h | 2 ++ src/gallium/docs/source/screen.rst | 4 ++++ src/gallium/drivers/freedreno/freedreno_screen.c | 2 ++ src/gallium/drivers/i915/i915_screen.c | 2 ++ src/gallium/drivers/ilo/ilo_screen.c | 2 ++ src/gallium/drivers/nouveau/nv30/nv30_screen.c | 4 ++++ src/gallium/drivers/nouveau/nv50/nv50_screen.c | 2 ++ src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 2 ++ src/gallium/drivers/r300/r300_screen.c | 4 ++++ src/gallium/drivers/r600/r600_pipe.c | 6 ++++++ src/gallium/drivers/radeonsi/si_pipe.c | 2 ++ src/gallium/drivers/svga/svga_screen.c | 4 ++++ src/gallium/drivers/vc4/vc4_screen.c | 2 ++ src/gallium/include/pipe/p_defines.h | 3 ++- src/mesa/state_tracker/st_extensions.c | 3 +++ 16 files changed, 45 insertions(+), 1 deletion(-) Index: mesa-11.0.2/src/gallium/auxiliary/gallivm/lp_bld_limits.h =================================================================== --- mesa-11.0.2.orig/src/gallium/auxiliary/gallivm/lp_bld_limits.h +++ mesa-11.0.2/src/gallium/auxiliary/gallivm/lp_bld_limits.h @@ -137,6 +137,8 @@ gallivm_get_shader_param(enum pipe_shade case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; } /* if we get here, we missed a shader cap above (and should have seen * a compiler warning.) Index: mesa-11.0.2/src/gallium/auxiliary/tgsi/tgsi_exec.h =================================================================== --- mesa-11.0.2.orig/src/gallium/auxiliary/tgsi/tgsi_exec.h +++ mesa-11.0.2/src/gallium/auxiliary/tgsi/tgsi_exec.h @@ -463,6 +463,8 @@ tgsi_exec_get_shader_param(enum pipe_sha case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; } /* if we get here, we missed a shader cap above (and should have seen * a compiler warning.) Index: mesa-11.0.2/src/gallium/docs/source/screen.rst =================================================================== --- mesa-11.0.2.orig/src/gallium/docs/source/screen.rst +++ mesa-11.0.2/src/gallium/docs/source/screen.rst @@ -355,6 +355,10 @@ to be 0. are supported. * ``PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE``: Whether the driver doesn't ignore tgsi_declaration_range::Last for shader inputs and outputs. +* ``PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT``: This is the maximum number + of iterations that loops are allowed to have to be unrolled. It is only + a hint to state trackers. Whether any loops will be unrolled is not + guaranteed. .. _pipe_compute_cap: Index: mesa-11.0.2/src/gallium/drivers/freedreno/freedreno_screen.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/freedreno/freedreno_screen.c +++ mesa-11.0.2/src/gallium/drivers/freedreno/freedreno_screen.c @@ -407,6 +407,8 @@ fd_screen_get_shader_param(struct pipe_s return 16; case PIPE_SHADER_CAP_PREFERRED_IR: return PIPE_SHADER_IR_TGSI; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; } debug_printf("unknown shader param %d\n", param); return 0; Index: mesa-11.0.2/src/gallium/drivers/i915/i915_screen.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/i915/i915_screen.c +++ mesa-11.0.2/src/gallium/drivers/i915/i915_screen.c @@ -167,6 +167,8 @@ i915_get_shader_param(struct pipe_screen case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; default: debug_printf("%s: Unknown cap %u.\n", __FUNCTION__, cap); return 0; Index: mesa-11.0.2/src/gallium/drivers/ilo/ilo_screen.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/ilo/ilo_screen.c +++ mesa-11.0.2/src/gallium/drivers/ilo/ilo_screen.c @@ -138,6 +138,8 @@ ilo_get_shader_param(struct pipe_screen return PIPE_SHADER_IR_TGSI; case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: return 1; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; default: return 0; Index: mesa-11.0.2/src/gallium/drivers/nouveau/nv30/nv30_screen.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/nouveau/nv30/nv30_screen.c +++ mesa-11.0.2/src/gallium/drivers/nouveau/nv30/nv30_screen.c @@ -261,6 +261,8 @@ nv30_screen_get_shader_param(struct pipe case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; default: debug_printf("unknown vertex shader param %d\n", param); return 0; @@ -302,6 +304,8 @@ nv30_screen_get_shader_param(struct pipe case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; default: debug_printf("unknown fragment shader param %d\n", param); return 0; Index: mesa-11.0.2/src/gallium/drivers/nouveau/nv50/nv50_screen.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/nouveau/nv50/nv50_screen.c +++ mesa-11.0.2/src/gallium/drivers/nouveau/nv50/nv50_screen.c @@ -297,6 +297,8 @@ nv50_screen_get_shader_param(struct pipe case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; default: NOUVEAU_ERR("unknown PIPE_SHADER_CAP %d\n", param); return 0; Index: mesa-11.0.2/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c +++ mesa-11.0.2/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c @@ -310,6 +310,8 @@ nvc0_screen_get_shader_param(struct pipe return 16; /* would be 32 in linked (OpenGL-style) mode */ case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: return 16; /* XXX not sure if more are really safe */ + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; default: NOUVEAU_ERR("unknown PIPE_SHADER_CAP %d\n", param); return 0; Index: mesa-11.0.2/src/gallium/drivers/r300/r300_screen.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/r300/r300_screen.c +++ mesa-11.0.2/src/gallium/drivers/r300/r300_screen.c @@ -300,6 +300,8 @@ static int r300_get_shader_param(struct case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; case PIPE_SHADER_CAP_PREFERRED_IR: return PIPE_SHADER_IR_TGSI; } @@ -356,6 +358,8 @@ static int r300_get_shader_param(struct case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; case PIPE_SHADER_CAP_PREFERRED_IR: return PIPE_SHADER_IR_TGSI; } Index: mesa-11.0.2/src/gallium/drivers/r600/r600_pipe.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/r600/r600_pipe.c +++ mesa-11.0.2/src/gallium/drivers/r600/r600_pipe.c @@ -504,6 +504,12 @@ static int r600_get_shader_param(struct case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + /* due to a bug in the shader compiler, some loops hang + * if they are not unrolled, see: + * https://bugs.freedesktop.org/show_bug.cgi?id=86720 + */ + return 255; } return 0; } Index: mesa-11.0.2/src/gallium/drivers/radeonsi/si_pipe.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/radeonsi/si_pipe.c +++ mesa-11.0.2/src/gallium/drivers/radeonsi/si_pipe.c @@ -487,6 +487,8 @@ static int si_get_shader_param(struct pi case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 1; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; } return 0; } Index: mesa-11.0.2/src/gallium/drivers/svga/svga_screen.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/svga/svga_screen.c +++ mesa-11.0.2/src/gallium/drivers/svga/svga_screen.c @@ -383,6 +383,8 @@ static int svga_get_shader_param(struct case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; } /* If we get here, we failed to handle a cap above */ debug_printf("Unexpected fragment shader query %u\n", param); @@ -441,6 +443,8 @@ static int svga_get_shader_param(struct case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: return 0; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; } /* If we get here, we failed to handle a cap above */ debug_printf("Unexpected vertex shader query %u\n", param); Index: mesa-11.0.2/src/gallium/drivers/vc4/vc4_screen.c =================================================================== --- mesa-11.0.2.orig/src/gallium/drivers/vc4/vc4_screen.c +++ mesa-11.0.2/src/gallium/drivers/vc4/vc4_screen.c @@ -334,6 +334,8 @@ vc4_screen_get_shader_param(struct pipe_ return VC4_MAX_TEXTURE_SAMPLERS; case PIPE_SHADER_CAP_PREFERRED_IR: return PIPE_SHADER_IR_TGSI; + case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: + return 32; default: fprintf(stderr, "unknown shader param %d\n", param); return 0; Index: mesa-11.0.2/src/gallium/include/pipe/p_defines.h =================================================================== --- mesa-11.0.2.orig/src/gallium/include/pipe/p_defines.h +++ mesa-11.0.2/src/gallium/include/pipe/p_defines.h @@ -674,7 +674,8 @@ enum pipe_shader_cap PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED, /* all rounding modes */ PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED, PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED, - PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE + PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE, + PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT, }; /** Index: mesa-11.0.2/src/mesa/state_tracker/st_extensions.c =================================================================== --- mesa-11.0.2.orig/src/mesa/state_tracker/st_extensions.c +++ mesa-11.0.2/src/mesa/state_tracker/st_extensions.c @@ -249,6 +249,9 @@ void st_init_limits(struct pipe_screen * if (options->EmitNoLoops) options->MaxUnrollIterations = MIN2(screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS), 65536); + else + options->MaxUnrollIterations = screen->get_shader_param(screen, sh, + PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT); options->LowerClipDistance = true; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor