/*** Autogenerated by WIDL 6.0-rc1 from include/d3d12shader.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __d3d12shader_h__
#define __d3d12shader_h__

/* Forward declarations */

#ifndef __ID3D12ShaderReflectionType_FWD_DEFINED__
#define __ID3D12ShaderReflectionType_FWD_DEFINED__
typedef interface ID3D12ShaderReflectionType ID3D12ShaderReflectionType;
#ifdef __cplusplus
interface ID3D12ShaderReflectionType;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12ShaderReflectionVariable_FWD_DEFINED__
#define __ID3D12ShaderReflectionVariable_FWD_DEFINED__
typedef interface ID3D12ShaderReflectionVariable ID3D12ShaderReflectionVariable;
#ifdef __cplusplus
interface ID3D12ShaderReflectionVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12ShaderReflectionConstantBuffer_FWD_DEFINED__
#define __ID3D12ShaderReflectionConstantBuffer_FWD_DEFINED__
typedef interface ID3D12ShaderReflectionConstantBuffer ID3D12ShaderReflectionConstantBuffer;
#ifdef __cplusplus
interface ID3D12ShaderReflectionConstantBuffer;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12ShaderReflection_FWD_DEFINED__
#define __ID3D12ShaderReflection_FWD_DEFINED__
typedef interface ID3D12ShaderReflection ID3D12ShaderReflection;
#ifdef __cplusplus
interface ID3D12ShaderReflection;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12FunctionParameterReflection_FWD_DEFINED__
#define __ID3D12FunctionParameterReflection_FWD_DEFINED__
typedef interface ID3D12FunctionParameterReflection ID3D12FunctionParameterReflection;
#ifdef __cplusplus
interface ID3D12FunctionParameterReflection;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12FunctionReflection_FWD_DEFINED__
#define __ID3D12FunctionReflection_FWD_DEFINED__
typedef interface ID3D12FunctionReflection ID3D12FunctionReflection;
#ifdef __cplusplus
interface ID3D12FunctionReflection;
#endif /* __cplusplus */
#endif

#ifndef __ID3D12LibraryReflection_FWD_DEFINED__
#define __ID3D12LibraryReflection_FWD_DEFINED__
typedef interface ID3D12LibraryReflection ID3D12LibraryReflection;
#ifdef __cplusplus
interface ID3D12LibraryReflection;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <d3dcommon.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum D3D12_SHADER_VERSION_TYPE {
    D3D12_SHVER_PIXEL_SHADER = 0x0,
    D3D12_SHVER_VERTEX_SHADER = 0x1,
    D3D12_SHVER_GEOMETRY_SHADER = 0x2,
    D3D12_SHVER_HULL_SHADER = 0x3,
    D3D12_SHVER_DOMAIN_SHADER = 0x4,
    D3D12_SHVER_COMPUTE_SHADER = 0x5,
    D3D12_SHVER_RESERVED0 = 0xfff0
} D3D12_SHADER_VERSION_TYPE;
typedef struct _D3D12_SHADER_DESC {
    UINT Version;
    const char *Creator;
    UINT Flags;
    UINT ConstantBuffers;
    UINT BoundResources;
    UINT InputParameters;
    UINT OutputParameters;
    UINT InstructionCount;
    UINT TempRegisterCount;
    UINT TempArrayCount;
    UINT DefCount;
    UINT DclCount;
    UINT TextureNormalInstructions;
    UINT TextureLoadInstructions;
    UINT TextureCompInstructions;
    UINT TextureBiasInstructions;
    UINT TextureGradientInstructions;
    UINT FloatInstructionCount;
    UINT IntInstructionCount;
    UINT UintInstructionCount;
    UINT StaticFlowControlCount;
    UINT DynamicFlowControlCount;
    UINT MacroInstructionCount;
    UINT ArrayInstructionCount;
    UINT CutInstructionCount;
    UINT EmitInstructionCount;
    D3D_PRIMITIVE_TOPOLOGY GSOutputTopology;
    UINT GSMaxOutputVertexCount;
    D3D_PRIMITIVE InputPrimitive;
    UINT PatchConstantParameters;
    UINT cGSInstanceCount;
    UINT cControlPoints;
    D3D_TESSELLATOR_OUTPUT_PRIMITIVE HSOutputPrimitive;
    D3D_TESSELLATOR_PARTITIONING HSPartitioning;
    D3D_TESSELLATOR_DOMAIN TessellatorDomain;
    UINT cBarrierInstructions;
    UINT cInterlockedInstructions;
    UINT cTextureStoreInstructions;
} D3D12_SHADER_DESC;
typedef struct _D3D12_SHADER_VARIABLE_DESC {
    const char *Name;
    UINT StartOffset;
    UINT Size;
    UINT uFlags;
    void *DefaultValue;
    UINT StartTexture;
    UINT TextureSize;
    UINT StartSampler;
    UINT SamplerSize;
} D3D12_SHADER_VARIABLE_DESC;
typedef struct _D3D12_SHADER_TYPE_DESC {
    D3D_SHADER_VARIABLE_CLASS Class;
    D3D_SHADER_VARIABLE_TYPE Type;
    UINT Rows;
    UINT Columns;
    UINT Elements;
    UINT Members;
    UINT Offset;
    const char *Name;
} D3D12_SHADER_TYPE_DESC;
typedef struct _D3D12_SHADER_BUFFER_DESC {
    const char *Name;
    D3D_CBUFFER_TYPE Type;
    UINT Variables;
    UINT Size;
    UINT uFlags;
} D3D12_SHADER_BUFFER_DESC;
typedef struct _D3D12_SHADER_INPUT_BIND_DESC {
    const char *Name;
    D3D_SHADER_INPUT_TYPE Type;
    UINT BindPoint;
    UINT BindCount;
    UINT uFlags;
    D3D_RESOURCE_RETURN_TYPE ReturnType;
    D3D_SRV_DIMENSION Dimension;
    UINT NumSamples;
    UINT Space;
    UINT uID;
} D3D12_SHADER_INPUT_BIND_DESC;
typedef struct _D3D12_SIGNATURE_PARAMETER_DESC {
    const char *SemanticName;
    UINT SemanticIndex;
    UINT Register;
    D3D_NAME SystemValueType;
    D3D_REGISTER_COMPONENT_TYPE ComponentType;
    BYTE Mask;
    BYTE ReadWriteMask;
    UINT Stream;
    D3D_MIN_PRECISION MinPrecision;
} D3D12_SIGNATURE_PARAMETER_DESC;
typedef struct _D3D12_PARAMETER_DESC {
    const char *Name;
    const char *SemanticName;
    D3D_SHADER_VARIABLE_TYPE Type;
    D3D_SHADER_VARIABLE_CLASS Class;
    UINT Rows;
    UINT Columns;
    D3D_INTERPOLATION_MODE InterpolationMode;
    D3D_PARAMETER_FLAGS Flags;
    UINT FirstInRegister;
    UINT FirstInComponent;
    UINT FirstOutRegister;
    UINT FirstOutComponent;
} D3D12_PARAMETER_DESC;
typedef struct _D3D12_FUNCTION_DESC {
    UINT Version;
    const char *Creator;
    UINT Flags;
    UINT ConstantBuffers;
    UINT BoundResources;
    UINT InstructionCount;
    UINT TempRegisterCount;
    UINT TempArrayCount;
    UINT DefCount;
    UINT DclCount;
    UINT TextureNormalInstructions;
    UINT TextureLoadInstructions;
    UINT TextureCompInstructions;
    UINT TextureBiasInstructions;
    UINT TextureGradientInstructions;
    UINT FloatInstructionCount;
    UINT IntInstructionCount;
    UINT UintInstructionCount;
    UINT StaticFlowControlCount;
    UINT DynamicFlowControlCount;
    UINT MacroInstructionCount;
    UINT ArrayInstructionCount;
    UINT MovInstructionCount;
    UINT MovcInstructionCount;
    UINT ConversionInstructionCount;
    UINT BitwiseInstructionCount;
    D3D_FEATURE_LEVEL MinFeatureLevel;
    UINT64 RequiredFeatureFlags;
    const char *Name;
    INT FunctionParameterCount;
    WINBOOL HasReturn;
    WINBOOL Has10Level9VertexShader;
    WINBOOL Has10Level9PixelShader;
} D3D12_FUNCTION_DESC;
typedef struct _D3D12_LIBRARY_DESC {
    const char *Creator;
    UINT Flags;
    UINT FunctionCount;
} D3D12_LIBRARY_DESC;
#ifndef __ID3D12ShaderReflectionConstantBuffer_FWD_DEFINED__
#define __ID3D12ShaderReflectionConstantBuffer_FWD_DEFINED__
typedef interface ID3D12ShaderReflectionConstantBuffer ID3D12ShaderReflectionConstantBuffer;
#ifdef __cplusplus
interface ID3D12ShaderReflectionConstantBuffer;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * ID3D12ShaderReflectionType interface
 */
#ifndef __ID3D12ShaderReflectionType_INTERFACE_DEFINED__
#define __ID3D12ShaderReflectionType_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12ShaderReflectionType, 0xe913c351, 0x783d, 0x48ca, 0xa1,0xd1, 0x4f,0x30,0x62,0x84,0xad,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e913c351-783d-48ca-a1d1-4f306284ad56")
ID3D12ShaderReflectionType
{

    BEGIN_INTERFACE

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D12_SHADER_TYPE_DESC *desc) = 0;

    virtual ID3D12ShaderReflectionType * STDMETHODCALLTYPE GetMemberTypeByIndex(
        UINT index) = 0;

    virtual ID3D12ShaderReflectionType * STDMETHODCALLTYPE GetMemberTypeByName(
        const char *name) = 0;

    virtual const char * STDMETHODCALLTYPE GetMemberTypeName(
        UINT index) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsEqual(
        ID3D12ShaderReflectionType *type) = 0;

    virtual ID3D12ShaderReflectionType * STDMETHODCALLTYPE GetSubType(
        ) = 0;

    virtual ID3D12ShaderReflectionType * STDMETHODCALLTYPE GetBaseClass(
        ) = 0;

    virtual UINT STDMETHODCALLTYPE GetNumInterfaces(
        ) = 0;

    virtual ID3D12ShaderReflectionType * STDMETHODCALLTYPE GetInterfaceByIndex(
        UINT index) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsOfType(
        ID3D12ShaderReflectionType *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE ImplementsInterface(
        ID3D12ShaderReflectionType *base) = 0;

    END_INTERFACE

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12ShaderReflectionType, 0xe913c351, 0x783d, 0x48ca, 0xa1,0xd1, 0x4f,0x30,0x62,0x84,0xad,0x56)
#endif
#else
typedef struct ID3D12ShaderReflectionTypeVtbl {
    BEGIN_INTERFACE

    /*** ID3D12ShaderReflectionType methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D12ShaderReflectionType *This,
        D3D12_SHADER_TYPE_DESC *desc);

    ID3D12ShaderReflectionType * (STDMETHODCALLTYPE *GetMemberTypeByIndex)(
        ID3D12ShaderReflectionType *This,
        UINT index);

    ID3D12ShaderReflectionType * (STDMETHODCALLTYPE *GetMemberTypeByName)(
        ID3D12ShaderReflectionType *This,
        const char *name);

    const char * (STDMETHODCALLTYPE *GetMemberTypeName)(
        ID3D12ShaderReflectionType *This,
        UINT index);

    HRESULT (STDMETHODCALLTYPE *IsEqual)(
        ID3D12ShaderReflectionType *This,
        ID3D12ShaderReflectionType *type);

    ID3D12ShaderReflectionType * (STDMETHODCALLTYPE *GetSubType)(
        ID3D12ShaderReflectionType *This);

    ID3D12ShaderReflectionType * (STDMETHODCALLTYPE *GetBaseClass)(
        ID3D12ShaderReflectionType *This);

    UINT (STDMETHODCALLTYPE *GetNumInterfaces)(
        ID3D12ShaderReflectionType *This);

    ID3D12ShaderReflectionType * (STDMETHODCALLTYPE *GetInterfaceByIndex)(
        ID3D12ShaderReflectionType *This,
        UINT index);

    HRESULT (STDMETHODCALLTYPE *IsOfType)(
        ID3D12ShaderReflectionType *This,
        ID3D12ShaderReflectionType *type);

    HRESULT (STDMETHODCALLTYPE *ImplementsInterface)(
        ID3D12ShaderReflectionType *This,
        ID3D12ShaderReflectionType *base);

    END_INTERFACE
} ID3D12ShaderReflectionTypeVtbl;

interface ID3D12ShaderReflectionType {
    CONST_VTBL ID3D12ShaderReflectionTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D12ShaderReflectionType methods ***/
#define ID3D12ShaderReflectionType_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D12ShaderReflectionType_GetMemberTypeByIndex(This,index) (This)->lpVtbl->GetMemberTypeByIndex(This,index)
#define ID3D12ShaderReflectionType_GetMemberTypeByName(This,name) (This)->lpVtbl->GetMemberTypeByName(This,name)
#define ID3D12ShaderReflectionType_GetMemberTypeName(This,index) (This)->lpVtbl->GetMemberTypeName(This,index)
#define ID3D12ShaderReflectionType_IsEqual(This,type) (This)->lpVtbl->IsEqual(This,type)
#define ID3D12ShaderReflectionType_GetSubType(This) (This)->lpVtbl->GetSubType(This)
#define ID3D12ShaderReflectionType_GetBaseClass(This) (This)->lpVtbl->GetBaseClass(This)
#define ID3D12ShaderReflectionType_GetNumInterfaces(This) (This)->lpVtbl->GetNumInterfaces(This)
#define ID3D12ShaderReflectionType_GetInterfaceByIndex(This,index) (This)->lpVtbl->GetInterfaceByIndex(This,index)
#define ID3D12ShaderReflectionType_IsOfType(This,type) (This)->lpVtbl->IsOfType(This,type)
#define ID3D12ShaderReflectionType_ImplementsInterface(This,base) (This)->lpVtbl->ImplementsInterface(This,base)
#else
/*** ID3D12ShaderReflectionType methods ***/
static FORCEINLINE HRESULT ID3D12ShaderReflectionType_GetDesc(ID3D12ShaderReflectionType* This,D3D12_SHADER_TYPE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static FORCEINLINE ID3D12ShaderReflectionType * ID3D12ShaderReflectionType_GetMemberTypeByIndex(ID3D12ShaderReflectionType* This,UINT index) {
    return This->lpVtbl->GetMemberTypeByIndex(This,index);
}
static FORCEINLINE ID3D12ShaderReflectionType * ID3D12ShaderReflectionType_GetMemberTypeByName(ID3D12ShaderReflectionType* This,const char *name) {
    return This->lpVtbl->GetMemberTypeByName(This,name);
}
static FORCEINLINE const char * ID3D12ShaderReflectionType_GetMemberTypeName(ID3D12ShaderReflectionType* This,UINT index) {
    return This->lpVtbl->GetMemberTypeName(This,index);
}
static FORCEINLINE HRESULT ID3D12ShaderReflectionType_IsEqual(ID3D12ShaderReflectionType* This,ID3D12ShaderReflectionType *type) {
    return This->lpVtbl->IsEqual(This,type);
}
static FORCEINLINE ID3D12ShaderReflectionType * ID3D12ShaderReflectionType_GetSubType(ID3D12ShaderReflectionType* This) {
    return This->lpVtbl->GetSubType(This);
}
static FORCEINLINE ID3D12ShaderReflectionType * ID3D12ShaderReflectionType_GetBaseClass(ID3D12ShaderReflectionType* This) {
    return This->lpVtbl->GetBaseClass(This);
}
static FORCEINLINE UINT ID3D12ShaderReflectionType_GetNumInterfaces(ID3D12ShaderReflectionType* This) {
    return This->lpVtbl->GetNumInterfaces(This);
}
static FORCEINLINE ID3D12ShaderReflectionType * ID3D12ShaderReflectionType_GetInterfaceByIndex(ID3D12ShaderReflectionType* This,UINT index) {
    return This->lpVtbl->GetInterfaceByIndex(This,index);
}
static FORCEINLINE HRESULT ID3D12ShaderReflectionType_IsOfType(ID3D12ShaderReflectionType* This,ID3D12ShaderReflectionType *type) {
    return This->lpVtbl->IsOfType(This,type);
}
static FORCEINLINE HRESULT ID3D12ShaderReflectionType_ImplementsInterface(ID3D12ShaderReflectionType* This,ID3D12ShaderReflectionType *base) {
    return This->lpVtbl->ImplementsInterface(This,base);
}
#endif
#endif

#endif


#endif  /* __ID3D12ShaderReflectionType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12ShaderReflectionVariable interface
 */
#ifndef __ID3D12ShaderReflectionVariable_INTERFACE_DEFINED__
#define __ID3D12ShaderReflectionVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12ShaderReflectionVariable, 0x8337a8a6, 0xa216, 0x444a, 0xb2,0xf4, 0x31,0x47,0x33,0xa7,0x3a,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8337a8a6-a216-444a-b2f4-314733a73aea")
ID3D12ShaderReflectionVariable
{

    BEGIN_INTERFACE

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D12_SHADER_VARIABLE_DESC *desc) = 0;

    virtual ID3D12ShaderReflectionType * STDMETHODCALLTYPE GetType(
        ) = 0;

    virtual ID3D12ShaderReflectionConstantBuffer * STDMETHODCALLTYPE GetBuffer(
        ) = 0;

    virtual UINT STDMETHODCALLTYPE GetInterfaceSlot(
        UINT index) = 0;

    END_INTERFACE

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12ShaderReflectionVariable, 0x8337a8a6, 0xa216, 0x444a, 0xb2,0xf4, 0x31,0x47,0x33,0xa7,0x3a,0xea)
#endif
#else
typedef struct ID3D12ShaderReflectionVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D12ShaderReflectionVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D12ShaderReflectionVariable *This,
        D3D12_SHADER_VARIABLE_DESC *desc);

    ID3D12ShaderReflectionType * (STDMETHODCALLTYPE *GetType)(
        ID3D12ShaderReflectionVariable *This);

    ID3D12ShaderReflectionConstantBuffer * (STDMETHODCALLTYPE *GetBuffer)(
        ID3D12ShaderReflectionVariable *This);

    UINT (STDMETHODCALLTYPE *GetInterfaceSlot)(
        ID3D12ShaderReflectionVariable *This,
        UINT index);

    END_INTERFACE
} ID3D12ShaderReflectionVariableVtbl;

interface ID3D12ShaderReflectionVariable {
    CONST_VTBL ID3D12ShaderReflectionVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D12ShaderReflectionVariable methods ***/
#define ID3D12ShaderReflectionVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D12ShaderReflectionVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D12ShaderReflectionVariable_GetBuffer(This) (This)->lpVtbl->GetBuffer(This)
#define ID3D12ShaderReflectionVariable_GetInterfaceSlot(This,index) (This)->lpVtbl->GetInterfaceSlot(This,index)
#else
/*** ID3D12ShaderReflectionVariable methods ***/
static FORCEINLINE HRESULT ID3D12ShaderReflectionVariable_GetDesc(ID3D12ShaderReflectionVariable* This,D3D12_SHADER_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static FORCEINLINE ID3D12ShaderReflectionType * ID3D12ShaderReflectionVariable_GetType(ID3D12ShaderReflectionVariable* This) {
    return This->lpVtbl->GetType(This);
}
static FORCEINLINE ID3D12ShaderReflectionConstantBuffer * ID3D12ShaderReflectionVariable_GetBuffer(ID3D12ShaderReflectionVariable* This) {
    return This->lpVtbl->GetBuffer(This);
}
static FORCEINLINE UINT ID3D12ShaderReflectionVariable_GetInterfaceSlot(ID3D12ShaderReflectionVariable* This,UINT index) {
    return This->lpVtbl->GetInterfaceSlot(This,index);
}
#endif
#endif

#endif


#endif  /* __ID3D12ShaderReflectionVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12ShaderReflectionConstantBuffer interface
 */
#ifndef __ID3D12ShaderReflectionConstantBuffer_INTERFACE_DEFINED__
#define __ID3D12ShaderReflectionConstantBuffer_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12ShaderReflectionConstantBuffer, 0xc59598b4, 0x48b3, 0x4869, 0xb9,0xb1, 0xb1,0x61,0x8b,0x14,0xa8,0xb7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c59598b4-48b3-4869-b9b1-b1618b14a8b7")
ID3D12ShaderReflectionConstantBuffer
{

    BEGIN_INTERFACE

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D12_SHADER_BUFFER_DESC *desc) = 0;

    virtual ID3D12ShaderReflectionVariable * STDMETHODCALLTYPE GetVariableByIndex(
        UINT index) = 0;

    virtual ID3D12ShaderReflectionVariable * STDMETHODCALLTYPE GetVariableByName(
        const char *name) = 0;

    END_INTERFACE

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12ShaderReflectionConstantBuffer, 0xc59598b4, 0x48b3, 0x4869, 0xb9,0xb1, 0xb1,0x61,0x8b,0x14,0xa8,0xb7)
#endif
#else
typedef struct ID3D12ShaderReflectionConstantBufferVtbl {
    BEGIN_INTERFACE

    /*** ID3D12ShaderReflectionConstantBuffer methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D12ShaderReflectionConstantBuffer *This,
        D3D12_SHADER_BUFFER_DESC *desc);

    ID3D12ShaderReflectionVariable * (STDMETHODCALLTYPE *GetVariableByIndex)(
        ID3D12ShaderReflectionConstantBuffer *This,
        UINT index);

    ID3D12ShaderReflectionVariable * (STDMETHODCALLTYPE *GetVariableByName)(
        ID3D12ShaderReflectionConstantBuffer *This,
        const char *name);

    END_INTERFACE
} ID3D12ShaderReflectionConstantBufferVtbl;

interface ID3D12ShaderReflectionConstantBuffer {
    CONST_VTBL ID3D12ShaderReflectionConstantBufferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D12ShaderReflectionConstantBuffer methods ***/
#define ID3D12ShaderReflectionConstantBuffer_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D12ShaderReflectionConstantBuffer_GetVariableByIndex(This,index) (This)->lpVtbl->GetVariableByIndex(This,index)
#define ID3D12ShaderReflectionConstantBuffer_GetVariableByName(This,name) (This)->lpVtbl->GetVariableByName(This,name)
#else
/*** ID3D12ShaderReflectionConstantBuffer methods ***/
static FORCEINLINE HRESULT ID3D12ShaderReflectionConstantBuffer_GetDesc(ID3D12ShaderReflectionConstantBuffer* This,D3D12_SHADER_BUFFER_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static FORCEINLINE ID3D12ShaderReflectionVariable * ID3D12ShaderReflectionConstantBuffer_GetVariableByIndex(ID3D12ShaderReflectionConstantBuffer* This,UINT index) {
    return This->lpVtbl->GetVariableByIndex(This,index);
}
static FORCEINLINE ID3D12ShaderReflectionVariable * ID3D12ShaderReflectionConstantBuffer_GetVariableByName(ID3D12ShaderReflectionConstantBuffer* This,const char *name) {
    return This->lpVtbl->GetVariableByName(This,name);
}
#endif
#endif

#endif


#endif  /* __ID3D12ShaderReflectionConstantBuffer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12ShaderReflection interface
 */
#ifndef __ID3D12ShaderReflection_INTERFACE_DEFINED__
#define __ID3D12ShaderReflection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12ShaderReflection, 0x5a58797d, 0xa72c, 0x478d, 0x8b,0xa2, 0xef,0xc6,0xb0,0xef,0xe8,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5a58797d-a72c-478d-8ba2-efc6b0efe88e")
ID3D12ShaderReflection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D12_SHADER_DESC *desc) = 0;

    virtual ID3D12ShaderReflectionConstantBuffer * STDMETHODCALLTYPE GetConstantBufferByIndex(
        UINT index) = 0;

    virtual ID3D12ShaderReflectionConstantBuffer * STDMETHODCALLTYPE GetConstantBufferByName(
        const char *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResourceBindingDesc(
        UINT index,
        D3D12_SHADER_INPUT_BIND_DESC *desc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputParameterDesc(
        UINT index,
        D3D12_SIGNATURE_PARAMETER_DESC *desc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputParameterDesc(
        UINT index,
        D3D12_SIGNATURE_PARAMETER_DESC *desc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPatchConstantParameterDesc(
        UINT index,
        D3D12_SIGNATURE_PARAMETER_DESC *desc) = 0;

    virtual ID3D12ShaderReflectionVariable * STDMETHODCALLTYPE GetVariableByName(
        const char *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResourceBindingDescByName(
        const char *name,
        D3D12_SHADER_INPUT_BIND_DESC *desc) = 0;

    virtual UINT STDMETHODCALLTYPE GetMovInstructionCount(
        ) = 0;

    virtual UINT STDMETHODCALLTYPE GetMovcInstructionCount(
        ) = 0;

    virtual UINT STDMETHODCALLTYPE GetConversionInstructionCount(
        ) = 0;

    virtual UINT STDMETHODCALLTYPE GetBitwiseInstructionCount(
        ) = 0;

    virtual D3D_PRIMITIVE STDMETHODCALLTYPE GetGSInputPrimitive(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE IsSampleFrequencyShader(
        ) = 0;

    virtual UINT STDMETHODCALLTYPE GetNumInterfaceSlots(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMinFeatureLevel(
        D3D_FEATURE_LEVEL *level) = 0;

    virtual UINT STDMETHODCALLTYPE GetThreadGroupSize(
        UINT *sizex,
        UINT *sizey,
        UINT *sizez) = 0;

    virtual UINT64 STDMETHODCALLTYPE GetRequiresFlags(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12ShaderReflection, 0x5a58797d, 0xa72c, 0x478d, 0x8b,0xa2, 0xef,0xc6,0xb0,0xef,0xe8,0x8e)
#endif
#else
typedef struct ID3D12ShaderReflectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12ShaderReflection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12ShaderReflection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12ShaderReflection *This);

    /*** ID3D12ShaderReflection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D12ShaderReflection *This,
        D3D12_SHADER_DESC *desc);

    ID3D12ShaderReflectionConstantBuffer * (STDMETHODCALLTYPE *GetConstantBufferByIndex)(
        ID3D12ShaderReflection *This,
        UINT index);

    ID3D12ShaderReflectionConstantBuffer * (STDMETHODCALLTYPE *GetConstantBufferByName)(
        ID3D12ShaderReflection *This,
        const char *name);

    HRESULT (STDMETHODCALLTYPE *GetResourceBindingDesc)(
        ID3D12ShaderReflection *This,
        UINT index,
        D3D12_SHADER_INPUT_BIND_DESC *desc);

    HRESULT (STDMETHODCALLTYPE *GetInputParameterDesc)(
        ID3D12ShaderReflection *This,
        UINT index,
        D3D12_SIGNATURE_PARAMETER_DESC *desc);

    HRESULT (STDMETHODCALLTYPE *GetOutputParameterDesc)(
        ID3D12ShaderReflection *This,
        UINT index,
        D3D12_SIGNATURE_PARAMETER_DESC *desc);

    HRESULT (STDMETHODCALLTYPE *GetPatchConstantParameterDesc)(
        ID3D12ShaderReflection *This,
        UINT index,
        D3D12_SIGNATURE_PARAMETER_DESC *desc);

    ID3D12ShaderReflectionVariable * (STDMETHODCALLTYPE *GetVariableByName)(
        ID3D12ShaderReflection *This,
        const char *name);

    HRESULT (STDMETHODCALLTYPE *GetResourceBindingDescByName)(
        ID3D12ShaderReflection *This,
        const char *name,
        D3D12_SHADER_INPUT_BIND_DESC *desc);

    UINT (STDMETHODCALLTYPE *GetMovInstructionCount)(
        ID3D12ShaderReflection *This);

    UINT (STDMETHODCALLTYPE *GetMovcInstructionCount)(
        ID3D12ShaderReflection *This);

    UINT (STDMETHODCALLTYPE *GetConversionInstructionCount)(
        ID3D12ShaderReflection *This);

    UINT (STDMETHODCALLTYPE *GetBitwiseInstructionCount)(
        ID3D12ShaderReflection *This);

    D3D_PRIMITIVE (STDMETHODCALLTYPE *GetGSInputPrimitive)(
        ID3D12ShaderReflection *This);

    WINBOOL (STDMETHODCALLTYPE *IsSampleFrequencyShader)(
        ID3D12ShaderReflection *This);

    UINT (STDMETHODCALLTYPE *GetNumInterfaceSlots)(
        ID3D12ShaderReflection *This);

    HRESULT (STDMETHODCALLTYPE *GetMinFeatureLevel)(
        ID3D12ShaderReflection *This,
        D3D_FEATURE_LEVEL *level);

    UINT (STDMETHODCALLTYPE *GetThreadGroupSize)(
        ID3D12ShaderReflection *This,
        UINT *sizex,
        UINT *sizey,
        UINT *sizez);

    UINT64 (STDMETHODCALLTYPE *GetRequiresFlags)(
        ID3D12ShaderReflection *This);

    END_INTERFACE
} ID3D12ShaderReflectionVtbl;

interface ID3D12ShaderReflection {
    CONST_VTBL ID3D12ShaderReflectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12ShaderReflection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12ShaderReflection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12ShaderReflection_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12ShaderReflection methods ***/
#define ID3D12ShaderReflection_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D12ShaderReflection_GetConstantBufferByIndex(This,index) (This)->lpVtbl->GetConstantBufferByIndex(This,index)
#define ID3D12ShaderReflection_GetConstantBufferByName(This,name) (This)->lpVtbl->GetConstantBufferByName(This,name)
#define ID3D12ShaderReflection_GetResourceBindingDesc(This,index,desc) (This)->lpVtbl->GetResourceBindingDesc(This,index,desc)
#define ID3D12ShaderReflection_GetInputParameterDesc(This,index,desc) (This)->lpVtbl->GetInputParameterDesc(This,index,desc)
#define ID3D12ShaderReflection_GetOutputParameterDesc(This,index,desc) (This)->lpVtbl->GetOutputParameterDesc(This,index,desc)
#define ID3D12ShaderReflection_GetPatchConstantParameterDesc(This,index,desc) (This)->lpVtbl->GetPatchConstantParameterDesc(This,index,desc)
#define ID3D12ShaderReflection_GetVariableByName(This,name) (This)->lpVtbl->GetVariableByName(This,name)
#define ID3D12ShaderReflection_GetResourceBindingDescByName(This,name,desc) (This)->lpVtbl->GetResourceBindingDescByName(This,name,desc)
#define ID3D12ShaderReflection_GetMovInstructionCount(This) (This)->lpVtbl->GetMovInstructionCount(This)
#define ID3D12ShaderReflection_GetMovcInstructionCount(This) (This)->lpVtbl->GetMovcInstructionCount(This)
#define ID3D12ShaderReflection_GetConversionInstructionCount(This) (This)->lpVtbl->GetConversionInstructionCount(This)
#define ID3D12ShaderReflection_GetBitwiseInstructionCount(This) (This)->lpVtbl->GetBitwiseInstructionCount(This)
#define ID3D12ShaderReflection_GetGSInputPrimitive(This) (This)->lpVtbl->GetGSInputPrimitive(This)
#define ID3D12ShaderReflection_IsSampleFrequencyShader(This) (This)->lpVtbl->IsSampleFrequencyShader(This)
#define ID3D12ShaderReflection_GetNumInterfaceSlots(This) (This)->lpVtbl->GetNumInterfaceSlots(This)
#define ID3D12ShaderReflection_GetMinFeatureLevel(This,level) (This)->lpVtbl->GetMinFeatureLevel(This,level)
#define ID3D12ShaderReflection_GetThreadGroupSize(This,sizex,sizey,sizez) (This)->lpVtbl->GetThreadGroupSize(This,sizex,sizey,sizez)
#define ID3D12ShaderReflection_GetRequiresFlags(This) (This)->lpVtbl->GetRequiresFlags(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12ShaderReflection_QueryInterface(ID3D12ShaderReflection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12ShaderReflection_AddRef(ID3D12ShaderReflection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12ShaderReflection_Release(ID3D12ShaderReflection* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12ShaderReflection methods ***/
static FORCEINLINE HRESULT ID3D12ShaderReflection_GetDesc(ID3D12ShaderReflection* This,D3D12_SHADER_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static FORCEINLINE ID3D12ShaderReflectionConstantBuffer * ID3D12ShaderReflection_GetConstantBufferByIndex(ID3D12ShaderReflection* This,UINT index) {
    return This->lpVtbl->GetConstantBufferByIndex(This,index);
}
static FORCEINLINE ID3D12ShaderReflectionConstantBuffer * ID3D12ShaderReflection_GetConstantBufferByName(ID3D12ShaderReflection* This,const char *name) {
    return This->lpVtbl->GetConstantBufferByName(This,name);
}
static FORCEINLINE HRESULT ID3D12ShaderReflection_GetResourceBindingDesc(ID3D12ShaderReflection* This,UINT index,D3D12_SHADER_INPUT_BIND_DESC *desc) {
    return This->lpVtbl->GetResourceBindingDesc(This,index,desc);
}
static FORCEINLINE HRESULT ID3D12ShaderReflection_GetInputParameterDesc(ID3D12ShaderReflection* This,UINT index,D3D12_SIGNATURE_PARAMETER_DESC *desc) {
    return This->lpVtbl->GetInputParameterDesc(This,index,desc);
}
static FORCEINLINE HRESULT ID3D12ShaderReflection_GetOutputParameterDesc(ID3D12ShaderReflection* This,UINT index,D3D12_SIGNATURE_PARAMETER_DESC *desc) {
    return This->lpVtbl->GetOutputParameterDesc(This,index,desc);
}
static FORCEINLINE HRESULT ID3D12ShaderReflection_GetPatchConstantParameterDesc(ID3D12ShaderReflection* This,UINT index,D3D12_SIGNATURE_PARAMETER_DESC *desc) {
    return This->lpVtbl->GetPatchConstantParameterDesc(This,index,desc);
}
static FORCEINLINE ID3D12ShaderReflectionVariable * ID3D12ShaderReflection_GetVariableByName(ID3D12ShaderReflection* This,const char *name) {
    return This->lpVtbl->GetVariableByName(This,name);
}
static FORCEINLINE HRESULT ID3D12ShaderReflection_GetResourceBindingDescByName(ID3D12ShaderReflection* This,const char *name,D3D12_SHADER_INPUT_BIND_DESC *desc) {
    return This->lpVtbl->GetResourceBindingDescByName(This,name,desc);
}
static FORCEINLINE UINT ID3D12ShaderReflection_GetMovInstructionCount(ID3D12ShaderReflection* This) {
    return This->lpVtbl->GetMovInstructionCount(This);
}
static FORCEINLINE UINT ID3D12ShaderReflection_GetMovcInstructionCount(ID3D12ShaderReflection* This) {
    return This->lpVtbl->GetMovcInstructionCount(This);
}
static FORCEINLINE UINT ID3D12ShaderReflection_GetConversionInstructionCount(ID3D12ShaderReflection* This) {
    return This->lpVtbl->GetConversionInstructionCount(This);
}
static FORCEINLINE UINT ID3D12ShaderReflection_GetBitwiseInstructionCount(ID3D12ShaderReflection* This) {
    return This->lpVtbl->GetBitwiseInstructionCount(This);
}
static FORCEINLINE D3D_PRIMITIVE ID3D12ShaderReflection_GetGSInputPrimitive(ID3D12ShaderReflection* This) {
    return This->lpVtbl->GetGSInputPrimitive(This);
}
static FORCEINLINE WINBOOL ID3D12ShaderReflection_IsSampleFrequencyShader(ID3D12ShaderReflection* This) {
    return This->lpVtbl->IsSampleFrequencyShader(This);
}
static FORCEINLINE UINT ID3D12ShaderReflection_GetNumInterfaceSlots(ID3D12ShaderReflection* This) {
    return This->lpVtbl->GetNumInterfaceSlots(This);
}
static FORCEINLINE HRESULT ID3D12ShaderReflection_GetMinFeatureLevel(ID3D12ShaderReflection* This,D3D_FEATURE_LEVEL *level) {
    return This->lpVtbl->GetMinFeatureLevel(This,level);
}
static FORCEINLINE UINT ID3D12ShaderReflection_GetThreadGroupSize(ID3D12ShaderReflection* This,UINT *sizex,UINT *sizey,UINT *sizez) {
    return This->lpVtbl->GetThreadGroupSize(This,sizex,sizey,sizez);
}
static FORCEINLINE UINT64 ID3D12ShaderReflection_GetRequiresFlags(ID3D12ShaderReflection* This) {
    return This->lpVtbl->GetRequiresFlags(This);
}
#endif
#endif

#endif


#endif  /* __ID3D12ShaderReflection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12FunctionParameterReflection interface
 */
#ifndef __ID3D12FunctionParameterReflection_INTERFACE_DEFINED__
#define __ID3D12FunctionParameterReflection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12FunctionParameterReflection, 0xec25f42d, 0x7006, 0x4f2b, 0xb3,0x3e, 0x02,0xcc,0x33,0x75,0x73,0x3f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ec25f42d-7006-4f2b-b33e-02cc3375733f")
ID3D12FunctionParameterReflection
{

    BEGIN_INTERFACE

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D12_PARAMETER_DESC *desc) = 0;

    END_INTERFACE

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12FunctionParameterReflection, 0xec25f42d, 0x7006, 0x4f2b, 0xb3,0x3e, 0x02,0xcc,0x33,0x75,0x73,0x3f)
#endif
#else
typedef struct ID3D12FunctionParameterReflectionVtbl {
    BEGIN_INTERFACE

    /*** ID3D12FunctionParameterReflection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D12FunctionParameterReflection *This,
        D3D12_PARAMETER_DESC *desc);

    END_INTERFACE
} ID3D12FunctionParameterReflectionVtbl;

interface ID3D12FunctionParameterReflection {
    CONST_VTBL ID3D12FunctionParameterReflectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D12FunctionParameterReflection methods ***/
#define ID3D12FunctionParameterReflection_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#else
/*** ID3D12FunctionParameterReflection methods ***/
static FORCEINLINE HRESULT ID3D12FunctionParameterReflection_GetDesc(ID3D12FunctionParameterReflection* This,D3D12_PARAMETER_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
#endif
#endif

#endif


#endif  /* __ID3D12FunctionParameterReflection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12FunctionReflection interface
 */
#ifndef __ID3D12FunctionReflection_INTERFACE_DEFINED__
#define __ID3D12FunctionReflection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12FunctionReflection, 0x1108795c, 0x2772, 0x4ba9, 0xb2,0xa8, 0xd4,0x64,0xdc,0x7e,0x27,0x99);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1108795c-2772-4ba9-b2a8-d464dc7e2799")
ID3D12FunctionReflection
{

    BEGIN_INTERFACE

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D12_FUNCTION_DESC *desc) = 0;

    virtual ID3D12ShaderReflectionConstantBuffer * STDMETHODCALLTYPE GetConstantBufferByIndex(
        UINT index) = 0;

    virtual ID3D12ShaderReflectionConstantBuffer * STDMETHODCALLTYPE GetConstantBufferByName(
        const char *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResourceBindingDesc(
        UINT index,
        D3D12_SHADER_INPUT_BIND_DESC *desc) = 0;

    virtual ID3D12ShaderReflectionVariable * STDMETHODCALLTYPE GetVariableByName(
        const char *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResourceBindingDescByName(
        const char *name,
        D3D12_SHADER_INPUT_BIND_DESC *desc) = 0;

    virtual ID3D12FunctionParameterReflection * STDMETHODCALLTYPE GetFunctionParameter(
        INT index) = 0;

    END_INTERFACE

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12FunctionReflection, 0x1108795c, 0x2772, 0x4ba9, 0xb2,0xa8, 0xd4,0x64,0xdc,0x7e,0x27,0x99)
#endif
#else
typedef struct ID3D12FunctionReflectionVtbl {
    BEGIN_INTERFACE

    /*** ID3D12FunctionReflection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D12FunctionReflection *This,
        D3D12_FUNCTION_DESC *desc);

    ID3D12ShaderReflectionConstantBuffer * (STDMETHODCALLTYPE *GetConstantBufferByIndex)(
        ID3D12FunctionReflection *This,
        UINT index);

    ID3D12ShaderReflectionConstantBuffer * (STDMETHODCALLTYPE *GetConstantBufferByName)(
        ID3D12FunctionReflection *This,
        const char *name);

    HRESULT (STDMETHODCALLTYPE *GetResourceBindingDesc)(
        ID3D12FunctionReflection *This,
        UINT index,
        D3D12_SHADER_INPUT_BIND_DESC *desc);

    ID3D12ShaderReflectionVariable * (STDMETHODCALLTYPE *GetVariableByName)(
        ID3D12FunctionReflection *This,
        const char *name);

    HRESULT (STDMETHODCALLTYPE *GetResourceBindingDescByName)(
        ID3D12FunctionReflection *This,
        const char *name,
        D3D12_SHADER_INPUT_BIND_DESC *desc);

    ID3D12FunctionParameterReflection * (STDMETHODCALLTYPE *GetFunctionParameter)(
        ID3D12FunctionReflection *This,
        INT index);

    END_INTERFACE
} ID3D12FunctionReflectionVtbl;

interface ID3D12FunctionReflection {
    CONST_VTBL ID3D12FunctionReflectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D12FunctionReflection methods ***/
#define ID3D12FunctionReflection_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D12FunctionReflection_GetConstantBufferByIndex(This,index) (This)->lpVtbl->GetConstantBufferByIndex(This,index)
#define ID3D12FunctionReflection_GetConstantBufferByName(This,name) (This)->lpVtbl->GetConstantBufferByName(This,name)
#define ID3D12FunctionReflection_GetResourceBindingDesc(This,index,desc) (This)->lpVtbl->GetResourceBindingDesc(This,index,desc)
#define ID3D12FunctionReflection_GetVariableByName(This,name) (This)->lpVtbl->GetVariableByName(This,name)
#define ID3D12FunctionReflection_GetResourceBindingDescByName(This,name,desc) (This)->lpVtbl->GetResourceBindingDescByName(This,name,desc)
#define ID3D12FunctionReflection_GetFunctionParameter(This,index) (This)->lpVtbl->GetFunctionParameter(This,index)
#else
/*** ID3D12FunctionReflection methods ***/
static FORCEINLINE HRESULT ID3D12FunctionReflection_GetDesc(ID3D12FunctionReflection* This,D3D12_FUNCTION_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static FORCEINLINE ID3D12ShaderReflectionConstantBuffer * ID3D12FunctionReflection_GetConstantBufferByIndex(ID3D12FunctionReflection* This,UINT index) {
    return This->lpVtbl->GetConstantBufferByIndex(This,index);
}
static FORCEINLINE ID3D12ShaderReflectionConstantBuffer * ID3D12FunctionReflection_GetConstantBufferByName(ID3D12FunctionReflection* This,const char *name) {
    return This->lpVtbl->GetConstantBufferByName(This,name);
}
static FORCEINLINE HRESULT ID3D12FunctionReflection_GetResourceBindingDesc(ID3D12FunctionReflection* This,UINT index,D3D12_SHADER_INPUT_BIND_DESC *desc) {
    return This->lpVtbl->GetResourceBindingDesc(This,index,desc);
}
static FORCEINLINE ID3D12ShaderReflectionVariable * ID3D12FunctionReflection_GetVariableByName(ID3D12FunctionReflection* This,const char *name) {
    return This->lpVtbl->GetVariableByName(This,name);
}
static FORCEINLINE HRESULT ID3D12FunctionReflection_GetResourceBindingDescByName(ID3D12FunctionReflection* This,const char *name,D3D12_SHADER_INPUT_BIND_DESC *desc) {
    return This->lpVtbl->GetResourceBindingDescByName(This,name,desc);
}
static FORCEINLINE ID3D12FunctionParameterReflection * ID3D12FunctionReflection_GetFunctionParameter(ID3D12FunctionReflection* This,INT index) {
    return This->lpVtbl->GetFunctionParameter(This,index);
}
#endif
#endif

#endif


#endif  /* __ID3D12FunctionReflection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D12LibraryReflection interface
 */
#ifndef __ID3D12LibraryReflection_INTERFACE_DEFINED__
#define __ID3D12LibraryReflection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D12LibraryReflection, 0x8e349d19, 0x54db, 0x4a56, 0x9d,0xc9, 0x11,0x9d,0x87,0xbd,0xb8,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8e349d19-54db-4a56-9dc9-119d87bdb804")
ID3D12LibraryReflection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D12_LIBRARY_DESC *desc) = 0;

    virtual ID3D12FunctionReflection * STDMETHODCALLTYPE GetFunctionByIndex(
        INT index) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D12LibraryReflection, 0x8e349d19, 0x54db, 0x4a56, 0x9d,0xc9, 0x11,0x9d,0x87,0xbd,0xb8,0x04)
#endif
#else
typedef struct ID3D12LibraryReflectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D12LibraryReflection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D12LibraryReflection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D12LibraryReflection *This);

    /*** ID3D12LibraryReflection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D12LibraryReflection *This,
        D3D12_LIBRARY_DESC *desc);

    ID3D12FunctionReflection * (STDMETHODCALLTYPE *GetFunctionByIndex)(
        ID3D12LibraryReflection *This,
        INT index);

    END_INTERFACE
} ID3D12LibraryReflectionVtbl;

interface ID3D12LibraryReflection {
    CONST_VTBL ID3D12LibraryReflectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D12LibraryReflection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D12LibraryReflection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D12LibraryReflection_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D12LibraryReflection methods ***/
#define ID3D12LibraryReflection_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D12LibraryReflection_GetFunctionByIndex(This,index) (This)->lpVtbl->GetFunctionByIndex(This,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ID3D12LibraryReflection_QueryInterface(ID3D12LibraryReflection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ID3D12LibraryReflection_AddRef(ID3D12LibraryReflection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ID3D12LibraryReflection_Release(ID3D12LibraryReflection* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D12LibraryReflection methods ***/
static FORCEINLINE HRESULT ID3D12LibraryReflection_GetDesc(ID3D12LibraryReflection* This,D3D12_LIBRARY_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static FORCEINLINE ID3D12FunctionReflection * ID3D12LibraryReflection_GetFunctionByIndex(ID3D12LibraryReflection* This,INT index) {
    return This->lpVtbl->GetFunctionByIndex(This,index);
}
#endif
#endif

#endif


#endif  /* __ID3D12LibraryReflection_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __d3d12shader_h__ */
