| /* |
| * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Sun designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Sun in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
| * CA 95054 USA or visit www.sun.com if you need additional information or |
| * have any questions. |
| */ |
| |
| #ifndef D3DUTILS_H |
| #define D3DUTILS_H |
| |
| #include "D3DContext.h" |
| |
| // - Types and macros used in SelectDeviceGUID ----------------------- |
| // Indexes for the rasterizers: |
| // TNL, HAL, REF, RGB |
| #define TNL_IDX (0) |
| #define HAL_IDX (1) |
| #define REF_IDX (2) |
| #define RGB_IDX (3) |
| #define DEV_IDX_MAX (RGB_IDX+1) |
| |
| typedef struct { |
| const GUID *pGUIDs[4]; |
| } DEVICES_INFO; |
| |
| // - Utility funcions for dealing with pixel formats ---------------- |
| const GUID * |
| D3DUtils_SelectDeviceGUID(IDirect3D7 *d3dObject); |
| |
| HRESULT |
| D3DUtils_FindDepthBufferFormat(IDirect3D7 *d3dObject, |
| int preferredDepth, |
| DDPIXELFORMAT* pddpf, |
| const GUID *pDeviceGUID); |
| HRESULT |
| D3DUtils_FindMaskTileTextureFormat(IDirect3DDevice7 *d3dDevice, |
| DDPIXELFORMAT* pddpf); |
| void |
| D3DUtils_SetupTextureFormats(IDirect3DDevice7 *d3dDevice, |
| D3DTextureTable &table); |
| |
| // - Utility funcions for working with matricies --------------------- |
| void |
| D3DUtils_SetIdentityMatrix(D3DMATRIX *m, BOOL adjust = TRUE); |
| |
| void |
| D3DUtils_SetOrthoMatrixOffCenterLH(D3DMATRIX *m, |
| float width, float height); |
| DDrawSurface * |
| D3DUtils_CreatePlainSurface(JNIEnv *env, DDraw *ddObject, |
| D3DContext *d3dContext, |
| int w, int h); |
| |
| DDrawSurface * |
| D3DUtils_CreateTexture(JNIEnv *env, DDraw *ddObject, |
| D3DContext *d3dContext, |
| int transparency, |
| int w, int h); |
| |
| HRESULT |
| D3DUtils_UploadIntImageToXRGBTexture(DDrawSurface *lpTexture, |
| int *pSrc, int width, int height); |
| |
| // - Utility functions for checking various capabilities of the device |
| |
| HRESULT |
| D3DUtils_CheckD3DCaps(LPD3DDEVICEDESC7 lpDesc7); |
| |
| HRESULT |
| D3DUtils_CheckDepthCaps(LPD3DDEVICEDESC7 lpDesc7); |
| |
| HRESULT |
| D3DUtils_CheckTextureCaps(LPD3DDEVICEDESC7 lpDesc7); |
| |
| HRESULT |
| D3DUtils_CheckDeviceCaps(LPD3DDEVICEDESC7 lpDesc7); |
| |
| // - Utility macros error handling of d3d operations ----------------- |
| |
| /* #define NO_D3D_CHECKING */ |
| |
| #ifdef NO_D3D_CHECKING |
| |
| #define D3DU_PRIM_LOOP_BEGIN(RES, DST_WSDO) |
| #define D3DU_PRIM2_LOOP_BEGIN(RES, SRC_WSDO, DST_WSDO) |
| #define D3DU_PRIM_LOOP_END(ENV, RES, DST_WSDO, PRIM) |
| #define D3DU_PRIM2_LOOP_END(ENV, RES, SRC_WSDO, DST_WSDO, PRIM) |
| |
| #else /* NO_D3D_CHECKING */ |
| |
| #ifndef MAX_BUSY_ATTEMPTS |
| #define MAX_BUSY_ATTEMPTS 50 // Arbitrary number of times to attempt |
| #endif |
| |
| |
| #define D3DU_PRIM_LOOP_BEGIN(RES, DST_WSDO) \ |
| do { \ |
| int attempts = 0; \ |
| while (attempts++ < MAX_BUSY_ATTEMPTS) { \ |
| if (FAILED((DST_WSDO)->lpSurface->IsLost())) { \ |
| RES = DDERR_SURFACELOST; \ |
| } else { |
| |
| #define D3DU_PRIM2_LOOP_BEGIN(RES, SRC_WSDO, DST_WSDO) \ |
| do { \ |
| int attempts = 0; \ |
| while (attempts++ < MAX_BUSY_ATTEMPTS) { \ |
| if (FAILED((DST_WSDO)->lpSurface->IsLost()) || \ |
| FAILED((SRC_WSDO)->lpSurface->IsLost())) \ |
| { \ |
| RES = DDERR_SURFACELOST; \ |
| } else { |
| |
| #define D3DU_PRIM_LOOP_END(ENV, RES, DST_WSDO, PRIM) \ |
| } \ |
| if (SUCCEEDED(RES)) { \ |
| break; \ |
| } else if (RES == DDERR_SURFACEBUSY || RES == DDERR_WASSTILLDRAWING) { \ |
| J2dTraceLn(J2D_TRACE_VERBOSE, #PRIM ## ": surface is busy."); \ |
| continue; \ |
| } else if (RES == DDERR_SURFACELOST) { \ |
| J2dTraceLn(J2D_TRACE_INFO, #PRIM ## ": dest surface lost."); \ |
| DST_WSDO->RestoreSurface(ENV, DST_WSDO); \ |
| break; \ |
| } else { \ |
| DebugPrintDirectDrawError(RES, #PRIM); \ |
| } \ |
| } \ |
| } while (0) |
| |
| #define D3DU_PRIM2_LOOP_END(ENV, RES, SRC_WSDO, DST_WSDO, PRIM) \ |
| } \ |
| if (SUCCEEDED(RES)) { \ |
| break; \ |
| } else if (RES == DDERR_SURFACEBUSY || RES == DDERR_WASSTILLDRAWING) { \ |
| J2dTraceLn(J2D_TRACE_VERBOSE, #PRIM ## ": surface is busy."); \ |
| continue; \ |
| } else if (RES == DDERR_SURFACELOST) { \ |
| if (FAILED((DST_WSDO)->lpSurface->IsLost())) { \ |
| J2dTraceLn(J2D_TRACE_INFO, #PRIM ## ": dst surface lost."); \ |
| (DST_WSDO)->RestoreSurface(ENV, (DST_WSDO)); \ |
| } \ |
| if (FAILED((SRC_WSDO)->lpSurface->IsLost())) { \ |
| J2dTraceLn(J2D_TRACE_INFO, #PRIM ## ": src surface lost."); \ |
| (SRC_WSDO)->RestoreSurface(ENV, (SRC_WSDO)); \ |
| } \ |
| break; \ |
| } else { \ |
| DebugPrintDirectDrawError(RES, #PRIM); \ |
| } \ |
| } \ |
| } while (0) |
| |
| #endif /* NO_D3D_CHECKING */ |
| |
| // - Utility macros for initializing vertex structures --------------- |
| |
| #define D3D_EXEC_PRIM_LOOP(ENV, RES, DST_WSDO, PRIM) \ |
| D3DU_PRIM_LOOP_BEGIN(RES, DST_WSDO); \ |
| RES = (PRIM); \ |
| D3DU_PRIM_LOOP_END(ENV, RES, DST_WSDO, PRIM); |
| |
| #define D3DU_INIT_VERTEX_PENT_XY(VQUAD, X1, Y1, X2, Y2) \ |
| do { \ |
| D3DU_INIT_VERTEX_QUAD_XY(VQUAD, X1, Y1, X2, Y2); \ |
| (VQUAD)[4].x = (X1); (VQUAD)[4].y = (Y1); \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_PENT_COLOR(VQUAD, VCOLOR) \ |
| do { \ |
| D3DU_INIT_VERTEX_QUAD_COLOR(VQUAD, VCOLOR); \ |
| (VQUAD)[4].color = (VCOLOR); \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_QUAD_XY(VQUAD, X1, Y1, X2, Y2) \ |
| do { \ |
| (VQUAD)[0].x = (X1); (VQUAD)[0].y = (Y1); \ |
| (VQUAD)[1].x = (X2); (VQUAD)[1].y = (Y1); \ |
| (VQUAD)[2].x = (X2); (VQUAD)[2].y = (Y2); \ |
| (VQUAD)[3].x = (X1); (VQUAD)[3].y = (Y2); \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_QUAD_XYZ(VQUAD, X1, Y1, X2, Y2, Z) \ |
| do { \ |
| D3DU_INIT_VERTEX_QUAD_XY(VQUAD, X1, Y1, X2, Y2); \ |
| (VQUAD)[0].z = (Z); \ |
| (VQUAD)[1].z = (Z); \ |
| (VQUAD)[2].z = (Z); \ |
| (VQUAD)[3].z = (Z); \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_QUAD_COLOR(VQUAD, VCOLOR) \ |
| do { \ |
| (VQUAD)[0].color = (VCOLOR); \ |
| (VQUAD)[1].color = (VCOLOR); \ |
| (VQUAD)[2].color = (VCOLOR); \ |
| (VQUAD)[3].color = (VCOLOR); \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_QUAD_UV(VQUAD, TU1, TV1, TU2, TV2) \ |
| do { \ |
| (VQUAD)[0].tu = (TU1); (VQUAD)[0].tv = (TV1); \ |
| (VQUAD)[1].tu = (TU2); (VQUAD)[1].tv = (TV1); \ |
| (VQUAD)[2].tu = (TU2); (VQUAD)[2].tv = (TV2); \ |
| (VQUAD)[3].tu = (TU1); (VQUAD)[3].tv = (TV2); \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_QUAD_XYUV(VQUAD, X1, Y1, X2, Y2, TU1, TV1, TU2, TV2) \ |
| do { \ |
| D3DU_INIT_VERTEX_QUAD_XY(VQUAD, X1, Y1, X2, Y2); \ |
| D3DU_INIT_VERTEX_QUAD_UV(VQUAD, TU1, TV1, TU2, TV2); \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_QUAD(VQUAD, X1, Y1, X2, Y2, VCOLOR, TU1, TV1, TU2, TV2) \ |
| do { \ |
| D3DU_INIT_VERTEX_QUAD_XYUV(VQUAD, X1, Y1, X2, Y2, TU1, TV1, TU2, TV2); \ |
| D3DU_INIT_VERTEX_QUAD_COLOR(VQUAD, VCOLOR); \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_6(VQUAD, X1, Y1, X2, Y2, VCOLOR, TU1, TV1, TU2, TV2) \ |
| do { \ |
| D3DU_INIT_VERTEX_XY_6(VHEX, X1, Y1, X2, Y2); \ |
| D3DU_INIT_VERTEX_UV_6(VHEX, TU1, TV1, TU2, TV2); \ |
| D3DU_INIT_VERTEX_COLOR_6(VHEX, VCOLOR); \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_UV_6(VHEX, TU1, TV1, TU2, TV2) \ |
| do { \ |
| (VHEX)[0].tu = TU1; (VHEX)[0].tv = TV1; \ |
| (VHEX)[1].tu = TU2; (VHEX)[1].tv = TV1; \ |
| (VHEX)[2].tu = TU1; (VHEX)[2].tv = TV2; \ |
| (VHEX)[3].tu = TU1; (VHEX)[3].tv = TV2; \ |
| (VHEX)[4].tu = TU2; (VHEX)[4].tv = TV1; \ |
| (VHEX)[5].tu = TU2; (VHEX)[5].tv = TV2; \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_COLOR_6(VHEX, VCOLOR) \ |
| do { \ |
| (VHEX)[0].color = VCOLOR; \ |
| (VHEX)[1].color = VCOLOR; \ |
| (VHEX)[2].color = VCOLOR; \ |
| (VHEX)[3].color = VCOLOR; \ |
| (VHEX)[4].color = VCOLOR; \ |
| (VHEX)[5].color = VCOLOR; \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_XY_6(VHEX, X1, Y1, X2, Y2) \ |
| do { \ |
| (VHEX)[0].x = X1; (VHEX)[0].y = Y1; \ |
| (VHEX)[1].x = X2; (VHEX)[1].y = Y1; \ |
| (VHEX)[2].x = X1; (VHEX)[2].y = Y2; \ |
| (VHEX)[3].x = X1; (VHEX)[3].y = Y2; \ |
| (VHEX)[4].x = X2; (VHEX)[4].y = Y1; \ |
| (VHEX)[5].x = X2; (VHEX)[5].y = Y2; \ |
| } while (0) |
| |
| #define D3DU_INIT_VERTEX_XYZ_6(VHEX, X1, Y1, X2, Y2, Z) \ |
| do { \ |
| D3DU_INIT_VERTEX_XY_6(VHEX, X1, Y1, X2, Y2); \ |
| (VHEX)[0].z = (Z); \ |
| (VHEX)[1].z = (Z); \ |
| (VHEX)[2].z = (Z); \ |
| (VHEX)[3].z = (Z); \ |
| (VHEX)[4].z = (Z); \ |
| (VHEX)[5].z = (Z); \ |
| } while (0) |
| |
| |
| #endif // D3DUTILS_H |