diff options
Diffstat (limited to 'src/native/d3d/D3dCtx.cpp')
-rw-r--r-- | src/native/d3d/D3dCtx.cpp | 2207 |
1 files changed, 0 insertions, 2207 deletions
diff --git a/src/native/d3d/D3dCtx.cpp b/src/native/d3d/D3dCtx.cpp deleted file mode 100644 index bc8990a..0000000 --- a/src/native/d3d/D3dCtx.cpp +++ /dev/null @@ -1,2207 +0,0 @@ -/* - * $RCSfile$ - * - * Copyright 2000-2008 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. - * - * $Revision$ - * $Date$ - * $State$ - */ - -/* j3dsys.h needs to be included before any other include files to suppres VC warning */ -#include "j3dsys.h" - -#include "Stdafx.h" - -D3dCtxVector d3dCtxList; - -/* - * Use the following code to initialize ctx property : - * - * D3dCtx ctx* = new D3dCtx(env, obj, hwnd, offScreen, vid); - * if (ctx->initialize(env, obj)) { - * delete ctx; - * } - * d3dCtxList.push_back(ctx); - * - * - * When ctx remove : - * - * d3dCtxList.erase(find(d3dCtxList.begin(), d3dCtxList.end(), ctx); - * delete ctx; - * - */ - -const D3DXMATRIX identityMatrix = D3DXMATRIX(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); - -D3dCtx::D3dCtx(JNIEnv* env, jobject obj, HWND _hwnd, BOOL _offScreen, - jint vid) -{ - int i; - jniEnv = env; - monitor = NULL; - hwnd = _hwnd; - pD3D = NULL; - pDevice = NULL; - offScreen = _offScreen; - offScreenWidth = 0; - offScreenHeight = 0; - - driverInfo = NULL; - deviceInfo = NULL; - - depthStencilSurface = NULL; - frontSurface = NULL; - backSurface = NULL; - resetColorTarget = false; - forceResize = false; - inToggle = false; - useFreeList0 = true; - reIndexifyTable = NULL; - bFastDrawQuads = getSystemProperty(env,"j3d.d3dForceFastQuads","true"); - - // set default RenderingState variable - cullMode = D3DCULL_CW; - fillMode = D3DFILL_SOLID; - zWriteEnable = TRUE; - zEnable = TRUE; - - // TODO: THIS NEEDS TO BE REDONE WITH INFO FROM THE FBCONFIG PTR - // this is the pixelFormat return from NativeConfigTemplate. - minZDepth = vid & 0x3fffffff; - if (vid & 0x80000000) - { - antialiasing = REQUIRED; - } - else - if (vid & 0x40000000) - { - antialiasing = PREFERRED; - } - else - { - antialiasing = UNNECESSARY; - } - - setFullScreenFromProperty(env); - - if (offScreen) { - // disable fullscreen mode for offscreen - bFullScreen = false; - bFullScreenRequired = false; - } - - dlTableSize = DISPLAYLIST_INITSIZE; - displayListTable = new LPD3DDISPLAYLIST[dlTableSize]; - if (displayListTable == NULL) { - error(OUTOFMEMORY); - exit(1); - } - for (i=0; i < dlTableSize; i++) { - displayListTable[i] = NULL; - } - - currDisplayListID = 0; - quadIndexBuffer = NULL; - quadIndexBufferSize = 0; - lineModeIndexBuffer = NULL; - - srcVertexBuffer = NULL; - dstVertexBuffer = NULL; - - - multiTextureSupport = false; - texUnitStage = 0; - twoSideLightingEnable = false; - bindTextureId = NULL; - bindTextureIdLen = 0; - - textureTable = (LPDIRECT3DTEXTURE9 *) malloc( - sizeof(LPDIRECT3DTEXTURE9) * TEXTURETABLESIZE); - - if (textureTable == NULL) { - error(OUTOFMEMORY); - exit(1); - } - ZeroMemory(textureTable, sizeof(LPDIRECT3DTEXTURE9)*TEXTURETABLESIZE); - textureTableLen = TEXTURETABLESIZE; - - bindTextureId = NULL; - - volumeTable = (LPDIRECT3DVOLUMETEXTURE9 *) malloc( - sizeof(LPDIRECT3DVOLUMETEXTURE9) * TEXTURETABLESIZE); - - if (volumeTable == NULL) { - error(OUTOFMEMORY); - exit(1); - } - ZeroMemory(volumeTable, sizeof(LPDIRECT3DVOLUMETEXTURE9)*TEXTURETABLESIZE); - volumeTableLen = TEXTURETABLESIZE; - - - cubeMapTable = (LPDIRECT3DCUBETEXTURE9 *) malloc( - sizeof(LPDIRECT3DCUBETEXTURE9) * TEXTURETABLESIZE); - - if (cubeMapTable == NULL) { - error(OUTOFMEMORY); - exit(1); - } - ZeroMemory(cubeMapTable, sizeof(LPDIRECT3DCUBETEXTURE9)*TEXTURETABLESIZE); - cubeMapTableLen = TEXTURETABLESIZE; - - - if (hwnd == 0) { - // Offscreen rendering - hwnd = GetDesktopWindow(); - topHwnd = hwnd; - } else { - topHwnd = getTopWindow(hwnd); - } - - if (d3dDriverList == NULL) { - - // keep trying to initialize even though - // last time it fail. - D3dDriverInfo::initialize(env); - } - - if (d3dDriverList == NULL) { - /* - * This happen when either - * (1) D3D v9.0 not install or - * (2) Not enough memory or - * (3) No adapter found in the system. - */ - SafeRelease(pD3D); - error(D3DNOTFOUND); - return; - } - - pD3D = Direct3DCreate9( D3D_SDK_VERSION ); - - if (pD3D == NULL) { - error(D3DNOTFOUND); - return; - } - // find current monitor handle before - // get current display mode - monitor = findMonitor(); - - // check current display mode - enumDisplayMode(&devmode); - - if (devmode.dmBitsPerPel < 16) { - // tell user switch to at least 16 bit color next time - warning(NEEDSWITCHMODE); - } - - // find the adapter for this - setDriverInfo(); - - GetWindowRect(topHwnd, &savedTopRect); - winStyle = GetWindowLong(topHwnd, GWL_STYLE); - - for (i=0; i < 4; i++) { - rasterRect[i].sx = 0; - rasterRect[i].sy = 0; - rasterRect[i].sz = 0; - rasterRect[i].rhw = 0; - } - - rasterRect[0].tu = 0; - rasterRect[0].tv = 1; - rasterRect[1].tu = 0; - rasterRect[1].tv = 0; - rasterRect[2].tu = 1; - rasterRect[2].tv = 1; - rasterRect[3].tu = 1; - rasterRect[3].tv = 0; - - // initialize Ambient Material - ambientMaterial.Power = 0; - CopyColor(ambientMaterial.Emissive, 0, 0, 0, 1.0f); - CopyColor(ambientMaterial.Diffuse, 0, 0, 0, 1.0f); - CopyColor(ambientMaterial.Ambient, 1.0f, 1.0f, 1.0f, 1.0f); - CopyColor(ambientMaterial.Specular, 0, 0, 0, 1.0f); - GetWindowRect(hwnd, &windowRect); -} - -D3dCtx::~D3dCtx() -{ - release(); - SafeRelease(pD3D); -} - -VOID D3dCtx::releaseTexture() -{ - - for (int i=0; i < bindTextureIdLen; i++) { - if (bindTextureId[i] > 0) { - pDevice->SetTexture(i, NULL); - } - } - - lockSurfaceList(); - if (textureTable != NULL) { - // free all textures - for (int i=0; i < textureTableLen; i++) { - SafeRelease(textureTable[i]); - } - SafeFree(textureTable); - } - - if (volumeTable != NULL) { - for (int i=0; i < volumeTableLen; i++) { - SafeRelease(volumeTable[i]); - } - SafeFree(volumeTable); - - } - - - if (cubeMapTable != NULL) { - for (int i=0; i < cubeMapTableLen; i++) { - SafeRelease(cubeMapTable[i]); - } - SafeFree(cubeMapTable); - - } - - textureTableLen = 0; - volumeTableLen = 0; - cubeMapTableLen = 0; - unlockSurfaceList(); - - // free list0 - freeList(); - // free list1 - freeList(); -} - -VOID D3dCtx::setViewport() -{ - int renderWidth = getWidth(); - int renderHeight = getHeight(); - HRESULT hr; - D3DVIEWPORT9 vp = {0, 0, renderWidth, renderHeight, 0.0f, 1.0f}; - - hr = pDevice->SetViewport( &vp ); - - if (FAILED(hr)) { - // Use the previous Viewport if fail - error(VIEWPORTFAIL, hr); - } -} - -VOID D3dCtx::releaseVB() -{ - - if (displayListTable != NULL) { - // entry 0 is not used - for (int i=1; i < dlTableSize; i++) { - SafeDelete(displayListTable[i]); - } - SafeFree(displayListTable); - dlTableSize = 0; - } - - - lockGeometry(); - - D3dVertexBuffer *p = vertexBufferTable.next; - D3dVertexBuffer *q, **r; - D3dVertexBufferVector *vbVector; - boolean found = false; - - while (p != NULL) { - vbVector = p->vbVector; - if (vbVector != NULL) { - for (ITER_LPD3DVERTEXBUFFER r = vbVector->begin(); - r != vbVector->end(); ++r) { - if (*r == p) { - vbVector->erase(r); - found = true; - break; - } - } - } - q = p; - p = p->next; - delete q; - } - - vertexBufferTable.next = NULL; - - freeVBList0.clear(); - freeVBList1.clear(); - - unlockGeometry(); - -} - -VOID D3dCtx::release() -{ - - releaseTexture(); - SafeFree(bindTextureId); - bindTextureIdLen = 0; - - - SafeRelease(srcVertexBuffer); - SafeRelease(dstVertexBuffer); - SafeRelease(quadIndexBuffer); - SafeRelease(lineModeIndexBuffer); - quadIndexBufferSize = 0; - releaseVB(); - - // trying to free VertexBuffer - // This will crash the driver if Indices/StreamSource - // Not set before. - // pDevice->SetIndices(NULL, 0); - // pDevice->SetStreamSource(0, NULL, 0); - SafeRelease(depthStencilSurface); - SafeRelease(frontSurface); - SafeRelease(backSurface); - - SafeRelease(pDevice); - currDisplayListID = 0; - multiTextureSupport = false; - texUnitStage = 0; - twoSideLightingEnable = false; - freePointerList(); - freePointerList(); -} - - - -/* - * Application should delete ctx when this function return false. - */ -BOOL D3dCtx::initialize(JNIEnv *env, jobject obj) -{ - HRESULT hr; - // int oldWidth, oldHeight; - // BOOL needBiggerRenderSurface = false; - - // It is possible that last time Emulation mode is used. - // If this is the case we will try Hardware mode first. - deviceInfo = setDeviceInfo(driverInfo, &bFullScreen, minZDepth, minZDepthStencil); - - if ((pD3D == NULL) || (driverInfo == NULL)) { - return false; - } - /* - if (offScreenWidth > driverInfo->desktopMode.Width) { - if (debug) { - printf("OffScreen width cannot greater than %d\n", - driverInfo->desktopMode.Width); - } - oldWidth = offScreenWidth; - offScreenWidth = driverInfo->desktopMode.Width; - needBiggerRenderSurface = true; - - } - - if (offScreenHeight > driverInfo->desktopMode.Height) { - if (debug) { - printf("OffScreen Height cannot greater than %d\n", - driverInfo->desktopMode.Height); - } - oldHeight = offScreenHeight; - offScreenHeight = driverInfo->desktopMode.Height; - needBiggerRenderSurface = true; - } - */ - - if (!bFullScreen) { - getScreenRect(hwnd, &savedClientRect); - CopyMemory(&screenRect, &savedClientRect, sizeof (RECT)); - } - - dwBehavior = findBehavior(); - - - if (debug) { - printf("[Java3D]: Use %s, ", driverInfo->adapterIdentifier.Description); - - if (deviceInfo->isHardwareTnL && - (dwBehavior & D3DCREATE_SOFTWARE_VERTEXPROCESSING)!=0) - { - // user select non-TnL device - printf("Hardware Rasterizer\n"); - } else { - printf("%s (TnL) \n", deviceInfo->deviceName); - } - } - - setPresentParams(env, obj); - - if (debug) { - printf("\n[Java3D]: Create device :\n"); - printInfo(&d3dPresent); - } - - - if ((d3dPresent.BackBufferWidth <= 0) || - (d3dPresent.BackBufferHeight <= 0)) { - if (debug) { - printf("[Java3D]: D3D: Can't create device of buffer size %dx%d\n", - d3dPresent.BackBufferWidth, - d3dPresent.BackBufferHeight); - } - //return false; - // Issue #578 fix on zero dimension window size - d3dPresent.BackBufferWidth = 1; - d3dPresent.BackBufferHeight = 1; - // end fix - } - - -if(bUseNvPerfHUD) -{ - // using NVIDIA NvPerfHUD profiler - printf("\n[Java3D]: running in NVIDIA NvPerfHUD mode:"); - UINT adapterToUse=driverInfo->iAdapter; - D3DDEVTYPE deviceType=deviceInfo->deviceType; - DWORD behaviorFlags = dwBehavior; - bool isHUDavail = false; - - // Look for 'NVIDIA NVPerfHUD' adapter - // If it is present, override default settings - for (UINT adapter=0;adapter<pD3D->GetAdapterCount(); adapter++) - { - D3DADAPTER_IDENTIFIER9 identifier; - HRESULT Res=pD3D->GetAdapterIdentifier(adapter,0,&identifier); - printf("\n Adapter identifier : %s",identifier.Description); - if (strcmp(identifier.Description,"NVIDIA NVPerfHUD")==0) - { - adapterToUse=adapter; - deviceType=D3DDEVTYPE_REF; - behaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING ; - isHUDavail = true; - printf("\n[Java3D]: found a NVIDIA NvPerfHUD adapter"); - break; - } - } - hr = pD3D->CreateDevice( adapterToUse, - deviceType, - topHwnd, - behaviorFlags, - &d3dPresent, - &pDevice); - if(!FAILED(hr)&& isHUDavail) - { - printf("\n[Java3D]: Using NVIDIA NvPerfHUD ! \n"); - } - else - { - printf("\n[Java3D]: No suitable device found for NVIDIA NvPerfHUD ! \n"); - } -} -else -{ - // NORMAL Mode - - hr = pD3D->CreateDevice(driverInfo->iAdapter, - deviceInfo->deviceType, - topHwnd, - dwBehavior, - &d3dPresent, - &pDevice); - if(debug){ - char* ok = SUCCEEDED(hr) ? " Successful ! " : " Failed !"; - char* devTypeName = deviceInfo->deviceType==D3DDEVTYPE_HAL ? " HAL " : "REF"; - printf("\n[Java3D] CreateDevice using \"%s\" was %s (%s) \n", deviceInfo->deviceName, ok, devTypeName ); - } - - if(SUCCEEDED(hr) && deviceInfo->deviceType==D3DDEVTYPE_REF){ - // error(HALDEVICENOTFOUND); - error(NOHARDWAREACCEL); - } - -} - - - if (FAILED(hr) && (requiredDeviceID < 0)) - { - printf("\n[Java3D]: Using D3DDEVTYPE_REF mode.\n"); - if (deviceInfo->deviceType != D3DDEVTYPE_REF) { - // switch to reference mode - warning(CREATEDEVICEFAIL, hr); - deviceInfo = driverInfo->d3dDeviceList[DEVICE_REF]; - dwBehavior = findBehavior(); - deviceInfo->findDepthStencilFormat(minZDepth,minZDepthStencil); - d3dPresent.AutoDepthStencilFormat = - deviceInfo->depthStencilFormat; - if (deviceInfo->depthStencilFormat == D3DFMT_UNKNOWN) { - // should not happen since reference mode will - // support all depth stencil format - error(DEPTHSTENCILNOTFOUND); - return false; - } - if (debug) { - printf("[Java3D]: Fallback to create reference device :\n"); - printInfo(&d3dPresent); - } - - hr = pD3D->CreateDevice(driverInfo->iAdapter, - deviceInfo->deviceType, - topHwnd, - dwBehavior, - &d3dPresent, - &pDevice); - - if(SUCCEEDED(hr)){ - // error(HALDEVICENOTFOUND); - error(NOHARDWAREACCEL); - } - } - } - - /* - if (offScreen && needBiggerRenderSurface) { - IDirect3DSurface9 *pRenderTarget; - IDirect3DSurface9 *pStencilDepthTarget; - - hr = pDevice->CreateRenderTarget(oldWidth, - oldHeight, - driverInfo->desktopMode.Format, - D3DMULTISAMPLE_NONE, - true, - &pRenderTarget); - - if (FAILED(hr)) { - printf("Fail to CreateRenderTarget %s\n", DXGetErrorString9(hr)); - } else { - hr = pDevice->CreateDepthStencilSurface(oldWidth, - oldHeight, - deviceInfo->depthStencilFormat, - D3DMULTISAMPLE_NONE, - &pStencilDepthTarget); - if (FAILED(hr)) { - printf("Fail to CreateDepthStencilSurface %s\n", DXGetErrorString9(hr)); - pRenderTarget->Release(); - } else { - hr = pDevice->SetRenderTarget(pRenderTarget, - pStencilDepthTarget); - if (FAILED(hr)) { - printf("Fail to SetRenderTarget %s\n", DXGetErrorString9(hr)); - pRenderTarget->Release(); - pStencilDepthTarget->Release(); - } else { - printf("Successfully set bigger buffer\n"); - } - } - } - } - */ - - - setWindowMode(); - - if (FAILED(hr)) { - release(); - if (!inToggle) { - if(debug){ - error(PLEASEUPDATEDRIVERS, hr); - }else{ - error(PLEASEUPDATEDRIVERS); - } - } else { - warning(PLEASEUPDATEDRIVERS, hr); - } - return false; - } - - if (deviceInfo != NULL) { - bindTextureIdLen = deviceInfo->maxTextureUnitStageSupport; - } else { - bindTextureIdLen = 1; - } - - - jclass canvasCls = env->GetObjectClass(obj); - jfieldID id; - - // TODO check it !!!! - id = env->GetFieldID(canvasCls, "maxTexCoordSets", "I"); //was numtexCoordSupported - env->SetIntField(obj, id, TEXSTAGESUPPORT); - - if (bindTextureIdLen > 1) { - if (bindTextureIdLen > TEXSTAGESUPPORT) { - // D3D only support max. 8 stages. - bindTextureIdLen = TEXSTAGESUPPORT; - } - multiTextureSupport = true; - id = env->GetFieldID(canvasCls, "multiTexAccelerated", "Z"); - env->SetBooleanField(obj, id, JNI_TRUE); - - // TODO check it !!!! - id = env->GetFieldID(canvasCls, "maxTextureUnits", "I"); //was numTexUnitSupported - env->SetIntField(obj, id, bindTextureIdLen); - } else { - bindTextureIdLen = 1; - } - - bindTextureId = (INT *) malloc(sizeof(INT) * bindTextureIdLen); - if (bindTextureId == NULL) { - release(); - error(OUTOFMEMORY); - return false; - } - - setViewport(); - setDefaultAttributes(); - - // Issue 400: initialize local viewer (for lighting) to false - pDevice->SetRenderState(D3DRS_LOCALVIEWER, FALSE); - - createVertexBuffer(); - - if (debug && (deviceInfo != NULL)) { - if (multiTextureSupport) { - printf("Max Texture Unit Stage support : %d \n", - deviceInfo->maxTextureBlendStages); - - printf("Max Simultaneous Texture unit support : %d \n", - deviceInfo->maxSimultaneousTextures); - } else { - printf("MultiTexture support : false\n"); - } - } - return true; -} - -// canvas size change, get new back buffer -INT D3dCtx::resize(JNIEnv *env, jobject obj) -{ - int retValue; - - if ((pDevice == NULL) || bFullScreen) { - return false; // not yet ready when startup - } - - if (forceResize) { - // ignore first resize request after screen toggle - forceResize = false; - return NOCHANGE; - } - // we don't want resize to do twice but when window toggle - // between fullscreen and window mode, the move event will got - // first. Thus it will get size correctly without doing resize. - - BOOL moveRequest; - - - GetWindowRect(hwnd, &windowRect); - - if ((windowRect.right == screenRect.right) && - (windowRect.left == screenRect.left) && - (windowRect.bottom == screenRect.bottom) && - (windowRect.top == screenRect.top)) { - return NOCHANGE; - } - - if (((windowRect.left - windowRect.right) - == (screenRect.left - screenRect.right)) && - ((windowRect.bottom - windowRect.top) - == (screenRect.bottom - screenRect.top))) { - moveRequest = true; - } else { - moveRequest = false; - } - - - HMONITOR oldMonitor = monitor; - monitor = findMonitor(); - - getScreenRect(hwnd, &screenRect); - - if (monitor != oldMonitor) { - enumDisplayMode(&devmode); - setDriverInfo(); - release(); - initialize(env, obj); - return RECREATEDDRAW; - } - - if (!moveRequest) { - - retValue = resetSurface(env, obj); - if (retValue != RECREATEDFAIL) { - return retValue; - } else { - return RECREATEDDRAW; - } - } - return NOCHANGE; -} - - -INT D3dCtx::toggleMode(BOOL _bFullScreen, JNIEnv *env, jobject obj) -{ - INT retValue; - - if ((pDevice == NULL) || - (!_bFullScreen && - !deviceInfo->canRenderWindowed)) { - // driver did not support window mode - return NOCHANGE; - } - - int onScreenCount = 0; - - for (ITER_D3dCtxVector p = d3dCtxList.begin(); p != d3dCtxList.end(); p++) { - if (!(*p)->offScreen && - // (monitor == (*p)->monitor) && - (++onScreenCount > 1)) { - // don't toggle if there are more than one onScreen ctx exists - // in the same screen - return false; - } - } - - - inToggle = true; - bFullScreen = _bFullScreen; - - retValue = resetSurface(env, obj); - - if (retValue != RECREATEDFAIL) { - forceResize = true; - } else { - // Switch back to window mode if fall to toggle fullscreen - // and vice versa - bFullScreen = !bFullScreen; - release(); - if (initialize(env, obj)) { - retValue = RECREATEDDRAW; - forceResize = true; - } else { - retValue = RECREATEDFAIL; - } - } - if (retValue != RECREATEDFAIL) { - setViewport(); - } - - inToggle = false; - return retValue; -} - -VOID D3dCtx::setPresentParams(JNIEnv *env, jobject obj) -{ - setCanvasProperty(env, obj); - - d3dPresent.AutoDepthStencilFormat = deviceInfo->depthStencilFormat; - d3dPresent.EnableAutoDepthStencil = true; - - // Fix to Issue 226 : D3D - fail on stress test for the creation and destruction of Canvases - bool useMultisample = (antialiasing != UNNECESSARY) && deviceInfo->supportAntialiasing(); - - if (useMultisample) { - d3dPresent.MultiSampleType = deviceInfo->getBestMultiSampleType(); - d3dPresent.MultiSampleQuality = 0; - } else { - d3dPresent.MultiSampleType = D3DMULTISAMPLE_NONE; - d3dPresent.MultiSampleQuality = 0; - } - d3dPresent.BackBufferCount = 1; - d3dPresent.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; - - // We can't use Discard, otherwise readRaster will fail as - // content of backbuffer will discard after swap unless - // we always call readRaster() just before swap. - // However in this way we can't use multisample effect - - // FULLSCREEN - if (bFullScreen) { - GetWindowRect(topHwnd, &savedTopRect); - GetWindowRect(hwnd, &savedClientRect); - - d3dPresent.Windowed = false; - d3dPresent.hDeviceWindow = topHwnd; - - if (useMultisample) { - d3dPresent.SwapEffect = D3DSWAPEFFECT_DISCARD; - } else { - d3dPresent.SwapEffect = D3DSWAPEFFECT_FLIP; - } - d3dPresent.BackBufferWidth = driverInfo->desktopMode.Width; - d3dPresent.BackBufferHeight = driverInfo->desktopMode.Height; - d3dPresent.BackBufferFormat = driverInfo->desktopMode.Format; - d3dPresent.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; - if (deviceInfo->supportRasterPresImmediate) - d3dPresent.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - else - d3dPresent.PresentationInterval = D3DPRESENT_INTERVAL_ONE; - - } else { - // WINDOWED mode - d3dPresent.Windowed = true; - d3dPresent.hDeviceWindow = hwnd; - - if (useMultisample) { - d3dPresent.SwapEffect = D3DSWAPEFFECT_DISCARD; - } else { - d3dPresent.SwapEffect = D3DSWAPEFFECT_COPY; - } - d3dPresent.BackBufferWidth = getWidth(); - d3dPresent.BackBufferHeight = getHeight(); - d3dPresent.BackBufferFormat = driverInfo->desktopMode.Format; - d3dPresent.FullScreen_RefreshRateInHz = 0; - - if (deviceInfo->supportRasterPresImmediate) - d3dPresent.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - else - d3dPresent.PresentationInterval = D3DPRESENT_INTERVAL_ONE; - - } - -} - -INT D3dCtx::resetSurface(JNIEnv *env, jobject obj) -{ - D3dDeviceInfo* oldDevice = deviceInfo; - HRESULT hr; - - - deviceInfo = setDeviceInfo(driverInfo, &bFullScreen, minZDepth, minZDepthStencil); - - if (deviceInfo == NULL) { - return NOCHANGE; - } - if (deviceInfo != oldDevice) { - // we fall back to Reference mode last time, - // try to see if we can run in hardware mode after - // the surface size change. - release(); - if (initialize(env, obj)) { - return RECREATEDDRAW; - } else { - return RECREATEDFAIL; - } - } else { - setPresentParams(env, obj); - if (debug) { - printf("\nReset Device :\n"); - printInfo(&d3dPresent); - } - - // Must release any non default pool surface, otherwise - // Reset() will fail - SafeRelease(depthStencilSurface); - SafeRelease(frontSurface); - SafeRelease(backSurface); - - releaseVB(); - SafeRelease(lineModeIndexBuffer); - quadIndexBufferSize = 0; - - hr = pDevice->Reset(&d3dPresent); - if (FAILED(hr)) { - warning(RESETFAIL, hr); - // try to recreate Surface, if still fail, try Reference mode - release(); - if (initialize(env, obj)) { - return RECREATEDDRAW; - } else { - return RECREATEDFAIL; - } - } else { - setWindowMode(); - setDefaultAttributes(); - return RESETSURFACE; - } - } - - return NOCHANGE; -} - - -VOID D3dCtx::error(int idx) -{ - error(getErrorMessage(idx)); -} - -VOID D3dCtx::error(int idx, HRESULT hr) -{ - error(getErrorMessage(idx), hr); -} - - -VOID D3dCtx::warning(int idx) -{ - printf("[Java3D] Warning : %s\n", getErrorMessage(idx)); -} - -VOID D3dCtx::warning(int idx, HRESULT hr) -{ - printf("[Java3D] Warning : %s - %s\n", getErrorMessage(idx), DXGetErrorString9(hr)); -} - - -VOID D3dCtx::error(char *s) -{ - showError(hwnd, s, bFullScreen); -} - -VOID D3dCtx::error(char *s, HRESULT hr) -{ - char message[400]; - sprintf(message, "%s - %s", s, DXGetErrorString9(hr)); - showError(hwnd, message, bFullScreen); -} - - -VOID D3dCtx::d3dWarning(int idx) -{ - printf("[Java3D] Warning: %s\n", getErrorMessage(idx)); -} - -VOID D3dCtx::d3dWarning(int idx, HRESULT hr) -{ - printf("[Java3D] Warning: %s - %s\n", - getErrorMessage(idx), DXGetErrorString9(hr)); - -} - -VOID D3dCtx::d3dError(char *s) -{ - showError(GetDesktopWindow(), s, false); -} - - -VOID D3dCtx::d3dError(int idx) -{ - d3dError(getErrorMessage(idx)); -} - - -// Only display message box for the first error, since -// Java3D will continue to invoke createContext() when it fail -VOID D3dCtx::showError(HWND hwnd, char *s, BOOL bFullScreen) -{ - if (firstError) { - firstError = false; - if (bFullScreen) { - // In full screen mode, we can't see message box - printf("[Java3D] Error: %s\n", s); - exit(1); - } else { - MessageBox(hwnd, s, "Java 3D", MB_OK|MB_ICONERROR); - } - } -} - - -DWORD D3dCtx::getWidth() -{ - if (!offScreen) { - return screenRect.right - screenRect.left; - } else { - return offScreenWidth; - } - -} - - -DWORD D3dCtx::getHeight() -{ - if (!offScreen) { - return screenRect.bottom - screenRect.top; - } else { - return offScreenHeight; - } - -} - -D3dDeviceInfo* D3dCtx::selectDevice(int deviceID, - D3dDriverInfo *driverInfo, - BOOL *bFullScreen, - int minZDepth, - int minZDepthStencil) -{ - D3dDeviceInfo *pDevice; - - for (int i=0; i < numDeviceTypes; i++) - { - pDevice = driverInfo->d3dDeviceList[i]; - if ((((deviceID == DEVICE_HAL) || (deviceID == DEVICE_HAL_TnL)) && - (pDevice->deviceType == D3DDEVTYPE_HAL)) || - (deviceID == DEVICE_REF) && - (pDevice->deviceType == D3DDEVTYPE_REF)) - { - if ((*bFullScreen && !pDevice->fullscreenCompatible) || - (!*bFullScreen && !pDevice->desktopCompatible)) - { - if (pDevice->deviceType == D3DDEVTYPE_HAL) - { - d3dError(HALDEVICENOTFOUND); - } - else - { - // should not happen, REF device always support - d3dError(DEVICENOTFOUND); - } - // exit is not allowed on applets - //exit(1); - return NULL; - } - if (pDevice->maxZBufferDepthSize == 0) - { - if (pDevice->deviceType == D3DDEVTYPE_HAL) - { - d3dError(HALNOTCOMPATIBLE); - } - else - { - // should not happen, REF device always support - d3dError(DEVICENOTFOUND); - } - // exit is not allowed on applets - //exit(1); - return NULL; - } - if (pDevice->deviceType == D3DDEVTYPE_HAL) - { - if ((deviceID == DEVICE_HAL_TnL) && - !pDevice->isHardwareTnL) - { - d3dError(TNLHALDEVICENOTFOUND); - // exit is not allowed on applets - //exit(1); - return NULL; - } - } - - pDevice->findDepthStencilFormat(minZDepth, minZDepthStencil); - if (pDevice->depthStencilFormat == D3DFMT_UNKNOWN) - { - d3dError(DEPTHSTENCILNOTFOUND); - // exit is not allowed on applets - //exit(1); - return NULL; - } - return pDevice; - } - } - - // should not happen - d3dError(DEVICENOTFOUND); - // exit is not allowed on applets - //exit(1); - return NULL; -} - - - -D3dDeviceInfo* D3dCtx::selectBestDevice(D3dDriverInfo *driverInfo, - BOOL *bFullScreen, - int minZDepth, - int minZDepthStencil) -{ - D3dDeviceInfo *pDevice; - D3dDeviceInfo *bestDevice = NULL; - int i; - - for (i=0; i < numDeviceTypes; i++) - { - pDevice = driverInfo->d3dDeviceList[i]; - if (pDevice->maxZBufferDepthSize > 0) - { - pDevice->findDepthStencilFormat(minZDepth, minZDepthStencil); - - if (pDevice->depthStencilFormat == D3DFMT_UNKNOWN) - { - if (pDevice->deviceType == D3DDEVTYPE_REF) - { - d3dError(DEPTHSTENCILNOTFOUND); - return NULL; - } else { - continue; - } - } - if (*bFullScreen) { - if (pDevice->fullscreenCompatible) { - bestDevice = pDevice; - break; - } - } else { - if (pDevice->canRenderWindowed) { - if (pDevice->desktopCompatible) { - bestDevice = pDevice; - break; - } - } else { - if (pDevice->fullscreenCompatible) { - // switch to fullscreen mode - *bFullScreen = true; - bestDevice = pDevice; - break; - } - } - } - } - } - - if (bestDevice == NULL) { - // should not happen - d3dError(DEVICENOTFOUND); - return NULL; - } - - // TODO: suggest another display mode for user - /* - if (bestDevice->deviceType == D3DDEVTYPE_REF) { - // Recomend other display mode that support - // hardware accerated rendering if any. - int numModes = pD3D->GetAdapterModeCount(driverInfo->iAdapter); - D3DDISPLAYMODE dmode; - - for (i=0; i < numModes; i++) { - pD3D->EnumAdapterModes(pDriverInfo->iAdapter, i, &dmode); - if ((dmode.Width < 640) || (dmode.Height < 400)) { - // filter out low resolution modes - continue; - } - } - .... - } - */ - return bestDevice; -} - - -VOID D3dCtx::setDeviceFromProperty(JNIEnv *env) -{ - - jclass systemClass = env->FindClass( "javax/media/j3d/MasterControl" ); - - if ( systemClass != NULL ) - { - jmethodID method = env->GetStaticMethodID( - systemClass, "getProperty", - "(Ljava/lang/String;)Ljava/lang/String;" ); - if ( method != NULL ) - { - jstring name = env->NewStringUTF( "j3d.d3ddevice" ); - jstring property = reinterpret_cast<jstring>( - env->CallStaticObjectMethod( - systemClass, method, name )); - jboolean isCopy; - - if ( property != NULL ) - { - const char* chars = env->GetStringUTFChars( - property, &isCopy ); - if ( chars != 0 ) - { - if (stricmp(chars, "reference") == 0) { - // There is no emulation device anymore in v8.0 - requiredDeviceID = DEVICE_REF; - } else if (stricmp(chars, "hardware") == 0) { - requiredDeviceID = DEVICE_HAL; - } else if (stricmp(chars, "TnLhardware") == 0) { - requiredDeviceID = DEVICE_HAL_TnL; - } else { - d3dError(UNKNOWNDEVICE); - //switch to default - requiredDeviceID = 0; - //exit(1); - - } - env->ReleaseStringUTFChars( property, chars ); - } - } - name = env->NewStringUTF( "j3d.d3ddriver" ); - property = reinterpret_cast<jstring>( - env->CallStaticObjectMethod( - systemClass, method, name )); - if ( property != NULL ) - { - const char* chars = env->GetStringUTFChars( - property, &isCopy); - if ( chars != 0 ) - { - // atoi() return 0, our default value, on error. - requiredDriverID = atoi(chars); - } - } - } - } -} - -VOID D3dCtx::setFullScreenFromProperty(JNIEnv *env) -{ - - jclass systemClass = env->FindClass( "javax/media/j3d/MasterControl" ); - - bFullScreenRequired = false; - bFullScreen = false; - - if ( systemClass != NULL ) - { - jmethodID method = env->GetStaticMethodID( - systemClass, "getProperty", - "(Ljava/lang/String;)Ljava/lang/String;" ); - if ( method != NULL ) - { - jstring name = env->NewStringUTF( "j3d.fullscreen" ); - jstring property = reinterpret_cast<jstring>( - env->CallStaticObjectMethod( - systemClass, method, name )); - if ( property != NULL ) - { - jboolean isCopy; - const char * chars = env->GetStringUTFChars( - property, &isCopy ); - if ( chars != 0 ) - { - if ( stricmp( chars, "required" ) == 0 ) { - bFullScreenRequired = true; - bFullScreen = true; - } else if ( stricmp( chars, "preferred" ) == 0 ) { - bFullScreen = true; - } - // "UNNECESSARY" is the default - env->ReleaseStringUTFChars( property, chars ); - } - } - } - } - -} - -VOID D3dCtx::setVBLimitProperty(JNIEnv *env) -{ - jclass systemClass = env->FindClass( "javax/media/j3d/MasterControl" ); - - if ( systemClass != NULL ) - { - jmethodID method = env->GetStaticMethodID( - systemClass, "getProperty", - "(Ljava/lang/String;)Ljava/lang/String;" ); - if ( method != NULL ) - { - jstring name = env->NewStringUTF( "j3d.vertexbufferlimit" ); - jstring property = reinterpret_cast<jstring>( - env->CallStaticObjectMethod( - systemClass, method, name )); - if ( property != NULL ) - { - jboolean isCopy; - const char * chars = env->GetStringUTFChars( - property, &isCopy ); - if ( chars != 0 ) - { - long vbLimit = atol(chars); - env->ReleaseStringUTFChars( property, chars ); - if (vbLimit >= 6) { - // Has to be at least 6 since for Quad the - // limit reset to 2*vbLimit/3 >= 4 - printf("Java 3D: VertexBuffer limit set to %ld\n", vbLimit); - vertexBufferMaxVertexLimit = vbLimit; - } else { - printf("Java 3D: VertexBuffer limit should be an integer >= 6 !\n"); - } - - } - } - } - } -} - -VOID D3dCtx::setDebugProperty(JNIEnv *env) -{ - jclass systemClass = env->FindClass( "javax/media/j3d/MasterControl" ); - - debug = false; - - if ( systemClass != NULL ) - { - jmethodID method = env->GetStaticMethodID( - systemClass, "getProperty", - "(Ljava/lang/String;)Ljava/lang/String;" ); - if ( method != NULL ) - { - jstring name = env->NewStringUTF( "j3d.debug" ); - jstring property = reinterpret_cast<jstring>( - env->CallStaticObjectMethod( - systemClass, method, name )); - if ( property != NULL ) - { - jboolean isCopy; - const char * chars = env->GetStringUTFChars( - property, &isCopy ); - if ( chars != 0 ) - { - if ( stricmp( chars, "true" ) == 0 ) { - debug = true; - } else { - debug = false; - } - // "UNNECESSARY" is the default - env->ReleaseStringUTFChars( property, chars ); - } - } - } - } -} - -BOOL D3dCtx::getSystemProperty(JNIEnv *env, char *strName, char *strValue) -{ - jclass systemClass = env->FindClass( "javax/media/j3d/MasterControl" ); - - if ( systemClass != NULL ) - { - jmethodID method = env->GetStaticMethodID( - systemClass, "getProperty", - "(Ljava/lang/String;)Ljava/lang/String;" ); - if ( method != NULL ) - { - jstring name = env->NewStringUTF( strName ); - jstring property = reinterpret_cast<jstring>( - env->CallStaticObjectMethod( - systemClass, method, name )); - if ( property != NULL ) - { - jboolean isCopy; - const char * chars = env->GetStringUTFChars(property, &isCopy ); - if ( chars != 0 && stricmp( chars, strValue ) == 0 ) - { - env->ReleaseStringUTFChars( property, chars ); - return true; - } - else - { - env->ReleaseStringUTFChars( property, chars ); - return false; - } - } - } - } - return false; -} - -VOID D3dCtx::setImplicitMultisamplingProperty(JNIEnv *env) -{ - jclass cls = env->FindClass("javax/media/j3d/VirtualUniverse"); - - if (cls == NULL) { - implicitMultisample = false; - return; - } - - jfieldID fieldID = env->GetStaticFieldID(cls, "mc", "Ljavax/media/j3d/MasterControl;"); - - if (fieldID == NULL) { - implicitMultisample = false; - return; - } - - jobject obj = env->GetStaticObjectField(cls, fieldID); - - if (obj == NULL) { - implicitMultisample = false; - return; - } - - cls = env->FindClass("javax/media/j3d/MasterControl"); - - if (cls == NULL) { - implicitMultisample = false; - return; - } - - fieldID = env->GetFieldID(cls, "implicitAntialiasing", "Z"); - - if (fieldID == NULL ) { - implicitMultisample = false; - return; - } - - implicitMultisample = env->GetBooleanField(obj, fieldID); - return; -} - - -// Callback to notify Canvas3D which mode it is currently running -VOID D3dCtx::setCanvasProperty(JNIEnv *env, jobject obj) -{ - int mask = javax_media_j3d_Canvas3D_EXT_ABGR | - javax_media_j3d_Canvas3D_EXT_BGR; - - if ((deviceInfo->depthStencilFormat == D3DFMT_D24S8) || - (deviceInfo->depthStencilFormat == D3DFMT_D24X4S4)) - { - // The other format D3DFMT_D15S1 with 1 bit - // stencil buffer has no use for Decal group so it - // is ignored. - mask |= javax_media_j3d_Canvas3D_STENCIL_BUFFER; - } - - - jclass canvasCls = env->GetObjectClass(obj); - jfieldID id = env->GetFieldID(canvasCls, "fullScreenMode", "Z"); - env->SetBooleanField(obj, id, bFullScreen); - - id = env->GetFieldID(canvasCls, "fullscreenWidth", "I"); - env->SetIntField(obj, id, driverInfo->desktopMode.Width); - - id = env->GetFieldID(canvasCls, "fullscreenHeight", "I"); - env->SetIntField(obj, id, driverInfo->desktopMode.Height); - - //id = env->GetFieldID(canvasCls, "userStencilAvailable", "Z"); - //env->SetBooleanField(obj, id, deviceInfo->supportStencil ); - - - id = env->GetFieldID(canvasCls, "textureExtendedFeatures", "I"); - int texMask = deviceInfo->getTextureFeaturesMask(); - jboolean enforcePowerOfTwo = getJavaBoolEnv(env, "enforcePowerOfTwo"); - if(enforcePowerOfTwo) { - // printf("DEBUG enforcePowerOfTwo is true"); - texMask &= ~javax_media_j3d_Canvas3D_TEXTURE_NON_POWER_OF_TWO; - } - env->SetIntField(obj, id, texMask); - - - - id = env->GetFieldID(canvasCls, "extensionsSupported", "I"); - env->SetIntField(obj, id, mask); - - - id = env->GetFieldID(canvasCls, "nativeGraphicsVersion", "Ljava/lang/String;"); - char *version = "DirectX 9.0 or above"; - env->SetObjectField(obj, id, env->NewStringUTF(version)); - - float degree = float(deviceInfo->maxAnisotropy); - id = env->GetFieldID(canvasCls, "anisotropicDegreeMax", "F"); - env->SetFloatField(obj, id, degree); - - id = env->GetFieldID(canvasCls, "textureWidthMax", "I"); - env->SetIntField(obj, id, deviceInfo->maxTextureWidth); - - id = env->GetFieldID(canvasCls, "textureHeightMax", "I"); - env->SetIntField(obj, id, deviceInfo->maxTextureHeight); - - if (deviceInfo->maxTextureDepth > 0) { - id = env->GetFieldID(canvasCls, "texture3DWidthMax", "I"); - env->SetIntField(obj, id, deviceInfo->maxTextureWidth); - - id = env->GetFieldID(canvasCls, "texture3DHeightMax", "I"); - env->SetIntField(obj, id, deviceInfo->maxTextureHeight); - - id = env->GetFieldID(canvasCls, "texture3DDepthMax", "I"); - env->SetIntField(obj, id, deviceInfo->maxTextureDepth); - - // issue 135 - // private String nativeGraphicsVendor = "<UNKNOWN>"; - // private String nativeGraphicsRenderer = "<UNKNOWN>"; - id = env->GetFieldID(canvasCls, "nativeGraphicsVendor", "Ljava/lang/String;"); - //char *nGVendor = driverInfo->adapterIdentifier.DeviceName ; - char *nGVendor = deviceInfo->deviceVendor ; - env->SetObjectField(obj, id, env->NewStringUTF(nGVendor)); - // printf("DEBUG vendor : %s ", nGVendor); - - id = env->GetFieldID(canvasCls, "nativeGraphicsRenderer", "Ljava/lang/String;"); - // char *nGRenderer = driverInfo->adapterIdentifier.Description; - char *nGRenderer = deviceInfo->deviceRenderer; - env->SetObjectField(obj, id, env->NewStringUTF(nGRenderer)); - - - } -} - - - - -VOID D3dCtx::createVertexBuffer() -{ - if (srcVertexBuffer != NULL) { - // Each pDevice has its own vertex buffer, - // so if different pDevice create vertex buffer has to - // recreate again. - srcVertexBuffer->Release(); - } - - if (dstVertexBuffer != NULL) { - dstVertexBuffer->Release(); - } - DWORD usage_D3DVERTEX = D3DUSAGE_DONOTCLIP| - D3DUSAGE_WRITEONLY| - D3DUSAGE_SOFTWAREPROCESSING; - - DWORD usage_D3DTLVERTEX= D3DUSAGE_DONOTCLIP| - D3DUSAGE_SOFTWAREPROCESSING; - -//# if NVIDIA_DEBUG - if(deviceInfo->isHardwareTnL) - { - // remove SoftwareProcessing - usage_D3DVERTEX = D3DUSAGE_DONOTCLIP| - D3DUSAGE_WRITEONLY; - - usage_D3DTLVERTEX = D3DUSAGE_DONOTCLIP; - } -// # endif - - HRESULT hr = - pDevice->CreateVertexBuffer(sizeof(D3DVERTEX), - usage_D3DVERTEX, - D3DFVF_XYZ, - D3DPOOL_MANAGED, - &srcVertexBuffer, - NULL); - - if (FAILED(hr)) { - printf("\n[Java3D] Failed to create VertexBuffer (D3DVERTEX)\n"); - error(CREATEVERTEXBUFFER, hr); - - } - - hr = pDevice->CreateVertexBuffer(sizeof(D3DTLVERTEX), - usage_D3DTLVERTEX, - D3DFVF_XYZRHW|D3DFVF_TEX1, - D3DPOOL_MANAGED, - &dstVertexBuffer,NULL); - if (FAILED(hr)) { - printf("\n[Java3D] Warning: Failed to create VertexBuffer (D3DTLVERTEX)\n"); - error(CREATEVERTEXBUFFER, hr); - } -} - - -VOID D3dCtx::transform(D3DVERTEX *worldCoord, D3DTLVERTEX *screenCoord) { - D3DVERTEX *pv; - D3DTLVERTEX *tlpv; - HRESULT hr; - - if (srcVertexBuffer != NULL) { - // Need to disable Texture state, otherwise - // ProcessVertices() will fail with debug message : - // - // "Number of output texture coordintes and their format should - // be the same in the destination vertex buffer and as - // computed for current D3D settings." - // - // when multiple texture is used. - DWORD texState; - // save original texture state - pDevice->GetTextureStageState(0, D3DTSS_COLOROP, &texState); - // disable texture processing - pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); - - if (!softwareVertexProcessing) { - // ProcessVertices() only work in software vertex - // processing mode - //pDevice->SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, TRUE); - pDevice->SetSoftwareVertexProcessing(TRUE); - } - - pDevice->SetRenderState(D3DRS_CLIPPING, FALSE); - hr = srcVertexBuffer->Lock(0, 0, (VOID **)&pv, 0); - if (FAILED(hr)) { - if (debug) { - printf("[Java3D] Fail to lock buffer %s\n", DXGetErrorString9(hr)); - } - } else { - pv[0].x = worldCoord->x; - pv[0].y = worldCoord->y; - pv[0].z = worldCoord->z; - - srcVertexBuffer->Unlock(); - pDevice->SetStreamSource(0, srcVertexBuffer,0, sizeof(D3DVERTEX)); - - //pDevice->SetVertexShader(D3DFVF_XYZ); - pDevice->SetVertexShader(NULL); - pDevice->SetFVF(D3DFVF_XYZ); - - hr = pDevice->ProcessVertices(0, 0, 1, - dstVertexBuffer, - NULL, - 0); - - if (FAILED(hr)) { - if (debug) { - printf("[Java3D] Fail to processVertices %s\n", DXGetErrorString9(hr)); - } - } else { - hr = dstVertexBuffer->Lock(0, 0, (VOID **)&tlpv, D3DLOCK_READONLY); - if (SUCCEEDED(hr)) { - screenCoord->sx = tlpv[0].sx; - screenCoord->sy = tlpv[0].sy; - screenCoord->sz = tlpv[0].sz; - screenCoord->rhw = tlpv[0].rhw; - dstVertexBuffer->Unlock(); - } else { - if (debug) { - error("Fail to lock surface in transform", hr); - } - } - } - } - pDevice->SetRenderState(D3DRS_CLIPPING, TRUE); - if (!softwareVertexProcessing) { - //pDevice->SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, FALSE); - pDevice->SetSoftwareVertexProcessing(FALSE); - } - // restore original texture state - pDevice->SetTextureStageState(0, D3DTSS_COLOROP, texState); - } -} - - - -VOID D3dCtx::getScreenRect(HWND hwnd, RECT *rect) { - - GetWindowRect(hwnd, rect); - - if ((deviceInfo->isHardware) && - (numDriver > 1)) { - - MONITORINFO info; - HMONITOR hMonitor = driverInfo->hMonitor; - - info.cbSize = sizeof(MONITORINFO); - if (hMonitor == NULL) { - hMonitor = MonitorFromWindow(hwnd, - MONITOR_DEFAULTTONEAREST); - } - GetMonitorInfo(hMonitor, &info); - monitorLeft = info.rcMonitor.left; - monitorTop = info.rcMonitor.top; - rect->left -= monitorLeft; - rect->right -= monitorLeft; - rect->top -= monitorTop; - rect->bottom -= monitorTop; - } else { - monitorLeft = 0; - monitorTop = 0; - } -} - -/* - * Search the monitor that this window competely enclosed. - * Return NULL if this window intersect several monitor - */ - -HMONITOR D3dCtx::findMonitor() -{ - - if ((osvi.dwMajorVersion < 4) || - (numDriver < 2)) { - return NULL; - } - - RECT rect; - MONITORINFO info; - HMONITOR hmonitor = MonitorFromWindow(hwnd, - MONITOR_DEFAULTTONEAREST); - info.cbSize = sizeof(MONITORINFO); - GetMonitorInfo(hmonitor, &info); - GetWindowRect(hwnd, &rect); - - if ((info.rcMonitor.left <= rect.left) && - (info.rcMonitor.right >= rect.right) && - (info.rcMonitor.top <= rect.top) && - (info.rcMonitor.bottom >= rect.bottom)) { - if (info.dwFlags & MONITORINFOF_PRIMARY) { - // Pass NULL is same as passing the guid of the - // first monitor. This can avoid recreate when - // window drag between screen borders from first - // screen. - return NULL; - } else { - return hmonitor; - } - } - return NULL; -} - - -D3dDeviceInfo* D3dCtx::setDeviceInfo(D3dDriverInfo *driverInfo, - BOOL *bFullScreen, - int minZDepth, - int minZDepthStencil) -{ - if (requiredDeviceID >= 0) - { - return selectDevice(requiredDeviceID, - driverInfo, - bFullScreen, - minZDepth, - minZDepthStencil); - } - else - { - return selectBestDevice(driverInfo, - bFullScreen, - minZDepth, - minZDepthStencil); - } -} - -// Find the adapter that this window belongs to -// and set driverInfo to this -VOID D3dCtx::setDriverInfo() -{ - D3dDriverInfo *newDriver = NULL; - - if (requiredDriverID <= 0) { - if ((numDriver < 2) || - (monitor == NULL) || - (osvi.dwMajorVersion < 4)) { - // windows 95 don't support multiple monitors - // Use Primary display driver - newDriver = d3dDriverList[0]; - } else { - for (int i=0; i < numDriver; i++) { - if (d3dDriverList[i]->hMonitor == monitor) { - newDriver = d3dDriverList[i]; - break; - } - } - } - } else { - if (requiredDriverID > numDriver) { - requiredDriverID = numDriver; - } - newDriver = d3dDriverList[requiredDriverID-1]; - } - - driverInfo = newDriver; -} - - -VOID D3dCtx::setDefaultAttributes() -{ - - /*pDevice->SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, - softwareVertexProcessing);*/ - pDevice->SetSoftwareVertexProcessing(softwareVertexProcessing); - - pDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, - D3DMCS_MATERIAL); - pDevice->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, - D3DMCS_MATERIAL); - pDevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE); - // Default specular is FALSE - pDevice->SetRenderState(D3DRS_SPECULARENABLE, TRUE); - // Texture & CULL mode default value for D3D is different from OGL - - pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); - - // Default in D3D is D3DCMP_LESSEQUAL, OGL is D3DCMP_LESS - - // Set Range based fog - pDevice->SetRenderState(D3DRS_RANGEFOGENABLE, - deviceInfo->rangeFogEnable); - - // disable antialiasing (default is true in D3D) - if (!implicitMultisample) { - pDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, FALSE); - } - - pointSize = 1; - cullMode = D3DCULL_CW; - fillMode = D3DFILL_SOLID; - zWriteEnable = TRUE; - zEnable = TRUE; - - if ((pDevice != NULL) && (bindTextureId != NULL)) { - for (int i=0; i < bindTextureIdLen; i++) { - pDevice->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_SELECTARG1); - pDevice->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE); - pDevice->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - pDevice->SetTextureStageState(i, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - //pDevice->SetTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); - //pDevice->SetTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); - bindTextureId[i] = -1; - } - } - - - for (int i=0; i < TEXSTAGESUPPORT; i++) { - texGenMode[i] = TEX_GEN_NONE; - texTransformSet[i] = false; - texCoordFormat[i] = 2; - texTransform[i] = identityMatrix; - texStride[i] = 0; - texTranslateSet[i] = false; - } -} - -VOID D3dCtx::enumDisplayMode(DEVMODE* dmode) -{ - - MONITORINFOEX mi; - - if (monitor == NULL) { - EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, dmode ); - } else { - mi.cbSize = sizeof(MONITORINFOEX); - GetMonitorInfo(monitor, (MONITORINFOEX *) &mi); - dmode->dmSize = sizeof(DEVMODE); - EnumDisplaySettings( mi.szDevice, ENUM_CURRENT_SETTINGS, dmode); - } -} -// check what kind of Vertex processing will be used -DWORD D3dCtx::findBehavior() -{ - bForceHwdVertexProcess = getSystemProperty(jniEnv,"j3d.d3dVertexProcess","hardware"); - bForceMixVertexProcess = getSystemProperty(jniEnv,"j3d.d3dVertexProcess","mixed"); - bForceSWVertexProcess = getSystemProperty(jniEnv,"j3d.d3dVertexProcess","software"); - - bUseNvPerfHUD = getSystemProperty(jniEnv,"j3d.useNvPerfHUD","true"); - - //Issue #560 - use D3DCREATE_FPU_PRESERV - //This is just way to disable it, as FPUPreserv is enabled by default - boolean useD3D_FPU_PRESERV = !(getSystemProperty(jniEnv,"j3d.d3dFPUPreserv","false")); - - int behavior = 0; - - if(useD3D_FPU_PRESERV){ - behavior = D3DCREATE_FPU_PRESERVE; - }else{ - printf("\n[Java3D]: Disabled D3DCREATE_FPU_PRESERVE \n"); - } - - - - if (bUseNvPerfHUD) // must have bForceHwdVertexProcess as true - { - printf("\n[Java3D]: using j3d.useNvPerfHUD=true and HARDWARE_VERTEXPROCESSING \n"); - bForceHwdVertexProcess = true; - bForceMixVertexProcess = false; - bForceSWVertexProcess = false; - } - - if (bForceHwdVertexProcess) - { - softwareVertexProcessing = FALSE; - printf("\n[Java3D]: using d3dVertexProcess=hardware\n"); - return D3DCREATE_HARDWARE_VERTEXPROCESSING | behavior; - } - - if (bForceMixVertexProcess) - { - printf("\n[Java3D]: using d3dVertexProcess=mixed\n"); - softwareVertexProcessing = FALSE; - return D3DCREATE_MIXED_VERTEXPROCESSING | behavior; - } - - if (bForceSWVertexProcess) - { - printf("\n[Java3D]: using d3dVertexProcess=software\n"); - softwareVertexProcessing = TRUE; - return D3DCREATE_SOFTWARE_VERTEXPROCESSING | behavior; - } - - // Issue #629 - Intel vcards must use Software Vertex Processing - if(!bForceHwdVertexProcess && !bForceMixVertexProcess && deviceInfo->vendorID == 0x8086 ){ - softwareVertexProcessing = TRUE; - return D3DCREATE_SOFTWARE_VERTEXPROCESSING | behavior; - } - - - // below is the default path. - // Rule : Shader capable videocards uses Hardware - // Low end devices (No shaders support) uses Software - // Middle end devices (TnL but no Shader) uses Mixed - - // high-end video cards: NV25 and above - if (deviceInfo->isHardwareTnL && deviceInfo->supportShaders11 && - ((requiredDeviceID < 0) || (requiredDeviceID == DEVICE_HAL_TnL))) - { - if (debug){printf("\n[Java3D]: using hardware Vertex Processing.\n");} - softwareVertexProcessing = FALSE; - return D3DCREATE_HARDWARE_VERTEXPROCESSING | behavior; - } - - // middle-end video cards - if (deviceInfo->isHardwareTnL && - ((requiredDeviceID < 0) || (requiredDeviceID == DEVICE_HAL_TnL))) - { - if (debug){printf("\n[Java3D]: using mixed Vertex Processing.\n");} - softwareVertexProcessing = FALSE; - return D3DCREATE_MIXED_VERTEXPROCESSING | behavior ; - } - else // low-end vcards use Software Vertex Processing - { - if (debug){printf("\n[Java3D]: using software Vertex Processing.\n");} - softwareVertexProcessing = TRUE; - return D3DCREATE_SOFTWARE_VERTEXPROCESSING | behavior; - } -} - -VOID D3dCtx::printInfo(D3DPRESENT_PARAMETERS *d3dPresent) -{ - - if (d3dPresent->Windowed) { - printf("Window "); - } else { - printf("FullScreen "); - } - - printf("%dx%d %s, handle=%p, MultiSampleType %s, SwapEffect %s, AutoDepthStencilFormat: %s\n", - d3dPresent->BackBufferWidth, - d3dPresent->BackBufferHeight, - getPixelFormatName(d3dPresent->BackBufferFormat), - d3dPresent->hDeviceWindow, - getMultiSampleName(d3dPresent->MultiSampleType), - getSwapEffectName(d3dPresent->SwapEffect), - getPixelFormatName(d3dPresent->AutoDepthStencilFormat)); -} - -VOID D3dCtx::setWindowMode() -{ - if (inToggle) { - if (!bFullScreen) { - SetWindowLong(topHwnd, GWL_STYLE, winStyle); - SetWindowPos(topHwnd, HWND_NOTOPMOST, savedTopRect.left, savedTopRect.top, - savedTopRect.right - savedTopRect.left, - savedTopRect.bottom - savedTopRect.top, - SWP_SHOWWINDOW); - } else { - SetWindowLong(topHwnd, GWL_STYLE, - WS_POPUP|WS_SYSMENU|WS_VISIBLE); - } - } - -} - -VOID D3dCtx::setAmbientLightMaterial() -{ - // We need to set a constant per vertex color - // There is no way in D3D to do this. It is workaround - // by adding Ambient light and set Ambient Material - // color temporary - pDevice->GetLight(0, &savedLight); - pDevice->GetMaterial(&savedMaterial); - pDevice->GetLightEnable(0, &savedLightEnable); - - CopyColor(ambientMaterial.Ambient, - currentColor_r, - currentColor_g, - currentColor_b, - currentColor_a); - - - // This is what the specification say it should set - ambientMaterial.Specular.a = currentColor_a; - - // This is what we found after testing - spec. is not correct - ambientMaterial.Diffuse.a = currentColor_a; - - pDevice->SetLight(0, &ambientLight); - pDevice->SetMaterial(&ambientMaterial); - pDevice->SetRenderState(D3DRS_LIGHTING, TRUE); - pDevice->LightEnable(0, TRUE); -} - -VOID D3dCtx::restoreDefaultLightMaterial() -{ - // restore original values after setAmbientLightMaterial() - pDevice->SetLight(0, &savedLight); - pDevice->SetMaterial(&savedMaterial); - pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); - pDevice->LightEnable(0, savedLightEnable); -} - -VOID D3dCtx::freeVBList(D3dVertexBufferVector *v) -{ - //LPD3DVERTEXBUFFER *p; - LPD3DVERTEXBUFFER r; - - lockGeometry(); - - for (ITER_LPD3DVERTEXBUFFER p = v->begin(); p != v->end(); ++p) { - // Remove itself from current ctx vertexBufferTable list - r = (*p)->next; - if (r != NULL) { - r->previous = (*p)->previous; - } - (*p)->previous->next = r; - // Now we can free current VB - delete (*p); - } - v->clear(); - unlockGeometry(); -} - - -VOID D3dCtx::freeResourceList(LPDIRECT3DRESOURCE9Vector *v) -{ - ITER_LPDIRECT3DRESOURCE9 s; - - lockSurfaceList(); - for (s = v->begin(); s != v->end(); ++s) { - (*s)->Release(); - } - v->clear(); - unlockSurfaceList(); -} - -VOID D3dCtx::freeList() -{ - if (useFreeList0) { - if (freeResourceList1.size() > 0) { - freeResourceList(&freeResourceList1); - } - if (freeVBList1.size() > 0) { - freeVBList(&freeVBList1); - } - useFreeList0 = false; - } else { - if (freeResourceList0.size() > 0) { - freeResourceList(&freeResourceList0); - } - if (freeVBList0.size() > 0) { - freeVBList(&freeVBList0); - } - useFreeList0 = true; - } -} - -VOID D3dCtx::freeVB(LPD3DVERTEXBUFFER vb) -{ - if (vb != NULL) { - lockSurfaceList(); - if (useFreeList0) { - freeVBList0.push_back(vb); - } else { - freeVBList1.push_back(vb); - } - unlockSurfaceList(); - } -} - - -VOID D3dCtx::freeResource(LPDIRECT3DRESOURCE9 res) -{ - if (res != NULL) { - lockSurfaceList(); - if (useFreeList0) { - freeResourceList0.push_back(res); - } else { - freeResourceList1.push_back(res); - } - unlockSurfaceList(); - } -} - -BOOL D3dCtx::createFrontBuffer() -{ - HRESULT hr; - - /*CreateImageSurface*/ - hr = pDevice->CreateOffscreenPlainSurface( - driverInfo->desktopMode.Width, - driverInfo->desktopMode.Height, - D3DFMT_A8R8G8B8, - D3DPOOL_SCRATCH, - &frontSurface, - NULL); - if (FAILED(hr)) { - if (debug) { - printf("[Java3D] Fail to CreateOffscreenPlainSurface %s\n", - DXGetErrorString9(hr)); - } - frontSurface = NULL; - return false; - } - return true; -} - -jboolean D3dCtx::getJavaBoolEnv(JNIEnv *env, char* envStr) -{ - - jclass cls; - jfieldID fieldID; - jobject obj; - - cls = env->FindClass( "javax/media/j3d/VirtualUniverse" ); - - if (cls == NULL) { - return JNI_FALSE; - } - - fieldID = (jfieldID) env->GetStaticFieldID( cls, "mc", - "Ljavax/media/j3d/MasterControl;"); - if (fieldID == NULL) { - return JNI_FALSE; - } - - obj = env->GetStaticObjectField( cls, fieldID); - - if (obj == NULL) { - return JNI_FALSE; - } - - cls = (jclass) env->FindClass("javax/media/j3d/MasterControl"); - - if (cls == NULL) { - return JNI_FALSE; - } - - fieldID = (jfieldID) env->GetFieldID( cls, envStr, "Z"); - - if (fieldID == NULL ) { - return JNI_FALSE; - } - - return env->GetBooleanField( obj, fieldID); - -} - -/** -// this routine is not safe using current D3D routines -VOID D3dCtx::getDXVersion(CHAR* strResult) -{ - HRESULT hr; - // TCHAR strResult[128]; - - DWORD dwDirectXVersion = 0; - TCHAR strDirectXVersion[10]; - - hr = GetDXVersion( &dwDirectXVersion, strDirectXVersion, 10 ); - if( SUCCEEDED(hr) ) - { - strcpy( strResult, "DirectX "); - if( dwDirectXVersion > 0 ) - - strcpy( strResult, strDirectXVersion ); - else - strcpy( strResult, "not installed") ); - } - else - { - strcpy( strResult, "Unknown version of DirectX installed"); - } - -} - **/ - - |