#pragma once

#include "dxvk_include.h"

namespace dxvk {

  /**
   * \brief Device info
   * 
   * Stores core properties and a bunch of extension-specific
   * properties, if the respective extensions are available.
   * Structures for unsupported extensions will be undefined,
   * so before using them, check whether they are supported.
   */
  struct DxvkDeviceInfo {
    VkPhysicalDeviceProperties2                         core;
    VkPhysicalDeviceIDProperties                        coreDeviceId;
    VkPhysicalDeviceSubgroupProperties                  coreSubgroup;
    VkPhysicalDeviceTransformFeedbackPropertiesEXT      extTransformFeedback;
    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor;
    VkPhysicalDeviceDepthStencilResolvePropertiesKHR    khrDepthStencilResolve;
    VkPhysicalDeviceDriverPropertiesKHR                 khrDeviceDriverProperties;
  };


  /**
   * \brief Device features
   * 
   * Stores core features and extension-specific features.
   * If the respective extensions are not available, the
   * extended features will be marked as unsupported.
   */
  struct DxvkDeviceFeatures {
    VkPhysicalDeviceFeatures2                                 core;
    VkPhysicalDeviceShaderDrawParametersFeatures              shaderDrawParameters;
    VkPhysicalDeviceConditionalRenderingFeaturesEXT           extConditionalRendering;
    VkPhysicalDeviceDepthClipEnableFeaturesEXT                extDepthClipEnable;
    VkPhysicalDeviceHostQueryResetFeaturesEXT                 extHostQueryReset;
    VkPhysicalDeviceMemoryPriorityFeaturesEXT                 extMemoryPriority;
    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT extShaderDemoteToHelperInvocation;
    VkPhysicalDeviceTransformFeedbackFeaturesEXT              extTransformFeedback;
    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT         extVertexAttributeDivisor;
  };

}