The tessellator ignores all writes to gl_TessLevelInner and gl_TessLevelOuter by the tessellation control shader except except those done by the last TCS invocation (gl_InvocationID == patch output vertices - 1).
This results in no primitives being generated unless all entries of gl_TessLevelOuter are written in that invocation (the 'initial' values seem to be 0 for gl_TessLevelOuter and 1 for gl_TessLevelInner).
Additionally, barrier() does not synchronize changes to the gl_TessLevel* between TCS invocations.
Neither of these problems can be reproduced with user-defined 'patch out' variables - writes by any TCS invocation are visible in the evaluation shader and barrier() makes them visible to the other TCS invocations.
GPU: Radeon HD 7950 (TAHITI)
Mesa: 10.7.0-devel (git-9deb614)
Created attachment 117373 [details]
Tessellation test case
I have attached a test case for this. It can be compiled and run using:
$ sh tessellation.cpp
Use the arrow keys to change which TCS invocation writes to gl_TessLevel* (or use space/enter to toggle between the first and the last).
It should display a yellow grid no matter what TCS invocation is selected but instead displays a green grid for invocation 3 and nothing for all other invocations.
I can confirm that the patch "radeonsi: before storing tess levels, load them from LDS instead of temporary" on the mailing list fixes the issue.
Fixed by 60159bcfc66a067b50da06f5cabfa20d72e89. Closing.
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct.