Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/windows/native/sun/java2d/d3d/D3DResourceManager.cpp
32288 views
/*1* Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425#include "D3DResourceManager.h"26#include "awt.h"27#include "D3DPaints.h"28#include "D3DTextRenderer.h"2930void31D3DResource::Init(IDirect3DResource9 *pRes, IDirect3DSwapChain9 *pSC)32{33J2dTraceLn(J2D_TRACE_INFO, "D3DResource::Init");3435pResource = NULL;36pSwapChain = pSC;37pSurface = NULL;38pTexture = NULL;39pOps = NULL;40ZeroMemory(&desc, sizeof(desc));41desc.Format = D3DFMT_UNKNOWN;4243if (pRes != NULL) {44pResource = pRes;4546D3DRESOURCETYPE type = pResource->GetType();47switch (type) {48case D3DRTYPE_TEXTURE:49// addRef is needed because both pResource and pTexture will be50// Release()d, and they point to the same object51pResource->AddRef();52pTexture = (IDirect3DTexture9*)pResource;53pTexture->GetSurfaceLevel(0, &pSurface);54break;55case D3DRTYPE_SURFACE:56pResource->AddRef();57pSurface = (IDirect3DSurface9*)pResource;58break;59case D3DRTYPE_CUBETEXTURE:60((IDirect3DCubeTexture9*)pResource)->GetLevelDesc(0, &desc);61break;62default:63J2dTraceLn1(J2D_TRACE_VERBOSE, " resource type=%d", type);64}65} else if (pSwapChain != NULL) {66pSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pSurface);67} else {68J2dTraceLn(J2D_TRACE_VERBOSE, " pResource == pSwapChain == NULL");69}7071if (pSurface != NULL) {72pSurface->GetDesc(&desc);73}7475SAFE_PRINTLN(pResource);76SAFE_PRINTLN(pSurface);77SAFE_PRINTLN(pTexture);78SAFE_PRINTLN(pSwapChain);79}8081D3DResource::~D3DResource()82{83Release();84}8586void87D3DResource::SetSDOps(D3DSDOps *pOps)88{89if (pOps != NULL && this->pOps != NULL) {90// something's wrong, we're overwriting91// a non-null field (setting it to null is allowed)92J2dTraceLn2(J2D_TRACE_WARNING,93"D3DResource::SetSDOps: overwriting "\94"this->pOps=0x%x with pOps=0x%x", this->pOps, pOps);95}96this->pOps = pOps;97}9899BOOL100D3DResource::IsDefaultPool()101{102if (desc.Format != D3DFMT_UNKNOWN) {103return (desc.Pool == D3DPOOL_DEFAULT);104}105return TRUE;106}107108void109D3DResource::Release()110{111J2dTraceLn(J2D_TRACE_INFO, "D3DResource::Release");112113SAFE_PRINTLN(pResource);114SAFE_PRINTLN(pSurface);115SAFE_PRINTLN(pTexture);116SAFE_PRINTLN(pSwapChain);117118SAFE_RELEASE(pSurface);119SAFE_RELEASE(pTexture);120SAFE_RELEASE(pResource);121SAFE_RELEASE(pSwapChain);122123if (pOps != NULL) {124// if sdOps is not NULL it means that the release was initiated125// from the native level, and is caused by a surface loss126D3DSD_MarkLost(pOps);127pOps->pResource = NULL;128pOps = NULL;129}130}131132HRESULT133D3DResourceManager::CreateInstance(D3DContext *pCtx,134D3DResourceManager** ppResourceMgr)135{136HRESULT res;137138J2dTraceLn(J2D_TRACE_INFO, "D3DRM::CreateInstance");139140*ppResourceMgr = new D3DResourceManager();141if (FAILED(res = (*ppResourceMgr)->Init(pCtx))) {142delete *ppResourceMgr;143*ppResourceMgr = NULL;144}145return res;146}147148D3DResourceManager::D3DResourceManager()149{150J2dTraceLn(J2D_TRACE_INFO, "D3DRM::D3DRM");151152this->pCtx = NULL;153this->pHead = NULL;154}155156HRESULT157D3DResourceManager::Init(D3DContext *pCtx)158{159J2dTraceLn1(J2D_TRACE_INFO, "D3DRM::Init pCtx=%x", pCtx);160if (this->pCtx != pCtx ||161(this->pCtx != NULL &&162this->pCtx->Get3DDevice() != pCtx->Get3DDevice()))163{164ReleaseAll();165}166this->pCtx = pCtx;167return S_OK;168}169170D3DResourceManager::~D3DResourceManager()171{172J2dTraceLn(J2D_TRACE_INFO, "D3DRM::~D3DRM");173ReleaseAll();174pCtx = NULL;175pHead = NULL;176}177178void179D3DResourceManager::ReleaseAll()180{181J2dTraceLn(J2D_TRACE_INFO, "D3DRM::ReleaseAll");182IManagedResource* pCurrent;183while (pHead != NULL) {184pCurrent = pHead;185pHead = pHead->pNext;186delete pCurrent;187}188pCachedDestTexture = NULL;189pBlitTexture = NULL;190pBlitRTTexture = NULL;191pBlitOSPSurface = NULL;192pGradientTexture = NULL;193pLookupOpLutTexture = NULL;194pMaskTexture = NULL;195pMultiGradientTexture = NULL;196pLockableRTSurface = NULL;197}198199void200D3DResourceManager::ReleaseDefPoolResources()201{202J2dTraceLn(J2D_TRACE_INFO, "D3DRM::ReleaseDefPoolResources");203// REMIND: for now, release all resources204ReleaseAll();205}206207HRESULT208D3DResourceManager::ReleaseResource(IManagedResource* pResource)209{210J2dTraceLn(J2D_TRACE_INFO, "D3DRM::ReleaseResource");211212if (pResource != NULL) {213J2dTraceLn1(J2D_TRACE_VERBOSE, " releasing pResource=%x", pResource);214if (pResource->pPrev != NULL) {215pResource->pPrev->pNext = pResource->pNext;216} else {217// it's the head218pHead = pResource->pNext;219if (pHead != NULL) {220pHead->pPrev = NULL;221}222}223if (pResource->pNext != NULL) {224pResource->pNext->pPrev = pResource->pPrev;225}226delete pResource;227}228return S_OK;229}230231HRESULT232D3DResourceManager::AddResource(IManagedResource* pResource)233{234HRESULT res = S_OK;235236J2dTraceLn(J2D_TRACE_INFO, "D3DRM::AddResource");237238if (pResource != NULL) {239J2dTraceLn1(J2D_TRACE_VERBOSE, " pResource=%x", pResource);240pResource->pPrev = NULL;241pResource->pNext = pHead;242if (pHead != NULL) {243pHead->pPrev = pResource;244}245pHead = pResource;246}247248return S_OK;249}250251HRESULT252D3DResourceManager::CreateTexture(UINT width, UINT height,253BOOL isRTT, BOOL isOpaque,254D3DFORMAT *pFormat, DWORD dwUsage,255D3DResource **ppTextureResource)256{257D3DPOOL pool;258D3DFORMAT format;259HRESULT res;260IDirect3DDevice9 *pd3dDevice;261262J2dTraceLn(J2D_TRACE_INFO, "D3DRM::CreateTexture");263J2dTraceLn4(J2D_TRACE_VERBOSE, " w=%d h=%d isRTT=%d isOpaque=%d",264width, height, isRTT, isOpaque);265266if (ppTextureResource == NULL || pCtx == NULL ||267(pd3dDevice = pCtx->Get3DDevice()) == NULL)268{269return E_FAIL;270}271if (FAILED(res = pd3dDevice->TestCooperativeLevel())) {272return res;273}274275if (pFormat != NULL && *pFormat != D3DFMT_UNKNOWN) {276format = *pFormat;277} else {278if (isOpaque) {279format = D3DFMT_X8R8G8B8;280} else {281format = D3DFMT_A8R8G8B8;282}283}284285if (isRTT) {286dwUsage = D3DUSAGE_RENDERTARGET;287pool = D3DPOOL_DEFAULT;288} else {289if (dwUsage == D3DUSAGE_DYNAMIC && !pCtx->IsDynamicTextureSupported()) {290dwUsage = 0;291}292if (dwUsage == D3DUSAGE_DYNAMIC) {293pool = D3DPOOL_DEFAULT;294} else {295pool = pCtx->IsHWRasterizer() ?296D3DPOOL_MANAGED : D3DPOOL_SYSTEMMEM;297}298}299300if (pCtx->IsPow2TexturesOnly()) {301UINT w, h;302for (w = 1; width > w; w <<= 1);303for (h = 1; height > h; h <<= 1);304width = w;305height = h;306}307if (pCtx->IsSquareTexturesOnly()) {308if (width > height) {309height = width;310} else {311width = height;312}313}314315IDirect3DTexture9 *pTexture = NULL;316res = pd3dDevice->CreateTexture(width, height, 1/*levels*/, dwUsage,317format, pool, &pTexture, 0);318if (SUCCEEDED(res)) {319J2dTraceLn1(J2D_TRACE_VERBOSE, " created texture: 0x%x", pTexture);320*ppTextureResource = new D3DResource((IDirect3DResource9*)pTexture);321res = AddResource(*ppTextureResource);322} else {323DebugPrintD3DError(res, "D3DRM::CreateTexture failed");324*ppTextureResource = NULL;325format = D3DFMT_UNKNOWN;326}327328if (pFormat != NULL) {329*pFormat = format;330}331332return res;333}334335HRESULT D3DResourceManager::CreateRTSurface(UINT width, UINT height,336BOOL isOpaque, BOOL isLockable,337D3DFORMAT *pFormat/*out*/,338D3DResource** ppSurfaceResource/*out*/)339{340HRESULT res;341IDirect3DDevice9 *pd3dDevice;342343J2dTraceLn(J2D_TRACE_INFO, "D3DRM::CreateRTSurface");344J2dTraceLn3(J2D_TRACE_VERBOSE, " w=%d h=%d isOpaque=%d",345width, height, isOpaque);346347if (pCtx == NULL || ppSurfaceResource == NULL ||348(pd3dDevice = pCtx->Get3DDevice()) == NULL)349{350return E_FAIL;351}352if (FAILED(res = pd3dDevice->TestCooperativeLevel())) {353return res;354}355356D3DPRESENT_PARAMETERS *curParams = pCtx->GetPresentationParams();357D3DFORMAT format = isOpaque ? curParams->BackBufferFormat : D3DFMT_A8R8G8B8;358IDirect3DSurface9 *pSurface = NULL;359360res = pd3dDevice->CreateRenderTarget(width, height, format,361D3DMULTISAMPLE_NONE, 0,362isLockable,363&pSurface, NULL);364if (SUCCEEDED(res)) {365J2dTraceLn1(J2D_TRACE_VERBOSE, " created RT Surface: 0x%x ", pSurface);366if (pFormat != NULL) {367*pFormat = format;368}369*ppSurfaceResource = new D3DResource((IDirect3DResource9*)pSurface);370res = AddResource(*ppSurfaceResource);371} else {372DebugPrintD3DError(res, "D3DRM::CreateRTSurface failed");373ppSurfaceResource = NULL;374}375return res;376}377378// REMIND: this method is currently unused; consider removing it later...379HRESULT D3DResourceManager::CreateOSPSurface(UINT width, UINT height,380D3DFORMAT fmt,381D3DResource** ppSurfaceResource/*out*/)382{383HRESULT res;384IDirect3DDevice9 *pd3dDevice;385386J2dTraceLn(J2D_TRACE_INFO, "D3DRM::CreateOSPSurface");387J2dTraceLn2(J2D_TRACE_VERBOSE, " w=%d h=%d", width, height);388389if (pCtx == NULL || ppSurfaceResource == NULL ||390(pd3dDevice = pCtx->Get3DDevice()) == NULL)391{392return E_FAIL;393}394if (FAILED(res = pd3dDevice->TestCooperativeLevel())) {395return res;396}397398// since the off-screen plain surface is intended to be used with399// the UpdateSurface() method, it is essential that it be created400// in the same format as the destination and allocated in the401// SYSTEMMEM pool (otherwise UpdateSurface() will fail)402D3DFORMAT format;403if (fmt == D3DFMT_UNKNOWN) {404format = pCtx->GetPresentationParams()->BackBufferFormat;405} else {406format = fmt;407}408D3DPOOL pool = D3DPOOL_SYSTEMMEM;409IDirect3DSurface9 *pSurface = NULL;410411res = pd3dDevice->CreateOffscreenPlainSurface(width, height,412format, pool,413&pSurface, NULL);414if (SUCCEEDED(res)) {415J2dTraceLn1(J2D_TRACE_VERBOSE, " created OSP Surface: 0x%x ",pSurface);416*ppSurfaceResource = new D3DResource((IDirect3DResource9*)pSurface);417res = AddResource(*ppSurfaceResource);418} else {419DebugPrintD3DError(res, "D3DRM::CreateOSPSurface failed");420ppSurfaceResource = NULL;421}422return res;423}424425HRESULT426D3DResourceManager::CreateSwapChain(HWND hWnd, UINT numBuffers,427UINT width, UINT height,428D3DSWAPEFFECT swapEffect,429UINT presentationInterval,430D3DResource ** ppSwapChainResource)431{432HRESULT res;433IDirect3DDevice9 *pd3dDevice;434IDirect3DSwapChain9 *pSwapChain = NULL;435D3DPRESENT_PARAMETERS newParams, *curParams;436437J2dTraceLn(J2D_TRACE_INFO, "D3DRM::CreateSwapChain");438J2dTraceLn4(J2D_TRACE_VERBOSE, " w=%d h=%d hwnd=%x numBuffers=%d",439width, height, hWnd, numBuffers);440441if (pCtx == NULL || ppSwapChainResource == NULL ||442(pd3dDevice = pCtx->Get3DDevice()) == NULL)443{444return E_FAIL;445}446RETURN_STATUS_IF_FAILED(res = pd3dDevice->TestCooperativeLevel());447448curParams = pCtx->GetPresentationParams();449450if (curParams->Windowed == FALSE) {451// there's a single swap chain in full-screen mode, use it if452// it fits our parameters, reset the device otherwise453if (curParams->BackBufferCount != numBuffers ||454curParams->SwapEffect != swapEffect ||455curParams->PresentationInterval != presentationInterval)456{457newParams = *curParams;458newParams.BackBufferCount = numBuffers;459newParams.SwapEffect = swapEffect;460newParams.PresentationInterval = presentationInterval;461462res = pCtx->ConfigureContext(&newParams);463RETURN_STATUS_IF_FAILED(res);464// this reset will not have released the device, so our pd3dDevice465// is still valid, but to be on a safe side, reset it466pd3dDevice = pCtx->Get3DDevice();467}468res = pd3dDevice->GetSwapChain(0, &pSwapChain);469} else {470ZeroMemory(&newParams, sizeof(D3DPRESENT_PARAMETERS));471newParams.BackBufferWidth = width;472newParams.BackBufferHeight = height;473newParams.hDeviceWindow = hWnd;474newParams.Windowed = TRUE;475newParams.BackBufferCount = numBuffers;476newParams.SwapEffect = swapEffect;477newParams.PresentationInterval = presentationInterval;478479res = pd3dDevice->CreateAdditionalSwapChain(&newParams, &pSwapChain);480}481482if (SUCCEEDED(res)) {483J2dTraceLn1(J2D_TRACE_VERBOSE," created swap chain: 0x%x ",pSwapChain);484*ppSwapChainResource = new D3DResource(pSwapChain);485res = AddResource(*ppSwapChainResource);486} else {487DebugPrintD3DError(res, "D3DRM::CreateSwapChain failed");488*ppSwapChainResource = NULL;489}490return res;491}492493HRESULT494D3DResourceManager::GetMaskTexture(D3DResource **ppTextureResource)495{496J2dTraceLn(J2D_TRACE_INFO, "D3DRM::GetMaskTexture");497498RETURN_STATUS_IF_NULL(pCtx, E_FAIL);499RETURN_STATUS_IF_NULL(ppTextureResource, E_FAIL);500501D3DFORMAT format = pCtx->IsTextureFormatSupported(D3DFMT_A8) ?502D3DFMT_A8 : D3DFMT_A8R8G8B8;503504jboolean needsInit = (pMaskTexture == NULL);505HRESULT res;506if (FAILED(res =507GetStockTextureResource(D3D_MASK_CACHE_WIDTH_IN_TEXELS,508D3D_MASK_CACHE_HEIGHT_IN_TEXELS,509FALSE/*isRTT*/, FALSE/*isOpaque*/, &format, 0,510&pMaskTexture)))511{512return res;513}514515if (needsInit) {516// init special fully opaque tile in the upper-right corner of517// the mask cache texture518jubyte allOnes[D3D_MASK_CACHE_TILE_SIZE];519memset(allOnes, 0xff, D3D_MASK_CACHE_TILE_SIZE);520if (FAILED(res = pCtx->UploadTileToTexture(521pMaskTexture,522allOnes,523D3D_MASK_CACHE_SPECIAL_TILE_X,524D3D_MASK_CACHE_SPECIAL_TILE_Y,5250, 0,526D3D_MASK_CACHE_TILE_WIDTH,527D3D_MASK_CACHE_TILE_HEIGHT,528D3D_MASK_CACHE_TILE_WIDTH,529TILEFMT_1BYTE_ALPHA)))530{531return res;532}533}534535*ppTextureResource = pMaskTexture;536537return res;538}539540HRESULT541D3DResourceManager::GetBlitTexture(D3DResource **ppTextureResource)542{543J2dTraceLn(J2D_TRACE_INFO, "D3DRM::GetBlitTexture");544545RETURN_STATUS_IF_NULL(pCtx, E_FAIL);546RETURN_STATUS_IF_NULL(ppTextureResource, E_FAIL);547548HRESULT res =549GetStockTextureResource(D3DC_BLIT_TILE_SIZE, D3DC_BLIT_TILE_SIZE,550FALSE/*isRTT*/, FALSE/*isOpaque*/, NULL,551D3DUSAGE_DYNAMIC,552&pBlitTexture);553*ppTextureResource = pBlitTexture;554555return res;556}557558HRESULT559D3DResourceManager::GetGradientTexture(D3DResource **ppTextureResource)560{561J2dTraceLn(J2D_TRACE_INFO, "D3DRM::GetGradientTexture");562563RETURN_STATUS_IF_NULL(pCtx, E_FAIL);564RETURN_STATUS_IF_NULL(ppTextureResource, E_FAIL);565566HRESULT res =567GetStockTextureResource(2, 1,568FALSE/*isRTT*/, FALSE/*isOpaque*/, NULL, 0,569&pGradientTexture);570*ppTextureResource = pGradientTexture;571572return res;573}574575HRESULT576D3DResourceManager::GetMultiGradientTexture(D3DResource **ppTextureResource)577{578J2dTraceLn(J2D_TRACE_INFO, "D3DRM::GetMultiGradientTexture");579580RETURN_STATUS_IF_NULL(pCtx, E_FAIL);581RETURN_STATUS_IF_NULL(ppTextureResource, E_FAIL);582583HRESULT res =584GetStockTextureResource(MAX_MULTI_GRADIENT_COLORS, 1,585FALSE/*isRTT*/, FALSE/*isOpaque*/, NULL, 0,586&pMultiGradientTexture);587*ppTextureResource = pMultiGradientTexture;588589return res;590}591592HRESULT593D3DResourceManager::GetLookupOpLutTexture(D3DResource **ppTextureResource)594{595J2dTraceLn(J2D_TRACE_INFO, "D3DRM::GetLookupOpTexture");596597RETURN_STATUS_IF_NULL(pCtx, E_FAIL);598RETURN_STATUS_IF_NULL(ppTextureResource, E_FAIL);599600D3DFORMAT format = D3DFMT_L16;601HRESULT res =602GetStockTextureResource(256, 4,603FALSE/*isRTT*/, FALSE/*isOpaque*/, &format, 0,604&pLookupOpLutTexture);605*ppTextureResource = pLookupOpLutTexture;606607return res;608}609610HRESULT611D3DResourceManager::GetBlitRTTexture(UINT width, UINT height, D3DFORMAT format,612D3DResource **ppTextureResource)613{614J2dTraceLn(J2D_TRACE_INFO, "D3DRM::GetBlitRTTexture");615RETURN_STATUS_IF_NULL(pCtx, E_FAIL);616RETURN_STATUS_IF_NULL(ppTextureResource, E_FAIL);617618HRESULT res = GetStockTextureResource(width, height,619TRUE/*isRTT*/, FALSE/*isOpaque*/,620&format, 0,621&pBlitRTTexture);622if (SUCCEEDED(res)) {623D3DSURFACE_DESC *pDesc = pBlitRTTexture->GetDesc();624D3DCAPS9 *pDevCaps = pCtx->GetDeviceCaps();625if ((width <= pDesc->Width && height <= pDesc->Height) &&626(format == pDesc->Format ||627SUCCEEDED(pCtx->Get3DObject()->CheckDeviceFormatConversion(628pDevCaps->AdapterOrdinal,629pDevCaps->DeviceType, format, pDesc->Format))))630{631*ppTextureResource = pBlitRTTexture;632return res;633}634// current texture doesn't fit, release and allocate a new one635ReleaseResource(pBlitRTTexture);636pBlitRTTexture = NULL;637}638if (width < D3DC_BLIT_TILE_SIZE) width = D3DC_BLIT_TILE_SIZE;639if (height < D3DC_BLIT_TILE_SIZE) height = D3DC_BLIT_TILE_SIZE;640641res = CreateTexture(width, height, TRUE, FALSE, &format, 0,&pBlitRTTexture);642*ppTextureResource = pBlitRTTexture;643644return res;645}646647HRESULT648D3DResourceManager::GetBlitOSPSurface(UINT width, UINT height, D3DFORMAT fmt,649D3DResource **ppSurfaceResource)650{651HRESULT res = S_OK;652653J2dTraceLn(J2D_TRACE_INFO, "D3DRM::GetBlitOSPSurface");654RETURN_STATUS_IF_NULL(pCtx, E_FAIL);655RETURN_STATUS_IF_NULL(ppSurfaceResource, E_FAIL);656657if (pBlitOSPSurface != NULL) {658D3DSURFACE_DESC *pDesc = pBlitOSPSurface->GetDesc();659if (width == pDesc->Width && height == pDesc->Height &&660(fmt == pDesc->Format || fmt == D3DFMT_UNKNOWN))661{662*ppSurfaceResource = pBlitOSPSurface;663return res;664}665// current surface doesn't fit, release and allocate a new one666ReleaseResource(pBlitOSPSurface);667pBlitOSPSurface = NULL;668}669670res = CreateOSPSurface(width, height, fmt, &pBlitOSPSurface);671*ppSurfaceResource = pBlitOSPSurface;672673return res;674}675676HRESULT677D3DResourceManager::GetLockableRTSurface(UINT width, UINT height,678D3DFORMAT format,679D3DResource **ppSurfaceResource)680{681HRESULT res = S_OK;682683J2dTraceLn(J2D_TRACE_INFO, "D3DRM::GetLockableRTSurface");684RETURN_STATUS_IF_NULL(pCtx, E_FAIL);685RETURN_STATUS_IF_NULL(ppSurfaceResource, E_FAIL);686687if (pLockableRTSurface != NULL) {688D3DSURFACE_DESC *pDesc = pLockableRTSurface->GetDesc();689if (width <= pDesc->Width && height <= pDesc->Height &&690format == pDesc->Format)691{692*ppSurfaceResource = pLockableRTSurface;693return res;694}695// current surface doesn't fit, release and allocate a new one696ReleaseResource(pLockableRTSurface);697pLockableRTSurface = NULL;698}699if (width < D3DC_BLIT_TILE_SIZE) width = D3DC_BLIT_TILE_SIZE;700if (height < D3DC_BLIT_TILE_SIZE) height = D3DC_BLIT_TILE_SIZE;701702res = CreateRTSurface(width,height,703(format != D3DFMT_A8R8G8B8), TRUE /*lockable*/,704&format, &pLockableRTSurface);705*ppSurfaceResource = pLockableRTSurface;706707return res;708}709710HRESULT711D3DResourceManager::GetCachedDestTexture(D3DFORMAT format,712D3DResource **ppTextureResource)713{714J2dTraceLn(J2D_TRACE_INFO, "D3DRM::GetCachedDestTexture");715716RETURN_STATUS_IF_NULL(pCtx, E_FAIL);717RETURN_STATUS_IF_NULL(ppTextureResource, E_FAIL);718719HRESULT res =720GetStockTextureResource(D3DTR_CACHED_DEST_WIDTH,721D3DTR_CACHED_DEST_HEIGHT,722TRUE/*isRTT*/, FALSE/*isOpaque*/,723&format, 0, &pCachedDestTexture);724if (SUCCEEDED(res)) {725D3DSURFACE_DESC *pDesc = pCachedDestTexture->GetDesc();726D3DCAPS9 *pDevCaps = pCtx->GetDeviceCaps();727if ((format == pDesc->Format ||728SUCCEEDED(pCtx->Get3DObject()->CheckDeviceFormatConversion(729pDevCaps->AdapterOrdinal,730pDevCaps->DeviceType, format, pDesc->Format))))731{732*ppTextureResource = pCachedDestTexture;733return res;734}735// current texture doesn't fit, release and allocate a new one736ReleaseResource(pCachedDestTexture);737pCachedDestTexture = NULL;738}739res = CreateTexture(D3DTR_CACHED_DEST_WIDTH, D3DTR_CACHED_DEST_HEIGHT,740TRUE, FALSE, &format, 0,741&pCachedDestTexture);742*ppTextureResource = pCachedDestTexture;743return res;744}745746HRESULT747D3DResourceManager::GetStockTextureResource(UINT width, UINT height,748BOOL isRTT, BOOL isOpaque,749D3DFORMAT *pFormat/*in/out*/,750DWORD dwUsage,751D3DResource **ppTextureResource)752{753D3DResource *pResource = *ppTextureResource;754if (pResource != NULL) {755if (pResource->GetTexture() != NULL) {756return S_OK;757}758ReleaseResource(pResource);759*ppTextureResource = NULL;760}761762return CreateTexture(width, height, isRTT, isOpaque, pFormat, dwUsage,763ppTextureResource);764}765766767