D3D11: Implement screenshots.

This commit is contained in:
Henrik Rydgard 2017-02-18 00:43:02 +01:00
parent 68ba3070bc
commit e8396b10f9
5 changed files with 50 additions and 5 deletions

View File

@ -913,5 +913,38 @@ bool FramebufferManagerD3D11::GetStencilbuffer(u32 fb_address, int fb_stride, GP
}
bool FramebufferManagerD3D11::GetOutputFramebuffer(GPUDebugBuffer &buffer) {
return false;
ID3D11Texture2D *backbuffer = (ID3D11Texture2D *)draw_->GetNativeObject(Draw::NativeObject::BACKBUFFER_COLOR_TEX);
D3D11_TEXTURE2D_DESC desc;
backbuffer->GetDesc(&desc);
int w = desc.Width;
int h = desc.Height;
buffer.Allocate(w, h, GE_FORMAT_8888, !useBufferedRendering_, true);
ID3D11Texture2D *packTex;
D3D11_TEXTURE2D_DESC packDesc{};
packDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
packDesc.BindFlags = 0;
packDesc.Width = w;
packDesc.Height = h;
packDesc.ArraySize = 1;
packDesc.MipLevels = 1;
packDesc.Usage = D3D11_USAGE_STAGING;
packDesc.SampleDesc.Count = 1;
packDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
device_->CreateTexture2D(&packDesc, nullptr, &packTex);
context_->CopyResource(packTex, backbuffer);
D3D11_MAPPED_SUBRESOURCE map;
context_->Map(packTex, 0, D3D11_MAP_READ, 0, &map);
for (int y = 0; y < h; y++) {
uint8_t *dest = (uint8_t *)buffer.GetData() + y * w * 4;
const uint8_t *src = ((const uint8_t *)map.pData) + map.RowPitch * y;
memcpy(dest, src, 4 * w);
}
context_->Unmap(packTex, 0);
packTex->Release();
return true;
}

View File

@ -2140,3 +2140,7 @@ bool GPUCommon::GetCurrentStencilbuffer(GPUDebugBuffer &buffer) {
return framebufferManager_->GetStencilbuffer(fb_address, fb_stride, buffer);
}
bool GPUCommon::GetOutputFramebuffer(GPUDebugBuffer &buffer) {
return framebufferManager_->GetOutputFramebuffer(buffer);
}

View File

@ -165,6 +165,7 @@ public:
bool GetCurrentFramebuffer(GPUDebugBuffer &buffer, GPUDebugFramebufferType type, int maxRes) override;
bool GetCurrentDepthbuffer(GPUDebugBuffer &buffer) override;
bool GetCurrentStencilbuffer(GPUDebugBuffer &buffer) override;
bool GetOutputFramebuffer(GPUDebugBuffer &buffer) override;
std::vector<DisplayList> ActiveDisplayLists() override;
void ResetListPC(int listID, u32 pc) override;

View File

@ -312,6 +312,8 @@ enum class NativeObject {
DEVICE_EX,
BACKBUFFER_COLOR_VIEW,
BACKBUFFER_DEPTH_VIEW,
BACKBUFFER_COLOR_TEX,
BACKBUFFER_DEPTH_TEX,
};
enum FBColorDepth {

View File

@ -100,6 +100,10 @@ public:
return (uintptr_t)device_;
case NativeObject::CONTEXT:
return (uintptr_t)context_;
case NativeObject::BACKBUFFER_COLOR_TEX:
return (uintptr_t)bbRenderTargetTex_;
case NativeObject::BACKBUFFER_DEPTH_TEX:
return (uintptr_t)bbDepthStencilTex_;
case NativeObject::BACKBUFFER_COLOR_VIEW:
return (uintptr_t)bbRenderTargetView_;
case NativeObject::BACKBUFFER_DEPTH_VIEW:
@ -119,6 +123,7 @@ private:
ID3D11DeviceContext *context_;
IDXGISwapChain *swapChain_ = nullptr;
ID3D11Texture2D *bbRenderTargetTex_ = nullptr;
ID3D11RenderTargetView *bbRenderTargetView_ = nullptr;
// Strictly speaking we don't need a depth buffer for the backbuffer.
ID3D11Texture2D *bbDepthStencilTex_ = nullptr;
@ -237,6 +242,8 @@ void D3D11DrawContext::HandleEvent(Event ev) {
curRenderTargetView_ = nullptr;
curDepthStencilView_ = nullptr;
}
bbRenderTargetTex_->Release();
bbRenderTargetTex_ = nullptr;
bbRenderTargetView_->Release();
bbRenderTargetView_ = nullptr;
bbDepthStencilView_->Release();
@ -251,12 +258,10 @@ void D3D11DrawContext::HandleEvent(Event ev) {
GetRes(hWnd_, width, height);
// Create a render target view
ID3D11Texture2D* pBackBuffer = nullptr;
HRESULT hr = swapChain_->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&pBackBuffer));
HRESULT hr = swapChain_->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&bbRenderTargetTex_));
if (FAILED(hr))
return;
hr = device_->CreateRenderTargetView(pBackBuffer, nullptr, &bbRenderTargetView_);
pBackBuffer->Release();
hr = device_->CreateRenderTargetView(bbRenderTargetTex_, nullptr, &bbRenderTargetView_);
if (FAILED(hr))
return;