From c8695f74ce1ee6a93dee4b3f7da5a70a64706c82 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Wed, 6 Mar 2013 12:12:04 +0000 Subject: [PATCH] d3dretrace: Use DirectXTex for d3d10 state too. --- retrace/CMakeLists.txt | 1 + retrace/d3d10state.hpp | 6 +-- retrace/d3d10state_images.cpp | 49 ++++++------------- retrace/d3d11state_images.cpp | 58 +---------------------- retrace/dxgistate.cpp | 88 +++++++++++++++++++++++++++++++++++ retrace/dxgistate.hpp | 53 +++++++++++++++++++++ 6 files changed, 160 insertions(+), 95 deletions(-) create mode 100644 retrace/dxgistate.cpp create mode 100644 retrace/dxgistate.hpp diff --git a/retrace/CMakeLists.txt b/retrace/CMakeLists.txt index 5f831a4..225ca45 100644 --- a/retrace/CMakeLists.txt +++ b/retrace/CMakeLists.txt @@ -193,6 +193,7 @@ if (WIN32) set (DXGI_MODULES ${DXGI_MODULES} d3d10_1) endif () set (D3DSTATE_SOURCES ${D3DSTATE_SOURCES} + dxgistate.cpp d3d10state.cpp d3d10state_images.cpp ) diff --git a/retrace/d3d10state.hpp b/retrace/d3d10state.hpp index b480bd6..2b6fc98 100644 --- a/retrace/d3d10state.hpp +++ b/retrace/d3d10state.hpp @@ -23,8 +23,8 @@ * **************************************************************************/ -#ifndef _DXGISTATE_HPP_ -#define _DXGISTATE_HPP_ +#ifndef _D3D10STATE_HPP_ +#define _D3D10STATE_HPP_ #include @@ -81,4 +81,4 @@ dumpShader(JSONWriter &json, const char *name, T *pShader) { } /* namespace d3dstate */ -#endif // _DXGISTATE_HPP_ +#endif // _D3D10STATE_HPP_ diff --git a/retrace/d3d10state_images.cpp b/retrace/d3d10state_images.cpp index fa27fee..53d5b91 100644 --- a/retrace/d3d10state_images.cpp +++ b/retrace/d3d10state_images.cpp @@ -33,6 +33,7 @@ #include "json.hpp" #include "d3d10imports.hpp" #include "d3dstate.hpp" +#include "dxgistate.hpp" namespace d3dstate { @@ -193,8 +194,6 @@ getRenderTargetViewImage(ID3D10Device *pDevice, UINT Subresource; D3D10_MAPPED_TEXTURE3D MappedSubresource; HRESULT hr; - const unsigned char *src; - unsigned char *dst; if (!pRenderTargetView) { return NULL; @@ -204,12 +203,6 @@ getRenderTargetViewImage(ID3D10Device *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)) { @@ -259,36 +252,22 @@ getRenderTargetViewImage(ID3D10Device *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: diff --git a/retrace/d3d11state_images.cpp b/retrace/d3d11state_images.cpp index e08bc29..60efc7d 100644 --- a/retrace/d3d11state_images.cpp +++ b/retrace/d3d11state_images.cpp @@ -32,61 +32,7 @@ #include "image.hpp" #include "d3d11imports.hpp" #include "d3d10state.hpp" - -#ifdef __MINGW32__ -#define nullptr NULL -#endif -#include "DirectXTex.h" - - -/** - * Convert between DXGI formats. - * - */ -static HRESULT -ConvertFormat(DXGI_FORMAT SrcFormat, - void *SrcData, - UINT SrcPitch, - DXGI_FORMAT DstFormat, - void *DstData, - UINT DstPitch, - UINT Width, UINT Height) -{ - HRESULT hr; - - DirectX::Image SrcImage; - DirectX::Image DstImage; - - SrcImage.width = Width; - SrcImage.height = Height; - SrcImage.format = SrcFormat; - SrcImage.rowPitch = SrcPitch; - SrcImage.slicePitch = Height * SrcPitch; - SrcImage.pixels = (uint8_t*)SrcData; - - DstImage.width = Width; - DstImage.height = Height; - DstImage.format = DstFormat; - DstImage.rowPitch = DstPitch; - DstImage.slicePitch = Height * DstPitch; - DstImage.pixels = (uint8_t*)DstData; - - DirectX::Rect rect(0, 0, Width, Height); - - if (SrcFormat != DstFormat) { - DirectX::ScratchImage ScratchImage; - ScratchImage.Initialize2D(DstFormat, Width, Height, 1, 1); - - hr = DirectX::Convert(SrcImage, DstFormat, DirectX::TEX_FILTER_DEFAULT, 0.0f, ScratchImage); - if (SUCCEEDED(hr)) { - hr = CopyRectangle(*ScratchImage.GetImage(0, 0, 0), rect, DstImage, DirectX::TEX_FILTER_DEFAULT, 0, 0); - } - } else { - hr = CopyRectangle(SrcImage, rect, DstImage, DirectX::TEX_FILTER_DEFAULT, 0, 0); - } - - return hr; -} +#include "dxgistate.hpp" namespace d3dstate { @@ -297,8 +243,6 @@ no_staging: } - - image::Image * getRenderTargetImage(ID3D11DeviceContext *pDevice) { ID3D11RenderTargetView *pRenderTargetView = NULL; diff --git a/retrace/dxgistate.cpp b/retrace/dxgistate.cpp new file mode 100644 index 0000000..4a69f3f --- /dev/null +++ b/retrace/dxgistate.cpp @@ -0,0 +1,88 @@ +/************************************************************************** + * + * Copyright 2013 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + **************************************************************************/ + + +#include "dxgistate.hpp" + +#ifdef __MINGW32__ +#define nullptr NULL +#endif +#include "DirectXTex.h" + + +namespace d3dstate { + + +/** + * Convert between DXGI formats. + * + */ +HRESULT +ConvertFormat(DXGI_FORMAT SrcFormat, + void *SrcData, + UINT SrcPitch, + DXGI_FORMAT DstFormat, + void *DstData, + UINT DstPitch, + UINT Width, UINT Height) +{ + HRESULT hr; + + DirectX::Image SrcImage; + DirectX::Image DstImage; + + SrcImage.width = Width; + SrcImage.height = Height; + SrcImage.format = SrcFormat; + SrcImage.rowPitch = SrcPitch; + SrcImage.slicePitch = Height * SrcPitch; + SrcImage.pixels = (uint8_t*)SrcData; + + DstImage.width = Width; + DstImage.height = Height; + DstImage.format = DstFormat; + DstImage.rowPitch = DstPitch; + DstImage.slicePitch = Height * DstPitch; + DstImage.pixels = (uint8_t*)DstData; + + DirectX::Rect rect(0, 0, Width, Height); + + if (SrcFormat != DstFormat) { + DirectX::ScratchImage ScratchImage; + ScratchImage.Initialize2D(DstFormat, Width, Height, 1, 1); + + hr = DirectX::Convert(SrcImage, DstFormat, DirectX::TEX_FILTER_DEFAULT, 0.0f, ScratchImage); + if (SUCCEEDED(hr)) { + hr = CopyRectangle(*ScratchImage.GetImage(0, 0, 0), rect, DstImage, DirectX::TEX_FILTER_DEFAULT, 0, 0); + } + } else { + hr = CopyRectangle(SrcImage, rect, DstImage, DirectX::TEX_FILTER_DEFAULT, 0, 0); + } + + return hr; +} + + +} /* namespace d3dstate */ diff --git a/retrace/dxgistate.hpp b/retrace/dxgistate.hpp new file mode 100644 index 0000000..f633373 --- /dev/null +++ b/retrace/dxgistate.hpp @@ -0,0 +1,53 @@ +/************************************************************************** + * + * Copyright 2013 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + **************************************************************************/ + +#ifndef _DXGISTATE_HPP_ +#define _DXGISTATE_HPP_ + + +#include + +#include "compat.h" + +#include + + +namespace d3dstate { + + +HRESULT +ConvertFormat(DXGI_FORMAT SrcFormat, + void *SrcData, + UINT SrcPitch, + DXGI_FORMAT DstFormat, + void *DstData, + UINT DstPitch, + UINT Width, UINT Height); + + +} /* namespace d3dstate */ + + +#endif // _DXGISTATE_HPP_ -- 2.43.0