diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2013-11-21 21:17:58 -0600 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2013-11-21 21:17:58 -0600 |
| commit | ea9ac07ec9a920612425413fb4256519b827328f (patch) | |
| tree | c628b92f30fa3069b496031b40fc8a0ece5797fa /Source/Core/VideoBackends/D3D/Src/TextureCache.cpp | |
| parent | 1aa06b8fa4105d22cac0dd847230215099bbeb78 (diff) | |
| parent | ff917897731d400a8e71c1480425733e651126ee (diff) | |
Merge branch 'master' into jit_exit_addresses
Diffstat (limited to 'Source/Core/VideoBackends/D3D/Src/TextureCache.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/D3D/Src/TextureCache.cpp | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp b/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp index 7ee92459c6..22e644b2d8 100644 --- a/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp +++ b/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp @@ -14,6 +14,7 @@ #include "PSTextureEncoder.h" #include "HW/Memmap.h" #include "VideoConfig.h" +#include "ImageWrite.h" namespace DX11 { @@ -32,7 +33,7 @@ void TextureCache::TCacheEntry::Bind(unsigned int stage) D3D::context->PSSetShaderResources(stage, 1, &texture->GetSRV()); } -bool TextureCache::TCacheEntry::Save(const char filename[], unsigned int level) +bool TextureCache::TCacheEntry::Save(const std::string filename, unsigned int level) { // TODO: Somehow implement this (D3DX11 doesn't support dumping individual LODs) static bool warn_once = true; @@ -42,8 +43,35 @@ bool TextureCache::TCacheEntry::Save(const char filename[], unsigned int level) warn_once = false; return false; } - //return SUCCEEDED(PD3DX11SaveTextureToFileA(D3D::context, texture->GetTex(), D3DX11_IFF_PNG, filename)); - return true; + + ID3D11Texture2D* pNewTexture = NULL; + ID3D11Texture2D* pSurface = texture->GetTex(); + D3D11_TEXTURE2D_DESC desc; + pSurface->GetDesc(&desc); + + desc.BindFlags = 0; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; + desc.Usage = D3D11_USAGE_STAGING; + + HRESULT hr = D3D::device->CreateTexture2D(&desc, NULL, &pNewTexture); + + bool saved_png = false; + + if (SUCCEEDED(hr) && pNewTexture) + { + D3D::context->CopyResource(pNewTexture, pSurface); + + D3D11_MAPPED_SUBRESOURCE map; + HRESULT hr = D3D::context->Map(pNewTexture, 0, D3D11_MAP_READ_WRITE, 0, &map); + if (SUCCEEDED(hr)) + { + saved_png = TextureToPng((u8*)map.pData, map.RowPitch, filename, desc.Width, desc.Height); + D3D::context->Unmap(pNewTexture, 0); + } + SAFE_RELEASE(pNewTexture); + } + + return saved_png; } void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height, |
