XR_META_tile_properties_hint extension allows your application to tell the OpenXR runtime about the GPU tile layout used by your main render pass. The runtime uses this information to provide tile-aligned resolutions from XR_META_recommended_layer_resolution and tile-aligned fragment density maps when foveated rendering is enabled.VK_QCOM_tile_properties, a Vulkan extension that lets you query the actual tile layout used by the GPU for a given render pass or framebuffer.| Extension | Purpose |
|---|---|
XR_META_tile_properties_hint | Passes tile property data to the runtime |
| Extension | Purpose |
|---|---|
VK_QCOM_tile_properties | Queries GPU tile dimensions, apron size, and origin from a framebuffer or dynamic rendering info |
PFN_xrSetTilePropertiesHintMETA xrSetTilePropertiesHintMETA = nullptr;
xrGetInstanceProcAddr(instance, "xrSetTilePropertiesHintMETA",
(PFN_xrVoidFunction*)&xrSetTilePropertiesHintMETA);
PFN_vkGetFramebufferTilePropertiesQCOM vkGetFramebufferTilePropertiesQCOM = nullptr;
vkGetFramebufferTilePropertiesQCOM =
(PFN_vkGetFramebufferTilePropertiesQCOM)vkGetDeviceProcAddr(
device, "vkGetFramebufferTilePropertiesQCOM");
vkGetDynamicRenderingTilePropertiesQCOM instead.uint32_t tilePropertiesCount = 0;
vkGetFramebufferTilePropertiesQCOM(device, framebuffer,
&tilePropertiesCount, nullptr);
if (tilePropertiesCount == 0) {
return; // No tile properties available
}
std::vector<VkTilePropertiesQCOM> tileProperties(tilePropertiesCount);
vkGetFramebufferTilePropertiesQCOM(device, framebuffer,
&tilePropertiesCount, tileProperties.data());
std::vector<XrTilePropertiesMETA> xrTileProperties(tilePropertiesCount);
for (uint32_t i = 0; i < tilePropertiesCount; i++) {
xrTileProperties[i].type = XR_TYPE_TILE_PROPERTIES_META;
xrTileProperties[i].next = nullptr;
xrTileProperties[i].tileDimensions.width = tileProperties[i].tileSize.width;
xrTileProperties[i].tileDimensions.height = tileProperties[i].tileSize.height;
xrTileProperties[i].tileDimensions.depth = tileProperties[i].tileSize.depth;
xrTileProperties[i].apronDimensions.width = tileProperties[i].apronSize.width;
xrTileProperties[i].apronDimensions.height = tileProperties[i].apronSize.height;
xrTileProperties[i].origin.x = tileProperties[i].origin.x;
xrTileProperties[i].origin.y = tileProperties[i].origin.y;
}
XrTilePropertiesHintMETA hint = {XR_TYPE_TILE_PROPERTIES_HINT_META};
hint.propertiesCount = tilePropertiesCount;
hint.properties = xrTileProperties.data();
xrSetTilePropertiesHintMETA(session, &hint);
xrSetTilePropertiesHintMETA once after creating your framebuffers (or after any change to the render pass configuration that might affect tiling). The hint persists for the session — you do not need to call it every frame.XR_META_recommended_layer_resolution, the runtime snaps recommended resolutions to tile boundaries, avoiding partial tiles that waste GPU work.XR_META_recommended_layer_resolution — tile alignment avoids partial-tile wastexrGetInstanceProcAddr fails for the OpenXR function or the Vulkan function pointer is null, skip the hint gracefully.VK_KHR_dynamic_rendering instead of VkFramebuffer, use vkGetDynamicRenderingTilePropertiesQCOM with your VkRenderingInfo to get tile properties.