mirror of
https://github.com/libretro/ppsspp.git
synced 2025-02-07 09:38:18 +00:00
D3D11: Implement screenshots.
This commit is contained in:
parent
68ba3070bc
commit
e8396b10f9
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -312,6 +312,8 @@ enum class NativeObject {
|
||||
DEVICE_EX,
|
||||
BACKBUFFER_COLOR_VIEW,
|
||||
BACKBUFFER_DEPTH_VIEW,
|
||||
BACKBUFFER_COLOR_TEX,
|
||||
BACKBUFFER_DEPTH_TEX,
|
||||
};
|
||||
|
||||
enum FBColorDepth {
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user