_Use_decl_annotations_ void EffectFactory::Impl::CreateTexture( const WCHAR* name, ID3D11DeviceContext* deviceContext, ID3D11ShaderResourceView** textureView ) { if ( !name || !textureView ) throw std::exception("invalid arguments"); auto it = mTextureCache.find( name ); if ( mSharing && it != mTextureCache.end() ) { ID3D11ShaderResourceView* srv = it->second.Get(); srv->AddRef(); *textureView = srv; } else { WCHAR fullName[MAX_PATH]={0}; wcscpy_s( fullName, mPath ); wcscat_s( fullName, name ); #if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) WCHAR ext[_MAX_EXT]; _wsplitpath_s( name, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT ); if ( _wcsicmp( ext, L".dds" ) == 0 ) { ThrowIfFailed( CreateDDSTextureFromFile( device.Get(), fullName, nullptr, textureView ) ); } else if ( deviceContext ) { std::lock_guard<std::mutex> lock(mutex); DirectX::ThrowIfFailed( CreateWICTextureFromFile( device.Get(), deviceContext, fullName, nullptr, textureView ) ); } else { DirectX::ThrowIfFailed( CreateWICTextureFromFile( device.Get(), nullptr, fullName, nullptr, textureView ) ); } #else UNREFERENCED_PARAMETER( deviceContext ); ThrowIfFailed( CreateDDSTextureFromFile( device.Get(), fullName, nullptr, textureView ) ); #endif if ( mSharing && *name && it == mTextureCache.end() ) { std::lock_guard<std::mutex> lock(mutex); mTextureCache.insert( TextureCache::value_type( name, *textureView ) ); } } }
_Use_decl_annotations_ void EffectFactory::Impl::CreateTexture(const wchar_t* name, ID3D11DeviceContext* deviceContext, ID3D11ShaderResourceView** textureView) { if (!name || !textureView) throw std::exception("invalid arguments"); #if defined(_XBOX_ONE) && defined(_TITLE) UNREFERENCED_PARAMETER(deviceContext); #endif auto it = mTextureCache.find(name); if (mSharing && it != mTextureCache.end()) { ID3D11ShaderResourceView* srv = it->second.Get(); srv->AddRef(); *textureView = srv; } else { wchar_t fullName[MAX_PATH] = {}; wcscpy_s(fullName, mPath); wcscat_s(fullName, name); WIN32_FILE_ATTRIBUTE_DATA fileAttr = {}; if (!GetFileAttributesExW(fullName, GetFileExInfoStandard, &fileAttr)) { // Try Current Working Directory (CWD) wcscpy_s(fullName, name); if (!GetFileAttributesExW(fullName, GetFileExInfoStandard, &fileAttr)) { DebugTrace("EffectFactory could not find texture file '%ls'\n", name); throw std::exception("CreateTexture"); } } wchar_t ext[_MAX_EXT]; _wsplitpath_s(name, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT); if (_wcsicmp(ext, L".dds") == 0) { HRESULT hr = CreateDDSTextureFromFileEx( mDevice.Get(), fullName, 0, D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, mForceSRGB, nullptr, textureView); if (FAILED(hr)) { DebugTrace("CreateDDSTextureFromFile failed (%08X) for '%ls'\n", hr, fullName); throw std::exception("CreateDDSTextureFromFile"); } } #if !defined(_XBOX_ONE) || !defined(_TITLE) else if (deviceContext) { std::lock_guard<std::mutex> lock(mutex); HRESULT hr = CreateWICTextureFromFileEx( mDevice.Get(), deviceContext, fullName, 0, D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, mForceSRGB ? WIC_LOADER_FORCE_SRGB : WIC_LOADER_DEFAULT, nullptr, textureView); if (FAILED(hr)) { DebugTrace("CreateWICTextureFromFile failed (%08X) for '%ls'\n", hr, fullName); throw std::exception("CreateWICTextureFromFile"); } } #endif else { HRESULT hr = CreateWICTextureFromFileEx( mDevice.Get(), fullName, 0, D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, mForceSRGB ? WIC_LOADER_FORCE_SRGB : WIC_LOADER_DEFAULT, nullptr, textureView); if (FAILED(hr)) { DebugTrace("CreateWICTextureFromFile failed (%08X) for '%ls'\n", hr, fullName); throw std::exception("CreateWICTextureFromFile"); } } if (mSharing && *name && it == mTextureCache.end()) { std::lock_guard<std::mutex> lock(mutex); TextureCache::value_type v(name, *textureView); mTextureCache.insert(v); } } }
_Use_decl_annotations_ void DGSLEffectFactory::Impl::CreateTexture( const WCHAR* name, ID3D11DeviceContext* deviceContext, ID3D11ShaderResourceView** textureView ) { if ( !name || !textureView ) throw std::exception("invalid arguments"); #if defined(_XBOX_ONE) && defined(_TITLE) UNREFERENCED_PARAMETER(deviceContext); #endif auto it = mTextureCache.find( name ); if ( mSharing && it != mTextureCache.end() ) { ID3D11ShaderResourceView* srv = it->second.Get(); srv->AddRef(); *textureView = srv; } else { WCHAR fullName[MAX_PATH] = {0}; wcscpy_s( fullName, mPath ); wcscat_s( fullName, name ); #if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) || (_WIN32_WINNT > _WIN32_WINNT_WIN8) WCHAR ext[_MAX_EXT]; _wsplitpath_s( name, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT ); if ( _wcsicmp( ext, L".dds" ) == 0 ) { HRESULT hr = CreateDDSTextureFromFile( device.Get(), fullName, nullptr, textureView ); if ( FAILED(hr) ) { DebugTrace( "CreateDDSTextureFromFile failed (%08X) for '%S'\n", hr, fullName ); throw std::exception( "CreateDDSTextureFromFile" ); } } #if !defined(_XBOX_ONE) || !defined(_TITLE) else if ( deviceContext ) { std::lock_guard<std::mutex> lock(mutex); HRESULT hr = CreateWICTextureFromFile( device.Get(), deviceContext, fullName, nullptr, textureView ); if ( FAILED(hr) ) { DebugTrace( "CreateWICTextureFromFile failed (%08X) for '%S'\n", hr, fullName ); throw std::exception( "CreateWICTextureFromFile" ); } } #endif else { HRESULT hr = CreateWICTextureFromFile( device.Get(), fullName, nullptr, textureView ); if ( FAILED(hr) ) { DebugTrace( "CreateWICTextureFromFile failed (%08X) for '%S'\n", hr, fullName ); throw std::exception( "CreateWICTextureFromFile" ); } } #else UNREFERENCED_PARAMETER( deviceContext ); HRESULT hr = CreateDDSTextureFromFile( device.Get(), fullName, nullptr, textureView ); if ( FAILED(hr) ) { DebugTrace( "CreateDDSTextureFromFile failed (%08X) for '%S'\n", hr, fullName ); throw std::exception( "CreateDDSTextureFromFile" ); } #endif if ( mSharing && *name && it == mTextureCache.end() ) { std::lock_guard<std::mutex> lock(mutex); mTextureCache.insert( TextureCache::value_type( name, *textureView ) ); } } }