[Mesa-dev] [PATCH 12/15] anv: add descriptor support for multiplanar image/sampler
Jason Ekstrand
jason at jlekstrand.net
Fri Sep 15 22:54:32 UTC 2017
On Fri, Sep 15, 2017 at 7:11 AM, Lionel Landwerlin <
lionel.g.landwerlin at intel.com> wrote:
> 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;
>
Are you sure about adjusting dynamic_offset_count here?
> 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;
>
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.
> + 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));
>
We have vk_zalloc for this.
> + 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++) {
>
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...
> + 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
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170915/96aed291/attachment-0001.html>
More information about the mesa-dev
mailing list