summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <jason@jlekstrand.net>2020-01-22 14:26:24 -0600
committerDylan Baker <dylan@pnwbakers.com>2020-02-03 08:31:30 -0800
commit9250fb9f0e4f14aeb86c54eeea20dab5d43ee4ea (patch)
treebebaa809d379e23ff8c89b445c79dbd11bdf4131 /src
parent4ab4ab0b2735fe38a61a71aff1f54352016e49e9 (diff)
downloadmesa-9250fb9f0e4f14aeb86c54eeea20dab5d43ee4ea.tar.gz
anv: Insert holes for non-existant XFB varyings
Thanks to optimizations, it's possible for varyings to get deleted but still leave the variable there for nir_gather_xfb_info to find. If we get into this case, insert a hole. Fixes: 36ee2fd61c8 "anv: Implement the basic form of..." Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3520> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3520> (cherry picked from commit 993f866d2e31c06462b49d760debf64d14e54a68)
Diffstat (limited to 'src')
-rw-r--r--src/intel/vulkan/genX_pipeline.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c
index 0964ef5c604..ea2e38834e8 100644
--- a/src/intel/vulkan/genX_pipeline.c
+++ b/src/intel/vulkan/genX_pipeline.c
@@ -1415,11 +1415,23 @@ emit_3dstate_streamout(struct anv_pipeline *pipeline,
next_offset[buffer] = output->offset +
__builtin_popcount(component_mask) * 4;
- so_decl[stream][decls[stream]++] = (struct GENX(SO_DECL)) {
- .OutputBufferSlot = buffer,
- .RegisterIndex = vue_map->varying_to_slot[varying],
- .ComponentMask = component_mask,
- };
+ const int slot = vue_map->varying_to_slot[varying];
+ if (slot < 0) {
+ /* This can happen if the shader never writes to the varying.
+ * Insert a hole instead of actual varying data.
+ */
+ so_decl[stream][decls[stream]++] = (struct GENX(SO_DECL)) {
+ .HoleFlag = true,
+ .OutputBufferSlot = buffer,
+ .ComponentMask = component_mask,
+ };
+ } else {
+ so_decl[stream][decls[stream]++] = (struct GENX(SO_DECL)) {
+ .OutputBufferSlot = buffer,
+ .RegisterIndex = slot,
+ .ComponentMask = component_mask,
+ };
+ }
}
int max_decls = 0;