summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2013-11-21 21:17:58 -0600
committerRyan Houdek <Sonicadvance1@gmail.com>2013-11-21 21:17:58 -0600
commitea9ac07ec9a920612425413fb4256519b827328f (patch)
treec628b92f30fa3069b496031b40fc8a0ece5797fa /Source/Core/VideoBackends/D3D/Src/TextureCache.cpp
parent1aa06b8fa4105d22cac0dd847230215099bbeb78 (diff)
parentff917897731d400a8e71c1480425733e651126ee (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.cpp34
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,