NVIDIA anuncio soporte nativo de extremo a extremo para VK_EXT_descriptor_heap en sus drivers Vulkan 610 y posteriores, junto con la version 2026.2 de Nsight Graphics. La extension reescribe la forma en que las aplicaciones Vulkan administran los descriptores de recursos: pasa de los antiguos descriptor sets a un unico heap controlado por el desarrollador, simplificando la asignacion de memoria, el binding y el layout.
¿Que cambia con los descriptor heaps?
Los shaders son programas de GPU que procesan datos visuales como rayos, pixeles, geometria y texturas para producir efectos de renderizado. Para acceder a esos datos, los shaders dependen de un mecanismo llamado resource binding. Hasta ahora, Vulkan obligaba a los desarrolladores a manejar arrays de descriptores agrupados en sets, con layouts dedicados, pools de asignacion y otras capas de infraestructura.
VK_EXT_descriptor_heap simplifica el modelo: una unica "heap" de memoria asignada por el desarrollador, en la que se escriben los descriptores y desde donde los shaders pueden indexarlos dinamicamente. Solo puede haber un heap de descriptores de recursos vinculado a la vez, y la documentacion oficial recomienda usar el mismo durante toda la vida util de la aplicacion porque cambiarlo tiene un costo significativo de rendimiento. Los samplers usan un heap separado bajo la misma logica.
La extension, definida en el reference manual y la guia de uso que publico Khronos, lleva el prefijo EXT porque ya cuenta con soporte cross-vendor. Khronos busca activamente feedback para refinar la interfaz y promoverla a una extension KHR de primer nivel.

¿Por que importa el cambio de descriptor sets a heaps?
Los descriptores son bytes especificos del fabricante que describen recursos como buffers y texturas. Para el shader, son simplemente un trozo opaco de memoria. La gestion de recursos en Vulkan consistia hasta ahora en arrays de descriptores reutilizables por distintos shaders, con sus correspondientes layouts y pools. La extension previa VK_EXT_descriptor_buffer introdujo memoria administrada por la aplicacion, pero mantuvo el modelo basado en sets.
El heap, en cambio, devuelve el control de la memoria al desarrollador, encaja mejor con el hardware moderno y facilita la optimizacion de rendimiento. La organizacion resultante se parece bastante a lo que conoce quien ya trabajo con descriptor heaps en Direct3D 12:
- Los shaders pueden indexar descriptores dinamicamente.
- Los indices son responsabilidad de la aplicacion.
- Los heaps son estado global vinculado.
Vulkan, eso si, mantiene algunas diferencias: la aplicacion elige la ubicacion exacta de memoria del heap y los descriptores de distintos tipos pueden tener distintos tamaños.
Como se usa en la practica
Para empezar a programar con descriptor heaps y el tooling asociado, NVIDIA recomienda:
- NVIDIA Driver 610 o posterior para todas las funciones descritas. Las actualizaciones previas a release suelen estar disponibles en el driver beta de Vulkan para desarrolladores.
- Vulkan Headers 1.4.340 o posterior (incluidos con el Vulkan SDK).
- Nsight Graphics 2026.2.
Como con cualquier extension Vulkan, hay que solicitar VK_EXT_descriptor_heap antes de usarla agregando VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME y VkPhysicalDeviceDescriptorHeapFeaturesEXT a las extensiones de VkDeviceCreateInfo y a la cadena pNext.
Para reusar shaders existentes sin modificarlos, los descriptores se pueden mapear a indices de set y binding con VkShaderDescriptorSetAndBindingMappingInfoEXT al crear el shader. Hay dos estrategias documentadas:
- Push Index: con la fuente de mapeo en
VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_PUSH_INDEX_EXT, la posicion del descriptor se desplaza por un valor leido desde los push constants. Permite seleccionar distintos rangos de descriptores por draw con el mismo shader. - Constant Offset: con
VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_CONSTANT_OFFSET_EXT, se suma un offset constante a la ubicacion del descriptor. Mas simple, y si el binding es un array, el shader puede elegir dinamicamente su propio indice.
En los siguientes ejemplos de GLSL y Slang, todo el heap se mapeo a bindings con offset cero, por lo que los shaders pueden indexar globalmente los descriptores en el heap.
layout(set = 0, binding = 0)
uniform texture2D heapImages[];
layout(set = 0, binding = 1)
uniform sampler heapSamplers[];
layout(push_constant)
uniform PushConstants {
uint textureIndex;
} push;
layout(location = 0) in vec2 uv;
layout(location = 0) out vec4 outColor;
void main
{
outColor = texture(
sampler2D(
heapTextures[nonuniformEXT(push.textureIndex)],
heapSamplers[0]),
uv);
}Para el lenguaje Slang:
[[vk::binding(0, 0)]] // (binding, set)
Texture2D<float4> heapImages[];
[[vk::binding(1, 0)]]
SamplerState heapSamplers[];
[[vk::push_constant]]
ConstantBuffer<PushConstants> push;
[shader("fragment")]
float4 fragmentMain(float2 uv : TEXCOORD0) : SV_Target
{
return heapImages[NonUniformResourceIndex(push.textureIndex)].Sample(
heapSamplers[0], uv);
}Acceso directo al heap y debugging en Nsight
Los shaders tambien pueden indexar arrays de descriptores directamente desde los heaps de recursos y samplers vinculados, sin mapearlos a set y binding. Esta via implica aliasing de punteros y exige activar VK_KHR_shader_untyped_pointers. La aplicacion de ejemplo descriptor_heap incluye un caso con untyped pointers y funciona con Nsight Graphics. NVIDIA advierte que la capacidad recien esta disponible y todavia esta madurando en lenguajes y toolchains.
En Nsight Graphics 2026.2, los descriptor heaps aparecen en las mismas vistas de recursos de shader que ya se usaban para los descriptor sets. Si la aplicacion usa VkShaderDescriptorSetAndBindingMappingInfoEXT, solo se muestran los descriptores mapeados.


El capture/replay de descriptor heaps en herramientas de debugging requiere que la implementacion soporte la feature de dispositivo VkPhysicalDeviceDescriptorHeapFeaturesEXT::descriptorHeapCaptureReplay. Los drivers NVIDIA suman esa capacidad a partir de la version 610. Quien quiera probarlo tiene que descargar la ultima version de Nsight Graphics y buscar el ejemplo descriptor heap en Help > Samples (menu disponible solo en Windows; en Linux hay que construir el ejemplo manualmente).




