System is Arch Linux running kernel 4.15-rc7 with Mesa 17.3.1
When playing Civilization VI and zooming the camera out to view more of the map, I experience a large number of black, flickering, triangle-shaped artifacts across the screen. While this doesn't seem to crash the game (I'm able to play for an extended period without the application crashing still), it is distracting.
I've had this issue since switching to a Vega card from Polaris, running first the amd-staging branch of the kernel, then the 4.15 RCs, and from mesa-git through 17.3 stable. The game updated today and the issue is still present.
As far as I've noticed, no other game experiences the same bug, so I can't be certain if the fault lies in the driver or the game itself. If needed, I can attempt to capture some screenshots or video of the bug.
I am seeing the same with my vega64 on KDE Neon with the oibaf ppa.
packages are marked as 17.4~git1801200730.436ed6~oibaf~x
You can easily reproduce this by running the graphics benchmark.
I tried to capture an API trace but the game slowed down so much that the benchmark did not get far enough along to show it :(
(it is entirely possible that I am holding it wrong too)
Created attachment 136866 [details]
image showing the bad triangles
These triangles are not static, they flicker around the screen a fair bit
So I was able to get an API trace of the problem!
(I am rather happy to now be holding apitrace correctly!)
it does weigh in at 1.5GiB compressed but it does show all the badly rendered triangles and how zooming in stops them
it is available here: https://jasonplayne.com/share/Civ6.trace.bz2
I hope this is helpful
*** Bug 105353 has been marked as a duplicate of this bug. ***
I have the same issue,
i captured a video showing the flickering triangles which i had posted in the duplicate bug 105353
Can Confirm that this problem still persists on Kernel 4.16.1 and Mesa 18
This issue is also persisting with the latest update to Civ VI, including the Rise and Fall expansion.
Just want to comment that this issue is still occuring on mesa 18.2, arch linux kernel 4.18.6.
I'm not sure why yet but both the black triangles and the incorrect rendering behind the chinese emperor on the loading screen go away when I run the trace on the NIR backend.
Until we figure out what is going on here you can try running the game with the following environment variable:
(In reply to Timothy Arceri from comment #9)
> I'm not sure why yet but both the black triangles and the incorrect
> rendering behind the chinese emperor on the loading screen go away when I
> run the trace on the NIR backend.
> Until we figure out what is going on here you can try running the game with
> the following environment variable:
Can confirm! The initial red+black triangles in the game seem to have disappeared using the nir backend.
(I may be a little excited!)
(In reply to Jason Playne from comment #10)
> (In reply to Timothy Arceri from comment #9)
> > I'm not sure why yet but both the black triangles and the incorrect
> > rendering behind the chinese emperor on the loading screen go away when I
> > run the trace on the NIR backend.
> > Until we figure out what is going on here you can try running the game with
> > the following environment variable:
> > R600_DEBUG=nir
> Can confirm! The initial red+black triangles in the game seem to have
> disappeared using the nir backend.
> (I may be a little excited!)
After a couple of hours of game time, I have not seen the triangles.
nir solves the problem
This fixes the issue for me as well. Its great to finally have a work-around!
As this is fixed, and published in mesa 18.2.2, I'm closing it.
(In reply to Juan A. Suarez from comment #13)
> As this is fixed, and published in mesa 18.2.2, I'm closing it.
This isn't fixed yet :)
Another bug was found using the trace from this bug, as per the commit message that fix does not fix the primary issue of back triangles from this bug.
Created attachment 142313 [details] [review]
Hack around issue
I've found the source of the problem. It seems that the tgsi indirect indexing optimisation is causing issues on Vega for some reason. I've attached a hack which disables it resulting in correct rendering.
Created attachment 142314 [details]
Also attaching a renderdoc capture of the issue.
After talking this over with Marek here is a summary of the problem.
LLVM's VGPR indexing code on gfx9+ is broken for immediate arrays. Usually this is not a problem as GLSL IR in mesa will lower these to Uniforms via lower_const_arrays_to_uniforms(). However this does not work for the shaders in Civ6 because these arrays are not actually defined as constant arrays for example the original shader looks like this:
x0.xy = vec2(0.031250, 0.500000);
x0.xy = vec2(0.968750, 0.031250);
x0.xy = vec2(0.968750, 0.968750);
x1.xy = vec2(1.000000, 1.000000);
x1.xy = vec2(0.000000, 1.000000);
x1.xy = vec2(-1.000000, 0.000000);
x1.xy = vec2(-1.000000, -1.000000);
x1.xy = vec2(0.000000, -1.000000);
x1.xy = vec2(1.000000, 0.000000);
x2.xy = vec2(1.000000, -1.000000);
x2.xy = vec2(2.000000, 1.000000);
x2.xy = vec2(1.000000, 2.000000);
x2.xy = vec2(-1.000000, 1.000000);
x2.xy = vec2(-2.000000, -1.000000);
x2.xy = vec2(-1.000000, -2.000000);
Without SSA I don't see any way for GLSL IR to easily recognise this as a constant array. Unfortunately by the time LLVM is done it is recognised and is exposed to the buggy indexing support.
Video of problem happening:
My set up: Ubuntu 18.10, AMD Ryzen 2700X, RX Vega 56
This is the workaround that worked for me:
* Beyond adding "R600_DEBUG=nir" to game launcher options (in steam client), also start "Steam Launcher" in a terminal with "R600_DEBUG=nir" environment variable set. And it will work.
When bugfix is published let me know to test it.