mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
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:
parent
7b700369b1
commit
49201fe8c1
4 changed files with 45 additions and 89 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue