i965: Ignore uniform storage for samplers or images, use binding info

Graphics / Mesa 3D Graphics Library / Mesa - Kenneth Graunke [whitecape.org] - 22 April 2019 22:39 EDT

gl_nir_lower_samplers_as_deref creates new top level sampler and image uniforms which have been split from structure uniforms. i965 assumed that it could walk through gl_uniform_storage slots by starting at
var->data.location and walking forward based on a simple slot count. This assumed that structure types were walked in a particular order.

With samplers and images split out of structures, it becomes impossible to assign meaningful locations. Consider:

struct S { sampler2D a; sampler2D b; } s[2];

The gl_uniform_storage locations for these follow this map:

0 => a[0], 1 => b[0], 2 => a[0], 3 => b[0].

But the new split variables look like:

sampler2D lowered_a[2]; sampler2D lowered_b[2];

and there is no way to know that there's effectively a stride to get to the location for successive elements of a[] or b[]. So, working with location becomes effectively impossible.

Ultimately, the point of looking at uniform storage was to pull out the bindings from the opaque index fields. gl_nir_lower_samplers_as_derefs can obtain this information while doing the splitting, however, and sets up var->data.binding to have the desired values.

We move gl_nir_lower_samplers before brw_nir_lower_image_load_store so gl_nir_lower_samplers_as_derefs has the opportunity to set proper image bindings. Then, we make the uniform handling code skip sampler(-array)
variables, and handle image param setup based on var->data.binding.

Fixes Piglit tests/spec/glsl-1.10/execution/samplers/uniform-struct, this time without regressing dEQP-GLES2.functional.uniform_api.random.3.

Fixes: f003859f97c nir: Make gl_nir_lower_samplers use gl_nir_lower_samplers_as_deref

6981069fc80 i965: Ignore uniform storage for samplers or images, use binding info
src/mesa/drivers/dri/i965/brw_link.cpp | 3 --
src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp | 38 ++++++++++++++++----------
src/mesa/drivers/dri/i965/brw_program.c | 5 +++-
3 files changed, 28 insertions(+), 18 deletions(-)

Upstream: cgit.freedesktop.org

  • Share