summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/D3D/Src/TextureCache.cpp')
-rw-r--r--Source/Core/VideoBackends/D3D/Src/TextureCache.cpp34
1 files changed, 30 insertions, 4 deletions
diff --git a/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp b/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp
index e803f4a8f2..9d1e28b9b0 100644
--- a/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp
+++ b/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp
@@ -42,7 +42,33 @@ 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));
+
+ 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);
+
+ 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))
+ {
+ hr = D3D::TextureToPng(map, UTF8ToUTF16(filename).c_str(), desc.Width, desc.Height);
+ D3D::context->Unmap(pNewTexture, 0);
+ }
+ SAFE_RELEASE(pNewTexture);
+ }
+
+ return SUCCEEDED(hr);
}
void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height,
@@ -82,10 +108,10 @@ TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width,
// TODO: better debug names
D3D::SetDebugObjectName((ID3D11DeviceChild*)entry->texture->GetTex(), "a texture of the TextureCache");
- D3D::SetDebugObjectName((ID3D11DeviceChild*)entry->texture->GetSRV(), "shader resource view of a texture of the TextureCache");
+ D3D::SetDebugObjectName((ID3D11DeviceChild*)entry->texture->GetSRV(), "shader resource view of a texture of the TextureCache");
SAFE_RELEASE(pTexture);
-
+
if (tex_levels != 1)
entry->Load(width, height, expanded_width, 0);
@@ -137,7 +163,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
VertexShaderCache::GetSimpleVertexShader(), VertexShaderCache::GetSimpleInputLayout());
D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV());
-
+
g_renderer->RestoreAPIState();
}