{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "id": "https://schema.khronos.org/vulkan/devsim_VK_EXT_descriptor_indexing_1.json#",
    "title": "JSON schema for Vulkan device simulation layer configuration file",
    "description": "Schema for VK_EXT_descriptor_indexing data structures, as used to configure the device simulation layer.",
    "type": "object",
    "additionalProperties": true,

    "definitions": {
        "$schema": {"type": "string", "format": "uri"},
        "uint32_t": {"type": "integer", "minimum": 0, "maximum": 4294967295},
        "VkBool32": {"$ref": "#/definitions/uint32_t"},
        "VkPhysicalDeviceDescriptorIndexingPropertiesEXT": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "maxUpdateAfterBindDescriptorsInAllPools": {"$ref": "#/definitions/uint32_t"},
                "shaderUniformBufferArrayNonUniformIndexingNative": {"$ref": "#/definitions/VkBool32"},
                "shaderSampledImageArrayNonUniformIndexingNative": {"$ref": "#/definitions/VkBool32"},
                "shaderStorageBufferArrayNonUniformIndexingNative": {"$ref": "#/definitions/VkBool32"},
                "shaderStorageImageArrayNonUniformIndexingNative": {"$ref": "#/definitions/VkBool32"},
                "shaderInputAttachmentArrayNonUniformIndexingNative": {"$ref": "#/definitions/VkBool32"},
                "robustBufferAccessUpdateAfterBind": {"$ref": "#/definitions/VkBool32"},
                "quadDivergentImplicitLod": {"$ref": "#/definitions/VkBool32"},
                "maxPerStageDescriptorUpdateAfterBindSamplers": {"$ref": "#/definitions/uint32_t"},
                "maxPerStageDescriptorUpdateAfterBindUniformBuffers": {"$ref": "#/definitions/uint32_t"},
                "maxPerStageDescriptorUpdateAfterBindStorageBuffers": {"$ref": "#/definitions/uint32_t"},
                "maxPerStageDescriptorUpdateAfterBindSampledImages": {"$ref": "#/definitions/uint32_t"},
                "maxPerStageDescriptorUpdateAfterBindStorageImages": {"$ref": "#/definitions/uint32_t"},
                "maxPerStageDescriptorUpdateAfterBindInputAttachments": {"$ref": "#/definitions/uint32_t"},
                "maxPerStageUpdateAfterBindResources": {"$ref": "#/definitions/uint32_t"},
                "maxDescriptorSetUpdateAfterBindSamplers": {"$ref": "#/definitions/uint32_t"},
                "maxDescriptorSetUpdateAfterBindUniformBuffers": {"$ref": "#/definitions/uint32_t"},
                "maxDescriptorSetUpdateAfterBindUniformBuffersDynamic": {"$ref": "#/definitions/uint32_t"},
                "maxDescriptorSetUpdateAfterBindStorageBuffers": {"$ref": "#/definitions/uint32_t"},
                "maxDescriptorSetUpdateAfterBindStorageBuffersDynamic": {"$ref": "#/definitions/uint32_t"},
                "maxDescriptorSetUpdateAfterBindSampledImages": {"$ref": "#/definitions/uint32_t"},
                "maxDescriptorSetUpdateAfterBindStorageImages": {"$ref": "#/definitions/uint32_t"},
                "maxDescriptorSetUpdateAfterBindInputAttachments": {"$ref": "#/definitions/uint32_t"}

            }
        },
        "VkPhysicalDeviceDescriptorIndexingFeaturesEXT": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "shaderInputAttachmentArrayDynamicIndexing": {"$ref": "#/definitions/VkBool32"},
                "shaderUniformTexelBufferArrayDynamicIndexing": {"$ref": "#/definitions/VkBool32"},
                "shaderStorageTexelBufferArrayDynamicIndexing": {"$ref": "#/definitions/VkBool32"},
                "shaderUniformBufferArrayNonUniformIndexing": {"$ref": "#/definitions/VkBool32"},
                "shaderSampledImageArrayNonUniformIndexing": {"$ref": "#/definitions/VkBool32"},
                "shaderStorageBufferArrayNonUniformIndexing": {"$ref": "#/definitions/VkBool32"},
                "shaderStorageImageArrayNonUniformIndexing": {"$ref": "#/definitions/VkBool32"},
                "shaderInputAttachmentArrayNonUniformIndexing": {"$ref": "#/definitions/VkBool32"},
                "shaderUniformTexelBufferArrayNonUniformIndexing": {"$ref": "#/definitions/VkBool32"},
                "shaderStorageTexelBufferArrayNonUniformIndexing": {"$ref": "#/definitions/VkBool32"},
                "descriptorBindingUniformBufferUpdateAfterBind": {"$ref": "#/definitions/VkBool32"},
                "descriptorBindingSampledImageUpdateAfterBind": {"$ref": "#/definitions/VkBool32"},
                "descriptorBindingStorageImageUpdateAfterBind": {"$ref": "#/definitions/VkBool32"},
                "descriptorBindingStorageBufferUpdateAfterBind": {"$ref": "#/definitions/VkBool32"},
                "descriptorBindingUniformTexelBufferUpdateAfterBind": {"$ref": "#/definitions/VkBool32"},
                "descriptorBindingStorageTexelBufferUpdateAfterBind": {"$ref": "#/definitions/VkBool32"},
                "descriptorBindingUpdateUnusedWhilePending": {"$ref": "#/definitions/VkBool32"},
                "descriptorBindingPartiallyBound": {"$ref": "#/definitions/VkBool32"},
                "descriptorBindingVariableDescriptorCount": {"$ref": "#/definitions/VkBool32"},
                "runtimeDescriptorArray": {"$ref": "#/definitions/VkBool32"}

            }
        }
    },
    
    "required": ["$schema"],
    "properties": {
        "$schema": {"$ref": "#/definitions/$schema"},
        "VkPhysicalDeviceDescriptorIndexingPropertiesEXT": {"$ref": "#/definitions/VkPhysicalDeviceDescriptorIndexingPropertiesEXT"},
        "VkPhysicalDeviceDescriptorIndexingFeaturesEXT": {"$ref": "#/definitions/VkPhysicalDeviceDescriptorIndexingFeaturesEXT"},
        "properties": {"type": "null"},
        "features": {"type": "null"},
        "comments": {"type": "object"}
    }
}