X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fd3d11state_images.cpp;h=60efc7d4e9ea1f63136c6b69031b31f4ba3743e7;hb=c8695f74ce1ee6a93dee4b3f7da5a70a64706c82;hp=fda85b15f05d8973b76450caed1b9295ed0f8f9c;hpb=9db16b3989481f8d6dfc8932d760fcc16217ecbd;p=apitrace diff --git a/retrace/d3d11state_images.cpp b/retrace/d3d11state_images.cpp index fda85b1..60efc7d 100644 --- a/retrace/d3d11state_images.cpp +++ b/retrace/d3d11state_images.cpp @@ -32,6 +32,7 @@ #include "image.hpp" #include "d3d11imports.hpp" #include "d3d10state.hpp" +#include "dxgistate.hpp" namespace d3dstate { @@ -144,7 +145,6 @@ image::Image * getRenderTargetViewImage(ID3D11DeviceContext *pDevice, ID3D11RenderTargetView *pRenderTargetView) { image::Image *image = NULL; - ; D3D11_RENDER_TARGET_VIEW_DESC Desc; ID3D11Resource *pResource = NULL; ID3D11Resource *pStagingResource = NULL; @@ -153,8 +153,6 @@ getRenderTargetViewImage(ID3D11DeviceContext *pDevice, UINT Subresource; D3D11_MAPPED_SUBRESOURCE MappedSubresource; HRESULT hr; - const unsigned char *src; - unsigned char *dst; if (!pRenderTargetView) { return NULL; @@ -164,12 +162,6 @@ getRenderTargetViewImage(ID3D11DeviceContext *pDevice, 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)) { @@ -219,36 +211,22 @@ getRenderTargetViewImage(ID3D11DeviceContext *pDevice, goto no_map; } - image = new image::Image(Width, Height, 4, true); + image = new image::Image(Width, Height, 4); if (!image) { goto no_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(); + assert(image->stride() > 0); + + hr = ConvertFormat(Desc.Format, + MappedSubresource.pData, + MappedSubresource.RowPitch, + DXGI_FORMAT_R8G8B8A8_UNORM, + image->start(), + image->stride(), + Width, Height); + if (FAILED(hr)) { + delete image; + image = NULL; } no_image: @@ -265,8 +243,6 @@ no_staging: } - - image::Image * getRenderTargetImage(ID3D11DeviceContext *pDevice) { ID3D11RenderTargetView *pRenderTargetView = NULL;