CPUTResult CPUTTextureDX11::CreateNativeTexture( ID3D11Device *pD3dDevice, const cString &fileName, ID3D11ShaderResourceView **ppShaderResourceView, ID3D11Resource **ppTexture, bool ForceLoadAsSRGB ){ CPUTResult result; HRESULT hr; // Set up loading structure // // Indicate all texture parameters should come from the file D3DX11_IMAGE_LOAD_INFO LoadInfo; ZeroMemory(&LoadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO)); LoadInfo.Width = D3DX11_FROM_FILE; LoadInfo.Height = D3DX11_FROM_FILE; LoadInfo.Depth = D3DX11_FROM_FILE; LoadInfo.FirstMipLevel = D3DX11_FROM_FILE; LoadInfo.MipLevels = D3DX11_FROM_FILE; // LoadInfo.Usage = D3D11_USAGE_IMMUTABLE; // TODO: maintain a "mappable" flag? Set immutable if not mappable? LoadInfo.Usage = D3D11_USAGE_DEFAULT; LoadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE; LoadInfo.CpuAccessFlags = 0; LoadInfo.MiscFlags = 0; LoadInfo.MipFilter = D3DX11_FROM_FILE; LoadInfo.pSrcInfo = NULL; LoadInfo.Format = (DXGI_FORMAT) D3DX11_FROM_FILE; LoadInfo.Filter = D3DX11_FILTER_NONE; // if we're 'forcing' load of sRGB data, we need to verify image is sRGB // or determine image format that best matches the non-sRGB source format in hopes that the conversion will be faster // and data preserved if(true == ForceLoadAsSRGB) { // get the source image info D3DX11_IMAGE_INFO SrcInfo; hr = D3DX11GetImageInfoFromFile(fileName.c_str(), NULL, &SrcInfo, NULL); ASSERT( SUCCEEDED(hr), _L(" - Error loading texture '")+fileName+_L("'.") ); // find a closest equivalent sRGB format result = GetSRGBEquivalent(SrcInfo.Format, LoadInfo.Format); ASSERT( CPUTSUCCESS(result), _L("Error loading texture '")+fileName+_L("'. It is specified this texture must load as sRGB, but the source image is in a format that cannot be converted to sRGB.\n") ); // set filtering mode to interpret 'in'-coming data as sRGB, and storing it 'out' on an sRGB surface // // As it stands, we don't have any tools that support sRGB output in DXT compressed textures. // If we later support a format that does provide sRGB, then the filter 'in' flag will need to be removed LoadInfo.Filter = D3DX11_FILTER_NONE | D3DX11_FILTER_SRGB_IN | D3DX11_FILTER_SRGB_OUT; #if 0 // DWM: TODO: We want to catch the cases where the loader needs to do work. // This happens if the texture's pixel format isn't supported by DXGI. // TODO: how to determine? // if a runtime conversion must happen report a performance warning error. // Note: choosing not to assert here, as this will be a common issue. if( SrcInfo.Format != LoadInfo.Format) { cString dxgiName = GetDXGIFormatString(SrcInfo.Format); cString errorString = _T(__FUNCTION__); errorString += _L("- PERFORMANCE WARNING: '") + fileName +_L("' has an image format ")+dxgiName +_L(" but must be run-time converted to ")+GetDXGIFormatString(LoadInfo.Format) +_L(" based on requested sRGB target buffer.\n"); TRACE( errorString.c_str() ); } #endif } //hr = D3DX11CreateTextureFromFile( pD3dDevice, fileName.c_str(), &LoadInfo, NULL, ppTexture, NULL ); hr = MyCreateTextureFromFile( pD3dDevice, fileName.c_str(), &LoadInfo, NULL, ppTexture, NULL ); ASSERT( SUCCEEDED(hr), _L("Failed to load texture: ") + fileName ); CPUTSetDebugName( *ppTexture, fileName ); hr = pD3dDevice->CreateShaderResourceView( *ppTexture, NULL, ppShaderResourceView ); ASSERT( SUCCEEDED(hr), _L("Failed to create texture shader resource view.") ); CPUTSetDebugName( *ppShaderResourceView, fileName ); return CPUT_SUCCESS; }
std::string Texture::GetFormatString() { D3D10_TEXTURE2D_DESC tex_desc; texture->GetDesc(&tex_desc); return GetDXGIFormatString(tex_desc.Format); }