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) 
  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. }
  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) 
  25. {   if (lpDev->CreateMatrix(&handle) != D3D_OK) 
  26.      return FALSE; 
  27.     if (lpDev->SetMatrix(handle, &data) != D3D_OK) 
  28.      return FALSE; 
  29. }
  30. #define RELEASE(x) {if (x != NULL) {x->Release(); x = NULL;}}
  31. #endif
  32. #define PUTD3DINSTRUCTION(op, sz, cnt, ptr) 
  33. (   ((LPD3DINSTRUCTION) ptr)->bOpcode = op, 
  34.     ((LPD3DINSTRUCTION) ptr)->bSize = sz, 
  35.     ((LPD3DINSTRUCTION) ptr)->wCount = cnt, 
  36.     ptr = (void *)(((LPD3DINSTRUCTION) ptr) + 1) 
  37. )
  38. #define VERTEX_DATA(loc, cnt, ptr) 
  39. (   (((ptr) != (loc))? memcpy((ptr), (loc), sizeof(D3DVERTEX) * (cnt)) : 0), 
  40.     ptr = (void *)(((LPD3DVERTEX) (ptr)) + (cnt)) 
  41. )
  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) 
  47. (   ((LPD3DMATRIXMULTIPLY) ptr)->hSrcMatrix1 = src1, 
  48.     ((LPD3DMATRIXMULTIPLY) ptr)->hSrcMatrix2 = src2, 
  49.     ((LPD3DMATRIXMULTIPLY) ptr)->hDestMatrix = dest, 
  50.     ptr = (void *)(((LPD3DMATRIXMULTIPLY) ptr) + 1) 
  51. )
  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) 
  63. (   ((LPD3DSTATE) ptr)->drstRenderStateType = (D3DRENDERSTATETYPE)type, 
  64.     ((LPD3DSTATE) ptr)->dwArg[0] = arg, 
  65.     ptr = (void *)(((LPD3DSTATE) ptr) + 1) 
  66. )
  67. // OP_PROCESS_VERTICES size: 4 (sizeof D3DINSTRUCTION)
  68. #define OP_PROCESS_VERTICES(cnt, ptr) 
  69.     PUTD3DINSTRUCTION(D3DOP_PROCESSVERTICES, sizeof(D3DPROCESSVERTICES), cnt, ptr)
  70. // PROCESSVERTICES_DATA size: 16 (sizeof D3DPROCESSVERTICES)
  71. #define PROCESSVERTICES_DATA(flgs, strt, cnt, ptr) 
  72. (   ((LPD3DPROCESSVERTICES) ptr)->dwFlags = flgs, 
  73.     ((LPD3DPROCESSVERTICES) ptr)->wStart = strt, 
  74.     ((LPD3DPROCESSVERTICES) ptr)->wDest = strt, 
  75.     ((LPD3DPROCESSVERTICES) ptr)->dwCount = cnt, 
  76.     ((LPD3DPROCESSVERTICES) ptr)->dwReserved = 0, 
  77.     ptr = (void *)(((LPD3DPROCESSVERTICES) ptr) + 1) 
  78. )
  79. // OP_TRIANGLE_LIST size: 4 (sizeof D3DINSTRUCTION)
  80. #define OP_TRIANGLE_LIST(cnt, ptr) 
  81.     PUTD3DINSTRUCTION(D3DOP_TRIANGLE, sizeof(D3DTRIANGLE), cnt, ptr)
  82. #define TRIANGLE_LIST_DATA(loc, count, ptr) 
  83. (   ((ptr) != (loc))? memcpy((ptr), (loc), sizeof(D3DTRIANGLE) * (count)) : 0, 
  84.     ptr = (void *)(((LPD3DTRIANGLE) (ptr)) + (count)) 
  85. )
  86. // OP_TRIANGLEEX_LIST size: 4 (sizeof D3DINSTRUCTION)
  87. #define OP_TRIANGLEEX_LIST(cnt, ptr) 
  88.     PUTD3DINSTRUCTION(D3DOP_TRIANGLEEX, sizeof(D3DTRIANGLEEX), cnt, ptr)
  89. #define TRIANGLEEX_LIST_DATA(loc, count, ptr) 
  90. (   ((ptr) != (loc))? memcpy((ptr), (loc), sizeof(D3DTRIANGLEEX) * (count)) : 0, 
  91.     ptr = (void *)(((LPD3DTRIANGLEEX) (ptr)) + (count)) 
  92. )
  93. // OP_LINE_LIST size: 4 (sizeof D3DINSTRUCTION)
  94. #define OP_LINE_LIST(cnt, ptr) 
  95.     PUTD3DINSTRUCTION(D3DOP_LINE, sizeof(D3DLINE), cnt, ptr)
  96. #define LINE_LIST_DATA(loc, count, ptr) 
  97. (   ((ptr) != (loc))? memcpy((ptr), (loc), sizeof(D3DLINE) * (count)) : 0, 
  98.     ptr = (void *)(((LPD3DLINE) (ptr)) + (count)) 
  99. )
  100. // OP_POINT_LIST size: 8 (sizeof D3DINSTRUCTION + sizeof D3DPOINT)
  101. #define OP_POINT_LIST(first, cnt, ptr) 
  102. (   PUTD3DINSTRUCTION(D3DOP_POINT, sizeof(D3DPOINT), 1, ptr), 
  103.     ((LPD3DPOINT)(ptr))->wCount = cnt, 
  104.     ((LPD3DPOINT)(ptr))->wFirst = first, 
  105.     ptr = (void*)(((LPD3DPOINT)(ptr)) + 1) 
  106. )
  107. // OP_SPAN_LIST size: 8 (sizeof D3DINSTRUCTION + sizeof D3DSPAN)
  108. #define OP_SPAN_LIST(first, cnt, ptr) 
  109. (   PUTD3DINSTRUCTION(D3DOP_SPAN, sizeof(D3DSPAN), 1, ptr), 
  110.     ((LPD3DSPAN)(ptr))->wCount = cnt, 
  111.     ((LPD3DSPAN)(ptr))->wFirst = first, 
  112.     ptr = (void*)(((LPD3DSPAN)(ptr)) + 1) 
  113. )
  114. // OP_BRANCH_FORWARD size: 18 (sizeof D3DINSTRUCTION + sizeof D3DBRANCH)
  115. #define OP_BRANCH_FORWARD(tmask, tvalue, tnegate, toffset, ptr) 
  116. (   PUTD3DINSTRUCTION(D3DOP_BRANCHFORWARD, sizeof(D3DBRANCH), 1, ptr), 
  117.     ((LPD3DBRANCH) ptr)->dwMask = tmask, 
  118.     ((LPD3DBRANCH) ptr)->dwValue = tvalue, 
  119.     ((LPD3DBRANCH) ptr)->bNegate = tnegate, 
  120.     ((LPD3DBRANCH) ptr)->dwOffset = toffset, 
  121.     ptr = (void *)(((LPD3DBRANCH) (ptr)) + 1) 
  122. )
  123. // OP_SET_STATUS size: 20 (sizeof D3DINSTRUCTION + sizeof D3DSTATUS)
  124. #define OP_SET_STATUS(flags, status, _x1, _y1, _x2, _y2, ptr) 
  125. (   PUTD3DINSTRUCTION(D3DOP_SETSTATUS, sizeof(D3DSTATUS), 1, ptr), 
  126.     ((LPD3DSTATUS)(ptr))->dwFlags = flags, 
  127.     ((LPD3DSTATUS)(ptr))->dwStatus = status, 
  128.     ((LPD3DSTATUS)(ptr))->drExtent.x1 = _x1, 
  129.     ((LPD3DSTATUS)(ptr))->drExtent.y1 = _y1, 
  130.     ((LPD3DSTATUS)(ptr))->drExtent.x2 = _x2, 
  131.     ((LPD3DSTATUS)(ptr))->drExtent.y2 = _y2, 
  132.     ptr = (void *)(((LPD3DSTATUS) (ptr)) + 1) 
  133. )
  134. // OP_NOP size: 4
  135. #define OP_NOP(ptr) 
  136.     PUTD3DINSTRUCTION(D3DOP_TRIANGLE, sizeof(D3DTRIANGLE), 0, ptr)
  137. #define OP_EXIT(ptr) 
  138.     PUTD3DINSTRUCTION(D3DOP_EXIT, 0, 0, ptr)
  139. #define QWORD_ALIGNED(ptr) 
  140.     !(0x00000007L & (ULONG)(ptr))
  141. #endif // __D3DMACS_H__