////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// D3D11 IDL
//
// Contains interface definitions for the D3D11 API.
//
// Copyright (C) Microsoft Corporation
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

import "oaidl.idl";
import "ocidl.idl";
import "dxgi.idl";
import "d3dcommon.idl";


// NOTE: The following constants are generated from the D3D11 hardware spec.  Do not edit these values directly.
cpp_quote( "#ifndef _D3D11_CONSTANTS" )
cpp_quote( "#define _D3D11_CONSTANTS" )
const UINT D3D11_16BIT_INDEX_STRIP_CUT_VALUE = 0xffff;
const UINT D3D11_32BIT_INDEX_STRIP_CUT_VALUE = 0xffffffff;
const UINT D3D11_8BIT_INDEX_STRIP_CUT_VALUE = 0xff;
const UINT D3D11_ARRAY_AXIS_ADDRESS_RANGE_BIT_COUNT = 9;
const UINT D3D11_CLIP_OR_CULL_DISTANCE_COUNT = 8;
const UINT D3D11_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT = 2;
const UINT D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT = 14;
const UINT D3D11_COMMONSHADER_CONSTANT_BUFFER_COMPONENTS = 4;
const UINT D3D11_COMMONSHADER_CONSTANT_BUFFER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_COMMONSHADER_CONSTANT_BUFFER_HW_SLOT_COUNT = 15;
const UINT D3D11_COMMONSHADER_CONSTANT_BUFFER_PARTIAL_UPDATE_EXTENTS_BYTE_ALIGNMENT = 16;
const UINT D3D11_COMMONSHADER_CONSTANT_BUFFER_REGISTER_COMPONENTS = 4;
const UINT D3D11_COMMONSHADER_CONSTANT_BUFFER_REGISTER_COUNT = 15;
const UINT D3D11_COMMONSHADER_CONSTANT_BUFFER_REGISTER_READS_PER_INST = 1;
const UINT D3D11_COMMONSHADER_CONSTANT_BUFFER_REGISTER_READ_PORTS = 1;
const UINT D3D11_COMMONSHADER_FLOWCONTROL_NESTING_LIMIT = 64;
const UINT D3D11_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_COMPONENTS = 4;
const UINT D3D11_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_COUNT = 1;
const UINT D3D11_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_READS_PER_INST = 1;
const UINT D3D11_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_READ_PORTS = 1;
const UINT D3D11_COMMONSHADER_IMMEDIATE_VALUE_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_COMMONSHADER_INPUT_RESOURCE_REGISTER_COMPONENTS = 1;
const UINT D3D11_COMMONSHADER_INPUT_RESOURCE_REGISTER_COUNT = 128;
const UINT D3D11_COMMONSHADER_INPUT_RESOURCE_REGISTER_READS_PER_INST = 1;
const UINT D3D11_COMMONSHADER_INPUT_RESOURCE_REGISTER_READ_PORTS = 1;
const UINT D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT = 128;
const UINT D3D11_COMMONSHADER_SAMPLER_REGISTER_COMPONENTS = 1;
const UINT D3D11_COMMONSHADER_SAMPLER_REGISTER_COUNT = 16;
const UINT D3D11_COMMONSHADER_SAMPLER_REGISTER_READS_PER_INST = 1;
const UINT D3D11_COMMONSHADER_SAMPLER_REGISTER_READ_PORTS = 1;
const UINT D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT = 16;
const UINT D3D11_COMMONSHADER_SUBROUTINE_NESTING_LIMIT = 32;
const UINT D3D11_COMMONSHADER_TEMP_REGISTER_COMPONENTS = 4;
const UINT D3D11_COMMONSHADER_TEMP_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_COMMONSHADER_TEMP_REGISTER_COUNT = 4096;
const UINT D3D11_COMMONSHADER_TEMP_REGISTER_READS_PER_INST = 3;
const UINT D3D11_COMMONSHADER_TEMP_REGISTER_READ_PORTS = 3;
const UINT D3D11_COMMONSHADER_TEXCOORD_RANGE_REDUCTION_MAX = 10;
const INT D3D11_COMMONSHADER_TEXCOORD_RANGE_REDUCTION_MIN = -10;
const INT D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE = -8;
const UINT D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE = 7;
const UINT D3D11_CS_4_X_BUCKET00_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 256;
const UINT D3D11_CS_4_X_BUCKET00_MAX_NUM_THREADS_PER_GROUP = 64;
const UINT D3D11_CS_4_X_BUCKET01_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 240;
const UINT D3D11_CS_4_X_BUCKET01_MAX_NUM_THREADS_PER_GROUP = 68;
const UINT D3D11_CS_4_X_BUCKET02_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 224;
const UINT D3D11_CS_4_X_BUCKET02_MAX_NUM_THREADS_PER_GROUP = 72;
const UINT D3D11_CS_4_X_BUCKET03_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 208;
const UINT D3D11_CS_4_X_BUCKET03_MAX_NUM_THREADS_PER_GROUP = 76;
const UINT D3D11_CS_4_X_BUCKET04_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 192;
const UINT D3D11_CS_4_X_BUCKET04_MAX_NUM_THREADS_PER_GROUP = 84;
const UINT D3D11_CS_4_X_BUCKET05_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 176;
const UINT D3D11_CS_4_X_BUCKET05_MAX_NUM_THREADS_PER_GROUP = 92;
const UINT D3D11_CS_4_X_BUCKET06_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 160;
const UINT D3D11_CS_4_X_BUCKET06_MAX_NUM_THREADS_PER_GROUP = 100;
const UINT D3D11_CS_4_X_BUCKET07_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 144;
const UINT D3D11_CS_4_X_BUCKET07_MAX_NUM_THREADS_PER_GROUP = 112;
const UINT D3D11_CS_4_X_BUCKET08_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 128;
const UINT D3D11_CS_4_X_BUCKET08_MAX_NUM_THREADS_PER_GROUP = 128;
const UINT D3D11_CS_4_X_BUCKET09_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 112;
const UINT D3D11_CS_4_X_BUCKET09_MAX_NUM_THREADS_PER_GROUP = 144;
const UINT D3D11_CS_4_X_BUCKET10_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 96;
const UINT D3D11_CS_4_X_BUCKET10_MAX_NUM_THREADS_PER_GROUP = 168;
const UINT D3D11_CS_4_X_BUCKET11_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 80;
const UINT D3D11_CS_4_X_BUCKET11_MAX_NUM_THREADS_PER_GROUP = 204;
const UINT D3D11_CS_4_X_BUCKET12_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 64;
const UINT D3D11_CS_4_X_BUCKET12_MAX_NUM_THREADS_PER_GROUP = 256;
const UINT D3D11_CS_4_X_BUCKET13_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 48;
const UINT D3D11_CS_4_X_BUCKET13_MAX_NUM_THREADS_PER_GROUP = 340;
const UINT D3D11_CS_4_X_BUCKET14_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 32;
const UINT D3D11_CS_4_X_BUCKET14_MAX_NUM_THREADS_PER_GROUP = 512;
const UINT D3D11_CS_4_X_BUCKET15_MAX_BYTES_TGSM_WRITABLE_PER_THREAD = 16;
const UINT D3D11_CS_4_X_BUCKET15_MAX_NUM_THREADS_PER_GROUP = 768;
const UINT D3D11_CS_4_X_DISPATCH_MAX_THREAD_GROUPS_IN_Z_DIMENSION = 1;
const UINT D3D11_CS_4_X_RAW_UAV_BYTE_ALIGNMENT = 256;
const UINT D3D11_CS_4_X_THREAD_GROUP_MAX_THREADS_PER_GROUP = 768;
const UINT D3D11_CS_4_X_THREAD_GROUP_MAX_X = 768;
const UINT D3D11_CS_4_X_THREAD_GROUP_MAX_Y = 768;
const UINT D3D11_CS_4_X_UAV_REGISTER_COUNT = 1;
const UINT D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION = 65535;
const UINT D3D11_CS_TGSM_REGISTER_COUNT = 8192;
const UINT D3D11_CS_TGSM_REGISTER_READS_PER_INST = 1;
const UINT D3D11_CS_TGSM_RESOURCE_REGISTER_COMPONENTS = 1;
const UINT D3D11_CS_TGSM_RESOURCE_REGISTER_READ_PORTS = 1;
const UINT D3D11_CS_THREADGROUPID_REGISTER_COMPONENTS = 3;
const UINT D3D11_CS_THREADGROUPID_REGISTER_COUNT = 1;
const UINT D3D11_CS_THREADIDINGROUPFLATTENED_REGISTER_COMPONENTS = 1;
const UINT D3D11_CS_THREADIDINGROUPFLATTENED_REGISTER_COUNT = 1;
const UINT D3D11_CS_THREADIDINGROUP_REGISTER_COMPONENTS = 3;
const UINT D3D11_CS_THREADIDINGROUP_REGISTER_COUNT = 1;
const UINT D3D11_CS_THREADID_REGISTER_COMPONENTS = 3;
const UINT D3D11_CS_THREADID_REGISTER_COUNT = 1;
const UINT D3D11_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP = 1024;
const UINT D3D11_CS_THREAD_GROUP_MAX_X = 1024;
const UINT D3D11_CS_THREAD_GROUP_MAX_Y = 1024;
const UINT D3D11_CS_THREAD_GROUP_MAX_Z = 64;
const UINT D3D11_CS_THREAD_GROUP_MIN_X = 1;
const UINT D3D11_CS_THREAD_GROUP_MIN_Y = 1;
const UINT D3D11_CS_THREAD_GROUP_MIN_Z = 1;
const UINT D3D11_CS_THREAD_LOCAL_TEMP_REGISTER_POOL = 16384;
cpp_quote( "#define D3D11_DEFAULT_BLEND_FACTOR_ALPHA	( 1.0f )" )
cpp_quote( "#define D3D11_DEFAULT_BLEND_FACTOR_BLUE	( 1.0f )" )
cpp_quote( "#define D3D11_DEFAULT_BLEND_FACTOR_GREEN	( 1.0f )" )
cpp_quote( "#define D3D11_DEFAULT_BLEND_FACTOR_RED	( 1.0f )" )
cpp_quote( "#define D3D11_DEFAULT_BORDER_COLOR_COMPONENT	( 0.0f )" )
const UINT D3D11_DEFAULT_DEPTH_BIAS = 0;
cpp_quote( "#define D3D11_DEFAULT_DEPTH_BIAS_CLAMP	( 0.0f )" )
const UINT D3D11_DEFAULT_MAX_ANISOTROPY = 16;
cpp_quote( "#define D3D11_DEFAULT_MIP_LOD_BIAS	( 0.0f )" )
const UINT D3D11_DEFAULT_RENDER_TARGET_ARRAY_INDEX = 0;
const UINT D3D11_DEFAULT_SAMPLE_MASK = 0xffffffff;
const UINT D3D11_DEFAULT_SCISSOR_ENDX = 0;
const UINT D3D11_DEFAULT_SCISSOR_ENDY = 0;
const UINT D3D11_DEFAULT_SCISSOR_STARTX = 0;
const UINT D3D11_DEFAULT_SCISSOR_STARTY = 0;
cpp_quote( "#define D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS	( 0.0f )" )
const UINT D3D11_DEFAULT_STENCIL_READ_MASK = 0xff;
const UINT D3D11_DEFAULT_STENCIL_REFERENCE = 0;
const UINT D3D11_DEFAULT_STENCIL_WRITE_MASK = 0xff;
const UINT D3D11_DEFAULT_VIEWPORT_AND_SCISSORRECT_INDEX = 0;
const UINT D3D11_DEFAULT_VIEWPORT_HEIGHT = 0;
cpp_quote( "#define D3D11_DEFAULT_VIEWPORT_MAX_DEPTH	( 0.0f )" )
cpp_quote( "#define D3D11_DEFAULT_VIEWPORT_MIN_DEPTH	( 0.0f )" )
const UINT D3D11_DEFAULT_VIEWPORT_TOPLEFTX = 0;
const UINT D3D11_DEFAULT_VIEWPORT_TOPLEFTY = 0;
const UINT D3D11_DEFAULT_VIEWPORT_WIDTH = 0;
const UINT D3D11_DS_INPUT_CONTROL_POINTS_MAX_TOTAL_SCALARS = 3968;
const UINT D3D11_DS_INPUT_CONTROL_POINT_REGISTER_COMPONENTS = 4;
const UINT D3D11_DS_INPUT_CONTROL_POINT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_DS_INPUT_CONTROL_POINT_REGISTER_COUNT = 32;
const UINT D3D11_DS_INPUT_CONTROL_POINT_REGISTER_READS_PER_INST = 2;
const UINT D3D11_DS_INPUT_CONTROL_POINT_REGISTER_READ_PORTS = 1;
const UINT D3D11_DS_INPUT_DOMAIN_POINT_REGISTER_COMPONENTS = 3;
const UINT D3D11_DS_INPUT_DOMAIN_POINT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_DS_INPUT_DOMAIN_POINT_REGISTER_COUNT = 1;
const UINT D3D11_DS_INPUT_DOMAIN_POINT_REGISTER_READS_PER_INST = 2;
const UINT D3D11_DS_INPUT_DOMAIN_POINT_REGISTER_READ_PORTS = 1;
const UINT D3D11_DS_INPUT_PATCH_CONSTANT_REGISTER_COMPONENTS = 4;
const UINT D3D11_DS_INPUT_PATCH_CONSTANT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_DS_INPUT_PATCH_CONSTANT_REGISTER_COUNT = 32;
const UINT D3D11_DS_INPUT_PATCH_CONSTANT_REGISTER_READS_PER_INST = 2;
const UINT D3D11_DS_INPUT_PATCH_CONSTANT_REGISTER_READ_PORTS = 1;
const UINT D3D11_DS_INPUT_PRIMITIVE_ID_REGISTER_COMPONENTS = 1;
const UINT D3D11_DS_INPUT_PRIMITIVE_ID_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_DS_INPUT_PRIMITIVE_ID_REGISTER_COUNT = 1;
const UINT D3D11_DS_INPUT_PRIMITIVE_ID_REGISTER_READS_PER_INST = 2;
const UINT D3D11_DS_INPUT_PRIMITIVE_ID_REGISTER_READ_PORTS = 1;
const UINT D3D11_DS_OUTPUT_REGISTER_COMPONENTS = 4;
const UINT D3D11_DS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_DS_OUTPUT_REGISTER_COUNT = 32;
cpp_quote( "#define D3D11_FLOAT16_FUSED_TOLERANCE_IN_ULP	( 0.6 )" )
cpp_quote( "#define D3D11_FLOAT32_MAX	( 3.402823466e+38f )" )
cpp_quote( "#define D3D11_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP	( 0.6f )" )
cpp_quote( "#define D3D11_FLOAT_TO_SRGB_EXPONENT_DENOMINATOR	( 2.4f )" )
cpp_quote( "#define D3D11_FLOAT_TO_SRGB_EXPONENT_NUMERATOR	( 1.0f )" )
cpp_quote( "#define D3D11_FLOAT_TO_SRGB_OFFSET	( 0.055f )" )
cpp_quote( "#define D3D11_FLOAT_TO_SRGB_SCALE_1	( 12.92f )" )
cpp_quote( "#define D3D11_FLOAT_TO_SRGB_SCALE_2	( 1.055f )" )
cpp_quote( "#define D3D11_FLOAT_TO_SRGB_THRESHOLD	( 0.0031308f )" )
cpp_quote( "#define D3D11_FTOI_INSTRUCTION_MAX_INPUT	( 2147483647.999f )" )
cpp_quote( "#define D3D11_FTOI_INSTRUCTION_MIN_INPUT	( -2147483648.999f )" )
cpp_quote( "#define D3D11_FTOU_INSTRUCTION_MAX_INPUT	( 4294967295.999f )" )
cpp_quote( "#define D3D11_FTOU_INSTRUCTION_MIN_INPUT	( 0.0f )" )
const UINT D3D11_GS_INPUT_INSTANCE_ID_READS_PER_INST = 2;
const UINT D3D11_GS_INPUT_INSTANCE_ID_READ_PORTS = 1;
const UINT D3D11_GS_INPUT_INSTANCE_ID_REGISTER_COMPONENTS = 1;
const UINT D3D11_GS_INPUT_INSTANCE_ID_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_GS_INPUT_INSTANCE_ID_REGISTER_COUNT = 1;
const UINT D3D11_GS_INPUT_PRIM_CONST_REGISTER_COMPONENTS = 1;
const UINT D3D11_GS_INPUT_PRIM_CONST_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_GS_INPUT_PRIM_CONST_REGISTER_COUNT = 1;
const UINT D3D11_GS_INPUT_PRIM_CONST_REGISTER_READS_PER_INST = 2;
const UINT D3D11_GS_INPUT_PRIM_CONST_REGISTER_READ_PORTS = 1;
const UINT D3D11_GS_INPUT_REGISTER_COMPONENTS = 4;
const UINT D3D11_GS_INPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_GS_INPUT_REGISTER_COUNT = 32;
const UINT D3D11_GS_INPUT_REGISTER_READS_PER_INST = 2;
const UINT D3D11_GS_INPUT_REGISTER_READ_PORTS = 1;
const UINT D3D11_GS_INPUT_REGISTER_VERTICES = 32;
const UINT D3D11_GS_MAX_INSTANCE_COUNT = 32;
const UINT D3D11_GS_MAX_OUTPUT_VERTEX_COUNT_ACROSS_INSTANCES = 1024;
const UINT D3D11_GS_OUTPUT_ELEMENTS = 32;
const UINT D3D11_GS_OUTPUT_REGISTER_COMPONENTS = 4;
const UINT D3D11_GS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_GS_OUTPUT_REGISTER_COUNT = 32;
const UINT D3D11_HS_CONTROL_POINT_PHASE_INPUT_REGISTER_COUNT = 32;
const UINT D3D11_HS_CONTROL_POINT_PHASE_OUTPUT_REGISTER_COUNT = 32;
const UINT D3D11_HS_CONTROL_POINT_REGISTER_COMPONENTS = 4;
const UINT D3D11_HS_CONTROL_POINT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_HS_CONTROL_POINT_REGISTER_READS_PER_INST = 2;
const UINT D3D11_HS_CONTROL_POINT_REGISTER_READ_PORTS = 1;
const UINT D3D11_HS_FORK_PHASE_INSTANCE_COUNT_UPPER_BOUND = 0xFFFFFFFF;
const UINT D3D11_HS_INPUT_FORK_INSTANCE_ID_REGISTER_COMPONENTS = 1;
const UINT D3D11_HS_INPUT_FORK_INSTANCE_ID_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_HS_INPUT_FORK_INSTANCE_ID_REGISTER_COUNT = 1;
const UINT D3D11_HS_INPUT_FORK_INSTANCE_ID_REGISTER_READS_PER_INST = 2;
const UINT D3D11_HS_INPUT_FORK_INSTANCE_ID_REGISTER_READ_PORTS = 1;
const UINT D3D11_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_COMPONENTS = 1;
const UINT D3D11_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_COUNT = 1;
const UINT D3D11_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_READS_PER_INST = 2;
const UINT D3D11_HS_INPUT_JOIN_INSTANCE_ID_REGISTER_READ_PORTS = 1;
const UINT D3D11_HS_INPUT_PRIMITIVE_ID_REGISTER_COMPONENTS = 1;
const UINT D3D11_HS_INPUT_PRIMITIVE_ID_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_HS_INPUT_PRIMITIVE_ID_REGISTER_COUNT = 1;
const UINT D3D11_HS_INPUT_PRIMITIVE_ID_REGISTER_READS_PER_INST = 2;
const UINT D3D11_HS_INPUT_PRIMITIVE_ID_REGISTER_READ_PORTS = 1;
const UINT D3D11_HS_JOIN_PHASE_INSTANCE_COUNT_UPPER_BOUND = 0xFFFFFFFF;
cpp_quote( "#define D3D11_HS_MAXTESSFACTOR_LOWER_BOUND	( 1.0f )" )
cpp_quote( "#define D3D11_HS_MAXTESSFACTOR_UPPER_BOUND	( 64.0f )" )
const UINT D3D11_HS_OUTPUT_CONTROL_POINTS_MAX_TOTAL_SCALARS = 3968;
const UINT D3D11_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_COMPONENTS = 1;
const UINT D3D11_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_COUNT = 1;
const UINT D3D11_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_READS_PER_INST = 2;
const UINT D3D11_HS_OUTPUT_CONTROL_POINT_ID_REGISTER_READ_PORTS = 1;
const UINT D3D11_HS_OUTPUT_PATCH_CONSTANT_REGISTER_COMPONENTS = 4;
const UINT D3D11_HS_OUTPUT_PATCH_CONSTANT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_HS_OUTPUT_PATCH_CONSTANT_REGISTER_COUNT = 32;
const UINT D3D11_HS_OUTPUT_PATCH_CONSTANT_REGISTER_READS_PER_INST = 2;
const UINT D3D11_HS_OUTPUT_PATCH_CONSTANT_REGISTER_READ_PORTS = 1;
const UINT D3D11_HS_OUTPUT_PATCH_CONSTANT_REGISTER_SCALAR_COMPONENTS = 128;
const UINT D3D11_IA_DEFAULT_INDEX_BUFFER_OFFSET_IN_BYTES = 0;
const UINT D3D11_IA_DEFAULT_PRIMITIVE_TOPOLOGY = 0;
const UINT D3D11_IA_DEFAULT_VERTEX_BUFFER_OFFSET_IN_BYTES = 0;
const UINT D3D11_IA_INDEX_INPUT_RESOURCE_SLOT_COUNT = 1;
const UINT D3D11_IA_INSTANCE_ID_BIT_COUNT = 32;
const UINT D3D11_IA_INTEGER_ARITHMETIC_BIT_COUNT = 32;
const UINT D3D11_IA_PATCH_MAX_CONTROL_POINT_COUNT = 32;
const UINT D3D11_IA_PRIMITIVE_ID_BIT_COUNT = 32;
const UINT D3D11_IA_VERTEX_ID_BIT_COUNT = 32;
const UINT D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT = 32;
const UINT D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENTS_COMPONENTS = 128;
const UINT D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT = 32;
const UINT D3D11_INTEGER_DIVIDE_BY_ZERO_QUOTIENT = 0xffffffff;
const UINT D3D11_INTEGER_DIVIDE_BY_ZERO_REMAINDER = 0xffffffff;
const UINT D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL = 0xffffffff;
const UINT D3D11_KEEP_UNORDERED_ACCESS_VIEWS = 0xffffffff;
cpp_quote( "#define D3D11_LINEAR_GAMMA	( 1.0f )" )
const UINT D3D11_MAJOR_VERSION = 11;
cpp_quote( "#define D3D11_MAX_BORDER_COLOR_COMPONENT	( 1.0f )" )
cpp_quote( "#define D3D11_MAX_DEPTH	( 1.0f )" )
const UINT D3D11_MAX_MAXANISOTROPY = 16;
const UINT D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT = 32;
cpp_quote( "#define D3D11_MAX_POSITION_VALUE	( 3.402823466e+34f )" )
const UINT D3D11_MAX_TEXTURE_DIMENSION_2_TO_EXP = 17;
const UINT D3D11_MINOR_VERSION = 0;
cpp_quote( "#define D3D11_MIN_BORDER_COLOR_COMPONENT	( 0.0f )" )
cpp_quote( "#define D3D11_MIN_DEPTH	( 0.0f )" )
const UINT D3D11_MIN_MAXANISOTROPY = 0;
cpp_quote( "#define D3D11_MIP_LOD_BIAS_MAX	( 15.99f )" )
cpp_quote( "#define D3D11_MIP_LOD_BIAS_MIN	( -16.0f )" )
const UINT D3D11_MIP_LOD_FRACTIONAL_BIT_COUNT = 8;
const UINT D3D11_MIP_LOD_RANGE_BIT_COUNT = 8;
cpp_quote( "#define D3D11_MULTISAMPLE_ANTIALIAS_LINE_WIDTH	( 1.4f )" )
const UINT D3D11_NONSAMPLE_FETCH_OUT_OF_RANGE_ACCESS_RESULT = 0;
const UINT D3D11_PIXEL_ADDRESS_RANGE_BIT_COUNT = 15;
const UINT D3D11_PRE_SCISSOR_PIXEL_ADDRESS_RANGE_BIT_COUNT = 16;
const UINT D3D11_PS_CS_UAV_REGISTER_COMPONENTS = 1;
const UINT D3D11_PS_CS_UAV_REGISTER_COUNT = 8;
const UINT D3D11_PS_CS_UAV_REGISTER_READS_PER_INST = 1;
const UINT D3D11_PS_CS_UAV_REGISTER_READ_PORTS = 1;
const UINT D3D11_PS_FRONTFACING_DEFAULT_VALUE = 0xFFFFFFFF;
const UINT D3D11_PS_FRONTFACING_FALSE_VALUE = 0x00000000;
const UINT D3D11_PS_FRONTFACING_TRUE_VALUE = 0xFFFFFFFF;
const UINT D3D11_PS_INPUT_REGISTER_COMPONENTS = 4;
const UINT D3D11_PS_INPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_PS_INPUT_REGISTER_COUNT = 32;
const UINT D3D11_PS_INPUT_REGISTER_READS_PER_INST = 2;
const UINT D3D11_PS_INPUT_REGISTER_READ_PORTS = 1;
cpp_quote( "#define D3D11_PS_LEGACY_PIXEL_CENTER_FRACTIONAL_COMPONENT	( 0.0f )" )
const UINT D3D11_PS_OUTPUT_DEPTH_REGISTER_COMPONENTS = 1;
const UINT D3D11_PS_OUTPUT_DEPTH_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_PS_OUTPUT_DEPTH_REGISTER_COUNT = 1;
const UINT D3D11_PS_OUTPUT_MASK_REGISTER_COMPONENTS = 1;
const UINT D3D11_PS_OUTPUT_MASK_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_PS_OUTPUT_MASK_REGISTER_COUNT = 1;
const UINT D3D11_PS_OUTPUT_REGISTER_COMPONENTS = 4;
const UINT D3D11_PS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_PS_OUTPUT_REGISTER_COUNT = 8;
cpp_quote( "#define D3D11_PS_PIXEL_CENTER_FRACTIONAL_COMPONENT	( 0.5f )" )
const UINT D3D11_RAW_UAV_SRV_BYTE_ALIGNMENT = 16;
const UINT D3D11_REQ_BLEND_OBJECT_COUNT_PER_DEVICE = 4096;
const UINT D3D11_REQ_BUFFER_RESOURCE_TEXEL_COUNT_2_TO_EXP = 27;
const UINT D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT = 4096;
const UINT D3D11_REQ_DEPTH_STENCIL_OBJECT_COUNT_PER_DEVICE = 4096;
const UINT D3D11_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP = 32;
const UINT D3D11_REQ_DRAW_VERTEX_COUNT_2_TO_EXP = 32;
const UINT D3D11_REQ_FILTERING_HW_ADDRESSABLE_RESOURCE_DIMENSION = 16384;
const UINT D3D11_REQ_GS_INVOCATION_32BIT_OUTPUT_COMPONENT_LIMIT = 1024;
const UINT D3D11_REQ_IMMEDIATE_CONSTANT_BUFFER_ELEMENT_COUNT = 4096;
const UINT D3D11_REQ_MAXANISOTROPY = 16;
const UINT D3D11_REQ_MIP_LEVELS = 15;
const UINT D3D11_REQ_MULTI_ELEMENT_STRUCTURE_SIZE_IN_BYTES = 2048;
const UINT D3D11_REQ_RASTERIZER_OBJECT_COUNT_PER_DEVICE = 4096;
const UINT D3D11_REQ_RENDER_TO_BUFFER_WINDOW_WIDTH = 16384;
const UINT D3D11_REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_A_TERM = 128;
cpp_quote( "#define D3D11_REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_B_TERM	( 0.25f )" )
const UINT D3D11_REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_C_TERM = 2048;
const UINT D3D11_REQ_RESOURCE_VIEW_COUNT_PER_DEVICE_2_TO_EXP = 20;
const UINT D3D11_REQ_SAMPLER_OBJECT_COUNT_PER_DEVICE = 4096;
const UINT D3D11_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION = 2048;
const UINT D3D11_REQ_TEXTURE1D_U_DIMENSION = 16384;
const UINT D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION = 2048;
const UINT D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION = 16384;
const UINT D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION = 2048;
const UINT D3D11_REQ_TEXTURECUBE_DIMENSION = 16384;
const UINT D3D11_RESINFO_INSTRUCTION_MISSING_COMPONENT_RETVAL = 0;
const UINT D3D11_SHADER_MAJOR_VERSION = 5;
const UINT D3D11_SHADER_MAX_INSTANCES = 65535;
const UINT D3D11_SHADER_MAX_INTERFACES = 253;
const UINT D3D11_SHADER_MAX_INTERFACE_CALL_SITES = 4096;
const UINT D3D11_SHADER_MAX_TYPES = 65535;
const UINT D3D11_SHADER_MINOR_VERSION = 0;
const UINT D3D11_SHIFT_INSTRUCTION_PAD_VALUE = 0;
const UINT D3D11_SHIFT_INSTRUCTION_SHIFT_VALUE_BIT_COUNT = 5;
const UINT D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT = 8;
const UINT D3D11_SO_BUFFER_MAX_STRIDE_IN_BYTES = 2048;
const UINT D3D11_SO_BUFFER_MAX_WRITE_WINDOW_IN_BYTES = 512;
const UINT D3D11_SO_BUFFER_SLOT_COUNT = 4;
const UINT D3D11_SO_DDI_REGISTER_INDEX_DENOTING_GAP = 0xffffffff;
const UINT D3D11_SO_NO_RASTERIZED_STREAM = 0xffffffff;
const UINT D3D11_SO_OUTPUT_COMPONENT_COUNT = 128;
const UINT D3D11_SO_STREAM_COUNT = 4;
const UINT D3D11_SPEC_DATE_DAY = 16;
const UINT D3D11_SPEC_DATE_MONTH = 05;
const UINT D3D11_SPEC_DATE_YEAR = 2011;
cpp_quote( "#define D3D11_SPEC_VERSION	( 1.07 )" )
cpp_quote( "#define D3D11_SRGB_GAMMA	( 2.2f )" )
cpp_quote( "#define D3D11_SRGB_TO_FLOAT_DENOMINATOR_1	( 12.92f )" )
cpp_quote( "#define D3D11_SRGB_TO_FLOAT_DENOMINATOR_2	( 1.055f )" )
cpp_quote( "#define D3D11_SRGB_TO_FLOAT_EXPONENT	( 2.4f )" )
cpp_quote( "#define D3D11_SRGB_TO_FLOAT_OFFSET	( 0.055f )" )
cpp_quote( "#define D3D11_SRGB_TO_FLOAT_THRESHOLD	( 0.04045f )" )
cpp_quote( "#define D3D11_SRGB_TO_FLOAT_TOLERANCE_IN_ULP	( 0.5f )" )
const UINT D3D11_STANDARD_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_STANDARD_COMPONENT_BIT_COUNT_DOUBLED = 64;
const UINT D3D11_STANDARD_MAXIMUM_ELEMENT_ALIGNMENT_BYTE_MULTIPLE = 4;
const UINT D3D11_STANDARD_PIXEL_COMPONENT_COUNT = 128;
const UINT D3D11_STANDARD_PIXEL_ELEMENT_COUNT = 32;
const UINT D3D11_STANDARD_VECTOR_SIZE = 4;
const UINT D3D11_STANDARD_VERTEX_ELEMENT_COUNT = 32;
const UINT D3D11_STANDARD_VERTEX_TOTAL_COMPONENT_COUNT = 64;
const UINT D3D11_SUBPIXEL_FRACTIONAL_BIT_COUNT = 8;
const UINT D3D11_SUBTEXEL_FRACTIONAL_BIT_COUNT = 8;
const UINT D3D11_TESSELLATOR_MAX_EVEN_TESSELLATION_FACTOR = 64;
const UINT D3D11_TESSELLATOR_MAX_ISOLINE_DENSITY_TESSELLATION_FACTOR = 64;
const UINT D3D11_TESSELLATOR_MAX_ODD_TESSELLATION_FACTOR = 63;
const UINT D3D11_TESSELLATOR_MAX_TESSELLATION_FACTOR = 64;
const UINT D3D11_TESSELLATOR_MIN_EVEN_TESSELLATION_FACTOR = 2;
const UINT D3D11_TESSELLATOR_MIN_ISOLINE_DENSITY_TESSELLATION_FACTOR = 1;
const UINT D3D11_TESSELLATOR_MIN_ODD_TESSELLATION_FACTOR = 1;
const UINT D3D11_TEXEL_ADDRESS_RANGE_BIT_COUNT = 16;
const UINT D3D11_UNBOUND_MEMORY_ACCESS_RESULT = 0;
const UINT D3D11_VIEWPORT_AND_SCISSORRECT_MAX_INDEX = 15;
const UINT D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE = 16;
const UINT D3D11_VIEWPORT_BOUNDS_MAX = 32767;
const INT D3D11_VIEWPORT_BOUNDS_MIN = -32768;
const UINT D3D11_VS_INPUT_REGISTER_COMPONENTS = 4;
const UINT D3D11_VS_INPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_VS_INPUT_REGISTER_COUNT = 32;
const UINT D3D11_VS_INPUT_REGISTER_READS_PER_INST = 2;
const UINT D3D11_VS_INPUT_REGISTER_READ_PORTS = 1;
const UINT D3D11_VS_OUTPUT_REGISTER_COMPONENTS = 4;
const UINT D3D11_VS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
const UINT D3D11_VS_OUTPUT_REGISTER_COUNT = 32;
const UINT D3D11_WHQL_CONTEXT_COUNT_FOR_RESOURCE_LIMIT = 10;
const UINT D3D11_WHQL_DRAWINDEXED_INDEX_COUNT_2_TO_EXP = 25;
const UINT D3D11_WHQL_DRAW_VERTEX_COUNT_2_TO_EXP = 25;
cpp_quote( "#endif" )
cpp_quote( "#ifndef _D3D11_1_CONSTANTS" )
cpp_quote( "#define _D3D11_1_CONSTANTS" )
const UINT D3D11_1_UAV_SLOT_COUNT = 64;
cpp_quote( "#endif" )
cpp_quote( "#ifndef _D3D11_2_CONSTANTS" )
cpp_quote( "#define _D3D11_2_CONSTANTS" )
const UINT D3D11_2_TILED_RESOURCE_TILE_SIZE_IN_BYTES = 65536;

const UINT D3D11_4_VIDEO_DECODER_MAX_HISTOGRAM_COMPONENTS = 4;
const UINT D3D11_4_VIDEO_DECODER_HISTOGRAM_OFFSET_ALIGNMENT = 256;
cpp_quote( "#endif" )


const UINT _FACD3D11 = 0x87c;
const UINT _FACD3D11DEBUG = _FACD3D11 + 1;

cpp_quote( "/* Direct3D errors are now found in winerror.h */" )
cpp_quote( "#define MAKE_D3D11_HRESULT( code )  MAKE_HRESULT( 1, _FACD3D11, code )" )
cpp_quote( "#define MAKE_D3D11_STATUS( code )    MAKE_HRESULT( 0, _FACD3D11, code )" )

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_DEFAULT {};" )
cpp_quote( "extern const DECLSPEC_SELECTANY CD3D11_DEFAULT D3D11_DEFAULT;" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

typedef enum D3D11_INPUT_CLASSIFICATION
{
    D3D11_INPUT_PER_VERTEX_DATA = 0,
    D3D11_INPUT_PER_INSTANCE_DATA = 1
} D3D11_INPUT_CLASSIFICATION;

const UINT D3D11_APPEND_ALIGNED_ELEMENT = 0xffffffff;

typedef struct D3D11_INPUT_ELEMENT_DESC
{
    LPCSTR SemanticName;
    UINT SemanticIndex;
    DXGI_FORMAT Format;
    UINT InputSlot;
    UINT AlignedByteOffset;
    D3D11_INPUT_CLASSIFICATION InputSlotClass;
    UINT InstanceDataStepRate;
} D3D11_INPUT_ELEMENT_DESC;

// Keep FILL_MODE values in sync with earlier DX versions (HW consumes values directly).
typedef enum D3D11_FILL_MODE
{
    // 1 was POINT in D3D, unused in D3D11
    D3D11_FILL_WIREFRAME = 2,
    D3D11_FILL_SOLID = 3
} D3D11_FILL_MODE;

typedef D3D_PRIMITIVE_TOPOLOGY D3D11_PRIMITIVE_TOPOLOGY;

typedef D3D_PRIMITIVE D3D11_PRIMITIVE;

// Keep CULL_MODE values in sync with earlier DX versions (HW consumes values directly).
typedef enum D3D11_CULL_MODE
{
    D3D11_CULL_NONE = 1,
    D3D11_CULL_FRONT = 2,
    D3D11_CULL_BACK = 3
} D3D11_CULL_MODE;

typedef struct D3D11_SO_DECLARATION_ENTRY
{
    UINT Stream;
    LPCSTR SemanticName;
    UINT SemanticIndex;
    BYTE StartComponent;
    BYTE ComponentCount;
    BYTE OutputSlot;
} D3D11_SO_DECLARATION_ENTRY;

typedef struct D3D11_VIEWPORT
{
    FLOAT TopLeftX;
    FLOAT TopLeftY;
    FLOAT Width;
    FLOAT Height;
    FLOAT MinDepth;
    FLOAT MaxDepth;
} D3D11_VIEWPORT;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "inline bool operator==( const D3D11_VIEWPORT& l, const D3D11_VIEWPORT& r )" )
cpp_quote( "{" )
cpp_quote( "    return l.TopLeftX == r.TopLeftX && l.TopLeftY == r.TopLeftY && l.Width == r.Width &&" )
cpp_quote( "        l.Height == r.Height && l.MinDepth == r.MinDepth && l.MaxDepth == r.MaxDepth;" )
cpp_quote( "}" )
cpp_quote( "inline bool operator!=( const D3D11_VIEWPORT& l, const D3D11_VIEWPORT& r )" )
cpp_quote( "{ return !( l == r ); }" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

typedef struct D3D11_DRAW_INSTANCED_INDIRECT_ARGS 
{ 
    UINT VertexCountPerInstance; 
    UINT InstanceCount; 
    UINT StartVertexLocation; 
    UINT StartInstanceLocation; 
} D3D11_DRAW_INSTANCED_INDIRECT_ARGS; 

typedef struct D3D11_DRAW_INDEXED_INSTANCED_INDIRECT_ARGS 
{ 
    UINT IndexCountPerInstance; 
    UINT InstanceCount; 
    UINT StartIndexLocation; 
    INT BaseVertexLocation; 
    UINT StartInstanceLocation; 
} D3D11_DRAW_INDEXED_INSTANCED_INDIRECT_ARGS; 

typedef enum D3D11_RESOURCE_DIMENSION
{
    D3D11_RESOURCE_DIMENSION_UNKNOWN = 0,
    D3D11_RESOURCE_DIMENSION_BUFFER = 1,
    D3D11_RESOURCE_DIMENSION_TEXTURE1D = 2,
    D3D11_RESOURCE_DIMENSION_TEXTURE2D = 3,
    D3D11_RESOURCE_DIMENSION_TEXTURE3D = 4,
} D3D11_RESOURCE_DIMENSION;

typedef D3D_SRV_DIMENSION D3D11_SRV_DIMENSION;

typedef enum D3D11_DSV_DIMENSION
{
    D3D11_DSV_DIMENSION_UNKNOWN = 0,
    D3D11_DSV_DIMENSION_TEXTURE1D = 1,
    D3D11_DSV_DIMENSION_TEXTURE1DARRAY = 2,
    D3D11_DSV_DIMENSION_TEXTURE2D = 3,
    D3D11_DSV_DIMENSION_TEXTURE2DARRAY = 4,
    D3D11_DSV_DIMENSION_TEXTURE2DMS = 5,
    D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY = 6,
} D3D11_DSV_DIMENSION;

typedef enum D3D11_RTV_DIMENSION
{
    D3D11_RTV_DIMENSION_UNKNOWN = 0,
    D3D11_RTV_DIMENSION_BUFFER = 1,
    D3D11_RTV_DIMENSION_TEXTURE1D = 2,
    D3D11_RTV_DIMENSION_TEXTURE1DARRAY = 3,
    D3D11_RTV_DIMENSION_TEXTURE2D = 4,
    D3D11_RTV_DIMENSION_TEXTURE2DARRAY = 5,
    D3D11_RTV_DIMENSION_TEXTURE2DMS = 6,
    D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY = 7,
    D3D11_RTV_DIMENSION_TEXTURE3D = 8,
} D3D11_RTV_DIMENSION;

typedef enum D3D11_UAV_DIMENSION
{
    D3D11_UAV_DIMENSION_UNKNOWN = 0,
    D3D11_UAV_DIMENSION_BUFFER = 1,
    D3D11_UAV_DIMENSION_TEXTURE1D = 2,
    D3D11_UAV_DIMENSION_TEXTURE1DARRAY = 3,
    D3D11_UAV_DIMENSION_TEXTURE2D = 4,
    D3D11_UAV_DIMENSION_TEXTURE2DARRAY = 5,
    D3D11_UAV_DIMENSION_TEXTURE3D = 8,
} D3D11_UAV_DIMENSION;
 
typedef enum D3D11_USAGE
{
    D3D11_USAGE_DEFAULT = 0,
    D3D11_USAGE_IMMUTABLE = 1,
    D3D11_USAGE_DYNAMIC = 2,
    D3D11_USAGE_STAGING = 3,
} D3D11_USAGE;

typedef enum D3D11_BIND_FLAG
{
    D3D11_BIND_VERTEX_BUFFER = 0x00000001L,
    D3D11_BIND_INDEX_BUFFER = 0x00000002L,
    D3D11_BIND_CONSTANT_BUFFER = 0x00000004L,
    D3D11_BIND_SHADER_RESOURCE = 0x00000008L,
    D3D11_BIND_STREAM_OUTPUT = 0x00000010L,
    D3D11_BIND_RENDER_TARGET = 0x00000020L,
    D3D11_BIND_DEPTH_STENCIL = 0x00000040L,
    D3D11_BIND_UNORDERED_ACCESS = 0x00000080L,
    D3D11_BIND_DECODER = 0x00000200L,
    D3D11_BIND_VIDEO_ENCODER = 0x00000400L,
} D3D11_BIND_FLAG;

typedef enum D3D11_CPU_ACCESS_FLAG
{
    D3D11_CPU_ACCESS_WRITE = 0x00010000L,
    D3D11_CPU_ACCESS_READ = 0x00020000L,
} D3D11_CPU_ACCESS_FLAG;

typedef enum D3D11_RESOURCE_MISC_FLAG
{
    D3D11_RESOURCE_MISC_GENERATE_MIPS                   = 0x00000001L,
    D3D11_RESOURCE_MISC_SHARED                          = 0x00000002L,
    D3D11_RESOURCE_MISC_TEXTURECUBE                     = 0x00000004L,
    D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS               = 0x00000010L,
    D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS          = 0x00000020L,
    D3D11_RESOURCE_MISC_BUFFER_STRUCTURED               = 0x00000040L,
    D3D11_RESOURCE_MISC_RESOURCE_CLAMP                  = 0x00000080L,
    D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX               = 0x00000100L,
    D3D11_RESOURCE_MISC_GDI_COMPATIBLE                  = 0x00000200L,
    D3D11_RESOURCE_MISC_SHARED_NTHANDLE                 = 0x00000800L,
    D3D11_RESOURCE_MISC_RESTRICTED_CONTENT              = 0x00001000L,
    D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE        = 0x00002000L,
    D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE_DRIVER = 0x00004000L,
    D3D11_RESOURCE_MISC_GUARDED                         = 0x00008000L,
    D3D11_RESOURCE_MISC_TILE_POOL                       = 0x00020000L,
    D3D11_RESOURCE_MISC_TILED                           = 0x00040000L,
    D3D11_RESOURCE_MISC_HW_PROTECTED                    = 0x00080000L,
    D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE              = 0x00100000L,
    D3D11_RESOURCE_MISC_SHARED_EXCLUSIVE_WRITER         = 0x00200000L,
    D3D11_RESOURCE_MISC_NO_SHADER_ACCESS                = 0x00400000L,
} D3D11_RESOURCE_MISC_FLAG;

typedef enum D3D11_MAP // for calling ID3D11Resource::Map()
{
    D3D11_MAP_READ = 1,
    D3D11_MAP_WRITE = 2,
    D3D11_MAP_READ_WRITE = 3,
    D3D11_MAP_WRITE_DISCARD = 4,
    D3D11_MAP_WRITE_NO_OVERWRITE = 5,
} D3D11_MAP;

typedef enum D3D11_MAP_FLAG
{
    D3D11_MAP_FLAG_DO_NOT_WAIT = 0x00100000L,
} D3D11_MAP_FLAG;

typedef enum D3D11_RAISE_FLAG
{
    D3D11_RAISE_FLAG_DRIVER_INTERNAL_ERROR = 0x1L,
} D3D11_RAISE_FLAG;

// Flags for ClearDepthStencil
typedef enum D3D11_CLEAR_FLAG
{
    D3D11_CLEAR_DEPTH = 0x01L,
    D3D11_CLEAR_STENCIL = 0x02L,
} D3D11_CLEAR_FLAG;

typedef RECT D3D11_RECT;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_RECT : public D3D11_RECT" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_RECT() = default;" )
cpp_quote( "    explicit CD3D11_RECT( const D3D11_RECT& o ) :" )
cpp_quote( "        D3D11_RECT( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_RECT(" )
cpp_quote( "        LONG Left," )
cpp_quote( "        LONG Top," )
cpp_quote( "        LONG Right," )
cpp_quote( "        LONG Bottom )" )
cpp_quote( "    {" )
cpp_quote( "        left = Left;" )
cpp_quote( "        top = Top;" )
cpp_quote( "        right = Right;" )
cpp_quote( "        bottom = Bottom;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_RECT() {}" )
cpp_quote( "};" )
cpp_quote( "inline bool operator==( const D3D11_RECT& l, const D3D11_RECT& r )" )
cpp_quote( "{" )
cpp_quote( "    return l.left == r.left && l.top == r.top &&" )
cpp_quote( "        l.right == r.right && l.bottom == r.bottom;" )
cpp_quote( "}" )
cpp_quote( "inline bool operator!=( const D3D11_RECT& l, const D3D11_RECT& r )" )
cpp_quote( "{ return !( l == r ); }" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

typedef struct D3D11_BOX
{
    UINT left;
    UINT top;
    UINT front;
    UINT right;
    UINT bottom;
    UINT back;
} D3D11_BOX;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_BOX : public D3D11_BOX" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_BOX() = default;" )
cpp_quote( "    explicit CD3D11_BOX( const D3D11_BOX& o ) :" )
cpp_quote( "        D3D11_BOX( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_BOX(" )
cpp_quote( "        LONG Left," )
cpp_quote( "        LONG Top," )
cpp_quote( "        LONG Front," )
cpp_quote( "        LONG Right," )
cpp_quote( "        LONG Bottom," )
cpp_quote( "        LONG Back )" )
cpp_quote( "    {" )
cpp_quote( "        left = Left;" )
cpp_quote( "        top = Top;" )
cpp_quote( "        front = Front;" )
cpp_quote( "        right = Right;" )
cpp_quote( "        bottom = Bottom;" )
cpp_quote( "        back = Back;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_BOX() {}" )
cpp_quote( "};" )
cpp_quote( "inline bool operator==( const D3D11_BOX& l, const D3D11_BOX& r )" )
cpp_quote( "{" )
cpp_quote( "    return l.left == r.left && l.top == r.top && l.front == r.front &&" )
cpp_quote( "        l.right == r.right && l.bottom == r.bottom && l.back == r.back;" )
cpp_quote( "}" )
cpp_quote( "inline bool operator!=( const D3D11_BOX& l, const D3D11_BOX& r )" )
cpp_quote( "{ return !( l == r ); }" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

// Forward declarations:
interface ID3D11Device;
interface ID3D11ClassLinkage;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// DeviceChild
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[ uuid( 1841e5c8-16b0-489b-bcc8-44cfb0d5deae ), object, local, pointer_default( unique ) ]
interface ID3D11DeviceChild
    : IUnknown
{
    void GetDevice( [annotation("_Outptr_")] ID3D11Device** ppDevice );
    HRESULT GetPrivateData(
        [annotation("_In_")] REFGUID guid,
        [annotation("_Inout_")] UINT* pDataSize,
        [annotation("_Out_writes_bytes_opt_( *pDataSize )")] void* pData );
    HRESULT SetPrivateData(
        [annotation("_In_")] REFGUID guid,
        [annotation("_In_")] UINT DataSize,
        [annotation("_In_reads_bytes_opt_( DataSize )")] const void* pData );
    HRESULT SetPrivateDataInterface(
        [annotation("_In_")] REFGUID guid,
        [annotation("_In_opt_")] const IUnknown * pData );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Depth-Stencil State
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Keep COMPARISON_FUNC values in sync with earlier DX versions (HW consumes values directly).
typedef enum D3D11_COMPARISON_FUNC
{
    D3D11_COMPARISON_NEVER = 1,
    D3D11_COMPARISON_LESS = 2,
    D3D11_COMPARISON_EQUAL = 3,
    D3D11_COMPARISON_LESS_EQUAL = 4,
    D3D11_COMPARISON_GREATER = 5,
    D3D11_COMPARISON_NOT_EQUAL = 6,
    D3D11_COMPARISON_GREATER_EQUAL = 7,
    D3D11_COMPARISON_ALWAYS = 8
} D3D11_COMPARISON_FUNC;

typedef enum D3D11_DEPTH_WRITE_MASK
{
    D3D11_DEPTH_WRITE_MASK_ZERO = 0,
    D3D11_DEPTH_WRITE_MASK_ALL = 1
} D3D11_DEPTH_WRITE_MASK;

// Keep STENCILOP values in sync with earlier DX versions (HW consumes values directly).
typedef enum D3D11_STENCIL_OP
{
    D3D11_STENCIL_OP_KEEP = 1,
    D3D11_STENCIL_OP_ZERO = 2,
    D3D11_STENCIL_OP_REPLACE = 3,
    D3D11_STENCIL_OP_INCR_SAT = 4,
    D3D11_STENCIL_OP_DECR_SAT = 5,
    D3D11_STENCIL_OP_INVERT = 6,
    D3D11_STENCIL_OP_INCR = 7,
    D3D11_STENCIL_OP_DECR = 8
} D3D11_STENCIL_OP;

typedef struct D3D11_DEPTH_STENCILOP_DESC
{
    D3D11_STENCIL_OP StencilFailOp;
    D3D11_STENCIL_OP StencilDepthFailOp;
    D3D11_STENCIL_OP StencilPassOp;
    D3D11_COMPARISON_FUNC StencilFunc;
} D3D11_DEPTH_STENCILOP_DESC;

typedef struct D3D11_DEPTH_STENCIL_DESC
{
    BOOL DepthEnable;
    D3D11_DEPTH_WRITE_MASK DepthWriteMask;
    D3D11_COMPARISON_FUNC DepthFunc;
    BOOL StencilEnable;
    UINT8 StencilReadMask;
    UINT8 StencilWriteMask;
    D3D11_DEPTH_STENCILOP_DESC FrontFace;
    D3D11_DEPTH_STENCILOP_DESC BackFace;
} D3D11_DEPTH_STENCIL_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_DEPTH_STENCIL_DESC : public D3D11_DEPTH_STENCIL_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_DEPTH_STENCIL_DESC() = default;" )
cpp_quote( "    explicit CD3D11_DEPTH_STENCIL_DESC( const D3D11_DEPTH_STENCIL_DESC& o ) :" )
cpp_quote( "        D3D11_DEPTH_STENCIL_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_DEPTH_STENCIL_DESC( CD3D11_DEFAULT )" )
cpp_quote( "    {" )
cpp_quote( "        DepthEnable = TRUE;" )
cpp_quote( "        DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;" )
cpp_quote( "        DepthFunc = D3D11_COMPARISON_LESS;" )
cpp_quote( "        StencilEnable = FALSE;" )
cpp_quote( "        StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;" )
cpp_quote( "        StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;" )
cpp_quote( "        const D3D11_DEPTH_STENCILOP_DESC defaultStencilOp =" )
cpp_quote( "        { D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_COMPARISON_ALWAYS };" )
cpp_quote( "        FrontFace = defaultStencilOp;" )
cpp_quote( "        BackFace = defaultStencilOp;" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_DEPTH_STENCIL_DESC(" )
cpp_quote( "        BOOL depthEnable," )
cpp_quote( "        D3D11_DEPTH_WRITE_MASK depthWriteMask," )
cpp_quote( "        D3D11_COMPARISON_FUNC depthFunc," )
cpp_quote( "        BOOL stencilEnable," )
cpp_quote( "        UINT8 stencilReadMask," )
cpp_quote( "        UINT8 stencilWriteMask," )
cpp_quote( "        D3D11_STENCIL_OP frontStencilFailOp," )
cpp_quote( "        D3D11_STENCIL_OP frontStencilDepthFailOp," )
cpp_quote( "        D3D11_STENCIL_OP frontStencilPassOp," )
cpp_quote( "        D3D11_COMPARISON_FUNC frontStencilFunc," )
cpp_quote( "        D3D11_STENCIL_OP backStencilFailOp," )
cpp_quote( "        D3D11_STENCIL_OP backStencilDepthFailOp," )
cpp_quote( "        D3D11_STENCIL_OP backStencilPassOp," )
cpp_quote( "        D3D11_COMPARISON_FUNC backStencilFunc )" )
cpp_quote( "    {" )
cpp_quote( "        DepthEnable = depthEnable;" )
cpp_quote( "        DepthWriteMask = depthWriteMask;" )
cpp_quote( "        DepthFunc = depthFunc;" )
cpp_quote( "        StencilEnable = stencilEnable;" )
cpp_quote( "        StencilReadMask = stencilReadMask;" )
cpp_quote( "        StencilWriteMask = stencilWriteMask;" )
cpp_quote( "        FrontFace.StencilFailOp = frontStencilFailOp;" )
cpp_quote( "        FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;" )
cpp_quote( "        FrontFace.StencilPassOp = frontStencilPassOp;" )
cpp_quote( "        FrontFace.StencilFunc = frontStencilFunc;" )
cpp_quote( "        BackFace.StencilFailOp = backStencilFailOp;" )
cpp_quote( "        BackFace.StencilDepthFailOp = backStencilDepthFailOp;" )
cpp_quote( "        BackFace.StencilPassOp = backStencilPassOp;" )
cpp_quote( "        BackFace.StencilFunc = backStencilFunc;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_DEPTH_STENCIL_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( 03823efb-8d8f-4e1c-9aa2-f64bb2cbfdf1 ), object, local, pointer_default( unique ) ]
interface ID3D11DepthStencilState
    : ID3D11DeviceChild
{
    void GetDesc( [annotation("_Out_")] D3D11_DEPTH_STENCIL_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Blend State
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Keep BLEND values in sync with earlier DX versions (HW consumes values directly).
typedef enum D3D11_BLEND
{
    D3D11_BLEND_ZERO = 1,
    D3D11_BLEND_ONE = 2,
    D3D11_BLEND_SRC_COLOR = 3, // PS output oN.rgb (N is current RT being blended)
    D3D11_BLEND_INV_SRC_COLOR = 4, // 1.0f - PS output oN.rgb
    D3D11_BLEND_SRC_ALPHA = 5, // PS output oN.a
    D3D11_BLEND_INV_SRC_ALPHA = 6, // 1.0f - PS output oN.a
    D3D11_BLEND_DEST_ALPHA = 7, // RT(N).a (N is current RT being blended)
    D3D11_BLEND_INV_DEST_ALPHA = 8, // 1.0f - RT(N).a
    D3D11_BLEND_DEST_COLOR = 9, // RT(N).rgb
    D3D11_BLEND_INV_DEST_COLOR = 10,// 1.0f - RT(N).rgb
    D3D11_BLEND_SRC_ALPHA_SAT = 11,// (f,f,f,1), f = min(1 - RT(N).a, oN.a)
    // 12 reserved (was BOTHSRCALPHA)
    // 13 reserved (was BOTHSRCALPHA)
    D3D11_BLEND_BLEND_FACTOR = 14,
    D3D11_BLEND_INV_BLEND_FACTOR = 15,
    D3D11_BLEND_SRC1_COLOR = 16, // PS output o1.rgb
    D3D11_BLEND_INV_SRC1_COLOR = 17, // 1.0f - PS output o1.rgb
    D3D11_BLEND_SRC1_ALPHA = 18, // PS output o1.a
    D3D11_BLEND_INV_SRC1_ALPHA = 19, // 1.0f - PS output o1.a
} D3D11_BLEND;

// Keep BLENDOP values in sync with earlier DX versions (HW consumes values directly).
typedef enum D3D11_BLEND_OP
{
    D3D11_BLEND_OP_ADD = 1,
    D3D11_BLEND_OP_SUBTRACT = 2,
    D3D11_BLEND_OP_REV_SUBTRACT = 3,
    D3D11_BLEND_OP_MIN = 4, // min semantics are like min shader instruction
    D3D11_BLEND_OP_MAX = 5, // max semantics are like max shader instruction
} D3D11_BLEND_OP;

typedef enum D3D11_COLOR_WRITE_ENABLE
{
    D3D11_COLOR_WRITE_ENABLE_RED = 1,
    D3D11_COLOR_WRITE_ENABLE_GREEN = 2,
    D3D11_COLOR_WRITE_ENABLE_BLUE = 4,
    D3D11_COLOR_WRITE_ENABLE_ALPHA = 8,
    D3D11_COLOR_WRITE_ENABLE_ALL = (D3D11_COLOR_WRITE_ENABLE_RED|D3D11_COLOR_WRITE_ENABLE_GREEN|
        D3D11_COLOR_WRITE_ENABLE_BLUE|D3D11_COLOR_WRITE_ENABLE_ALPHA),
} D3D11_COLOR_WRITE_ENABLE;

typedef struct D3D11_RENDER_TARGET_BLEND_DESC
{
    BOOL BlendEnable;
    D3D11_BLEND SrcBlend;
    D3D11_BLEND DestBlend;
    D3D11_BLEND_OP BlendOp;
    D3D11_BLEND SrcBlendAlpha;
    D3D11_BLEND DestBlendAlpha;
    D3D11_BLEND_OP BlendOpAlpha;
    UINT8 RenderTargetWriteMask; // D3D11_COLOR_WRITE_ENABLE
} D3D11_RENDER_TARGET_BLEND_DESC;

typedef struct D3D11_BLEND_DESC
{
    BOOL AlphaToCoverageEnable; // relevant to multisample antialiasing only
    BOOL IndependentBlendEnable; // if FALSE, then replicate the first entry in RenderTarget array to other entries
    D3D11_RENDER_TARGET_BLEND_DESC RenderTarget[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];
} D3D11_BLEND_DESC;
cpp_quote( "/* Note, the array size for RenderTarget[] above is D3D11_SIMULTANEOUS_RENDERTARGET_COUNT. ")
cpp_quote( "   IDL processing/generation of this header replaces the define; this comment is merely explaining what happened. */" ) 

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_BLEND_DESC : public D3D11_BLEND_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_BLEND_DESC() = default;" )
cpp_quote( "    explicit CD3D11_BLEND_DESC( const D3D11_BLEND_DESC& o ) :" )
cpp_quote( "        D3D11_BLEND_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_BLEND_DESC( CD3D11_DEFAULT )" )
cpp_quote( "    {" )
cpp_quote( "        AlphaToCoverageEnable = FALSE;" )
cpp_quote( "        IndependentBlendEnable = FALSE;" )
cpp_quote( "        const D3D11_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc =" )
cpp_quote( "        {" )
cpp_quote( "            FALSE," )
cpp_quote( "            D3D11_BLEND_ONE, D3D11_BLEND_ZERO, D3D11_BLEND_OP_ADD," )
cpp_quote( "            D3D11_BLEND_ONE, D3D11_BLEND_ZERO, D3D11_BLEND_OP_ADD," )
cpp_quote( "            D3D11_COLOR_WRITE_ENABLE_ALL," )
cpp_quote( "        };" )
cpp_quote( "        for (UINT i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)" )
cpp_quote( "            RenderTarget[ i ] = defaultRenderTargetBlendDesc;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_BLEND_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( 75b68faa-347d-4159-8f45-a0640f01cd9a ), object, local, pointer_default( unique ) ]
interface ID3D11BlendState
    : ID3D11DeviceChild
{
    void GetDesc( [annotation("_Out_")] D3D11_BLEND_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Rasterizer State
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

typedef struct D3D11_RASTERIZER_DESC
{
    D3D11_FILL_MODE FillMode;
    D3D11_CULL_MODE CullMode;
    BOOL FrontCounterClockwise;
    INT DepthBias;
    FLOAT DepthBiasClamp;
    FLOAT SlopeScaledDepthBias;
    BOOL DepthClipEnable;
    BOOL ScissorEnable;
    BOOL MultisampleEnable;
    BOOL AntialiasedLineEnable;
} D3D11_RASTERIZER_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_RASTERIZER_DESC : public D3D11_RASTERIZER_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_RASTERIZER_DESC() = default;" )
cpp_quote( "    explicit CD3D11_RASTERIZER_DESC( const D3D11_RASTERIZER_DESC& o ) :" )
cpp_quote( "        D3D11_RASTERIZER_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_RASTERIZER_DESC( CD3D11_DEFAULT )" )
cpp_quote( "    {" )
cpp_quote( "        FillMode = D3D11_FILL_SOLID;" )
cpp_quote( "        CullMode = D3D11_CULL_BACK;" )
cpp_quote( "        FrontCounterClockwise = FALSE;" )
cpp_quote( "        DepthBias = D3D11_DEFAULT_DEPTH_BIAS;" )
cpp_quote( "        DepthBiasClamp = D3D11_DEFAULT_DEPTH_BIAS_CLAMP;" )
cpp_quote( "        SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;" )
cpp_quote( "        DepthClipEnable = TRUE;" )
cpp_quote( "        ScissorEnable = FALSE;" )
cpp_quote( "        MultisampleEnable = FALSE;" )
cpp_quote( "        AntialiasedLineEnable = FALSE;" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_RASTERIZER_DESC(" )
cpp_quote( "        D3D11_FILL_MODE fillMode," )
cpp_quote( "        D3D11_CULL_MODE cullMode," )
cpp_quote( "        BOOL frontCounterClockwise," )
cpp_quote( "        INT depthBias," )
cpp_quote( "        FLOAT depthBiasClamp," )
cpp_quote( "        FLOAT slopeScaledDepthBias," )
cpp_quote( "        BOOL depthClipEnable," )
cpp_quote( "        BOOL scissorEnable," )
cpp_quote( "        BOOL multisampleEnable," )
cpp_quote( "        BOOL antialiasedLineEnable )" )
cpp_quote( "    {" )
cpp_quote( "        FillMode = fillMode;" )
cpp_quote( "        CullMode = cullMode;" )
cpp_quote( "        FrontCounterClockwise = frontCounterClockwise;" )
cpp_quote( "        DepthBias = depthBias;" )
cpp_quote( "        DepthBiasClamp = depthBiasClamp;" )
cpp_quote( "        SlopeScaledDepthBias = slopeScaledDepthBias;" )
cpp_quote( "        DepthClipEnable = depthClipEnable;" )
cpp_quote( "        ScissorEnable = scissorEnable;" )
cpp_quote( "        MultisampleEnable = multisampleEnable;" )
cpp_quote( "        AntialiasedLineEnable = antialiasedLineEnable;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_RASTERIZER_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( 9bb4ab81-ab1a-4d8f-b506-fc04200b6ee7 ), object, local, pointer_default( unique ) ]
interface ID3D11RasterizerState
    : ID3D11DeviceChild
{
    void GetDesc( [annotation("_Out_")] D3D11_RASTERIZER_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Resource
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )" )
cpp_quote( "{ return MipSlice + ArraySlice * MipLevels; }" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

typedef struct D3D11_SUBRESOURCE_DATA
{
    const void *pSysMem;
    UINT SysMemPitch;
    UINT SysMemSlicePitch;
} D3D11_SUBRESOURCE_DATA;

typedef struct D3D11_MAPPED_SUBRESOURCE
{
    void *pData;
    UINT RowPitch;
    UINT DepthPitch;
} D3D11_MAPPED_SUBRESOURCE;

[ uuid( dc8e63f3-d12b-4952-b47b-5e45026a862d ), object, local, pointer_default( unique ) ]
interface ID3D11Resource
    : ID3D11DeviceChild
{
    void GetType( [annotation("_Out_")] D3D11_RESOURCE_DIMENSION* pResourceDimension );
    void SetEvictionPriority( [annotation("_In_")] UINT EvictionPriority );
    UINT GetEvictionPriority();
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Buffer
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct D3D11_BUFFER_DESC
{
    UINT ByteWidth;
    D3D11_USAGE Usage;
    UINT BindFlags;
    UINT CPUAccessFlags;    
    UINT MiscFlags;
    UINT StructureByteStride; // Stride of Structured Buffer; ignored if STRUCTURED MiscFlag not set
} D3D11_BUFFER_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_BUFFER_DESC : public D3D11_BUFFER_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_BUFFER_DESC() = default;" )
cpp_quote( "    explicit CD3D11_BUFFER_DESC( const D3D11_BUFFER_DESC& o ) :" )
cpp_quote( "        D3D11_BUFFER_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_BUFFER_DESC(" )
cpp_quote( "        UINT byteWidth," )
cpp_quote( "        UINT bindFlags," )
cpp_quote( "        D3D11_USAGE usage = D3D11_USAGE_DEFAULT," )
cpp_quote( "        UINT cpuaccessFlags = 0," )
cpp_quote( "        UINT miscFlags = 0," )
cpp_quote( "        UINT structureByteStride = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        ByteWidth = byteWidth;" )
cpp_quote( "        Usage = usage;" )
cpp_quote( "        BindFlags = bindFlags;" )
cpp_quote( "        CPUAccessFlags = cpuaccessFlags ;" )
cpp_quote( "        MiscFlags = miscFlags;" )
cpp_quote( "        StructureByteStride = structureByteStride;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_BUFFER_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( 48570b85-d1ee-4fcd-a250-eb350722b037 ), object, local, pointer_default( unique ) ]
interface ID3D11Buffer
    : ID3D11Resource
{
    void GetDesc( [annotation("_Out_")] D3D11_BUFFER_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Texture1D
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct D3D11_TEXTURE1D_DESC
{
    UINT Width;
    UINT MipLevels;
    UINT ArraySize;
    DXGI_FORMAT Format;
    D3D11_USAGE Usage;
    UINT BindFlags;
    UINT CPUAccessFlags;    
    UINT MiscFlags;
} D3D11_TEXTURE1D_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_TEXTURE1D_DESC : public D3D11_TEXTURE1D_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_TEXTURE1D_DESC() = default;" )
cpp_quote( "    explicit CD3D11_TEXTURE1D_DESC( const D3D11_TEXTURE1D_DESC& o ) :" )
cpp_quote( "        D3D11_TEXTURE1D_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_TEXTURE1D_DESC(" )
cpp_quote( "        DXGI_FORMAT format," )
cpp_quote( "        UINT width," )
cpp_quote( "        UINT arraySize = 1," )
cpp_quote( "        UINT mipLevels = 0," )
cpp_quote( "        UINT bindFlags = D3D11_BIND_SHADER_RESOURCE," )
cpp_quote( "        D3D11_USAGE usage = D3D11_USAGE_DEFAULT," )
cpp_quote( "        UINT cpuaccessFlags= 0," )
cpp_quote( "        UINT miscFlags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        Width = width;" )
cpp_quote( "        MipLevels = mipLevels;" )
cpp_quote( "        ArraySize = arraySize;" )
cpp_quote( "        Format = format;" )
cpp_quote( "        Usage = usage;" )
cpp_quote( "        BindFlags = bindFlags;" )
cpp_quote( "        CPUAccessFlags = cpuaccessFlags;" )
cpp_quote( "        MiscFlags = miscFlags;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_TEXTURE1D_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( f8fb5c27-c6b3-4f75-a4c8-439af2ef564c ), object, local, pointer_default( unique ) ]
interface ID3D11Texture1D
    : ID3D11Resource
{
    void GetDesc( [annotation("_Out_")] D3D11_TEXTURE1D_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Texture2D
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct D3D11_TEXTURE2D_DESC
{
    UINT Width;
    UINT Height;
    UINT MipLevels;
    UINT ArraySize;
    DXGI_FORMAT Format;
    DXGI_SAMPLE_DESC SampleDesc;
    D3D11_USAGE Usage;
    UINT BindFlags;
    UINT CPUAccessFlags;    
    UINT MiscFlags;
} D3D11_TEXTURE2D_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_TEXTURE2D_DESC : public D3D11_TEXTURE2D_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_TEXTURE2D_DESC() = default;" )
cpp_quote( "    explicit CD3D11_TEXTURE2D_DESC( const D3D11_TEXTURE2D_DESC& o ) :" )
cpp_quote( "        D3D11_TEXTURE2D_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_TEXTURE2D_DESC(" )
cpp_quote( "        DXGI_FORMAT format," )
cpp_quote( "        UINT width," )
cpp_quote( "        UINT height," )
cpp_quote( "        UINT arraySize = 1," )
cpp_quote( "        UINT mipLevels = 0," )
cpp_quote( "        UINT bindFlags = D3D11_BIND_SHADER_RESOURCE," )
cpp_quote( "        D3D11_USAGE usage = D3D11_USAGE_DEFAULT," )
cpp_quote( "        UINT cpuaccessFlags = 0," )
cpp_quote( "        UINT sampleCount = 1," )
cpp_quote( "        UINT sampleQuality = 0," )
cpp_quote( "        UINT miscFlags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        Width = width;" )
cpp_quote( "        Height = height;" )
cpp_quote( "        MipLevels = mipLevels;" )
cpp_quote( "        ArraySize = arraySize;" )
cpp_quote( "        Format = format;" )
cpp_quote( "        SampleDesc.Count = sampleCount;" )
cpp_quote( "        SampleDesc.Quality = sampleQuality;" )
cpp_quote( "        Usage = usage;" )
cpp_quote( "        BindFlags = bindFlags;" )
cpp_quote( "        CPUAccessFlags = cpuaccessFlags;" )
cpp_quote( "        MiscFlags = miscFlags;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_TEXTURE2D_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( 6f15aaf2-d208-4e89-9ab4-489535d34f9c ), object, local, pointer_default( unique ) ]
interface ID3D11Texture2D
    : ID3D11Resource
{
    void GetDesc( [annotation("_Out_")] D3D11_TEXTURE2D_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Texture3D
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct D3D11_TEXTURE3D_DESC
{
    UINT Width;
    UINT Height;
    UINT Depth;
    UINT MipLevels;
    DXGI_FORMAT Format;
    D3D11_USAGE Usage;    
    UINT BindFlags;
    UINT CPUAccessFlags;    
    UINT MiscFlags;
} D3D11_TEXTURE3D_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_TEXTURE3D_DESC : public D3D11_TEXTURE3D_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_TEXTURE3D_DESC() = default;" )
cpp_quote( "    explicit CD3D11_TEXTURE3D_DESC( const D3D11_TEXTURE3D_DESC& o ) :" )
cpp_quote( "        D3D11_TEXTURE3D_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_TEXTURE3D_DESC(" )
cpp_quote( "        DXGI_FORMAT format," )
cpp_quote( "        UINT width," )
cpp_quote( "        UINT height," )
cpp_quote( "        UINT depth," )
cpp_quote( "        UINT mipLevels = 0," )
cpp_quote( "        UINT bindFlags = D3D11_BIND_SHADER_RESOURCE," )
cpp_quote( "        D3D11_USAGE usage = D3D11_USAGE_DEFAULT," )
cpp_quote( "        UINT cpuaccessFlags = 0," )
cpp_quote( "        UINT miscFlags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        Width = width;" )
cpp_quote( "        Height = height;" )
cpp_quote( "        Depth = depth;" )
cpp_quote( "        MipLevels = mipLevels;" )
cpp_quote( "        Format = format;" )
cpp_quote( "        Usage = usage;" )
cpp_quote( "        BindFlags = bindFlags;" )
cpp_quote( "        CPUAccessFlags = cpuaccessFlags;" )
cpp_quote( "        MiscFlags = miscFlags;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_TEXTURE3D_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( 037e866e-f56d-4357-a8af-9dabbe6e250e ), object, local, pointer_default( unique ) ]
interface ID3D11Texture3D
    : ID3D11Resource
{
    void GetDesc( [annotation("_Out_")] D3D11_TEXTURE3D_DESC* pDesc );
};

/* TextureCube Face identifiers */
typedef enum D3D11_TEXTURECUBE_FACE
{
    D3D11_TEXTURECUBE_FACE_POSITIVE_X = 0,
    D3D11_TEXTURECUBE_FACE_NEGATIVE_X = 1,
    D3D11_TEXTURECUBE_FACE_POSITIVE_Y = 2,
    D3D11_TEXTURECUBE_FACE_NEGATIVE_Y = 3,
    D3D11_TEXTURECUBE_FACE_POSITIVE_Z = 4,
    D3D11_TEXTURECUBE_FACE_NEGATIVE_Z = 5
} D3D11_TEXTURECUBE_FACE;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// View
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ uuid( 839d1216-bb2e-412b-b7f4-a9dbebe08ed1 ), object, local, pointer_default( unique ) ]
interface ID3D11View
    : ID3D11DeviceChild
{
    void GetResource( [annotation("_Outptr_")] ID3D11Resource** ppResource );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// ShaderResourceView
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct D3D11_BUFFER_SRV
{
    union
    {
        UINT FirstElement;  // Nicer name
        UINT ElementOffset;
    };
    union
    {
        UINT NumElements;   // Nicer name
        UINT ElementWidth;  
    };
} D3D11_BUFFER_SRV;

typedef enum D3D11_BUFFEREX_SRV_FLAG
{
    D3D11_BUFFEREX_SRV_FLAG_RAW = 0x00000001,      // allow device multi-component reads with DWORD addressing
} D3D11_BUFFEREX_SRV_FLAG;

typedef struct D3D11_BUFFEREX_SRV
{
    UINT FirstElement;
    UINT NumElements;
    UINT Flags;
} D3D11_BUFFEREX_SRV;

typedef struct D3D11_TEX1D_SRV
{
    UINT MostDetailedMip;
    UINT MipLevels;
 } D3D11_TEX1D_SRV;

typedef struct D3D11_TEX1D_ARRAY_SRV
{
    UINT MostDetailedMip;
    UINT MipLevels;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX1D_ARRAY_SRV;

typedef struct D3D11_TEX2D_SRV
{
    UINT MostDetailedMip;
    UINT MipLevels;
} D3D11_TEX2D_SRV;

typedef struct D3D11_TEX2D_ARRAY_SRV
{
    UINT MostDetailedMip;
    UINT MipLevels;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX2D_ARRAY_SRV;

typedef struct D3D11_TEX3D_SRV
{
    UINT MostDetailedMip;
    UINT MipLevels;
} D3D11_TEX3D_SRV;

typedef struct D3D11_TEXCUBE_SRV
{
    UINT MostDetailedMip;
    UINT MipLevels;
} D3D11_TEXCUBE_SRV;

typedef struct D3D11_TEXCUBE_ARRAY_SRV
{
    UINT MostDetailedMip;
    UINT MipLevels;
    UINT First2DArrayFace;  
    UINT NumCubes;
} D3D11_TEXCUBE_ARRAY_SRV;

typedef struct D3D11_TEX2DMS_SRV
{
    // don't need to define anything specific for this view dimension
    UINT UnusedField_NothingToDefine;
} D3D11_TEX2DMS_SRV;

typedef struct D3D11_TEX2DMS_ARRAY_SRV
{
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX2DMS_ARRAY_SRV;

typedef struct D3D11_SHADER_RESOURCE_VIEW_DESC
{
    DXGI_FORMAT Format;
    D3D11_SRV_DIMENSION ViewDimension;

    union
    {
        D3D11_BUFFER_SRV Buffer;
        D3D11_TEX1D_SRV Texture1D;
        D3D11_TEX1D_ARRAY_SRV Texture1DArray;
        D3D11_TEX2D_SRV Texture2D;
        D3D11_TEX2D_ARRAY_SRV Texture2DArray;
        D3D11_TEX2DMS_SRV Texture2DMS;
        D3D11_TEX2DMS_ARRAY_SRV Texture2DMSArray;
        D3D11_TEX3D_SRV Texture3D;
        D3D11_TEXCUBE_SRV TextureCube;
        D3D11_TEXCUBE_ARRAY_SRV TextureCubeArray;
        D3D11_BUFFEREX_SRV BufferEx;
    };
} D3D11_SHADER_RESOURCE_VIEW_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_SHADER_RESOURCE_VIEW_DESC : public D3D11_SHADER_RESOURCE_VIEW_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_SHADER_RESOURCE_VIEW_DESC() = default;" )
cpp_quote( "    explicit CD3D11_SHADER_RESOURCE_VIEW_DESC( const D3D11_SHADER_RESOURCE_VIEW_DESC& o ) :" )
cpp_quote( "        D3D11_SHADER_RESOURCE_VIEW_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_SHADER_RESOURCE_VIEW_DESC(" )
cpp_quote( "        D3D11_SRV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mostDetailedMip = 0, // FirstElement for BUFFER" )
cpp_quote( "        UINT mipLevels = -1, // NumElements for BUFFER" )
cpp_quote( "        UINT firstArraySlice = 0, // First2DArrayFace for TEXTURECUBEARRAY" )
cpp_quote( "        UINT arraySize = -1, // NumCubes for TEXTURECUBEARRAY" )
cpp_quote( "        UINT flags = 0 ) // BUFFEREX only" )
cpp_quote( "    {" )
cpp_quote( "        Format = format;" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_SRV_DIMENSION_BUFFER:" )
cpp_quote( "            Buffer.FirstElement = mostDetailedMip;" )
cpp_quote( "            Buffer.NumElements = mipLevels;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE1D:" )
cpp_quote( "            Texture1D.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            Texture1D.MipLevels = mipLevels;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:" )
cpp_quote( "            Texture1DArray.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            Texture1DArray.MipLevels = mipLevels;" )
cpp_quote( "            Texture1DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture1DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE2D:" )
cpp_quote( "            Texture2D.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            Texture2D.MipLevels = mipLevels;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:" )
cpp_quote( "            Texture2DArray.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            Texture2DArray.MipLevels = mipLevels;" )
cpp_quote( "            Texture2DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE2DMS:" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY:" )
cpp_quote( "            Texture2DMSArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DMSArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE3D:" )
cpp_quote( "            Texture3D.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            Texture3D.MipLevels = mipLevels;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURECUBE:" )
cpp_quote( "            TextureCube.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            TextureCube.MipLevels = mipLevels;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY:" )
cpp_quote( "            TextureCubeArray.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            TextureCubeArray.MipLevels = mipLevels;" )
cpp_quote( "            TextureCubeArray.First2DArrayFace = firstArraySlice;" )
cpp_quote( "            TextureCubeArray.NumCubes = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_BUFFEREX:" )
cpp_quote( "            BufferEx.FirstElement = mostDetailedMip;" )
cpp_quote( "            BufferEx.NumElements = mipLevels;" )
cpp_quote( "            BufferEx.Flags = flags;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_SHADER_RESOURCE_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Buffer*," )
cpp_quote( "        DXGI_FORMAT format," )
cpp_quote( "        UINT firstElement," )
cpp_quote( "        UINT numElements," )
cpp_quote( "        UINT flags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        Format = format;" )
cpp_quote( "        ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;" )
cpp_quote( "        BufferEx.FirstElement = firstElement;" )
cpp_quote( "        BufferEx.NumElements = numElements;" )
cpp_quote( "        BufferEx.Flags = flags;" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_SHADER_RESOURCE_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture1D* pTex1D," )
cpp_quote( "        D3D11_SRV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mostDetailedMip = 0," )
cpp_quote( "        UINT mipLevels = -1," )
cpp_quote( "        UINT firstArraySlice = 0," )
cpp_quote( "        UINT arraySize = -1 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format || (UINT)-1 == mipLevels ||" )
cpp_quote( "            ((UINT)-1 == arraySize && D3D11_SRV_DIMENSION_TEXTURE1DARRAY == viewDimension))" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE1D_DESC TexDesc;" )
cpp_quote( "            pTex1D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == mipLevels) mipLevels = TexDesc.MipLevels - mostDetailedMip;" )
cpp_quote( "            if ((UINT)-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE1D:" )
cpp_quote( "            Texture1D.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            Texture1D.MipLevels = mipLevels;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:" )
cpp_quote( "            Texture1DArray.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            Texture1DArray.MipLevels = mipLevels;" )
cpp_quote( "            Texture1DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture1DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_SHADER_RESOURCE_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture2D* pTex2D," )
cpp_quote( "        D3D11_SRV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mostDetailedMip = 0," )
cpp_quote( "        UINT mipLevels = -1," )
cpp_quote( "        UINT firstArraySlice = 0, // First2DArrayFace for TEXTURECUBEARRAY" )
cpp_quote( "        UINT arraySize = -1 ) // NumCubes for TEXTURECUBEARRAY" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format || " )
cpp_quote( "            ((UINT)-1 == mipLevels &&" )
cpp_quote( "                D3D11_SRV_DIMENSION_TEXTURE2DMS != viewDimension &&" )
cpp_quote( "                D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY != viewDimension) ||" )
cpp_quote( "            ((UINT)-1 == arraySize &&" )
cpp_quote( "                (D3D11_SRV_DIMENSION_TEXTURE2DARRAY == viewDimension ||" )
cpp_quote( "                D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY == viewDimension ||" )
cpp_quote( "                D3D11_SRV_DIMENSION_TEXTURECUBEARRAY == viewDimension)))" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE2D_DESC TexDesc;" )
cpp_quote( "            pTex2D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == mipLevels) mipLevels = TexDesc.MipLevels - mostDetailedMip;" )
cpp_quote( "            if ((UINT)-1 == arraySize)" )
cpp_quote( "            {" )
cpp_quote( "                arraySize = TexDesc.ArraySize - firstArraySlice;" )
cpp_quote( "                if (D3D11_SRV_DIMENSION_TEXTURECUBEARRAY == viewDimension) arraySize /= 6;" )
cpp_quote( "            }" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE2D:" )
cpp_quote( "            Texture2D.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            Texture2D.MipLevels = mipLevels;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:" )
cpp_quote( "            Texture2DArray.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            Texture2DArray.MipLevels = mipLevels;" )
cpp_quote( "            Texture2DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE2DMS:" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY:" )
cpp_quote( "            Texture2DMSArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DMSArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURECUBE:" )
cpp_quote( "            TextureCube.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            TextureCube.MipLevels = mipLevels;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY:" )
cpp_quote( "            TextureCubeArray.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "            TextureCubeArray.MipLevels = mipLevels;" )
cpp_quote( "            TextureCubeArray.First2DArrayFace = firstArraySlice;" )
cpp_quote( "            TextureCubeArray.NumCubes = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_SHADER_RESOURCE_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture3D* pTex3D," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mostDetailedMip = 0," )
cpp_quote( "        UINT mipLevels = -1 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format || (UINT)-1 == mipLevels)" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE3D_DESC TexDesc;" )
cpp_quote( "            pTex3D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == mipLevels) mipLevels = TexDesc.MipLevels - mostDetailedMip;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        Texture3D.MostDetailedMip = mostDetailedMip;" )
cpp_quote( "        Texture3D.MipLevels = mipLevels;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_SHADER_RESOURCE_VIEW_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( b0e06fe0-8192-4e1a-b1ca-36d7414710b2 ), object, local, pointer_default( unique ) ]
interface ID3D11ShaderResourceView
    : ID3D11View
{
    void GetDesc( [annotation("_Out_")] D3D11_SHADER_RESOURCE_VIEW_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// RenderTargetView
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct D3D11_BUFFER_RTV
{
    union
    {
        UINT FirstElement;  // Nicer name
        UINT ElementOffset;
    };
    union
    {
        UINT NumElements;   // Nicer name
        UINT ElementWidth; 
    };
} D3D11_BUFFER_RTV;

typedef struct D3D11_TEX1D_RTV
{
    UINT MipSlice;
} D3D11_TEX1D_RTV;

typedef struct D3D11_TEX1D_ARRAY_RTV
{
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX1D_ARRAY_RTV;

typedef struct D3D11_TEX2D_RTV
{
    UINT MipSlice;
} D3D11_TEX2D_RTV;

typedef struct D3D11_TEX2DMS_RTV
{
    UINT UnusedField_NothingToDefine;
} D3D11_TEX2DMS_RTV;

typedef struct D3D11_TEX2D_ARRAY_RTV
{
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX2D_ARRAY_RTV;

typedef struct D3D11_TEX2DMS_ARRAY_RTV
{
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX2DMS_ARRAY_RTV;

typedef struct D3D11_TEX3D_RTV
{
    UINT MipSlice;
    UINT FirstWSlice;
    UINT WSize;
} D3D11_TEX3D_RTV;

typedef struct D3D11_RENDER_TARGET_VIEW_DESC
{
    DXGI_FORMAT Format;
    D3D11_RTV_DIMENSION ViewDimension;

    union
    {
        D3D11_BUFFER_RTV Buffer;
        D3D11_TEX1D_RTV Texture1D;
        D3D11_TEX1D_ARRAY_RTV Texture1DArray;
        D3D11_TEX2D_RTV Texture2D;
        D3D11_TEX2D_ARRAY_RTV Texture2DArray;
        D3D11_TEX2DMS_RTV Texture2DMS;
        D3D11_TEX2DMS_ARRAY_RTV Texture2DMSArray;
        D3D11_TEX3D_RTV Texture3D;
    };
} D3D11_RENDER_TARGET_VIEW_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_RENDER_TARGET_VIEW_DESC : public D3D11_RENDER_TARGET_VIEW_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_RENDER_TARGET_VIEW_DESC() = default;" )
cpp_quote( "    explicit CD3D11_RENDER_TARGET_VIEW_DESC( const D3D11_RENDER_TARGET_VIEW_DESC& o ) :" )
cpp_quote( "        D3D11_RENDER_TARGET_VIEW_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_RENDER_TARGET_VIEW_DESC(" )
cpp_quote( "        D3D11_RTV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0, // FirstElement for BUFFER" )
cpp_quote( "        UINT firstArraySlice = 0, // NumElements for BUFFER, FirstWSlice for TEXTURE3D" )
cpp_quote( "        UINT arraySize = -1 ) // WSize for TEXTURE3D" )
cpp_quote( "    {" )
cpp_quote( "        Format = format;" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_RTV_DIMENSION_BUFFER:" )
cpp_quote( "            Buffer.FirstElement = mipSlice;" )
cpp_quote( "            Buffer.NumElements = firstArraySlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE1D:" )
cpp_quote( "            Texture1D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE1DARRAY:" )
cpp_quote( "            Texture1DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture1DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture1DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2D:" )
cpp_quote( "            Texture2D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2DARRAY:" )
cpp_quote( "            Texture2DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture2DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2DMS:" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY:" )
cpp_quote( "            Texture2DMSArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DMSArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE3D:" )
cpp_quote( "            Texture3D.MipSlice = mipSlice;" )
cpp_quote( "            Texture3D.FirstWSlice = firstArraySlice;" )
cpp_quote( "            Texture3D.WSize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_RENDER_TARGET_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Buffer*," )
cpp_quote( "        DXGI_FORMAT format," )
cpp_quote( "        UINT firstElement," )
cpp_quote( "        UINT numElements )" )
cpp_quote( "    {" )
cpp_quote( "        Format = format;" )
cpp_quote( "        ViewDimension = D3D11_RTV_DIMENSION_BUFFER;" )
cpp_quote( "        Buffer.FirstElement = firstElement;" )
cpp_quote( "        Buffer.NumElements = numElements;" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_RENDER_TARGET_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture1D* pTex1D," )
cpp_quote( "        D3D11_RTV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0," )
cpp_quote( "        UINT firstArraySlice = 0," )
cpp_quote( "        UINT arraySize = -1 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format ||" )
cpp_quote( "            ((UINT)-1 == arraySize && D3D11_RTV_DIMENSION_TEXTURE1DARRAY == viewDimension))" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE1D_DESC TexDesc;" )
cpp_quote( "            pTex1D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE1D:" )
cpp_quote( "            Texture1D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE1DARRAY:" )
cpp_quote( "            Texture1DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture1DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture1DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_RENDER_TARGET_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture2D* pTex2D," )
cpp_quote( "        D3D11_RTV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0," )
cpp_quote( "        UINT firstArraySlice = 0," )
cpp_quote( "        UINT arraySize = -1 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format || " )
cpp_quote( "            ((UINT)-1 == arraySize &&" )
cpp_quote( "                (D3D11_RTV_DIMENSION_TEXTURE2DARRAY == viewDimension ||" )
cpp_quote( "                D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY == viewDimension)))" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE2D_DESC TexDesc;" )
cpp_quote( "            pTex2D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2D:" )
cpp_quote( "            Texture2D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2DARRAY:" )
cpp_quote( "            Texture2DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture2DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2DMS:" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY:" )
cpp_quote( "            Texture2DMSArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DMSArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_RENDER_TARGET_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture3D* pTex3D," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0," )
cpp_quote( "        UINT firstWSlice = 0," )
cpp_quote( "        UINT wSize = -1 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format || (UINT)-1 == wSize)" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE3D_DESC TexDesc;" )
cpp_quote( "            pTex3D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == wSize) wSize = TexDesc.Depth - firstWSlice;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        Texture3D.MipSlice = mipSlice;" )
cpp_quote( "        Texture3D.FirstWSlice = firstWSlice;" )
cpp_quote( "        Texture3D.WSize = wSize;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_RENDER_TARGET_VIEW_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( dfdba067-0b8d-4865-875b-d7b4516cc164 ), object, local, pointer_default( unique ) ]
interface ID3D11RenderTargetView
    : ID3D11View
{
    void GetDesc( [annotation("_Out_")] D3D11_RENDER_TARGET_VIEW_DESC* pDesc );
};

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_VIEWPORT : public D3D11_VIEWPORT" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_VIEWPORT() = default;" )
cpp_quote( "    explicit CD3D11_VIEWPORT( const D3D11_VIEWPORT& o ) :" )
cpp_quote( "        D3D11_VIEWPORT( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_VIEWPORT(" )
cpp_quote( "        FLOAT topLeftX," )
cpp_quote( "        FLOAT topLeftY," )
cpp_quote( "        FLOAT width," )
cpp_quote( "        FLOAT height," )
cpp_quote( "        FLOAT minDepth = D3D11_MIN_DEPTH," )
cpp_quote( "        FLOAT maxDepth = D3D11_MAX_DEPTH )" )
cpp_quote( "    {" )
cpp_quote( "        TopLeftX = topLeftX;" )
cpp_quote( "        TopLeftY = topLeftY;" )
cpp_quote( "        Width = width;" )
cpp_quote( "        Height = height;" )
cpp_quote( "        MinDepth = minDepth;" )
cpp_quote( "        MaxDepth = maxDepth;" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_VIEWPORT(" )
cpp_quote( "        _In_ ID3D11Buffer*," )
cpp_quote( "        _In_ ID3D11RenderTargetView* pRTView," )
cpp_quote( "        FLOAT topLeftX = 0.0f," )
cpp_quote( "        FLOAT minDepth = D3D11_MIN_DEPTH," )
cpp_quote( "        FLOAT maxDepth = D3D11_MAX_DEPTH )" )
cpp_quote( "    {" )
cpp_quote( "        D3D11_RENDER_TARGET_VIEW_DESC RTVDesc;" )
cpp_quote( "        pRTView->GetDesc( &RTVDesc );" )
cpp_quote( "        UINT NumElements = 0;" )
cpp_quote( "        switch (RTVDesc.ViewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_RTV_DIMENSION_BUFFER:" )
cpp_quote( "            NumElements = RTVDesc.Buffer.NumElements;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "        TopLeftX = topLeftX;" )
cpp_quote( "        TopLeftY = 0.0f;" )
cpp_quote( "        Width = static_cast<FLOAT>(NumElements) - topLeftX;" )
cpp_quote( "        Height = 1.0f;" )
cpp_quote( "        MinDepth = minDepth;" )
cpp_quote( "        MaxDepth = maxDepth;" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_VIEWPORT(" )
cpp_quote( "        _In_ ID3D11Texture1D* pTex1D," )
cpp_quote( "        _In_ ID3D11RenderTargetView* pRTView," )
cpp_quote( "        FLOAT topLeftX = 0.0f," )
cpp_quote( "        FLOAT minDepth = D3D11_MIN_DEPTH," )
cpp_quote( "        FLOAT maxDepth = D3D11_MAX_DEPTH )" )
cpp_quote( "    {" )
cpp_quote( "        D3D11_TEXTURE1D_DESC TexDesc;" )
cpp_quote( "        pTex1D->GetDesc( &TexDesc );" )
cpp_quote( "        D3D11_RENDER_TARGET_VIEW_DESC RTVDesc;" )
cpp_quote( "        pRTView->GetDesc( &RTVDesc );" )
cpp_quote( "        UINT MipSlice = 0;" )
cpp_quote( "        switch (RTVDesc.ViewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE1D:" )
cpp_quote( "            MipSlice = RTVDesc.Texture1D.MipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE1DARRAY:" )
cpp_quote( "            MipSlice = RTVDesc.Texture1DArray.MipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "        const UINT SubResourceWidth = TexDesc.Width / (UINT( 1 ) << MipSlice);" )
cpp_quote( "        TopLeftX = topLeftX;" )
cpp_quote( "        TopLeftY = 0.0f;" )
cpp_quote( "        Width = static_cast<FLOAT>(SubResourceWidth ? SubResourceWidth : 1) - topLeftX;" )
cpp_quote( "        Height = 1.0f;" )
cpp_quote( "        MinDepth = minDepth;" )
cpp_quote( "        MaxDepth = maxDepth;" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_VIEWPORT(" )
cpp_quote( "        _In_ ID3D11Texture2D* pTex2D," )
cpp_quote( "        _In_ ID3D11RenderTargetView* pRTView," )
cpp_quote( "        FLOAT topLeftX = 0.0f," )
cpp_quote( "        FLOAT topLeftY = 0.0f," )
cpp_quote( "        FLOAT minDepth = D3D11_MIN_DEPTH," )
cpp_quote( "        FLOAT maxDepth = D3D11_MAX_DEPTH )" )
cpp_quote( "    {" )
cpp_quote( "        D3D11_TEXTURE2D_DESC TexDesc;" )
cpp_quote( "        pTex2D->GetDesc( &TexDesc );" )
cpp_quote( "        D3D11_RENDER_TARGET_VIEW_DESC RTVDesc;" )
cpp_quote( "        pRTView->GetDesc( &RTVDesc );" )
cpp_quote( "        UINT MipSlice = 0;" )
cpp_quote( "        switch (RTVDesc.ViewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2D:" )
cpp_quote( "            MipSlice = RTVDesc.Texture2D.MipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2DARRAY:" )
cpp_quote( "            MipSlice = RTVDesc.Texture2DArray.MipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2DMS:" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY:" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "        const UINT SubResourceWidth = TexDesc.Width / (UINT( 1 ) << MipSlice);" )
cpp_quote( "        const UINT SubResourceHeight = TexDesc.Height / (UINT( 1 ) << MipSlice);" )
cpp_quote( "        TopLeftX = topLeftX;" )
cpp_quote( "        TopLeftY = topLeftY;" )
cpp_quote( "        Width = static_cast<FLOAT>(SubResourceWidth ? SubResourceWidth : 1) - topLeftX;" )
cpp_quote( "        Height = static_cast<FLOAT>(SubResourceHeight ? SubResourceHeight : 1) - topLeftY;" )
cpp_quote( "        MinDepth = minDepth;" )
cpp_quote( "        MaxDepth = maxDepth;" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_VIEWPORT(" )
cpp_quote( "        _In_ ID3D11Texture3D* pTex3D," )
cpp_quote( "        _In_ ID3D11RenderTargetView* pRTView," )
cpp_quote( "        FLOAT topLeftX = 0.0f," )
cpp_quote( "        FLOAT topLeftY = 0.0f," )
cpp_quote( "        FLOAT minDepth = D3D11_MIN_DEPTH," )
cpp_quote( "        FLOAT maxDepth = D3D11_MAX_DEPTH )" )
cpp_quote( "    {" )
cpp_quote( "        D3D11_TEXTURE3D_DESC TexDesc;" )
cpp_quote( "        pTex3D->GetDesc( &TexDesc );" )
cpp_quote( "        D3D11_RENDER_TARGET_VIEW_DESC RTVDesc;" )
cpp_quote( "        pRTView->GetDesc( &RTVDesc );" )
cpp_quote( "        UINT MipSlice = 0;" )
cpp_quote( "        switch (RTVDesc.ViewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_RTV_DIMENSION_TEXTURE3D:" )
cpp_quote( "            MipSlice = RTVDesc.Texture3D.MipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "        const UINT SubResourceWidth = TexDesc.Width / (UINT( 1 ) << MipSlice);" )
cpp_quote( "        const UINT SubResourceHeight = TexDesc.Height / (UINT( 1 ) << MipSlice);" )
cpp_quote( "        TopLeftX = topLeftX;" )
cpp_quote( "        TopLeftY = topLeftY;" )
cpp_quote( "        Width = static_cast<FLOAT>(SubResourceWidth ? SubResourceWidth : 1) - topLeftX;" )
cpp_quote( "        Height = static_cast<FLOAT>(SubResourceHeight ? SubResourceHeight : 1) - topLeftY;" )
cpp_quote( "        MinDepth = minDepth;" )
cpp_quote( "        MaxDepth = maxDepth;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_VIEWPORT() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// DepthStencilView
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct D3D11_TEX1D_DSV
{
    UINT MipSlice;
} D3D11_TEX1D_DSV;

typedef struct D3D11_TEX1D_ARRAY_DSV
{
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX1D_ARRAY_DSV;

typedef struct D3D11_TEX2D_DSV
{
    UINT MipSlice;
} D3D11_TEX2D_DSV;

typedef struct D3D11_TEX2D_ARRAY_DSV
{
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX2D_ARRAY_DSV;

typedef struct D3D11_TEX2DMS_DSV
{
    UINT UnusedField_NothingToDefine;
} D3D11_TEX2DMS_DSV;

typedef struct D3D11_TEX2DMS_ARRAY_DSV
{
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX2DMS_ARRAY_DSV;

typedef enum D3D11_DSV_FLAG
{
    D3D11_DSV_READ_ONLY_DEPTH = 0x1L,
    D3D11_DSV_READ_ONLY_STENCIL = 0x2L,
} D3D11_DSV_FLAG;

typedef struct D3D11_DEPTH_STENCIL_VIEW_DESC
{
    DXGI_FORMAT Format;
    D3D11_DSV_DIMENSION ViewDimension;
    UINT Flags; // D3D11_DSV_FLAG

    union
    {
        D3D11_TEX1D_DSV Texture1D;
        D3D11_TEX1D_ARRAY_DSV Texture1DArray;
        D3D11_TEX2D_DSV Texture2D;
        D3D11_TEX2D_ARRAY_DSV Texture2DArray;
        D3D11_TEX2DMS_DSV Texture2DMS;
        D3D11_TEX2DMS_ARRAY_DSV Texture2DMSArray;
    };
} D3D11_DEPTH_STENCIL_VIEW_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_DEPTH_STENCIL_VIEW_DESC : public D3D11_DEPTH_STENCIL_VIEW_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_DEPTH_STENCIL_VIEW_DESC() = default;" )
cpp_quote( "    explicit CD3D11_DEPTH_STENCIL_VIEW_DESC( const D3D11_DEPTH_STENCIL_VIEW_DESC& o ) :" )
cpp_quote( "        D3D11_DEPTH_STENCIL_VIEW_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_DEPTH_STENCIL_VIEW_DESC(" )
cpp_quote( "        D3D11_DSV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0," )
cpp_quote( "        UINT firstArraySlice = 0," )
cpp_quote( "        UINT arraySize = -1," )
cpp_quote( "        UINT flags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        Format = format;" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        Flags = flags;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE1D:" )
cpp_quote( "            Texture1D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE1DARRAY:" )
cpp_quote( "            Texture1DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture1DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture1DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE2D:" )
cpp_quote( "            Texture2D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE2DARRAY:" )
cpp_quote( "            Texture2DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture2DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE2DMS:" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY:" )
cpp_quote( "            Texture2DMSArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DMSArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_DEPTH_STENCIL_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture1D* pTex1D," )
cpp_quote( "        D3D11_DSV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0," )
cpp_quote( "        UINT firstArraySlice = 0," )
cpp_quote( "        UINT arraySize = -1," )
cpp_quote( "        UINT flags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        Flags = flags;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format ||" )
cpp_quote( "            ((UINT)-1 == arraySize && D3D11_DSV_DIMENSION_TEXTURE1DARRAY == viewDimension))" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE1D_DESC TexDesc;" )
cpp_quote( "            pTex1D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE1D:" )
cpp_quote( "            Texture1D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE1DARRAY:" )
cpp_quote( "            Texture1DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture1DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture1DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_DEPTH_STENCIL_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture2D* pTex2D," )
cpp_quote( "        D3D11_DSV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0," )
cpp_quote( "        UINT firstArraySlice = 0," )
cpp_quote( "        UINT arraySize = -1," )
cpp_quote( "        UINT flags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        Flags = flags;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format || " )
cpp_quote( "            ((UINT)-1 == arraySize &&" )
cpp_quote( "                (D3D11_DSV_DIMENSION_TEXTURE2DARRAY == viewDimension ||" )
cpp_quote( "                D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY == viewDimension)))" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE2D_DESC TexDesc;" )
cpp_quote( "            pTex2D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE2D:" )
cpp_quote( "            Texture2D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE2DARRAY:" )
cpp_quote( "            Texture2DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture2DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE2DMS:" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY:" )
cpp_quote( "            Texture2DMSArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DMSArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_DEPTH_STENCIL_VIEW_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( 9fdac92a-1876-48c3-afad-25b94f84a9b6 ), object, local, pointer_default( unique ) ]
interface ID3D11DepthStencilView
    : ID3D11View
{
    void GetDesc( [annotation("_Out_")] D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// UnorderedAccessView
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef enum D3D11_BUFFER_UAV_FLAG
{
    D3D11_BUFFER_UAV_FLAG_RAW =    0x00000001,
    D3D11_BUFFER_UAV_FLAG_APPEND = 0x00000002,
    D3D11_BUFFER_UAV_FLAG_COUNTER = 0x00000004,
} D3D11_BUFFER_UAV_FLAG;

typedef struct D3D11_BUFFER_UAV
{
    UINT FirstElement;
    UINT NumElements;
    UINT Flags; // See D3D11_BUFFER_UAV_FLAG_* below
} D3D11_BUFFER_UAV;

typedef struct D3D11_TEX1D_UAV
{
    UINT MipSlice;
} D3D11_TEX1D_UAV;

typedef struct D3D11_TEX1D_ARRAY_UAV
{
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX1D_ARRAY_UAV;

typedef struct D3D11_TEX2D_UAV
{
    UINT MipSlice;
} D3D11_TEX2D_UAV;

typedef struct D3D11_TEX2D_ARRAY_UAV
{
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX2D_ARRAY_UAV;

typedef struct D3D11_TEX3D_UAV
{
    UINT MipSlice;
    UINT FirstWSlice;
    UINT WSize;
} D3D11_TEX3D_UAV;
 
typedef struct D3D11_UNORDERED_ACCESS_VIEW_DESC
{
    DXGI_FORMAT Format;
    D3D11_UAV_DIMENSION ViewDimension;

    union
    {
        D3D11_BUFFER_UAV Buffer;
        D3D11_TEX1D_UAV Texture1D;
        D3D11_TEX1D_ARRAY_UAV Texture1DArray;
        D3D11_TEX2D_UAV Texture2D;
        D3D11_TEX2D_ARRAY_UAV Texture2DArray;
        D3D11_TEX3D_UAV Texture3D;
    };
} D3D11_UNORDERED_ACCESS_VIEW_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_UNORDERED_ACCESS_VIEW_DESC : public D3D11_UNORDERED_ACCESS_VIEW_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_UNORDERED_ACCESS_VIEW_DESC() = default;" )
cpp_quote( "    explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC( const D3D11_UNORDERED_ACCESS_VIEW_DESC& o ) :" )
cpp_quote( "        D3D11_UNORDERED_ACCESS_VIEW_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC(" )
cpp_quote( "        D3D11_UAV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0, // FirstElement for BUFFER" )
cpp_quote( "        UINT firstArraySlice = 0, // NumElements for BUFFER, FirstWSlice for TEXTURE3D" )
cpp_quote( "        UINT arraySize = -1, // WSize for TEXTURE3D" )
cpp_quote( "        UINT flags = 0 ) // BUFFER only" )
cpp_quote( "    {" )
cpp_quote( "        Format = format;" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_UAV_DIMENSION_BUFFER:" )
cpp_quote( "            Buffer.FirstElement = mipSlice;" )
cpp_quote( "            Buffer.NumElements = firstArraySlice;" )
cpp_quote( "            Buffer.Flags = flags;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_UAV_DIMENSION_TEXTURE1D:" )
cpp_quote( "            Texture1D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_UAV_DIMENSION_TEXTURE1DARRAY:" )
cpp_quote( "            Texture1DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture1DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture1DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_UAV_DIMENSION_TEXTURE2D:" )
cpp_quote( "            Texture2D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_UAV_DIMENSION_TEXTURE2DARRAY:" )
cpp_quote( "            Texture2DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture2DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_UAV_DIMENSION_TEXTURE3D:" )
cpp_quote( "            Texture3D.MipSlice = mipSlice;" )
cpp_quote( "            Texture3D.FirstWSlice = firstArraySlice;" )
cpp_quote( "            Texture3D.WSize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Buffer*," )
cpp_quote( "        DXGI_FORMAT format," )
cpp_quote( "        UINT firstElement," )
cpp_quote( "        UINT numElements," )
cpp_quote( "        UINT flags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        Format = format;" )
cpp_quote( "        ViewDimension = D3D11_UAV_DIMENSION_BUFFER;" )
cpp_quote( "        Buffer.FirstElement = firstElement;" )
cpp_quote( "        Buffer.NumElements = numElements;" )
cpp_quote( "        Buffer.Flags = flags;" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture1D* pTex1D," )
cpp_quote( "        D3D11_UAV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0," )
cpp_quote( "        UINT firstArraySlice = 0," )
cpp_quote( "        UINT arraySize = -1 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format ||" )
cpp_quote( "            ((UINT)-1 == arraySize && D3D11_UAV_DIMENSION_TEXTURE1DARRAY == viewDimension))" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE1D_DESC TexDesc;" )
cpp_quote( "            pTex1D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_UAV_DIMENSION_TEXTURE1D:" )
cpp_quote( "            Texture1D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_UAV_DIMENSION_TEXTURE1DARRAY:" )
cpp_quote( "            Texture1DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture1DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture1DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture2D* pTex2D," )
cpp_quote( "        D3D11_UAV_DIMENSION viewDimension," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0," )
cpp_quote( "        UINT firstArraySlice = 0," )
cpp_quote( "        UINT arraySize = -1 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = viewDimension;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format || " )
cpp_quote( "            ((UINT)-1 == arraySize && D3D11_UAV_DIMENSION_TEXTURE2DARRAY == viewDimension))" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE2D_DESC TexDesc;" )
cpp_quote( "            pTex2D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        switch (viewDimension)" )
cpp_quote( "        {" )
cpp_quote( "        case D3D11_UAV_DIMENSION_TEXTURE2D:" )
cpp_quote( "            Texture2D.MipSlice = mipSlice;" )
cpp_quote( "            break;" )
cpp_quote( "        case D3D11_UAV_DIMENSION_TEXTURE2DARRAY:" )
cpp_quote( "            Texture2DArray.MipSlice = mipSlice;" )
cpp_quote( "            Texture2DArray.FirstArraySlice = firstArraySlice;" )
cpp_quote( "            Texture2DArray.ArraySize = arraySize;" )
cpp_quote( "            break;" )
cpp_quote( "        default: break;" )
cpp_quote( "        }" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC(" )
cpp_quote( "        _In_ ID3D11Texture3D* pTex3D," )
cpp_quote( "        DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN," )
cpp_quote( "        UINT mipSlice = 0," )
cpp_quote( "        UINT firstWSlice = 0," )
cpp_quote( "        UINT wSize = -1 )" )
cpp_quote( "    {" )
cpp_quote( "        ViewDimension = D3D11_UAV_DIMENSION_TEXTURE3D;" )
cpp_quote( "        if (DXGI_FORMAT_UNKNOWN == format || (UINT)-1 == wSize)" )
cpp_quote( "        {" )
cpp_quote( "            D3D11_TEXTURE3D_DESC TexDesc;" )
cpp_quote( "            pTex3D->GetDesc( &TexDesc );" )
cpp_quote( "            if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format;" )
cpp_quote( "            if ((UINT)-1 == wSize) wSize = TexDesc.Depth - firstWSlice;" )
cpp_quote( "        }" )
cpp_quote( "        Format = format;" )
cpp_quote( "        Texture3D.MipSlice = mipSlice;" )
cpp_quote( "        Texture3D.FirstWSlice = firstWSlice;" )
cpp_quote( "        Texture3D.WSize = wSize;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_UNORDERED_ACCESS_VIEW_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( 28acf509-7f5c-48f6-8611-f316010a6380 ), object, local, pointer_default( unique ) ]
interface ID3D11UnorderedAccessView
    : ID3D11View
{
    void GetDesc( [annotation("_Out_")] D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Vertex Shader
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ uuid( 3b301d64-d678-4289-8897-22f8928b72f3 ), object, local, pointer_default( unique ) ]
interface ID3D11VertexShader
    : ID3D11DeviceChild
{
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Hull Shader
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ uuid( 8e5c6061-628a-4c8e-8264-bbe45cb3d5dd ), object, local, pointer_default( unique ) ]
interface ID3D11HullShader
    : ID3D11DeviceChild
{
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Domain Shader
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ uuid( f582c508-0f36-490c-9977-31eece268cfa ), object, local, pointer_default( unique ) ]
interface ID3D11DomainShader
    : ID3D11DeviceChild
{
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Geometry Shader
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ uuid( 38325b96-effb-4022-ba02-2e795b70275c ), object, local, pointer_default( unique ) ]
interface ID3D11GeometryShader
    : ID3D11DeviceChild
{
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Pixel Shader
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ uuid( ea82e40d-51dc-4f33-93d4-db7c9125ae8c ), object, local, pointer_default( unique ) ]
interface ID3D11PixelShader
    : ID3D11DeviceChild
{
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Compute Shader
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ uuid( 4f5b196e-c2bd-495e-bd01-1fded38e4969 ), object, local, pointer_default( unique ) ]
interface ID3D11ComputeShader
    : ID3D11DeviceChild
{
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// InputLayout
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ uuid( e4819ddc-4cf0-4025-bd26-5de82a3e07b7 ), object, local, pointer_default( unique ) ]
interface ID3D11InputLayout
    : ID3D11DeviceChild
{
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Sampler
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef enum D3D11_FILTER
{
    // Bits used in defining enumeration of valid filters:
    // bits [1:0] - mip: 0 == point, 1 == linear, 2,3 unused
    // bits [3:2] - mag: 0 == point, 1 == linear, 2,3 unused
    // bits [5:4] - min: 0 == point, 1 == linear, 2,3 unused
    // bit  [6]   - aniso
    // bits [8:7] - reduction type: 
    //                0 == standard filtering
    //                1 == comparison
    //                2 == min
    //                3 == max
    // bit  [31]  - mono 1-bit (narrow-purpose filter) [no longer supported in D3D11]

    D3D11_FILTER_MIN_MAG_MIP_POINT                              = 0x00000000,
    D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR                       = 0x00000001,
    D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT                 = 0x00000004,
    D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR                       = 0x00000005,
    D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT                       = 0x00000010,
    D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR                = 0x00000011,
    D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT                       = 0x00000014,
    D3D11_FILTER_MIN_MAG_MIP_LINEAR                             = 0x00000015,
    D3D11_FILTER_ANISOTROPIC                                    = 0x00000055,
    D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT                   = 0x00000080,
    D3D11_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR            = 0x00000081,
    D3D11_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT      = 0x00000084,
    D3D11_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR            = 0x00000085,
    D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT            = 0x00000090,
    D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR     = 0x00000091,
    D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT            = 0x00000094,
    D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR                  = 0x00000095,
    D3D11_FILTER_COMPARISON_ANISOTROPIC                         = 0x000000d5,
    D3D11_FILTER_MINIMUM_MIN_MAG_MIP_POINT                      = 0x00000100,
    D3D11_FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR               = 0x00000101,
    D3D11_FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT         = 0x00000104,
    D3D11_FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR               = 0x00000105,
    D3D11_FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT               = 0x00000110,
    D3D11_FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR        = 0x00000111,
    D3D11_FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT               = 0x00000114,
    D3D11_FILTER_MINIMUM_MIN_MAG_MIP_LINEAR                     = 0x00000115,
    D3D11_FILTER_MINIMUM_ANISOTROPIC                            = 0x00000155,
    D3D11_FILTER_MAXIMUM_MIN_MAG_MIP_POINT                      = 0x00000180,
    D3D11_FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR               = 0x00000181,
    D3D11_FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT         = 0x00000184,
    D3D11_FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR               = 0x00000185,
    D3D11_FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT               = 0x00000190,
    D3D11_FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR        = 0x00000191,
    D3D11_FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT               = 0x00000194,
    D3D11_FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR                     = 0x00000195,
    D3D11_FILTER_MAXIMUM_ANISOTROPIC                            = 0x000001d5
} D3D11_FILTER;

typedef enum D3D11_FILTER_TYPE
{
    D3D11_FILTER_TYPE_POINT = 0,
    D3D11_FILTER_TYPE_LINEAR = 1,
} D3D11_FILTER_TYPE;

typedef enum D3D11_FILTER_REDUCTION_TYPE
{
    D3D11_FILTER_REDUCTION_TYPE_STANDARD = 0,
    D3D11_FILTER_REDUCTION_TYPE_COMPARISON = 1,
    D3D11_FILTER_REDUCTION_TYPE_MINIMUM = 2,
    D3D11_FILTER_REDUCTION_TYPE_MAXIMUM = 3,
} D3D11_FILTER_REDUCTION_TYPE;

const UINT D3D11_FILTER_REDUCTION_TYPE_MASK = 0x00000003;
const UINT D3D11_FILTER_REDUCTION_TYPE_SHIFT = 7;

const UINT D3D11_FILTER_TYPE_MASK = 0x00000003;
const UINT D3D11_MIN_FILTER_SHIFT = 4;
const UINT D3D11_MAG_FILTER_SHIFT = 2;
const UINT D3D11_MIP_FILTER_SHIFT = 0;

cpp_quote( "// D3D11_COMPARISON_FILTERING_BIT is no longer used / meaningless.  The D3D11_FILTER_REDUCTION_TYPE enum replaced it. " )
cpp_quote( "// Old code that uses D3D11_COMPARISON_FILTERING_BIT and would never use D3D11_FILTER_MINIMUM_* or D3D11_FILTER_MAXIMUM_* " )
cpp_quote( "// will still work fine though, so the define is left to avoid breaks. " )
const UINT D3D11_COMPARISON_FILTERING_BIT = 0x00000080;

const UINT D3D11_ANISOTROPIC_FILTERING_BIT = 0x00000040;

// encode enum entry for most filters except anisotropic filtering
cpp_quote( "#define D3D11_ENCODE_BASIC_FILTER( min, mag, mip, reduction )                                                     \\" )
cpp_quote( "                                   ( ( D3D11_FILTER ) (                                                           \\" )
cpp_quote( "                                   ( ( ( min ) & D3D11_FILTER_TYPE_MASK ) << D3D11_MIN_FILTER_SHIFT ) |           \\" )
cpp_quote( "                                   ( ( ( mag ) & D3D11_FILTER_TYPE_MASK ) << D3D11_MAG_FILTER_SHIFT ) |           \\" )
cpp_quote( "                                   ( ( ( mip ) & D3D11_FILTER_TYPE_MASK ) << D3D11_MIP_FILTER_SHIFT ) |           \\" )
cpp_quote( "                                   ( ( ( reduction ) & D3D11_FILTER_REDUCTION_TYPE_MASK ) << D3D11_FILTER_REDUCTION_TYPE_SHIFT ) ) ) " )

// encode enum entry for anisotropic filtering (with or without comparison filtering)
cpp_quote( "#define D3D11_ENCODE_ANISOTROPIC_FILTER( reduction )                                                  \\" )
cpp_quote( "                                         ( ( D3D11_FILTER ) (                                         \\" )
cpp_quote( "                                         D3D11_ANISOTROPIC_FILTERING_BIT |                            \\" )
cpp_quote( "                                         D3D11_ENCODE_BASIC_FILTER( D3D11_FILTER_TYPE_LINEAR,         \\" )
cpp_quote( "                                                                    D3D11_FILTER_TYPE_LINEAR,         \\" )
cpp_quote( "                                                                    D3D11_FILTER_TYPE_LINEAR,         \\" )
cpp_quote( "                                                                    reduction ) ) )                     " )

cpp_quote( "#define D3D11_DECODE_MIN_FILTER( d3d11Filter )                                                              \\" )
cpp_quote( "                                 ( ( D3D11_FILTER_TYPE )                                                    \\" )
cpp_quote( "                                 ( ( ( d3d11Filter ) >> D3D11_MIN_FILTER_SHIFT ) & D3D11_FILTER_TYPE_MASK ) ) " )

cpp_quote( "#define D3D11_DECODE_MAG_FILTER( d3d11Filter )                                                              \\" )
cpp_quote( "                                 ( ( D3D11_FILTER_TYPE )                                                    \\" )
cpp_quote( "                                 ( ( ( d3d11Filter ) >> D3D11_MAG_FILTER_SHIFT ) & D3D11_FILTER_TYPE_MASK ) ) " )

cpp_quote( "#define D3D11_DECODE_MIP_FILTER( d3d11Filter )                                                              \\" )
cpp_quote( "                                 ( ( D3D11_FILTER_TYPE )                                                    \\" )
cpp_quote( "                                 ( ( ( d3d11Filter ) >> D3D11_MIP_FILTER_SHIFT ) & D3D11_FILTER_TYPE_MASK ) ) " )

cpp_quote( "#define D3D11_DECODE_FILTER_REDUCTION( d3d11Filter )                                                        \\" )
cpp_quote( "                                 ( ( D3D11_FILTER_REDUCTION_TYPE )                                                      \\" )
cpp_quote( "                                 ( ( ( d3d11Filter ) >> D3D11_FILTER_REDUCTION_TYPE_SHIFT ) & D3D11_FILTER_REDUCTION_TYPE_MASK ) ) " )

cpp_quote( "#define D3D11_DECODE_IS_COMPARISON_FILTER( d3d11Filter )                                                    \\" )
cpp_quote( "                                 ( D3D11_DECODE_FILTER_REDUCTION( d3d11Filter ) == D3D11_FILTER_REDUCTION_TYPE_COMPARISON ) " )

cpp_quote( "#define D3D11_DECODE_IS_ANISOTROPIC_FILTER( d3d11Filter )                                               \\" )
cpp_quote( "                            ( ( ( d3d11Filter ) & D3D11_ANISOTROPIC_FILTERING_BIT ) &&                  \\" )
cpp_quote( "                            ( D3D11_FILTER_TYPE_LINEAR == D3D11_DECODE_MIN_FILTER( d3d11Filter ) ) &&   \\" )
cpp_quote( "                            ( D3D11_FILTER_TYPE_LINEAR == D3D11_DECODE_MAG_FILTER( d3d11Filter ) ) &&   \\" )
cpp_quote( "                            ( D3D11_FILTER_TYPE_LINEAR == D3D11_DECODE_MIP_FILTER( d3d11Filter ) ) )      " )

typedef enum D3D11_TEXTURE_ADDRESS_MODE
{
    D3D11_TEXTURE_ADDRESS_WRAP = 1,
    D3D11_TEXTURE_ADDRESS_MIRROR = 2,
    D3D11_TEXTURE_ADDRESS_CLAMP = 3,
    D3D11_TEXTURE_ADDRESS_BORDER = 4,
    D3D11_TEXTURE_ADDRESS_MIRROR_ONCE = 5
} D3D11_TEXTURE_ADDRESS_MODE;

typedef struct D3D11_SAMPLER_DESC
{
    D3D11_FILTER Filter;
    D3D11_TEXTURE_ADDRESS_MODE AddressU;
    D3D11_TEXTURE_ADDRESS_MODE AddressV;
    D3D11_TEXTURE_ADDRESS_MODE AddressW;
    FLOAT MipLODBias;
    UINT MaxAnisotropy;
    D3D11_COMPARISON_FUNC ComparisonFunc;
    FLOAT BorderColor[4]; // RGBA
    FLOAT MinLOD;
    FLOAT MaxLOD;
} D3D11_SAMPLER_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_SAMPLER_DESC : public D3D11_SAMPLER_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_SAMPLER_DESC() = default;" )
cpp_quote( "    explicit CD3D11_SAMPLER_DESC( const D3D11_SAMPLER_DESC& o ) :" )
cpp_quote( "        D3D11_SAMPLER_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_SAMPLER_DESC( CD3D11_DEFAULT )" )
cpp_quote( "    {" )
cpp_quote( "        Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;" )
cpp_quote( "        AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;" )
cpp_quote( "        AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;" )
cpp_quote( "        AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;" )
cpp_quote( "        MipLODBias = 0;" )
cpp_quote( "        MaxAnisotropy = 1;" )
cpp_quote( "        ComparisonFunc = D3D11_COMPARISON_NEVER;" )
cpp_quote( "        BorderColor[ 0 ] = 1.0f;" )
cpp_quote( "        BorderColor[ 1 ] = 1.0f;" )
cpp_quote( "        BorderColor[ 2 ] = 1.0f;" )
cpp_quote( "        BorderColor[ 3 ] = 1.0f;" )
cpp_quote( "        MinLOD = -3.402823466e+38F; // -FLT_MAX" )
cpp_quote( "        MaxLOD = 3.402823466e+38F; // FLT_MAX" )
cpp_quote( "    }" )
cpp_quote( "    explicit CD3D11_SAMPLER_DESC(" )
cpp_quote( "        D3D11_FILTER filter," )
cpp_quote( "        D3D11_TEXTURE_ADDRESS_MODE addressU," )
cpp_quote( "        D3D11_TEXTURE_ADDRESS_MODE addressV," )
cpp_quote( "        D3D11_TEXTURE_ADDRESS_MODE addressW," )
cpp_quote( "        FLOAT mipLODBias," )
cpp_quote( "        UINT maxAnisotropy," )
cpp_quote( "        D3D11_COMPARISON_FUNC comparisonFunc," )
cpp_quote( "        _In_reads_opt_( 4 ) const FLOAT* borderColor, // RGBA" )
cpp_quote( "        FLOAT minLOD," )
cpp_quote( "        FLOAT maxLOD )" )
cpp_quote( "    {" )
cpp_quote( "        Filter = filter;" )
cpp_quote( "        AddressU = addressU;" )
cpp_quote( "        AddressV = addressV;" )
cpp_quote( "        AddressW = addressW;" )
cpp_quote( "        MipLODBias = mipLODBias;" )
cpp_quote( "        MaxAnisotropy = maxAnisotropy;" )
cpp_quote( "        ComparisonFunc = comparisonFunc;" )
cpp_quote( "        const float defaultColor[ 4 ] = { 1.0f, 1.0f, 1.0f, 1.0f };" )
cpp_quote( "        if (!borderColor) borderColor = defaultColor;" )
cpp_quote( "        BorderColor[ 0 ] = borderColor[ 0 ];" )
cpp_quote( "        BorderColor[ 1 ] = borderColor[ 1 ];" )
cpp_quote( "        BorderColor[ 2 ] = borderColor[ 2 ];" )
cpp_quote( "        BorderColor[ 3 ] = borderColor[ 3 ];" )
cpp_quote( "        MinLOD = minLOD;" )
cpp_quote( "        MaxLOD = maxLOD;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_SAMPLER_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( da6fea51-564c-4487-9810-f0d0f9b4e3a5 ), object, local, pointer_default( unique ) ]
interface ID3D11SamplerState
    : ID3D11DeviceChild
{
    void GetDesc( [annotation("_Out_")] D3D11_SAMPLER_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Format Support Flags for CheckFormatSupport API
// Extended enum (and the original one) are also used in CheckFeatureSupport API (which is a superset of CheckFormatSupport).
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

typedef enum D3D11_FORMAT_SUPPORT
{
    D3D11_FORMAT_SUPPORT_BUFFER = 0x00000001,
    D3D11_FORMAT_SUPPORT_IA_VERTEX_BUFFER = 0x00000002,
    D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER = 0x00000004,
    D3D11_FORMAT_SUPPORT_SO_BUFFER = 0x00000008,
    D3D11_FORMAT_SUPPORT_TEXTURE1D = 0x00000010,
    D3D11_FORMAT_SUPPORT_TEXTURE2D = 0x00000020,
    D3D11_FORMAT_SUPPORT_TEXTURE3D = 0x00000040,
    D3D11_FORMAT_SUPPORT_TEXTURECUBE = 0x00000080,
    D3D11_FORMAT_SUPPORT_SHADER_LOAD = 0x00000100,
    D3D11_FORMAT_SUPPORT_SHADER_SAMPLE = 0x00000200,
    D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_COMPARISON = 0x00000400,
    D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_MONO_TEXT = 0x00000800,
    D3D11_FORMAT_SUPPORT_MIP = 0x00001000,
    D3D11_FORMAT_SUPPORT_MIP_AUTOGEN = 0x00002000,
    D3D11_FORMAT_SUPPORT_RENDER_TARGET = 0x00004000,
    D3D11_FORMAT_SUPPORT_BLENDABLE = 0x00008000,
    D3D11_FORMAT_SUPPORT_DEPTH_STENCIL = 0x00010000,
    D3D11_FORMAT_SUPPORT_CPU_LOCKABLE = 0x00020000,
    D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE = 0x00040000,
    D3D11_FORMAT_SUPPORT_DISPLAY = 0x00080000,
    D3D11_FORMAT_SUPPORT_CAST_WITHIN_BIT_LAYOUT = 0x00100000,
    D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET = 0x00200000,
    D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD = 0x00400000,
    D3D11_FORMAT_SUPPORT_SHADER_GATHER = 0x00800000,
    D3D11_FORMAT_SUPPORT_BACK_BUFFER_CAST = 0x01000000,
    D3D11_FORMAT_SUPPORT_TYPED_UNORDERED_ACCESS_VIEW = 0x02000000,
    D3D11_FORMAT_SUPPORT_SHADER_GATHER_COMPARISON = 0x04000000,
    D3D11_FORMAT_SUPPORT_DECODER_OUTPUT = 0x08000000,
    D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_OUTPUT = 0x10000000,
    D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_INPUT = 0x20000000,
    D3D11_FORMAT_SUPPORT_VIDEO_ENCODER = 0x40000000,
} D3D11_FORMAT_SUPPORT;

// D3D11_FORMAT_SUPPORT2 is only used in CheckFeatureSupport
typedef enum D3D11_FORMAT_SUPPORT2
{
    D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_ADD                                    = 0x00000001,
    D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_BITWISE_OPS                            = 0x00000002,
    D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_COMPARE_STORE_OR_COMPARE_EXCHANGE      = 0x00000004,
    D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_EXCHANGE                               = 0x00000008,
    D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_SIGNED_MIN_OR_MAX                      = 0x00000010,
    D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_UNSIGNED_MIN_OR_MAX                    = 0x00000020,
    D3D11_FORMAT_SUPPORT2_UAV_TYPED_LOAD                                    = 0x00000040,
    D3D11_FORMAT_SUPPORT2_UAV_TYPED_STORE                                   = 0x00000080,
    D3D11_FORMAT_SUPPORT2_OUTPUT_MERGER_LOGIC_OP                            = 0x00000100,
    D3D11_FORMAT_SUPPORT2_TILED                                             = 0x00000200,
    D3D11_FORMAT_SUPPORT2_SHAREABLE                                         = 0x00000400,
    D3D11_FORMAT_SUPPORT2_MULTIPLANE_OVERLAY                                = 0x00004000,
    D3D11_FORMAT_SUPPORT2_DISPLAYABLE                                       = 0x00010000,
} D3D11_FORMAT_SUPPORT2;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Query
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ uuid( 4b35d0cd-1e15-4258-9c98-1b1333f6dd3b ), object, local, pointer_default( unique ) ]
interface ID3D11Asynchronous
    : ID3D11DeviceChild
{
    UINT GetDataSize();
};

typedef enum D3D11_ASYNC_GETDATA_FLAG
{
        D3D11_ASYNC_GETDATA_DONOTFLUSH = 0x1,
} D3D11_ASYNC_GETDATA_FLAG;


typedef enum D3D11_QUERY
{
    D3D11_QUERY_EVENT = 0,
    D3D11_QUERY_OCCLUSION,
    D3D11_QUERY_TIMESTAMP,
    D3D11_QUERY_TIMESTAMP_DISJOINT,
    D3D11_QUERY_PIPELINE_STATISTICS,
    D3D11_QUERY_OCCLUSION_PREDICATE,
    D3D11_QUERY_SO_STATISTICS,
    D3D11_QUERY_SO_OVERFLOW_PREDICATE,
    D3D11_QUERY_SO_STATISTICS_STREAM0,
    D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM0,
    D3D11_QUERY_SO_STATISTICS_STREAM1,
    D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM1,
    D3D11_QUERY_SO_STATISTICS_STREAM2,
    D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM2,
    D3D11_QUERY_SO_STATISTICS_STREAM3,
    D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM3,
} D3D11_QUERY;

typedef enum D3D11_QUERY_MISC_FLAG
{
        D3D11_QUERY_MISC_PREDICATEHINT = 0x1,
} D3D11_QUERY_MISC_FLAG;

typedef struct D3D11_QUERY_DESC
{
    D3D11_QUERY Query;
    UINT MiscFlags;
} D3D11_QUERY_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_QUERY_DESC : public D3D11_QUERY_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_QUERY_DESC() = default;" )
cpp_quote( "    explicit CD3D11_QUERY_DESC( const D3D11_QUERY_DESC& o ) :" )
cpp_quote( "        D3D11_QUERY_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_QUERY_DESC(" )
cpp_quote( "        D3D11_QUERY query," )
cpp_quote( "        UINT miscFlags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        Query = query;" )
cpp_quote( "        MiscFlags = miscFlags;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_QUERY_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

[ uuid( d6c00747-87b7-425e-b84d-44d108560afd ), object, local, pointer_default( unique ) ]
interface ID3D11Query
    : ID3D11Asynchronous
{
    void GetDesc( [annotation("_Out_")] D3D11_QUERY_DESC* pDesc );
};

[ uuid( 9eb576dd-9f77-4d86-81aa-8bab5fe490e2 ), object, local, pointer_default( unique ) ]
interface ID3D11Predicate
    : ID3D11Query
{
};

typedef struct D3D11_QUERY_DATA_TIMESTAMP_DISJOINT
{
    UINT64 Frequency;
    BOOL Disjoint;
} D3D11_QUERY_DATA_TIMESTAMP_DISJOINT;

typedef struct D3D11_QUERY_DATA_PIPELINE_STATISTICS
{
    UINT64 IAVertices;
    UINT64 IAPrimitives;
    UINT64 VSInvocations;
    UINT64 GSInvocations;
    UINT64 GSPrimitives;
    UINT64 CInvocations;
    UINT64 CPrimitives;
    UINT64 PSInvocations;
    UINT64 HSInvocations;
    UINT64 DSInvocations;
    UINT64 CSInvocations;
} D3D11_QUERY_DATA_PIPELINE_STATISTICS;

typedef struct D3D11_QUERY_DATA_SO_STATISTICS
{
    UINT64 NumPrimitivesWritten;
    UINT64 PrimitivesStorageNeeded;
} D3D11_QUERY_DATA_SO_STATISTICS;

typedef enum D3D11_COUNTER
{
    D3D11_COUNTER_DEVICE_DEPENDENT_0 = 0x40000000, // DO NOT define any more D3D11_COUNTER values after this.
} D3D11_COUNTER;

typedef enum D3D11_COUNTER_TYPE
{
    D3D11_COUNTER_TYPE_FLOAT32,
    D3D11_COUNTER_TYPE_UINT16,
    D3D11_COUNTER_TYPE_UINT32,
    D3D11_COUNTER_TYPE_UINT64,
} D3D11_COUNTER_TYPE;

typedef struct D3D11_COUNTER_DESC
{
    D3D11_COUNTER Counter;
    UINT MiscFlags;
} D3D11_COUNTER_DESC;

cpp_quote( "#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_COUNTER_DESC : public D3D11_COUNTER_DESC" )
cpp_quote( "{" )
cpp_quote( "    CD3D11_COUNTER_DESC() = default;" )
cpp_quote( "    explicit CD3D11_COUNTER_DESC( const D3D11_COUNTER_DESC& o ) :" )
cpp_quote( "        D3D11_COUNTER_DESC( o )" )
cpp_quote( "    {}" )
cpp_quote( "    explicit CD3D11_COUNTER_DESC(" )
cpp_quote( "        D3D11_COUNTER counter," )
cpp_quote( "        UINT miscFlags = 0 )" )
cpp_quote( "    {" )
cpp_quote( "        Counter = counter;" )
cpp_quote( "        MiscFlags = miscFlags;" )
cpp_quote( "    }" )
cpp_quote( "    ~CD3D11_COUNTER_DESC() {}" )
cpp_quote( "};" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )


typedef struct D3D11_COUNTER_INFO
{
    D3D11_COUNTER LastDeviceDependentCounter;
    UINT NumSimultaneousCounters;
    UINT8 NumDetectableParallelUnits;
} D3D11_COUNTER_INFO;

[ uuid( 6e8c49fb-a371-4770-b440-29086022b741 ), object, local, pointer_default( unique ) ]
interface ID3D11Counter
    : ID3D11Asynchronous
{
    void GetDesc( [annotation("_Out_")] D3D11_COUNTER_DESC* pDesc );
};

typedef enum D3D11_STANDARD_MULTISAMPLE_QUALITY_LEVELS
{
    D3D11_STANDARD_MULTISAMPLE_PATTERN = 0xffffffff,
    D3D11_CENTER_MULTISAMPLE_PATTERN = 0xfffffffe
} D3D11_STANDARD_MULTISAMPLE_QUALITY_LEVELS;

typedef enum D3D11_DEVICE_CONTEXT_TYPE
{
    D3D11_DEVICE_CONTEXT_IMMEDIATE,
    D3D11_DEVICE_CONTEXT_DEFERRED,
} D3D11_DEVICE_CONTEXT_TYPE;

typedef struct D3D11_CLASS_INSTANCE_DESC
{
    // the first two entries are valid if the instance was created using GetClassInstance
    UINT InstanceId;
    UINT InstanceIndex; // entry in an array of instances
    // the rest of the entries are valid for instances created with CreateClassInstance
    UINT TypeId;
    UINT ConstantBuffer;
    UINT BaseConstantBufferOffset;
    UINT BaseTexture;
    UINT BaseSampler;
    // this lets you know which of the two an instance is
    BOOL Created;
} D3D11_CLASS_INSTANCE_DESC;

[ uuid( a6cd7faa-b0b7-4a2f-9436-8662a65797cb ), object, local, pointer_default( unique ) ]
interface ID3D11ClassInstance
    : ID3D11DeviceChild
{
    void GetClassLinkage(
        [annotation("_Outptr_")] ID3D11ClassLinkage** ppLinkage);
    void GetDesc(
        [annotation("_Out_")] D3D11_CLASS_INSTANCE_DESC* pDesc);
    void GetInstanceName(
        [annotation("_Out_writes_opt_(*pBufferLength)")] LPSTR pInstanceName,
        [annotation("_Inout_")] SIZE_T* pBufferLength);
    void GetTypeName(
        [annotation("_Out_writes_opt_(*pBufferLength)")] LPSTR pTypeName,
        [annotation("_Inout_")] SIZE_T* pBufferLength);
};

[ uuid( ddf57cba-9543-46e4-a12b-f207a0fe7fed ), object, local, pointer_default( unique ) ]
interface ID3D11ClassLinkage
    : ID3D11DeviceChild
{
    // Get a reference to an instance of a class
    // that exists in a shader.  The common scenario is to refer to
    // variables declared in shaders, which means that a reference is
    // acquired with this function and then passed in on SetShader.
    HRESULT GetClassInstance(
        [annotation("_In_")] LPCSTR pClassInstanceName,
        [annotation("_In_")] UINT InstanceIndex,
        [annotation("_COM_Outptr_")] ID3D11ClassInstance** ppInstance);

    // Create a class instance reference that is the combination of a class
    // type and the location of the data to use for the class instance
    // - not the common scenario, but useful in case the data location
    // for a class is dynamic or not known until runtime.
    HRESULT CreateClassInstance(
        [annotation("_In_")] LPCSTR pClassTypeName,
        [annotation("_In_")] UINT ConstantBufferOffset,
        [annotation("_In_")] UINT ConstantVectorOffset,
        [annotation("_In_")] UINT TextureOffset,
        [annotation("_In_")] UINT SamplerOffset,
        [annotation("_COM_Outptr_")] ID3D11ClassInstance** ppInstance);
};

[ uuid( a24bc4d1-769e-43f7-8013-98ff566c18e2 ), object, local, pointer_default( unique ) ]
interface ID3D11CommandList
    : ID3D11DeviceChild
{
    UINT GetContextFlags();
};

typedef enum D3D11_FEATURE
{
    D3D11_FEATURE_THREADING, /* D3D11_FEATURE_DATA_THREADING */
    D3D11_FEATURE_DOUBLES,  /* D3D11_FEATURE_DATA_DOUBLES */
    D3D11_FEATURE_FORMAT_SUPPORT, /* D3D11_FEATURE_DATA_FORMAT_SUPPORT */
    D3D11_FEATURE_FORMAT_SUPPORT2, /* D3D11_FEATURE_DATA_FORMAT_SUPPORT2 */
    D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, /* D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS */
    D3D11_FEATURE_D3D11_OPTIONS, /* D3D11_FEATURE_DATA_D3D11_OPTIONS */
    D3D11_FEATURE_ARCHITECTURE_INFO, /* D3D11_FEATURE_DATA_ARCHITECTURE_INFO */
    D3D11_FEATURE_D3D9_OPTIONS, /* D3D11_FEATURE_DATA_D3D9_OPTIONS */
    D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT, /* D3D11_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT */
    D3D11_FEATURE_D3D9_SHADOW_SUPPORT, /* D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT */
    D3D11_FEATURE_D3D11_OPTIONS1, /* D3D11_FEATURE_D3D11_OPTIONS1 */
    D3D11_FEATURE_D3D9_SIMPLE_INSTANCING_SUPPORT, /* D3D11_FEATURE_DATA_D3D9_SIMPLE_INSTANCING_SUPPORT */
    D3D11_FEATURE_MARKER_SUPPORT, /* D3D11_FEATURE_DATA_MARKER_SUPPORT */
    D3D11_FEATURE_D3D9_OPTIONS1, /* D3D11_FEATURE_DATA_D3D9_OPTIONS1 */
    D3D11_FEATURE_D3D11_OPTIONS2, /* D3D11_FEATURE_DATA_D3D11_OPTIONS2 */
    D3D11_FEATURE_D3D11_OPTIONS3, /* D3D11_FEATURE_DATA_D3D11_OPTIONS3 */
    D3D11_FEATURE_GPU_VIRTUAL_ADDRESS_SUPPORT, /* D3D11_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT */
    D3D11_FEATURE_D3D11_OPTIONS4, /* D3D11_FEATURE_DATA_D3D11_OPTIONS4 */
    D3D11_FEATURE_SHADER_CACHE, /* D3D11_FEATURE_DATA_SHADER_CACHE */
    D3D11_FEATURE_D3D11_OPTIONS5, /* D3D11_FEATURE_DATA_D3D11_OPTIONS5 */
    D3D11_FEATURE_DISPLAYABLE, /* D3D11_FEATURE_DATA_DISPLAYABLE */
    D3D11_FEATURE_D3D11_OPTIONS6, /* D3D11_FEATURE_DATA_D3D11_OPTIONS6 */

} D3D11_FEATURE;

typedef struct D3D11_FEATURE_DATA_THREADING
{
    BOOL DriverConcurrentCreates;
    BOOL DriverCommandLists;
} D3D11_FEATURE_DATA_THREADING;

typedef struct D3D11_FEATURE_DATA_DOUBLES
{
    BOOL DoublePrecisionFloatShaderOps;
} D3D11_FEATURE_DATA_DOUBLES;

typedef struct D3D11_FEATURE_DATA_FORMAT_SUPPORT
{
    DXGI_FORMAT InFormat;
    UINT OutFormatSupport;
} D3D11_FEATURE_DATA_FORMAT_SUPPORT;

typedef struct D3D11_FEATURE_DATA_FORMAT_SUPPORT2
{
    DXGI_FORMAT InFormat;
    UINT OutFormatSupport2;
} D3D11_FEATURE_DATA_FORMAT_SUPPORT2;

typedef struct D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS
{
    BOOL ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x;
} D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS;


cpp_quote( "// =============================================================================" )
cpp_quote( "// In the D3D11_FEATURE_DATA_D3D11_OPTIONS struct below, " )
cpp_quote( "// the following groupings of capabilities will always be set identically. " )
cpp_quote( "// That is, all the BOOLs in a grouping will be TRUE or FALSE together. " )
cpp_quote( "//  " )
cpp_quote( "// Group: DiscardAPIsSeenByDriver, FlagsForUpdateAndCopySeenByDriver " )
cpp_quote( "//  " )
cpp_quote( "// Group: ClearView, CopyWithOverlap, ConstantBufferPartialUpdate " )
cpp_quote( "//        ConstantBufferOffsetting, MapNoOverwriteOnDynamicConstantBuffer " )
cpp_quote( "//  " )
cpp_quote( "// Group: MapNoOverwriteOnDynamicBufferSRV, ")
cpp_quote( "//        MultisampleRTVWithForcedSampleCountOne " )
cpp_quote( "//  " )
typedef struct D3D11_FEATURE_DATA_D3D11_OPTIONS
{
    BOOL OutputMergerLogicOp;
    BOOL UAVOnlyRenderingForcedSampleCount;

    BOOL DiscardAPIsSeenByDriver;
    BOOL FlagsForUpdateAndCopySeenByDriver;

    BOOL ClearView;
    BOOL CopyWithOverlap;
    BOOL ConstantBufferPartialUpdate;
    BOOL ConstantBufferOffsetting;
    BOOL MapNoOverwriteOnDynamicConstantBuffer;

    BOOL MapNoOverwriteOnDynamicBufferSRV;
    BOOL MultisampleRTVWithForcedSampleCountOne;

    BOOL SAD4ShaderInstructions;
    BOOL ExtendedDoublesShaderInstructions; 

    BOOL ExtendedResourceSharing;
} D3D11_FEATURE_DATA_D3D11_OPTIONS;

typedef struct D3D11_FEATURE_DATA_ARCHITECTURE_INFO
{
    BOOL TileBasedDeferredRenderer;
} D3D11_FEATURE_DATA_ARCHITECTURE_INFO;

typedef struct D3D11_FEATURE_DATA_D3D9_OPTIONS
{
    BOOL FullNonPow2TextureSupport;
} D3D11_FEATURE_DATA_D3D9_OPTIONS;

typedef struct D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT
{
    BOOL SupportsDepthAsTextureWithLessEqualComparisonFilter;
} D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT;

typedef enum D3D11_SHADER_MIN_PRECISION_SUPPORT
{
    D3D11_SHADER_MIN_PRECISION_10_BIT = 0x1,
    D3D11_SHADER_MIN_PRECISION_16_BIT = 0x2
} D3D11_SHADER_MIN_PRECISION_SUPPORT;

typedef struct D3D11_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT
{
    UINT PixelShaderMinPrecision; // D3D11_SHADER_MIN_PRECISION_SUPPORT flags for PS
    UINT AllOtherShaderStagesMinPrecision; // D3D11_SHADER_MIN_PRECISION_SUPPORT flags for other stages
} D3D11_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT;

typedef enum D3D11_TILED_RESOURCES_TIER
{
    D3D11_TILED_RESOURCES_NOT_SUPPORTED = 0,
    D3D11_TILED_RESOURCES_TIER_1 = 1,
    D3D11_TILED_RESOURCES_TIER_2 = 2,
    D3D11_TILED_RESOURCES_TIER_3 = 3,
} D3D11_TILED_RESOURCES_TIER;

typedef struct D3D11_FEATURE_DATA_D3D11_OPTIONS1
{
    D3D11_TILED_RESOURCES_TIER TiledResourcesTier;
    BOOL MinMaxFiltering;
    BOOL ClearViewAlsoSupportsDepthOnlyFormats;
    BOOL MapOnDefaultBuffers;
} D3D11_FEATURE_DATA_D3D11_OPTIONS1;

typedef struct D3D11_FEATURE_DATA_D3D9_SIMPLE_INSTANCING_SUPPORT
{
    BOOL SimpleInstancingSupported;
} D3D11_FEATURE_DATA_D3D9_SIMPLE_INSTANCING_SUPPORT;

typedef struct D3D11_FEATURE_DATA_MARKER_SUPPORT
{
    BOOL Profile;
} D3D11_FEATURE_DATA_MARKER_SUPPORT;

typedef struct D3D11_FEATURE_DATA_D3D9_OPTIONS1
{
    BOOL FullNonPow2TextureSupported;
    BOOL DepthAsTextureWithLessEqualComparisonFilterSupported;
    BOOL SimpleInstancingSupported;
    BOOL TextureCubeFaceRenderTargetWithNonCubeDepthStencilSupported;
} D3D11_FEATURE_DATA_D3D9_OPTIONS1;

typedef enum D3D11_CONSERVATIVE_RASTERIZATION_TIER { 
  D3D11_CONSERVATIVE_RASTERIZATION_NOT_SUPPORTED  = 0,
  D3D11_CONSERVATIVE_RASTERIZATION_TIER_1         = 1,
  D3D11_CONSERVATIVE_RASTERIZATION_TIER_2         = 2,
  D3D11_CONSERVATIVE_RASTERIZATION_TIER_3         = 3,
} D3D11_CONSERVATIVE_RASTERIZATION_TIER;


typedef struct D3D11_FEATURE_DATA_D3D11_OPTIONS2
{
    BOOL PSSpecifiedStencilRefSupported;
    BOOL TypedUAVLoadAdditionalFormats;
    BOOL ROVsSupported;
    D3D11_CONSERVATIVE_RASTERIZATION_TIER ConservativeRasterizationTier;
    D3D11_TILED_RESOURCES_TIER TiledResourcesTier;
    BOOL MapOnDefaultTextures;
    BOOL StandardSwizzle;
    BOOL UnifiedMemoryArchitecture;
} D3D11_FEATURE_DATA_D3D11_OPTIONS2;


typedef struct D3D11_FEATURE_DATA_D3D11_OPTIONS3
{
    BOOL VPAndRTArrayIndexFromAnyShaderFeedingRasterizer;
} D3D11_FEATURE_DATA_D3D11_OPTIONS3;

typedef struct D3D11_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT
{
    UINT MaxGPUVirtualAddressBitsPerResource;
    UINT MaxGPUVirtualAddressBitsPerProcess;
} D3D11_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT;

typedef enum D3D11_SHADER_CACHE_SUPPORT_FLAGS
{
    D3D11_SHADER_CACHE_SUPPORT_NONE                     = 0x0,
    D3D11_SHADER_CACHE_SUPPORT_AUTOMATIC_INPROC_CACHE   = 0x1,
    D3D11_SHADER_CACHE_SUPPORT_AUTOMATIC_DISK_CACHE     = 0x2,
} D3D11_SHADER_CACHE_SUPPORT_FLAGS;

typedef struct D3D11_FEATURE_DATA_SHADER_CACHE
{
    UINT SupportFlags;
} D3D11_FEATURE_DATA_SHADER_CACHE;

typedef enum D3D11_SHARED_RESOURCE_TIER
{
    D3D11_SHARED_RESOURCE_TIER_0,
    D3D11_SHARED_RESOURCE_TIER_1,
    D3D11_SHARED_RESOURCE_TIER_2,
    D3D11_SHARED_RESOURCE_TIER_3,
} D3D11_SHARED_RESOURCE_TIER;

typedef struct D3D11_FEATURE_DATA_DISPLAYABLE
{
    BOOL DisplayableTexture;
    D3D11_SHARED_RESOURCE_TIER SharedResourceTier;
} D3D11_FEATURE_DATA_DISPLAYABLE;

typedef struct D3D11_FEATURE_DATA_D3D11_OPTIONS5
{
    D3D11_SHARED_RESOURCE_TIER SharedResourceTier;
} D3D11_FEATURE_DATA_D3D11_OPTIONS5;

typedef enum D3D11_SHADER_ACCESS_RESTRICTED_RESOURCE_TIER
{
    D3D11_SHADER_ACCESS_RESTRICTED_RESOURCE_TIER_0         = 0,
    D3D11_SHADER_ACCESS_RESTRICTED_RESOURCE_TIER_1         = 1,
} D3D11_SHADER_ACCESS_RESTRICTED_RESOURCE_TIER;

typedef struct D3D11_FEATURE_DATA_D3D11_OPTIONS6
{
    D3D11_SHADER_ACCESS_RESTRICTED_RESOURCE_TIER ShaderAccessRestrictedResourceTier;
} D3D11_FEATURE_DATA_D3D11_OPTIONS6;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// DeviceContext
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[ uuid( c0bfa96c-e089-44fb-8eaf-26f8796190da ), object, local, pointer_default( unique ) ]
interface ID3D11DeviceContext
    : ID3D11DeviceChild
{
    // !!! Order of functions is in decreasing order of priority ( as far as performance is concerned ) !!!
    // !!! BEGIN HIGH-FREQUENCY !!!
    void VSSetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_In_reads_opt_(NumBuffers)")] ID3D11Buffer*const* ppConstantBuffers );
    void PSSetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_In_reads_opt_(NumViews)")] ID3D11ShaderResourceView*const* ppShaderResourceViews );
    void PSSetShader(
        [annotation("_In_opt_")] ID3D11PixelShader* pPixelShader,
        [annotation("_In_reads_opt_(NumClassInstances)")] ID3D11ClassInstance*const* ppClassInstances,
        UINT NumClassInstances );
    void PSSetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_In_reads_opt_(NumSamplers)")] ID3D11SamplerState*const* ppSamplers );
    void VSSetShader(
        [annotation("_In_opt_")] ID3D11VertexShader* pVertexShader,
        [annotation("_In_reads_opt_(NumClassInstances)")] ID3D11ClassInstance*const* ppClassInstances,
        UINT NumClassInstances );
    void DrawIndexed(
        [annotation("_In_")] UINT IndexCount,
        [annotation("_In_")] UINT StartIndexLocation,
        [annotation("_In_")] INT BaseVertexLocation );
    void Draw(
        [annotation("_In_")] UINT VertexCount,
        [annotation("_In_")] UINT StartVertexLocation );
    HRESULT Map(
        [annotation("_In_")] ID3D11Resource* pResource,
        [annotation("_In_")] UINT Subresource,
        [annotation("_In_")] D3D11_MAP MapType,
        [annotation("_In_")] UINT MapFlags,
        [annotation("_Out_opt_")] D3D11_MAPPED_SUBRESOURCE* pMappedResource );
    void Unmap(
        [annotation("_In_")] ID3D11Resource* pResource,
        [annotation("_In_")] UINT Subresource );
    void PSSetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_In_reads_opt_(NumBuffers)")] ID3D11Buffer*const* ppConstantBuffers );
    void IASetInputLayout( [annotation("_In_opt_")] ID3D11InputLayout* pInputLayout );
    void IASetVertexBuffers(
        [annotation("_In_range_( 0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_In_reads_opt_(NumBuffers)")] ID3D11Buffer*const* ppVertexBuffers,
        [annotation("_In_reads_opt_(NumBuffers)")] const UINT* pStrides,
        [annotation("_In_reads_opt_(NumBuffers)")] const UINT* pOffsets );
    void IASetIndexBuffer(
        [annotation("_In_opt_")] ID3D11Buffer* pIndexBuffer,
        [annotation("_In_")] DXGI_FORMAT  Format,
        [annotation("_In_")] UINT Offset );
    // !!! END HIGH-FREQUENCY !!!

    // !!! Order of functions is in decreasing order of priority ( as far as performance is concerned ) !!!
    // !!! BEGIN MIDDLE-FREQUENCY !!!
    void DrawIndexedInstanced(
        [annotation("_In_")] UINT IndexCountPerInstance,
        [annotation("_In_")] UINT InstanceCount,
        [annotation("_In_")] UINT StartIndexLocation,
        [annotation("_In_")] INT BaseVertexLocation,
        [annotation("_In_")] UINT StartInstanceLocation );
    void DrawInstanced(
        [annotation("_In_")] UINT VertexCountPerInstance,
        [annotation("_In_")] UINT InstanceCount,
        [annotation("_In_")] UINT StartVertexLocation,
        [annotation("_In_")] UINT StartInstanceLocation );
    void GSSetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_In_reads_opt_(NumBuffers)")] ID3D11Buffer*const* ppConstantBuffers );
    void GSSetShader(
        [annotation("_In_opt_")] ID3D11GeometryShader* pShader,
        [annotation("_In_reads_opt_(NumClassInstances)")] ID3D11ClassInstance*const* ppClassInstances,
        UINT NumClassInstances );
    void IASetPrimitiveTopology( [annotation("_In_")] D3D11_PRIMITIVE_TOPOLOGY Topology );
    void VSSetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_In_reads_opt_(NumViews)")] ID3D11ShaderResourceView*const* ppShaderResourceViews );
    void VSSetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_In_reads_opt_(NumSamplers)")] ID3D11SamplerState*const* ppSamplers );
    void Begin( [annotation("_In_")] ID3D11Asynchronous* pAsync );
    void End( [annotation("_In_")] ID3D11Asynchronous* pAsync );
    HRESULT GetData(
        [annotation("_In_")] ID3D11Asynchronous* pAsync,
        [annotation("_Out_writes_bytes_opt_( DataSize )")] void* pData,
        [annotation("_In_")] UINT DataSize,
        [annotation("_In_")] UINT GetDataFlags );
    void SetPredication(
        [annotation("_In_opt_")] ID3D11Predicate* pPredicate,
        [annotation("_In_")] BOOL PredicateValue );
    void GSSetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_In_reads_opt_(NumViews)")] ID3D11ShaderResourceView*const* ppShaderResourceViews );
    void GSSetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_In_reads_opt_(NumSamplers)")] ID3D11SamplerState*const* ppSamplers );
    void OMSetRenderTargets(
        [annotation("_In_range_( 0, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT )")] UINT NumViews,
        [annotation("_In_reads_opt_(NumViews)")] ID3D11RenderTargetView*const* ppRenderTargetViews,
        [annotation("_In_opt_")] ID3D11DepthStencilView* pDepthStencilView );
    void OMSetRenderTargetsAndUnorderedAccessViews(
        [annotation("_In_")] UINT NumRTVs,
        [annotation("_In_reads_opt_(NumRTVs)")] ID3D11RenderTargetView*const* ppRenderTargetViews,
        [annotation("_In_opt_")] ID3D11DepthStencilView* pDepthStencilView,
        [annotation("_In_range_( 0, D3D11_1_UAV_SLOT_COUNT - 1 )")] UINT UAVStartSlot,
        [annotation("_In_")] UINT NumUAVs,
        [annotation("_In_reads_opt_(NumUAVs)")] ID3D11UnorderedAccessView*const* ppUnorderedAccessViews,
        [annotation("_In_reads_opt_(NumUAVs)")] const UINT* pUAVInitialCounts );
    void OMSetBlendState( 
        [annotation("_In_opt_")] ID3D11BlendState *pBlendState,
        [annotation("_In_opt_")] const FLOAT BlendFactor[ 4 ],
        [annotation("_In_")] UINT SampleMask );
    void OMSetDepthStencilState( 
        [annotation("_In_opt_")] ID3D11DepthStencilState* pDepthStencilState,
        [annotation("_In_")] UINT StencilRef );
    void SOSetTargets(
        [annotation("_In_range_( 0, D3D11_SO_BUFFER_SLOT_COUNT)")] UINT NumBuffers,
        [annotation("_In_reads_opt_(NumBuffers)")] ID3D11Buffer*const* ppSOTargets,
        [annotation("_In_reads_opt_(NumBuffers)")] const UINT* pOffsets );
    void DrawAuto();
    void DrawIndexedInstancedIndirect(
        [annotation("_In_")] ID3D11Buffer* pBufferForArgs,
        [annotation("_In_")] UINT AlignedByteOffsetForArgs );
    void DrawInstancedIndirect(
        [annotation("_In_")] ID3D11Buffer* pBufferForArgs,
        [annotation("_In_")] UINT AlignedByteOffsetForArgs );
    void Dispatch(
        [annotation("_In_")] UINT ThreadGroupCountX,
        [annotation("_In_")] UINT ThreadGroupCountY,
        [annotation("_In_")] UINT ThreadGroupCountZ );
    void DispatchIndirect(
        [annotation("_In_")] ID3D11Buffer* pBufferForArgs,
        [annotation("_In_")] UINT AlignedByteOffsetForArgs );
    void RSSetState( [annotation("_In_opt_")] ID3D11RasterizerState* pRasterizerState );
    void RSSetViewports(
        [annotation("_In_range_(0, D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE)")] UINT NumViewports,
        [annotation("_In_reads_opt_(NumViewports)")] const D3D11_VIEWPORT* pViewports );
    void RSSetScissorRects(
        [annotation("_In_range_(0, D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE)")] UINT NumRects,
        [annotation("_In_reads_opt_(NumRects)")] const D3D11_RECT* pRects );
    void CopySubresourceRegion(
        [annotation("_In_")] ID3D11Resource* pDstResource,
        [annotation("_In_")] UINT DstSubresource,
        [annotation("_In_")] UINT DstX,
        [annotation("_In_")] UINT DstY,
        [annotation("_In_")] UINT DstZ,
        [annotation("_In_")] ID3D11Resource* pSrcResource,
        [annotation("_In_")] UINT SrcSubresource,
        [annotation("_In_opt_")] const D3D11_BOX* pSrcBox );
    void CopyResource(
        [annotation("_In_")] ID3D11Resource* pDstResource,
        [annotation("_In_")] ID3D11Resource* pSrcResource );
    void UpdateSubresource(
        [annotation("_In_")] ID3D11Resource* pDstResource,
        [annotation("_In_")] UINT DstSubresource,
        [annotation("_In_opt_")] const D3D11_BOX* pDstBox,
        [annotation("_In_")] const void* pSrcData,
        [annotation("_In_")] UINT SrcRowPitch,
        [annotation("_In_")] UINT SrcDepthPitch );
    void CopyStructureCount(
        [annotation("_In_")] ID3D11Buffer* pDstBuffer,
        [annotation("_In_")] UINT DstAlignedByteOffset,
        [annotation("_In_")] ID3D11UnorderedAccessView* pSrcView );
    void ClearRenderTargetView(
        [annotation("_In_")] ID3D11RenderTargetView* pRenderTargetView,
        [annotation("_In_")] const FLOAT ColorRGBA[ 4 ] );
    void ClearUnorderedAccessViewUint(
        [annotation("_In_")] ID3D11UnorderedAccessView* pUnorderedAccessView,
        [annotation("_In_")] const UINT Values[4] );
    void ClearUnorderedAccessViewFloat(
        [annotation("_In_")] ID3D11UnorderedAccessView* pUnorderedAccessView,
        [annotation("_In_")] const FLOAT Values[4] );
    void ClearDepthStencilView(
        [annotation("_In_")] ID3D11DepthStencilView* pDepthStencilView,
        [annotation("_In_")] UINT ClearFlags,
        [annotation("_In_")] FLOAT Depth,
        [annotation("_In_")] UINT8 Stencil );
    void GenerateMips( [annotation("_In_")] ID3D11ShaderResourceView* pShaderResourceView );
    void SetResourceMinLOD( [annotation("_In_")] ID3D11Resource* pResource, FLOAT MinLOD );
    FLOAT GetResourceMinLOD( [annotation("_In_")] ID3D11Resource* pResource );
    void ResolveSubresource(
        [annotation("_In_")] ID3D11Resource* pDstResource,
        [annotation("_In_")] UINT DstSubresource,
        [annotation("_In_")] ID3D11Resource* pSrcResource,
        [annotation("_In_")] UINT SrcSubresource,
        [annotation("_In_")] DXGI_FORMAT Format );
    void ExecuteCommandList(
        [annotation("_In_")] ID3D11CommandList* pCommandList,
        BOOL RestoreContextState );
    void HSSetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_In_reads_opt_(NumViews)")] ID3D11ShaderResourceView*const* ppShaderResourceViews );
    void HSSetShader(
        [annotation("_In_opt_")] ID3D11HullShader* pHullShader,
        [annotation("_In_reads_opt_(NumClassInstances)")] ID3D11ClassInstance*const* ppClassInstances,
        UINT NumClassInstances );
    void HSSetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_In_reads_opt_(NumSamplers)")] ID3D11SamplerState*const* ppSamplers );
    void HSSetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_In_reads_opt_(NumBuffers)")] ID3D11Buffer*const* ppConstantBuffers );
    void DSSetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_In_reads_opt_(NumViews)")] ID3D11ShaderResourceView*const* ppShaderResourceViews );
    void DSSetShader(
        [annotation("_In_opt_")] ID3D11DomainShader* pDomainShader,
        [annotation("_In_reads_opt_(NumClassInstances)")] ID3D11ClassInstance*const* ppClassInstances,
        UINT NumClassInstances );
    void DSSetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_In_reads_opt_(NumSamplers)")] ID3D11SamplerState*const* ppSamplers );
    void DSSetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_In_reads_opt_(NumBuffers)")] ID3D11Buffer*const* ppConstantBuffers );
    void CSSetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_In_reads_opt_(NumViews)")] ID3D11ShaderResourceView*const* ppShaderResourceViews );
    void CSSetUnorderedAccessViews(
        [annotation("_In_range_( 0, D3D11_1_UAV_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_1_UAV_SLOT_COUNT - StartSlot )")] UINT NumUAVs,
        [annotation("_In_reads_opt_(NumUAVs)")] ID3D11UnorderedAccessView*const* ppUnorderedAccessViews,
        [annotation("_In_reads_opt_(NumUAVs)")] const UINT* pUAVInitialCounts );
    void CSSetShader(
        [annotation("_In_opt_")] ID3D11ComputeShader* pComputeShader,
        [annotation("_In_reads_opt_(NumClassInstances)")] ID3D11ClassInstance*const* ppClassInstances,
        UINT NumClassInstances );
    void CSSetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_In_reads_opt_(NumSamplers)")] ID3D11SamplerState*const* ppSamplers );
    void CSSetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_In_reads_opt_(NumBuffers)")] ID3D11Buffer*const* ppConstantBuffers );

// GET functions
    void VSGetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_Out_writes_opt_(NumBuffers)")] ID3D11Buffer** ppConstantBuffers );
    void PSGetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_Out_writes_opt_(NumViews)")] ID3D11ShaderResourceView** ppShaderResourceViews );
    void PSGetShader(
        [annotation("_Outptr_result_maybenull_")] ID3D11PixelShader** ppPixelShader,
        [annotation("_Out_writes_opt_(*pNumClassInstances)")] ID3D11ClassInstance** ppClassInstances,
        [annotation("_Inout_opt_")] UINT* pNumClassInstances);
    void PSGetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_Out_writes_opt_(NumSamplers)")] ID3D11SamplerState** ppSamplers );
    void VSGetShader(
        [annotation("_Outptr_result_maybenull_")] ID3D11VertexShader** ppVertexShader,
        [annotation("_Out_writes_opt_(*pNumClassInstances)")] ID3D11ClassInstance** ppClassInstances,
        [annotation("_Inout_opt_")] UINT* pNumClassInstances);
    void PSGetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_Out_writes_opt_(NumBuffers)")] ID3D11Buffer** ppConstantBuffers );
    void IAGetInputLayout( [annotation("_Outptr_result_maybenull_")] ID3D11InputLayout** ppInputLayout );
    void IAGetVertexBuffers(
        [annotation("_In_range_( 0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_Out_writes_opt_(NumBuffers)")] ID3D11Buffer** ppVertexBuffers,
        [annotation("_Out_writes_opt_(NumBuffers)")] UINT* pStrides,
        [annotation("_Out_writes_opt_(NumBuffers)")] UINT* pOffsets );
    void IAGetIndexBuffer(
        [annotation("_Outptr_opt_result_maybenull_")] ID3D11Buffer** pIndexBuffer,
        [annotation("_Out_opt_")] DXGI_FORMAT* Format,
        [annotation("_Out_opt_")] UINT* Offset );
    void GSGetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_Out_writes_opt_(NumBuffers)")] ID3D11Buffer** ppConstantBuffers );
    void GSGetShader(
        [annotation("_Outptr_result_maybenull_")] ID3D11GeometryShader** ppGeometryShader,
        [annotation("_Out_writes_opt_(*pNumClassInstances)")] ID3D11ClassInstance** ppClassInstances,
        [annotation("_Inout_opt_")] UINT* pNumClassInstances);
    void IAGetPrimitiveTopology( [annotation("_Out_")] D3D11_PRIMITIVE_TOPOLOGY* pTopology );
    void VSGetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_Out_writes_opt_(NumViews)")] ID3D11ShaderResourceView** ppShaderResourceViews );
    void VSGetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_Out_writes_opt_(NumSamplers)")] ID3D11SamplerState** ppSamplers );
    void GetPredication(
        [annotation("_Outptr_opt_result_maybenull_")] ID3D11Predicate** ppPredicate,
        [annotation("_Out_opt_")] BOOL* pPredicateValue );
    void GSGetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_Out_writes_opt_(NumViews)")] ID3D11ShaderResourceView** ppShaderResourceViews );
    void GSGetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_Out_writes_opt_(NumSamplers)")] ID3D11SamplerState** ppSamplers );
    void OMGetRenderTargets(
        [annotation("_In_range_( 0, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT )")] UINT NumViews,
        [annotation("_Out_writes_opt_(NumViews)")] ID3D11RenderTargetView** ppRenderTargetViews,
        [annotation("_Outptr_opt_result_maybenull_")] ID3D11DepthStencilView** ppDepthStencilView );
    void OMGetRenderTargetsAndUnorderedAccessViews(
        [annotation("_In_range_( 0, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT )")] UINT NumRTVs,
        [annotation("_Out_writes_opt_(NumRTVs)")] ID3D11RenderTargetView** ppRenderTargetViews,
        [annotation("_Outptr_opt_result_maybenull_")] ID3D11DepthStencilView** ppDepthStencilView,
        [annotation("_In_range_( 0, D3D11_PS_CS_UAV_REGISTER_COUNT - 1 )")] UINT UAVStartSlot,
        [annotation("_In_range_( 0, D3D11_PS_CS_UAV_REGISTER_COUNT - UAVStartSlot )")] UINT NumUAVs,
        [annotation("_Out_writes_opt_(NumUAVs)")] ID3D11UnorderedAccessView** ppUnorderedAccessViews );
    void OMGetBlendState( 
        [annotation("_Outptr_opt_result_maybenull_")] ID3D11BlendState** ppBlendState,
        [annotation("_Out_opt_")] FLOAT BlendFactor[ 4 ], //4
        [annotation("_Out_opt_")] UINT* pSampleMask);
    void OMGetDepthStencilState(
        [annotation("_Outptr_opt_result_maybenull_")] ID3D11DepthStencilState** ppDepthStencilState,
        [annotation("_Out_opt_")] UINT* pStencilRef );
    void SOGetTargets(
        [annotation("_In_range_( 0, D3D11_SO_BUFFER_SLOT_COUNT )")] UINT NumBuffers,
        [annotation("_Out_writes_opt_(NumBuffers)")] ID3D11Buffer** ppSOTargets );
    void RSGetState( [annotation("_Outptr_result_maybenull_")] ID3D11RasterizerState** ppRasterizerState );
    void RSGetViewports(
        [annotation("_Inout_ /*_range(0, D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE )*/ ")] UINT* pNumViewports,
        [annotation("_Out_writes_opt_(*pNumViewports)")] D3D11_VIEWPORT* pViewports );
    void RSGetScissorRects(
        [annotation("_Inout_ /*_range(0, D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE )*/ ")] UINT* pNumRects,
        [annotation("_Out_writes_opt_(*pNumRects)")] D3D11_RECT* pRects );
    void HSGetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_Out_writes_opt_(NumViews)")] ID3D11ShaderResourceView** ppShaderResourceViews );
    void HSGetShader(
        [annotation("_Outptr_result_maybenull_")] ID3D11HullShader** ppHullShader,
        [annotation("_Out_writes_opt_(*pNumClassInstances)")] ID3D11ClassInstance** ppClassInstances,
        [annotation("_Inout_opt_")] UINT* pNumClassInstances);
    void HSGetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_Out_writes_opt_(NumSamplers)")] ID3D11SamplerState** ppSamplers );
    void HSGetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_Out_writes_opt_(NumBuffers)")] ID3D11Buffer** ppConstantBuffers );
    void DSGetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_Out_writes_opt_(NumViews)")] ID3D11ShaderResourceView** ppShaderResourceViews );
    void DSGetShader(
        [annotation("_Outptr_result_maybenull_")] ID3D11DomainShader** ppDomainShader,
        [annotation("_Out_writes_opt_(*pNumClassInstances)")] ID3D11ClassInstance** ppClassInstances,
        [annotation("_Inout_opt_")] UINT* pNumClassInstances);
    void DSGetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_Out_writes_opt_(NumSamplers)")] ID3D11SamplerState** ppSamplers );
    void DSGetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_Out_writes_opt_(NumBuffers)")] ID3D11Buffer** ppConstantBuffers );
    void CSGetShaderResources(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT - StartSlot )")] UINT NumViews,
        [annotation("_Out_writes_opt_(NumViews)")] ID3D11ShaderResourceView** ppShaderResourceViews );
    void CSGetUnorderedAccessViews(
        [annotation("_In_range_( 0, D3D11_1_UAV_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_1_UAV_SLOT_COUNT - StartSlot )")] UINT NumUAVs,
        [annotation("_Out_writes_opt_(NumUAVs)")] ID3D11UnorderedAccessView** ppUnorderedAccessViews );
    void CSGetShader(
        [annotation("_Outptr_result_maybenull_")] ID3D11ComputeShader** ppComputeShader,
        [annotation("_Out_writes_opt_(*pNumClassInstances)")] ID3D11ClassInstance** ppClassInstances,
        [annotation("_Inout_opt_")] UINT* pNumClassInstances);
    void CSGetSamplers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT - StartSlot )")] UINT NumSamplers,
        [annotation("_Out_writes_opt_(NumSamplers)")] ID3D11SamplerState** ppSamplers );
    void CSGetConstantBuffers(
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1 )")] UINT StartSlot,
        [annotation("_In_range_( 0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot )")] UINT NumBuffers,
        [annotation("_Out_writes_opt_(NumBuffers)")] ID3D11Buffer** ppConstantBuffers );
// /GET functions

    void ClearState();
    void Flush();
    // !!! END MIDDLE-FREQUENCY !!!

    // !!! Order of functions is in decreasing order of priority ( as far as performance is concerned ) !!!
    // !!! BEGIN LOW-FREQUENCY !!!
    D3D11_DEVICE_CONTEXT_TYPE GetType();
    UINT GetContextFlags();
    HRESULT FinishCommandList(
        BOOL RestoreDeferredContextState,
        [annotation("_COM_Outptr_opt_")] ID3D11CommandList** ppCommandList );
    
    // !!! END LOW-FREQUENCY !!!
};

cpp_quote( "#if !defined( D3D11_VIDEO_NO_HELPERS ) && defined( __cplusplus )" )
cpp_quote( "}" ) // extern C
cpp_quote( "struct CD3D11_VIDEO_DEFAULT {};" )
cpp_quote( "extern const DECLSPEC_SELECTANY CD3D11_VIDEO_DEFAULT D3D11_VIDEO_DEFAULT;" )
cpp_quote( "extern \"C\"{" )
cpp_quote( "#endif" )

interface ID3D11VideoDecoderOutputView;
interface ID3D11VideoProcessorInputView;

cpp_quote("#if !defined(APP_DEPRECATED_HRESULT) && !defined(APP_DEPRECATED_HRESULT_TYPEDEF)")
cpp_quote("#define APP_DEPRECATED_HRESULT_TYPEDEF")
typedef HRESULT APP_DEPRECATED_HRESULT;
cpp_quote("#endif")

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// VideoDecoder
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MPEG2_MOCOMP,      0xe6a9f44b, 0x61b0, 0x4563,0x9e,0xa4,0x63,0xd2,0xa3,0xc6,0xfe,0x66);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MPEG2_IDCT,        0xbf22ad00, 0x03ea, 0x4690,0x80,0x77,0x47,0x33,0x46,0x20,0x9b,0x7e);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MPEG2_VLD,         0xee27417f, 0x5e28, 0x4e65,0xbe,0xea,0x1d,0x26,0xb5,0x08,0xad,0xc9);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MPEG1_VLD,         0x6f3ec719, 0x3735, 0x42cc,0x80,0x63,0x65,0xcc,0x3c,0xb3,0x66,0x16);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MPEG2and1_VLD,     0x86695f12, 0x340e, 0x4f04,0x9f,0xd3,0x92,0x53,0xdd,0x32,0x74,0x60);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_MOCOMP_NOFGT, 0x1b81be64, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_MOCOMP_FGT,   0x1b81be65, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_IDCT_NOFGT,   0x1b81be66, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_IDCT_FGT,     0x1b81be67, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_VLD_NOFGT,    0x1b81be68, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_VLD_FGT,      0x1b81be69, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_VLD_WITHFMOASO_NOFGT,  0xd5f04ff9, 0x3418,0x45d8,0x95,0x61,0x32,0xa7,0x6a,0xae,0x2d,0xdd);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_VLD_STEREO_PROGRESSIVE_NOFGT, 0xd79be8da, 0x0cf1,0x4c81,0xb8,0x2a,0x69,0xa4,0xe2,0x36,0xf4,0x3d);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_VLD_STEREO_NOFGT,             0xf9aaccbb, 0xc2b6,0x4cfc,0x87,0x79,0x57,0x07,0xb1,0x76,0x05,0x52);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_H264_VLD_MULTIVIEW_NOFGT,          0x705b9d82, 0x76cf,0x49d6,0xb7,0xe6,0xac,0x88,0x72,0xdb,0x01,0x3c);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_WMV8_POSTPROC,     0x1b81be80, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_WMV8_MOCOMP,       0x1b81be81, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_WMV9_POSTPROC,     0x1b81be90, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_WMV9_MOCOMP,       0x1b81be91, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_WMV9_IDCT,         0x1b81be94, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_VC1_POSTPROC,      0x1b81beA0, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_VC1_MOCOMP,        0x1b81beA1, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_VC1_IDCT,          0x1b81beA2, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_VC1_VLD,           0x1b81beA3, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_VC1_D2010,         0x1b81beA4, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MPEG4PT2_VLD_SIMPLE,           0xefd64d74, 0xc9e8,0x41d7,0xa5,0xe9,0xe9,0xb0,0xe3,0x9f,0xa3,0x19);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MPEG4PT2_VLD_ADVSIMPLE_NOGMC,  0xed418a9f, 0x010d,0x4eda,0x9a,0xe3,0x9a,0x65,0x35,0x8d,0x8d,0x2e);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MPEG4PT2_VLD_ADVSIMPLE_GMC,    0xab998b5b, 0x4258,0x44a9,0x9f,0xeb,0x94,0xe5,0x97,0xa6,0xba,0xae);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN,     0x5b11d51b, 0x2f4c,0x4452,0xbc,0xc3,0x09,0xf2,0xa1,0x16,0x0c,0xc0);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10,   0x107af0e0, 0xef1a,0x4d19,0xab,0xa8,0x67,0xa1,0x63,0x07,0x3d,0x13);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MONOCHROME,   0x0685b993, 0x3d8c, 0x43a0, 0x8b, 0x28, 0xd7, 0x4c, 0x2d, 0x68, 0x99, 0xa4);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MONOCHROME10, 0x142a1d0f, 0x69dd, 0x4ec9, 0x85, 0x91, 0xb1, 0x2f, 0xfc, 0xb9, 0x1a, 0x29);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12,     0x1a72925f, 0x0c2c, 0x4f15, 0x96, 0xfb, 0xb1, 0x7d, 0x14, 0x73, 0x60, 0x3f);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_422, 0x0bac4fe5, 0x1532, 0x4429, 0xa8, 0x54, 0xf8, 0x4d, 0xe0, 0x49, 0x53, 0xdb);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_422, 0x55bcac81, 0xf311, 0x4093, 0xa7, 0xd0, 0x1c, 0xbc, 0x0b, 0x84, 0x9b, 0xee);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN_444,   0x4008018f, 0xf537, 0x4b36, 0x98, 0xcf, 0x61, 0xaf, 0x8a, 0x2c, 0x1a, 0x33);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_EXT, 0x9cc55490, 0xe37c, 0x4932, 0x86, 0x84, 0x49, 0x20, 0xf9, 0xf6, 0x40, 0x9c);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10_444, 0x0dabeffa, 0x4458, 0x4602, 0xbc, 0x03, 0x07, 0x95, 0x65, 0x9d, 0x61, 0x7c);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN12_444, 0x9798634d, 0xfe9d, 0x48e5, 0xb4, 0xda, 0xdb, 0xec, 0x45, 0xb3, 0xdf, 0x01);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN16,     0xa4fbdbb0, 0xa113, 0x482b, 0xa2, 0x32, 0x63, 0x5c, 0xc0, 0x69, 0x7f, 0x6d);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0,       0x463707f8, 0xa1d0, 0x4585, 0x87, 0x6d, 0x83, 0xaa, 0x6d, 0x60, 0xb8, 0x9e);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_VP9_VLD_10BIT_PROFILE2, 0xa4c749ef, 0x6ecf, 0x48aa, 0x84, 0x48, 0x50, 0xa7, 0xa1, 0x16, 0x5f, 0xf7);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_VP8_VLD,                0x90b899ea, 0x3a62, 0x4705, 0x88, 0xb3, 0x8d, 0xf0, 0x4b, 0x27, 0x44, 0xe7);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_AV1_VLD_PROFILE0,           0xb8be4ccb, 0xcf53, 0x46ba, 0x8d, 0x59, 0xd6, 0xb8, 0xa6, 0xda, 0x5d, 0x2a);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_AV1_VLD_PROFILE1,           0x6936ff0f, 0x45b1, 0x4163, 0x9c, 0xc1, 0x64, 0x6e, 0xf6, 0x94, 0x61, 0x08);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_AV1_VLD_PROFILE2,           0x0c5f2aa1, 0xe541, 0x4089, 0xbb, 0x7b, 0x98, 0x11, 0x0a, 0x19, 0xd7, 0xc8);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_AV1_VLD_12BIT_PROFILE2,     0x17127009, 0xa00f, 0x4ce1, 0x99, 0x4e, 0xbf, 0x40, 0x81, 0xf6, 0xf3, 0xf0);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_AV1_VLD_12BIT_PROFILE2_420, 0x2d80bed6, 0x9cac, 0x4835, 0x9e, 0x91, 0x32, 0x7b, 0xbc, 0x4f, 0x9e, 0xe8);")

cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MJPEG_VLD_420,  0x725cb506, 0x0c29, 0x43c4, 0x94, 0x40, 0x8e, 0x93, 0x97, 0x90, 0x3a, 0x04);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MJPEG_VLD_422,  0x5b77b9cd, 0x1a35, 0x4c30, 0x9f, 0xd8, 0xef, 0x4b, 0x60, 0xc0, 0x35, 0xdd);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MJPEG_VLD_444,  0xd95161f9, 0x0d44, 0x47e6, 0xbc, 0xf5, 0x1b, 0xfb, 0xfb, 0x26, 0x8f, 0x97);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_MJPEG_VLD_4444, 0xc91748d5, 0xfd18, 0x4aca, 0x9d, 0xb3, 0x3a, 0x66, 0x34, 0xab, 0x54, 0x7d);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_JPEG_VLD_420,   0xcf782c83, 0xbef5, 0x4a2c, 0x87, 0xcb, 0x60, 0x19, 0xe7, 0xb1, 0x75, 0xac);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_JPEG_VLD_422,   0xf04df417, 0xeee2, 0x4067, 0xa7, 0x78, 0xf3, 0x5c, 0x15, 0xab, 0x97, 0x21);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_PROFILE_JPEG_VLD_444,   0x4cd00e17, 0x89ba, 0x48ef, 0xb9, 0xf9, 0xed, 0xcb, 0x82, 0x71, 0x3f, 0x65);")

typedef struct D3D11_VIDEO_DECODER_DESC
{

    GUID        Guid;
    UINT        SampleWidth;
    UINT        SampleHeight;
    DXGI_FORMAT OutputFormat;
} D3D11_VIDEO_DECODER_DESC;

typedef struct D3D11_VIDEO_DECODER_CONFIG
{
    GUID guidConfigBitstreamEncryption;
    GUID guidConfigMBcontrolEncryption;
    GUID guidConfigResidDiffEncryption;
    UINT ConfigBitstreamRaw;
    UINT ConfigMBcontrolRasterOrder;
    UINT ConfigResidDiffHost;
    UINT ConfigSpatialResid8;
    UINT ConfigResid8Subtraction;
    UINT ConfigSpatialHost8or9Clipping;
    UINT ConfigSpatialResidInterleaved;
    UINT ConfigIntraResidUnsigned;
    UINT ConfigResidDiffAccelerator;
    UINT ConfigHostInverseScan;
    UINT ConfigSpecificIDCT;
    UINT Config4GroupedCoefs;
    USHORT ConfigMinRenderTargetBuffCount;
    USHORT ConfigDecoderSpecific;
} D3D11_VIDEO_DECODER_CONFIG;


typedef enum D3D11_VIDEO_DECODER_BUFFER_TYPE
{
    D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS               = 0,
    D3D11_VIDEO_DECODER_BUFFER_MACROBLOCK_CONTROL               = 1,
    D3D11_VIDEO_DECODER_BUFFER_RESIDUAL_DIFFERENCE              = 2,
    D3D11_VIDEO_DECODER_BUFFER_DEBLOCKING_CONTROL               = 3,
    D3D11_VIDEO_DECODER_BUFFER_INVERSE_QUANTIZATION_MATRIX      = 4,
    D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL                    = 5,
    D3D11_VIDEO_DECODER_BUFFER_BITSTREAM                        = 6,
    D3D11_VIDEO_DECODER_BUFFER_MOTION_VECTOR                    = 7,
    D3D11_VIDEO_DECODER_BUFFER_FILM_GRAIN                       = 8,
    D3D11_VIDEO_DECODER_BUFFER_HUFFMAN_TABLE                    = 9
} D3D11_VIDEO_DECODER_BUFFER_TYPE;

typedef struct _D3D11_AES_CTR_IV
{
    UINT64   IV;         // Big-Endian IV
    UINT64   Count;      // Big-Endian Block Count
} D3D11_AES_CTR_IV;

typedef struct D3D11_ENCRYPTED_BLOCK_INFO
{
    UINT NumEncryptedBytesAtBeginning;    
    UINT NumBytesInSkipPattern;
    UINT NumBytesInEncryptPattern;
} D3D11_ENCRYPTED_BLOCK_INFO;

typedef struct D3D11_VIDEO_DECODER_BUFFER_DESC
{
    D3D11_VIDEO_DECODER_BUFFER_TYPE BufferType;
    UINT BufferIndex;
    UINT DataOffset;
    UINT DataSize;
    UINT FirstMBaddress;
    UINT NumMBsInBuffer;
    UINT Width;
    UINT Height;
    UINT Stride;
    UINT ReservedBits;
    [annotation("_Field_size_opt_(IVSize)")] void* pIV;
    UINT IVSize;
    BOOL PartialEncryption;
    D3D11_ENCRYPTED_BLOCK_INFO EncryptedBlockInfo;
} D3D11_VIDEO_DECODER_BUFFER_DESC;

typedef struct D3D11_VIDEO_DECODER_EXTENSION
{
    UINT Function;
    [annotation("_Field_size_(PrivateInputDataSize)")] void* pPrivateInputData;
    UINT PrivateInputDataSize;
    [annotation("_Field_size_(PrivateOutputDataSize)")] void* pPrivateOutputData;
    UINT PrivateOutputDataSize;
    UINT ResourceCount;
    [annotation("_Field_size_opt_(ResourceCount)")] ID3D11Resource** ppResourceList;
} D3D11_VIDEO_DECODER_EXTENSION;

[ uuid( 3C9C5B51-995D-48d1-9B8D-FA5CAEDED65C ), object, local, pointer_default( unique ) ]
interface ID3D11VideoDecoder
    : ID3D11DeviceChild
{
    HRESULT GetCreationParameters( 
                [annotation("_Out_")] D3D11_VIDEO_DECODER_DESC* pVideoDesc,
                [annotation("_Out_")] D3D11_VIDEO_DECODER_CONFIG *pConfig );

    HRESULT GetDriverHandle( 
                [annotation("_Out_")] HANDLE* pDriverHandle );
};


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// VideoProcessorEnum
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

typedef enum D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT
{
    D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_INPUT = 0x00000001,
    D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_OUTPUT = 0x00000002,
} D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT;

typedef enum D3D11_VIDEO_PROCESSOR_DEVICE_CAPS
{
    D3D11_VIDEO_PROCESSOR_DEVICE_CAPS_LINEAR_SPACE            = 0x1,
    D3D11_VIDEO_PROCESSOR_DEVICE_CAPS_xvYCC                   = 0x2,
    D3D11_VIDEO_PROCESSOR_DEVICE_CAPS_RGB_RANGE_CONVERSION    = 0x4,
    D3D11_VIDEO_PROCESSOR_DEVICE_CAPS_YCbCr_MATRIX_CONVERSION = 0x8,
    D3D11_VIDEO_PROCESSOR_DEVICE_CAPS_NOMINAL_RANGE           = 0x10
} D3D11_VIDEO_PROCESSOR_DEVICE_CAPS;

typedef enum D3D11_VIDEO_PROCESSOR_FEATURE_CAPS
{
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_ALPHA_FILL             = 0x1,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_CONSTRICTION           = 0x2,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_LUMA_KEY               = 0x4,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_ALPHA_PALETTE          = 0x8,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_LEGACY                 = 0x10,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_STEREO                 = 0x20,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_ROTATION               = 0x40,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_ALPHA_STREAM           = 0x80,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_PIXEL_ASPECT_RATIO     = 0x100,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_MIRROR                 = 0x200,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_SHADER_USAGE           = 0x400,
    D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_METADATA_HDR10         = 0x800,
} D3D11_VIDEO_PROCESSOR_FEATURE_CAPS;

typedef enum D3D11_VIDEO_PROCESSOR_FILTER_CAPS
{
    D3D11_VIDEO_PROCESSOR_FILTER_CAPS_BRIGHTNESS         = 0x1,
    D3D11_VIDEO_PROCESSOR_FILTER_CAPS_CONTRAST           = 0x2,
    D3D11_VIDEO_PROCESSOR_FILTER_CAPS_HUE                = 0x4,
    D3D11_VIDEO_PROCESSOR_FILTER_CAPS_SATURATION         = 0x8,
    D3D11_VIDEO_PROCESSOR_FILTER_CAPS_NOISE_REDUCTION    = 0x10,
    D3D11_VIDEO_PROCESSOR_FILTER_CAPS_EDGE_ENHANCEMENT   = 0x20,
    D3D11_VIDEO_PROCESSOR_FILTER_CAPS_ANAMORPHIC_SCALING = 0x40,
    D3D11_VIDEO_PROCESSOR_FILTER_CAPS_STEREO_ADJUSTMENT  = 0x80
} D3D11_VIDEO_PROCESSOR_FILTER_CAPS;

typedef enum D3D11_VIDEO_PROCESSOR_FORMAT_CAPS
{
    D3D11_VIDEO_PROCESSOR_FORMAT_CAPS_RGB_INTERLACED     = 0x1,
    D3D11_VIDEO_PROCESSOR_FORMAT_CAPS_RGB_PROCAMP        = 0x2,
    D3D11_VIDEO_PROCESSOR_FORMAT_CAPS_RGB_LUMA_KEY       = 0x4,
    D3D11_VIDEO_PROCESSOR_FORMAT_CAPS_PALETTE_INTERLACED = 0x8
} D3D11_VIDEO_PROCESSOR_FORMAT_CAPS;

typedef enum D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS
{
    D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS_DENOISE              = 0x01,
    D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS_DERINGING            = 0x02,
    D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS_EDGE_ENHANCEMENT     = 0x04,
    D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS_COLOR_CORRECTION     = 0x08,
    D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS_FLESH_TONE_MAPPING   = 0x10,
    D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS_IMAGE_STABILIZATION  = 0x20,
    D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS_SUPER_RESOLUTION     = 0x40,
    D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS_ANAMORPHIC_SCALING   = 0x80
} D3D11_VIDEO_PROCESSOR_AUTO_STREAM_CAPS;

typedef enum D3D11_VIDEO_PROCESSOR_STEREO_CAPS
{
    D3D11_VIDEO_PROCESSOR_STEREO_CAPS_MONO_OFFSET         = 0x01,
    D3D11_VIDEO_PROCESSOR_STEREO_CAPS_ROW_INTERLEAVED     = 0x02,
    D3D11_VIDEO_PROCESSOR_STEREO_CAPS_COLUMN_INTERLEAVED  = 0x04,
    D3D11_VIDEO_PROCESSOR_STEREO_CAPS_CHECKERBOARD        = 0x08,
    D3D11_VIDEO_PROCESSOR_STEREO_CAPS_FLIP_MODE           = 0x10
} D3D11_VIDEO_PROCESSOR_STEREO_CAPS;

typedef struct D3D11_VIDEO_PROCESSOR_CAPS
{
    UINT DeviceCaps;
    UINT FeatureCaps;
    UINT FilterCaps;
    UINT InputFormatCaps;
    UINT AutoStreamCaps;
    UINT StereoCaps;
    UINT RateConversionCapsCount;
    UINT MaxInputStreams;
    UINT MaxStreamStates;
} D3D11_VIDEO_PROCESSOR_CAPS;

typedef enum D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS 
{
    D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS_DEINTERLACE_BLEND                 = 0x1,
    D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS_DEINTERLACE_BOB                   = 0x2,
    D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS_DEINTERLACE_ADAPTIVE              = 0x4,
    D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS_DEINTERLACE_MOTION_COMPENSATION   = 0x8,
    D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS_INVERSE_TELECINE                  = 0x10,
    D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS_FRAME_RATE_CONVERSION             = 0x20 
} D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS;

typedef enum D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS 
{
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_32             = 0x1,
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_22             = 0x2,
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_2224           = 0x4,
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_2332           = 0x8,
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_32322          = 0x10,
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_55             = 0x20,
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_64             = 0x40,
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_87             = 0x80,
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_222222222223   = 0x100,
    D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS_OTHER          = 0x80000000 
} D3D11_VIDEO_PROCESSOR_ITELECINE_CAPS;

typedef struct D3D11_VIDEO_PROCESSOR_RATE_CONVERSION_CAPS
{
    UINT PastFrames;
    UINT FutureFrames;
    UINT ProcessorCaps;
    UINT ITelecineCaps;
    UINT CustomRateCount;
} D3D11_VIDEO_PROCESSOR_RATE_CONVERSION_CAPS;

typedef enum D3D11_CONTENT_PROTECTION_CAPS
{
    D3D11_CONTENT_PROTECTION_CAPS_SOFTWARE                = 0x00000001,
    D3D11_CONTENT_PROTECTION_CAPS_HARDWARE                = 0x00000002,
    D3D11_CONTENT_PROTECTION_CAPS_PROTECTION_ALWAYS_ON    = 0x00000004,
    D3D11_CONTENT_PROTECTION_CAPS_PARTIAL_DECRYPTION      = 0x00000008,
    D3D11_CONTENT_PROTECTION_CAPS_CONTENT_KEY             = 0x00000010,
    D3D11_CONTENT_PROTECTION_CAPS_FRESHEN_SESSION_KEY     = 0x00000020,
    D3D11_CONTENT_PROTECTION_CAPS_ENCRYPTED_READ_BACK     = 0x00000040,
    D3D11_CONTENT_PROTECTION_CAPS_ENCRYPTED_READ_BACK_KEY = 0x00000080,
    D3D11_CONTENT_PROTECTION_CAPS_SEQUENTIAL_CTR_IV       = 0x00000100,
    D3D11_CONTENT_PROTECTION_CAPS_ENCRYPT_SLICEDATA_ONLY  = 0x00000200,
    D3D11_CONTENT_PROTECTION_CAPS_DECRYPTION_BLT          = 0x00000400,
    D3D11_CONTENT_PROTECTION_CAPS_HARDWARE_PROTECT_UNCOMPRESSED = 0x00000800,
    D3D11_CONTENT_PROTECTION_CAPS_HARDWARE_PROTECTED_MEMORY_PAGEABLE = 0x00001000,
    D3D11_CONTENT_PROTECTION_CAPS_HARDWARE_TEARDOWN          = 0x00002000,
    D3D11_CONTENT_PROTECTION_CAPS_HARDWARE_DRM_COMMUNICATION = 0x00004000,
    D3D11_CONTENT_PROTECTION_CAPS_HARDWARE_DRM_COMMUNICATION_MULTI_THREADED = 0x00008000,
} D3D11_CONTENT_PROTECTION_CAPS;

cpp_quote("DEFINE_GUID(D3D11_CRYPTO_TYPE_AES128_CTR, 0x9b6bd711, 0x4f74, 0x41c9, 0x9e, 0x7b, 0xb, 0xe2, 0xd7, 0xd9, 0x3b, 0x4f );")

cpp_quote("DEFINE_GUID(D3D11_DECODER_ENCRYPTION_HW_CENC, 0x89d6ac4f, 0x9f2, 0x4229, 0xb2, 0xcd, 0x37, 0x74, 0xa, 0x6d, 0xfd, 0x81);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_BITSTREAM_ENCRYPTION_TYPE_CENC, 0xb0405235, 0xc13d, 0x44f2, 0x9a, 0xe5, 0xdd, 0x48, 0xe0, 0x8e, 0x5b, 0x67);")
cpp_quote("DEFINE_GUID(D3D11_DECODER_BITSTREAM_ENCRYPTION_TYPE_CBCS, 0x422d9319, 0x9d21, 0x4bb7, 0x93, 0x71, 0xfa, 0xf5, 0xa8, 0x2c, 0x3e, 0x04);")


cpp_quote("DEFINE_GUID(D3D11_KEY_EXCHANGE_HW_PROTECTION, 0xb1170d8a, 0x628d, 0x4da3, 0xad, 0x3b, 0x82, 0xdd, 0xb0, 0x8b, 0x49, 0x70);")

typedef struct D3D11_VIDEO_CONTENT_PROTECTION_CAPS
{
    UINT      Caps;
    UINT      KeyExchangeTypeCount;
    UINT      BlockAlignmentSize;
    ULONGLONG ProtectedMemorySize;
} D3D11_VIDEO_CONTENT_PROTECTION_CAPS;

typedef struct D3D11_VIDEO_PROCESSOR_CUSTOM_RATE 
{
    DXGI_RATIONAL CustomRate;
    UINT          OutputFrames;
    BOOL          InputInterlaced;
    UINT          InputFramesOrFields;
} D3D11_VIDEO_PROCESSOR_CUSTOM_RATE;

typedef enum D3D11_VIDEO_PROCESSOR_FILTER 
{
    D3D11_VIDEO_PROCESSOR_FILTER_BRIGHTNESS           = 0,
    D3D11_VIDEO_PROCESSOR_FILTER_CONTRAST             = 1,
    D3D11_VIDEO_PROCESSOR_FILTER_HUE                  = 2,
    D3D11_VIDEO_PROCESSOR_FILTER_SATURATION           = 3,
    D3D11_VIDEO_PROCESSOR_FILTER_NOISE_REDUCTION      = 4,
    D3D11_VIDEO_PROCESSOR_FILTER_EDGE_ENHANCEMENT     = 5,
    D3D11_VIDEO_PROCESSOR_FILTER_ANAMORPHIC_SCALING   = 6, 
    D3D11_VIDEO_PROCESSOR_FILTER_STEREO_ADJUSTMENT    = 7,
} D3D11_VIDEO_PROCESSOR_FILTER;

typedef struct D3D11_VIDEO_PROCESSOR_FILTER_RANGE 
{
  int   Minimum;
  int   Maximum;
  int   Default;
  float Multiplier;
} D3D11_VIDEO_PROCESSOR_FILTER_RANGE;

typedef enum D3D11_VIDEO_FRAME_FORMAT
{
    D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE	= 0,
    D3D11_VIDEO_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST	= 1,
    D3D11_VIDEO_FRAME_FORMAT_INTERLACED_BOTTOM_FIELD_FIRST	= 2
} D3D11_VIDEO_FRAME_FORMAT;

typedef enum D3D11_VIDEO_USAGE
{
    D3D11_VIDEO_USAGE_PLAYBACK_NORMAL = 0,
    D3D11_VIDEO_USAGE_OPTIMAL_SPEED	  = 1,
    D3D11_VIDEO_USAGE_OPTIMAL_QUALITY = 2
} D3D11_VIDEO_USAGE;

typedef struct D3D11_VIDEO_PROCESSOR_CONTENT_DESC
{
    D3D11_VIDEO_FRAME_FORMAT InputFrameFormat;
    DXGI_RATIONAL InputFrameRate;
    UINT InputWidth;
    UINT InputHeight;
    DXGI_RATIONAL OutputFrameRate;
    UINT OutputWidth;
    UINT OutputHeight;
    D3D11_VIDEO_USAGE Usage;
} D3D11_VIDEO_PROCESSOR_CONTENT_DESC;


[ uuid( 31627037-53AB-4200-9061-05FAA9AB45F9 ), object, local, pointer_default( unique ) ]
interface ID3D11VideoProcessorEnumerator : ID3D11DeviceChild
{
    HRESULT GetVideoProcessorContentDesc(
        [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_CONTENT_DESC* pContentDesc );

    HRESULT CheckVideoProcessorFormat(
        [annotation("_In_")] DXGI_FORMAT Format,
        [annotation("_Out_")] UINT* pFlags );

    HRESULT GetVideoProcessorCaps(
        [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_CAPS* pCaps );

    HRESULT GetVideoProcessorRateConversionCaps(
        [annotation("_In_")] UINT TypeIndex,
        [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_RATE_CONVERSION_CAPS* pCaps );

    HRESULT GetVideoProcessorCustomRate(
        [annotation("_In_")] UINT TypeIndex,
        [annotation("_In_")] UINT CustomRateIndex,
        [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_CUSTOM_RATE* pRate );

    HRESULT GetVideoProcessorFilterRange(
        [annotation("_In_")] D3D11_VIDEO_PROCESSOR_FILTER Filter,
        [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_FILTER_RANGE* pRange );
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// VideoProcessor
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

typedef struct D3D11_VIDEO_COLOR_RGBA 
{
    float R;
    float G;
    float B;
    float A;
} D3D11_VIDEO_COLOR_RGBA;

typedef struct D3D11_VIDEO_COLOR_YCbCrA 
{
    float Y;
    float Cb;
    float Cr;
    float A;
} D3D11_VIDEO_COLOR_YCbCrA;

typedef struct D3D11_VIDEO_COLOR 
{
    union
    {
        D3D11_VIDEO_COLOR_YCbCrA YCbCr;
        D3D11_VIDEO_COLOR_RGBA RGBA;
    };
} D3D11_VIDEO_COLOR;

typedef enum D3D11_VIDEO_PROCESSOR_NOMINAL_RANGE 
{
    D3D11_VIDEO_PROCESSOR_NOMINAL_RANGE_UNDEFINED         = 0,
    D3D11_VIDEO_PROCESSOR_NOMINAL_RANGE_16_235            = 1,
    D3D11_VIDEO_PROCESSOR_NOMINAL_RANGE_0_255             = 2
} D3D11_VIDEO_PROCESSOR_NOMINAL_RANGE;

typedef struct D3D11_VIDEO_PROCESSOR_COLOR_SPACE 
{
    UINT Usage  :1;
    UINT RGB_Range  :1;
    UINT YCbCr_Matrix  :1;
    UINT YCbCr_xvYCC  :1;
    UINT Nominal_Range :2;   // D3D11_VIDEO_PROCESSOR_NOMINAL_RANGE
    UINT Reserved : 26;
} D3D11_VIDEO_PROCESSOR_COLOR_SPACE;

typedef enum D3D11_VIDEO_PROCESSOR_ALPHA_FILL_MODE 
{
    D3D11_VIDEO_PROCESSOR_ALPHA_FILL_MODE_OPAQUE          = 0,
    D3D11_VIDEO_PROCESSOR_ALPHA_FILL_MODE_BACKGROUND      = 1,
    D3D11_VIDEO_PROCESSOR_ALPHA_FILL_MODE_DESTINATION     = 2,
    D3D11_VIDEO_PROCESSOR_ALPHA_FILL_MODE_SOURCE_STREAM   = 3 
} D3D11_VIDEO_PROCESSOR_ALPHA_FILL_MODE;

typedef enum D3D11_VIDEO_PROCESSOR_OUTPUT_RATE 
{
    D3D11_VIDEO_PROCESSOR_OUTPUT_RATE_NORMAL   = 0,
    D3D11_VIDEO_PROCESSOR_OUTPUT_RATE_HALF     = 1,
    D3D11_VIDEO_PROCESSOR_OUTPUT_RATE_CUSTOM   = 2 
} D3D11_VIDEO_PROCESSOR_OUTPUT_RATE;

typedef enum D3D11_VIDEO_PROCESSOR_STEREO_FORMAT
{
    D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_MONO               = 0,
    D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_HORIZONTAL         = 1,
    D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_VERTICAL           = 2,
    D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_SEPARATE           = 3,
    D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_MONO_OFFSET        = 4,
    D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_ROW_INTERLEAVED    = 5,
    D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_COLUMN_INTERLEAVED = 6,
    D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_CHECKERBOARD       = 7
} D3D11_VIDEO_PROCESSOR_STEREO_FORMAT;

typedef enum D3D11_VIDEO_PROCESSOR_STEREO_FLIP_MODE
{
    D3D11_VIDEO_PROCESSOR_STEREO_FLIP_NONE   = 0,
    D3D11_VIDEO_PROCESSOR_STEREO_FLIP_FRAME0 = 1,
    D3D11_VIDEO_PROCESSOR_STEREO_FLIP_FRAME1 = 2,
} D3D11_VIDEO_PROCESSOR_STEREO_FLIP_MODE;

typedef enum D3D11_VIDEO_PROCESSOR_ROTATION 
{
    D3D11_VIDEO_PROCESSOR_ROTATION_IDENTITY      = 0,
    D3D11_VIDEO_PROCESSOR_ROTATION_90            = 1,
    D3D11_VIDEO_PROCESSOR_ROTATION_180           = 2,
    D3D11_VIDEO_PROCESSOR_ROTATION_270           = 3,
} D3D11_VIDEO_PROCESSOR_ROTATION;

typedef struct D3D11_VIDEO_PROCESSOR_STREAM
{
    BOOL Enable;
    UINT OutputIndex;
    UINT InputFrameOrField;
    UINT PastFrames;
    UINT FutureFrames;
    [annotation("_Field_size_(PastFrames)")] ID3D11VideoProcessorInputView **ppPastSurfaces;
    ID3D11VideoProcessorInputView *pInputSurface;
    [annotation("_Field_size_(FutureFrames)")] ID3D11VideoProcessorInputView **ppFutureSurfaces;
    [annotation("_Field_size_opt_(PastFrames)")] ID3D11VideoProcessorInputView **ppPastSurfacesRight;
    ID3D11VideoProcessorInputView *pInputSurfaceRight;
    [annotation("_Field_size_(FutureFrames)")] ID3D11VideoProcessorInputView **ppFutureSurfacesRight;
} D3D11_VIDEO_PROCESSOR_STREAM;


[ uuid( 1D7B0652-185F-41c6-85CE-0C5BE3D4AE6C ), object, local, pointer_default( unique ) ]
interface ID3D11VideoProcessor
    : ID3D11DeviceChild
{
    void GetContentDesc( 
                [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_CONTENT_DESC* pDesc);

    void GetRateConversionCaps(
                [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_RATE_CONVERSION_CAPS* pCaps);
};


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// AuthenticatedChannel
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define D3D11_OMAC_SIZE    16

typedef struct D3D11_OMAC
{
    BYTE Omac[D3D11_OMAC_SIZE];
} D3D11_OMAC;

typedef enum D3D11_AUTHENTICATED_CHANNEL_TYPE
{
    D3D11_AUTHENTICATED_CHANNEL_D3D11           = 1,
    D3D11_AUTHENTICATED_CHANNEL_DRIVER_SOFTWARE = 2,
    D3D11_AUTHENTICATED_CHANNEL_DRIVER_HARDWARE = 3,
} D3D11_AUTHENTICATED_CHANNEL_TYPE;


[ uuid( 3015A308-DCBD-47aa-A747-192486D14D4A ), object, local, pointer_default( unique ) ]
interface ID3D11AuthenticatedChannel
    : ID3D11DeviceChild
{
    HRESULT GetCertificateSize( 
                [annotation("_Out_")] UINT* pCertificateSize);

    HRESULT GetCertificate(
                [annotation("_In_")] UINT CertificateSize, 
                [annotation("_Out_writes_bytes_(CertificateSize)")] BYTE* pCertificate);

    void GetChannelHandle(
                [annotation("_Out_")] HANDLE* pChannelHandle); 
};

cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_PROTECTION, 0xa84eb584, 0xc495, 0x48aa, 0xb9, 0x4d, 0x8b, 0xd2, 0xd6, 0xfb, 0xce, 0x5 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_CHANNEL_TYPE, 0xbc1b18a5, 0xb1fb, 0x42ab, 0xbd, 0x94, 0xb5, 0x82, 0x8b, 0x4b, 0xf7, 0xbe );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_DEVICE_HANDLE, 0xec1c539d, 0x8cff, 0x4e2a, 0xbc, 0xc4, 0xf5, 0x69, 0x2f, 0x99, 0xf4, 0x80 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_CRYPTO_SESSION, 0x2634499e, 0xd018, 0x4d74, 0xac, 0x17, 0x7f, 0x72, 0x40, 0x59, 0x52, 0x8d );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_RESTRICTED_SHARED_RESOURCE_PROCESS_COUNT, 0xdb207b3, 0x9450, 0x46a6, 0x82, 0xde, 0x1b, 0x96, 0xd4, 0x4f, 0x9c, 0xf2 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_RESTRICTED_SHARED_RESOURCE_PROCESS, 0x649bbadb, 0xf0f4, 0x4639, 0xa1, 0x5b, 0x24, 0x39, 0x3f, 0xc3, 0xab, 0xac );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_UNRESTRICTED_PROTECTED_SHARED_RESOURCE_COUNT, 0x12f0bd6, 0xe662, 0x4474, 0xbe, 0xfd, 0xaa, 0x53, 0xe5, 0x14, 0x3c, 0x6d );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_OUTPUT_ID_COUNT, 0x2c042b5e, 0x8c07, 0x46d5, 0xaa, 0xbe, 0x8f, 0x75, 0xcb, 0xad, 0x4c, 0x31 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_OUTPUT_ID, 0x839ddca3, 0x9b4e, 0x41e4, 0xb0, 0x53, 0x89, 0x2b, 0xd2, 0xa1, 0x1e, 0xe7 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_ACCESSIBILITY_ATTRIBUTES, 0x6214d9d2, 0x432c, 0x4abb, 0x9f, 0xce, 0x21, 0x6e, 0xea, 0x26, 0x9e, 0x3b );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_ENCRYPTION_WHEN_ACCESSIBLE_GUID_COUNT, 0xb30f7066, 0x203c, 0x4b07, 0x93, 0xfc, 0xce, 0xaa, 0xfd, 0x61, 0x24, 0x1e );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_ENCRYPTION_WHEN_ACCESSIBLE_GUID, 0xf83a5958, 0xe986, 0x4bda, 0xbe, 0xb0, 0x41, 0x1f, 0x6a, 0x7a, 0x1, 0xb7 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_QUERY_CURRENT_ENCRYPTION_WHEN_ACCESSIBLE, 0xec1791c7, 0xdad3, 0x4f15, 0x9e, 0xc3, 0xfa, 0xa9, 0x3d, 0x60, 0xd4, 0xf0 );")

cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_CONFIGURE_INITIALIZE, 0x6114bdb, 0x3523, 0x470a, 0x8d, 0xca, 0xfb, 0xc2, 0x84, 0x51, 0x54, 0xf0 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_CONFIGURE_PROTECTION, 0x50455658, 0x3f47, 0x4362, 0xbf, 0x99, 0xbf, 0xdf, 0xcd, 0xe9, 0xed, 0x29 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_CONFIGURE_CRYPTO_SESSION, 0x6346cc54, 0x2cfc, 0x4ad4, 0x82, 0x24, 0xd1, 0x58, 0x37, 0xde, 0x77, 0x0 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_CONFIGURE_SHARED_RESOURCE, 0x772d047, 0x1b40, 0x48e8, 0x9c, 0xa6, 0xb5, 0xf5, 0x10, 0xde, 0x9f, 0x1 );")
cpp_quote("DEFINE_GUID( D3D11_AUTHENTICATED_CONFIGURE_ENCRYPTION_WHEN_ACCESSIBLE, 0x41fff286, 0x6ae0, 0x4d43, 0x9d, 0x55, 0xa4, 0x6e, 0x9e, 0xfd, 0x15, 0x8a );")

typedef struct D3D11_AUTHENTICATED_QUERY_INPUT
{
    GUID                               QueryType;
    HANDLE                             hChannel;
    UINT                               SequenceNumber;
} D3D11_AUTHENTICATED_QUERY_INPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_OUTPUT
{
    D3D11_OMAC                         omac;  
    GUID                               QueryType;
    HANDLE                             hChannel;
    UINT                               SequenceNumber;
    HRESULT                            ReturnCode;
} D3D11_AUTHENTICATED_QUERY_OUTPUT;

typedef union D3D11_AUTHENTICATED_PROTECTION_FLAGS
{
    struct
    {
        UINT ProtectionEnabled                       : 1; 
        UINT OverlayOrFullscreenRequired             : 1;
        UINT Reserved                                : 30;
    } Flags;
    UINT  Value;
} D3D11_AUTHENTICATED_PROTECTION_FLAGS;

typedef struct D3D11_AUTHENTICATED_QUERY_PROTECTION_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    D3D11_AUTHENTICATED_PROTECTION_FLAGS ProtectionFlags;

} D3D11_AUTHENTICATED_QUERY_PROTECTION_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_CHANNEL_TYPE_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    D3D11_AUTHENTICATED_CHANNEL_TYPE ChannelType;

} D3D11_AUTHENTICATED_QUERY_CHANNEL_TYPE_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_DEVICE_HANDLE_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    HANDLE   DeviceHandle;
} D3D11_AUTHENTICATED_QUERY_DEVICE_HANDLE_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_CRYPTO_SESSION_INPUT
{
    D3D11_AUTHENTICATED_QUERY_INPUT Input;
    HANDLE   DecoderHandle;
} D3D11_AUTHENTICATED_QUERY_CRYPTO_SESSION_INPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_CRYPTO_SESSION_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    HANDLE   DecoderHandle;
    HANDLE   CryptoSessionHandle;
    HANDLE   DeviceHandle;
} D3D11_AUTHENTICATED_QUERY_CRYPTO_SESSION_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_RESTRICTED_SHARED_RESOURCE_PROCESS_COUNT_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    UINT   RestrictedSharedResourceProcessCount;
} D3D11_AUTHENTICATED_QUERY_RESTRICTED_SHARED_RESOURCE_PROCESS_COUNT_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_RESTRICTED_SHARED_RESOURCE_PROCESS_INPUT
{
    D3D11_AUTHENTICATED_QUERY_INPUT Input;
    UINT     ProcessIndex;
} D3D11_AUTHENTICATED_QUERY_RESTRICTED_SHARED_RESOURCE_PROCESS_INPUT;

typedef enum D3D11_AUTHENTICATED_PROCESS_IDENTIFIER_TYPE
{
    D3D11_PROCESSIDTYPE_UNKNOWN  = 0,
    D3D11_PROCESSIDTYPE_DWM      = 1,
    D3D11_PROCESSIDTYPE_HANDLE   = 2
} D3D11_AUTHENTICATED_PROCESS_IDENTIFIER_TYPE;

typedef struct D3D11_AUTHENTICATED_QUERY_RESTRICTED_SHARED_RESOURCE_PROCESS_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    UINT                                        ProcessIndex;
    D3D11_AUTHENTICATED_PROCESS_IDENTIFIER_TYPE ProcessIdentifier;
    HANDLE                                      ProcessHandle;
} D3D11_AUTHENTICATED_QUERY_RESTRICTED_SHARED_RESOURCE_PROCESS_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_UNRESTRICTED_PROTECTED_SHARED_RESOURCE_COUNT_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    UINT  UnrestrictedProtectedSharedResourceCount;
} D3D11_AUTHENTICATED_QUERY_UNRESTRICTED_PROTECTED_SHARED_RESOURCE_COUNT_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_OUTPUT_ID_COUNT_INPUT
{
    D3D11_AUTHENTICATED_QUERY_INPUT Input;
    HANDLE  DeviceHandle;
    HANDLE  CryptoSessionHandle;	
} D3D11_AUTHENTICATED_QUERY_OUTPUT_ID_COUNT_INPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_OUTPUT_ID_COUNT_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    HANDLE  DeviceHandle;
    HANDLE  CryptoSessionHandle;	
    UINT    OutputIDCount;
} D3D11_AUTHENTICATED_QUERY_OUTPUT_ID_COUNT_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_OUTPUT_ID_INPUT
{
    D3D11_AUTHENTICATED_QUERY_INPUT Input;
    HANDLE  DeviceHandle;
    HANDLE  CryptoSessionHandle;	
    UINT    OutputIDIndex;
} D3D11_AUTHENTICATED_QUERY_OUTPUT_ID_INPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_OUTPUT_ID_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    HANDLE  DeviceHandle;
    HANDLE  CryptoSessionHandle;	
    UINT    OutputIDIndex;
    UINT64  OutputID;
} D3D11_AUTHENTICATED_QUERY_OUTPUT_ID_OUTPUT;

typedef enum D3D11_BUS_TYPE
{
    D3D11_BUS_TYPE_OTHER                                     = 0x00000000,
    D3D11_BUS_TYPE_PCI                                       = 0x00000001,
    D3D11_BUS_TYPE_PCIX                                      = 0x00000002,
    D3D11_BUS_TYPE_PCIEXPRESS                                = 0x00000003,
    D3D11_BUS_TYPE_AGP                                       = 0x00000004,
    D3D11_BUS_IMPL_MODIFIER_INSIDE_OF_CHIPSET                = 0x00010000,
    D3D11_BUS_IMPL_MODIFIER_TRACKS_ON_MOTHER_BOARD_TO_CHIP   = 0x00020000,
    D3D11_BUS_IMPL_MODIFIER_TRACKS_ON_MOTHER_BOARD_TO_SOCKET = 0x00030000,
    D3D11_BUS_IMPL_MODIFIER_DAUGHTER_BOARD_CONNECTOR         = 0x00040000,
    D3D11_BUS_IMPL_MODIFIER_DAUGHTER_BOARD_CONNECTOR_INSIDE_OF_NUAE = 0x00050000, 
    D3D11_BUS_IMPL_MODIFIER_NON_STANDARD                     = 0x80000000,    
} D3D11_BUS_TYPE;

typedef struct D3D11_AUTHENTICATED_QUERY_ACESSIBILITY_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    D3D11_BUS_TYPE BusType;
    BOOL AccessibleInContiguousBlocks;
    BOOL AccessibleInNonContiguousBlocks;
} D3D11_AUTHENTICATED_QUERY_ACCESSIBILITY_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_ACCESSIBILITY_ENCRYPTION_GUID_COUNT_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    UINT   EncryptionGuidCount;
} D3D11_AUTHENTICATED_QUERY_ACCESSIBILITY_ENCRYPTION_GUID_COUNT_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_ACCESSIBILITY_ENCRYPTION_GUID_INPUT
{
    D3D11_AUTHENTICATED_QUERY_INPUT Input;
    UINT EncryptionGuidIndex;
} D3D11_AUTHENTICATED_QUERY_ACCESSIBILITY_ENCRYPTION_GUID_INPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_ACCESSIBILITY_ENCRYPTION_GUID_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    UINT       EncryptionGuidIndex;
    GUID       EncryptionGuid;
} D3D11_AUTHENTICATED_QUERY_ACCESSIBILITY_ENCRYPTION_GUID_OUTPUT;

typedef struct D3D11_AUTHENTICATED_QUERY_CURRENT_ACCESSIBILITY_ENCRYPTION_OUTPUT
{
    D3D11_AUTHENTICATED_QUERY_OUTPUT Output;
    GUID       EncryptionGuid;
} D3D11_AUTHENTICATED_QUERY_CURRENT_ACCESSIBILITY_ENCRYPTION_OUTPUT;

typedef struct D3D11_AUTHENTICATED_CONFIGURE_INPUT
{
    D3D11_OMAC                          omac;  
    GUID                                ConfigureType;      
    HANDLE                              hChannel;    
    UINT                                SequenceNumber;     
} D3D11_AUTHENTICATED_CONFIGURE_INPUT;

typedef struct D3D11_AUTHENTICATED_CONFIGURE_OUTPUT
{
    D3D11_OMAC                          omac;  
    GUID                                ConfigureType;          
    HANDLE                              hChannel;
    UINT                                SequenceNumber;     
    HRESULT                             ReturnCode;
} D3D11_AUTHENTICATED_CONFIGURE_OUTPUT;

typedef struct D3D11_AUTHENTICATED_CONFIGURE_INITIALIZE_INPUT
{
    D3D11_AUTHENTICATED_CONFIGURE_INPUT   Parameters;
    UINT   StartSequenceQuery;
    UINT   StartSequenceConfigure;
} D3D11_AUTHENTICATED_CONFIGURE_INITIALIZE_INPUT;

typedef struct D3D11_AUTHENTICATED_CONFIGURE_PROTECTION_INPUT
{
    D3D11_AUTHENTICATED_CONFIGURE_INPUT   Parameters;
    D3D11_AUTHENTICATED_PROTECTION_FLAGS Protections;
} D3D11_AUTHENTICATED_CONFIGURE_PROTECTION_INPUT;

typedef struct D3D11_AUTHENTICATED_CONFIGURE_CRYPTO_SESSION_INPUT
{
    D3D11_AUTHENTICATED_CONFIGURE_INPUT   Parameters;
    HANDLE      DecoderHandle;
    HANDLE      CryptoSessionHandle;
    HANDLE      DeviceHandle;
} D3D11_AUTHENTICATED_CONFIGURE_CRYPTO_SESSION_INPUT;

typedef struct D3D11_AUTHENTICATED_CONFIGURE_SHARED_RESOURCE_INPUT
{
    D3D11_AUTHENTICATED_CONFIGURE_INPUT         Parameters;
    D3D11_AUTHENTICATED_PROCESS_IDENTIFIER_TYPE ProcessType;
    HANDLE                                      ProcessHandle;
    BOOL                                        AllowAccess;
} D3D11_AUTHENTICATED_CONFIGURE_SHARED_RESOURCE_INPUT;

typedef struct D3D11_AUTHENTICATED_CONFIGURE_ACCESSIBLE_ENCRYPTION_INPUT
{
    D3D11_AUTHENTICATED_CONFIGURE_INPUT Parameters;
    GUID                                EncryptionGuid;
} D3D11_AUTHENTICATED_CONFIGURE_ACCESSIBLE_ENCRYPTION_INPUT;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// CryptoSession
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


cpp_quote("DEFINE_GUID(D3D11_KEY_EXCHANGE_RSAES_OAEP, 0xc1949895, 0xd72a, 0x4a1d, 0x8e, 0x5d, 0xed, 0x85, 0x7d, 0x17, 0x15, 0x20);")

[ uuid( 9B32F9AD-BDCC-40a6-A39D-D5C865845720 ), object, local, pointer_default( unique ) ]
interface ID3D11CryptoSession
    : ID3D11DeviceChild
{
    void GetCryptoType(
                [annotation("_Out_")] GUID* pCryptoType);
                
    void GetDecoderProfile(
                [annotation("_Out_")] GUID* pDecoderProfile);

    HRESULT GetCertificateSize( 
                [annotation("_Out_")] UINT* pCertificateSize);

    HRESULT GetCertificate(
                [annotation("_In_")] UINT CertificateSize, 
                [annotation("_Out_writes_bytes_(CertificateSize)")] BYTE* pCertificate);

    void GetCryptoSessionHandle(
                [annotation("_Out_")] HANDLE* pCryptoSessionHandle);
};

typedef enum D3D11_VDOV_DIMENSION
{
    D3D11_VDOV_DIMENSION_UNKNOWN = 0,
    D3D11_VDOV_DIMENSION_TEXTURE2D = 1,
} D3D11_VDOV_DIMENSION;

typedef struct D3D11_TEX2D_VDOV
{
    UINT ArraySlice;
} D3D11_TEX2D_VDOV;

typedef struct D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC
{
    GUID DecodeProfile;
    D3D11_VDOV_DIMENSION ViewDimension;

    union
    {
        D3D11_TEX2D_VDOV Texture2D;
    };
} D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC;

[ uuid( C2931AEA-2A85-4f20-860F-FBA1FD256E18 ), object, local, pointer_default( unique ) ]
interface ID3D11VideoDecoderOutputView
    : ID3D11View
{
    void GetDesc( [annotation("_Out_")] D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC* pDesc );
};

typedef enum D3D11_VPIV_DIMENSION
{
    D3D11_VPIV_DIMENSION_UNKNOWN = 0,
    D3D11_VPIV_DIMENSION_TEXTURE2D = 1,
} D3D11_VPIV_DIMENSION;

typedef struct D3D11_TEX2D_VPIV
{
    UINT MipSlice;
    UINT ArraySlice;
} D3D11_TEX2D_VPIV;

typedef struct D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC
{
    UINT FourCC;
    D3D11_VPIV_DIMENSION ViewDimension;

    union
    {
        D3D11_TEX2D_VPIV Texture2D;
    };
} D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC;

[ uuid( 11EC5A5F-51DC-4945-AB34-6E8C21300EA5 ), object, local, pointer_default( unique ) ]
interface ID3D11VideoProcessorInputView
    : ID3D11View
{
    void GetDesc( [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC* pDesc );
};

typedef enum D3D11_VPOV_DIMENSION
{
    D3D11_VPOV_DIMENSION_UNKNOWN = 0,
    D3D11_VPOV_DIMENSION_TEXTURE2D = 1,
    D3D11_VPOV_DIMENSION_TEXTURE2DARRAY = 2,
} D3D11_VPOV_DIMENSION;

typedef struct D3D11_TEX2D_VPOV
{
    UINT MipSlice;
} D3D11_TEX2D_VPOV;

typedef struct D3D11_TEX2D_ARRAY_VPOV
{
    UINT MipSlice;
    UINT FirstArraySlice;
    UINT ArraySize;
} D3D11_TEX2D_ARRAY_VPOV;

typedef struct D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC
{
    D3D11_VPOV_DIMENSION ViewDimension;

    union
    {
        D3D11_TEX2D_VPOV Texture2D;
        D3D11_TEX2D_ARRAY_VPOV Texture2DArray;
    };
} D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC;

[ uuid( A048285E-25A9-4527-BD93-D68B68C44254 ), object, local, pointer_default( unique ) ]
interface ID3D11VideoProcessorOutputView
    : ID3D11View
{
    void GetDesc( [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC* pDesc );
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// VideoContext
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[ uuid( 61F21C45-3C0E-4a74-9CEA-67100D9AD5E4 ), object, local, pointer_default( unique ) ]
interface ID3D11VideoContext
    : ID3D11DeviceChild
{
    // Decode
    HRESULT GetDecoderBuffer( 
                [annotation("_In_")] ID3D11VideoDecoder* pDecoder,
                D3D11_VIDEO_DECODER_BUFFER_TYPE Type, 
                [annotation("_Out_")] UINT* pBufferSize,
                [annotation("_Outptr_result_bytebuffer_(*pBufferSize)")] void** ppBuffer );

    HRESULT ReleaseDecoderBuffer( 
                [annotation("_In_")] ID3D11VideoDecoder* pDecoder,
                [annotation("_In_")] D3D11_VIDEO_DECODER_BUFFER_TYPE Type );

    HRESULT DecoderBeginFrame(
                [annotation("_In_")] ID3D11VideoDecoder* pDecoder,
                [annotation("_In_")] ID3D11VideoDecoderOutputView* pView,
                UINT ContentKeySize,
                [annotation("_In_reads_bytes_opt_(ContentKeySize)")] const void* pContentKey );

    HRESULT DecoderEndFrame( 
                [annotation("_In_")] ID3D11VideoDecoder* pDecoder );

    HRESULT SubmitDecoderBuffers( 
                [annotation("_In_")] ID3D11VideoDecoder* pDecoder,
                [annotation("_In_")] UINT NumBuffers, 
                [annotation("_In_reads_(NumBuffers)")] const D3D11_VIDEO_DECODER_BUFFER_DESC* pBufferDesc );

    APP_DEPRECATED_HRESULT DecoderExtension( 
                [annotation("_In_")] ID3D11VideoDecoder* pDecoder,
                [annotation("_In_")] const D3D11_VIDEO_DECODER_EXTENSION* pExtensionData );

    void VideoProcessorSetOutputTargetRect( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_opt_")] const RECT* pRect);

    void VideoProcessorSetOutputBackgroundColor( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] BOOL YCbCr,
                [annotation("_In_")] const D3D11_VIDEO_COLOR* pColor);

    void VideoProcessorSetOutputColorSpace( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] const D3D11_VIDEO_PROCESSOR_COLOR_SPACE* pColorSpace);

    void VideoProcessorSetOutputAlphaFillMode( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] D3D11_VIDEO_PROCESSOR_ALPHA_FILL_MODE AlphaFillMode,
                [annotation("_In_")] UINT StreamIndex);

    void VideoProcessorSetOutputConstriction( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_")] SIZE Size);

    void VideoProcessorSetOutputStereoMode( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] BOOL Enable);

    APP_DEPRECATED_HRESULT VideoProcessorSetOutputExtension( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] const GUID* pExtensionGuid,
                [annotation("_In_")] UINT DataSize,
                [annotation("_In_")] void* pData);

    void VideoProcessorGetOutputTargetRect( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_Out_")] BOOL* Enabled,
                [annotation("_Out_")] RECT* pRect);

    void VideoProcessorGetOutputBackgroundColor( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_Out_")] BOOL* pYCbCr,
                [annotation("_Out_")] D3D11_VIDEO_COLOR* pColor);

    void VideoProcessorGetOutputColorSpace( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_COLOR_SPACE* pColorSpace);

    void VideoProcessorGetOutputAlphaFillMode( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_ALPHA_FILL_MODE* pAlphaFillMode,
                [annotation("_Out_")] UINT* pStreamIndex);

    void VideoProcessorGetOutputConstriction( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_Out_")] BOOL* pEnabled,
                [annotation("_Out_")] SIZE* pSize);

    void VideoProcessorGetOutputStereoMode( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_Out_")] BOOL* pEnabled);

    APP_DEPRECATED_HRESULT VideoProcessorGetOutputExtension( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] const GUID* pExtensionGuid,
                [annotation("_In_")] UINT DataSize,
                [annotation("_Out_writes_bytes_(DataSize)")] void* pData);

    void VideoProcessorSetStreamFrameFormat( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] D3D11_VIDEO_FRAME_FORMAT FrameFormat);

    void VideoProcessorSetStreamColorSpace( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] const D3D11_VIDEO_PROCESSOR_COLOR_SPACE* pColorSpace);

    void VideoProcessorSetStreamOutputRate( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] D3D11_VIDEO_PROCESSOR_OUTPUT_RATE OutputRate,
                [annotation("_In_")] BOOL RepeatFrame,
                [annotation("_In_opt_")] const DXGI_RATIONAL* pCustomRate);

    void VideoProcessorSetStreamSourceRect( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_opt_")] const RECT* pRect);

    void VideoProcessorSetStreamDestRect( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_opt_")] const RECT* pRect);

    void VideoProcessorSetStreamAlpha( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_")] FLOAT Alpha);

    void VideoProcessorSetStreamPalette( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] UINT Count,
                [annotation("_In_reads_opt_(Count)")] const UINT* pEntries);

    void VideoProcessorSetStreamPixelAspectRatio( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_opt_")] const DXGI_RATIONAL* pSourceAspectRatio,
                [annotation("_In_opt_")] const DXGI_RATIONAL* pDestinationAspectRatio);

    void VideoProcessorSetStreamLumaKey(
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_")] FLOAT Lower,
                [annotation("_In_")] FLOAT Upper);

    void VideoProcessorSetStreamStereoFormat(
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_")] D3D11_VIDEO_PROCESSOR_STEREO_FORMAT Format,
                [annotation("_In_")] BOOL LeftViewFrame0,
                [annotation("_In_")] BOOL BaseViewFrame0,
                [annotation("_In_")] D3D11_VIDEO_PROCESSOR_STEREO_FLIP_MODE FlipMode,
                [annotation("_In_")] int MonoOffset);

    void VideoProcessorSetStreamAutoProcessingMode( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] BOOL Enable);

    void VideoProcessorSetStreamFilter( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] D3D11_VIDEO_PROCESSOR_FILTER Filter,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_")] int Level);

    APP_DEPRECATED_HRESULT VideoProcessorSetStreamExtension( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] const GUID* pExtensionGuid,
                [annotation("_In_")] UINT DataSize,
                [annotation("_In_")] void* pData);

    void VideoProcessorGetStreamFrameFormat( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] D3D11_VIDEO_FRAME_FORMAT* pFrameFormat);

    void VideoProcessorGetStreamColorSpace( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_COLOR_SPACE* pColorSpace);

    void VideoProcessorGetStreamOutputRate( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_OUTPUT_RATE* pOutputRate,
                [annotation("_Out_")] BOOL* pRepeatFrame,
                [annotation("_Out_")] DXGI_RATIONAL* pCustomRate);

    void VideoProcessorGetStreamSourceRect( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] BOOL* pEnabled,
                [annotation("_Out_")] RECT* pRect);

    void VideoProcessorGetStreamDestRect( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] BOOL* pEnabled,
                [annotation("_Out_")] RECT* pRect);

    void VideoProcessorGetStreamAlpha( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] BOOL* pEnabled,
                [annotation("_Out_")] FLOAT* pAlpha);

    void VideoProcessorGetStreamPalette( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] UINT Count,
                [annotation("_Out_writes_(Count)")] UINT* pEntries);

    void VideoProcessorGetStreamPixelAspectRatio( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] BOOL* pEnabled,
                [annotation("_Out_")] DXGI_RATIONAL* pSourceAspectRatio,
                [annotation("_Out_")] DXGI_RATIONAL* pDestinationAspectRatio);

    void VideoProcessorGetStreamLumaKey(
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] BOOL* pEnabled,
                [annotation("_Out_")] FLOAT* pLower,
                [annotation("_Out_")] FLOAT* pUpper);

    void VideoProcessorGetStreamStereoFormat(
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] BOOL* pEnable,
                [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_STEREO_FORMAT* pFormat,
                [annotation("_Out_")] BOOL* pLeftViewFrame0,
                [annotation("_Out_")] BOOL* pBaseViewFrame0,
                [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_STEREO_FLIP_MODE* pFlipMode,
                [annotation("_Out_")] int* MonoOffset);

    void VideoProcessorGetStreamAutoProcessingMode( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] BOOL* pEnabled);

    void VideoProcessorGetStreamFilter( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] D3D11_VIDEO_PROCESSOR_FILTER Filter,
                [annotation("_Out_")] BOOL* pEnabled,
                [annotation("_Out_")] int* pLevel);

    APP_DEPRECATED_HRESULT VideoProcessorGetStreamExtension( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] const GUID* pExtensionGuid,
                [annotation("_In_")] UINT DataSize,
                [annotation("_Out_writes_bytes_(DataSize)")] void* pData);

    HRESULT VideoProcessorBlt(
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] ID3D11VideoProcessorOutputView *pView,
                [annotation("_In_")] UINT OutputFrame,
                [annotation("_In_")] UINT StreamCount,
                [annotation("_In_reads_(StreamCount)")] const D3D11_VIDEO_PROCESSOR_STREAM *pStreams);

    HRESULT NegotiateCryptoSessionKeyExchange(
                [annotation("_In_")] ID3D11CryptoSession* pCryptoSession, 
                [annotation("_In_")] UINT DataSize, 
                [annotation("_Inout_updates_bytes_(DataSize)")] void* pData);

    void EncryptionBlt( 
                [annotation("_In_")] ID3D11CryptoSession* pCryptoSession, 
                [annotation("_In_")] ID3D11Texture2D* pSrcSurface,
                [annotation("_In_")] ID3D11Texture2D* pDstSurface,
                [annotation("_In_")] UINT IVSize,
                [annotation("_Inout_opt_bytecount_(IVSize)")] void* pIV);

    void DecryptionBlt( 
                [annotation("_In_")] ID3D11CryptoSession* pCryptoSession, 
                [annotation("_In_")] ID3D11Texture2D* pSrcSurface,
                [annotation("_In_")] ID3D11Texture2D* pDstSurface,
                [annotation("_In_opt_")] D3D11_ENCRYPTED_BLOCK_INFO* pEncryptedBlockInfo,
                [annotation("_In_")] UINT ContentKeySize,
                [annotation("_In_reads_bytes_opt_(ContentKeySize)")] const void* pContentKey,
                [annotation("_In_")] UINT IVSize,
                [annotation("_Inout_opt_bytecount_(IVSize)")] void* pIV );

    void StartSessionKeyRefresh( 
                [annotation("_In_")] ID3D11CryptoSession* pCryptoSession, 
                [annotation("_In_")] UINT RandomNumberSize, 
                [annotation("_Out_writes_bytes_(RandomNumberSize)")] void* pRandomNumber);

    void FinishSessionKeyRefresh(
                [annotation("_In_")] ID3D11CryptoSession* pCryptoSession);

    HRESULT GetEncryptionBltKey( 
                [annotation("_In_")] ID3D11CryptoSession* pCryptoSession, 
                [annotation("_In_")] UINT KeySize, 
                [annotation("_Out_writes_bytes_(KeySize)")] void* pReadbackKey);
                
    HRESULT NegotiateAuthenticatedChannelKeyExchange(
                [annotation("_In_")] ID3D11AuthenticatedChannel* pChannel, 
                [annotation("_In_")] UINT DataSize, 
                [annotation("_Inout_updates_bytes_(DataSize)")] void* pData);

    HRESULT QueryAuthenticatedChannel(
                [annotation("_In_")] ID3D11AuthenticatedChannel* pChannel, 
                [annotation("_In_")] UINT InputSize, 
                [annotation("_In_reads_bytes_(InputSize)")] const void* pInput,
                [annotation("_In_")] UINT OutputSize,
                [annotation("_Out_writes_bytes_(OutputSize)")] void* pOutput);

    HRESULT ConfigureAuthenticatedChannel( 
                [annotation("_In_")] ID3D11AuthenticatedChannel* pChannel, 
                [annotation("_In_")] UINT InputSize,
                [annotation("_In_reads_bytes_(InputSize)")] const void* pInput,
                [annotation("_Out_")] D3D11_AUTHENTICATED_CONFIGURE_OUTPUT* pOutput);

    void VideoProcessorSetStreamRotation( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_In_")] BOOL Enable,
                [annotation("_In_")] D3D11_VIDEO_PROCESSOR_ROTATION Rotation);

    void VideoProcessorGetStreamRotation( 
                [annotation("_In_")] ID3D11VideoProcessor* pVideoProcessor,
                [annotation("_In_")] UINT StreamIndex,
                [annotation("_Out_")] BOOL* pEnable,
                [annotation("_Out_")] D3D11_VIDEO_PROCESSOR_ROTATION* pRotation);
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Device
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[ uuid( 10EC4D5B-975A-4689-B9E4-D0AAC30FE333 ), object, local, pointer_default( unique ) ]
interface ID3D11VideoDevice
    : IUnknown
{
    // Create*
    HRESULT CreateVideoDecoder( 
        [annotation("_In_")] const D3D11_VIDEO_DECODER_DESC *pVideoDesc,
        [annotation("_In_")] const D3D11_VIDEO_DECODER_CONFIG *pConfig,
        [annotation("_COM_Outptr_")] ID3D11VideoDecoder **ppDecoder);

    HRESULT CreateVideoProcessor( 
        [annotation("_In_")] ID3D11VideoProcessorEnumerator* pEnum,
        [annotation("_In_")] UINT RateConversionIndex,
        [annotation("_COM_Outptr_")] ID3D11VideoProcessor **ppVideoProcessor);

    HRESULT CreateAuthenticatedChannel( 
        [annotation("_In_")] D3D11_AUTHENTICATED_CHANNEL_TYPE ChannelType,
        [annotation("_COM_Outptr_")] ID3D11AuthenticatedChannel** ppAuthenticatedChannel);

    HRESULT CreateCryptoSession( 
        [annotation("_In_")] const GUID* pCryptoType,
        [annotation("_In_opt_")] const GUID* pDecoderProfile,
        [annotation("_In_")] const GUID* pKeyExchangeType,
        [annotation("_COM_Outptr_")] ID3D11CryptoSession** ppCryptoSession);

    HRESULT CreateVideoDecoderOutputView(
        [annotation("_In_")] ID3D11Resource* pResource,
        [annotation("_In_")] const D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC* pDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11VideoDecoderOutputView** ppVDOVView );

    HRESULT CreateVideoProcessorInputView(
        [annotation("_In_")] ID3D11Resource* pResource,
        [annotation("_In_")] ID3D11VideoProcessorEnumerator* pEnum,
        [annotation("_In_")] const D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC* pDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11VideoProcessorInputView** ppVPIView );

    HRESULT CreateVideoProcessorOutputView(
        [annotation("_In_")] ID3D11Resource* pResource,
        [annotation("_In_")] ID3D11VideoProcessorEnumerator* pEnum,
        [annotation("_In_")] const D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC* pDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11VideoProcessorOutputView** ppVPOView );

    HRESULT CreateVideoProcessorEnumerator(
        [annotation("_In_")] const D3D11_VIDEO_PROCESSOR_CONTENT_DESC* pDesc,
        [annotation("_COM_Outptr_")] ID3D11VideoProcessorEnumerator** ppEnum );

    // Check
    UINT GetVideoDecoderProfileCount( void );

    HRESULT GetVideoDecoderProfile(
        [annotation("_In_")] UINT Index,
        [annotation("_Out_")] GUID* pDecoderProfile );

    HRESULT CheckVideoDecoderFormat(
        [annotation("_In_")] const GUID* pDecoderProfile,
        [annotation("_In_")] DXGI_FORMAT Format,
        [annotation("_Out_")] BOOL* pSupported );

    HRESULT GetVideoDecoderConfigCount(
        [annotation("_In_")] const D3D11_VIDEO_DECODER_DESC* pDesc,
        [annotation("_Out_")] UINT* pCount );

    HRESULT GetVideoDecoderConfig(
        [annotation("_In_")] const D3D11_VIDEO_DECODER_DESC* pDesc,
        [annotation("_In_")] UINT Index,
        [annotation("_Out_")] D3D11_VIDEO_DECODER_CONFIG* pConfig );

    HRESULT GetContentProtectionCaps( 
        [annotation("_In_opt_")] const GUID* pCryptoType,
        [annotation("_In_opt_")] const GUID* pDecoderProfile,
        [annotation("_Out_")] D3D11_VIDEO_CONTENT_PROTECTION_CAPS* pCaps );

    HRESULT CheckCryptoKeyExchange(
        [annotation("_In_")] const GUID* pCryptoType,
        [annotation("_In_opt_")] const GUID* pDecoderProfile,
        [annotation("_In_")] UINT Index,
        [annotation("_Out_")] GUID* pKeyExchangeType );

    HRESULT SetPrivateData(
        [annotation("_In_")] REFGUID guid,
        [annotation("_In_")] UINT DataSize,
        [annotation("_In_reads_bytes_opt_(DataSize)")] const void* pData );

    HRESULT SetPrivateDataInterface(
        [annotation("_In_")] REFGUID guid,
        [annotation("_In_opt_")] const IUnknown* pData );
};



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Device
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

cpp_quote("#include <winapifamily.h>")

[ uuid( db6f6ddb-ac77-4e88-8253-819df9bbf140 ), object, local, pointer_default( unique ) ]
interface ID3D11Device
    : IUnknown
{
    // Create*
    HRESULT CreateBuffer(
        [annotation("_In_")] const D3D11_BUFFER_DESC* pDesc,
        [annotation("_In_opt_")] const D3D11_SUBRESOURCE_DATA* pInitialData,
        [annotation("_COM_Outptr_opt_")] ID3D11Buffer** ppBuffer );
    HRESULT CreateTexture1D(
        [annotation("_In_")] const D3D11_TEXTURE1D_DESC* pDesc,
        [annotation("_In_reads_opt_(_Inexpressible_(pDesc->MipLevels * pDesc->ArraySize))")] const D3D11_SUBRESOURCE_DATA* pInitialData,
        [annotation("_COM_Outptr_opt_")] ID3D11Texture1D** ppTexture1D );
    HRESULT CreateTexture2D(
        [annotation("_In_")] const D3D11_TEXTURE2D_DESC* pDesc,
        [annotation("_In_reads_opt_(_Inexpressible_(pDesc->MipLevels * pDesc->ArraySize))")] const D3D11_SUBRESOURCE_DATA* pInitialData,
        [annotation("_COM_Outptr_opt_")] ID3D11Texture2D** ppTexture2D );
    HRESULT CreateTexture3D(
        [annotation("_In_")] const D3D11_TEXTURE3D_DESC* pDesc,
        [annotation("_In_reads_opt_(_Inexpressible_(pDesc->MipLevels))")] const D3D11_SUBRESOURCE_DATA* pInitialData,
        [annotation("_COM_Outptr_opt_")] ID3D11Texture3D** ppTexture3D );
    HRESULT CreateShaderResourceView(
        [annotation("_In_")] ID3D11Resource* pResource,
        [annotation("_In_opt_")] const D3D11_SHADER_RESOURCE_VIEW_DESC* pDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11ShaderResourceView** ppSRView );
    HRESULT CreateUnorderedAccessView(
        [annotation("_In_")] ID3D11Resource* pResource,
        [annotation("_In_opt_")] const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11UnorderedAccessView** ppUAView );
    HRESULT CreateRenderTargetView(
        [annotation("_In_")] ID3D11Resource* pResource,
        [annotation("_In_opt_")] const D3D11_RENDER_TARGET_VIEW_DESC* pDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11RenderTargetView** ppRTView );
    HRESULT CreateDepthStencilView(
        [annotation("_In_")] ID3D11Resource* pResource,
        [annotation("_In_opt_")] const D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11DepthStencilView** ppDepthStencilView );
    HRESULT CreateInputLayout(
        [annotation("_In_reads_(NumElements)")] const D3D11_INPUT_ELEMENT_DESC* pInputElementDescs,
        [annotation("_In_range_( 0, D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT )")] UINT NumElements,
        [annotation("_In_reads_(BytecodeLength)")] const void* pShaderBytecodeWithInputSignature,
        [annotation("_In_")] SIZE_T BytecodeLength,
        [annotation("_COM_Outptr_opt_")] ID3D11InputLayout** ppInputLayout );
    HRESULT CreateVertexShader(
        [annotation("_In_reads_(BytecodeLength)")] const void* pShaderBytecode,
        [annotation("_In_")] SIZE_T BytecodeLength,
        [annotation("_In_opt_")] ID3D11ClassLinkage* pClassLinkage,
        [annotation("_COM_Outptr_opt_")] ID3D11VertexShader** ppVertexShader );
    HRESULT CreateGeometryShader(
        [annotation("_In_reads_(BytecodeLength)")] const void* pShaderBytecode,
        [annotation("_In_")] SIZE_T BytecodeLength,
        [annotation("_In_opt_")] ID3D11ClassLinkage* pClassLinkage,
        [annotation("_COM_Outptr_opt_")] ID3D11GeometryShader** ppGeometryShader );
    HRESULT CreateGeometryShaderWithStreamOutput(
        [annotation("_In_reads_(BytecodeLength)")] const void* pShaderBytecode,
        [annotation("_In_")] SIZE_T BytecodeLength,
        [annotation("_In_reads_opt_(NumEntries)")] const D3D11_SO_DECLARATION_ENTRY* pSODeclaration,
        [annotation("_In_range_( 0, D3D11_SO_STREAM_COUNT * D3D11_SO_OUTPUT_COMPONENT_COUNT )")] UINT NumEntries,
        [annotation("_In_reads_opt_(NumStrides)")] const UINT* pBufferStrides,
        [annotation("_In_range_( 0, D3D11_SO_BUFFER_SLOT_COUNT )")] UINT NumStrides,
        [annotation("_In_")] UINT RasterizedStream,
        [annotation("_In_opt_")] ID3D11ClassLinkage* pClassLinkage,
        [annotation("_COM_Outptr_opt_")] ID3D11GeometryShader** ppGeometryShader );
    HRESULT CreatePixelShader(
        [annotation("_In_reads_(BytecodeLength)")] const void* pShaderBytecode,
        [annotation("_In_")] SIZE_T BytecodeLength,
        [annotation("_In_opt_")] ID3D11ClassLinkage* pClassLinkage,
        [annotation("_COM_Outptr_opt_")] ID3D11PixelShader** ppPixelShader );
    HRESULT CreateHullShader(
        [annotation("_In_reads_(BytecodeLength)")] const void* pShaderBytecode,
        [annotation("_In_")] SIZE_T BytecodeLength,
        [annotation("_In_opt_")] ID3D11ClassLinkage* pClassLinkage,
        [annotation("_COM_Outptr_opt_")] ID3D11HullShader** ppHullShader );
    HRESULT CreateDomainShader(
        [annotation("_In_reads_(BytecodeLength)")] const void* pShaderBytecode,
        [annotation("_In_")] SIZE_T BytecodeLength,
        [annotation("_In_opt_")] ID3D11ClassLinkage* pClassLinkage,
        [annotation("_COM_Outptr_opt_")] ID3D11DomainShader** ppDomainShader );
    HRESULT CreateComputeShader(
        [annotation("_In_reads_(BytecodeLength)")] const void* pShaderBytecode,
        [annotation("_In_")] SIZE_T BytecodeLength,
        [annotation("_In_opt_")] ID3D11ClassLinkage* pClassLinkage,
        [annotation("_COM_Outptr_opt_")] ID3D11ComputeShader** ppComputeShader );
    HRESULT CreateClassLinkage(
        [annotation("_COM_Outptr_")] ID3D11ClassLinkage** ppLinkage);
    HRESULT CreateBlendState(
        [annotation("_In_")] const D3D11_BLEND_DESC* pBlendStateDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11BlendState** ppBlendState );
    HRESULT CreateDepthStencilState(
        [annotation("_In_")] const D3D11_DEPTH_STENCIL_DESC* pDepthStencilDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11DepthStencilState** ppDepthStencilState );
    HRESULT CreateRasterizerState(
        [annotation("_In_")] const D3D11_RASTERIZER_DESC* pRasterizerDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11RasterizerState** ppRasterizerState );
    HRESULT CreateSamplerState(
        [annotation("_In_")] const D3D11_SAMPLER_DESC* pSamplerDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11SamplerState** ppSamplerState );
    HRESULT CreateQuery(
        [annotation("_In_")] const D3D11_QUERY_DESC* pQueryDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11Query** ppQuery );
    HRESULT CreatePredicate(
        [annotation("_In_")] const D3D11_QUERY_DESC* pPredicateDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11Predicate** ppPredicate );
    HRESULT CreateCounter(
        [annotation("_In_")] const D3D11_COUNTER_DESC* pCounterDesc,
        [annotation("_COM_Outptr_opt_")] ID3D11Counter** ppCounter );
    HRESULT CreateDeferredContext(
        UINT ContextFlags, // Reserved parameter; must be 0
        [annotation("_COM_Outptr_opt_")] ID3D11DeviceContext** ppDeferredContext );
    HRESULT OpenSharedResource(
        [annotation("_In_")] HANDLE hResource,
        [annotation("_In_")] REFIID ReturnedInterface,
        [annotation("_COM_Outptr_opt_")] void ** ppResource);

    // Check*
    HRESULT CheckFormatSupport(
        [annotation("_In_")] DXGI_FORMAT Format,
        [annotation("_Out_")] UINT* pFormatSupport );
    HRESULT CheckMultisampleQualityLevels(
        [annotation("_In_")] DXGI_FORMAT Format,
        [annotation("_In_")] UINT        SampleCount,
        [annotation("_Out_")] UINT* pNumQualityLevels );
    void CheckCounterInfo( [annotation("_Out_")] D3D11_COUNTER_INFO* pCounterInfo );
    HRESULT CheckCounter(
        [annotation("_In_")] const D3D11_COUNTER_DESC* pDesc,
        [annotation("_Out_")] D3D11_COUNTER_TYPE* pType,
        [annotation("_Out_")] UINT* pActiveCounters,
        [annotation("_Out_writes_opt_(*pNameLength)")] LPSTR szName,
        [annotation("_Inout_opt_")] UINT* pNameLength,
        [annotation("_Out_writes_opt_(*pUnitsLength)")] LPSTR szUnits,
        [annotation("_Inout_opt_")] UINT* pUnitsLength,
        [annotation("_Out_writes_opt_(*pDescriptionLength)")] LPSTR szDescription,
        [annotation("_Inout_opt_")] UINT* pDescriptionLength );
    HRESULT CheckFeatureSupport(
        D3D11_FEATURE Feature,
        [annotation("_Out_writes_bytes_(FeatureSupportDataSize)")] void* pFeatureSupportData,
        UINT FeatureSupportDataSize );

    HRESULT GetPrivateData(
        [annotation("_In_")] REFGUID guid,
        [annotation("_Inout_")] UINT* pDataSize,
        [annotation("_Out_writes_bytes_opt_(*pDataSize)")] void* pData );
    HRESULT SetPrivateData(
        [annotation("_In_")] REFGUID guid,
        [annotation("_In_")] UINT DataSize,
        [annotation("_In_reads_bytes_opt_(DataSize)")] const void* pData );
    HRESULT SetPrivateDataInterface(
        [annotation("_In_")] REFGUID guid,
        [annotation("_In_opt_")] const IUnknown* pData );

    D3D_FEATURE_LEVEL GetFeatureLevel();
    UINT GetCreationFlags();
    HRESULT GetDeviceRemovedReason();
    void GetImmediateContext( [annotation("_Outptr_")] ID3D11DeviceContext** ppImmediateContext );
    HRESULT SetExceptionMode( UINT RaiseFlags );
    UINT GetExceptionMode();
};


typedef enum D3D11_CREATE_DEVICE_FLAG
{
    D3D11_CREATE_DEVICE_SINGLETHREADED = 0x1,
    D3D11_CREATE_DEVICE_DEBUG = 0x2,
    D3D11_CREATE_DEVICE_SWITCH_TO_REF = 0x4,
    D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS = 0x8,
    D3D11_CREATE_DEVICE_BGRA_SUPPORT = 0x20,
    D3D11_CREATE_DEVICE_DEBUGGABLE = 0x40,
    D3D11_CREATE_DEVICE_PREVENT_ALTERING_LAYER_SETTINGS_FROM_REGISTRY = 0x0080,
    D3D11_CREATE_DEVICE_DISABLE_GPU_TIMEOUT = 0x0100,
    D3D11_CREATE_DEVICE_VIDEO_SUPPORT = 0x0800,

} D3D11_CREATE_DEVICE_FLAG;

const UINT D3D11_SDK_VERSION = 7;


cpp_quote( "#if !defined( D3D11_IGNORE_SDK_LAYERS ) ")
cpp_quote( "#include \"d3d11sdklayers.h\" ")
cpp_quote( "#endif ")

cpp_quote( "#include \"d3d10_1.h\"" ) // 10_1.h must be included before any other d3d10 headers that would include d3d10.h
#pragma region Desktop Family
cpp_quote( "#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
cpp_quote( "#include \"d3d10shader.h\" ")
cpp_quote( "#include \"d3d10_1shader.h\" ")

cpp_quote( "#include \"d3d10misc.h\" ")

cpp_quote( "#include \"d3d10effect.h\" ")


cpp_quote( "#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */")
#pragma endregion


cpp_quote( "" )
cpp_quote( "///////////////////////////////////////////////////////////////////////////" )
cpp_quote( "// D3D11CreateDevice" )
cpp_quote( "// ------------------" )
cpp_quote( "//" )
cpp_quote( "// pAdapter" )
cpp_quote( "//      If NULL, D3D11CreateDevice will choose the primary adapter and" )
cpp_quote( "//      create a new instance from a temporarily created IDXGIFactory." )
cpp_quote( "//      If non-NULL, D3D11CreateDevice will register the appropriate" )
cpp_quote( "//      device, if necessary (via IDXGIAdapter::RegisterDrver), before" )
cpp_quote( "//      creating the device." )
cpp_quote( "// DriverType" )
cpp_quote( "//      Specifies the driver type to be created: hardware, reference or" )
cpp_quote( "//      null." )
cpp_quote( "// Software" )
cpp_quote( "//      HMODULE of a DLL implementing a software rasterizer. Must be NULL for" )
cpp_quote( "//      non-Software driver types." )
cpp_quote( "// Flags" )
cpp_quote( "//      Any of those documented for D3D11CreateDeviceAndSwapChain." )
cpp_quote( "// pFeatureLevels" )
cpp_quote( "//      Any of those documented for D3D11CreateDeviceAndSwapChain." )
cpp_quote( "// FeatureLevels" )
cpp_quote( "//      Size of feature levels array." )
cpp_quote( "// SDKVersion" )
cpp_quote( "//      SDK version. Use the D3D11_SDK_VERSION macro." )
cpp_quote( "// ppDevice" )
cpp_quote( "//      Pointer to returned interface. May be NULL." )
cpp_quote( "// pFeatureLevel" )
cpp_quote( "//      Pointer to returned feature level. May be NULL." )
cpp_quote( "// ppImmediateContext" )
cpp_quote( "//      Pointer to returned interface. May be NULL." )
cpp_quote( "//" )
cpp_quote( "// Return Values" )
cpp_quote( "//  Any of those documented for " )
cpp_quote( "//          CreateDXGIFactory1" )
cpp_quote( "//          IDXGIFactory::EnumAdapters" )
cpp_quote( "//          IDXGIAdapter::RegisterDriver" )
cpp_quote( "//          D3D11CreateDevice" )
cpp_quote( "//" )
cpp_quote( "///////////////////////////////////////////////////////////////////////////" )
cpp_quote( "typedef HRESULT (WINAPI* PFN_D3D11_CREATE_DEVICE)( _In_opt_ IDXGIAdapter*, " )
cpp_quote( "    D3D_DRIVER_TYPE, HMODULE, UINT, " )
cpp_quote( "    _In_reads_opt_( FeatureLevels ) CONST D3D_FEATURE_LEVEL*, " )
cpp_quote( "    UINT FeatureLevels, UINT, _COM_Outptr_opt_ ID3D11Device**, " )
cpp_quote( "    _Out_opt_ D3D_FEATURE_LEVEL*, _COM_Outptr_opt_ ID3D11DeviceContext** );" )
cpp_quote( "" )
cpp_quote( "HRESULT WINAPI D3D11CreateDevice(" )
cpp_quote( "    _In_opt_ IDXGIAdapter* pAdapter," )
cpp_quote( "    D3D_DRIVER_TYPE DriverType," )
cpp_quote( "    HMODULE Software," )
cpp_quote( "    UINT Flags," )
cpp_quote( "    _In_reads_opt_( FeatureLevels ) CONST D3D_FEATURE_LEVEL* pFeatureLevels," )
cpp_quote( "    UINT FeatureLevels," )
cpp_quote( "    UINT SDKVersion," )
cpp_quote( "    _COM_Outptr_opt_ ID3D11Device** ppDevice," )
cpp_quote( "    _Out_opt_ D3D_FEATURE_LEVEL* pFeatureLevel," )
cpp_quote( "    _COM_Outptr_opt_ ID3D11DeviceContext** ppImmediateContext );" )
cpp_quote( "" )

#pragma region Desktop Family
cpp_quote( "#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")

cpp_quote( "///////////////////////////////////////////////////////////////////////////" )
cpp_quote( "// D3D11CreateDeviceAndSwapChain" )
cpp_quote( "// ------------------------------" )
cpp_quote( "//" )
cpp_quote( "// ppAdapter" )
cpp_quote( "//      If NULL, D3D11CreateDevice will choose the primary adapter and " )
cpp_quote( "//      create a new instance from a temporarily created IDXGIFactory." )
cpp_quote( "//      If non-NULL, D3D11CreateDevice will register the appropriate" )
cpp_quote( "//      device, if necessary (via IDXGIAdapter::RegisterDrver), before" )
cpp_quote( "//      creating the device." )
cpp_quote( "// DriverType" )
cpp_quote( "//      Specifies the driver type to be created: hardware, reference or" )
cpp_quote( "//      null." )
cpp_quote( "// Software" )
cpp_quote( "//      HMODULE of a DLL implementing a software rasterizer. Must be NULL for" )
cpp_quote( "//      non-Software driver types." )
cpp_quote( "// Flags" )
cpp_quote( "//      Any of those documented for D3D11CreateDevice." )
cpp_quote( "// pFeatureLevels" )
cpp_quote( "//      Array of any of the following:" )
cpp_quote( "//          D3D_FEATURE_LEVEL_11_0" )
cpp_quote( "//          D3D_FEATURE_LEVEL_10_1" )
cpp_quote( "//          D3D_FEATURE_LEVEL_10_0" )
cpp_quote( "//          D3D_FEATURE_LEVEL_9_3" )
cpp_quote( "//          D3D_FEATURE_LEVEL_9_2" )
cpp_quote( "//          D3D_FEATURE_LEVEL_9_1" )
cpp_quote( "//      Order indicates sequence in which instantiation will be attempted. If" )
cpp_quote( "//      NULL, then the implied order is the same as previously listed (i.e. " )
cpp_quote( "//      prefer most features available). " )
cpp_quote( "// FeatureLevels" )
cpp_quote( "//      Size of feature levels array." )
cpp_quote( "// SDKVersion" )
cpp_quote( "//      SDK version. Use the D3D11_SDK_VERSION macro." )
cpp_quote( "// pSwapChainDesc" )
cpp_quote( "//      Swap chain description, may be NULL." )
cpp_quote( "// ppSwapChain" )
cpp_quote( "//      Pointer to returned interface. May be NULL." )
cpp_quote( "// ppDevice" )
cpp_quote( "//      Pointer to returned interface. May be NULL." )
cpp_quote( "// pFeatureLevel" )
cpp_quote( "//      Pointer to returned feature level. May be NULL." )
cpp_quote( "// ppImmediateContext" )
cpp_quote( "//      Pointer to returned interface. May be NULL." )
cpp_quote( "//" )
cpp_quote( "// Return Values" )
cpp_quote( "//  Any of those documented for " )
cpp_quote( "//          CreateDXGIFactory1" )
cpp_quote( "//          IDXGIFactory::EnumAdapters" )
cpp_quote( "//          IDXGIAdapter::RegisterDriver" )
cpp_quote( "//          D3D11CreateDevice" )
cpp_quote( "//          IDXGIFactory::CreateSwapChain" )
cpp_quote( "//" )
cpp_quote( "///////////////////////////////////////////////////////////////////////////" )
cpp_quote( "typedef HRESULT (WINAPI* PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN)( _In_opt_ IDXGIAdapter*, " )
cpp_quote( "    D3D_DRIVER_TYPE, HMODULE, UINT, " )
cpp_quote( "    _In_reads_opt_( FeatureLevels ) CONST D3D_FEATURE_LEVEL*, " )
cpp_quote( "    UINT FeatureLevels, UINT, _In_opt_ CONST DXGI_SWAP_CHAIN_DESC*, " )
cpp_quote( "    _COM_Outptr_opt_ IDXGISwapChain**, _COM_Outptr_opt_ ID3D11Device**, " )
cpp_quote( "    _Out_opt_ D3D_FEATURE_LEVEL*, _COM_Outptr_opt_ ID3D11DeviceContext** );" )
cpp_quote( "" )
cpp_quote( "HRESULT WINAPI D3D11CreateDeviceAndSwapChain(" )
cpp_quote( "    _In_opt_ IDXGIAdapter* pAdapter," )
cpp_quote( "    D3D_DRIVER_TYPE DriverType," )
cpp_quote( "    HMODULE Software," )
cpp_quote( "    UINT Flags," )
cpp_quote( "    _In_reads_opt_( FeatureLevels ) CONST D3D_FEATURE_LEVEL* pFeatureLevels," )
cpp_quote( "    UINT FeatureLevels," )
cpp_quote( "    UINT SDKVersion," )
cpp_quote( "    _In_opt_ CONST DXGI_SWAP_CHAIN_DESC* pSwapChainDesc," )
cpp_quote( "    _COM_Outptr_opt_ IDXGISwapChain** ppSwapChain," )
cpp_quote( "    _COM_Outptr_opt_ ID3D11Device** ppDevice," )
cpp_quote( "    _Out_opt_ D3D_FEATURE_LEVEL* pFeatureLevel," )
cpp_quote( "    _COM_Outptr_opt_ ID3D11DeviceContext** ppImmediateContext );" )
cpp_quote( "" )

cpp_quote( "#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */")
#pragma endregion

cpp_quote( "DEFINE_GUID(IID_ID3D11DeviceChild,0x1841e5c8,0x16b0,0x489b,0xbc,0xc8,0x44,0xcf,0xb0,0xd5,0xde,0xae);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11DepthStencilState,0x03823efb,0x8d8f,0x4e1c,0x9a,0xa2,0xf6,0x4b,0xb2,0xcb,0xfd,0xf1);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11BlendState,0x75b68faa,0x347d,0x4159,0x8f,0x45,0xa0,0x64,0x0f,0x01,0xcd,0x9a);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11RasterizerState,0x9bb4ab81,0xab1a,0x4d8f,0xb5,0x06,0xfc,0x04,0x20,0x0b,0x6e,0xe7);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Resource,0xdc8e63f3,0xd12b,0x4952,0xb4,0x7b,0x5e,0x45,0x02,0x6a,0x86,0x2d);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Buffer,0x48570b85,0xd1ee,0x4fcd,0xa2,0x50,0xeb,0x35,0x07,0x22,0xb0,0x37);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Texture1D,0xf8fb5c27,0xc6b3,0x4f75,0xa4,0xc8,0x43,0x9a,0xf2,0xef,0x56,0x4c);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Texture2D,0x6f15aaf2,0xd208,0x4e89,0x9a,0xb4,0x48,0x95,0x35,0xd3,0x4f,0x9c);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Texture3D,0x037e866e,0xf56d,0x4357,0xa8,0xaf,0x9d,0xab,0xbe,0x6e,0x25,0x0e);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11View,0x839d1216,0xbb2e,0x412b,0xb7,0xf4,0xa9,0xdb,0xeb,0xe0,0x8e,0xd1);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11ShaderResourceView,0xb0e06fe0,0x8192,0x4e1a,0xb1,0xca,0x36,0xd7,0x41,0x47,0x10,0xb2);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11RenderTargetView,0xdfdba067,0x0b8d,0x4865,0x87,0x5b,0xd7,0xb4,0x51,0x6c,0xc1,0x64);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11DepthStencilView,0x9fdac92a,0x1876,0x48c3,0xaf,0xad,0x25,0xb9,0x4f,0x84,0xa9,0xb6);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11UnorderedAccessView,0x28acf509,0x7f5c,0x48f6,0x86,0x11,0xf3,0x16,0x01,0x0a,0x63,0x80);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11VertexShader,0x3b301d64,0xd678,0x4289,0x88,0x97,0x22,0xf8,0x92,0x8b,0x72,0xf3);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11HullShader,0x8e5c6061,0x628a,0x4c8e,0x82,0x64,0xbb,0xe4,0x5c,0xb3,0xd5,0xdd);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11DomainShader,0xf582c508,0x0f36,0x490c,0x99,0x77,0x31,0xee,0xce,0x26,0x8c,0xfa);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11GeometryShader,0x38325b96,0xeffb,0x4022,0xba,0x02,0x2e,0x79,0x5b,0x70,0x27,0x5c);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11PixelShader,0xea82e40d,0x51dc,0x4f33,0x93,0xd4,0xdb,0x7c,0x91,0x25,0xae,0x8c);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11ComputeShader,0x4f5b196e,0xc2bd,0x495e,0xbd,0x01,0x1f,0xde,0xd3,0x8e,0x49,0x69);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11InputLayout,0xe4819ddc,0x4cf0,0x4025,0xbd,0x26,0x5d,0xe8,0x2a,0x3e,0x07,0xb7);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11SamplerState,0xda6fea51,0x564c,0x4487,0x98,0x10,0xf0,0xd0,0xf9,0xb4,0xe3,0xa5);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Asynchronous,0x4b35d0cd,0x1e15,0x4258,0x9c,0x98,0x1b,0x13,0x33,0xf6,0xdd,0x3b);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Query,0xd6c00747,0x87b7,0x425e,0xb8,0x4d,0x44,0xd1,0x08,0x56,0x0a,0xfd);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Predicate,0x9eb576dd,0x9f77,0x4d86,0x81,0xaa,0x8b,0xab,0x5f,0xe4,0x90,0xe2);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Counter,0x6e8c49fb,0xa371,0x4770,0xb4,0x40,0x29,0x08,0x60,0x22,0xb7,0x41);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11ClassInstance,0xa6cd7faa,0xb0b7,0x4a2f,0x94,0x36,0x86,0x62,0xa6,0x57,0x97,0xcb);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11ClassLinkage,0xddf57cba,0x9543,0x46e4,0xa1,0x2b,0xf2,0x07,0xa0,0xfe,0x7f,0xed);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11CommandList,0xa24bc4d1,0x769e,0x43f7,0x80,0x13,0x98,0xff,0x56,0x6c,0x18,0xe2);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11DeviceContext,0xc0bfa96c,0xe089,0x44fb,0x8e,0xaf,0x26,0xf8,0x79,0x61,0x90,0xda);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11VideoDecoder,0x3C9C5B51,0x995D,0x48d1,0x9B,0x8D,0xFA,0x5C,0xAE,0xDE,0xD6,0x5C);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11VideoProcessorEnumerator,0x31627037,0x53AB,0x4200,0x90,0x61,0x05,0xFA,0xA9,0xAB,0x45,0xF9);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11VideoProcessor,0x1D7B0652,0x185F,0x41c6,0x85,0xCE,0x0C,0x5B,0xE3,0xD4,0xAE,0x6C);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11AuthenticatedChannel,0x3015A308,0xDCBD,0x47aa,0xA7,0x47,0x19,0x24,0x86,0xD1,0x4D,0x4A);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11CryptoSession,0x9B32F9AD,0xBDCC,0x40a6,0xA3,0x9D,0xD5,0xC8,0x65,0x84,0x57,0x20);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11VideoDecoderOutputView,0xC2931AEA,0x2A85,0x4f20,0x86,0x0F,0xFB,0xA1,0xFD,0x25,0x6E,0x18);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11VideoProcessorInputView,0x11EC5A5F,0x51DC,0x4945,0xAB,0x34,0x6E,0x8C,0x21,0x30,0x0E,0xA5);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11VideoProcessorOutputView,0xA048285E,0x25A9,0x4527,0xBD,0x93,0xD6,0x8B,0x68,0xC4,0x42,0x54);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11VideoContext,0x61F21C45,0x3C0E,0x4a74,0x9C,0xEA,0x67,0x10,0x0D,0x9A,0xD5,0xE4);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11VideoDevice,0x10EC4D5B,0x975A,0x4689,0xB9,0xE4,0xD0,0xAA,0xC3,0x0F,0xE3,0x33);" )
cpp_quote( "DEFINE_GUID(IID_ID3D11Device,0xdb6f6ddb,0xac77,0x4e88,0x82,0x53,0x81,0x9d,0xf9,0xbb,0xf1,0x40);" )
