]> git.cworth.org Git - apitrace/blobdiff - retrace/dxgistate.cpp
glstate: Dump more object labels.
[apitrace] / retrace / dxgistate.cpp
index 45d46ceac0d13ea71ae2b1e8a10ffa3402eb2562..8dde7d326f28db71fb52f6956225f7e65417379d 100644 (file)
@@ -26,6 +26,8 @@
 
 #include <assert.h>
 
+#include <iostream>
+
 #include "image.hpp"
 
 #include "dxgistate.hpp"
@@ -40,8 +42,10 @@ namespace d3dstate {
 
 
 static DXGI_FORMAT
-ChooseConversionFormat(DXGI_FORMAT Format)
+ChooseConversionFormat(DXGI_FORMAT Format, image::ChannelType &channelType)
 {
+    channelType = image::TYPE_UNORM8;
+
     switch (Format) {
 
     // Float
@@ -56,7 +60,8 @@ ChooseConversionFormat(DXGI_FORMAT Format)
     case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
     case DXGI_FORMAT_BC6H_UF16:
     case DXGI_FORMAT_BC6H_SF16:
-        return DXGI_FORMAT_R8G8B8A8_UNORM;
+        channelType = image::TYPE_FLOAT;
+        return DXGI_FORMAT_R32G32B32A32_FLOAT;
 
     // Unsigned normalized
     case DXGI_FORMAT_R16G16B16A16_UNORM:
@@ -208,11 +213,22 @@ ConvertFormat(DXGI_FORMAT SrcFormat,
 
     DirectX::Rect rect(0, 0, Width, Height);
 
+    hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
+    assert(SUCCEEDED(hr));
+    if (FAILED(hr)) {
+        return hr;
+    }
+
     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 (DirectX::IsCompressed(SrcFormat)) {
+            hr = DirectX::Decompress(SrcImage, DstFormat, ScratchImage);
+        } else {
+            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);
         }
@@ -230,13 +246,14 @@ ConvertImage(DXGI_FORMAT SrcFormat,
              UINT SrcPitch,
              UINT Width, UINT Height)
 {
+    image::ChannelType channelType;
 
-    DXGI_FORMAT DstFormat = ChooseConversionFormat(SrcFormat);
+    DXGI_FORMAT DstFormat = ChooseConversionFormat(SrcFormat, channelType);
     if (DstFormat == DXGI_FORMAT_UNKNOWN) {
         return NULL;
     }
 
-    image::Image *image = new image::Image(Width, Height, 4);
+    image::Image *image = new image::Image(Width, Height, 4, false, channelType);
     if (!image) {
         return NULL;
     }
@@ -249,6 +266,7 @@ ConvertImage(DXGI_FORMAT SrcFormat,
                        image->start(), image->stride(),
                        Width, Height);
     if (FAILED(hr)) {
+        std::cerr << "warning: failed to convert from format " << SrcFormat << " to format " << DstFormat << "\n";
         delete image;
         image = NULL;
     }