<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">On 15/09/17 23:54, Jason Ekstrand
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAOFGe957h3buvb05OXXzPsMP3A3Oujt3QJkvf9B8Qr1QPeLRjA@mail.gmail.com">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <div dir="ltr"><br>
        <div class="gmail_extra"><br>
          <div class="gmail_quote">On Fri, Sep 15, 2017 at 7:11 AM,
            Lionel Landwerlin <span dir="ltr"><<a
                href="mailto:lionel.g.landwerlin@intel.com"
                target="_blank" moz-do-not-send="true">lionel.g.landwerlin@intel.com</a>></span>
            wrote:<br>
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by:
              Lionel Landwerlin <<a
                href="mailto:lionel.g.landwerlin@intel.com"
                moz-do-not-send="true">lionel.g.landwerlin@intel.com</a><wbr>><br>
              ---<br>
              Â src/intel/vulkan/anv_<wbr>descriptor_set.c  Â  Â  Â  Â  Â  |
              107 +++++++++++++++++------<br>
              Â src/intel/vulkan/anv_nir_<wbr>apply_pipeline_layout.c | 
              44 +++++-----<br>
              Â src/intel/vulkan/anv_private.h  Â  Â  Â  Â  Â  Â  Â  Â  Â |  24
              ++++-<br>
              Â src/intel/vulkan/genX_cmd_<wbr>buffer.c  Â  Â  Â  Â  Â  Â  Â | 
              14 ++-<br>
              Â src/intel/vulkan/genX_state.c  Â  Â  Â  Â  Â  Â  Â  Â  Â  |  81
              +++++++++--------<br>
              Â 5 files changed, 178 insertions(+), 92 deletions(-)<br>
              <br>
              diff --git a/src/intel/vulkan/anv_<wbr>descriptor_set.c
              b/src/intel/vulkan/anv_<wbr>descriptor_set.c<br>
              index 91387c065e4..4e29310f5fa 100644<br>
              --- a/src/intel/vulkan/anv_<wbr>descriptor_set.c<br>
              +++ b/src/intel/vulkan/anv_<wbr>descriptor_set.c<br>
              @@ -35,6 +35,21 @@<br>
              Â  * Descriptor set layouts.<br>
              Â  */<br>
              <br>
              +static uint32_t<br>
              +layout_binding_get_<wbr>descriptor_count(const
              VkDescriptorSetLayoutBinding *binding)<br>
              +{<br>
              +  Â if (binding->pImmutableSamplers == NULL)<br>
              +  Â  Â  return binding->descriptorCount;<br>
              +<br>
              +  Â uint32_t immutable_sampler_count = 0;<br>
              +  Â for (uint32_t i = 0; i <
              binding->descriptorCount; i++) {<br>
              +  Â  Â  ANV_FROM_HANDLE(anv_sampler, sampler,
              binding->pImmutableSamplers[i]<wbr>);<br>
              +  Â  Â  immutable_sampler_count += sampler->nb_planes;<br>
              +  Â }<br>
              +<br>
              +  Â return immutable_sampler_count;<br>
              +}<br>
              +<br>
              Â VkResult anv_CreateDescriptorSetLayout(<br>
              Â  Â  Â VkDevice  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  _device,<br>
              Â  Â  Â const VkDescriptorSetLayoutCreateInf<wbr>o*  Â  Â 
              pCreateInfo,<br>
              @@ -49,13 +64,13 @@ VkResult
              anv_CreateDescriptorSetLayout(<br>
              Â  Â  uint32_t immutable_sampler_count = 0;<br>
              Â  Â  for (uint32_t j = 0; j <
              pCreateInfo->bindingCount; j++) {<br>
              Â  Â  Â  Â max_binding = MAX2(max_binding,
              pCreateInfo->pBindings[j].<wbr>binding);<br>
              -  Â  Â  if (pCreateInfo->pBindings[j].<wbr>pImmutableSamplers)<br>
              -  Â  Â  Â  Â immutable_sampler_count +=
              pCreateInfo->pBindings[j].<wbr>descriptorCount;<br>
              +  Â  Â  immutable_sampler_count +=<br>
              +  Â  Â  Â  Â layout_binding_get_descriptor_<wbr>count(&pCreateInfo->pBindings[<wbr>j]);<br>
              Â  Â  }<br>
              <br>
              Â  Â  struct anv_descriptor_set_layout *set_layout;<br>
              Â  Â  struct anv_descriptor_set_binding_<wbr>layout
              *bindings;<br>
              -  Â struct anv_sampler **samplers;<br>
              +  Â struct anv_descriptor_set_immutable_<wbr>sampler
              *samplers;<br>
              <br>
              Â  Â  ANV_MULTIALLOC(ma);<br>
              Â  Â  anv_multialloc_add(&ma, &set_layout, 1);<br>
              @@ -74,6 +89,7 @@ VkResult anv_CreateDescriptorSetLayout(<br>
              Â  Â  Â  Â memset(&set_layout->binding[b]<wbr>, -1,
              sizeof(set_layout->binding[b])<wbr>);<br>
              <br>
              Â  Â  Â  Â set_layout->binding[b].array_<wbr>size = 0;<br>
              +  Â  Â  set_layout->binding[b].<wbr>descriptor_size = 0;<br>
              Â  Â  Â  Â set_layout->binding[b].<wbr>immutable_samplers =
              NULL;<br>
              Â  Â  }<br>
              <br>
              @@ -108,17 +124,20 @@ VkResult
              anv_CreateDescriptorSetLayout(<br>
              Â  Â  Â  Â set_layout->binding[b].type =
              binding->descriptorType;<br>
              Â #endif<br>
              Â  Â  Â  Â set_layout->binding[b].array_<wbr>size =
              binding->descriptorCount;<br>
              +  Â  Â  set_layout->binding[b].<wbr>descriptor_size =<br>
              +  Â  Â  Â  Â layout_binding_get_descriptor_<wbr>count(binding);<br>
              Â  Â  Â  Â set_layout->binding[b].<wbr>descriptor_index =
              set_layout->size;<br>
              -  Â  Â  set_layout->size += binding->descriptorCount;<br>
              +  Â  Â  set_layout->size += set_layout->binding[b].<wbr>descriptor_size;<br>
              <br>
              Â  Â  Â  Â switch (binding->descriptorType) {<br>
              Â  Â  Â  Â case VK_DESCRIPTOR_TYPE_SAMPLER:<br>
              -  Â  Â  case VK_DESCRIPTOR_TYPE_COMBINED_<wbr>IMAGE_SAMPLER:<br>
              +  Â  Â  case VK_DESCRIPTOR_TYPE_COMBINED_<wbr>IMAGE_SAMPLER:
              {<br>
              Â  Â  Â  Â  Â  anv_foreach_stage(s, binding->stageFlags) {<br>
              Â  Â  Â  Â  Â  Â  Â set_layout->binding[b].stage[<wbr>s].sampler_index
              = sampler_count[s];<br>
              -  Â  Â  Â  Â  Â  sampler_count[s] +=
              binding->descriptorCount;<br>
              +  Â  Â  Â  Â  Â  sampler_count[s] +=
              set_layout->binding[b].<wbr>descriptor_size;<br>
              Â  Â  Â  Â  Â  }<br>
              Â  Â  Â  Â  Â  break;<br>
              +  Â  Â  }<br>
              Â  Â  Â  Â default:<br>
              Â  Â  Â  Â  Â  break;<br>
              Â  Â  Â  Â }<br>
              @@ -140,7 +159,7 @@ VkResult
              anv_CreateDescriptorSetLayout(<br>
              Â  Â  Â  Â case VK_DESCRIPTOR_TYPE_INPUT_<wbr>ATTACHMENT:<br>
              Â  Â  Â  Â  Â  anv_foreach_stage(s, binding->stageFlags) {<br>
              Â  Â  Â  Â  Â  Â  Â set_layout->binding[b].stage[<wbr>s].surface_index
              = surface_count[s];<br>
              -  Â  Â  Â  Â  Â  surface_count[s] +=
              binding->descriptorCount;<br>
              +  Â  Â  Â  Â  Â  surface_count[s] +=
              set_layout->binding[b].<wbr>descriptor_size;<br>
              Â  Â  Â  Â  Â  }<br>
              Â  Â  Â  Â  Â  break;<br>
              Â  Â  Â  Â default:<br>
              @@ -151,7 +170,7 @@ VkResult
              anv_CreateDescriptorSetLayout(<br>
              Â  Â  Â  Â case VK_DESCRIPTOR_TYPE_UNIFORM_<wbr>BUFFER_DYNAMIC:<br>
              Â  Â  Â  Â case VK_DESCRIPTOR_TYPE_STORAGE_<wbr>BUFFER_DYNAMIC:<br>
              Â  Â  Â  Â  Â  set_layout->binding[b].<wbr>dynamic_offset_index
              = dynamic_offset_count;<br>
              -  Â  Â  Â  Â dynamic_offset_count +=
              binding->descriptorCount;<br>
              +  Â  Â  Â  Â dynamic_offset_count +=
              set_layout->binding[b].<wbr>descriptor_size;<br>
            </blockquote>
            <div><br>
            </div>
            <div>Are you sure about adjusting dynamic_offset_count here?<br>
            </div>
            <div> </div>
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              Â  Â  Â  Â  Â  break;<br>
              Â  Â  Â  Â default:<br>
              Â  Â  Â  Â  Â  break;<br>
              @@ -162,7 +181,7 @@ VkResult
              anv_CreateDescriptorSetLayout(<br>
              Â  Â  Â  Â case VK_DESCRIPTOR_TYPE_STORAGE_<wbr>TEXEL_BUFFER:<br>
              Â  Â  Â  Â  Â  anv_foreach_stage(s, binding->stageFlags) {<br>
              Â  Â  Â  Â  Â  Â  Â set_layout->binding[b].stage[<wbr>s].image_index
              = image_count[s];<br>
              -  Â  Â  Â  Â  Â  image_count[s] +=
              binding->descriptorCount;<br>
              +  Â  Â  Â  Â  Â  image_count[s] += set_layout->binding[b].<wbr>descriptor_size;<br>
              Â  Â  Â  Â  Â  }<br>
              Â  Â  Â  Â  Â  break;<br>
              Â  Â  Â  Â default:<br>
              @@ -171,11 +190,18 @@ VkResult
              anv_CreateDescriptorSetLayout(<br>
              <br>
              Â  Â  Â  Â if (binding->pImmutableSamplers) {<br>
              Â  Â  Â  Â  Â  set_layout->binding[b].<wbr>immutable_samplers
              = samplers;<br>
              -  Â  Â  Â  Â samplers += binding->descriptorCount;<br>
              <br>
              -  Â  Â  Â  Â for (uint32_t i = 0; i <
              binding->descriptorCount; i++)<br>
              -  Â  Â  Â  Â  Â  set_layout->binding[b].<wbr>immutable_samplers[i]
              =<br>
              -  Â  Â  Â  Â  Â  Â  Â anv_sampler_from_handle(<wbr>binding->pImmutableSamplers[i]<wbr>);<br>
              +  Â  Â  Â  Â uint32_t sampler_offset = 0;<br>
              +  Â  Â  Â  Â for (uint32_t i = 0; i <
              binding->descriptorCount; i++) {<br>
              +  Â  Â  Â  Â  Â  ANV_FROM_HANDLE(anv_sampler, sampler,
              binding->pImmutableSamplers[i]<wbr>);<br>
              +<br>
              +  Â  Â  Â  Â  Â  set_layout->binding[b].<wbr>immutable_samplers[i].sampler
              = sampler;<br>
              +  Â  Â  Â  Â  Â  set_layout->binding[b].<wbr>immutable_samplers[i].<wbr>descriptor_index_offset
              =<br>
              +  Â  Â  Â  Â  Â  Â  Â sampler_offset;<br>
              +  Â  Â  Â  Â  Â  sampler_offset += sampler->nb_planes;<br>
              +  Â  Â  Â  Â }<br>
              +<br>
              +  Â  Â  Â  Â samplers += sampler_offset;<br>
              Â  Â  Â  Â } else {<br>
              Â  Â  Â  Â  Â  set_layout->binding[b].<wbr>immutable_samplers
              = NULL;<br>
              Â  Â  Â  Â }<br>
              @@ -250,7 +276,7 @@ VkResult anv_CreatePipelineLayout(<br>
              Â  Â  Â  Â  Â  if (set_layout->binding[b].<wbr>dynamic_offset_index
              < 0)<br>
              Â  Â  Â  Â  Â  Â  Â continue;<br>
              <br>
              -  Â  Â  Â  Â dynamic_offset_count +=
              set_layout->binding[b].array_<wbr>size;<br>
              +  Â  Â  Â  Â dynamic_offset_count +=
              set_layout->binding[b].<wbr>descriptor_size;<br>
              Â  Â  Â  Â  Â  for (gl_shader_stage s = 0; s <
              MESA_SHADER_STAGES; s++) {<br>
              Â  Â  Â  Â  Â  Â  Â if (set_layout->binding[b].stage[<wbr>s].surface_index
              >= 0)<br>
              Â  Â  Â  Â  Â  Â  Â  Â  layout->stage[s].has_dynamic_<wbr>offsets
              = true;<br>
              @@ -318,11 +344,24 @@ VkResult anv_CreateDescriptorPool(<br>
              Â  Â  uint32_t buffer_count = 0;<br>
              Â  Â  for (uint32_t i = 0; i <
              pCreateInfo->poolSizeCount; i++) {<br>
              Â  Â  Â  Â switch (pCreateInfo->pPoolSizes[i].<wbr>type) {<br>
              +  Â  Â  case VK_DESCRIPTOR_TYPE_SAMPLER:<br>
              +  Â  Â  case VK_DESCRIPTOR_TYPE_COMBINED_<wbr>IMAGE_SAMPLER:<br>
              +  Â  Â  Â  Â /* We have to account that some descriptor
              layouts might have<br>
              +  Â  Â  Â  Â  * multiplanar images (atm up to 3 through the
              conversion<br>
              +  Â  Â  Â  Â  * VK_KHR_sampler_ycbcr_<wbr>conversion
              extension). Therefor take the<br>
              +  Â  Â  Â  Â  * maximum amount of space that can be occupied
              by a single of those<br>
              +  Â  Â  Â  Â  * entries.<br>
              +  Â  Â  Â  Â  */<br>
              +  Â  Â  Â  Â descriptor_count += 3 *
              pCreateInfo->pPoolSizes[i].<wbr>descriptorCount;<br>
            </blockquote>
            <div><br>
            </div>
            <div>I'm not quite sure how I expected you to solve the
              multi-descriptor problem but it wasn't like this. :)  An
              alternate solution would be to keep each image_view and
              sampler a single descriptor in the descriptor set and
              expand it out to multiple descriptors as-needed in
              anv_nir_apply_pipeline_layout by adding a "plane" entry to
              anv_pipeline_binding.  I'm honestly not sure which one
              would work out better in the end.<br>
            </div>
            <div> </div>
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              +  Â  Â  Â  Â break;<br>
              +<br>
              Â  Â  Â  Â case VK_DESCRIPTOR_TYPE_UNIFORM_<wbr>BUFFER:<br>
              Â  Â  Â  Â case VK_DESCRIPTOR_TYPE_STORAGE_<wbr>BUFFER:<br>
              Â  Â  Â  Â case VK_DESCRIPTOR_TYPE_UNIFORM_<wbr>BUFFER_DYNAMIC:<br>
              Â  Â  Â  Â case VK_DESCRIPTOR_TYPE_STORAGE_<wbr>BUFFER_DYNAMIC:<br>
              Â  Â  Â  Â  Â  buffer_count += pCreateInfo->pPoolSizes[i].<wbr>descriptorCount;<br>
              +  Â  Â  Â  Â /* Fallthrough */<br>
              +<br>
              Â  Â  Â  Â default:<br>
              Â  Â  Â  Â  Â  descriptor_count +=
              pCreateInfo->pPoolSizes[i].<wbr>descriptorCount;<br>
              Â  Â  Â  Â  Â  break;<br>
              @@ -461,13 +500,18 @@ anv_descriptor_set_create(<wbr>struct
              anv_device *device,<br>
              Â  Â  Â  Â  Â  Â  Â  * set has an immutable sampler,
              UpdateDescriptorSets may never<br>
              Â  Â  Â  Â  Â  Â  Â  * touch it, so we need to make sure it's
              100% valid now.<br>
              Â  Â  Â  Â  Â  Â  Â  */<br>
              -  Â  Â  Â  Â  Â  desc[i] = (struct anv_descriptor) {<br>
              -  Â  Â  Â  Â  Â  Â  Â .type = VK_DESCRIPTOR_TYPE_SAMPLER,<br>
              -  Â  Â  Â  Â  Â  Â  Â .sampler =
              layout->binding[b].immutable_<wbr>samplers[i],<br>
              -  Â  Â  Â  Â  Â  };<br>
              +  Â  Â  Â  Â  Â  struct anv_descriptor_set_immutable_<wbr>sampler
              *sampler =<br>
              +  Â  Â  Â  Â  Â  Â  Â &layout->binding[b].immutable_<wbr>samplers[i];<br>
              +  Â  Â  Â  Â  Â  for (uint32_t p = 0; p <
              sampler->sampler->nb_planes; p++) {<br>
              +  Â  Â  Â  Â  Â  Â  Â desc[sampler->descriptor_<wbr>index_offset
              + p] = (struct anv_descriptor) {<br>
              +  Â  Â  Â  Â  Â  Â  Â  Â  .type = VK_DESCRIPTOR_TYPE_SAMPLER,<br>
              +  Â  Â  Â  Â  Â  Â  Â  Â  .sampler = sampler->sampler,<br>
              +  Â  Â  Â  Â  Â  Â  Â  Â  .plane = p,<br>
              +  Â  Â  Â  Â  Â  Â  Â };<br>
              +  Â  Â  Â  Â  Â  }<br>
              Â  Â  Â  Â  Â  }<br>
              Â  Â  Â  Â }<br>
              -  Â  Â  desc += layout->binding[b].array_size;<br>
              +  Â  Â  desc += layout->binding[b].descriptor_<wbr>size;<br>
              Â  Â  }<br>
              <br>
              Â  Â  /* Allocate surface state for the buffer views. */<br>
              @@ -579,8 +623,13 @@ anv_descriptor_set_write_<wbr>image_view(struct
              anv_descriptor_set *set,<br>
              Â {<br>
              Â  Â  const struct anv_descriptor_set_binding_<wbr>layout
              *bind_layout =<br>
              Â  Â  Â  Â &set->layout->binding[binding]<wbr>;<br>
              +  Â const struct anv_descriptor_set_immutable_<wbr>sampler
              *immutable_sampler =<br>
              +  Â  Â  bind_layout->immutable_<wbr>samplers ?<br>
              +  Â  Â  &bind_layout->immutable_<wbr>samplers[element]
              : NULL;<br>
              +  Â uint32_t descriptor_index_offset =<br>
              +  Â  Â  immutable_sampler ?
              immutable_sampler->descriptor_<wbr>index_offset :
              element;<br>
              Â  Â  struct anv_descriptor *desc =<br>
              -  Â  Â  &set->descriptors[bind_layout-<wbr>>descriptor_index
              + element];<br>
              +  Â  Â  &set->descriptors[bind_layout-<wbr>>descriptor_index
              + descriptor_index_offset];<br>
              Â  Â  struct anv_image_view *image_view = NULL;<br>
              Â  Â  struct anv_sampler *sampler = NULL;<br>
              <br>
              @@ -610,15 +659,19 @@ anv_descriptor_set_write_<wbr>image_view(struct
              anv_descriptor_set *set,<br>
              Â  Â  Â * it.<br>
              Â  Â  Â */<br>
              Â  Â  sampler = bind_layout->immutable_<wbr>samplers ?<br>
              -  Â  Â  Â  Â  Â  Â bind_layout->immutable_<wbr>samplers[element]
              :<br>
              +  Â  Â  Â  Â  Â  Â bind_layout->immutable_<wbr>samplers[element].sampler
              :<br>
              Â  Â  Â  Â  Â  Â  Â  sampler;<br>
              <br>
              -  Â *desc = (struct anv_descriptor) {<br>
              -  Â  Â  .type = type,<br>
              -  Â  Â  .layout = info->imageLayout,<br>
              -  Â  Â  .image_view = image_view,<br>
              -  Â  Â  .sampler = sampler,<br>
              -  Â };<br>
              +  Â uint32_t nb_planes = sampler != NULL ?
              sampler->nb_planes : 1;<br>
              +  Â for (uint32_t p = 0; p < nb_planes; p++) {<br>
              +  Â  Â  desc[p] = (struct anv_descriptor) {<br>
              +  Â  Â  Â  Â .type = type,<br>
              +  Â  Â  Â  Â .layout = info->imageLayout,<br>
              +  Â  Â  Â  Â .image_view = image_view,<br>
              +  Â  Â  Â  Â .sampler = sampler,<br>
              +  Â  Â  Â  Â .plane = p,<br>
              +  Â  Â  };<br>
              +  Â }<br>
              Â }<br>
              <br>
              Â void<br>
              diff --git a/src/intel/vulkan/anv_nir_<wbr>apply_pipeline_layout.c
              b/src/intel/vulkan/anv_nir_<wbr>apply_pipeline_layout.c<br>
              index 67bcf5e29ef..83d4c4ea30d 100644<br>
              --- a/src/intel/vulkan/anv_nir_<wbr>apply_pipeline_layout.c<br>
              +++ b/src/intel/vulkan/anv_nir_<wbr>apply_pipeline_layout.c<br>
              @@ -130,7 +130,7 @@ lower_res_index_intrinsic(nir_<wbr>intrinsic_instr
              *intrin,<br>
              <br>
              Â static void<br>
              Â lower_tex_deref(nir_tex_instr *tex, nir_deref_var *deref,<br>
              -  Â  Â  Â  Â  Â  Â  Â  unsigned *const_index, unsigned
              array_size,<br>
              +  Â  Â  Â  Â  Â  Â  Â  unsigned *const_index, unsigned
              descriptor_size,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â nir_tex_src_type src_type,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â struct apply_pipeline_layout_state
              *state)<br>
              Â {<br>
              @@ -146,7 +146,7 @@ lower_tex_deref(nir_tex_instr *tex,
              nir_deref_var *deref,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â nir_ssa_for_src(b,
              deref_array->indirect, 1));<br>
              <br>
              Â  Â  Â  Â  Â  if (state->add_bounds_checks)<br>
              -  Â  Â  Â  Â  Â  index = nir_umin(b, index, nir_imm_int(b,
              array_size - 1));<br>
              +  Â  Â  Â  Â  Â  index = nir_umin(b, index, nir_imm_int(b,
              descriptor_size - 1));<br>
              <br>
              Â  Â  Â  Â  Â  nir_tex_src *new_srcs = rzalloc_array(tex,
              nir_tex_src,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â 
              tex->num_srcs + 1);<br>
              @@ -167,7 +167,7 @@ lower_tex_deref(nir_tex_instr *tex,
              nir_deref_var *deref,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  nir_src_for_ssa(index));<br>
              Â  Â  Â  Â  Â  tex->num_srcs++;<br>
              Â  Â  Â  Â } else {<br>
              -  Â  Â  Â  Â *const_index +=
              MIN2(deref_array->base_offset, array_size - 1);<br>
              +  Â  Â  Â  Â *const_index +=
              MIN2(deref_array->base_offset, descriptor_size - 1);<br>
              Â  Â  Â  Â }<br>
              Â  Â  }<br>
              Â }<br>
              @@ -196,19 +196,18 @@ lower_tex(nir_tex_instr *tex, struct
              apply_pipeline_layout_state *state)<br>
              <br>
              Â  Â  unsigned set = tex->texture->var->data.<wbr>descriptor_set;<br>
              Â  Â  unsigned binding = tex->texture->var->data.<wbr>binding;<br>
              -  Â unsigned array_size =<br>
              -  Â  Â  state->layout->set[set].<wbr>layout->binding[binding].<wbr>array_size;<br>
              +  Â unsigned descriptor_size =<br>
              +  Â  Â  state->layout->set[set].<wbr>layout->binding[binding].<wbr>descriptor_size;<br>
              Â  Â  tex->texture_index = state->set[set].surface_<wbr>offsets[binding];<br>
              -  Â lower_tex_deref(tex, tex->texture,
              &tex->texture_index, array_size,<br>
              +  Â lower_tex_deref(tex, tex->texture,
              &tex->texture_index, descriptor_size,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  nir_tex_src_texture_offset, state);<br>
              <br>
              Â  Â  if (tex->sampler) {<br>
              Â  Â  Â  Â unsigned set = tex->sampler->var->data.<wbr>descriptor_set;<br>
              Â  Â  Â  Â unsigned binding =
              tex->sampler->var->data.<wbr>binding;<br>
              -  Â  Â  unsigned array_size =<br>
              -  Â  Â  Â  Â state->layout->set[set].<wbr>layout->binding[binding].<wbr>array_size;<br>
              -  Â  Â  tex->sampler_index = state->set[set].sampler_<wbr>offsets[binding];<br>
              -  Â  Â  lower_tex_deref(tex, tex->sampler,
              &tex->sampler_index, array_size,<br>
              +  Â  Â  unsigned descriptor_size =<br>
              +  Â  Â  Â  Â state->layout->set[set].<wbr>layout->binding[binding].<wbr>descriptor_size;<br>
              +  Â  Â  lower_tex_deref(tex, tex->sampler,
              &tex->sampler_index, descriptor_size,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â nir_tex_src_sampler_offset, state);<br>
              Â  Â  }<br>
              <br>
              @@ -300,9 +299,9 @@ anv_nir_apply_pipeline_layout(<wbr>struct
              anv_pipeline *pipeline,<br>
              Â  Â  Â  Â BITSET_FOREACH_SET(b, _tmp, state.set[set].used,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  set_layout->binding_count) {<br>
              Â  Â  Â  Â  Â  if (set_layout->binding[b].stage[<wbr>shader->stage].surface_index
              >= 0)<br>
              -  Â  Â  Â  Â  Â  map->surface_count +=
              set_layout->binding[b].array_<wbr>size;<br>
              +  Â  Â  Â  Â  Â  map->surface_count +=
              set_layout->binding[b].<wbr>descriptor_size;<br>
              Â  Â  Â  Â  Â  if (set_layout->binding[b].stage[<wbr>shader->stage].sampler_index
              >= 0)<br>
              -  Â  Â  Â  Â  Â  map->sampler_count +=
              set_layout->binding[b].array_<wbr>size;<br>
              +  Â  Â  Â  Â  Â  map->sampler_count +=
              set_layout->binding[b].<wbr>descriptor_size;<br>
              Â  Â  Â  Â  Â  if (set_layout->binding[b].stage[<wbr>shader->stage].image_index
              >= 0)<br>
              Â  Â  Â  Â  Â  Â  Â map->image_count +=
              set_layout->binding[b].array_<wbr>size;<br>
              Â  Â  Â  Â }<br>
              @@ -317,31 +316,34 @@ anv_nir_apply_pipeline_layout(<wbr>struct
              anv_pipeline *pipeline,<br>
              Â  Â  Â  Â BITSET_WORD b, _tmp;<br>
              Â  Â  Â  Â BITSET_FOREACH_SET(b, _tmp, state.set[set].used,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  set_layout->binding_count) {<br>
              -  Â  Â  Â  Â unsigned array_size =
              set_layout->binding[b].array_<wbr>size;<br>
              +  Â  Â  Â  Â struct anv_descriptor_set_binding_<wbr>layout
              *binding =<br>
              +  Â  Â  Â  Â  Â  &set_layout->binding[b];<br>
              +  Â  Â  Â  Â /* unsigned array_size =
              set_layout->binding[b].array_<wbr>size; */<br>
              +  Â  Â  Â  Â /* unsigned descriptor_size =
              set_layout->binding[b].<wbr>descriptor_size; */<br>
              <br>
              -  Â  Â  Â  Â if (set_layout->binding[b].stage[<wbr>shader->stage].surface_index
              >= 0) {<br>
              +  Â  Â  Â  Â if (binding->stage[shader->stage]<wbr>.surface_index
              >= 0) {<br>
              Â  Â  Â  Â  Â  Â  Â state.set[set].surface_<wbr>offsets[b] =
              surface;<br>
              -  Â  Â  Â  Â  Â  for (unsigned i = 0; i < array_size; i++)
              {<br>
              +  Â  Â  Â  Â  Â  for (unsigned i = 0; i <
              binding->descriptor_size; i++) {<br>
              Â  Â  Â  Â  Â  Â  Â  Â  map->surface_to_descriptor[<wbr>surface
              + i].set = set;<br>
              Â  Â  Â  Â  Â  Â  Â  Â  map->surface_to_descriptor[<wbr>surface
              + i].binding = b;<br>
              Â  Â  Â  Â  Â  Â  Â  Â  map->surface_to_descriptor[<wbr>surface
              + i].index = i;<br>
              Â  Â  Â  Â  Â  Â  Â }<br>
              -  Â  Â  Â  Â  Â  surface += array_size;<br>
              +  Â  Â  Â  Â  Â  surface += binding->descriptor_size;<br>
              Â  Â  Â  Â  Â  }<br>
              <br>
              -  Â  Â  Â  Â if (set_layout->binding[b].stage[<wbr>shader->stage].sampler_index
              >= 0) {<br>
              +  Â  Â  Â  Â if (binding->stage[shader->stage]<wbr>.sampler_index
              >= 0) {<br>
              Â  Â  Â  Â  Â  Â  Â state.set[set].sampler_<wbr>offsets[b] =
              sampler;<br>
              -  Â  Â  Â  Â  Â  for (unsigned i = 0; i < array_size; i++)
              {<br>
              +  Â  Â  Â  Â  Â  for (unsigned i = 0; i <
              binding->descriptor_size; i++) {<br>
              Â  Â  Â  Â  Â  Â  Â  Â  map->sampler_to_descriptor[<wbr>sampler
              + i].set = set;<br>
              Â  Â  Â  Â  Â  Â  Â  Â  map->sampler_to_descriptor[<wbr>sampler
              + i].binding = b;<br>
              Â  Â  Â  Â  Â  Â  Â  Â  map->sampler_to_descriptor[<wbr>sampler
              + i].index = i;<br>
              Â  Â  Â  Â  Â  Â  Â }<br>
              -  Â  Â  Â  Â  Â  sampler += array_size;<br>
              +  Â  Â  Â  Â  Â  sampler += binding->descriptor_size;<br>
              Â  Â  Â  Â  Â  }<br>
              <br>
              -  Â  Â  Â  Â if (set_layout->binding[b].stage[<wbr>shader->stage].image_index
              >= 0) {<br>
              +  Â  Â  Â  Â if (binding->stage[shader->stage]<wbr>.image_index
              >= 0) {<br>
              Â  Â  Â  Â  Â  Â  Â state.set[set].image_offsets[<wbr>b] = image;<br>
              -  Â  Â  Â  Â  Â  image += array_size;<br>
              +  Â  Â  Â  Â  Â  image += binding->descriptor_size;<br>
              Â  Â  Â  Â  Â  }<br>
              Â  Â  Â  Â }<br>
              Â  Â  }<br>
              diff --git a/src/intel/vulkan/anv_<wbr>private.h
              b/src/intel/vulkan/anv_<wbr>private.h<br>
              index a4b263cea5e..41f01192aa6 100644<br>
              --- a/src/intel/vulkan/anv_<wbr>private.h<br>
              +++ b/src/intel/vulkan/anv_<wbr>private.h<br>
              @@ -1168,6 +1168,18 @@ struct anv_vue_header {<br>
              Â  Â  float PointWidth;<br>
              Â };<br>
              <br>
              +struct anv_descriptor_set_immutable_<wbr>sampler {<br>
              +  Â /* Immutable sampler */<br>
              +  Â struct anv_sampler *sampler;<br>
              +<br>
              +  Â /* Offset to add to<br>
              +  Â  * anv_descriptor_set_binding_<wbr>layout.stage[s].sampler_index
              or<br>
              +  Â  * anv_descriptor_set_binding_<wbr>layout.descriptor_index
              to compute the offset<br>
              +  Â  * in the descriptor table.<br>
              +  Â  */<br>
              +  Â uint16_t descriptor_index_offset;<br>
              +};<br>
              +<br>
              Â struct anv_descriptor_set_binding_<wbr>layout {<br>
              Â #ifndef NDEBUG<br>
              Â  Â  /* The type of the descriptors in this binding */<br>
              @@ -1177,6 +1189,9 @@ struct anv_descriptor_set_binding_<wbr>layout
              {<br>
              Â  Â  /* Number of array elements in this binding */<br>
              Â  Â  uint16_t array_size;<br>
              <br>
              +  Â /* Number of descriptors used in this binding */<br>
              +  Â uint16_t descriptor_size;<br>
              +<br>
              Â  Â  /* Index into the flattend descriptor set */<br>
              Â  Â  uint16_t descriptor_index;<br>
              <br>
              @@ -1198,7 +1213,7 @@ struct anv_descriptor_set_binding_<wbr>layout
              {<br>
              Â  Â  } stage[MESA_SHADER_STAGES];<br>
              <br>
              Â  Â  /* Immutable samplers (or NULL if no immutable
              samplers) */<br>
              -  Â struct anv_sampler **immutable_samplers;<br>
              +  Â struct anv_descriptor_set_immutable_<wbr>sampler
              *immutable_samplers;<br>
              Â };<br>
              <br>
              Â struct anv_descriptor_set_layout {<br>
              @@ -1229,6 +1244,10 @@ struct anv_descriptor {<br>
              Â  Â  Â  Â  Â  VkImageLayout layout;<br>
              Â  Â  Â  Â  Â  struct anv_image_view *image_view;<br>
              Â  Â  Â  Â  Â  struct anv_sampler *sampler;<br>
              +<br>
              +  Â  Â  Â  Â /* Used to dertermine what plane of the
              sampler/image we need<br>
              +  Â  Â  Â  Â  * program. */<br>
              +  Â  Â  Â  Â uint32_t plane;<br>
              Â  Â  Â  Â };<br>
              <br>
              Â  Â  Â  Â struct {<br>
              @@ -2504,7 +2523,8 @@ void anv_fill_buffer_surface_state(<wbr>struct
              anv_device *device,<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  uint32_t stride);<br>
              <br>
              Â struct anv_sampler {<br>
              -  Â uint32_t state[4];<br>
              +  Â uint32_t  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â state[3][4];<br>
              +  Â uint8_t  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  nb_planes;<br>
              Â };<br>
              <br>
              Â struct anv_framebuffer {<br>
              diff --git a/src/intel/vulkan/genX_cmd_<wbr>buffer.c
              b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
              index a16f67b108c..bea73dfb504 100644<br>
              --- a/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
              +++ b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
              @@ -1736,7 +1736,8 @@ emit_samplers(struct anv_cmd_buffer
              *cmd_buffer,<br>
              Â  Â  if (state->map == NULL)<br>
              Â  Â  Â  Â return VK_ERROR_OUT_OF_DEVICE_MEMORY;<br>
              <br>
              -  Â for (uint32_t s = 0; s < map->sampler_count;
              s++) {<br>
              +  Â uint32_t s = 0;<br>
              +  Â while (s < map->sampler_count) {<br>
              Â  Â  Â  Â struct anv_pipeline_binding *binding =
              &map->sampler_to_descriptor[s]<wbr>;<br>
              Â  Â  Â  Â struct anv_descriptor_set *set =<br>
              Â  Â  Â  Â  Â  cmd_buffer->state.descriptors[<wbr>binding->set];<br>
              @@ -1744,19 +1745,24 @@ emit_samplers(struct
              anv_cmd_buffer *cmd_buffer,<br>
              Â  Â  Â  Â struct anv_descriptor *desc =
              &set->descriptors[offset + binding->index];<br>
              <br>
              Â  Â  Â  Â if (desc->type != VK_DESCRIPTOR_TYPE_SAMPLER
              &&<br>
              -  Â  Â  Â  Â  desc->type != VK_DESCRIPTOR_TYPE_COMBINED_<wbr>IMAGE_SAMPLER)<br>
              +  Â  Â  Â  Â  desc->type != VK_DESCRIPTOR_TYPE_COMBINED_<wbr>IMAGE_SAMPLER)
              {<br>
              +  Â  Â  Â  Â s += 1;<br>
              Â  Â  Â  Â  Â  continue;<br>
              +  Â  Â  }<br>
              <br>
              Â  Â  Â  Â struct anv_sampler *sampler = desc->sampler;<br>
              <br>
              Â  Â  Â  Â /* This can happen if we have an unfilled slot
              since TYPE_SAMPLER<br>
              Â  Â  Â  Â  * happens to be zero.<br>
              Â  Â  Â  Â  */<br>
              -  Â  Â  if (sampler == NULL)<br>
              +  Â  Â  if (sampler == NULL) {<br>
              +  Â  Â  Â  Â s += 1;<br>
              Â  Â  Â  Â  Â  continue;<br>
              +  Â  Â  }<br>
              <br>
              Â  Â  Â  Â memcpy(state->map + (s * 16),<br>
              -  Â  Â  Â  Â  Â  Â sampler->state,
              sizeof(sampler->state));<br>
              +  Â  Â  Â  Â  Â  Â sampler->state, sampler->nb_planes *
              sizeof(sampler->state[0]));<br>
              +  Â  Â  s += sampler->nb_planes;<br>
              Â  Â  }<br>
              <br>
              Â  Â  anv_state_flush(cmd_buffer-><wbr>device, *state);<br>
              diff --git a/src/intel/vulkan/genX_state.<wbr>c
              b/src/intel/vulkan/genX_state.<wbr>c<br>
              index d016aff4a54..91e180bc7e4 100644<br>
              --- a/src/intel/vulkan/genX_state.<wbr>c<br>
              +++ b/src/intel/vulkan/genX_state.<wbr>c<br>
              @@ -171,6 +171,9 @@ VkResult genX(CreateSampler)(<br>
              Â  Â  if (!sampler)<br>
              Â  Â  Â  Â return vk_error(VK_ERROR_OUT_OF_HOST_<wbr>MEMORY);<br>
              <br>
              +  Â memset(sampler, 0, sizeof(*sampler));<br>
            </blockquote>
            <div><br>
            </div>
            <div>We have vk_zalloc for this.<br>
            </div>
            <div> </div>
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              +  Â sampler->nb_planes = 1;<br>
              +<br>
              Â  Â  uint32_t border_color_offset =
              device->border_colors.offset +<br>
              Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â 
              Â pCreateInfo->borderColor * 64;<br>
              <br>
              @@ -179,55 +182,57 @@ VkResult genX(CreateSampler)(<br>
              Â  Â  bool enable_mag_filter_addr_<wbr>rounding =<br>
              Â  Â  Â  Â pCreateInfo->magFilter != VK_FILTER_NEAREST;<br>
              <br>
              -  Â struct GENX(SAMPLER_STATE) sampler_state = {<br>
              -  Â  Â  .SamplerDisable = false,<br>
              -  Â  Â  .TextureBorderColorMode = DX10OGL,<br>
              +  Â for (unsigned p = 0; p < sampler->nb_planes;
              p++) {<br>
            </blockquote>
            <div><br>
            </div>
            <div>What's the difference between the N samplers you're
              creating here.  I don't see any from my immediate reading
              of the diff but mayabe that's just because there's too
              much churn or maybe it's just in a different patch...<br>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    I guess I could take all of this genX_* stuff into its own patch.<br>
    <br>
    <blockquote type="cite"
cite="mid:CAOFGe957h3buvb05OXXzPsMP3A3Oujt3QJkvf9B8Qr1QPeLRjA@mail.gmail.com">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div> </div>
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              +  Â  Â  struct GENX(SAMPLER_STATE) sampler_state = {<br>
              +  Â  Â  Â  Â .SamplerDisable = false,<br>
              +  Â  Â  Â  Â .TextureBorderColorMode = DX10OGL,<br>
              <br>
              Â #if GEN_GEN >= 8<br>
              -  Â  Â  .LODPreClampMode = CLAMP_MODE_OGL,<br>
              +  Â  Â  Â  Â .LODPreClampMode = CLAMP_MODE_OGL,<br>
              Â #else<br>
              -  Â  Â  .LODPreClampEnable = CLAMP_ENABLE_OGL,<br>
              +  Â  Â  Â  Â .LODPreClampEnable = CLAMP_ENABLE_OGL,<br>
              Â #endif<br>
              <br>
              Â #if GEN_GEN == 8<br>
              -  Â  Â  .BaseMipLevel = 0.0,<br>
              +  Â  Â  Â  Â .BaseMipLevel = 0.0,<br>
              Â #endif<br>
              -  Â  Â  .MipModeFilter = vk_to_gen_mipmap_mode[<wbr>pCreateInfo->mipmapMode],<br>
              -  Â  Â  .MagModeFilter = vk_to_gen_tex_filter(<wbr>pCreateInfo->magFilter,<br>
              -  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â 
              pCreateInfo->anisotropyEnable)<wbr>,<br>
              -  Â  Â  .MinModeFilter = vk_to_gen_tex_filter(<wbr>pCreateInfo->minFilter,<br>
              -  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â 
              pCreateInfo->anisotropyEnable)<wbr>,<br>
              -  Â  Â  .TextureLODBias = anv_clamp_f(pCreateInfo-><wbr>mipLodBias,
              -16, 15.996),<br>
              -  Â  Â  .AnisotropicAlgorithm = EWAApproximation,<br>
              -  Â  Â  .MinLOD = anv_clamp_f(pCreateInfo-><wbr>minLod,
              0, 14),<br>
              -  Â  Â  .MaxLOD = anv_clamp_f(pCreateInfo-><wbr>maxLod,
              0, 14),<br>
              -  Â  Â  .ChromaKeyEnable = 0,<br>
              -  Â  Â  .ChromaKeyIndex = 0,<br>
              -  Â  Â  .ChromaKeyMode = 0,<br>
              -  Â  Â  .ShadowFunction = vk_to_gen_shadow_compare_op[<wbr>pCreateInfo->compareOp],<br>
              -  Â  Â  .CubeSurfaceControlMode = OVERRIDE,<br>
              -<br>
              -  Â  Â  .BorderColorPointer = border_color_offset,<br>
              +  Â  Â  Â  Â .MipModeFilter = vk_to_gen_mipmap_mode[<wbr>pCreateInfo->mipmapMode],<br>
              +  Â  Â  Â  Â .MagModeFilter = vk_to_gen_tex_filter(<wbr>pCreateInfo->magFilter,<br>
              +  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â 
              Â pCreateInfo->anisotropyEnable)<wbr>,<br>
              +  Â  Â  Â  Â .MinModeFilter = vk_to_gen_tex_filter(<wbr>pCreateInfo->minFilter,<br>
              +  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â 
              Â pCreateInfo->anisotropyEnable)<wbr>,<br>
              +  Â  Â  Â  Â .TextureLODBias = anv_clamp_f(pCreateInfo-><wbr>mipLodBias,
              -16, 15.996),<br>
              +  Â  Â  Â  Â .AnisotropicAlgorithm = EWAApproximation,<br>
              +  Â  Â  Â  Â .MinLOD = anv_clamp_f(pCreateInfo-><wbr>minLod,
              0, 14),<br>
              +  Â  Â  Â  Â .MaxLOD = anv_clamp_f(pCreateInfo-><wbr>maxLod,
              0, 14),<br>
              +  Â  Â  Â  Â .ChromaKeyEnable = 0,<br>
              +  Â  Â  Â  Â .ChromaKeyIndex = 0,<br>
              +  Â  Â  Â  Â .ChromaKeyMode = 0,<br>
              +  Â  Â  Â  Â .ShadowFunction = vk_to_gen_shadow_compare_op[<wbr>pCreateInfo->compareOp],<br>
              +  Â  Â  Â  Â .CubeSurfaceControlMode = OVERRIDE,<br>
              +<br>
              +  Â  Â  Â  Â .BorderColorPointer = border_color_offset,<br>
              <br>
              Â #if GEN_GEN >= 8<br>
              -  Â  Â  .LODClampMagnificationMode = MIPNONE,<br>
              +  Â  Â  Â  Â .LODClampMagnificationMode = MIPNONE,<br>
              Â #endif<br>
              <br>
              -  Â  Â  .MaximumAnisotropy = vk_to_gen_max_anisotropy(<wbr>pCreateInfo->maxAnisotropy),<br>
              -  Â  Â  .<wbr>RAddressMinFilterRoundingEnabl<wbr>e =
              enable_min_filter_addr_<wbr>rounding,<br>
              -  Â  Â  .<wbr>RAddressMagFilterRoundingEnabl<wbr>e =
              enable_mag_filter_addr_<wbr>rounding,<br>
              -  Â  Â  .<wbr>VAddressMinFilterRoundingEnabl<wbr>e =
              enable_min_filter_addr_<wbr>rounding,<br>
              -  Â  Â  .<wbr>VAddressMagFilterRoundingEnabl<wbr>e =
              enable_mag_filter_addr_<wbr>rounding,<br>
              -  Â  Â  .<wbr>UAddressMinFilterRoundingEnabl<wbr>e =
              enable_min_filter_addr_<wbr>rounding,<br>
              -  Â  Â  .<wbr>UAddressMagFilterRoundingEnabl<wbr>e =
              enable_mag_filter_addr_<wbr>rounding,<br>
              -  Â  Â  .TrilinearFilterQuality = 0,<br>
              -  Â  Â  .NonnormalizedCoordinateEnable = pCreateInfo-><wbr>unnormalizedCoordinates,<br>
              -  Â  Â  .TCXAddressControlMode = vk_to_gen_tex_address[<wbr>pCreateInfo->addressModeU],<br>
              -  Â  Â  .TCYAddressControlMode = vk_to_gen_tex_address[<wbr>pCreateInfo->addressModeV],<br>
              -  Â  Â  .TCZAddressControlMode = vk_to_gen_tex_address[<wbr>pCreateInfo->addressModeW],<br>
              -  Â };<br>
              -<br>
              -  Â GENX(SAMPLER_STATE_pack)(NULL, sampler->state,
              &sampler_state);<br>
              +  Â  Â  Â  Â .MaximumAnisotropy = vk_to_gen_max_anisotropy(<wbr>pCreateInfo->maxAnisotropy),<br>
              +  Â  Â  Â  Â .<wbr>RAddressMinFilterRoundingEnabl<wbr>e =
              enable_min_filter_addr_<wbr>rounding,<br>
              +  Â  Â  Â  Â .<wbr>RAddressMagFilterRoundingEnabl<wbr>e =
              enable_mag_filter_addr_<wbr>rounding,<br>
              +  Â  Â  Â  Â .<wbr>VAddressMinFilterRoundingEnabl<wbr>e =
              enable_min_filter_addr_<wbr>rounding,<br>
              +  Â  Â  Â  Â .<wbr>VAddressMagFilterRoundingEnabl<wbr>e =
              enable_mag_filter_addr_<wbr>rounding,<br>
              +  Â  Â  Â  Â .<wbr>UAddressMinFilterRoundingEnabl<wbr>e =
              enable_min_filter_addr_<wbr>rounding,<br>
              +  Â  Â  Â  Â .<wbr>UAddressMagFilterRoundingEnabl<wbr>e =
              enable_mag_filter_addr_<wbr>rounding,<br>
              +  Â  Â  Â  Â .TrilinearFilterQuality = 0,<br>
              +  Â  Â  Â  Â .NonnormalizedCoordinateEnable =
              pCreateInfo-><wbr>unnormalizedCoordinates,<br>
              +  Â  Â  Â  Â .TCXAddressControlMode = vk_to_gen_tex_address[<wbr>pCreateInfo->addressModeU],<br>
              +  Â  Â  Â  Â .TCYAddressControlMode = vk_to_gen_tex_address[<wbr>pCreateInfo->addressModeV],<br>
              +  Â  Â  Â  Â .TCZAddressControlMode = vk_to_gen_tex_address[<wbr>pCreateInfo->addressModeW],<br>
              +  Â  Â  };<br>
              +<br>
              +  Â  Â  GENX(SAMPLER_STATE_pack)(NULL,
              sampler->state[p], &sampler_state);<br>
              +  Â }<br>
              <br>
              Â  Â  *pSampler = anv_sampler_to_handle(sampler)<wbr>;<br>
              <span class="HOEnZb"><font color="#888888"><br>
                  --<br>
                  2.14.1<br>
                  <br>
                  ______________________________<wbr>_________________<br>
                  mesa-dev mailing list<br>
                  <a href="mailto:mesa-dev@lists.freedesktop.org"
                    moz-do-not-send="true">mesa-dev@lists.freedesktop.org</a><br>
                  <a
                    href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev"
                    rel="noreferrer" target="_blank"
                    moz-do-not-send="true">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
                </font></span></blockquote>
          </div>
          <br>
        </div>
      </div>
    </blockquote>
    <p><br>
    </p>
  </body>
</html>