/*
 * Copyright 1993-2014 NVIDIA Corporation.  All rights reserved.
 *
 * NVIDIA Corporation and its licensors retain all intellectual property and
 * proprietary rights in and to this software and related documentation.
 * Any use, reproduction, disclosure, or distribution of this software
 * and related documentation without an express license agreement from
 * NVIDIA Corporation is strictly prohibited.
 *
 */


//////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
//
//  File:       D3DX11Effect.h
//  Content:    D3DX11 Effect Types & APIs Header
//
//////////////////////////////////////////////////////////////////////////////

#ifndef __D3DX11EFFECT_H__
#define __D3DX11EFFECT_H__

#include "d3d11.h"
#include "d3d11shader.h"

//////////////////////////////////////////////////////////////////////////////
// File contents:
//
// 1) Stateblock enums, structs, interfaces, flat APIs
// 2) Effect enums, structs, interfaces, flat APIs
//////////////////////////////////////////////////////////////////////////////

#ifndef D3DX11_BYTES_FROM_BITS
#define D3DX11_BYTES_FROM_BITS(x) (((x) + 7) / 8)
#endif // D3DX11_BYTES_FROM_BITS

typedef struct _D3DX11_STATE_BLOCK_MASK
{
    BYTE VS;
    BYTE VSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
    BYTE VSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
    BYTE VSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
    BYTE VSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];

    BYTE HS;
    BYTE HSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
    BYTE HSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
    BYTE HSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
    BYTE HSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];

    BYTE DS;
    BYTE DSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
    BYTE DSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
    BYTE DSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
    BYTE DSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];

    BYTE GS;
    BYTE GSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
    BYTE GSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
    BYTE GSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
    BYTE GSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];

    BYTE PS;
    BYTE PSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
    BYTE PSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
    BYTE PSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
    BYTE PSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];
    BYTE PSUnorderedAccessViews;

    BYTE CS;
    BYTE CSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
    BYTE CSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
    BYTE CSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
    BYTE CSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];
    BYTE CSUnorderedAccessViews;

    BYTE IAVertexBuffers[D3DX11_BYTES_FROM_BITS(D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT)];
    BYTE IAIndexBuffer;
    BYTE IAInputLayout;
    BYTE IAPrimitiveTopology;

    BYTE OMRenderTargets;
    BYTE OMDepthStencilState;
    BYTE OMBlendState;

    BYTE RSViewports;
    BYTE RSScissorRects;
    BYTE RSRasterizerState;

    BYTE SOBuffers;

    BYTE Predication;
} D3DX11_STATE_BLOCK_MASK;

//----------------------------------------------------------------------------
// D3DX11_EFFECT flags:
// -------------------------------------
//
// These flags are passed in when creating an effect, and affect
// the runtime effect behavior:
//
// (Currently none)
//
//
// These flags are set by the effect runtime:
//
// D3DX11_EFFECT_OPTIMIZED
//   This effect has been optimized. Reflection functions that rely on
//   names/semantics/strings should fail. This is set when Optimize() is
//   called, but CEffect::IsOptimized() should be used to test for this.
//
// D3DX11_EFFECT_CLONE
//   This effect is a clone of another effect. Single CBs will never be
//   updated when internal variable values are changed.
//   This flag is not set when the D3DX11_EFFECT_CLONE_FORCE_NONSINGLE flag
//   is used in cloning.
//
//----------------------------------------------------------------------------

#define D3DX11_EFFECT_OPTIMIZED (1 << 21)
#define D3DX11_EFFECT_CLONE     (1 << 22)

// These are the only valid parameter flags to D3DX11CreateEffect*
#define D3DX11_EFFECT_RUNTIME_VALID_FLAGS (0)

//----------------------------------------------------------------------------
// D3DX11_EFFECT_VARIABLE flags:
// ----------------------------
//
// These flags describe an effect variable (global or annotation),
// and are returned in D3DX11_EFFECT_VARIABLE_DESC::Flags.
//
// D3DX11_EFFECT_VARIABLE_ANNOTATION
//   Indicates that this is an annotation on a technique, pass, or global
//   variable. Otherwise, this is a global variable. Annotations cannot
//   be shared.
//
// D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT
//   Indicates that the variable has been explicitly bound using the
//   register keyword.
//----------------------------------------------------------------------------

#define D3DX11_EFFECT_VARIABLE_ANNOTATION          (1 << 1)
#define D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT (1 << 2)

//----------------------------------------------------------------------------
// D3DX11_EFFECT_CLONE flags:
// ----------------------------
//
// These flags modify the effect cloning process and are passed into Clone.
//
// D3DX11_EFFECT_CLONE_FORCE_NONSINGLE
//   Ignore all "single" qualifiers on cbuffers.  All cbuffers will have their
//   own ID3D11Buffer's created in the cloned effect.
//----------------------------------------------------------------------------

#define D3DX11_EFFECT_CLONE_FORCE_NONSINGLE (1 << 0)

//----------------------------------------------------------------------------
// D3DX11_EFFECT_PASS flags:
// ----------------------------
//
// These flags modify the effect cloning process and are passed into Clone.
//
// D3DX11_EFFECT_PASS_COMMIT_CHANGES
//   This flag tells the effect runtime to assume that the device state was
//   not modified outside of effects, so that only updated state needs to
//   be set.
//
// D3DX11_EFFECT_PASS_OMIT_*
//   When applying a pass, do not set the state indicated in the flag name.
//----------------------------------------------------------------------------

#define D3DX11_EFFECT_PASS_COMMIT_CHANGES              (1 << 0) // TODO: not yet implemented
#define D3DX11_EFFECT_PASS_OMIT_SHADERS_AND_INTERFACES (1 << 1) // TODO: not yet implemented
#define D3DX11_EFFECT_PASS_OMIT_STATE_OBJECTS          (1 << 2) // TODO: not yet implemented
#define D3DX11_EFFECT_PASS_OMIT_RTVS_AND_DSVS          (1 << 3) // TODO: not yet implemented
#define D3DX11_EFFECT_PASS_OMIT_SAMPLERS               (1 << 4) // TODO: not yet implemented
#define D3DX11_EFFECT_PASS_OMIT_CBS                    (1 << 5) // TODO: not yet implemented
#define D3DX11_EFFECT_PASS_OMIT_SRVS                   (1 << 6) // TODO: not yet implemented
#define D3DX11_EFFECT_PASS_OMIT_UAVS                   (1 << 7) // TODO: not yet implemented

#define D3DX11_EFFECT_PASS_ONLY_SET_SHADERS_AND_CBS                                                                   \
    (D3DX11_EFFECT_PASS_OMIT_STATE_OBJECTS | D3DX11_EFFECT_PASS_OMIT_RTVS_AND_DSVS | D3DX11_EFFECT_PASS_OMIT_SAMPLERS \
     | D3DX11_EFFECT_PASS_OMIT_SRVS | D3DX11_EFFECT_PASS_OMIT_UAVS);

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectType //////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

//----------------------------------------------------------------------------
// D3DX11_EFFECT_TYPE_DESC:
//
// Retrieved by ID3DX11EffectType::GetDesc()
//----------------------------------------------------------------------------

typedef struct _D3DX11_EFFECT_TYPE_DESC
{
    LPCSTR TypeName; // Name of the type
    // (e.g. "float4" or "MyStruct")

    D3D10_SHADER_VARIABLE_CLASS Class; // (e.g. scalar, vector, object, etc.)
    D3D10_SHADER_VARIABLE_TYPE  Type;  // (e.g. float, texture, vertexshader, etc.)

    UINT Elements; // Number of elements in this type
    // (0 if not an array)
    UINT Members; // Number of members
    // (0 if not a structure)
    UINT Rows; // Number of rows in this type
    // (0 if not a numeric primitive)
    UINT Columns; // Number of columns in this type
    // (0 if not a numeric primitive)

    UINT PackedSize; // Number of bytes required to represent
    // this data type, when tightly packed
    UINT UnpackedSize; // Number of bytes occupied by this data
    // type, when laid out in a constant buffer
    UINT Stride; // Number of bytes to seek between elements,
    // when laid out in a constant buffer
} D3DX11_EFFECT_TYPE_DESC;

typedef interface ID3DX11EffectType  ID3DX11EffectType;
typedef interface ID3DX11EffectType *LPD3D11EFFECTTYPE;

// {4250D721-D5E5-491F-B62B-587C43186285}
DEFINE_GUID(IID_ID3DX11EffectType, 0x4250d721, 0xd5e5, 0x491f, 0xb6, 0x2b, 0x58, 0x7c, 0x43, 0x18, 0x62, 0x85);

#undef INTERFACE
#define INTERFACE ID3DX11EffectType

DECLARE_INTERFACE(ID3DX11EffectType)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_TYPE_DESC * pDesc) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetMemberTypeByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetMemberTypeByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetMemberTypeBySemantic)(THIS_ LPCSTR Semantic) PURE;
    STDMETHOD_(LPCSTR, GetMemberName)(THIS_ UINT Index) PURE;
    STDMETHOD_(LPCSTR, GetMemberSemantic)(THIS_ UINT Index) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectVariable //////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

//----------------------------------------------------------------------------
// D3DX11_EFFECT_VARIABLE_DESC:
//
// Retrieved by ID3DX11EffectVariable::GetDesc()
//----------------------------------------------------------------------------

typedef struct _D3DX11_EFFECT_VARIABLE_DESC
{
    LPCSTR Name; // Name of this variable, annotation,
    // or structure member
    LPCSTR Semantic; // Semantic string of this variable
    // or structure member (NULL for
    // annotations or if not present)

    UINT Flags;       // D3DX11_EFFECT_VARIABLE_* flags
    UINT Annotations; // Number of annotations on this variable
    // (always 0 for annotations)

    UINT BufferOffset; // Offset into containing cbuffer or tbuffer
    // (always 0 for annotations or variables
    // not in constant buffers)

    UINT ExplicitBindPoint; // Used if the variable has been explicitly bound
    // using the register keyword. Check Flags for
    // D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT;
} D3DX11_EFFECT_VARIABLE_DESC;

typedef interface ID3DX11EffectVariable  ID3DX11EffectVariable;
typedef interface ID3DX11EffectVariable *LPD3D11EFFECTVARIABLE;

// {036A777D-B56E-4B25-B313-CC3DDAB71873}
DEFINE_GUID(IID_ID3DX11EffectVariable, 0x036a777d, 0xb56e, 0x4b25, 0xb3, 0x13, 0xcc, 0x3d, 0xda, 0xb7, 0x18, 0x73);

#undef INTERFACE
#define INTERFACE ID3DX11EffectVariable

// Forward defines
typedef interface ID3DX11EffectScalarVariable              ID3DX11EffectScalarVariable;
typedef interface ID3DX11EffectVectorVariable              ID3DX11EffectVectorVariable;
typedef interface ID3DX11EffectMatrixVariable              ID3DX11EffectMatrixVariable;
typedef interface ID3DX11EffectStringVariable              ID3DX11EffectStringVariable;
typedef interface ID3DX11EffectClassInstanceVariable       ID3DX11EffectClassInstanceVariable;
typedef interface ID3DX11EffectInterfaceVariable           ID3DX11EffectInterfaceVariable;
typedef interface ID3DX11EffectShaderResourceVariable      ID3DX11EffectShaderResourceVariable;
typedef interface ID3DX11EffectUnorderedAccessViewVariable ID3DX11EffectUnorderedAccessViewVariable;
typedef interface ID3DX11EffectRenderTargetViewVariable    ID3DX11EffectRenderTargetViewVariable;
typedef interface ID3DX11EffectDepthStencilViewVariable    ID3DX11EffectDepthStencilViewVariable;
typedef interface ID3DX11EffectConstantBuffer              ID3DX11EffectConstantBuffer;
typedef interface ID3DX11EffectShaderVariable              ID3DX11EffectShaderVariable;
typedef interface ID3DX11EffectBlendVariable               ID3DX11EffectBlendVariable;
typedef interface ID3DX11EffectDepthStencilVariable        ID3DX11EffectDepthStencilVariable;
typedef interface ID3DX11EffectRasterizerVariable          ID3DX11EffectRasterizerVariable;
typedef interface ID3DX11EffectSamplerVariable             ID3DX11EffectSamplerVariable;

DECLARE_INTERFACE(ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectScalarVariable ////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectScalarVariable  ID3DX11EffectScalarVariable;
typedef interface ID3DX11EffectScalarVariable *LPD3D11EFFECTSCALARVARIABLE;

// {921EF2E5-A65D-4E92-9FC6-4E9CC09A4ADE}
DEFINE_GUID(IID_ID3DX11EffectScalarVariable,
            0x921ef2e5,
            0xa65d,
            0x4e92,
            0x9f,
            0xc6,
            0x4e,
            0x9c,
            0xc0,
            0x9a,
            0x4a,
            0xde);

#undef INTERFACE
#define INTERFACE ID3DX11EffectScalarVariable

DECLARE_INTERFACE_(ID3DX11EffectScalarVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT ByteOffset, UINT ByteCount) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT ByteOffset, UINT ByteCount) PURE;

    STDMETHOD(SetFloat)(THIS_ float Value) PURE;
    STDMETHOD(GetFloat)(THIS_ float *pValue) PURE;

    STDMETHOD(SetFloatArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetFloatArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(SetInt)(THIS_ int Value) PURE;
    STDMETHOD(GetInt)(THIS_ int *pValue) PURE;

    STDMETHOD(SetIntArray)(THIS_ int *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetIntArray)(THIS_ int *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(SetBool)(THIS_ BOOL Value) PURE;
    STDMETHOD(GetBool)(THIS_ BOOL * pValue) PURE;

    STDMETHOD(SetBoolArray)(THIS_ BOOL * pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetBoolArray)(THIS_ BOOL * pData, UINT Offset, UINT Count) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectVectorVariable ////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectVectorVariable  ID3DX11EffectVectorVariable;
typedef interface ID3DX11EffectVectorVariable *LPD3D11EFFECTVECTORVARIABLE;

// {5E785D4A-D87B-48D8-B6E6-0F8CA7E7467A}
DEFINE_GUID(IID_ID3DX11EffectVectorVariable,
            0x5e785d4a,
            0xd87b,
            0x48d8,
            0xb6,
            0xe6,
            0x0f,
            0x8c,
            0xa7,
            0xe7,
            0x46,
            0x7a);

#undef INTERFACE
#define INTERFACE ID3DX11EffectVectorVariable

DECLARE_INTERFACE_(ID3DX11EffectVectorVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT ByteOffset, UINT ByteCount) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT ByteOffset, UINT ByteCount) PURE;

    STDMETHOD(SetBoolVector)(THIS_ BOOL * pData) PURE;
    STDMETHOD(SetIntVector)(THIS_ int *pData) PURE;
    STDMETHOD(SetFloatVector)(THIS_ float *pData) PURE;

    STDMETHOD(GetBoolVector)(THIS_ BOOL * pData) PURE;
    STDMETHOD(GetIntVector)(THIS_ int *pData) PURE;
    STDMETHOD(GetFloatVector)(THIS_ float *pData) PURE;

    STDMETHOD(SetBoolVectorArray)(THIS_ BOOL * pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(SetIntVectorArray)(THIS_ int *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(SetFloatVectorArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(GetBoolVectorArray)(THIS_ BOOL * pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetIntVectorArray)(THIS_ int *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetFloatVectorArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectMatrixVariable ////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectMatrixVariable  ID3DX11EffectMatrixVariable;
typedef interface ID3DX11EffectMatrixVariable *LPD3D11EFFECTMATRIXVARIABLE;

// {E1096CF4-C027-419A-8D86-D29173DC803E}
DEFINE_GUID(IID_ID3DX11EffectMatrixVariable,
            0xe1096cf4,
            0xc027,
            0x419a,
            0x8d,
            0x86,
            0xd2,
            0x91,
            0x73,
            0xdc,
            0x80,
            0x3e);

#undef INTERFACE
#define INTERFACE ID3DX11EffectMatrixVariable

DECLARE_INTERFACE_(ID3DX11EffectMatrixVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT ByteOffset, UINT ByteCount) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT ByteOffset, UINT ByteCount) PURE;

    STDMETHOD(SetMatrix)(THIS_ float *pData) PURE;
    STDMETHOD(GetMatrix)(THIS_ float *pData) PURE;

    STDMETHOD(SetMatrixArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetMatrixArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(SetMatrixTranspose)(THIS_ float *pData) PURE;
    STDMETHOD(GetMatrixTranspose)(THIS_ float *pData) PURE;

    STDMETHOD(SetMatrixTransposeArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetMatrixTransposeArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectStringVariable ////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectStringVariable  ID3DX11EffectStringVariable;
typedef interface ID3DX11EffectStringVariable *LPD3D11EFFECTSTRINGVARIABLE;

// {F355C818-01BE-4653-A7CC-60FFFEDDC76D}
DEFINE_GUID(IID_ID3DX11EffectStringVariable,
            0xf355c818,
            0x01be,
            0x4653,
            0xa7,
            0xcc,
            0x60,
            0xff,
            0xfe,
            0xdd,
            0xc7,
            0x6d);

#undef INTERFACE
#define INTERFACE ID3DX11EffectStringVariable

DECLARE_INTERFACE_(ID3DX11EffectStringVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(GetString)(THIS_ LPCSTR * ppString) PURE;
    STDMETHOD(GetStringArray)(THIS_ LPCSTR * ppStrings, UINT Offset, UINT Count) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectClassInstanceVariable ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectClassInstanceVariable  ID3DX11EffectClassInstanceVariable;
typedef interface ID3DX11EffectClassInstanceVariable *LPD3D11EFFECTCLASSINSTANCEVARIABLE;

// {926A8053-2A39-4DB4-9BDE-CF649ADEBDC1}
DEFINE_GUID(IID_ID3DX11EffectClassInstanceVariable,
            0x926a8053,
            0x2a39,
            0x4db4,
            0x9b,
            0xde,
            0xcf,
            0x64,
            0x9a,
            0xde,
            0xbd,
            0xc1);

#undef INTERFACE
#define INTERFACE ID3DX11EffectClassInstanceVariable

DECLARE_INTERFACE_(ID3DX11EffectClassInstanceVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(GetClassInstance)(ID3D11ClassInstance * *ppClassInstance) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectInterfaceVariable ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectInterfaceVariable  ID3DX11EffectInterfaceVariable;
typedef interface ID3DX11EffectInterfaceVariable *LPD3D11EFFECTINTERFACEVARIABLE;

// {516C8CD8-1C80-40A4-B19B-0688792F11A5}
DEFINE_GUID(IID_ID3DX11EffectInterfaceVariable,
            0x516c8cd8,
            0x1c80,
            0x40a4,
            0xb1,
            0x9b,
            0x06,
            0x88,
            0x79,
            0x2f,
            0x11,
            0xa5);

#undef INTERFACE
#define INTERFACE ID3DX11EffectInterfaceVariable

DECLARE_INTERFACE_(ID3DX11EffectInterfaceVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(SetClassInstance)(ID3DX11EffectClassInstanceVariable * pEffectClassInstance) PURE;
    STDMETHOD(GetClassInstance)(ID3DX11EffectClassInstanceVariable * *ppEffectClassInstance) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectShaderResourceVariable ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectShaderResourceVariable  ID3DX11EffectShaderResourceVariable;
typedef interface ID3DX11EffectShaderResourceVariable *LPD3D11EFFECTSHADERRESOURCEVARIABLE;

// {350DB233-BBE0-485C-9BFE-C0026B844F89}
DEFINE_GUID(IID_ID3DX11EffectShaderResourceVariable,
            0x350db233,
            0xbbe0,
            0x485c,
            0x9b,
            0xfe,
            0xc0,
            0x02,
            0x6b,
            0x84,
            0x4f,
            0x89);

#undef INTERFACE
#define INTERFACE ID3DX11EffectShaderResourceVariable

DECLARE_INTERFACE_(ID3DX11EffectShaderResourceVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(SetResource)(THIS_ ID3D11ShaderResourceView * pResource) PURE;
    STDMETHOD(GetResource)(THIS_ ID3D11ShaderResourceView * *ppResource) PURE;

    STDMETHOD(SetResourceArray)(THIS_ ID3D11ShaderResourceView * *ppResources, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetResourceArray)(THIS_ ID3D11ShaderResourceView * *ppResources, UINT Offset, UINT Count) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectUnorderedAccessViewVariable ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectUnorderedAccessViewVariable  ID3DX11EffectUnorderedAccessViewVariable;
typedef interface ID3DX11EffectUnorderedAccessViewVariable *LPD3D11EFFECTUNORDEREDACCESSVIEWVARIABLE;

// {79B4AC8C-870A-47D2-B05A-8BD5CC3EE6C9}
DEFINE_GUID(IID_ID3DX11EffectUnorderedAccessViewVariable,
            0x79b4ac8c,
            0x870a,
            0x47d2,
            0xb0,
            0x5a,
            0x8b,
            0xd5,
            0xcc,
            0x3e,
            0xe6,
            0xc9);

#undef INTERFACE
#define INTERFACE ID3DX11EffectUnorderedAccessViewVariable

DECLARE_INTERFACE_(ID3DX11EffectUnorderedAccessViewVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(SetUnorderedAccessView)(THIS_ ID3D11UnorderedAccessView * pResource) PURE;
    STDMETHOD(GetUnorderedAccessView)(THIS_ ID3D11UnorderedAccessView * *ppResource) PURE;

    STDMETHOD(SetUnorderedAccessViewArray)(THIS_ ID3D11UnorderedAccessView * *ppResources, UINT Offset, UINT Count)
        PURE;
    STDMETHOD(GetUnorderedAccessViewArray)(THIS_ ID3D11UnorderedAccessView * *ppResources, UINT Offset, UINT Count)
        PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectRenderTargetViewVariable //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectRenderTargetViewVariable  ID3DX11EffectRenderTargetViewVariable;
typedef interface ID3DX11EffectRenderTargetViewVariable *LPD3D11EFFECTRENDERTARGETVIEWVARIABLE;

// {D5066909-F40C-43F8-9DB5-057C2A208552}
DEFINE_GUID(IID_ID3DX11EffectRenderTargetViewVariable,
            0xd5066909,
            0xf40c,
            0x43f8,
            0x9d,
            0xb5,
            0x05,
            0x7c,
            0x2a,
            0x20,
            0x85,
            0x52);

#undef INTERFACE
#define INTERFACE ID3DX11EffectRenderTargetViewVariable

DECLARE_INTERFACE_(ID3DX11EffectRenderTargetViewVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(SetRenderTarget)(THIS_ ID3D11RenderTargetView * pResource) PURE;
    STDMETHOD(GetRenderTarget)(THIS_ ID3D11RenderTargetView * *ppResource) PURE;

    STDMETHOD(SetRenderTargetArray)(THIS_ ID3D11RenderTargetView * *ppResources, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRenderTargetArray)(THIS_ ID3D11RenderTargetView * *ppResources, UINT Offset, UINT Count) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectDepthStencilViewVariable //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectDepthStencilViewVariable  ID3DX11EffectDepthStencilViewVariable;
typedef interface ID3DX11EffectDepthStencilViewVariable *LPD3D11EFFECTDEPTHSTENCILVIEWVARIABLE;

// {33C648AC-2E9E-4A2E-9CD6-DE31ACC5B347}
DEFINE_GUID(IID_ID3DX11EffectDepthStencilViewVariable,
            0x33c648ac,
            0x2e9e,
            0x4a2e,
            0x9c,
            0xd6,
            0xde,
            0x31,
            0xac,
            0xc5,
            0xb3,
            0x47);

#undef INTERFACE
#define INTERFACE ID3DX11EffectDepthStencilViewVariable

DECLARE_INTERFACE_(ID3DX11EffectDepthStencilViewVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(SetDepthStencil)(THIS_ ID3D11DepthStencilView * pResource) PURE;
    STDMETHOD(GetDepthStencil)(THIS_ ID3D11DepthStencilView * *ppResource) PURE;

    STDMETHOD(SetDepthStencilArray)(THIS_ ID3D11DepthStencilView * *ppResources, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetDepthStencilArray)(THIS_ ID3D11DepthStencilView * *ppResources, UINT Offset, UINT Count) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectConstantBuffer ////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectConstantBuffer  ID3DX11EffectConstantBuffer;
typedef interface ID3DX11EffectConstantBuffer *LPD3D11EFFECTCONSTANTBUFFER;

// {2CB6C733-82D2-4000-B3DA-6219D9A99BF2}
DEFINE_GUID(IID_ID3DX11EffectConstantBuffer,
            0x2cb6c733,
            0x82d2,
            0x4000,
            0xb3,
            0xda,
            0x62,
            0x19,
            0xd9,
            0xa9,
            0x9b,
            0xf2);

#undef INTERFACE
#define INTERFACE ID3DX11EffectConstantBuffer

DECLARE_INTERFACE_(ID3DX11EffectConstantBuffer, ID3DX11EffectVariable)
{
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(SetConstantBuffer)(THIS_ ID3D11Buffer * pConstantBuffer) PURE;
    STDMETHOD(UndoSetConstantBuffer)(THIS) PURE;
    STDMETHOD(GetConstantBuffer)(THIS_ ID3D11Buffer * *ppConstantBuffer) PURE;

    STDMETHOD(SetTextureBuffer)(THIS_ ID3D11ShaderResourceView * pTextureBuffer) PURE;
    STDMETHOD(UndoSetTextureBuffer)(THIS) PURE;
    STDMETHOD(GetTextureBuffer)(THIS_ ID3D11ShaderResourceView * *ppTextureBuffer) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectShaderVariable ////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

//----------------------------------------------------------------------------
// D3DX11_EFFECT_SHADER_DESC:
//
// Retrieved by ID3DX11EffectShaderVariable::GetShaderDesc()
//----------------------------------------------------------------------------

typedef struct _D3DX11_EFFECT_SHADER_DESC
{
    CONST BYTE *pInputSignature; // Passed into CreateInputLayout,
    // valid on VS and GS only

    BOOL IsInline; // Is this an anonymous shader variable
    // resulting from an inline shader assignment?


    // -- The following fields are not valid after Optimize() --
    CONST BYTE *pBytecode; // Shader bytecode
    UINT        BytecodeLength;

    LPCSTR SODecls[D3D11_SO_STREAM_COUNT]; // Stream out declaration string (for GS with SO)
    UINT   RasterizedStream;

    UINT NumInputSignatureEntries;         // Number of entries in the input signature
    UINT NumOutputSignatureEntries;        // Number of entries in the output signature
    UINT NumPatchConstantSignatureEntries; // Number of entries in the patch constant signature
} D3DX11_EFFECT_SHADER_DESC;


typedef interface ID3DX11EffectShaderVariable  ID3DX11EffectShaderVariable;
typedef interface ID3DX11EffectShaderVariable *LPD3D11EFFECTSHADERVARIABLE;

// {7508B344-020A-4EC7-9118-62CDD36C88D7}
DEFINE_GUID(IID_ID3DX11EffectShaderVariable,
            0x7508b344,
            0x020a,
            0x4ec7,
            0x91,
            0x18,
            0x62,
            0xcd,
            0xd3,
            0x6c,
            0x88,
            0xd7);

#undef INTERFACE
#define INTERFACE ID3DX11EffectShaderVariable

DECLARE_INTERFACE_(ID3DX11EffectShaderVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(GetShaderDesc)(THIS_ UINT ShaderIndex, D3DX11_EFFECT_SHADER_DESC * pDesc) PURE;

    STDMETHOD(GetVertexShader)(THIS_ UINT ShaderIndex, ID3D11VertexShader * *ppVS) PURE;
    STDMETHOD(GetGeometryShader)(THIS_ UINT ShaderIndex, ID3D11GeometryShader * *ppGS) PURE;
    STDMETHOD(GetPixelShader)(THIS_ UINT ShaderIndex, ID3D11PixelShader * *ppPS) PURE;
    STDMETHOD(GetHullShader)(THIS_ UINT ShaderIndex, ID3D11HullShader * *ppPS) PURE;
    STDMETHOD(GetDomainShader)(THIS_ UINT ShaderIndex, ID3D11DomainShader * *ppPS) PURE;
    STDMETHOD(GetComputeShader)(THIS_ UINT ShaderIndex, ID3D11ComputeShader * *ppPS) PURE;

    STDMETHOD(GetInputSignatureElementDesc)(
        THIS_ UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC * pDesc) PURE;
    STDMETHOD(GetOutputSignatureElementDesc)(
        THIS_ UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC * pDesc) PURE;
    STDMETHOD(GetPatchConstantSignatureElementDesc)(
        THIS_ UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC * pDesc) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectBlendVariable /////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectBlendVariable  ID3DX11EffectBlendVariable;
typedef interface ID3DX11EffectBlendVariable *LPD3D11EFFECTBLENDVARIABLE;

// {D664F4D7-3B81-4805-B277-C1DF58C39F53}
DEFINE_GUID(IID_ID3DX11EffectBlendVariable, 0xd664f4d7, 0x3b81, 0x4805, 0xb2, 0x77, 0xc1, 0xdf, 0x58, 0xc3, 0x9f, 0x53);

#undef INTERFACE
#define INTERFACE ID3DX11EffectBlendVariable

DECLARE_INTERFACE_(ID3DX11EffectBlendVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(GetBlendState)(THIS_ UINT Index, ID3D11BlendState * *ppBlendState) PURE;
    STDMETHOD(SetBlendState)(THIS_ UINT Index, ID3D11BlendState * pBlendState) PURE;
    STDMETHOD(UndoSetBlendState)(THIS_ UINT Index) PURE;
    STDMETHOD(GetBackingStore)(THIS_ UINT Index, D3D11_BLEND_DESC * pBlendDesc) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectDepthStencilVariable //////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectDepthStencilVariable  ID3DX11EffectDepthStencilVariable;
typedef interface ID3DX11EffectDepthStencilVariable *LPD3D11EFFECTDEPTHSTENCILVARIABLE;

// {69B5751B-61A5-48E5-BD41-D93988111563}
DEFINE_GUID(IID_ID3DX11EffectDepthStencilVariable,
            0x69b5751b,
            0x61a5,
            0x48e5,
            0xbd,
            0x41,
            0xd9,
            0x39,
            0x88,
            0x11,
            0x15,
            0x63);

#undef INTERFACE
#define INTERFACE ID3DX11EffectDepthStencilVariable

DECLARE_INTERFACE_(ID3DX11EffectDepthStencilVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(GetDepthStencilState)(THIS_ UINT Index, ID3D11DepthStencilState * *ppDepthStencilState) PURE;
    STDMETHOD(SetDepthStencilState)(THIS_ UINT Index, ID3D11DepthStencilState * pDepthStencilState) PURE;
    STDMETHOD(UndoSetDepthStencilState)(THIS_ UINT Index) PURE;
    STDMETHOD(GetBackingStore)(THIS_ UINT Index, D3D11_DEPTH_STENCIL_DESC * pDepthStencilDesc) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectRasterizerVariable ////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectRasterizerVariable  ID3DX11EffectRasterizerVariable;
typedef interface ID3DX11EffectRasterizerVariable *LPD3D11EFFECTRASTERIZERVARIABLE;

// {53A262F6-5F74-4151-A132-E3DD19A62C9D}
DEFINE_GUID(IID_ID3DX11EffectRasterizerVariable,
            0x53a262f6,
            0x5f74,
            0x4151,
            0xa1,
            0x32,
            0xe3,
            0xdd,
            0x19,
            0xa6,
            0x2c,
            0x9d);

#undef INTERFACE
#define INTERFACE ID3DX11EffectRasterizerVariable

DECLARE_INTERFACE_(ID3DX11EffectRasterizerVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(GetRasterizerState)(THIS_ UINT Index, ID3D11RasterizerState * *ppRasterizerState) PURE;
    STDMETHOD(SetRasterizerState)(THIS_ UINT Index, ID3D11RasterizerState * pRasterizerState) PURE;
    STDMETHOD(UndoSetRasterizerState)(THIS_ UINT Index) PURE;
    STDMETHOD(GetBackingStore)(THIS_ UINT Index, D3D11_RASTERIZER_DESC * pRasterizerDesc) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectSamplerVariable ///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

typedef interface ID3DX11EffectSamplerVariable  ID3DX11EffectSamplerVariable;
typedef interface ID3DX11EffectSamplerVariable *LPD3D11EFFECTSAMPLERVARIABLE;

// {C6402E55-1095-4D95-8931-F92660513DD9}
DEFINE_GUID(IID_ID3DX11EffectSamplerVariable,
            0xc6402e55,
            0x1095,
            0x4d95,
            0x89,
            0x31,
            0xf9,
            0x26,
            0x60,
            0x51,
            0x3d,
            0xd9);

#undef INTERFACE
#define INTERFACE ID3DX11EffectSamplerVariable

DECLARE_INTERFACE_(ID3DX11EffectSamplerVariable, ID3DX11EffectVariable)
{
    STDMETHOD_(ID3DX11EffectType *, GetType)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetElement)(THIS_ UINT Index) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetParentConstantBuffer)(THIS) PURE;

    STDMETHOD_(ID3DX11EffectScalarVariable *, AsScalar)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectVectorVariable *, AsVector)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectMatrixVariable *, AsMatrix)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectStringVariable *, AsString)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectClassInstanceVariable *, AsClassInstance)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectInterfaceVariable *, AsInterface)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderResourceVariable *, AsShaderResource)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable *, AsUnorderedAccessView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRenderTargetViewVariable *, AsRenderTargetView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilViewVariable *, AsDepthStencilView)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, AsConstantBuffer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectShaderVariable *, AsShader)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectBlendVariable *, AsBlend)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectDepthStencilVariable *, AsDepthStencil)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectRasterizerVariable *, AsRasterizer)(THIS) PURE;
    STDMETHOD_(ID3DX11EffectSamplerVariable *, AsSampler)(THIS) PURE;

    STDMETHOD(SetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
    STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;

    STDMETHOD(GetSampler)(THIS_ UINT Index, ID3D11SamplerState * *ppSampler) PURE;
    STDMETHOD(SetSampler)(THIS_ UINT Index, ID3D11SamplerState * pSampler) PURE;
    STDMETHOD(UndoSetSampler)(THIS_ UINT Index) PURE;
    STDMETHOD(GetBackingStore)(THIS_ UINT Index, D3D11_SAMPLER_DESC * pSamplerDesc) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectPass //////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

//----------------------------------------------------------------------------
// D3DX11_PASS_DESC:
//
// Retrieved by ID3DX11EffectPass::GetDesc()
//----------------------------------------------------------------------------

typedef struct _D3DX11_PASS_DESC
{
    LPCSTR Name;        // Name of this pass (NULL if not anonymous)
    UINT   Annotations; // Number of annotations on this pass

    BYTE *pIAInputSignature; // Signature from VS or GS (if there is no VS)
    // or NULL if neither exists
    SIZE_T IAInputSignatureSize; // Singature size in bytes

    UINT  StencilRef;     // Specified in SetDepthStencilState()
    UINT  SampleMask;     // Specified in SetBlendState()
    FLOAT BlendFactor[4]; // Specified in SetBlendState()
} D3DX11_PASS_DESC;

//----------------------------------------------------------------------------
// D3DX11_PASS_SHADER_DESC:
//
// Retrieved by ID3DX11EffectPass::Get**ShaderDesc()
//----------------------------------------------------------------------------

typedef struct _D3DX11_PASS_SHADER_DESC
{
    ID3DX11EffectShaderVariable *pShaderVariable; // The variable that this shader came from.
    // If this is an inline shader assignment,
    //   the returned interface will be an
    //   anonymous shader variable, which is
    //   not retrievable any other way.  It's
    //   name in the variable description will
    //   be "$Anonymous".
    // If there is no assignment of this type in
    //   the pass block, pShaderVariable != NULL,
    //   but pShaderVariable->IsValid() == FALSE.

    UINT ShaderIndex; // The element of pShaderVariable (if an array)
    // or 0 if not applicable
} D3DX11_PASS_SHADER_DESC;

typedef interface ID3DX11EffectPass  ID3DX11EffectPass;
typedef interface ID3DX11EffectPass *LPD3D11EFFECTPASS;

// {3437CEC4-4AC1-4D87-8916-F4BD5A41380C}
DEFINE_GUID(IID_ID3DX11EffectPass, 0x3437cec4, 0x4ac1, 0x4d87, 0x89, 0x16, 0xf4, 0xbd, 0x5a, 0x41, 0x38, 0x0c);

#undef INTERFACE
#define INTERFACE ID3DX11EffectPass

DECLARE_INTERFACE(ID3DX11EffectPass)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_PASS_DESC * pDesc) PURE;

    STDMETHOD(GetVertexShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC * pDesc) PURE;
    STDMETHOD(GetGeometryShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC * pDesc) PURE;
    STDMETHOD(GetPixelShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC * pDesc) PURE;
    STDMETHOD(GetHullShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC * pDesc) PURE;
    STDMETHOD(GetDomainShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC * pDesc) PURE;
    STDMETHOD(GetComputeShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD(Apply)(THIS_ UINT Flags, ID3D11DeviceContext * pContext) PURE;

    STDMETHOD(ComputeStateBlockMask)(THIS_ D3DX11_STATE_BLOCK_MASK * pStateBlockMask) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectTechnique /////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

//----------------------------------------------------------------------------
// D3DX11_TECHNIQUE_DESC:
//
// Retrieved by ID3DX11EffectTechnique::GetDesc()
//----------------------------------------------------------------------------

typedef struct _D3DX11_TECHNIQUE_DESC
{
    LPCSTR Name;        // Name of this technique (NULL if not anonymous)
    UINT   Passes;      // Number of passes contained within
    UINT   Annotations; // Number of annotations on this technique
} D3DX11_TECHNIQUE_DESC;

typedef interface ID3DX11EffectTechnique  ID3DX11EffectTechnique;
typedef interface ID3DX11EffectTechnique *LPD3D11EFFECTTECHNIQUE;

// {51198831-1F1D-4F47-BD76-41CB0835B1DE}
DEFINE_GUID(IID_ID3DX11EffectTechnique, 0x51198831, 0x1f1d, 0x4f47, 0xbd, 0x76, 0x41, 0xcb, 0x08, 0x35, 0xb1, 0xde);

#undef INTERFACE
#define INTERFACE ID3DX11EffectTechnique

DECLARE_INTERFACE(ID3DX11EffectTechnique)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_TECHNIQUE_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectPass *, GetPassByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectPass *, GetPassByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD(ComputeStateBlockMask)(THIS_ D3DX11_STATE_BLOCK_MASK * pStateBlockMask) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11EffectTechnique /////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

//----------------------------------------------------------------------------
// D3DX11_GROUP_DESC:
//
// Retrieved by ID3DX11EffectTechnique::GetDesc()
//----------------------------------------------------------------------------

typedef struct _D3DX11_GROUP_DESC
{
    LPCSTR Name;        // Name of this group (only NULL if global)
    UINT   Techniques;  // Number of techniques contained within
    UINT   Annotations; // Number of annotations on this group
} D3DX11_GROUP_DESC;

typedef interface ID3DX11EffectGroup  ID3DX11EffectGroup;
typedef interface ID3DX11EffectGroup *LPD3D11EFFECTGROUP;

// {03074acf-97de-485f-b201-cb775264afd6}
DEFINE_GUID(IID_ID3DX11EffectGroup, 0x03074acf, 0x97de, 0x485f, 0xb2, 0x01, 0xcb, 0x77, 0x52, 0x64, 0xaf, 0xd6);

#undef INTERFACE
#define INTERFACE ID3DX11EffectGroup

DECLARE_INTERFACE(ID3DX11EffectGroup)
{
    STDMETHOD_(BOOL, IsValid)(THIS) PURE;
    STDMETHOD(GetDesc)(THIS_ D3DX11_GROUP_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectTechnique *, GetTechniqueByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectTechnique *, GetTechniqueByName)(THIS_ LPCSTR Name) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// ID3DX11Effect //////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

//----------------------------------------------------------------------------
// D3DX11_EFFECT_DESC:
//
// Retrieved by ID3DX11Effect::GetDesc()
//----------------------------------------------------------------------------

typedef struct _D3DX11_EFFECT_DESC
{
    UINT ConstantBuffers;    // Number of constant buffers in this effect
    UINT GlobalVariables;    // Number of global variables in this effect
    UINT InterfaceVariables; // Number of global interfaces in this effect
    UINT Techniques;         // Number of techniques in this effect
    UINT Groups;             // Number of groups in this effect
} D3DX11_EFFECT_DESC;

typedef interface ID3DX11Effect  ID3DX11Effect;
typedef interface ID3DX11Effect *LPD3D11EFFECT;

// {FA61CA24-E4BA-4262-9DB8-B132E8CAE319}
DEFINE_GUID(IID_ID3DX11Effect, 0xfa61ca24, 0xe4ba, 0x4262, 0x9d, 0xb8, 0xb1, 0x32, 0xe8, 0xca, 0xe3, 0x19);

#undef INTERFACE
#define INTERFACE ID3DX11Effect

DECLARE_INTERFACE_(ID3DX11Effect, IUnknown)
{
    // IUnknown
    STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID * ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;

    STDMETHOD_(BOOL, IsValid)(THIS) PURE;

    // Managing D3D Device
    STDMETHOD(GetDevice)(THIS_ ID3D11Device * *ppDevice) PURE;

    // New Reflection APIs
    STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_DESC * pDesc) PURE;

    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetConstantBufferByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectConstantBuffer *, GetConstantBufferByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectVariable *, GetVariableByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetVariableByName)(THIS_ LPCSTR Name) PURE;
    STDMETHOD_(ID3DX11EffectVariable *, GetVariableBySemantic)(THIS_ LPCSTR Semantic) PURE;

    STDMETHOD_(ID3DX11EffectGroup *, GetGroupByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectGroup *, GetGroupByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3DX11EffectTechnique *, GetTechniqueByIndex)(THIS_ UINT Index) PURE;
    STDMETHOD_(ID3DX11EffectTechnique *, GetTechniqueByName)(THIS_ LPCSTR Name) PURE;

    STDMETHOD_(ID3D11ClassLinkage *, GetClassLinkage)(THIS) PURE;

    STDMETHOD(CloneEffect)(THIS_ UINT Flags, ID3DX11Effect * *ppClonedEffect) PURE;
    STDMETHOD(Optimize)(THIS) PURE;
    STDMETHOD_(BOOL, IsOptimized)(THIS) PURE;
};

//////////////////////////////////////////////////////////////////////////////
// APIs //////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

#ifdef __cplusplus
extern "C"
{
#endif //__cplusplus

    //----------------------------------------------------------------------------
    // D3DX11CreateEffectFromMemory:
    // --------------------------
    // Creates an effect from a binary effect or file
    //
    // Parameters:
    //
    // [in]
    //
    //
    //  pData
    //      Blob of compiled effect data
    //  DataLength
    //      Length of the data blob
    //  FXFlags
    //      Compilation flags pertaining to Effect compilation, honored
    //      by the Effect compiler
    //  pDevice
    //      Pointer to the D3D11 device on which to create Effect resources
    //
    // [out]
    //
    //  ppEffect
    //      Address of the newly created Effect interface
    //
    //----------------------------------------------------------------------------

    HRESULT WINAPI D3DX11CreateEffectFromMemory(void           *pData,
                                                SIZE_T          DataLength,
                                                UINT            FXFlags,
                                                ID3D11Device   *pDevice,
                                                ID3DX11Effect **ppEffect);

#ifdef __cplusplus
}
#endif //__cplusplus

#endif //__D3DX11EFFECT_H__
