Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev