NVIDIA anunció soporte nativo de extremo a extremo para VK_EXT_descriptor_heap en sus drivers Vulkan 610 y posteriores, junto con la versión 2026.2 de Nsight Graphics. La extensión reescribe la forma en que las aplicaciones Vulkan administran los descriptores de recursos: pasa de los antiguos descriptor sets a un único heap controlado por el desarrollador, simplificando la asignación de memoria, el binding y el layout.
¿Qué cambia con los descriptor heaps?
Los shaders son programas de GPU que procesan datos visuales como rayos, píxeles, geometría 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 asignación y otras capas de infraestructura.
VK_EXT_descriptor_heap simplifica el modelo: una única "heap" de memoria asignada por el desarrollador, en la que se escriben los descriptores y desde donde los shaders pueden indexarlos dinámicamente. Solo puede haber un heap de descriptores de recursos vinculado a la vez, y la documentación oficial recomienda usar el mismo durante toda la vida útil de la aplicación porque cambiarlo tiene un costo significativo de rendimiento. Los samplers usan un heap separado bajo la misma lógica.
La extensión, definida en el reference manual y la guia de uso que publicó Khronos, lleva el prefijo EXT porque ya cuenta con soporte cross-vendor. Khronos busca activamente feedback para refinar la interfaz y promoverla a una extensión KHR de primer nivel.

¿Por qué importa el cambio de descriptor sets a heaps?
Los descriptores son bytes específicos del fabricante que describen recursos como buffers y texturas. Para el shader, son simplemente un trozo opaco de memoria. La gestión de recursos en Vulkan consistía hasta ahora en arrays de descriptores reutilizables por distintos shaders, con sus correspondientes layouts y pools. La extensión previa VK_EXT_descriptor_buffer introdujo memoria administrada por la aplicación, 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 optimización de rendimiento. La organización resultante se parece bastante a lo que conoce quien ya trabajó con descriptor heaps en Direct3D 12:
- Los shaders pueden indexar descriptores dinámicamente.
- Los índices son responsabilidad de la aplicación.
- Los heaps son estado global vinculado.
Vulkan, eso sí, mantiene algunas diferencias: la aplicación elige la ubicación exacta de memoria del heap y los descriptores de distintos tipos pueden tener distintos tamaños.
Cómo se usa en la práctica
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 extensión 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 índices 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 posición del descriptor se desplaza por un valor leído 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 ubicación del descriptor. Más simple, y si el binding es un array, el shader puede elegir dinámicamente su propio índice.
En los siguientes ejemplos de GLSL y Slang, todo el heap se mapeó 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 también pueden indexar arrays de descriptores directamente desde los heaps de recursos y samplers vinculados, sin mapearlos a set y binding. Esta vía implica aliasing de punteros y exige activar VK_KHR_shader_untyped_pointers. La aplicación de ejemplo descriptor_heap incluye un caso con untyped pointers y funciona con Nsight Graphics. NVIDIA advierte que la capacidad recién está disponible y todavía está 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 aplicación usa VkShaderDescriptorSetAndBindingMappingInfoEXT, solo se muestran los descriptores mapeados.


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




