D3DMACS.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  3.  *
  4.  *  File: d3dmacs.h
  5.  *
  6.  *  Useful macros for generating execute buffers.  Consult the D3D sample
  7.  *  code for examples of their usage.
  8.  *
  9.  *  Use OP_NOP to QWORD align triangle and line instructions.
  10.  */
  11. #ifndef __D3DMACS_H__
  12. #define __D3DMACS_H__
  13. #undef RELEASE
  14. #ifndef __cplusplus
  15. #define MAKE_MATRIX(lpDev, handle, data) do { 
  16.     if (lpDev->lpVtbl->CreateMatrix(lpDev, &handle) != D3D_OK) 
  17.      return FALSE; 
  18.     if (lpDev->lpVtbl->SetMatrix(lpDev, handle, &data) != D3D_OK) 
  19.         return FALSE; 
  20.   } while (0)
  21. #define RELEASE(x) if (x != NULL) {x->lpVtbl->Release(x); x = NULL;}
  22. #endif
  23. #ifdef __cplusplus
  24. #define MAKE_MATRIX(lpDev, handle, data) do { 
  25.     if (lpDev->CreateMatrix(&handle) != D3D_OK) 
  26.      return FALSE; 
  27.     if (lpDev->SetMatrix(handle, &data) != D3D_OK) 
  28.         return FALSE; 
  29.   } while (0)
  30. #define RELEASE(x) if (x != NULL) {x->Release(); x = NULL;}
  31. #endif
  32. #define PUTD3DINSTRUCTION(op, sz, cnt, ptr) do { 
  33.     ((LPD3DINSTRUCTION) ptr)->bOpcode = op; 
  34.     ((LPD3DINSTRUCTION) ptr)->bSize = sz; 
  35.     ((LPD3DINSTRUCTION) ptr)->wCount = cnt; 
  36.     ptr = (void *)(((LPD3DINSTRUCTION) ptr) + 1); 
  37.   } while (0)
  38. #define VERTEX_DATA(loc, cnt, ptr) do { 
  39.     if ((ptr) != (loc)) memcpy((ptr), (loc), sizeof(D3DVERTEX) * (cnt)); 
  40.     ptr = (void *)(((LPD3DVERTEX) (ptr)) + (cnt)); 
  41.   } while (0)
  42. // OP_MATRIX_MULTIPLY size: 4 (sizeof D3DINSTRUCTION)
  43. #define OP_MATRIX_MULTIPLY(cnt, ptr) 
  44.     PUTD3DINSTRUCTION(D3DOP_MATRIXMULTIPLY, sizeof(D3DMATRIXMULTIPLY), cnt, ptr)
  45. // MATRIX_MULTIPLY_DATA size: 12 (sizeof MATRIXMULTIPLY)
  46. #define MATRIX_MULTIPLY_DATA(src1, src2, dest, ptr) do { 
  47.     ((LPD3DMATRIXMULTIPLY) ptr)->hSrcMatrix1 = src1; 
  48.     ((LPD3DMATRIXMULTIPLY) ptr)->hSrcMatrix2 = src2; 
  49.     ((LPD3DMATRIXMULTIPLY) ptr)->hDestMatrix = dest; 
  50.     ptr = (void *)(((LPD3DMATRIXMULTIPLY) ptr) + 1); 
  51.   } while (0)
  52. // OP_STATE_LIGHT size: 4 (sizeof D3DINSTRUCTION)
  53. #define OP_STATE_LIGHT(cnt, ptr) 
  54.     PUTD3DINSTRUCTION(D3DOP_STATELIGHT, sizeof(D3DSTATE), cnt, ptr)
  55. // OP_STATE_TRANSFORM size: 4 (sizeof D3DINSTRUCTION)
  56. #define OP_STATE_TRANSFORM(cnt, ptr) 
  57.     PUTD3DINSTRUCTION(D3DOP_STATETRANSFORM, sizeof(D3DSTATE), cnt, ptr)
  58. // OP_STATE_RENDER size: 4 (sizeof D3DINSTRUCTION)
  59. #define OP_STATE_RENDER(cnt, ptr) 
  60.     PUTD3DINSTRUCTION(D3DOP_STATERENDER, sizeof(D3DSTATE), cnt, ptr)
  61. // STATE_DATA size: 8 (sizeof D3DSTATE)
  62. #define STATE_DATA(type, arg, ptr) do { 
  63.     ((LPD3DSTATE) ptr)->drstRenderStateType = (D3DRENDERSTATETYPE)type; 
  64.     ((LPD3DSTATE) ptr)->dwArg[0] = arg; 
  65.     ptr = (void *)(((LPD3DSTATE) ptr) + 1); 
  66.   } while (0)
  67. // OP_PROCESS_VERTICES size: 4 (sizeof D3DINSTRUCTION)
  68. #define OP_PROCESS_VERTICES(cnt, ptr) do { 
  69.     PUTD3DINSTRUCTION(D3DOP_PROCESSVERTICES, sizeof(D3DPROCESSVERTICES), cnt, ptr); 
  70.   } while (0)
  71. // PROCESSVERTICES_DATA size: 16 (sizeof D3DPROCESSVERTICES)
  72. #define PROCESSVERTICES_DATA(flgs, strt, cnt, ptr) do { 
  73.     ((LPD3DPROCESSVERTICES) ptr)->dwFlags = flgs; 
  74.     ((LPD3DPROCESSVERTICES) ptr)->wStart = strt; 
  75.     ((LPD3DPROCESSVERTICES) ptr)->wDest = strt; 
  76.     ((LPD3DPROCESSVERTICES) ptr)->dwCount = cnt; 
  77.     ((LPD3DPROCESSVERTICES) ptr)->dwReserved = 0; 
  78.     ptr = (void *)(((LPD3DPROCESSVERTICES) ptr) + 1); 
  79.   } while (0)
  80. // OP_TRIANGLE_LIST size: 4 (sizeof D3DINSTRUCTION)
  81. #define OP_TRIANGLE_LIST(cnt, ptr) 
  82.     PUTD3DINSTRUCTION(D3DOP_TRIANGLE, sizeof(D3DTRIANGLE), cnt, ptr)
  83. #define TRIANGLE_LIST_DATA(loc, count, ptr) do { 
  84.     if ((ptr) != (loc)) memcpy((ptr), (loc), sizeof(D3DTRIANGLE) * (count)); 
  85.     ptr = (void *)(((LPD3DTRIANGLE) (ptr)) + (count)); 
  86.   } while (0)
  87. // OP_LINE_LIST size: 4 (sizeof D3DINSTRUCTION)
  88. #define OP_LINE_LIST(cnt, ptr) 
  89.     PUTD3DINSTRUCTION(D3DOP_LINE, sizeof(D3DLINE), cnt, ptr)
  90. #define LINE_LIST_DATA(loc, count, ptr) do { 
  91.     if ((ptr) != (loc)) memcpy((ptr), (loc), sizeof(D3DLINE) * (count)); 
  92.     ptr = (void *)(((LPD3DLINE) (ptr)) + (count)); 
  93.   }
  94. // OP_POINT_LIST size: 8 (sizeof D3DINSTRUCTION + sizeof D3DPOINT)
  95. #define OP_POINT_LIST(first, cnt, ptr) do { 
  96.     PUTD3DINSTRUCTION(D3DOP_POINT, sizeof(D3DPOINT), 1, ptr); 
  97.     ((LPD3DPOINT)(ptr))->wCount = cnt; 
  98.     ((LPD3DPOINT)(ptr))->wFirst = first; 
  99.     ptr = (void*)(((LPD3DPOINT)(ptr)) + 1); 
  100.   } while (0)
  101. // OP_SPAN_LIST size: 8 (sizeof D3DINSTRUCTION + sizeof D3DSPAN)
  102. #define OP_SPAN_LIST(first, cnt, ptr) do { 
  103.     PUTD3DINSTRUCTION(D3DOP_SPAN, sizeof(D3DSPAN), 1, ptr); 
  104.     ((LPD3DSPAN)(ptr))->wCount = cnt; 
  105.     ((LPD3DSPAN)(ptr))->wFirst = first; 
  106.     ptr = (void*)(((LPD3DSPAN)(ptr)) + 1); 
  107.   } while (0)
  108. // OP_BRANCH_FORWARD size: 18 (sizeof D3DINSTRUCTION + sizeof D3DBRANCH)
  109. #define OP_BRANCH_FORWARD(tmask, tvalue, tnegate, toffset, ptr) do { 
  110.     PUTD3DINSTRUCTION(D3DOP_BRANCHFORWARD, sizeof(D3DBRANCH), 1, ptr); 
  111.     ((LPD3DBRANCH) ptr)->dwMask = tmask; 
  112.     ((LPD3DBRANCH) ptr)->dwValue = tvalue; 
  113.     ((LPD3DBRANCH) ptr)->bNegate = tnegate; 
  114.     ((LPD3DBRANCH) ptr)->dwOffset = toffset; 
  115.     ptr = (void *)(((LPD3DBRANCH) (ptr)) + 1); 
  116.   } while (0)
  117. // OP_SET_STATUS size: 20 (sizeof D3DINSTRUCTION + sizeof D3DSTATUS)
  118. #define OP_SET_STATUS(flags, status, _x1, _y1, _x2, _y2, ptr) do { 
  119.     PUTD3DINSTRUCTION(D3DOP_SETSTATUS, sizeof(D3DSTATUS), 1, ptr); 
  120.     ((LPD3DSTATUS)(ptr))->dwFlags = flags; 
  121.     ((LPD3DSTATUS)(ptr))->dwStatus = status; 
  122.     ((LPD3DSTATUS)(ptr))->drExtent.x1 = _x1; 
  123.     ((LPD3DSTATUS)(ptr))->drExtent.y1 = _y1; 
  124.     ((LPD3DSTATUS)(ptr))->drExtent.x2 = _x2; 
  125.     ((LPD3DSTATUS)(ptr))->drExtent.y2 = _y2; 
  126.     ptr = (void *)(((LPD3DSTATUS) (ptr)) + 1); 
  127.   } while (0)
  128. // OP_NOP size: 4
  129. #define OP_NOP(ptr) 
  130.     PUTD3DINSTRUCTION(D3DOP_TRIANGLE, sizeof(D3DTRIANGLE), 0, ptr)
  131. #define OP_EXIT(ptr) 
  132.     PUTD3DINSTRUCTION(D3DOP_EXIT, 0, 0, ptr)
  133. #define QWORD_ALIGNED(ptr) 
  134.     ( ! ( 0x00000007L & (ULONG) (ptr) ) )
  135. #endif // __D3DMACS_H__