anv/pipeline: Add a input_attachment_index to the bindings
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 15 Nov 2016 23:21:08 +0000 (15:21 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 22 Nov 2016 21:44:55 +0000 (13:44 -0800)
This allows us to go from the binding to either the descriptor or the input
attachment at will.

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/intel/vulkan/anv_nir_apply_pipeline_layout.c
src/intel/vulkan/anv_private.h

index 02991bef273b28c385cb41a44a0243f42b1d39f6..8846c2e6c08e6fc3ceb857f72c68b759ab6ceedd 100644 (file)
@@ -346,6 +346,33 @@ anv_nir_apply_pipeline_layout(struct anv_pipeline *pipeline,
       }
    }
 
+   nir_foreach_variable(var, &shader->uniforms) {
+      if (!glsl_type_is_image(var->interface_type))
+         continue;
+
+      enum glsl_sampler_dim dim = glsl_get_sampler_dim(var->interface_type);
+      if (dim != GLSL_SAMPLER_DIM_SUBPASS &&
+          dim != GLSL_SAMPLER_DIM_SUBPASS_MS)
+         continue;
+
+      const uint32_t set = var->data.descriptor_set;
+      const uint32_t binding = var->data.binding;
+      const uint32_t array_size =
+         layout->set[set].layout->binding[binding].array_size;
+
+      if (!BITSET_TEST(state.set[set].used, binding))
+         continue;
+
+      struct anv_pipeline_binding *pipe_binding =
+         &map->surface_to_descriptor[state.set[set].surface_offsets[binding]];
+      for (unsigned i = 0; i < array_size; i++) {
+         assert(pipe_binding[i].set == set);
+         assert(pipe_binding[i].binding == binding);
+         assert(pipe_binding[i].index == i);
+         pipe_binding[i].input_attachment_index = var->data.index + i;
+      }
+   }
+
    nir_foreach_function(function, shader) {
       if (!function->impl)
          continue;
index c7e44742e2e7b6afcf49a5590fb49b93ffce378d..ba2e85a535f7a9f77c5fe50be29e04dfb510cb3a 100644 (file)
@@ -913,6 +913,9 @@ struct anv_pipeline_binding {
 
    /* Index in the binding */
    uint8_t index;
+
+   /* Input attachment index (relative to the subpass) */
+   uint8_t input_attachment_index;
 };
 
 struct anv_pipeline_layout {