]> git.cworth.org Git - apitrace/commitdiff
d3d11state: Use DirectXTex for format conversion.
authorJosé Fonseca <jfonseca@vmware.com>
Fri, 7 Dec 2012 15:33:47 +0000 (15:33 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 7 Dec 2012 15:39:42 +0000 (15:39 +0000)
retrace/CMakeLists.txt
retrace/d3d11state_images.cpp

index c6a364f30f42f66a6fdb92f7eda432dff52fef65..26659908ba9bd0bc46a57f6788beb6d5b0e67c87 100644 (file)
@@ -189,7 +189,10 @@ if (WIN32)
     endif ()
 
     if (DirectX_D3D11_INCLUDE_DIR)
-        include_directories (BEFORE SYSTEM ${DirectX_D3D11_INCLUDE_DIR})
+        include_directories (BEFORE SYSTEM
+            ${DirectX_D3D11_INCLUDE_DIR}
+            ${CMAKE_SOURCE_DIR}/thirdparty/directxtex/DirectXTex
+        )
         set (DXGI_MODULES ${DXGI_MODULES} d3d11)
         if (DirectX_D3D11_1_INCLUDE_DIR)
             include_directories (BEFORE SYSTEM ${DirectX_D3D11_1_INCLUDE_DIR})
@@ -238,6 +241,9 @@ if (WIN32)
         retrace_common
         d3dhelpers
     )
+    if (DirectX_D3D11_INCLUDE_DIR)
+        target_link_libraries (d3dretrace directxtex)
+    endif ()
 
     install (TARGETS d3dretrace RUNTIME DESTINATION bin)
 endif ()
index fda85b15f05d8973b76450caed1b9295ed0f8f9c..e08bc29e71c86e295e585df1dd0b777d736d2ee1 100644 (file)
 #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;
+}
+
 
 namespace d3dstate {
 
@@ -144,7 +199,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 +207,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 +216,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 +265,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: