430N/A/*
3261N/A * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
430N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
430N/A *
430N/A * This code is free software; you can redistribute it and/or modify it
430N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
430N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
430N/A *
430N/A * This code is distributed in the hope that it will be useful, but WITHOUT
430N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
430N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
430N/A * version 2 for more details (a copy is included in the LICENSE file that
430N/A * accompanied this code).
430N/A *
430N/A * You should have received a copy of the GNU General Public License version
430N/A * 2 along with this work; if not, write to the Free Software Foundation,
430N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
430N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
430N/A */
430N/A
430N/A#include "D3DBadHardware.h"
430N/A#include "D3DPipelineManager.h"
430N/A#include "D3DRenderQueue.h"
430N/A#include "WindowsFlags.h"
430N/A#include "awt_Win32GraphicsDevice.h"
430N/A
430N/A// state of the adapter prior to initialization
430N/A#define CONTEXT_NOT_INITED 0
430N/A// this state is set if adapter initialization had failed
430N/A#define CONTEXT_INIT_FAILED (-1)
430N/A// this state is set if adapter was successfully created
430N/A#define CONTEXT_CREATED 1
430N/A
430N/Astatic BOOL bNoHwCheck = (getenv("J2D_D3D_NO_HWCHECK") != NULL);
430N/A
430N/AD3DPipelineManager *D3DPipelineManager::pMgr = NULL;
430N/A
2963N/A
430N/AD3DPipelineManager * D3DPipelineManager::CreateInstance(void)
430N/A{
430N/A if (!IsD3DEnabled() ||
430N/A FAILED((D3DPipelineManager::CheckOSVersion())) ||
430N/A FAILED((D3DPipelineManager::GDICheckForBadHardware())))
430N/A {
430N/A return NULL;
430N/A }
430N/A
430N/A if (pMgr == NULL) {
430N/A pMgr = new D3DPipelineManager();
430N/A if (FAILED(pMgr->InitD3D())) {
430N/A SAFE_DELETE(pMgr);
430N/A }
430N/A } else {
430N/A // this should never happen so to be on the safe side do not
430N/A // use this unexpected pointer, do not try to release it, just null
430N/A // it out and fail safely
430N/A J2dRlsTraceLn1(J2D_TRACE_ERROR,
430N/A "D3DPPLM::CreateInstance: unexpected instance: 0x%x,"\
430N/A " abort.", pMgr);
430N/A pMgr = NULL;
430N/A }
430N/A return pMgr;
430N/A}
430N/A
430N/Avoid D3DPipelineManager::DeleteInstance()
430N/A{
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::DeleteInstance()");
430N/A SAFE_DELETE(pMgr);
430N/A}
430N/A
430N/AD3DPipelineManager * D3DPipelineManager::GetInstance(void)
430N/A{
430N/A return pMgr;
430N/A}
430N/A
430N/AD3DPipelineManager::D3DPipelineManager(void)
430N/A{
430N/A pd3d9 = NULL;
430N/A hLibD3D9 = NULL;
430N/A pAdapters = NULL;
430N/A adapterCount = 0;
430N/A currentFSFocusAdapter = -1;
430N/A defaultFocusWindow = 0;
430N/A devType = SelectDeviceType();
430N/A}
430N/A
430N/AD3DPipelineManager::~D3DPipelineManager(void)
430N/A{
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::~D3DPipelineManager()");
430N/A ReleaseD3D();
430N/A}
430N/A
430N/AHRESULT D3DPipelineManager::ReleaseD3D(void)
430N/A{
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::ReleaseD3D()");
430N/A
430N/A ReleaseAdapters();
430N/A
430N/A SAFE_RELEASE(pd3d9);
430N/A
430N/A if (hLibD3D9 != NULL) {
430N/A ::FreeLibrary(hLibD3D9);
430N/A hLibD3D9 = NULL;
430N/A }
430N/A
430N/A return S_OK;
430N/A}
430N/A
430N/A// Creates a Direct3D9 object and initializes adapters.
430N/A// If succeeded, returns S_OK, otherwise returns the error code.
430N/AHRESULT D3DPipelineManager::InitD3D(void)
430N/A{
430N/A typedef IDirect3D9 * WINAPI FnDirect3DCreate9(UINT SDKVersion);
430N/A
4305N/A hLibD3D9 = JDK_LoadSystemLibrary("d3d9.dll");
430N/A if (hLibD3D9 == NULL) {
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR, "InitD3D: no d3d9.dll");
430N/A return E_FAIL;
430N/A }
430N/A
430N/A FnDirect3DCreate9 *d3dcreate9 = NULL;
430N/A d3dcreate9 = (FnDirect3DCreate9*)
430N/A ::GetProcAddress(hLibD3D9, "Direct3DCreate9");
430N/A if (d3dcreate9 == NULL) {
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR, "InitD3D: no Direct3DCreate9");
430N/A ::FreeLibrary(hLibD3D9);
430N/A return E_FAIL;
430N/A }
430N/A
430N/A pd3d9 = d3dcreate9(D3D_SDK_VERSION);
430N/A if (pd3d9 == NULL) {
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR,
430N/A "InitD3D: unable to create IDirect3D9 object");
430N/A ::FreeLibrary(hLibD3D9);
430N/A return E_FAIL;
430N/A }
430N/A
430N/A HRESULT res;
430N/A if (FAILED(res = InitAdapters())) {
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR, "InitD3D: failed to init adapters");
430N/A ReleaseD3D();
430N/A return res;
430N/A }
430N/A
430N/A return S_OK;
430N/A}
430N/A
430N/AHRESULT D3DPipelineManager::ReleaseAdapters()
430N/A{
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::ReleaseAdapters()");
430N/A
430N/A D3DRQ_ResetCurrentContextAndDestination();
430N/A if (pAdapters != NULL) {
430N/A for (UINT i = 0; i < adapterCount; i++) {
430N/A if (pAdapters[i].pd3dContext != NULL) {
430N/A delete pAdapters[i].pd3dContext;
430N/A }
430N/A }
430N/A delete[] pAdapters;
430N/A pAdapters = NULL;
430N/A }
430N/A if (defaultFocusWindow != 0) {
430N/A DestroyWindow(defaultFocusWindow);
430N/A UnregisterClass(L"D3DFocusWindow", GetModuleHandle(NULL));
430N/A defaultFocusWindow = 0;
430N/A }
430N/A currentFSFocusAdapter = -1;
430N/A return S_OK;
430N/A}
430N/A
430N/A// static
430N/Avoid D3DPipelineManager::NotifyAdapterEventListeners(UINT adapter,
430N/A jint eventType)
430N/A{
430N/A HMONITOR hMon;
430N/A int gdiScreen;
430N/A D3DPipelineManager *pMgr;
2963N/A
2963N/A // fix for 6946559: if d3d preloading fails jmv may be NULL
2963N/A if (jvm == NULL) {
2963N/A return;
2963N/A }
2963N/A
430N/A JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
4095N/A RETURN_IF_NULL(env);
430N/A
430N/A pMgr = D3DPipelineManager::GetInstance();
430N/A RETURN_IF_NULL(pMgr);
430N/A hMon = pMgr->pd3d9->GetAdapterMonitor(adapter);
4196N/A
4196N/A /*
4196N/A * If we don't have devices initialized yet, no sense to clear them.
4196N/A */
4196N/A if (!Devices::GetInstance()){
4196N/A return;
4196N/A }
4196N/A
862N/A gdiScreen = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(hMon);
430N/A
430N/A JNU_CallStaticMethodByName(env, NULL,
430N/A "sun/java2d/pipe/hw/AccelDeviceEventNotifier",
430N/A "eventOccured", "(II)V",
430N/A gdiScreen, eventType);
430N/A}
430N/A
430N/AUINT D3DPipelineManager::GetAdapterOrdinalForScreen(jint gdiScreen)
430N/A{
862N/A HMONITOR mHnd = AwtWin32GraphicsDevice::GetMonitor(gdiScreen);
862N/A if (mHnd == (HMONITOR)0) {
430N/A return D3DADAPTER_DEFAULT;
430N/A }
430N/A return GetAdapterOrdinalByHmon((HMONITOR)mHnd);
430N/A}
430N/A
430N/A// static
862N/AHRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pHMONITORs, UINT monNum)
430N/A{
430N/A HRESULT res = S_OK;
430N/A BOOL bResetD3D = FALSE, bFound;
430N/A
430N/A D3DPipelineManager *pMgr = D3DPipelineManager::GetInstance();
862N/A RETURN_STATUS_IF_NULL(pHMONITORs, E_FAIL);
430N/A if (pMgr == NULL) {
430N/A // NULL pMgr is valid when the pipeline is not enabled or if it hasn't
430N/A // been created yet
430N/A return S_OK;
430N/A }
430N/A RETURN_STATUS_IF_NULL(pMgr->pAdapters, E_FAIL);
430N/A RETURN_STATUS_IF_NULL(pMgr->pd3d9, E_FAIL);
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::HandleAdaptersChange");
430N/A
430N/A if (monNum != pMgr->adapterCount) {
430N/A J2dTraceLn2(J2D_TRACE_VERBOSE,
430N/A " number of adapters changed (old=%d, new=%d)",
430N/A pMgr->adapterCount, monNum);
430N/A bResetD3D = TRUE;
430N/A } else {
430N/A for (UINT i = 0; i < pMgr->adapterCount; i++) {
430N/A HMONITOR hMon = pMgr->pd3d9->GetAdapterMonitor(i);
430N/A if (hMon == (HMONITOR)0x0) {
430N/A J2dTraceLn1(J2D_TRACE_VERBOSE, " adapter %d: removed", i);
430N/A bResetD3D = TRUE;
430N/A break;
430N/A }
430N/A bFound = FALSE;
430N/A for (UINT mon = 0; mon < monNum; mon++) {
862N/A if (pHMONITORs[mon] == hMon) {
430N/A J2dTraceLn3(J2D_TRACE_VERBOSE,
430N/A " adapter %d: found hmnd[%d]=0x%x", i, mon, hMon);
430N/A bFound = TRUE;
430N/A break;
430N/A }
430N/A }
430N/A if (!bFound) {
430N/A J2dTraceLn2(J2D_TRACE_VERBOSE,
430N/A " adapter %d: could not find hmnd=0x%x "\
430N/A "in the list of new hmnds", i, hMon);
430N/A bResetD3D = TRUE;
430N/A break;
430N/A }
430N/A }
430N/A }
430N/A
430N/A if (bResetD3D) {
430N/A J2dTraceLn(J2D_TRACE_VERBOSE, " adapters changed: resetting d3d");
430N/A pMgr->ReleaseD3D();
430N/A res = pMgr->InitD3D();
430N/A }
430N/A return res;
430N/A}
430N/A
430N/AHRESULT D3DPipelineManager::HandleLostDevices()
430N/A{
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::HandleLostDevices()");
430N/A BOOL bAllClear = TRUE;
430N/A
430N/A HWND hwnd = GetCurrentFocusWindow();
430N/A if (hwnd != defaultFocusWindow) {
430N/A // we're in full-screen mode
430N/A WINDOWPLACEMENT wp;
430N/A ::ZeroMemory(&wp, sizeof(WINDOWPLACEMENT));
430N/A wp.length = sizeof(WINDOWPLACEMENT);
430N/A ::GetWindowPlacement(hwnd, &wp);
430N/A
430N/A // Only attempt to restore the devices if we're in full-screen mode
430N/A // and the fs window is active; sleep otherwise.
430N/A // Restoring a window while minimized causes problems on Vista:
430N/A // sometimes we restore the window too quickly and it pops up back from
430N/A // minimized state when the device is restored.
430N/A //
430N/A // WARNING: this is a sleep on the Toolkit thread! We may reconsider
430N/A // this if we find any issues later.
430N/A if ((wp.showCmd & SW_SHOWMINNOACTIVE) && !(wp.showCmd & SW_SHOWNORMAL)){
430N/A static DWORD prevCallTime = 0;
430N/A J2dTraceLn(J2D_TRACE_VERBOSE, " fs focus window is minimized");
430N/A DWORD currentTime = ::GetTickCount();
430N/A if ((currentTime - prevCallTime) < 100) {
430N/A J2dTraceLn(J2D_TRACE_VERBOSE, " tight loop detected, sleep");
430N/A ::Sleep(100);
430N/A }
430N/A prevCallTime = currentTime;
430N/A return D3DERR_DEVICELOST;
430N/A }
430N/A }
430N/A if (pAdapters != NULL) {
430N/A for (UINT i = 0; i < adapterCount; i++) {
430N/A if (pAdapters[i].pd3dContext != NULL) {
430N/A J2dTraceLn1(J2D_TRACE_VERBOSE,
430N/A " HandleLostDevices: checking adapter %d", i);
430N/A D3DContext *d3dc = pAdapters[i].pd3dContext;
430N/A if (FAILED(d3dc->CheckAndResetDevice())) {
430N/A bAllClear = FALSE;
430N/A }
430N/A }
430N/A }
430N/A }
430N/A return bAllClear ? S_OK : D3DERR_DEVICELOST;
430N/A}
430N/A
430N/AHRESULT D3DPipelineManager::InitAdapters()
430N/A{
430N/A HRESULT res = E_FAIL;
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::InitAdapters()");
430N/A if (pAdapters != NULL) {
430N/A ReleaseAdapters();
430N/A }
430N/A
430N/A adapterCount = pd3d9->GetAdapterCount();
430N/A pAdapters = new D3DAdapter[adapterCount];
430N/A if (pAdapters == NULL) {
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR, "InitAdapters: out of memory");
430N/A adapterCount = 0;
430N/A return E_FAIL;
430N/A }
430N/A ZeroMemory(pAdapters, adapterCount * sizeof(D3DAdapter));
430N/A
430N/A res = CheckAdaptersInfo();
430N/A RETURN_STATUS_IF_FAILED(res);
430N/A
430N/A currentFSFocusAdapter = -1;
430N/A if (CreateDefaultFocusWindow() == 0) {
430N/A return E_FAIL;
430N/A }
430N/A
430N/A return S_OK;
430N/A}
430N/A
430N/A// static
430N/AHRESULT
430N/AD3DPipelineManager::CheckOSVersion()
430N/A{
430N/A // require Windows XP or newer client-class OS
430N/A if (IS_WINVER_ATLEAST(5, 1) &&
3176N/A !D3DPPLM_OsVersionMatches(OS_WINSERV_2008R2|OS_WINSERV_2008|
3176N/A OS_WINSERV_2003))
430N/A {
430N/A J2dTraceLn(J2D_TRACE_INFO,
430N/A "D3DPPLM::CheckOSVersion: Windows XP or newer client-classs"\
430N/A " OS detected, passed");
430N/A return S_OK;
430N/A }
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR,
430N/A "D3DPPLM::CheckOSVersion: Windows 2000 or earlier (or a "\
430N/A "server) OS detected, failed");
430N/A if (bNoHwCheck) {
430N/A J2dRlsTraceLn(J2D_TRACE_WARNING,
430N/A " OS check overridden via J2D_D3D_NO_HWCHECK");
430N/A return S_OK;
430N/A }
430N/A return E_FAIL;
430N/A}
430N/A
430N/A// static
430N/AHRESULT
430N/AD3DPipelineManager::GDICheckForBadHardware()
430N/A{
862N/A DISPLAY_DEVICE dd;
862N/A dd.cb = sizeof(DISPLAY_DEVICE);
430N/A
430N/A int failedDevices = 0;
430N/A int attachedDevices = 0;
430N/A int i = 0;
430N/A WCHAR *id;
430N/A WCHAR vendorId[5];
430N/A WCHAR deviceId[5];
430N/A DWORD dwDId, dwVId;
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::GDICheckForBadHardware");
430N/A
430N/A // i<20 is to guard against buggy drivers
430N/A while (EnumDisplayDevices(NULL, i, &dd, 0) && i < 20) {
862N/A if (dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) {
430N/A attachedDevices++;
862N/A id = dd.DeviceID;
430N/A if (wcslen(id) > 21) {
430N/A // get vendor ID
430N/A wcsncpy(vendorId, id+8, 4);
430N/A int args1 = swscanf(vendorId, L"%X", &dwVId);
430N/A
430N/A // get device ID
430N/A wcsncpy(deviceId, id+17, 4);
430N/A int args2 = swscanf(deviceId, L"%X", &dwDId);
430N/A
430N/A if (args1 == 1 && args2 == 1) {
430N/A J2dTraceLn2(J2D_TRACE_VERBOSE,
430N/A " device: vendorID=0x%04x, deviceId=0x%04x",
430N/A dwVId, dwDId);
430N/A // since we don't have a driver version here we will
430N/A // just ask to ignore the version for now; bad hw
430N/A // entries with specific drivers information will be
430N/A // processed later when d3d is initialized and we can
430N/A // obtain a driver version
430N/A if (FAILED(CheckForBadHardware(dwVId, dwDId, MAX_VERSION))){
430N/A failedDevices++;
430N/A }
430N/A }
430N/A }
430N/A }
430N/A
430N/A i++;
430N/A }
430N/A
430N/A if (failedDevices == attachedDevices) {
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR,
430N/A "D3DPPLM::GDICheckForBadHardware: no suitable devices found");
430N/A return E_FAIL;
430N/A }
430N/A
430N/A return S_OK;
430N/A}
430N/A
430N/ABOOL D3DPPLM_OsVersionMatches(USHORT osInfo) {
430N/A static USHORT currentOS = OS_UNDEFINED;
430N/A
430N/A if (currentOS == OS_UNDEFINED) {
430N/A BOOL bVersOk;
430N/A OSVERSIONINFOEX osvi;
430N/A
430N/A ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
430N/A osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
430N/A
430N/A bVersOk = GetVersionEx((OSVERSIONINFO *) &osvi);
430N/A
430N/A J2dRlsTrace(J2D_TRACE_INFO, "[I] OS Version = ");
430N/A if (bVersOk && osvi.dwPlatformId == VER_PLATFORM_WIN32_NT &&
430N/A osvi.dwMajorVersion > 4)
430N/A {
3176N/A if (osvi.dwMajorVersion >= 6 && osvi.dwMinorVersion == 0) {
430N/A if (osvi.wProductType == VER_NT_WORKSTATION) {
3176N/A J2dRlsTrace(J2D_TRACE_INFO, "OS_VISTA\n");
430N/A currentOS = OS_VISTA;
430N/A } else {
3176N/A J2dRlsTrace(J2D_TRACE_INFO, "OS_WINSERV_2008\n");
430N/A currentOS = OS_WINSERV_2008;
430N/A }
3176N/A } else if (osvi.dwMajorVersion >= 6 && osvi.dwMinorVersion >= 1) {
3176N/A if (osvi.wProductType == VER_NT_WORKSTATION) {
3176N/A J2dRlsTrace(J2D_TRACE_INFO, "OS_WINDOWS7 or newer\n");
3176N/A currentOS = OS_WINDOWS7;
3176N/A } else {
3176N/A J2dRlsTrace(J2D_TRACE_INFO, "OS_WINSERV_2008R2 or newer\n");
3176N/A currentOS = OS_WINSERV_2008R2;
3176N/A }
430N/A } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
430N/A if (osvi.wProductType == VER_NT_WORKSTATION) {
430N/A J2dRlsTrace(J2D_TRACE_INFO, "OS_WINXP_64\n");
430N/A currentOS = OS_WINXP_64;
430N/A } else {
430N/A J2dRlsTrace(J2D_TRACE_INFO, "OS_WINSERV_2003\n");
430N/A currentOS = OS_WINSERV_2003;
430N/A }
430N/A } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) {
430N/A J2dRlsTrace(J2D_TRACE_INFO, "OS_WINXP ");
430N/A currentOS = OS_WINXP;
430N/A if (osvi.wSuiteMask & VER_SUITE_PERSONAL) {
430N/A J2dRlsTrace(J2D_TRACE_INFO, "Home\n");
430N/A } else {
430N/A J2dRlsTrace(J2D_TRACE_INFO, "Pro\n");
430N/A }
430N/A } else {
430N/A J2dRlsTrace2(J2D_TRACE_INFO,
430N/A "OS_UNKNOWN: dwMajorVersion=%d dwMinorVersion=%d\n",
430N/A osvi.dwMajorVersion, osvi.dwMinorVersion);
430N/A currentOS = OS_UNKNOWN;
430N/A }
430N/A } else {
430N/A if (bVersOk) {
430N/A J2dRlsTrace2(J2D_TRACE_INFO,
430N/A "OS_UNKNOWN: dwPlatformId=%d dwMajorVersion=%d\n",
430N/A osvi.dwPlatformId, osvi.dwMajorVersion);
430N/A } else {
430N/A J2dRlsTrace(J2D_TRACE_INFO,"OS_UNKNOWN: GetVersionEx failed\n");
430N/A }
430N/A currentOS = OS_UNKNOWN;
430N/A }
430N/A }
430N/A return (currentOS & osInfo);
430N/A}
430N/A
430N/A// static
430N/AHRESULT
430N/AD3DPipelineManager::CheckForBadHardware(DWORD vId, DWORD dId, LONGLONG version)
430N/A{
430N/A DWORD vendorId, deviceId;
430N/A UINT adapterInfo = 0;
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::CheckForBadHardware");
430N/A
430N/A while ((vendorId = badHardware[adapterInfo].VendorId) != 0x0000 &&
430N/A (deviceId = badHardware[adapterInfo].DeviceId) != 0x0000)
430N/A {
430N/A if (vendorId == vId && (deviceId == dId || deviceId == ALL_DEVICEIDS)) {
430N/A LONGLONG goodVersion = badHardware[adapterInfo].DriverVersion;
430N/A USHORT osInfo = badHardware[adapterInfo].OsInfo;
430N/A // the hardware check fails if:
430N/A // - we have an entry for this OS and
430N/A // - hardware is bad for all driver versions (NO_VERSION), or
430N/A // we have a driver version which is older than the
430N/A // minimum required for this OS
430N/A if (D3DPPLM_OsVersionMatches(osInfo) &&
430N/A (goodVersion == NO_VERSION || version < goodVersion))
430N/A {
430N/A J2dRlsTraceLn2(J2D_TRACE_ERROR,
430N/A "D3DPPLM::CheckForBadHardware: found matching "\
430N/A "hardware: VendorId=0x%04x DeviceId=0x%04x",
430N/A vendorId, deviceId);
430N/A if (goodVersion != NO_VERSION) {
430N/A // this was a match by the driver version
430N/A LARGE_INTEGER li;
430N/A li.QuadPart = goodVersion;
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR,
430N/A " bad driver found, device disabled");
430N/A J2dRlsTraceLn4(J2D_TRACE_ERROR,
430N/A " update your driver to at "\
430N/A "least version %d.%d.%d.%d",
430N/A HIWORD(li.HighPart), LOWORD(li.HighPart),
430N/A HIWORD(li.LowPart), LOWORD(li.LowPart));
430N/A } else {
430N/A // this was a match by the device (no good driver for this
430N/A // device)
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR,
430N/A "D3DPPLM::CheckForBadHardware: bad hardware "\
430N/A "found, device disabled");
430N/A }
430N/A if (!bNoHwCheck) {
430N/A return D3DERR_INVALIDDEVICE;
430N/A }
430N/A J2dRlsTraceLn(J2D_TRACE_WARNING, " Warning: hw/driver match "\
430N/A "overridden (via J2D_D3D_NO_HWCHECK)");
430N/A }
430N/A }
430N/A adapterInfo++;
430N/A }
430N/A
430N/A return S_OK;
430N/A}
430N/A
430N/AHRESULT D3DPipelineManager::CheckAdaptersInfo()
430N/A{
430N/A D3DADAPTER_IDENTIFIER9 aid;
430N/A UINT failedAdaptersCount = 0;
430N/A
430N/A J2dRlsTraceLn(J2D_TRACE_INFO, "CheckAdaptersInfo");
430N/A J2dRlsTraceLn(J2D_TRACE_INFO, "------------------");
430N/A for (UINT Adapter = 0; Adapter < adapterCount; Adapter++) {
430N/A
430N/A if (FAILED(pd3d9->GetAdapterIdentifier(Adapter, 0, &aid))) {
430N/A pAdapters[Adapter].state = CONTEXT_INIT_FAILED;
430N/A failedAdaptersCount++;
430N/A continue;
430N/A }
430N/A
430N/A J2dRlsTraceLn1(J2D_TRACE_INFO, "Adapter Ordinal : %d", Adapter);
430N/A J2dRlsTraceLn1(J2D_TRACE_INFO, "Adapter Handle : 0x%x",
430N/A pd3d9->GetAdapterMonitor(Adapter));
430N/A J2dRlsTraceLn1(J2D_TRACE_INFO, "Description : %s",
430N/A aid.Description);
430N/A J2dRlsTraceLn2(J2D_TRACE_INFO, "GDI Name, Driver : %s, %s",
430N/A aid.DeviceName, aid.Driver);
430N/A J2dRlsTraceLn1(J2D_TRACE_INFO, "Vendor Id : 0x%04x",
430N/A aid.VendorId);
430N/A J2dRlsTraceLn1(J2D_TRACE_INFO, "Device Id : 0x%04x",
430N/A aid.DeviceId);
430N/A J2dRlsTraceLn1(J2D_TRACE_INFO, "SubSys Id : 0x%x",
430N/A aid.SubSysId);
430N/A J2dRlsTraceLn4(J2D_TRACE_INFO, "Driver Version : %d.%d.%d.%d",
430N/A HIWORD(aid.DriverVersion.HighPart),
430N/A LOWORD(aid.DriverVersion.HighPart),
430N/A HIWORD(aid.DriverVersion.LowPart),
430N/A LOWORD(aid.DriverVersion.LowPart));
430N/A J2dRlsTrace3(J2D_TRACE_INFO,
430N/A "[I] GUID : {%08X-%04X-%04X-",
430N/A aid.DeviceIdentifier.Data1,
430N/A aid.DeviceIdentifier.Data2,
430N/A aid.DeviceIdentifier.Data3);
430N/A J2dRlsTrace4(J2D_TRACE_INFO, "%02X%02X-%02X%02X",
430N/A aid.DeviceIdentifier.Data4[0],
430N/A aid.DeviceIdentifier.Data4[1],
430N/A aid.DeviceIdentifier.Data4[2],
430N/A aid.DeviceIdentifier.Data4[3]);
430N/A J2dRlsTrace4(J2D_TRACE_INFO, "%02X%02X%02X%02X}\n",
430N/A aid.DeviceIdentifier.Data4[4],
430N/A aid.DeviceIdentifier.Data4[5],
430N/A aid.DeviceIdentifier.Data4[6],
430N/A aid.DeviceIdentifier.Data4[7]);
430N/A
430N/A if (FAILED(CheckForBadHardware(aid.VendorId, aid.DeviceId,
430N/A aid.DriverVersion.QuadPart)) ||
430N/A FAILED(CheckDeviceCaps(Adapter)) ||
430N/A FAILED(D3DEnabledOnAdapter(Adapter)))
430N/A {
430N/A pAdapters[Adapter].state = CONTEXT_INIT_FAILED;
430N/A failedAdaptersCount++;
430N/A }
430N/A J2dRlsTraceLn(J2D_TRACE_INFO, "------------------");
430N/A }
430N/A
430N/A if (failedAdaptersCount == adapterCount) {
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR,
430N/A "D3DPPLM::CheckAdaptersInfo: no suitable adapters found");
430N/A return E_FAIL;
430N/A }
430N/A
430N/A return S_OK;
430N/A}
430N/A
430N/AD3DDEVTYPE D3DPipelineManager::SelectDeviceType()
430N/A{
430N/A char *pRas = getenv("J2D_D3D_RASTERIZER");
430N/A D3DDEVTYPE dtype = D3DDEVTYPE_HAL;
430N/A if (pRas != NULL) {
430N/A J2dRlsTrace(J2D_TRACE_WARNING, "[W] D3DPPLM::SelectDeviceType: ");
430N/A if (strncmp(pRas, "ref", 3) == 0 || strncmp(pRas, "rgb", 3) == 0) {
430N/A J2dRlsTrace(J2D_TRACE_WARNING, "ref rasterizer selected");
430N/A dtype = D3DDEVTYPE_REF;
430N/A } else if (strncmp(pRas, "hal",3) == 0 || strncmp(pRas, "tnl",3) == 0) {
430N/A J2dRlsTrace(J2D_TRACE_WARNING, "hal rasterizer selected");
430N/A dtype = D3DDEVTYPE_HAL;
430N/A } else if (strncmp(pRas, "nul", 3) == 0) {
430N/A J2dRlsTrace(J2D_TRACE_WARNING, "nullref rasterizer selected");
430N/A dtype = D3DDEVTYPE_NULLREF;
430N/A } else {
430N/A J2dRlsTrace1(J2D_TRACE_WARNING,
430N/A "unknown rasterizer: %s, only (ref|hal|nul) "\
430N/A "supported, hal selected instead", pRas);
430N/A }
430N/A J2dRlsTrace(J2D_TRACE_WARNING, "\n");
430N/A }
430N/A return dtype;
430N/A}
430N/A
430N/A#define CHECK_CAP(FLAG, CAP) \
430N/A do { \
430N/A if (!((FLAG)&CAP)) { \
430N/A J2dRlsTraceLn2(J2D_TRACE_ERROR, \
430N/A "D3DPPLM::CheckDeviceCaps: adapter %d: Failed "\
430N/A "(cap %s not supported)", \
430N/A adapter, #CAP); \
430N/A return E_FAIL; \
430N/A } \
430N/A } while (0)
430N/A
430N/AHRESULT D3DPipelineManager::CheckDeviceCaps(UINT adapter)
430N/A{
430N/A HRESULT res;
430N/A D3DCAPS9 d3dCaps;
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::CheckDeviceCaps");
430N/A
430N/A res = pd3d9->GetDeviceCaps(adapter, devType, &d3dCaps);
430N/A RETURN_STATUS_IF_FAILED(res);
430N/A
430N/A CHECK_CAP(d3dCaps.DevCaps, D3DDEVCAPS_DRAWPRIMTLVERTEX);
430N/A
430N/A // by requiring hardware tnl we are hoping for better drivers quality
430N/A if (!IsD3DForced()) {
430N/A // fail if not hw tnl unless d3d was forced
430N/A CHECK_CAP(d3dCaps.DevCaps, D3DDEVCAPS_HWTRANSFORMANDLIGHT);
430N/A }
430N/A if (d3dCaps.DeviceType == D3DDEVTYPE_HAL) {
430N/A CHECK_CAP(d3dCaps.DevCaps, D3DDEVCAPS_HWRASTERIZATION);
430N/A }
430N/A
430N/A CHECK_CAP(d3dCaps.RasterCaps, D3DPRASTERCAPS_SCISSORTEST);
430N/A
430N/A CHECK_CAP(d3dCaps.Caps3, D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD);
430N/A
430N/A CHECK_CAP(d3dCaps.PrimitiveMiscCaps, D3DPMISCCAPS_CULLNONE);
430N/A CHECK_CAP(d3dCaps.PrimitiveMiscCaps, D3DPMISCCAPS_BLENDOP);
430N/A CHECK_CAP(d3dCaps.PrimitiveMiscCaps, D3DPMISCCAPS_MASKZ);
430N/A
430N/A CHECK_CAP(d3dCaps.ZCmpCaps, D3DPCMPCAPS_ALWAYS);
430N/A CHECK_CAP(d3dCaps.ZCmpCaps, D3DPCMPCAPS_LESS);
430N/A
430N/A CHECK_CAP(d3dCaps.SrcBlendCaps, D3DPBLENDCAPS_ZERO);
430N/A CHECK_CAP(d3dCaps.SrcBlendCaps, D3DPBLENDCAPS_ONE);
430N/A CHECK_CAP(d3dCaps.SrcBlendCaps, D3DPBLENDCAPS_SRCALPHA);
430N/A CHECK_CAP(d3dCaps.SrcBlendCaps, D3DPBLENDCAPS_DESTALPHA);
430N/A CHECK_CAP(d3dCaps.SrcBlendCaps, D3DPBLENDCAPS_INVSRCALPHA);
430N/A CHECK_CAP(d3dCaps.SrcBlendCaps, D3DPBLENDCAPS_INVDESTALPHA);
430N/A
430N/A CHECK_CAP(d3dCaps.DestBlendCaps, D3DPBLENDCAPS_ZERO);
430N/A CHECK_CAP(d3dCaps.DestBlendCaps, D3DPBLENDCAPS_ONE);
430N/A CHECK_CAP(d3dCaps.DestBlendCaps, D3DPBLENDCAPS_SRCALPHA);
430N/A CHECK_CAP(d3dCaps.DestBlendCaps, D3DPBLENDCAPS_DESTALPHA);
430N/A CHECK_CAP(d3dCaps.DestBlendCaps, D3DPBLENDCAPS_INVSRCALPHA);
430N/A CHECK_CAP(d3dCaps.DestBlendCaps, D3DPBLENDCAPS_INVDESTALPHA);
430N/A
430N/A CHECK_CAP(d3dCaps.TextureAddressCaps, D3DPTADDRESSCAPS_CLAMP);
430N/A CHECK_CAP(d3dCaps.TextureAddressCaps, D3DPTADDRESSCAPS_WRAP);
430N/A
430N/A CHECK_CAP(d3dCaps.TextureOpCaps, D3DTEXOPCAPS_MODULATE);
430N/A
430N/A if (d3dCaps.PixelShaderVersion < D3DPS_VERSION(2,0) && !IsD3DForced()) {
430N/A J2dRlsTraceLn1(J2D_TRACE_ERROR,
430N/A "D3DPPLM::CheckDeviceCaps: adapter %d: Failed "\
430N/A "(pixel shaders 2.0 required)", adapter);
430N/A return E_FAIL;
430N/A }
430N/A
430N/A J2dRlsTraceLn1(J2D_TRACE_INFO,
430N/A "D3DPPLM::CheckDeviceCaps: adapter %d: Passed", adapter);
430N/A return S_OK;
430N/A}
430N/A
430N/A
430N/AHRESULT D3DPipelineManager::D3DEnabledOnAdapter(UINT adapter)
430N/A{
430N/A HRESULT res;
430N/A D3DDISPLAYMODE dm;
430N/A
430N/A res = pd3d9->GetAdapterDisplayMode(adapter, &dm);
430N/A RETURN_STATUS_IF_FAILED(res);
430N/A
430N/A res = pd3d9->CheckDeviceType(adapter, devType, dm.Format, dm.Format, TRUE);
430N/A if (FAILED(res)) {
430N/A J2dRlsTraceLn1(J2D_TRACE_ERROR,
430N/A "D3DPPLM::D3DEnabledOnAdapter: no " \
430N/A "suitable d3d device on adapter %d", adapter);
430N/A }
430N/A
430N/A return res;
430N/A}
430N/A
430N/AUINT D3DPipelineManager::GetAdapterOrdinalByHmon(HMONITOR hMon)
430N/A{
430N/A UINT ret = D3DADAPTER_DEFAULT;
430N/A
430N/A if (pd3d9 != NULL) {
430N/A UINT adapterCount = pd3d9->GetAdapterCount();
430N/A for (UINT adapter = 0; adapter < adapterCount; adapter++) {
430N/A HMONITOR hm = pd3d9->GetAdapterMonitor(adapter);
430N/A if (hm == hMon) {
430N/A ret = adapter;
430N/A break;
430N/A }
430N/A }
430N/A }
430N/A return ret;
430N/A}
430N/A
430N/AD3DFORMAT
430N/AD3DPipelineManager::GetMatchingDepthStencilFormat(UINT adapterOrdinal,
430N/A D3DFORMAT adapterFormat,
430N/A D3DFORMAT renderTargetFormat)
430N/A{
430N/A static D3DFORMAT formats[] =
430N/A { D3DFMT_D16, D3DFMT_D32, D3DFMT_D24S8, D3DFMT_D24X8 };
430N/A D3DFORMAT newFormat = D3DFMT_UNKNOWN;
430N/A HRESULT res;
430N/A for (int i = 0; i < 4; i++) {
430N/A res = pd3d9->CheckDeviceFormat(adapterOrdinal,
430N/A devType, adapterFormat, D3DUSAGE_DEPTHSTENCIL,
430N/A D3DRTYPE_SURFACE, formats[i]);
430N/A if (FAILED(res)) continue;
430N/A
430N/A res = pd3d9->CheckDepthStencilMatch(adapterOrdinal,
430N/A devType, adapterFormat, renderTargetFormat, formats[i]);
430N/A if (FAILED(res)) continue;
430N/A newFormat = formats[i];
430N/A break;
430N/A }
430N/A return newFormat;
430N/A}
430N/A
430N/AHWND D3DPipelineManager::CreateDefaultFocusWindow()
430N/A{
430N/A UINT adapterOrdinal = D3DADAPTER_DEFAULT;
430N/A
430N/A J2dTraceLn1(J2D_TRACE_INFO,
430N/A "D3DPPLM::CreateDefaultFocusWindow: adapter=%d",
430N/A adapterOrdinal);
430N/A
430N/A if (defaultFocusWindow != 0) {
430N/A J2dRlsTraceLn(J2D_TRACE_WARNING,
430N/A "D3DPPLM::CreateDefaultFocusWindow: "\
430N/A "existing default focus window!");
430N/A return defaultFocusWindow;
430N/A }
430N/A
430N/A WNDCLASS wc;
430N/A ZeroMemory(&wc, sizeof(WNDCLASS));
430N/A wc.hInstance = GetModuleHandle(NULL);
430N/A wc.lpfnWndProc = DefWindowProc;
430N/A wc.lpszClassName = L"D3DFocusWindow";
430N/A if (RegisterClass(&wc) == 0) {
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR,
430N/A "D3DPPLM::CreateDefaultFocusWindow: "\
430N/A "error registering window class");
430N/A return 0;
430N/A }
430N/A
430N/A MONITORINFO mi;
430N/A ZeroMemory(&mi, sizeof(MONITORINFO));
430N/A mi.cbSize = sizeof(MONITORINFO);
430N/A HMONITOR hMon = pd3d9->GetAdapterMonitor(adapterOrdinal);
862N/A if (hMon == 0 || !GetMonitorInfo(hMon, (LPMONITORINFO)&mi)) {
430N/A J2dRlsTraceLn1(J2D_TRACE_ERROR,
430N/A "D3DPPLM::CreateDefaultFocusWindow: "\
430N/A "error getting monitor info for adapter=%d", adapterOrdinal);
430N/A return 0;
430N/A }
430N/A
430N/A HWND hWnd = CreateWindow(L"D3DFocusWindow", L"D3DFocusWindow", 0,
430N/A mi.rcMonitor.left, mi.rcMonitor.top, 1, 1,
430N/A NULL, NULL, GetModuleHandle(NULL), NULL);
430N/A if (hWnd == 0) {
430N/A J2dRlsTraceLn(J2D_TRACE_ERROR,
430N/A "D3DPPLM::CreateDefaultFocusWindow: CreateWindow failed");
430N/A } else {
430N/A J2dTraceLn2(J2D_TRACE_INFO,
430N/A " Created default focus window %x for adapter %d",
430N/A hWnd, adapterOrdinal);
430N/A defaultFocusWindow = hWnd;
430N/A }
430N/A return hWnd;
430N/A}
430N/A
430N/AHWND D3DPipelineManager::GetCurrentFocusWindow()
430N/A{
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::GetCurrentFocusWindow");
430N/A if (currentFSFocusAdapter < 0) {
430N/A J2dTraceLn1(J2D_TRACE_VERBOSE,
430N/A " no fs windows, using default focus window=0x%x",
430N/A defaultFocusWindow);
430N/A return defaultFocusWindow;
430N/A }
430N/A J2dTraceLn1(J2D_TRACE_VERBOSE, " using fs window=0x%x",
430N/A pAdapters[currentFSFocusAdapter].fsFocusWindow);
430N/A return pAdapters[currentFSFocusAdapter].fsFocusWindow;
430N/A}
430N/A
430N/AHWND D3DPipelineManager::SetFSFocusWindow(UINT adapterOrdinal, HWND hWnd)
430N/A{
430N/A J2dTraceLn2(J2D_TRACE_INFO,"D3DPPLM::SetFSFocusWindow hwnd=0x%x adapter=%d",
430N/A hWnd, adapterOrdinal);
430N/A
430N/A HWND prev = pAdapters[adapterOrdinal].fsFocusWindow;
430N/A pAdapters[adapterOrdinal].fsFocusWindow = hWnd;
430N/A if (currentFSFocusAdapter < 0) {
430N/A J2dTraceLn(J2D_TRACE_VERBOSE, " first full-screen window");
430N/A // first fs window
430N/A currentFSFocusAdapter = adapterOrdinal;
430N/A // REMIND: we might want to reset the rest of the context here as well
430N/A // like we do when the an adapter exits fs mode; currently they will
430N/A // be reset sometime later
430N/A } else {
430N/A // there's already a fs window
430N/A if (currentFSFocusAdapter == adapterOrdinal) {
430N/A // it's current fs window => we're exiting fs mode on this adapter;
430N/A // look for a new fs focus window
430N/A if (hWnd == 0) {
430N/A UINT i;
430N/A currentFSFocusAdapter = -1;
430N/A for (i = 0; i < adapterCount; i++) {
430N/A if (pAdapters[i].fsFocusWindow != 0) {
430N/A J2dTraceLn1(J2D_TRACE_VERBOSE,
430N/A " adapter %d is still in fs mode", i);
430N/A currentFSFocusAdapter = i;
430N/A break;
430N/A }
430N/A }
430N/A // we have to reset all devices any time current focus device
430N/A // exits fs mode, and also to prevent some of them being left in
430N/A // a lost state when the last device exits fs - when non-last
430N/A // adapters exit fs mode they would not be able to create the
430N/A // device and will be put in a lost state forever
430N/A HRESULT res;
430N/A J2dTraceLn(J2D_TRACE_VERBOSE,
430N/A " adapter exited full-screen, reset all adapters");
430N/A for (i = 0; i < adapterCount; i++) {
430N/A if (pAdapters[i].pd3dContext != NULL) {
430N/A res = pAdapters[i].pd3dContext->ResetContext();
430N/A D3DRQ_MarkLostIfNeeded(res,
430N/A D3DRQ_GetCurrentDestination());
430N/A }
430N/A }
430N/A } else {
430N/A J2dTraceLn1(J2D_TRACE_WARNING,
430N/A "D3DPM::SetFSFocusWindow: setting the fs "\
430N/A "window again for adapter %d", adapterOrdinal);
430N/A }
430N/A }
430N/A }
430N/A return prev;
430N/A}
430N/A
430N/AHRESULT D3DPipelineManager::GetD3DContext(UINT adapterOrdinal,
430N/A D3DContext **ppd3dContext)
430N/A{
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DPPLM::GetD3DContext");
430N/A
430N/A HRESULT res = S_OK;
430N/A if (adapterOrdinal < 0 || adapterOrdinal >= adapterCount ||
430N/A pAdapters == NULL ||
430N/A pAdapters[adapterOrdinal].state == CONTEXT_INIT_FAILED)
430N/A {
430N/A J2dRlsTraceLn1(J2D_TRACE_ERROR,
430N/A "D3DPPLM::GetD3DContext: invalid parameters or "\
430N/A "failed init for adapter %d", adapterOrdinal);
430N/A *ppd3dContext = NULL;
430N/A return E_FAIL;
430N/A }
430N/A
430N/A if (pAdapters[adapterOrdinal].state == CONTEXT_NOT_INITED) {
430N/A D3DContext *pCtx = NULL;
430N/A
430N/A if (pAdapters[adapterOrdinal].pd3dContext != NULL) {
430N/A J2dTraceLn1(J2D_TRACE_ERROR, " non-null context in "\
430N/A "uninitialized adapter %d", adapterOrdinal);
430N/A res = E_FAIL;
430N/A } else {
430N/A J2dTraceLn1(J2D_TRACE_VERBOSE,
430N/A " initializing context for adapter %d",adapterOrdinal);
430N/A
430N/A if (SUCCEEDED(res = D3DEnabledOnAdapter(adapterOrdinal))) {
430N/A res = D3DContext::CreateInstance(pd3d9, adapterOrdinal, &pCtx);
430N/A if (FAILED(res)) {
430N/A J2dRlsTraceLn1(J2D_TRACE_ERROR,
430N/A "D3DPPLM::GetD3DContext: failed to create context "\
430N/A "for adapter=%d", adapterOrdinal);
430N/A }
430N/A } else {
430N/A J2dRlsTraceLn1(J2D_TRACE_ERROR,
430N/A "D3DPPLM::GetContext: no d3d on adapter %d",adapterOrdinal);
430N/A }
430N/A }
430N/A pAdapters[adapterOrdinal].state =
430N/A SUCCEEDED(res) ? CONTEXT_CREATED : CONTEXT_INIT_FAILED;
430N/A pAdapters[adapterOrdinal].pd3dContext = pCtx;
430N/A }
430N/A *ppd3dContext = pAdapters[adapterOrdinal].pd3dContext;
430N/A return res;
430N/A}
2963N/A
2963N/A
2963N/A//==============================================================
2963N/A// D3DInitializer
2963N/A//==============================================================
2963N/A
2963N/AD3DInitializer D3DInitializer::theInstance;
2963N/A
2963N/AD3DInitializer::D3DInitializer()
2963N/A : bComInitialized(false), pAdapterIniters(NULL)
2963N/A{
2963N/A}
2963N/A
2963N/AD3DInitializer::~D3DInitializer()
2963N/A{
2963N/A if (pAdapterIniters) {
2963N/A delete[] pAdapterIniters;
2963N/A }
2963N/A}
2963N/A
2963N/Avoid D3DInitializer::InitImpl()
2963N/A{
2963N/A J2dRlsTraceLn(J2D_TRACE_INFO, "D3DInitializer::InitImpl");
2963N/A if (SUCCEEDED(::CoInitialize(NULL))) {
2963N/A bComInitialized = true;
2963N/A }
2963N/A D3DPipelineManager *pMgr = D3DPipelineManager::CreateInstance();
2963N/A if (pMgr != NULL) {
3090N/A // init adapters if we are preloading
3090N/A if (AwtToolkit::GetInstance().GetPreloadThread().OnPreloadThread()) {
3090N/A UINT adapterCount = pMgr->adapterCount;
2963N/A
3090N/A pAdapterIniters = new D3DAdapterInitializer[adapterCount];
3090N/A for (UINT i=0; i<adapterCount; i++) {
3090N/A pAdapterIniters[i].setAdapter(i);
3090N/A AwtToolkit::GetInstance().GetPreloadThread().AddAction(&pAdapterIniters[i]);
3090N/A }
2963N/A }
2963N/A }
2963N/A}
2963N/A
2963N/Avoid D3DInitializer::CleanImpl(bool reInit)
2963N/A{
2963N/A J2dRlsTraceLn1(J2D_TRACE_INFO, "D3DInitializer::CleanImpl (%s)",
2963N/A reInit ? "RELAUNCH" : "normal");
2963N/A D3DPipelineManager::DeleteInstance();
2963N/A if (bComInitialized) {
2963N/A CoUninitialize();
2963N/A }
2963N/A}
2963N/A
2963N/A
2963N/Avoid D3DInitializer::D3DAdapterInitializer::InitImpl()
2963N/A{
2963N/A J2dRlsTraceLn1(J2D_TRACE_INFO, "D3DAdapterInitializer::InitImpl(%d) started", adapter);
2963N/A
2963N/A D3DPipelineManager *pMgr = D3DPipelineManager::GetInstance();
2963N/A if (pMgr == NULL) {
2963N/A return;
2963N/A }
2963N/A
2963N/A D3DContext *pd3dContext;
2963N/A pMgr->GetD3DContext(adapter, &pd3dContext);
2963N/A
2963N/A J2dRlsTraceLn1(J2D_TRACE_INFO, "D3DAdapterInitializer::InitImpl(%d) finished", adapter);
2963N/A}
2963N/A
2963N/Avoid D3DInitializer::D3DAdapterInitializer::CleanImpl(bool reInit)
2963N/A{
2963N/A // nothing to do - D3DPipelineManager cleans adapters
2963N/A}
2963N/A
2963N/A
2963N/Aextern "C" {
2963N/A/*
2963N/A * Export function to start D3D preloading
2963N/A * (called from java/javaw - see src/windows/bin/java-md.c)
2963N/A */
2963N/A__declspec(dllexport) int preloadD3D()
2963N/A{
2963N/A J2dRlsTraceLn(J2D_TRACE_INFO, "AWT warmup: preloadD3D");
2963N/A AwtToolkit::GetInstance().GetPreloadThread().AddAction(&D3DInitializer::GetInstance());
2963N/A return 1;
2963N/A}
2963N/A
2963N/A}
2963N/A