hasvk: Drop bindless image support

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19852>
This commit is contained in:
Jason Ekstrand 2022-09-02 23:40:48 -05:00 committed by Marge Bot
parent 7b700369b1
commit 49201fe8c1
4 changed files with 45 additions and 89 deletions

View file

@ -52,15 +52,13 @@ anv_descriptor_data_for_type(const struct anv_physical_device *device,
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
data = ANV_DESCRIPTOR_SURFACE_STATE |
ANV_DESCRIPTOR_SAMPLER_STATE;
if (device->has_bindless_images || device->has_bindless_samplers)
if (device->has_bindless_samplers)
data |= ANV_DESCRIPTOR_SAMPLED_IMAGE;
break;
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
data = ANV_DESCRIPTOR_SURFACE_STATE;
if (device->has_bindless_images)
data |= ANV_DESCRIPTOR_SAMPLED_IMAGE;
break;
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
@ -70,10 +68,7 @@ anv_descriptor_data_for_type(const struct anv_physical_device *device,
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
data = ANV_DESCRIPTOR_SURFACE_STATE;
if (device->info.ver < 9)
data |= ANV_DESCRIPTOR_IMAGE_PARAM;
if (device->has_bindless_images)
data |= ANV_DESCRIPTOR_STORAGE_IMAGE;
data |= ANV_DESCRIPTOR_IMAGE_PARAM;
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
@ -252,14 +247,8 @@ anv_descriptor_data_supports_bindless(const struct anv_physical_device *pdevice,
}
if (data & ANV_DESCRIPTOR_SAMPLED_IMAGE) {
assert(pdevice->has_bindless_images || pdevice->has_bindless_samplers);
return sampler ? pdevice->has_bindless_samplers :
pdevice->has_bindless_images;
}
if (data & ANV_DESCRIPTOR_STORAGE_IMAGE) {
assert(pdevice->has_bindless_images);
return true;
assert(pdevice->has_bindless_samplers);
return sampler && pdevice->has_bindless_samplers;
}
return false;

View file

@ -268,8 +268,6 @@ get_device_extensions(const struct anv_physical_device *device,
.EXT_depth_clamp_zero_one = true,
.EXT_depth_clip_control = true,
.EXT_depth_clip_enable = true,
.EXT_descriptor_indexing = device->has_a64_buffer_access &&
device->has_bindless_images,
#ifdef VK_USE_PLATFORM_DISPLAY_KHR
.EXT_display_control = true,
#endif
@ -494,8 +492,6 @@ anv_physical_device_init_uuids(struct anv_physical_device *device)
sizeof(device->always_use_bindless));
_mesa_sha1_update(&sha1_ctx, &device->has_a64_buffer_access,
sizeof(device->has_a64_buffer_access));
_mesa_sha1_update(&sha1_ctx, &device->has_bindless_images,
sizeof(device->has_bindless_images));
_mesa_sha1_update(&sha1_ctx, &device->has_bindless_samplers,
sizeof(device->has_bindless_samplers));
_mesa_sha1_final(&sha1_ctx, sha1);
@ -857,10 +853,6 @@ anv_physical_device_try_create(struct vk_instance *vk_instance,
device->has_a64_buffer_access = device->info.ver >= 8 &&
device->use_softpin;
/* We first get bindless image access on Skylake.
*/
device->has_bindless_images = device->info.ver >= 9;
/* We've had bindless samplers since Ivy Bridge (forever in Vulkan terms)
* because it's just a matter of setting the sampler address in the sample
* message header. However, we've not bothered to wire it up for vec4 so
@ -1194,29 +1186,27 @@ anv_get_physical_device_features_1_2(struct anv_physical_device *pdevice,
f->shaderFloat16 = pdevice->info.ver >= 8;
f->shaderInt8 = pdevice->info.ver >= 8;
bool descIndexing = pdevice->has_a64_buffer_access &&
pdevice->has_bindless_images;
f->descriptorIndexing = descIndexing;
f->descriptorIndexing = false;
f->shaderInputAttachmentArrayDynamicIndexing = false;
f->shaderUniformTexelBufferArrayDynamicIndexing = descIndexing;
f->shaderStorageTexelBufferArrayDynamicIndexing = descIndexing;
f->shaderUniformTexelBufferArrayDynamicIndexing = false;
f->shaderStorageTexelBufferArrayDynamicIndexing = false;
f->shaderUniformBufferArrayNonUniformIndexing = false;
f->shaderSampledImageArrayNonUniformIndexing = descIndexing;
f->shaderStorageBufferArrayNonUniformIndexing = descIndexing;
f->shaderStorageImageArrayNonUniformIndexing = descIndexing;
f->shaderSampledImageArrayNonUniformIndexing = false;
f->shaderStorageBufferArrayNonUniformIndexing = false;
f->shaderStorageImageArrayNonUniformIndexing = false;
f->shaderInputAttachmentArrayNonUniformIndexing = false;
f->shaderUniformTexelBufferArrayNonUniformIndexing = descIndexing;
f->shaderStorageTexelBufferArrayNonUniformIndexing = descIndexing;
f->descriptorBindingUniformBufferUpdateAfterBind = descIndexing;
f->descriptorBindingSampledImageUpdateAfterBind = descIndexing;
f->descriptorBindingStorageImageUpdateAfterBind = descIndexing;
f->descriptorBindingStorageBufferUpdateAfterBind = descIndexing;
f->descriptorBindingUniformTexelBufferUpdateAfterBind = descIndexing;
f->descriptorBindingStorageTexelBufferUpdateAfterBind = descIndexing;
f->descriptorBindingUpdateUnusedWhilePending = descIndexing;
f->descriptorBindingPartiallyBound = descIndexing;
f->descriptorBindingVariableDescriptorCount = descIndexing;
f->runtimeDescriptorArray = descIndexing;
f->shaderUniformTexelBufferArrayNonUniformIndexing = false;
f->shaderStorageTexelBufferArrayNonUniformIndexing = false;
f->descriptorBindingUniformBufferUpdateAfterBind = false;
f->descriptorBindingSampledImageUpdateAfterBind = false;
f->descriptorBindingStorageImageUpdateAfterBind = false;
f->descriptorBindingStorageBufferUpdateAfterBind = false;
f->descriptorBindingUniformTexelBufferUpdateAfterBind = false;
f->descriptorBindingStorageTexelBufferUpdateAfterBind = false;
f->descriptorBindingUpdateUnusedWhilePending = false;
f->descriptorBindingPartiallyBound = false;
f->descriptorBindingVariableDescriptorCount = false;
f->runtimeDescriptorArray = false;
f->samplerFilterMinmax = pdevice->info.ver >= 9;
f->scalarBlockLayout = true;
@ -1654,20 +1644,16 @@ void anv_GetPhysicalDeviceProperties(
const struct intel_device_info *devinfo = &pdevice->info;
const uint32_t max_ssbos = pdevice->has_a64_buffer_access ? UINT16_MAX : 64;
const uint32_t max_textures =
pdevice->has_bindless_images ? UINT16_MAX : 128;
const uint32_t max_textures = 128;
const uint32_t max_samplers =
pdevice->has_bindless_samplers ? UINT16_MAX :
(devinfo->verx10 >= 75) ? 128 : 16;
const uint32_t max_images =
pdevice->has_bindless_images ? UINT16_MAX : MAX_IMAGES;
const uint32_t max_images = MAX_IMAGES;
/* If we can use bindless for everything, claim a high per-stage limit,
* otherwise use the binding table size, minus the slots reserved for
* render targets and one slot for the descriptor buffer. */
const uint32_t max_per_stage =
pdevice->has_bindless_images && pdevice->has_a64_buffer_access
? UINT32_MAX : MAX_BINDING_TABLE_SIZE - MAX_RTS - 1;
const uint32_t max_per_stage = MAX_BINDING_TABLE_SIZE - MAX_RTS - 1;
const uint32_t max_workgroup_size =
MIN2(1024, 32 * devinfo->max_cs_workgroup_threads);

View file

@ -967,12 +967,9 @@ lower_image_intrinsic(nir_builder *b, nir_intrinsic_instr *intrin,
b->cursor = nir_before_instr(&intrin->instr);
ASSERTED const bool use_bindless = state->pdevice->has_bindless_images;
if (intrin->intrinsic == nir_intrinsic_image_deref_load_param_intel) {
b->cursor = nir_instr_remove(&intrin->instr);
assert(!use_bindless); /* Otherwise our offsets would be wrong */
const unsigned param = nir_intrinsic_base(intrin);
nir_ssa_def *desc =
@ -981,13 +978,6 @@ lower_image_intrinsic(nir_builder *b, nir_intrinsic_instr *intrin,
intrin->dest.ssa.bit_size, state);
nir_ssa_def_rewrite_uses(&intrin->dest.ssa, desc);
} else if (binding_offset > MAX_BINDING_TABLE_SIZE) {
const unsigned desc_comp =
image_binding_needs_lowered_surface(var) ? 1 : 0;
nir_ssa_def *desc =
build_load_var_deref_descriptor_mem(b, deref, 0, 2, 32, state);
nir_ssa_def *handle = nir_channel(b, desc, desc_comp);
nir_rewrite_image_intrinsic(intrin, handle, true);
} else {
unsigned array_size =
state->layout->set[set].layout->binding[binding].array_size;
@ -1472,40 +1462,33 @@ anv_nir_apply_pipeline_layout(nir_shader *shader,
state.has_dynamic_buffers = true;
if (binding->data & ANV_DESCRIPTOR_SURFACE_STATE) {
if (map->surface_count + array_size > MAX_BINDING_TABLE_SIZE ||
anv_descriptor_requires_bindless(pdevice, binding, false)) {
/* If this descriptor doesn't fit in the binding table or if it
* requires bindless for some reason, flag it as bindless.
*/
assert(anv_descriptor_supports_bindless(pdevice, binding, false));
state.set[set].surface_offsets[b] = BINDLESS_OFFSET;
} else {
state.set[set].surface_offsets[b] = map->surface_count;
if (binding->dynamic_offset_index < 0) {
struct anv_sampler **samplers = binding->immutable_samplers;
for (unsigned i = 0; i < binding->array_size; i++) {
uint8_t planes = samplers ? samplers[i]->n_planes : 1;
for (uint8_t p = 0; p < planes; p++) {
map->surface_to_descriptor[map->surface_count++] =
(struct anv_pipeline_binding) {
.set = set,
.index = binding->descriptor_index + i,
.plane = p,
};
}
}
} else {
for (unsigned i = 0; i < binding->array_size; i++) {
assert(map->surface_count + array_size <= MAX_BINDING_TABLE_SIZE);
assert(!anv_descriptor_requires_bindless(pdevice, binding, false));
state.set[set].surface_offsets[b] = map->surface_count;
if (binding->dynamic_offset_index < 0) {
struct anv_sampler **samplers = binding->immutable_samplers;
for (unsigned i = 0; i < binding->array_size; i++) {
uint8_t planes = samplers ? samplers[i]->n_planes : 1;
for (uint8_t p = 0; p < planes; p++) {
map->surface_to_descriptor[map->surface_count++] =
(struct anv_pipeline_binding) {
.set = set,
.index = binding->descriptor_index + i,
.dynamic_offset_index =
layout->set[set].dynamic_offset_start +
binding->dynamic_offset_index + i,
.plane = p,
};
}
}
} else {
for (unsigned i = 0; i < binding->array_size; i++) {
map->surface_to_descriptor[map->surface_count++] =
(struct anv_pipeline_binding) {
.set = set,
.index = binding->descriptor_index + i,
.dynamic_offset_index =
layout->set[set].dynamic_offset_start +
binding->dynamic_offset_index + i,
};
}
}
assert(map->surface_count <= MAX_BINDING_TABLE_SIZE);
}

View file

@ -943,8 +943,6 @@ struct anv_physical_device {
/** True if we can access buffers using A64 messages */
bool has_a64_buffer_access;
/** True if we can use bindless access for images */
bool has_bindless_images;
/** True if we can use bindless access for samplers */
bool has_bindless_samplers;
/** True if we can use timeline semaphores through execbuf */