[Mesa-dev] [PATCH 12/15] anv: add descriptor support for multiplanar image/sampler
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Fri Sep 15 14:11:04 UTC 2017
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
src/intel/vulkan/anv_descriptor_set.c | 107 +++++++++++++++++------
src/intel/vulkan/anv_nir_apply_pipeline_layout.c | 44 +++++-----
src/intel/vulkan/anv_private.h | 24 ++++-
src/intel/vulkan/genX_cmd_buffer.c | 14 ++-
src/intel/vulkan/genX_state.c | 81 +++++++++--------
5 files changed, 178 insertions(+), 92 deletions(-)
diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c
index 91387c065e4..4e29310f5fa 100644
--- a/src/intel/vulkan/anv_descriptor_set.c
+++ b/src/intel/vulkan/anv_descriptor_set.c
@@ -35,6 +35,21 @@
* Descriptor set layouts.
*/
+static uint32_t
+layout_binding_get_descriptor_count(const VkDescriptorSetLayoutBinding *binding)
+{
+ if (binding->pImmutableSamplers == NULL)
+ return binding->descriptorCount;
+
+ uint32_t immutable_sampler_count = 0;
+ for (uint32_t i = 0; i < binding->descriptorCount; i++) {
+ ANV_FROM_HANDLE(anv_sampler, sampler, binding->pImmutableSamplers[i]);
+ immutable_sampler_count += sampler->nb_planes;
+ }
+
+ return immutable_sampler_count;
+}
+
VkResult anv_CreateDescriptorSetLayout(
VkDevice _device,
const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
@@ -49,13 +64,13 @@ VkResult anv_CreateDescriptorSetLayout(
uint32_t immutable_sampler_count = 0;
for (uint32_t j = 0; j < pCreateInfo->bindingCount; j++) {
max_binding = MAX2(max_binding, pCreateInfo->pBindings[j].binding);
- if (pCreateInfo->pBindings[j].pImmutableSamplers)
- immutable_sampler_count += pCreateInfo->pBindings[j].descriptorCount;
+ immutable_sampler_count +=
+ layout_binding_get_descriptor_count(&pCreateInfo->pBindings[j]);
}
struct anv_descriptor_set_layout *set_layout;
struct anv_descriptor_set_binding_layout *bindings;
- struct anv_sampler **samplers;
+ struct anv_descriptor_set_immutable_sampler *samplers;
ANV_MULTIALLOC(ma);
anv_multialloc_add(&ma, &set_layout, 1);
@@ -74,6 +89,7 @@ VkResult anv_CreateDescriptorSetLayout(
memset(&set_layout->binding[b], -1, sizeof(set_layout->binding[b]));
set_layout->binding[b].array_size = 0;
+ set_layout->binding[b].descriptor_size = 0;
set_layout->binding[b].immutable_samplers = NULL;
}
@@ -108,17 +124,20 @@ VkResult anv_CreateDescriptorSetLayout(
set_layout->binding[b].type = binding->descriptorType;
#endif
set_layout->binding[b].array_size = binding->descriptorCount;
+ set_layout->binding[b].descriptor_size =
+ layout_binding_get_descriptor_count(binding);
set_layout->binding[b].descriptor_index = set_layout->size;
- set_layout->size += binding->descriptorCount;
+ set_layout->size += set_layout->binding[b].descriptor_size;
switch (binding->descriptorType) {
case VK_DESCRIPTOR_TYPE_SAMPLER:
- case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: {
anv_foreach_stage(s, binding->stageFlags) {
set_layout->binding[b].stage[s].sampler_index = sampler_count[s];
- sampler_count[s] += binding->descriptorCount;
+ sampler_count[s] += set_layout->binding[b].descriptor_size;
}
break;
+ }
default:
break;
}
@@ -140,7 +159,7 @@ VkResult anv_CreateDescriptorSetLayout(
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
anv_foreach_stage(s, binding->stageFlags) {
set_layout->binding[b].stage[s].surface_index = surface_count[s];
- surface_count[s] += binding->descriptorCount;
+ surface_count[s] += set_layout->binding[b].descriptor_size;
}
break;
default:
@@ -151,7 +170,7 @@ VkResult anv_CreateDescriptorSetLayout(
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
set_layout->binding[b].dynamic_offset_index = dynamic_offset_count;
- dynamic_offset_count += binding->descriptorCount;
+ dynamic_offset_count += set_layout->binding[b].descriptor_size;
break;
default:
break;
@@ -162,7 +181,7 @@ VkResult anv_CreateDescriptorSetLayout(
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
anv_foreach_stage(s, binding->stageFlags) {
set_layout->binding[b].stage[s].image_index = image_count[s];
- image_count[s] += binding->descriptorCount;
+ image_count[s] += set_layout->binding[b].descriptor_size;
}
break;
default:
@@ -171,11 +190,18 @@ VkResult anv_CreateDescriptorSetLayout(
if (binding->pImmutableSamplers) {
set_layout->binding[b].immutable_samplers = samplers;
- samplers += binding->descriptorCount;
- for (uint32_t i = 0; i < binding->descriptorCount; i++)
- set_layout->binding[b].immutable_samplers[i] =
- anv_sampler_from_handle(binding->pImmutableSamplers[i]);
+ uint32_t sampler_offset = 0;
+ for (uint32_t i = 0; i < binding->descriptorCount; i++) {
+ ANV_FROM_HANDLE(anv_sampler, sampler, binding->pImmutableSamplers[i]);
+
+ set_layout->binding[b].immutable_samplers[i].sampler = sampler;
+ set_layout->binding[b].immutable_samplers[i].descriptor_index_offset =
+ sampler_offset;
+ sampler_offset += sampler->nb_planes;
+ }
+
+ samplers += sampler_offset;
} else {
set_layout->binding[b].immutable_samplers = NULL;
}
@@ -250,7 +276,7 @@ VkResult anv_CreatePipelineLayout(
if (set_layout->binding[b].dynamic_offset_index < 0)
continue;
- dynamic_offset_count += set_layout->binding[b].array_size;
+ dynamic_offset_count += set_layout->binding[b].descriptor_size;
for (gl_shader_stage s = 0; s < MESA_SHADER_STAGES; s++) {
if (set_layout->binding[b].stage[s].surface_index >= 0)
layout->stage[s].has_dynamic_offsets = true;
@@ -318,11 +344,24 @@ VkResult anv_CreateDescriptorPool(
uint32_t buffer_count = 0;
for (uint32_t i = 0; i < pCreateInfo->poolSizeCount; i++) {
switch (pCreateInfo->pPoolSizes[i].type) {
+ case VK_DESCRIPTOR_TYPE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ /* We have to account that some descriptor layouts might have
+ * multiplanar images (atm up to 3 through the conversion
+ * VK_KHR_sampler_ycbcr_conversion extension). Therefor take the
+ * maximum amount of space that can be occupied by a single of those
+ * entries.
+ */
+ descriptor_count += 3 * pCreateInfo->pPoolSizes[i].descriptorCount;
+ break;
+
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
buffer_count += pCreateInfo->pPoolSizes[i].descriptorCount;
+ /* Fallthrough */
+
default:
descriptor_count += pCreateInfo->pPoolSizes[i].descriptorCount;
break;
@@ -461,13 +500,18 @@ anv_descriptor_set_create(struct anv_device *device,
* set has an immutable sampler, UpdateDescriptorSets may never
* touch it, so we need to make sure it's 100% valid now.
*/
- desc[i] = (struct anv_descriptor) {
- .type = VK_DESCRIPTOR_TYPE_SAMPLER,
- .sampler = layout->binding[b].immutable_samplers[i],
- };
+ struct anv_descriptor_set_immutable_sampler *sampler =
+ &layout->binding[b].immutable_samplers[i];
+ for (uint32_t p = 0; p < sampler->sampler->nb_planes; p++) {
+ desc[sampler->descriptor_index_offset + p] = (struct anv_descriptor) {
+ .type = VK_DESCRIPTOR_TYPE_SAMPLER,
+ .sampler = sampler->sampler,
+ .plane = p,
+ };
+ }
}
}
- desc += layout->binding[b].array_size;
+ desc += layout->binding[b].descriptor_size;
}
/* Allocate surface state for the buffer views. */
@@ -579,8 +623,13 @@ anv_descriptor_set_write_image_view(struct anv_descriptor_set *set,
{
const struct anv_descriptor_set_binding_layout *bind_layout =
&set->layout->binding[binding];
+ const struct anv_descriptor_set_immutable_sampler *immutable_sampler =
+ bind_layout->immutable_samplers ?
+ &bind_layout->immutable_samplers[element] : NULL;
+ uint32_t descriptor_index_offset =
+ immutable_sampler ? immutable_sampler->descriptor_index_offset : element;
struct anv_descriptor *desc =
- &set->descriptors[bind_layout->descriptor_index + element];
+ &set->descriptors[bind_layout->descriptor_index + descriptor_index_offset];
struct anv_image_view *image_view = NULL;
struct anv_sampler *sampler = NULL;
@@ -610,15 +659,19 @@ anv_descriptor_set_write_image_view(struct anv_descriptor_set *set,
* it.
*/
sampler = bind_layout->immutable_samplers ?
- bind_layout->immutable_samplers[element] :
+ bind_layout->immutable_samplers[element].sampler :
sampler;
- *desc = (struct anv_descriptor) {
- .type = type,
- .layout = info->imageLayout,
- .image_view = image_view,
- .sampler = sampler,
- };
+ uint32_t nb_planes = sampler != NULL ? sampler->nb_planes : 1;
+ for (uint32_t p = 0; p < nb_planes; p++) {
+ desc[p] = (struct anv_descriptor) {
+ .type = type,
+ .layout = info->imageLayout,
+ .image_view = image_view,
+ .sampler = sampler,
+ .plane = p,
+ };
+ }
}
void
diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
index 67bcf5e29ef..83d4c4ea30d 100644
--- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
+++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
@@ -130,7 +130,7 @@ lower_res_index_intrinsic(nir_intrinsic_instr *intrin,
static void
lower_tex_deref(nir_tex_instr *tex, nir_deref_var *deref,
- unsigned *const_index, unsigned array_size,
+ unsigned *const_index, unsigned descriptor_size,
nir_tex_src_type src_type,
struct apply_pipeline_layout_state *state)
{
@@ -146,7 +146,7 @@ lower_tex_deref(nir_tex_instr *tex, nir_deref_var *deref,
nir_ssa_for_src(b, deref_array->indirect, 1));
if (state->add_bounds_checks)
- index = nir_umin(b, index, nir_imm_int(b, array_size - 1));
+ index = nir_umin(b, index, nir_imm_int(b, descriptor_size - 1));
nir_tex_src *new_srcs = rzalloc_array(tex, nir_tex_src,
tex->num_srcs + 1);
@@ -167,7 +167,7 @@ lower_tex_deref(nir_tex_instr *tex, nir_deref_var *deref,
nir_src_for_ssa(index));
tex->num_srcs++;
} else {
- *const_index += MIN2(deref_array->base_offset, array_size - 1);
+ *const_index += MIN2(deref_array->base_offset, descriptor_size - 1);
}
}
}
@@ -196,19 +196,18 @@ lower_tex(nir_tex_instr *tex, struct apply_pipeline_layout_state *state)
unsigned set = tex->texture->var->data.descriptor_set;
unsigned binding = tex->texture->var->data.binding;
- unsigned array_size =
- state->layout->set[set].layout->binding[binding].array_size;
+ unsigned descriptor_size =
+ state->layout->set[set].layout->binding[binding].descriptor_size;
tex->texture_index = state->set[set].surface_offsets[binding];
- lower_tex_deref(tex, tex->texture, &tex->texture_index, array_size,
+ lower_tex_deref(tex, tex->texture, &tex->texture_index, descriptor_size,
nir_tex_src_texture_offset, state);
if (tex->sampler) {
unsigned set = tex->sampler->var->data.descriptor_set;
unsigned binding = tex->sampler->var->data.binding;
- unsigned array_size =
- state->layout->set[set].layout->binding[binding].array_size;
- tex->sampler_index = state->set[set].sampler_offsets[binding];
- lower_tex_deref(tex, tex->sampler, &tex->sampler_index, array_size,
+ unsigned descriptor_size =
+ state->layout->set[set].layout->binding[binding].descriptor_size;
+ lower_tex_deref(tex, tex->sampler, &tex->sampler_index, descriptor_size,
nir_tex_src_sampler_offset, state);
}
@@ -300,9 +299,9 @@ anv_nir_apply_pipeline_layout(struct anv_pipeline *pipeline,
BITSET_FOREACH_SET(b, _tmp, state.set[set].used,
set_layout->binding_count) {
if (set_layout->binding[b].stage[shader->stage].surface_index >= 0)
- map->surface_count += set_layout->binding[b].array_size;
+ map->surface_count += set_layout->binding[b].descriptor_size;
if (set_layout->binding[b].stage[shader->stage].sampler_index >= 0)
- map->sampler_count += set_layout->binding[b].array_size;
+ map->sampler_count += set_layout->binding[b].descriptor_size;
if (set_layout->binding[b].stage[shader->stage].image_index >= 0)
map->image_count += set_layout->binding[b].array_size;
}
@@ -317,31 +316,34 @@ anv_nir_apply_pipeline_layout(struct anv_pipeline *pipeline,
BITSET_WORD b, _tmp;
BITSET_FOREACH_SET(b, _tmp, state.set[set].used,
set_layout->binding_count) {
- unsigned array_size = set_layout->binding[b].array_size;
+ struct anv_descriptor_set_binding_layout *binding =
+ &set_layout->binding[b];
+ /* unsigned array_size = set_layout->binding[b].array_size; */
+ /* unsigned descriptor_size = set_layout->binding[b].descriptor_size; */
- if (set_layout->binding[b].stage[shader->stage].surface_index >= 0) {
+ if (binding->stage[shader->stage].surface_index >= 0) {
state.set[set].surface_offsets[b] = surface;
- for (unsigned i = 0; i < array_size; i++) {
+ for (unsigned i = 0; i < binding->descriptor_size; i++) {
map->surface_to_descriptor[surface + i].set = set;
map->surface_to_descriptor[surface + i].binding = b;
map->surface_to_descriptor[surface + i].index = i;
}
- surface += array_size;
+ surface += binding->descriptor_size;
}
- if (set_layout->binding[b].stage[shader->stage].sampler_index >= 0) {
+ if (binding->stage[shader->stage].sampler_index >= 0) {
state.set[set].sampler_offsets[b] = sampler;
- for (unsigned i = 0; i < array_size; i++) {
+ for (unsigned i = 0; i < binding->descriptor_size; i++) {
map->sampler_to_descriptor[sampler + i].set = set;
map->sampler_to_descriptor[sampler + i].binding = b;
map->sampler_to_descriptor[sampler + i].index = i;
}
- sampler += array_size;
+ sampler += binding->descriptor_size;
}
- if (set_layout->binding[b].stage[shader->stage].image_index >= 0) {
+ if (binding->stage[shader->stage].image_index >= 0) {
state.set[set].image_offsets[b] = image;
- image += array_size;
+ image += binding->descriptor_size;
}
}
}
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index a4b263cea5e..41f01192aa6 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1168,6 +1168,18 @@ struct anv_vue_header {
float PointWidth;
};
+struct anv_descriptor_set_immutable_sampler {
+ /* Immutable sampler */
+ struct anv_sampler *sampler;
+
+ /* Offset to add to
+ * anv_descriptor_set_binding_layout.stage[s].sampler_index or
+ * anv_descriptor_set_binding_layout.descriptor_index to compute the offset
+ * in the descriptor table.
+ */
+ uint16_t descriptor_index_offset;
+};
+
struct anv_descriptor_set_binding_layout {
#ifndef NDEBUG
/* The type of the descriptors in this binding */
@@ -1177,6 +1189,9 @@ struct anv_descriptor_set_binding_layout {
/* Number of array elements in this binding */
uint16_t array_size;
+ /* Number of descriptors used in this binding */
+ uint16_t descriptor_size;
+
/* Index into the flattend descriptor set */
uint16_t descriptor_index;
@@ -1198,7 +1213,7 @@ struct anv_descriptor_set_binding_layout {
} stage[MESA_SHADER_STAGES];
/* Immutable samplers (or NULL if no immutable samplers) */
- struct anv_sampler **immutable_samplers;
+ struct anv_descriptor_set_immutable_sampler *immutable_samplers;
};
struct anv_descriptor_set_layout {
@@ -1229,6 +1244,10 @@ struct anv_descriptor {
VkImageLayout layout;
struct anv_image_view *image_view;
struct anv_sampler *sampler;
+
+ /* Used to dertermine what plane of the sampler/image we need
+ * program. */
+ uint32_t plane;
};
struct {
@@ -2504,7 +2523,8 @@ void anv_fill_buffer_surface_state(struct anv_device *device,
uint32_t stride);
struct anv_sampler {
- uint32_t state[4];
+ uint32_t state[3][4];
+ uint8_t nb_planes;
};
struct anv_framebuffer {
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index a16f67b108c..bea73dfb504 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -1736,7 +1736,8 @@ emit_samplers(struct anv_cmd_buffer *cmd_buffer,
if (state->map == NULL)
return VK_ERROR_OUT_OF_DEVICE_MEMORY;
- for (uint32_t s = 0; s < map->sampler_count; s++) {
+ uint32_t s = 0;
+ while (s < map->sampler_count) {
struct anv_pipeline_binding *binding = &map->sampler_to_descriptor[s];
struct anv_descriptor_set *set =
cmd_buffer->state.descriptors[binding->set];
@@ -1744,19 +1745,24 @@ emit_samplers(struct anv_cmd_buffer *cmd_buffer,
struct anv_descriptor *desc = &set->descriptors[offset + binding->index];
if (desc->type != VK_DESCRIPTOR_TYPE_SAMPLER &&
- desc->type != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
+ desc->type != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) {
+ s += 1;
continue;
+ }
struct anv_sampler *sampler = desc->sampler;
/* This can happen if we have an unfilled slot since TYPE_SAMPLER
* happens to be zero.
*/
- if (sampler == NULL)
+ if (sampler == NULL) {
+ s += 1;
continue;
+ }
memcpy(state->map + (s * 16),
- sampler->state, sizeof(sampler->state));
+ sampler->state, sampler->nb_planes * sizeof(sampler->state[0]));
+ s += sampler->nb_planes;
}
anv_state_flush(cmd_buffer->device, *state);
diff --git a/src/intel/vulkan/genX_state.c b/src/intel/vulkan/genX_state.c
index d016aff4a54..91e180bc7e4 100644
--- a/src/intel/vulkan/genX_state.c
+++ b/src/intel/vulkan/genX_state.c
@@ -171,6 +171,9 @@ VkResult genX(CreateSampler)(
if (!sampler)
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
+ memset(sampler, 0, sizeof(*sampler));
+ sampler->nb_planes = 1;
+
uint32_t border_color_offset = device->border_colors.offset +
pCreateInfo->borderColor * 64;
@@ -179,55 +182,57 @@ VkResult genX(CreateSampler)(
bool enable_mag_filter_addr_rounding =
pCreateInfo->magFilter != VK_FILTER_NEAREST;
- struct GENX(SAMPLER_STATE) sampler_state = {
- .SamplerDisable = false,
- .TextureBorderColorMode = DX10OGL,
+ for (unsigned p = 0; p < sampler->nb_planes; p++) {
+ struct GENX(SAMPLER_STATE) sampler_state = {
+ .SamplerDisable = false,
+ .TextureBorderColorMode = DX10OGL,
#if GEN_GEN >= 8
- .LODPreClampMode = CLAMP_MODE_OGL,
+ .LODPreClampMode = CLAMP_MODE_OGL,
#else
- .LODPreClampEnable = CLAMP_ENABLE_OGL,
+ .LODPreClampEnable = CLAMP_ENABLE_OGL,
#endif
#if GEN_GEN == 8
- .BaseMipLevel = 0.0,
+ .BaseMipLevel = 0.0,
#endif
- .MipModeFilter = vk_to_gen_mipmap_mode[pCreateInfo->mipmapMode],
- .MagModeFilter = vk_to_gen_tex_filter(pCreateInfo->magFilter,
- pCreateInfo->anisotropyEnable),
- .MinModeFilter = vk_to_gen_tex_filter(pCreateInfo->minFilter,
- pCreateInfo->anisotropyEnable),
- .TextureLODBias = anv_clamp_f(pCreateInfo->mipLodBias, -16, 15.996),
- .AnisotropicAlgorithm = EWAApproximation,
- .MinLOD = anv_clamp_f(pCreateInfo->minLod, 0, 14),
- .MaxLOD = anv_clamp_f(pCreateInfo->maxLod, 0, 14),
- .ChromaKeyEnable = 0,
- .ChromaKeyIndex = 0,
- .ChromaKeyMode = 0,
- .ShadowFunction = vk_to_gen_shadow_compare_op[pCreateInfo->compareOp],
- .CubeSurfaceControlMode = OVERRIDE,
-
- .BorderColorPointer = border_color_offset,
+ .MipModeFilter = vk_to_gen_mipmap_mode[pCreateInfo->mipmapMode],
+ .MagModeFilter = vk_to_gen_tex_filter(pCreateInfo->magFilter,
+ pCreateInfo->anisotropyEnable),
+ .MinModeFilter = vk_to_gen_tex_filter(pCreateInfo->minFilter,
+ pCreateInfo->anisotropyEnable),
+ .TextureLODBias = anv_clamp_f(pCreateInfo->mipLodBias, -16, 15.996),
+ .AnisotropicAlgorithm = EWAApproximation,
+ .MinLOD = anv_clamp_f(pCreateInfo->minLod, 0, 14),
+ .MaxLOD = anv_clamp_f(pCreateInfo->maxLod, 0, 14),
+ .ChromaKeyEnable = 0,
+ .ChromaKeyIndex = 0,
+ .ChromaKeyMode = 0,
+ .ShadowFunction = vk_to_gen_shadow_compare_op[pCreateInfo->compareOp],
+ .CubeSurfaceControlMode = OVERRIDE,
+
+ .BorderColorPointer = border_color_offset,
#if GEN_GEN >= 8
- .LODClampMagnificationMode = MIPNONE,
+ .LODClampMagnificationMode = MIPNONE,
#endif
- .MaximumAnisotropy = vk_to_gen_max_anisotropy(pCreateInfo->maxAnisotropy),
- .RAddressMinFilterRoundingEnable = enable_min_filter_addr_rounding,
- .RAddressMagFilterRoundingEnable = enable_mag_filter_addr_rounding,
- .VAddressMinFilterRoundingEnable = enable_min_filter_addr_rounding,
- .VAddressMagFilterRoundingEnable = enable_mag_filter_addr_rounding,
- .UAddressMinFilterRoundingEnable = enable_min_filter_addr_rounding,
- .UAddressMagFilterRoundingEnable = enable_mag_filter_addr_rounding,
- .TrilinearFilterQuality = 0,
- .NonnormalizedCoordinateEnable = pCreateInfo->unnormalizedCoordinates,
- .TCXAddressControlMode = vk_to_gen_tex_address[pCreateInfo->addressModeU],
- .TCYAddressControlMode = vk_to_gen_tex_address[pCreateInfo->addressModeV],
- .TCZAddressControlMode = vk_to_gen_tex_address[pCreateInfo->addressModeW],
- };
-
- GENX(SAMPLER_STATE_pack)(NULL, sampler->state, &sampler_state);
+ .MaximumAnisotropy = vk_to_gen_max_anisotropy(pCreateInfo->maxAnisotropy),
+ .RAddressMinFilterRoundingEnable = enable_min_filter_addr_rounding,
+ .RAddressMagFilterRoundingEnable = enable_mag_filter_addr_rounding,
+ .VAddressMinFilterRoundingEnable = enable_min_filter_addr_rounding,
+ .VAddressMagFilterRoundingEnable = enable_mag_filter_addr_rounding,
+ .UAddressMinFilterRoundingEnable = enable_min_filter_addr_rounding,
+ .UAddressMagFilterRoundingEnable = enable_mag_filter_addr_rounding,
+ .TrilinearFilterQuality = 0,
+ .NonnormalizedCoordinateEnable = pCreateInfo->unnormalizedCoordinates,
+ .TCXAddressControlMode = vk_to_gen_tex_address[pCreateInfo->addressModeU],
+ .TCYAddressControlMode = vk_to_gen_tex_address[pCreateInfo->addressModeV],
+ .TCZAddressControlMode = vk_to_gen_tex_address[pCreateInfo->addressModeW],
+ };
+
+ GENX(SAMPLER_STATE_pack)(NULL, sampler->state[p], &sampler_state);
+ }
*pSampler = anv_sampler_to_handle(sampler);
--
2.14.1
More information about the mesa-dev
mailing list