X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fd3d10state_images.cpp;h=1fc44926c467304c45234c2df327b7f7751f0156;hb=02f5bc034fde68a167500e33c93ddbdda8e175f3;hp=781f937f0c0b5cd299c1dc7f29b1e1cbb362e20b;hpb=bb23f3a0bad625e3c427b9de991d4a42fa22e5f0;p=apitrace diff --git a/retrace/d3d10state_images.cpp b/retrace/d3d10state_images.cpp index 781f937..1fc4492 100644 --- a/retrace/d3d10state_images.cpp +++ b/retrace/d3d10state_images.cpp @@ -29,8 +29,11 @@ #include #include -#include "image.hpp" +#include "os.hpp" +#include "json.hpp" #include "d3d10imports.hpp" +#include "d3dstate.hpp" +#include "dxgistate.hpp" namespace d3dstate { @@ -95,7 +98,7 @@ stageResource(ID3D10Device *pDevice, Desc.Usage = Usage; Desc.BindFlags = BindFlags; Desc.CPUAccessFlags = CPUAccessFlags; - Desc.MiscFlags &= ~D3D10_RESOURCE_MISC_TEXTURECUBE; + Desc.MiscFlags &= D3D10_RESOURCE_MISC_TEXTURECUBE; *pWidth = Desc.Width; *pHeight = Desc.Height; @@ -179,10 +182,10 @@ unmapResource(ID3D10Resource *pResource, UINT Subresource) { } } -image::Image * -getRenderTargetImage(ID3D10Device *pDevice) { +static image::Image * +getRenderTargetViewImage(ID3D10Device *pDevice, + ID3D10RenderTargetView *pRenderTargetView) { image::Image *image = NULL; - ID3D10RenderTargetView *pRenderTargetView = NULL; D3D10_RENDER_TARGET_VIEW_DESC Desc; ID3D10Resource *pResource = NULL; ID3D10Resource *pStagingResource = NULL; @@ -191,24 +194,15 @@ getRenderTargetImage(ID3D10Device *pDevice) { UINT Subresource; D3D10_MAPPED_TEXTURE3D MappedSubresource; HRESULT hr; - const unsigned char *src; - unsigned char *dst; - pDevice->OMGetRenderTargets(1, &pRenderTargetView, NULL); if (!pRenderTargetView) { - goto no_rendertarget; + return NULL; } pRenderTargetView->GetResource(&pResource); assert(pResource); pRenderTargetView->GetDesc(&Desc); - if (Desc.Format != DXGI_FORMAT_R8G8B8A8_UNORM && - Desc.Format != DXGI_FORMAT_R32G32B32A32_FLOAT && - Desc.Format != DXGI_FORMAT_B8G8R8A8_UNORM) { - std::cerr << "warning: unsupported DXGI format " << Desc.Format << "\n"; - goto no_staging; - } hr = stageResource(pDevice, pResource, &pStagingResource, &Width, &Height, &Depth); if (FAILED(hr)) { @@ -258,39 +252,92 @@ getRenderTargetImage(ID3D10Device *pDevice) { goto no_map; } - image = new image::Image(Width, Height, 4, true); - if (!image) { - goto no_image; + image = ConvertImage(Desc.Format, + MappedSubresource.pData, + MappedSubresource.RowPitch, + Width, Height); + + unmapResource(pStagingResource, Subresource); +no_map: + if (pStagingResource) { + pStagingResource->Release(); + } +no_staging: + if (pResource) { + pResource->Release(); } + return image; +} - dst = image->start(); - src = (const unsigned char *)MappedSubresource.pData; - for (unsigned y = 0; y < Height; ++y) { - if (Desc.Format == DXGI_FORMAT_R8G8B8A8_UNORM) { - memcpy(dst, src, Width * 4); - } else if (Desc.Format == DXGI_FORMAT_R32G32B32A32_FLOAT) { - float scale = 1.0f/255.0f; - for (unsigned x = 0; x < Width; ++x) { - dst[4*x + 0] = ((float *)src)[4*x + 0] * scale; - dst[4*x + 1] = ((float *)src)[4*x + 1] * scale; - dst[4*x + 2] = ((float *)src)[4*x + 2] * scale; - dst[4*x + 3] = ((float *)src)[4*x + 3] * scale; - } - } else if (Desc.Format == DXGI_FORMAT_B8G8R8A8_UNORM) { - for (unsigned x = 0; x < Width; ++x) { - dst[4*x + 0] = src[4*x + 2]; - dst[4*x + 1] = src[4*x + 1]; - dst[4*x + 2] = src[4*x + 0]; - dst[4*x + 3] = src[4*x + 3]; - } - } else { - assert(0); - } - src += MappedSubresource.RowPitch; - dst += image->stride(); +static image::Image * +getDepthStencilViewImage(ID3D10Device *pDevice, + ID3D10DepthStencilView *pDepthStencilView) { + image::Image *image = NULL; + D3D10_DEPTH_STENCIL_VIEW_DESC Desc; + ID3D10Resource *pResource = NULL; + ID3D10Resource *pStagingResource = NULL; + UINT Width, Height, Depth; + UINT MipSlice; + UINT Subresource; + D3D10_MAPPED_TEXTURE3D MappedSubresource; + HRESULT hr; + + if (!pDepthStencilView) { + return NULL; + } + + pDepthStencilView->GetResource(&pResource); + assert(pResource); + + 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 D3D10_DSV_DIMENSION_TEXTURE1D: + MipSlice = Desc.Texture1D.MipSlice; + break; + case D3D10_DSV_DIMENSION_TEXTURE1DARRAY: + MipSlice = Desc.Texture1DArray.MipSlice; + break; + case D3D10_DSV_DIMENSION_TEXTURE2D: + MipSlice = Desc.Texture2D.MipSlice; + MipSlice = 0; + break; + case D3D10_DSV_DIMENSION_TEXTURE2DARRAY: + MipSlice = Desc.Texture2DArray.MipSlice; + break; + case D3D10_DSV_DIMENSION_TEXTURE2DMS: + MipSlice = 0; + break; + case D3D10_DSV_DIMENSION_TEXTURE2DMSARRAY: + MipSlice = 0; + break; + case D3D10_SRV_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 = mapResource(pStagingResource, Subresource, D3D10_MAP_READ, 0, &MappedSubresource); + if (FAILED(hr)) { + goto no_map; } -no_image: + image = ConvertImage(Desc.Format, + MappedSubresource.pData, + MappedSubresource.RowPitch, + Width, Height); + unmapResource(pStagingResource, Subresource); no_map: if (pStagingResource) { @@ -300,12 +347,70 @@ no_staging: if (pResource) { pResource->Release(); } + return image; +} + + +image::Image * +getRenderTargetImage(ID3D10Device *pDevice) { + ID3D10RenderTargetView *pRenderTargetView = NULL; + pDevice->OMGetRenderTargets(1, &pRenderTargetView, NULL); + + image::Image *image = NULL; if (pRenderTargetView) { + image = getRenderTargetViewImage(pDevice, pRenderTargetView); pRenderTargetView->Release(); } -no_rendertarget: + return image; } +void +dumpFramebuffer(JSONWriter &json, ID3D10Device *pDevice) +{ + json.beginMember("framebuffer"); + json.beginObject(); + + ID3D10RenderTargetView *pRenderTargetViews[D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT]; + ID3D10DepthStencilView *pDepthStencilView; + pDevice->OMGetRenderTargets(D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT, pRenderTargetViews, + &pDepthStencilView); + + for (UINT i = 0; i < D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { + if (!pRenderTargetViews[i]) { + continue; + } + + image::Image *image; + image = getRenderTargetViewImage(pDevice, pRenderTargetViews[i]); + if (image) { + char label[64]; + _snprintf(label, sizeof label, "RENDER_TARGET_%u", i); + json.beginMember(label); + json.writeImage(image, "UNKNOWN"); + json.endMember(); // RENDER_TARGET_* + } + + pRenderTargetViews[i]->Release(); + } + + if (pDepthStencilView) { + image::Image *image; + image = getDepthStencilViewImage(pDevice, pDepthStencilView); + if (image) { + json.beginMember("DEPTH_STENCIL"); + json.writeImage(image, "UNKNOWN"); + json.endMember(); + } + + pDepthStencilView->Release(); + + } + + json.endObject(); + json.endMember(); // framebuffer +} + + } /* namespace d3dstate */