From ea39b2cd2442e66eb5f65055a4042bacfc3ec1ca Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Wed, 3 Jul 2013 16:02:03 +0100 Subject: [PATCH] d3dretrace: Dump D3D11 textures too. --- retrace/d3d10state_images.cpp | 1 + retrace/d3d11state.cpp | 5 +- retrace/d3d11state_images.cpp | 216 ++++++++++++++++++++++------------ retrace/d3dstate.hpp | 3 + 4 files changed, 147 insertions(+), 78 deletions(-) diff --git a/retrace/d3d10state_images.cpp b/retrace/d3d10state_images.cpp index 5c9060e..1cab792 100644 --- a/retrace/d3d10state_images.cpp +++ b/retrace/d3d10state_images.cpp @@ -182,6 +182,7 @@ unmapResource(ID3D10Resource *pResource, UINT SubResource) { } } + static image::Image * getSubResourceImage(ID3D10Device *pDevice, ID3D10Resource *pResource, diff --git a/retrace/d3d11state.cpp b/retrace/d3d11state.cpp index bc8f7c4..cc1f6c7 100644 --- a/retrace/d3d11state.cpp +++ b/retrace/d3d11state.cpp @@ -79,10 +79,7 @@ dumpDevice(std::ostream &os, ID3D11DeviceContext *pDeviceContext) dumpShaders(json, pDeviceContext); - json.beginMember("textures"); - json.beginObject(); - json.endObject(); - json.endMember(); // textures + dumpTextures(json, pDeviceContext); dumpFramebuffer(json, pDeviceContext); } diff --git a/retrace/d3d11state_images.cpp b/retrace/d3d11state_images.cpp index 1fcc80c..b0c753b 100644 --- a/retrace/d3d11state_images.cpp +++ b/retrace/d3d11state_images.cpp @@ -142,18 +142,117 @@ stageResource(ID3D11DeviceContext *pDeviceContext, return hr; } +static image::Image * +getSubResourceImage(ID3D11DeviceContext *pDevice, + ID3D11Resource *pResource, + DXGI_FORMAT Format, + UINT MipSlice) +{ + image::Image *image = NULL; + ID3D11Resource *pStagingResource = NULL; + UINT Width, Height, Depth; + UINT SubResource = MipSlice; + D3D11_MAPPED_SUBRESOURCE MappedSubResource; + HRESULT hr; + + if (!pResource) { + return NULL; + } + + hr = stageResource(pDevice, pResource, &pStagingResource, &Width, &Height, &Depth); + if (FAILED(hr)) { + goto no_staging; + } + + Width = std::max(Width >> MipSlice, 1U); + Height = std::max(Height >> MipSlice, 1U); + Depth = std::max(Depth >> MipSlice, 1U); + + hr = pDevice->Map(pStagingResource, SubResource, D3D11_MAP_READ, 0, &MappedSubResource); + if (FAILED(hr)) { + goto no_map; + } + + image = ConvertImage(Format, + MappedSubResource.pData, + MappedSubResource.RowPitch, + Width, Height); + + pDevice->Unmap(pStagingResource, SubResource); +no_map: + if (pStagingResource) { + pStagingResource->Release(); + } +no_staging: + if (pResource) { + pResource->Release(); + } + return image; +} + + +static image::Image * +getShaderResourceViewImage(ID3D11DeviceContext *pDevice, + ID3D11ShaderResourceView *pShaderResourceView) { + D3D11_SHADER_RESOURCE_VIEW_DESC Desc; + ID3D11Resource *pResource = NULL; + UINT MipSlice; + + if (!pShaderResourceView) { + return NULL; + } + + pShaderResourceView->GetResource(&pResource); + assert(pResource); + + pShaderResourceView->GetDesc(&Desc); + + // TODO: Take the slice in consideration + switch (Desc.ViewDimension) { + case D3D11_SRV_DIMENSION_BUFFER: + MipSlice = 0; + break; + case D3D11_SRV_DIMENSION_TEXTURE1D: + MipSlice = Desc.Texture1D.MostDetailedMip; + break; + case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: + MipSlice = Desc.Texture1DArray.MostDetailedMip; + break; + case D3D11_SRV_DIMENSION_TEXTURE2D: + MipSlice = Desc.Texture2D.MostDetailedMip; + MipSlice = 0; + break; + case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: + MipSlice = Desc.Texture2DArray.MostDetailedMip; + break; + case D3D11_SRV_DIMENSION_TEXTURE2DMS: + MipSlice = 0; + break; + case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: + MipSlice = 0; + break; + case D3D11_SRV_DIMENSION_TEXTURE3D: + MipSlice = Desc.Texture3D.MostDetailedMip; + break; + case D3D11_SRV_DIMENSION_TEXTURECUBE: + MipSlice = Desc.TextureCube.MostDetailedMip; + break; + case D3D11_SRV_DIMENSION_UNKNOWN: + default: + assert(0); + return NULL; + } + + return getSubResourceImage(pDevice, pResource, Desc.Format, MipSlice); +} + + static image::Image * getRenderTargetViewImage(ID3D11DeviceContext *pDevice, ID3D11RenderTargetView *pRenderTargetView) { - image::Image *image = NULL; D3D11_RENDER_TARGET_VIEW_DESC Desc; ID3D11Resource *pResource = NULL; - ID3D11Resource *pStagingResource = NULL; - UINT Width, Height, Depth; UINT MipSlice; - UINT Subresource; - D3D11_MAPPED_SUBRESOURCE MappedSubresource; - HRESULT hr; if (!pRenderTargetView) { return NULL; @@ -164,11 +263,6 @@ getRenderTargetViewImage(ID3D11DeviceContext *pDevice, pRenderTargetView->GetDesc(&Desc); - hr = stageResource(pDevice, pResource, &pStagingResource, &Width, &Height, &Depth); - if (FAILED(hr)) { - goto no_staging; - } - // TODO: Take the slice in consideration switch (Desc.ViewDimension) { case D3D11_RTV_DIMENSION_BUFFER: @@ -196,51 +290,22 @@ getRenderTargetViewImage(ID3D11DeviceContext *pDevice, case D3D11_RTV_DIMENSION_TEXTURE3D: MipSlice = Desc.Texture3D.MipSlice; break; - case D3D11_SRV_DIMENSION_UNKNOWN: + case D3D11_RTV_DIMENSION_UNKNOWN: default: assert(0); - goto no_map; - } - Subresource = MipSlice; - - Width = std::max(Width >> MipSlice, 1U); - Height = std::max(Height >> MipSlice, 1U); - Depth = std::max(Depth >> MipSlice, 1U); - - hr = pDevice->Map(pStagingResource, Subresource, D3D11_MAP_READ, 0, &MappedSubresource); - if (FAILED(hr)) { - goto no_map; + return NULL; } - image = ConvertImage(Desc.Format, - MappedSubresource.pData, - MappedSubresource.RowPitch, - Width, Height); - - pDevice->Unmap(pStagingResource, Subresource); -no_map: - if (pStagingResource) { - pStagingResource->Release(); - } -no_staging: - if (pResource) { - pResource->Release(); - } - return image; + return getSubResourceImage(pDevice, pResource, Desc.Format, MipSlice); } + static image::Image * getDepthStencilViewImage(ID3D11DeviceContext *pDevice, ID3D11DepthStencilView *pDepthStencilView) { - image::Image *image = NULL; D3D11_DEPTH_STENCIL_VIEW_DESC Desc; ID3D11Resource *pResource = NULL; - ID3D11Resource *pStagingResource = NULL; - UINT Width, Height, Depth; UINT MipSlice; - UINT Subresource; - D3D11_MAPPED_SUBRESOURCE MappedSubresource; - HRESULT hr; if (!pDepthStencilView) { return NULL; @@ -251,11 +316,6 @@ getDepthStencilViewImage(ID3D11DeviceContext *pDevice, pDepthStencilView->GetDesc(&Desc); - hr = stageResource(pDevice, pResource, &pStagingResource, &Width, &Height, &Depth); - if (FAILED(hr)) { - goto no_staging; - } - // TODO: Take the slice in consideration switch (Desc.ViewDimension) { case D3D11_DSV_DIMENSION_TEXTURE1D: @@ -277,37 +337,45 @@ getDepthStencilViewImage(ID3D11DeviceContext *pDevice, case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY: MipSlice = 0; break; - case D3D11_SRV_DIMENSION_UNKNOWN: + case D3D11_DSV_DIMENSION_UNKNOWN: default: assert(0); - goto no_map; + return NULL; } - Subresource = MipSlice; - Width = std::max(Width >> MipSlice, 1U); - Height = std::max(Height >> MipSlice, 1U); - Depth = std::max(Depth >> MipSlice, 1U); + return getSubResourceImage(pDevice, pResource, Desc.Format, MipSlice); +} - hr = pDevice->Map(pStagingResource, Subresource, D3D11_MAP_READ, 0, &MappedSubresource); - if (FAILED(hr)) { - goto no_map; - } - image = ConvertImage(Desc.Format, - MappedSubresource.pData, - MappedSubresource.RowPitch, - Width, Height); +void +dumpTextures(JSONWriter &json, ID3D11DeviceContext *pDevice) +{ + json.beginMember("textures"); + json.beginObject(); - pDevice->Unmap(pStagingResource, Subresource); -no_map: - if (pStagingResource) { - pStagingResource->Release(); - } -no_staging: - if (pResource) { - pResource->Release(); + ID3D11ShaderResourceView *pShaderResourceViews[D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT]; + pDevice->PSGetShaderResources(0, ARRAYSIZE(pShaderResourceViews), pShaderResourceViews); + + for (UINT i = 0; i < ARRAYSIZE(pShaderResourceViews); ++i) { + if (!pShaderResourceViews[i]) { + continue; + } + + image::Image *image; + image = getShaderResourceViewImage(pDevice, pShaderResourceViews[i]); + if (image) { + char label[64]; + _snprintf(label, sizeof label, "PS_RESOURCE_%u", i); + json.beginMember(label); + json.writeImage(image, "UNKNOWN"); + json.endMember(); // PS_RESOURCE_* + } + + pShaderResourceViews[i]->Release(); } - return image; + + json.endObject(); + json.endMember(); // textures } @@ -334,10 +402,10 @@ dumpFramebuffer(JSONWriter &json, ID3D11DeviceContext *pDevice) ID3D11RenderTargetView *pRenderTargetViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT]; ID3D11DepthStencilView *pDepthStencilView; - pDevice->OMGetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, pRenderTargetViews, + pDevice->OMGetRenderTargets(ARRAYSIZE(pRenderTargetViews), pRenderTargetViews, &pDepthStencilView); - for (UINT i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { + for (UINT i = 0; i < ARRAYSIZE(pRenderTargetViews); ++i) { if (!pRenderTargetViews[i]) { continue; } diff --git a/retrace/d3dstate.hpp b/retrace/d3dstate.hpp index 93ba874..edab279 100644 --- a/retrace/d3dstate.hpp +++ b/retrace/d3dstate.hpp @@ -87,6 +87,9 @@ dumpDevice(std::ostream &os, ID3D10Device *pDevice); image::Image * getRenderTargetImage(ID3D11DeviceContext *pDeviceContext); +void +dumpTextures(JSONWriter &json, ID3D11DeviceContext *pDeviceContext); + void dumpFramebuffer(JSONWriter &json, ID3D11DeviceContext *pDeviceContext); -- 2.45.2