gm107/ir: fix loading z offset for layered 3d image bindings
authorIlia Mirkin <imirkin@alum.mit.edu>
Mon, 4 Feb 2019 04:25:07 +0000 (23:25 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Wed, 30 Oct 2019 23:12:36 +0000 (19:12 -0400)
commit869e32593a9096b845dd6106f8f86e1c41fac968
treeadcdb09073185dab85efb16be3b24d5fa087ac93
parente02c181bfdc554f298f861bb39d20f0bfd7c2dca
gm107/ir: fix loading z offset for layered 3d image bindings

Unfortuantely we don't know if a particular load is a real 2d image (as
would be a cube face or 2d array element), or a layer of a 3d image.
Since we pass in the TIC reference, the instruction's type has to match
what's in the TIC (experimentally). In order to properly support
bindless images, this also can't be done by looking at the current
bindings and generating appropriate code.

As a result all plain 2d loads are converted into a pair of 2d/3d loads,
with appropriate predicates to ensure only one of those actually
executes, and the values are all merged in.

This goes somewhat against the current flow, so for GM107 we do the OOB
handling directly in the surface processing logic. Perhaps the other
gens should do something similar, but that is left to another change.

This fixes dEQP tests like image_load_store.3d.*_single_layer and GL-CTS
tests like shader_image_load_store.non-layered_binding without breaking
anything else.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: "20.0" <mesa-stable@lists.freedesktop.org>
src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h
src/gallium/drivers/nouveau/nvc0/nvc0_tex.c