Subversion Repositories Games.Chess Giants

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. //////////////////////////////////////////////////////////////////////////////
  3. //
  4. //  Copyright (c) Microsoft Corporation.  All rights reserved.
  5. //
  6. //  File:       D3DX11GPGPU.h
  7. //  Content:    D3DX11 General Purpose GPU computing algorithms
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10.  
  11. #ifndef __D3DX11GPGPU_H__
  12. #define __D3DX11GPGPU_H__
  13.  
  14. #include "d3dx11.h"
  15.  
  16. #ifdef __cplusplus
  17. extern "C" {
  18. #endif //__cplusplus
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. //////////////////////////////////////////////////////////////////////////////
  26.  
  27. typedef enum D3DX11_SCAN_DATA_TYPE
  28. {
  29.     D3DX11_SCAN_DATA_TYPE_FLOAT = 1,
  30.     D3DX11_SCAN_DATA_TYPE_INT,
  31.     D3DX11_SCAN_DATA_TYPE_UINT,
  32. } D3DX11_SCAN_DATA_TYPE;
  33.  
  34. typedef enum D3DX11_SCAN_OPCODE
  35. {
  36.     D3DX11_SCAN_OPCODE_ADD = 1,
  37.     D3DX11_SCAN_OPCODE_MIN,
  38.     D3DX11_SCAN_OPCODE_MAX,
  39.     D3DX11_SCAN_OPCODE_MUL,
  40.     D3DX11_SCAN_OPCODE_AND,
  41.     D3DX11_SCAN_OPCODE_OR,
  42.     D3DX11_SCAN_OPCODE_XOR,
  43. } D3DX11_SCAN_OPCODE;
  44.  
  45. typedef enum D3DX11_SCAN_DIRECTION
  46. {
  47.     D3DX11_SCAN_DIRECTION_FORWARD = 1,
  48.     D3DX11_SCAN_DIRECTION_BACKWARD,
  49. } D3DX11_SCAN_DIRECTION;
  50.  
  51.  
  52. //////////////////////////////////////////////////////////////////////////////
  53. // ID3DX11Scan:
  54. //////////////////////////////////////////////////////////////////////////////
  55.  
  56. // {5089b68f-e71d-4d38-be8e-f363b95a9405}
  57. DEFINE_GUID(IID_ID3DX11Scan, 0x5089b68f, 0xe71d, 0x4d38, 0xbe, 0x8e, 0xf3, 0x63, 0xb9, 0x5a, 0x94, 0x05);
  58.  
  59. #undef INTERFACE
  60. #define INTERFACE ID3DX11Scan
  61.  
  62. DECLARE_INTERFACE_(ID3DX11Scan, IUnknown)
  63. {
  64.     // IUnknown
  65.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  66.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  67.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  68.  
  69.     // ID3DX11Scan
  70.  
  71.     STDMETHOD(SetScanDirection)(THIS_ D3DX11_SCAN_DIRECTION Direction) PURE;
  72.  
  73.     //=============================================================================
  74.     // Performs an unsegmented scan of a sequence in-place or out-of-place
  75.     //  ElementType         element type
  76.     //  OpCode              binary operation
  77.     //  Direction           scan direction
  78.     //  ElementScanSize     size of scan, in elements
  79.     //  pSrc                input sequence on the device. pSrc==pDst for in-place scans
  80.     //  pDst                output sequence on the device
  81.     //=============================================================================
  82.     STDMETHOD(Scan)( THIS_
  83.         D3DX11_SCAN_DATA_TYPE               ElementType,
  84.         D3DX11_SCAN_OPCODE                  OpCode,
  85.         UINT                                ElementScanSize,
  86.         __in ID3D11UnorderedAccessView*     pSrc,
  87.         __in ID3D11UnorderedAccessView*     pDst
  88.     ) PURE;
  89.  
  90.     //=============================================================================
  91.     // Performs a multiscan of a sequence in-place or out-of-place
  92.     //  ElementType         element type
  93.     //  OpCode              binary operation
  94.     //  Direction           scan direction
  95.     //  ElementScanSize     size of scan, in elements
  96.     //  ElementScanPitch    pitch of the next scan, in elements
  97.     //  ScanCount           number of scans in a multiscan
  98.     //  pSrc                input sequence on the device. pSrc==pDst for in-place scans
  99.     //  pDst                output sequence on the device
  100.     //=============================================================================
  101.     STDMETHOD(Multiscan)( THIS_
  102.         D3DX11_SCAN_DATA_TYPE               ElementType,
  103.         D3DX11_SCAN_OPCODE                  OpCode,
  104.         UINT                                ElementScanSize,
  105.         UINT                                ElementScanPitch,
  106.         UINT                                ScanCount,
  107.         __in ID3D11UnorderedAccessView*     pSrc,
  108.         __in ID3D11UnorderedAccessView*     pDst
  109.     ) PURE;
  110. };
  111.  
  112.  
  113. //=============================================================================
  114. // Creates a scan context
  115. //  pDevice             the device context
  116. //  MaxElementScanSize  maximum single scan size, in elements (FLOAT, UINT, or INT)
  117. //  MaxScanCount        maximum number of scans in multiscan
  118. //  ppScanContext       new scan context
  119. //=============================================================================
  120. HRESULT WINAPI D3DX11CreateScan(
  121.     __in ID3D11DeviceContext* pDeviceContext,
  122.     UINT MaxElementScanSize,
  123.     UINT MaxScanCount,
  124.     __out ID3DX11Scan** ppScan );
  125.  
  126.  
  127.  
  128. //////////////////////////////////////////////////////////////////////////////
  129. // ID3DX11SegmentedScan:
  130. //////////////////////////////////////////////////////////////////////////////
  131.  
  132. // {a915128c-d954-4c79-bfe1-64db923194d6}
  133. DEFINE_GUID(IID_ID3DX11SegmentedScan, 0xa915128c, 0xd954, 0x4c79, 0xbf, 0xe1, 0x64, 0xdb, 0x92, 0x31, 0x94, 0xd6);
  134.  
  135. #undef INTERFACE
  136. #define INTERFACE ID3DX11SegmentedScan
  137.  
  138. DECLARE_INTERFACE_(ID3DX11SegmentedScan, IUnknown)
  139. {
  140.     // IUnknown
  141.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  142.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  143.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  144.  
  145.     // ID3DX11SegmentedScan
  146.  
  147.     STDMETHOD(SetScanDirection)(THIS_ D3DX11_SCAN_DIRECTION Direction) PURE;
  148.  
  149.     //=============================================================================
  150.     // Performs a segscan of a sequence in-place or out-of-place
  151.     //  ElementType         element type
  152.     //  OpCode              binary operation
  153.     //  Direction           scan direction
  154.     //  pSrcElementFlags    compact array of bits, one per element of pSrc.  A set value
  155.     //                      indicates the start of a new segment.
  156.     //  ElementScanSize     size of scan, in elements
  157.     //  pSrc                input sequence on the device. pSrc==pDst for in-place scans
  158.     //  pDst                output sequence on the device
  159.     //=============================================================================
  160.     STDMETHOD(SegScan)( THIS_
  161.         D3DX11_SCAN_DATA_TYPE               ElementType,
  162.         D3DX11_SCAN_OPCODE                  OpCode,
  163.         UINT                                ElementScanSize,
  164.         __in_opt ID3D11UnorderedAccessView* pSrc,
  165.         __in ID3D11UnorderedAccessView*     pSrcElementFlags,
  166.         __in ID3D11UnorderedAccessView*     pDst
  167.     ) PURE;
  168. };
  169.  
  170.  
  171. //=============================================================================
  172. // Creates a segmented scan context
  173. //  pDevice             the device context
  174. //  MaxElementScanSize  maximum single scan size, in elements (FLOAT, UINT, or INT)
  175. //  ppScanContext       new scan context
  176. //=============================================================================
  177. HRESULT WINAPI D3DX11CreateSegmentedScan(
  178.     __in ID3D11DeviceContext* pDeviceContext,
  179.     UINT MaxElementScanSize,
  180.     __out ID3DX11SegmentedScan** ppScan );
  181.  
  182.  
  183.  
  184. //////////////////////////////////////////////////////////////////////////////
  185.  
  186. #define D3DX11_FFT_MAX_PRECOMPUTE_BUFFERS 4
  187. #define D3DX11_FFT_MAX_TEMP_BUFFERS 4
  188. #define D3DX11_FFT_MAX_DIMENSIONS 32
  189.  
  190.  
  191.  
  192. //////////////////////////////////////////////////////////////////////////////
  193. // ID3DX11FFT:
  194. //////////////////////////////////////////////////////////////////////////////
  195.  
  196. // {b3f7a938-4c93-4310-a675-b30d6de50553}
  197. DEFINE_GUID(IID_ID3DX11FFT, 0xb3f7a938, 0x4c93, 0x4310, 0xa6, 0x75, 0xb3, 0x0d, 0x6d, 0xe5, 0x05, 0x53);
  198.  
  199. #undef INTERFACE
  200. #define INTERFACE ID3DX11FFT
  201.  
  202. DECLARE_INTERFACE_(ID3DX11FFT, IUnknown)
  203. {
  204.     // IUnknown
  205.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  206.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  207.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  208.  
  209.     // ID3DX11FFT
  210.  
  211.     // scale for forward transform (defaults to 1 if set to 0)
  212.     STDMETHOD(SetForwardScale)(THIS_ FLOAT ForwardScale) PURE;
  213.     STDMETHOD_(FLOAT, GetForwardScale)(THIS) PURE;
  214.  
  215.     // scale for inverse transform (defaults to 1/N if set to 0, where N is
  216.     // the product of the transformed dimension lengths
  217.     STDMETHOD(SetInverseScale)(THIS_ FLOAT InverseScale) PURE;
  218.     STDMETHOD_(FLOAT, GetInverseScale)(THIS) PURE;
  219.  
  220.     //------------------------------------------------------------------------------
  221.     // Attaches buffers to the context and performs any required precomputation.
  222.     // The buffers must be no smaller than the corresponding buffer sizes returned
  223.     // by D3DX11CreateFFT*(). Temp buffers may beshared between multiple contexts,
  224.     // though care should be taken to concurrently execute multiple FFTs which share
  225.     // temp buffers.
  226.     //
  227.     // NumTempBuffers               number of buffers in ppTempBuffers
  228.     // ppTempBuffers                temp buffers to attach
  229.     // NumPrecomputeBuffers         number of buffers in ppPrecomputeBufferSizes
  230.     // ppPrecomputeBufferSizes      buffers to hold precomputed data
  231.     STDMETHOD(AttachBuffersAndPrecompute)(  THIS_
  232.         __in_range(0,D3DX11_FFT_MAX_TEMP_BUFFERS) UINT NumTempBuffers,
  233.         __in_ecount(NumTempBuffers) ID3D11UnorderedAccessView*const* ppTempBuffers,    
  234.         __in_range(0,D3DX11_FFT_MAX_PRECOMPUTE_BUFFERS) UINT NumPrecomputeBuffers,
  235.         __in_ecount(NumPrecomputeBuffers) ID3D11UnorderedAccessView*const* ppPrecomputeBufferSizes ) PURE;
  236.  
  237.     //------------------------------------------------------------------------------
  238.     // Call after buffers have been attached to the context, pInput and *ppOuput can
  239.     // be one of the temp buffers.  If *ppOutput == NULL, then the computation will ping-pong
  240.     // between temp buffers and the last buffer written to is stored at *ppOutput.
  241.     // Otherwise, *ppOutput is used as the output buffer (which may incur an extra copy).
  242.     //
  243.     // The format of complex data is interleaved components, e.g. (Real0, Imag0),
  244.     // (Real1, Imag1) ... etc. Data is stored in row major order
  245.     //
  246.     // pInputBuffer         view onto input buffer
  247.     // ppOutpuBuffert       pointer to view of output buffer
  248.     STDMETHOD(ForwardTransform)( THIS_
  249.         __in const ID3D11UnorderedAccessView* pInputBuffer,
  250.         __inout ID3D11UnorderedAccessView** ppOutputBuffer ) PURE;
  251.  
  252.     STDMETHOD(InverseTransform)( THIS_
  253.         __in const ID3D11UnorderedAccessView* pInputBuffer,
  254.         __inout ID3D11UnorderedAccessView** ppOutputBuffer ) PURE;
  255. };
  256.  
  257.  
  258. //////////////////////////////////////////////////////////////////////////////
  259. // ID3DX11FFT Creation Routines
  260. //////////////////////////////////////////////////////////////////////////////
  261.  
  262. typedef enum D3DX11_FFT_DATA_TYPE
  263. {
  264.     D3DX11_FFT_DATA_TYPE_REAL,
  265.     D3DX11_FFT_DATA_TYPE_COMPLEX,
  266. } D3DX11_FFT_DATA_TYPE;
  267.  
  268. typedef enum D3DX11_FFT_DIM_MASK
  269. {
  270.     D3DX11_FFT_DIM_MASK_1D   = 0x1,
  271.     D3DX11_FFT_DIM_MASK_2D   = 0x3,
  272.     D3DX11_FFT_DIM_MASK_3D   = 0x7,
  273. } D3DX11_FFT_DIM_MASK;
  274.  
  275. typedef struct D3DX11_FFT_DESC
  276. {
  277.     UINT NumDimensions;                             // number of dimensions
  278.     UINT ElementLengths[D3DX11_FFT_MAX_DIMENSIONS]; // length of each dimension
  279.     UINT DimensionMask;                             // a bit set for each dimensions to transform
  280.                                                     //     (see D3DX11_FFT_DIM_MASK for common masks)
  281.     D3DX11_FFT_DATA_TYPE Type;                      // type of the elements in spatial domain
  282. } D3DX11_FFT_DESC;
  283.  
  284.  
  285. //------------------------------------------------------------------------------
  286. // NumTempBufferSizes           Number of temporary buffers needed
  287. // pTempBufferSizes             Minimum sizes (in FLOATs) of temporary buffers
  288. // NumPrecomputeBufferSizes     Number of precompute buffers needed
  289. // pPrecomputeBufferSizes       minimum sizes (in FLOATs) for precompute buffers
  290. //------------------------------------------------------------------------------
  291.  
  292. typedef struct D3DX11_FFT_BUFFER_INFO
  293. {
  294.     __range(0,D3DX11_FFT_MAX_TEMP_BUFFERS) UINT NumTempBufferSizes;
  295.     UINT TempBufferFloatSizes[D3DX11_FFT_MAX_TEMP_BUFFERS];
  296.     __range(0,D3DX11_FFT_MAX_PRECOMPUTE_BUFFERS) UINT NumPrecomputeBufferSizes;
  297.     UINT PrecomputeBufferFloatSizes[D3DX11_FFT_MAX_PRECOMPUTE_BUFFERS];    
  298. } D3DX11_FFT_BUFFER_INFO;
  299.  
  300.  
  301. typedef enum D3DX11_FFT_CREATE_FLAG
  302. {
  303.     D3DX11_FFT_CREATE_FLAG_NO_PRECOMPUTE_BUFFERS = 0x01L,   // do not precompute values and store into buffers
  304. } D3DX11_FFT_CREATE_FLAG;
  305.  
  306.  
  307. //------------------------------------------------------------------------------
  308. // Creates an ID3DX11FFT COM interface object and returns a pointer to it at *ppFFT.
  309. // The descriptor describes the shape of the data as well as the scaling factors
  310. // that should be used for forward and inverse transforms.
  311. // The FFT computation may require temporaries that act as ping-pong buffers
  312. // and for other purposes. aTempSizes is a list of the sizes required for
  313. // temporaries. Likewise, some data may need to be precomputed and the sizes
  314. // of those sizes are returned in aPrecomputedBufferSizes.
  315. //
  316. // To perform a computation, follow these steps:
  317. // 1) Create the FFT context object
  318. // 2) Precompute (and Attach temp working buffers of at least the required size)
  319. // 3) Call Compute() on some input data
  320. //
  321. // Compute() may be called repeatedly with different inputs and transform
  322. // directions. When finished with the FFT work, release the FFT interface()
  323. //
  324. // Device                     Direct3DDeviceContext to use                      in
  325. // pDesc                      Descriptor for FFT transform                      in
  326. // Count                      the number of 1D FFTs to perform                  in
  327. // Flags                      See D3DX11_FFT_CREATE_FLAG                        in
  328. // pBufferInfo                Pointer to BUFFER_INFO struct, filled by funciton out
  329. // ppFFT                      Pointer to returned context pointer               out
  330. //------------------------------------------------------------------------------
  331.  
  332. HRESULT D3DX11CreateFFT(
  333.    ID3D11DeviceContext* pDeviceContext,
  334.    __in const D3DX11_FFT_DESC* pDesc,
  335.    UINT Flags,
  336.    __out D3DX11_FFT_BUFFER_INFO* pBufferInfo,
  337.    __out ID3DX11FFT** ppFFT
  338.  );
  339.  
  340. HRESULT D3DX11CreateFFT1DReal(
  341.    ID3D11DeviceContext* pDeviceContext,
  342.    UINT X,
  343.    UINT Flags,
  344.    __out D3DX11_FFT_BUFFER_INFO* pBufferInfo,
  345.    __out ID3DX11FFT** ppFFT
  346.  );
  347. HRESULT D3DX11CreateFFT1DComplex(
  348.    ID3D11DeviceContext* pDeviceContext,
  349.    UINT X,
  350.    UINT Flags,
  351.    __out D3DX11_FFT_BUFFER_INFO* pBufferInfo,
  352.    __out ID3DX11FFT** ppFFT
  353.  );
  354. HRESULT D3DX11CreateFFT2DReal(
  355.    ID3D11DeviceContext* pDeviceContext,
  356.    UINT X,
  357.    UINT Y,
  358.    UINT Flags,
  359.    __out D3DX11_FFT_BUFFER_INFO* pBufferInfo,
  360.    __out ID3DX11FFT** ppFFT
  361.  );
  362. HRESULT D3DX11CreateFFT2DComplex(
  363.    ID3D11DeviceContext* pDeviceContext,
  364.    UINT X,
  365.    UINT Y,
  366.    UINT Flags,
  367.    __out D3DX11_FFT_BUFFER_INFO* pBufferInfo,
  368.    __out ID3DX11FFT** ppFFT
  369.  );
  370. HRESULT D3DX11CreateFFT3DReal(
  371.    ID3D11DeviceContext* pDeviceContext,
  372.    UINT X,
  373.    UINT Y,
  374.    UINT Z,
  375.    UINT Flags,
  376.    __out D3DX11_FFT_BUFFER_INFO* pBufferInfo,
  377.    __out ID3DX11FFT** ppFFT
  378.  );
  379. HRESULT D3DX11CreateFFT3DComplex(
  380.    ID3D11DeviceContext* pDeviceContext,
  381.    UINT X,
  382.    UINT Y,
  383.    UINT Z,
  384.    UINT Flags,
  385.    __out D3DX11_FFT_BUFFER_INFO* pBufferInfo,
  386.    __out ID3DX11FFT** ppFFT
  387.  );
  388.  
  389.  
  390. #ifdef __cplusplus
  391. }
  392. #endif //__cplusplus
  393.  
  394. #endif //__D3DX11GPGPU_H__
  395.  
  396.  
  397.