From 632e26f687a0796a952199c0224315bd84684ba8 Mon Sep 17 00:00:00 2001
From: Philip Rebohle <philip.rebohle@tu-dortmund.de>
Date: Wed, 31 Aug 2022 16:43:55 +0200
Subject: [PATCH] [tests] Remove D3D11 and DXGI tests

---
 tests/d3d11/meson.build              |  10 -
 tests/d3d11/test_d3d11_compute.cpp   | 172 --------
 tests/d3d11/test_d3d11_formats.cpp   | 304 --------------
 tests/d3d11/test_d3d11_map_read.cpp  | 203 ---------
 tests/d3d11/test_d3d11_streamout.cpp | 288 -------------
 tests/d3d11/test_d3d11_triangle.cpp  | 606 ---------------------------
 tests/d3d11/test_d3d11_video.cpp     | 459 --------------------
 tests/d3d11/video_image.raw          | Bin 49152 -> 0 bytes
 tests/dxgi/meson.build               |   3 -
 tests/dxgi/test_dxgi_factory.cpp     | 123 ------
 tests/meson.build                    |   2 -
 11 files changed, 2170 deletions(-)
 delete mode 100644 tests/d3d11/meson.build
 delete mode 100644 tests/d3d11/test_d3d11_compute.cpp
 delete mode 100644 tests/d3d11/test_d3d11_formats.cpp
 delete mode 100644 tests/d3d11/test_d3d11_map_read.cpp
 delete mode 100644 tests/d3d11/test_d3d11_streamout.cpp
 delete mode 100644 tests/d3d11/test_d3d11_triangle.cpp
 delete mode 100644 tests/d3d11/test_d3d11_video.cpp
 delete mode 100644 tests/d3d11/video_image.raw
 delete mode 100644 tests/dxgi/meson.build
 delete mode 100644 tests/dxgi/test_dxgi_factory.cpp

diff --git a/tests/d3d11/meson.build b/tests/d3d11/meson.build
deleted file mode 100644
index 31eba4ee3..000000000
--- a/tests/d3d11/meson.build
+++ /dev/null
@@ -1,10 +0,0 @@
-test_d3d11_deps = [ util_dep, lib_dxgi, lib_d3d11, lib_d3dcompiler_47 ]
-
-executable('d3d11-compute'+exe_ext,   files('test_d3d11_compute.cpp'),   dependencies : test_d3d11_deps, install : true, gui_app : true)
-executable('d3d11-formats'+exe_ext,   files('test_d3d11_formats.cpp'),   dependencies : test_d3d11_deps, install : true, gui_app : true)
-executable('d3d11-map-read'+exe_ext,  files('test_d3d11_map_read.cpp'),  dependencies : test_d3d11_deps, install : true, gui_app : true)
-executable('d3d11-streamout'+exe_ext, files('test_d3d11_streamout.cpp'), dependencies : test_d3d11_deps, install : true, gui_app : true)
-executable('d3d11-triangle'+exe_ext,  files('test_d3d11_triangle.cpp'),  dependencies : test_d3d11_deps, install : true, gui_app : true)
-executable('d3d11-video'+exe_ext,     files('test_d3d11_video.cpp'),     dependencies : test_d3d11_deps, install : true, gui_app : true)
-
-install_data('video_image.raw', install_dir : get_option('bindir'))
\ No newline at end of file
diff --git a/tests/d3d11/test_d3d11_compute.cpp b/tests/d3d11/test_d3d11_compute.cpp
deleted file mode 100644
index 878265819..000000000
--- a/tests/d3d11/test_d3d11_compute.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-#include <cstring>
-
-#include <d3dcompiler.h>
-#include <d3d11.h>
-
-#include <windows.h>
-#include <windowsx.h>
-
-#include "../test_utils.h"
-
-using namespace dxvk;
-
-const std::string g_computeShaderCode =
-  "StructuredBuffer<uint> buf_in : register(t0);\n"
-  "RWStructuredBuffer<uint> buf_out : register(u0);\n"
-  "groupshared uint tmp[64];\n"
-  "[numthreads(64,1,1)]\n"
-  "void main(uint localId : SV_GroupIndex, uint3 globalId : SV_DispatchThreadID) {\n"
-  "  tmp[localId] = buf_in[2 * globalId.x + 0]\n"
-  "               + buf_in[2 * globalId.x + 1];\n"
-  "  GroupMemoryBarrierWithGroupSync();\n"
-  "  uint activeGroups = 32;\n"
-  "  while (activeGroups != 0) {\n"
-  "    if (localId < activeGroups)\n"
-  "      tmp[localId] += tmp[localId + activeGroups];\n"
-  "    GroupMemoryBarrierWithGroupSync();\n"
-  "    activeGroups >>= 1;\n"
-  "  }\n"
-  "  if (localId == 0)\n"
-  "    buf_out[0] = tmp[0];\n"
-  "}\n";
-  
-int WINAPI WinMain(HINSTANCE hInstance,
-                   HINSTANCE hPrevInstance,
-                   LPSTR lpCmdLine,
-                   int nCmdShow) {
-  Com<ID3D11Device>         device;
-  Com<ID3D11DeviceContext>  context;
-  Com<ID3D11ComputeShader>  computeShader;
-  
-  Com<ID3D11Buffer> srcBuffer;
-  Com<ID3D11Buffer> dstBuffer;
-  Com<ID3D11Buffer> readBuffer;
-  
-  Com<ID3D11ShaderResourceView> srcView;
-  Com<ID3D11UnorderedAccessView> dstView;
-  
-  if (FAILED(D3D11CreateDevice(
-        nullptr, D3D_DRIVER_TYPE_HARDWARE,
-        nullptr, 0, nullptr, 0, D3D11_SDK_VERSION,
-        &device, nullptr, &context))) {
-    std::cerr << "Failed to create D3D11 device" << std::endl;
-    return 1;
-  }
-  
-  Com<ID3DBlob> computeShaderBlob;
-  
-  if (FAILED(D3DCompile(
-        g_computeShaderCode.data(),
-        g_computeShaderCode.size(),
-        "Compute shader",
-        nullptr, nullptr,
-        "main", "cs_5_0", 0, 0,
-        &computeShaderBlob,
-        nullptr))) {
-    std::cerr << "Failed to compile compute shader" << std::endl;
-    return 1;
-  }
-  
-  if (FAILED(device->CreateComputeShader(
-        computeShaderBlob->GetBufferPointer(),
-        computeShaderBlob->GetBufferSize(),
-        nullptr, &computeShader))) {
-    std::cerr << "Failed to create compute shader" << std::endl;
-    return 1;
-  }
-  
-  std::array<uint32_t, 128> srcData;
-  for (uint32_t i = 0; i < srcData.size(); i++)
-    srcData[i] = i + 1;
-  
-  D3D11_BUFFER_DESC srcBufferDesc;
-  srcBufferDesc.ByteWidth            = sizeof(uint32_t) * srcData.size();
-  srcBufferDesc.Usage                = D3D11_USAGE_IMMUTABLE;
-  srcBufferDesc.BindFlags            = D3D11_BIND_SHADER_RESOURCE;
-  srcBufferDesc.CPUAccessFlags       = 0;
-  srcBufferDesc.MiscFlags            = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
-  srcBufferDesc.StructureByteStride  = sizeof(uint32_t);
-  
-  D3D11_SUBRESOURCE_DATA srcDataInfo;
-  srcDataInfo.pSysMem          = srcData.data();
-  srcDataInfo.SysMemPitch      = 0;
-  srcDataInfo.SysMemSlicePitch = 0;
-  
-  if (FAILED(device->CreateBuffer(&srcBufferDesc, &srcDataInfo, &srcBuffer))) {
-    std::cerr << "Failed to create source buffer" << std::endl;
-    return 1;
-  }
-  
-  D3D11_BUFFER_DESC dstBufferDesc;
-  dstBufferDesc.ByteWidth            = sizeof(uint32_t);
-  dstBufferDesc.Usage                = D3D11_USAGE_DEFAULT;
-  dstBufferDesc.BindFlags            = D3D11_BIND_UNORDERED_ACCESS;
-  dstBufferDesc.CPUAccessFlags       = 0;
-  dstBufferDesc.MiscFlags            = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
-  dstBufferDesc.StructureByteStride  = sizeof(uint32_t);
-  
-  if (FAILED(device->CreateBuffer(&dstBufferDesc, &srcDataInfo, &dstBuffer))) {
-    std::cerr << "Failed to create destination buffer" << std::endl;
-    return 1;
-  }
-  
-  D3D11_BUFFER_DESC readBufferDesc;
-  readBufferDesc.ByteWidth            = sizeof(uint32_t);
-  readBufferDesc.Usage                = D3D11_USAGE_STAGING;
-  readBufferDesc.BindFlags            = 0;
-  readBufferDesc.CPUAccessFlags       = D3D11_CPU_ACCESS_READ;
-  readBufferDesc.MiscFlags            = 0;
-  readBufferDesc.StructureByteStride  = 0;
-  
-  if (FAILED(device->CreateBuffer(&readBufferDesc, nullptr, &readBuffer))) {
-    std::cerr << "Failed to create readback buffer" << std::endl;
-    return 1;
-  }
-  
-  D3D11_SHADER_RESOURCE_VIEW_DESC srcViewDesc;
-  srcViewDesc.Format                = DXGI_FORMAT_UNKNOWN;
-  srcViewDesc.ViewDimension         = D3D11_SRV_DIMENSION_BUFFEREX;
-  srcViewDesc.BufferEx.FirstElement = 0;
-  srcViewDesc.BufferEx.NumElements  = srcData.size();
-  srcViewDesc.BufferEx.Flags        = 0;
-  
-  if (FAILED(device->CreateShaderResourceView(srcBuffer.ptr(), &srcViewDesc, &srcView))) {
-    std::cerr << "Failed to create shader resource view" << std::endl;
-    return 1;
-  }
-  
-  D3D11_UNORDERED_ACCESS_VIEW_DESC dstViewDesc;
-  dstViewDesc.Format                = DXGI_FORMAT_UNKNOWN;
-  dstViewDesc.ViewDimension         = D3D11_UAV_DIMENSION_BUFFER;
-  dstViewDesc.Buffer.FirstElement   = 0;
-  dstViewDesc.Buffer.NumElements    = 1;
-  dstViewDesc.Buffer.Flags          = 0;
-  
-  if (FAILED(device->CreateUnorderedAccessView(dstBuffer.ptr(), &dstViewDesc, &dstView))) {
-    std::cerr << "Failed to create unordered access view" << std::endl;
-    return 1;
-  }
-  
-  // Compute sum of the source buffer values
-  context->CSSetShader(computeShader.ptr(), nullptr, 0);
-  context->CSSetShaderResources(0, 1, &srcView);
-  context->CSSetUnorderedAccessViews(0, 1, &dstView, nullptr);
-  context->Dispatch(1, 1, 1);
-  
-  // Write data to the readback buffer and query the result
-  context->CopyResource(readBuffer.ptr(), dstBuffer.ptr());
-  
-  D3D11_MAPPED_SUBRESOURCE mappedResource;
-  if (FAILED(context->Map(readBuffer.ptr(), 0, D3D11_MAP_READ, 0, &mappedResource))) {
-    std::cerr << "Failed to map readback buffer" << std::endl;
-    return 1;
-  }
-  
-  uint32_t result = 0;
-  std::memcpy(&result, mappedResource.pData, sizeof(result));
-  context->Unmap(readBuffer.ptr(), 0);
-  
-  std::cout << "Sum of the numbers 1 to " << srcData.size() << " = " << result << std::endl;
-  context->ClearState();
-  return 0;
-}
diff --git a/tests/d3d11/test_d3d11_formats.cpp b/tests/d3d11/test_d3d11_formats.cpp
deleted file mode 100644
index 3ec7f26a5..000000000
--- a/tests/d3d11/test_d3d11_formats.cpp
+++ /dev/null
@@ -1,304 +0,0 @@
-#include <cstring>
-
-#include <d3dcompiler.h>
-#include <d3d11_4.h>
-
-#include <windows.h>
-#include <windowsx.h>
-
-#include "../test_utils.h"
-
-#undef ENUM_NAME
-#define ENUM_NAME(e) case e: return #e;
-
-using namespace dxvk;
-
-std::string GetFormatName(DXGI_FORMAT Format) {
-  switch (Format) {
-    ENUM_NAME(DXGI_FORMAT_UNKNOWN);
-    ENUM_NAME(DXGI_FORMAT_R32G32B32A32_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R32G32B32A32_FLOAT);
-    ENUM_NAME(DXGI_FORMAT_R32G32B32A32_UINT);
-    ENUM_NAME(DXGI_FORMAT_R32G32B32A32_SINT);
-    ENUM_NAME(DXGI_FORMAT_R32G32B32_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R32G32B32_FLOAT);
-    ENUM_NAME(DXGI_FORMAT_R32G32B32_UINT);
-    ENUM_NAME(DXGI_FORMAT_R32G32B32_SINT);
-    ENUM_NAME(DXGI_FORMAT_R16G16B16A16_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R16G16B16A16_FLOAT);
-    ENUM_NAME(DXGI_FORMAT_R16G16B16A16_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R16G16B16A16_UINT);
-    ENUM_NAME(DXGI_FORMAT_R16G16B16A16_SNORM);
-    ENUM_NAME(DXGI_FORMAT_R16G16B16A16_SINT);
-    ENUM_NAME(DXGI_FORMAT_R32G32_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R32G32_FLOAT);
-    ENUM_NAME(DXGI_FORMAT_R32G32_UINT);
-    ENUM_NAME(DXGI_FORMAT_R32G32_SINT);
-    ENUM_NAME(DXGI_FORMAT_R32G8X24_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_D32_FLOAT_S8X24_UINT);
-    ENUM_NAME(DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_X32_TYPELESS_G8X24_UINT);
-    ENUM_NAME(DXGI_FORMAT_R10G10B10A2_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R10G10B10A2_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R10G10B10A2_UINT);
-    ENUM_NAME(DXGI_FORMAT_R11G11B10_FLOAT);
-    ENUM_NAME(DXGI_FORMAT_R8G8B8A8_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R8G8B8A8_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB);
-    ENUM_NAME(DXGI_FORMAT_R8G8B8A8_UINT);
-    ENUM_NAME(DXGI_FORMAT_R8G8B8A8_SNORM);
-    ENUM_NAME(DXGI_FORMAT_R8G8B8A8_SINT);
-    ENUM_NAME(DXGI_FORMAT_R16G16_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R16G16_FLOAT);
-    ENUM_NAME(DXGI_FORMAT_R16G16_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R16G16_UINT);
-    ENUM_NAME(DXGI_FORMAT_R16G16_SNORM);
-    ENUM_NAME(DXGI_FORMAT_R16G16_SINT);
-    ENUM_NAME(DXGI_FORMAT_R32_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_D32_FLOAT);
-    ENUM_NAME(DXGI_FORMAT_R32_FLOAT);
-    ENUM_NAME(DXGI_FORMAT_R32_UINT);
-    ENUM_NAME(DXGI_FORMAT_R32_SINT);
-    ENUM_NAME(DXGI_FORMAT_R24G8_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_D24_UNORM_S8_UINT);
-    ENUM_NAME(DXGI_FORMAT_R24_UNORM_X8_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_X24_TYPELESS_G8_UINT);
-    ENUM_NAME(DXGI_FORMAT_R8G8_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R8G8_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R8G8_UINT);
-    ENUM_NAME(DXGI_FORMAT_R8G8_SNORM);
-    ENUM_NAME(DXGI_FORMAT_R8G8_SINT);
-    ENUM_NAME(DXGI_FORMAT_R16_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R16_FLOAT);
-    ENUM_NAME(DXGI_FORMAT_D16_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R16_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R16_UINT);
-    ENUM_NAME(DXGI_FORMAT_R16_SNORM);
-    ENUM_NAME(DXGI_FORMAT_R16_SINT);
-    ENUM_NAME(DXGI_FORMAT_R8_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_R8_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R8_UINT);
-    ENUM_NAME(DXGI_FORMAT_R8_SNORM);
-    ENUM_NAME(DXGI_FORMAT_R8_SINT);
-    ENUM_NAME(DXGI_FORMAT_A8_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R1_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R9G9B9E5_SHAREDEXP);
-    ENUM_NAME(DXGI_FORMAT_R8G8_B8G8_UNORM);
-    ENUM_NAME(DXGI_FORMAT_G8R8_G8B8_UNORM);
-    ENUM_NAME(DXGI_FORMAT_BC1_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_BC1_UNORM);
-    ENUM_NAME(DXGI_FORMAT_BC1_UNORM_SRGB);
-    ENUM_NAME(DXGI_FORMAT_BC2_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_BC2_UNORM);
-    ENUM_NAME(DXGI_FORMAT_BC2_UNORM_SRGB);
-    ENUM_NAME(DXGI_FORMAT_BC3_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_BC3_UNORM);
-    ENUM_NAME(DXGI_FORMAT_BC3_UNORM_SRGB);
-    ENUM_NAME(DXGI_FORMAT_BC4_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_BC4_UNORM);
-    ENUM_NAME(DXGI_FORMAT_BC4_SNORM);
-    ENUM_NAME(DXGI_FORMAT_BC5_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_BC5_UNORM);
-    ENUM_NAME(DXGI_FORMAT_BC5_SNORM);
-    ENUM_NAME(DXGI_FORMAT_B5G6R5_UNORM);
-    ENUM_NAME(DXGI_FORMAT_B5G5R5A1_UNORM);
-    ENUM_NAME(DXGI_FORMAT_B8G8R8A8_UNORM);
-    ENUM_NAME(DXGI_FORMAT_B8G8R8X8_UNORM);
-    ENUM_NAME(DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM);
-    ENUM_NAME(DXGI_FORMAT_B8G8R8A8_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_B8G8R8A8_UNORM_SRGB);
-    ENUM_NAME(DXGI_FORMAT_B8G8R8X8_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_B8G8R8X8_UNORM_SRGB);
-    ENUM_NAME(DXGI_FORMAT_BC6H_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_BC6H_UF16);
-    ENUM_NAME(DXGI_FORMAT_BC6H_SF16);
-    ENUM_NAME(DXGI_FORMAT_BC7_TYPELESS);
-    ENUM_NAME(DXGI_FORMAT_BC7_UNORM);
-    ENUM_NAME(DXGI_FORMAT_BC7_UNORM_SRGB);
-    default: return std::to_string(Format);
-  }
-}
-
-
-std::string GetFormatFlagName(D3D11_FORMAT_SUPPORT Flag) {
-  switch (Flag) {
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_BUFFER);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_IA_VERTEX_BUFFER);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_SO_BUFFER);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_TEXTURE1D);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_TEXTURE2D);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_TEXTURE3D);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_TEXTURECUBE);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_SHADER_LOAD);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_SHADER_SAMPLE);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_COMPARISON);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_MONO_TEXT);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_MIP);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_MIP_AUTOGEN);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_RENDER_TARGET);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_BLENDABLE);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_DEPTH_STENCIL);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_CPU_LOCKABLE);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_DISPLAY);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_CAST_WITHIN_BIT_LAYOUT);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_SHADER_GATHER);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_BACK_BUFFER_CAST);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_TYPED_UNORDERED_ACCESS_VIEW);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_SHADER_GATHER_COMPARISON);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_DECODER_OUTPUT);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_OUTPUT);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_INPUT);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT_VIDEO_ENCODER);
-    default: return std::to_string(Flag);
-  }
-}
-
-
-std::string GetFormatFlagName2(UINT Flag) {
-  switch (Flag) {
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_ADD);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_BITWISE_OPS);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_COMPARE_STORE_OR_COMPARE_EXCHANGE);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_EXCHANGE);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_SIGNED_MIN_OR_MAX);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_UAV_ATOMIC_UNSIGNED_MIN_OR_MAX);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_UAV_TYPED_LOAD);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_UAV_TYPED_STORE);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_OUTPUT_MERGER_LOGIC_OP);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_TILED);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_SHAREABLE);
-    ENUM_NAME(D3D11_FORMAT_SUPPORT2_MULTIPLANE_OVERLAY);
-    default: return std::to_string(Flag);
-  }
-}
-
-
-int WINAPI WinMain(HINSTANCE hInstance,
-                   HINSTANCE hPrevInstance,
-                   LPSTR lpCmdLine,
-                   int nCmdShow) {
-  Com<ID3D11Device> device;
-  
-  if (FAILED(D3D11CreateDevice(
-        nullptr, D3D_DRIVER_TYPE_HARDWARE,
-        nullptr, 0, nullptr, 0, D3D11_SDK_VERSION,
-        &device, nullptr, nullptr))) {
-    std::cerr << "Failed to create D3D11 device" << std::endl;
-    return 1;
-  }
-
-  D3D11_FEATURE_DATA_THREADING                    featureThreading     = { };
-  D3D11_FEATURE_DATA_DOUBLES                      featureDoubles       = { };
-  D3D11_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT featureMinPrecision  = { };
-  D3D11_FEATURE_DATA_D3D11_OPTIONS                featureD3D11Options  = { };
-  D3D11_FEATURE_DATA_D3D11_OPTIONS1               featureD3D11Options1 = { };
-  D3D11_FEATURE_DATA_D3D11_OPTIONS2               featureD3D11Options2 = { };
-  D3D11_FEATURE_DATA_D3D11_OPTIONS3               featureD3D11Options3 = { };
-  D3D11_FEATURE_DATA_D3D11_OPTIONS4               featureD3D11Options4 = { };
-
-  if (SUCCEEDED(device->CheckFeatureSupport(D3D11_FEATURE_THREADING, &featureThreading, sizeof(featureThreading)))) {
-    std::cout << "D3D11_FEATURE_THREADING:" << std::endl
-              << "  DriverConcurrentCreates:          " << featureThreading.DriverConcurrentCreates << std::endl
-              << "  DriverCommandLists:               " << featureThreading.DriverCommandLists << std::endl;
-  }
-
-  if (SUCCEEDED(device->CheckFeatureSupport(D3D11_FEATURE_DOUBLES, &featureDoubles, sizeof(featureDoubles)))) {
-    std::cout << "D3D11_FEATURE_DOUBLES:" << std::endl
-              << "  DoublePrecisionFloatShaderOps:    " << featureDoubles.DoublePrecisionFloatShaderOps << std::endl;
-  }
-
-  if (SUCCEEDED(device->CheckFeatureSupport(D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT, &featureMinPrecision, sizeof(featureMinPrecision)))) {
-    std::cout << "D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT:" << std::endl
-              << "  PixelShaderMinPrecision:          " << featureMinPrecision.PixelShaderMinPrecision << std::endl
-              << "  AllOtherShaderStagesMinPrecision: " << featureMinPrecision.AllOtherShaderStagesMinPrecision << std::endl;
-  }
-
-  if (SUCCEEDED(device->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &featureD3D11Options, sizeof(featureD3D11Options)))) {
-    std::cout << "D3D11_FEATURE_D3D11_OPTIONS:" << std::endl
-              << "  OutputMergerLogicOp:              " << featureD3D11Options.OutputMergerLogicOp << std::endl
-              << "  UAVOnlyRenderingForcedSampleCount: " << featureD3D11Options.UAVOnlyRenderingForcedSampleCount << std::endl
-              << "  DiscardAPIsSeenByDriver:          " << featureD3D11Options.DiscardAPIsSeenByDriver << std::endl
-              << "  FlagsForUpdateAndCopySeenByDriver: " << featureD3D11Options.FlagsForUpdateAndCopySeenByDriver << std::endl
-              << "  ClearView:                        " << featureD3D11Options.ClearView << std::endl
-              << "  CopyWithOverlap:                  " << featureD3D11Options.CopyWithOverlap << std::endl
-              << "  ConstantBufferPartialUpdate:      " << featureD3D11Options.ConstantBufferPartialUpdate << std::endl
-              << "  ConstantBufferOffsetting:         " << featureD3D11Options.ConstantBufferOffsetting << std::endl
-              << "  MapNoOverwriteOnDynamicConstantBuffer: " << featureD3D11Options.MapNoOverwriteOnDynamicConstantBuffer << std::endl
-              << "  MapNoOverwriteOnDynamicBufferSRV: " << featureD3D11Options.MapNoOverwriteOnDynamicBufferSRV << std::endl
-              << "  MultisampleRTVWithForcedSampleCountOne: " << featureD3D11Options.MultisampleRTVWithForcedSampleCountOne << std::endl
-              << "  SAD4ShaderInstructions:           " << featureD3D11Options.SAD4ShaderInstructions << std::endl
-              << "  ExtendedDoublesShaderInstructions: " << featureD3D11Options.ExtendedDoublesShaderInstructions << std::endl
-              << "  ExtendedResourceSharing:          " << featureD3D11Options.ExtendedResourceSharing << std::endl;
-  }
-
-  if (SUCCEEDED(device->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS1, &featureD3D11Options1, sizeof(featureD3D11Options1)))) {
-    std::cout << "D3D11_FEATURE_D3D11_OPTIONS1:" << std::endl
-              << "  TiledResourcesTier:               " << featureD3D11Options1.TiledResourcesTier << std::endl
-              << "  MinMaxFiltering:                  " << featureD3D11Options1.MinMaxFiltering << std::endl
-              << "  ClearViewAlsoSupportsDepthOnlyFormats: " << featureD3D11Options1.ClearViewAlsoSupportsDepthOnlyFormats << std::endl
-              << "  MapOnDefaultBuffers:              " << featureD3D11Options1.MapOnDefaultBuffers << std::endl;
-
-  }
-
-  if (SUCCEEDED(device->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS2, &featureD3D11Options2, sizeof(featureD3D11Options2)))) {
-    std::cout << "D3D11_FEATURE_D3D11_OPTIONS2:" << std::endl
-              << "  PSSpecifiedStencilRefSupported:   " << featureD3D11Options2.PSSpecifiedStencilRefSupported << std::endl
-              << "  TypedUAVLoadAdditionalFormats:    " << featureD3D11Options2.TypedUAVLoadAdditionalFormats << std::endl
-              << "  ROVsSupported:                    " << featureD3D11Options2.ROVsSupported << std::endl
-              << "  ConservativeRasterizationTier:    " << featureD3D11Options2.ConservativeRasterizationTier << std::endl
-              << "  MapOnDefaultTextures:             " << featureD3D11Options2.MapOnDefaultTextures << std::endl
-              << "  TiledResourcesTier:               " << featureD3D11Options2.TiledResourcesTier << std::endl
-              << "  StandardSwizzle:                  " << featureD3D11Options2.StandardSwizzle << std::endl
-              << "  UnifiedMemoryArchitecture:        " << featureD3D11Options2.UnifiedMemoryArchitecture << std::endl;
-  }
-
-  if (SUCCEEDED(device->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS3, &featureD3D11Options3, sizeof(featureD3D11Options3)))) {
-    std::cout << "D3D11_FEATURE_D3D11_OPTIONS3:" << std::endl
-              << "  VPAndRTArrayIndexFromAnyShaderFeedingRasterizer: " << featureD3D11Options3.VPAndRTArrayIndexFromAnyShaderFeedingRasterizer << std::endl;
-  }
-
-  if (SUCCEEDED(device->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS4, &featureD3D11Options4, sizeof(featureD3D11Options4)))) {
-    std::cout << "D3D11_FEATURE_D3D11_OPTIONS4:" << std::endl
-              << "  ExtendedNV12SharedTextureSupported: " << featureD3D11Options4.ExtendedNV12SharedTextureSupported << std::endl;
-  }
-
-  for (UINT i  = UINT(DXGI_FORMAT_UNKNOWN);
-            i <= UINT(DXGI_FORMAT_BC7_UNORM_SRGB);
-            i++) {
-    DXGI_FORMAT format = DXGI_FORMAT(i);
-    UINT        flags  = 0;
-    
-    std::cout << GetFormatName(format) << ": " << std::endl;
-    
-    if (SUCCEEDED(device->CheckFormatSupport(format, &flags))) {
-      for (uint32_t i = 0; i < 32; i++) {
-        if (flags & (1 << i)) {
-          std::cout << "  "
-                    << GetFormatFlagName(D3D11_FORMAT_SUPPORT(1 << i))
-                    << std::endl;
-        }
-      }
-
-      D3D11_FEATURE_DATA_FORMAT_SUPPORT2 support2 = { };
-      support2.InFormat = format;
-
-      if (SUCCEEDED(device->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2, &support2, sizeof(support2)))) {
-        for (uint32_t i = 0; i < 32; i++) {
-          if (support2.OutFormatSupport2 & (1u << i)) {
-            std::cout << "  "
-                      << GetFormatFlagName2(1u << i)
-                      << std::endl;
-          }
-        }
-      }
-    } else {
-      std::cout << "  Not supported" << std::endl;
-    }
-  }
-  
-  return 0;
-}
diff --git a/tests/d3d11/test_d3d11_map_read.cpp b/tests/d3d11/test_d3d11_map_read.cpp
deleted file mode 100644
index 8e73dc45b..000000000
--- a/tests/d3d11/test_d3d11_map_read.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-#include <array>
-#include <cstring>
-
-#include <d3dcompiler.h>
-#include <d3d11.h>
-
-#include <windows.h>
-#include <windowsx.h>
-
-#include "../test_utils.h"
-
-using namespace dxvk;
-
-const std::string g_vsCode = 
-  "float4 main(float4 v_pos : VS_POSITION) : SV_POSITION {\n"
-  "  return v_pos;\n"
-  "}\n";
-
-Com<ID3D11Device>           g_d3d11Device;
-Com<ID3D11DeviceContext>    g_d3d11Context;
-
-Com<ID3D11VertexShader>     g_vertShader;
-Com<ID3D11InputLayout>      g_inputLayout;
-
-Com<ID3D11Buffer>           g_vertexBuffer;
-
-Com<ID3D11Texture2D>        g_depthRender;
-Com<ID3D11Texture2D>        g_depthRead;
-Com<ID3D11DepthStencilView> g_depthView;
-Com<ID3D11DepthStencilState>g_depthState;
-
-struct Vertex {
-  float x, y, z, w;
-};
-
-int WINAPI WinMain(HINSTANCE hInstance,
-                   HINSTANCE hPrevInstance,
-                   LPSTR lpCmdLine,
-                   int nCmdShow) {
-  if (FAILED(D3D11CreateDevice(
-        nullptr, D3D_DRIVER_TYPE_HARDWARE,
-        nullptr, 0, nullptr, 0, D3D11_SDK_VERSION,
-        &g_d3d11Device, nullptr, &g_d3d11Context))) {
-    std::cerr << "Failed to create D3D11 device" << std::endl;
-    return 1;
-  }
-  
-  Com<ID3DBlob> vsBlob;
-  Com<ID3DBlob> gsBlob;
-
-  if (FAILED(D3DCompile(g_vsCode.data(), g_vsCode.size(),
-      "Vertex shader", nullptr, nullptr, "main", "vs_4_0",
-      0, 0, &vsBlob, nullptr))) {
-    std::cerr << "Failed to compile vertex shader" << std::endl;
-    return 1;
-  }
-
-  if (FAILED(g_d3d11Device->CreateVertexShader(
-      vsBlob->GetBufferPointer(),
-      vsBlob->GetBufferSize(),
-      nullptr, &g_vertShader))) {
-    std::cerr << "Failed to create vertex shader" << std::endl;
-    return 1;
-  }
-
-  std::array<D3D11_INPUT_ELEMENT_DESC, 1> iaElements = {{
-    { "VS_POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-  }};
-
-  if (FAILED(g_d3d11Device->CreateInputLayout(
-      iaElements.data(),
-      iaElements.size(),
-      vsBlob->GetBufferPointer(),
-      vsBlob->GetBufferSize(),
-      &g_inputLayout))) {
-    std::cerr << "Failed to create input layout" << std::endl;
-    return 1;
-  }
-
-  std::array<Vertex, 4> vertexData = {{
-    { -1.0f, -1.0f, 0.00f, 1.0f },
-    { -1.0f,  1.0f, 0.66f, 1.0f },
-    {  1.0f, -1.0f, 0.33f, 1.0f },
-    {  1.0f,  1.0f, 1.00f, 1.0f },
-  }};
-
-  D3D11_BUFFER_DESC vertexDesc;
-  vertexDesc.ByteWidth           = vertexData.size() * sizeof(Vertex);
-  vertexDesc.Usage               = D3D11_USAGE_IMMUTABLE;
-  vertexDesc.BindFlags           = D3D11_BIND_VERTEX_BUFFER;
-  vertexDesc.CPUAccessFlags      = 0;
-  vertexDesc.MiscFlags           = 0;
-  vertexDesc.StructureByteStride = 0;
-
-  D3D11_SUBRESOURCE_DATA vertexInfo;
-  vertexInfo.pSysMem             = vertexData.data();
-  vertexInfo.SysMemPitch         = vertexDesc.ByteWidth;
-  vertexInfo.SysMemSlicePitch    = vertexDesc.ByteWidth;
-
-  if (FAILED(g_d3d11Device->CreateBuffer(&vertexDesc, &vertexInfo, &g_vertexBuffer))) {
-    std::cerr << "Failed to create vertex buffer" << std::endl;
-    return 1;
-  }
-
-  D3D11_TEXTURE2D_DESC depthDesc;
-  depthDesc.Width           = 16;
-  depthDesc.Height          = 16;
-  depthDesc.MipLevels       = 1;
-  depthDesc.ArraySize       = 1;
-  depthDesc.Format          = DXGI_FORMAT_D24_UNORM_S8_UINT;
-  // depthDesc.Format          = DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
-  depthDesc.SampleDesc      = { 1, 0 };
-  depthDesc.Usage           = D3D11_USAGE_DEFAULT;
-  depthDesc.BindFlags       = D3D11_BIND_DEPTH_STENCIL;
-  depthDesc.CPUAccessFlags  = 0;
-  depthDesc.MiscFlags       = 0;
-
-  if (FAILED(g_d3d11Device->CreateTexture2D(&depthDesc, nullptr, &g_depthRender))) {
-    std::cerr << "Failed to create render buffer" << std::endl;
-    return 1;
-  }
-
-  depthDesc.Usage           = D3D11_USAGE_STAGING;
-  depthDesc.BindFlags       = 0;
-  depthDesc.CPUAccessFlags  = D3D11_CPU_ACCESS_READ;
-
-  if (FAILED(g_d3d11Device->CreateTexture2D(&depthDesc, nullptr, &g_depthRead))) {
-    std::cerr << "Failed to create readback buffer" << std::endl;
-    return 1;
-  }
-
-  if (FAILED(g_d3d11Device->CreateDepthStencilView(g_depthRender.ptr(), nullptr, &g_depthView))) {
-    std::cerr << "Failed to create depth-stencil view" << std::endl;
-    return 1;
-  }
-
-  D3D11_DEPTH_STENCIL_DESC dsDesc;
-  dsDesc.DepthEnable      = TRUE;
-  dsDesc.DepthWriteMask   = D3D11_DEPTH_WRITE_MASK_ALL;
-  dsDesc.DepthFunc        = D3D11_COMPARISON_ALWAYS;
-  dsDesc.StencilEnable    = FALSE;
-  dsDesc.StencilReadMask  = 0;
-  dsDesc.StencilWriteMask = 0;
-  dsDesc.FrontFace        = { };
-  dsDesc.BackFace         = { };
-
-  if (FAILED(g_d3d11Device->CreateDepthStencilState(&dsDesc, &g_depthState))) {
-    std::cerr << "Failed to create depth-stencil state" << std::endl;
-    return 1;
-  }
-
-  FLOAT omBlendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
-
-  D3D11_VIEWPORT omViewport;
-  omViewport.TopLeftX =  0.0f;
-  omViewport.TopLeftY =  0.0f;
-  omViewport.Width    = 16.0f;
-  omViewport.Height   = 16.0f;
-  omViewport.MinDepth =  0.0f;
-  omViewport.MaxDepth =  1.0f;
-
-  UINT vbOffset = 0;
-  UINT vbStride = sizeof(Vertex);
-
-  g_d3d11Context->RSSetState(nullptr);
-  g_d3d11Context->RSSetViewports(1, &omViewport);
-
-  g_d3d11Context->OMSetRenderTargets(0, nullptr, g_depthView.ptr());
-  g_d3d11Context->OMSetBlendState(nullptr, omBlendFactor, 0xFFFFFFFF);
-  g_d3d11Context->OMSetDepthStencilState(g_depthState.ptr(), 0);
-
-  g_d3d11Context->ClearDepthStencilView(g_depthView.ptr(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.5f, 0x80);
-  
-  g_d3d11Context->IASetInputLayout(g_inputLayout.ptr());
-  g_d3d11Context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
-  g_d3d11Context->IASetVertexBuffers(0, 1, &g_vertexBuffer, &vbStride, &vbOffset);
-
-  g_d3d11Context->VSSetShader(g_vertShader.ptr(), nullptr, 0);
-  g_d3d11Context->Draw(4, 0);
-
-  g_d3d11Context->CopyResource(g_depthRead.ptr(), g_depthRender.ptr());
-
-  D3D11_MAPPED_SUBRESOURCE mapped;
-
-  if (FAILED(g_d3d11Context->Map(g_depthRead.ptr(), 0, D3D11_MAP_READ, 0, &mapped))) {
-    std::cerr << "Failed to map image" << std::endl;
-    return 1;
-  }
-
-  for (uint32_t y = 0; y < 16; y++) {
-    auto data = reinterpret_cast<const uint32_t*>(mapped.pData)
-      + (y * mapped.RowPitch / 4);
-
-    for (uint32_t x = 0; x < 16; x++)
-      std::cout << std::hex << std::setfill('0') << std::setw(8) << data[x] << "  ";
-
-    std::cout << std::endl;
-  }
-
-  g_d3d11Context->Unmap(g_depthRead.ptr(), 0);
-  g_d3d11Context->ClearState();
-  return 0;
-}
diff --git a/tests/d3d11/test_d3d11_streamout.cpp b/tests/d3d11/test_d3d11_streamout.cpp
deleted file mode 100644
index 3ff5f9ec3..000000000
--- a/tests/d3d11/test_d3d11_streamout.cpp
+++ /dev/null
@@ -1,288 +0,0 @@
-#include <array>
-#include <cstring>
-
-#include <d3dcompiler.h>
-#include <d3d11.h>
-
-#include <windows.h>
-#include <windowsx.h>
-
-#include "../test_utils.h"
-
-using namespace dxvk;
-
-const std::string g_vsCode = 
-  "struct VS_IFACE {\n"
-  "  float4 pos : VS_POSITION;\n"
-  "};\n"
-  "VS_IFACE main(VS_IFACE ia_in) {\n"
-  "  return ia_in;\n"
-  "}\n";
-
-const std::string g_gsCode = 
-  "struct GS_IN {\n"
-  "  float4 pos : VS_POSITION;\n"
-  "};\n"
-  "struct GS_OUT_NORMAL {\n"
-  "  float3 nor : GS_NORMAL;\n"
-  "  float  len : GS_LENGTH;\n"
-  "};\n"
-  "[maxvertexcount(1)]\n"
-  "void main(triangle GS_IN vs_in[3], inout PointStream<GS_OUT_NORMAL> o_normals) {\n"
-  "  float3 ds1 = vs_in[1].pos.xyz - vs_in[0].pos.xyz;\n"
-  "  float3 ds2 = vs_in[2].pos.xyz - vs_in[0].pos.xyz;\n"
-  "  float3 cv = cross(ds1, ds2);\n"
-  "  float  cl = length(cv);\n"
-  "  GS_OUT_NORMAL normal;\n"
-  "  normal.nor = cv / cl;\n"
-  "  normal.len = cl;"
-  "  o_normals.Append(normal);\n"
-  "}\n";
-
-Com<ID3D11Device>           g_d3d11Device;
-Com<ID3D11DeviceContext>    g_d3d11Context;
-
-Com<ID3D11VertexShader>     g_vertShader;
-Com<ID3D11GeometryShader>   g_geomShader;
-
-Com<ID3D11InputLayout>      g_inputLayout;
-
-Com<ID3D11Buffer>           g_vertexBuffer;
-Com<ID3D11Buffer>           g_normalBuffer;
-Com<ID3D11Buffer>           g_readBuffer;
-
-Com<ID3D11Query>            g_soStream;
-Com<ID3D11Query>            g_soOverflow;
-
-struct Vertex {
-  float x, y, z, w;
-};
-
-struct Normal {
-  float x, y, z, len;
-};
-
-int WINAPI WinMain(HINSTANCE hInstance,
-                   HINSTANCE hPrevInstance,
-                   LPSTR lpCmdLine,
-                   int nCmdShow) {
-  if (FAILED(D3D11CreateDevice(
-        nullptr, D3D_DRIVER_TYPE_HARDWARE,
-        nullptr, 0, nullptr, 0, D3D11_SDK_VERSION,
-        &g_d3d11Device, nullptr, &g_d3d11Context))) {
-    std::cerr << "Failed to create D3D11 device" << std::endl;
-    return 1;
-  }
-  
-  Com<ID3DBlob> vsBlob;
-  Com<ID3DBlob> gsBlob;
-
-  if (FAILED(D3DCompile(g_vsCode.data(), g_vsCode.size(),
-      "Vertex shader", nullptr, nullptr, "main", "vs_4_0",
-      0, 0, &vsBlob, nullptr))) {
-    std::cerr << "Failed to compile vertex shader" << std::endl;
-    return 1;
-  }
-
-  if (FAILED(D3DCompile(g_gsCode.data(), g_gsCode.size(),
-      "Geometry shader", nullptr, nullptr, "main", "gs_4_0",
-      0, 0, &gsBlob, nullptr))) {
-    std::cerr << "Failed to compile geometry shader" << std::endl;
-    return 1;
-  }
-
-  if (FAILED(g_d3d11Device->CreateVertexShader(
-      vsBlob->GetBufferPointer(),
-      vsBlob->GetBufferSize(),
-      nullptr, &g_vertShader))) {
-    std::cerr << "Failed to create vertex shader" << std::endl;
-    return 1;
-  }
-
-  std::array<D3D11_SO_DECLARATION_ENTRY, 2> soDeclarations = {{
-    { 0, "GS_NORMAL", 0, 0, 3, 0 },
-    { 0, "GS_LENGTH", 0, 0, 1, 0 },
-  }};
-
-  std::array<UINT, 1> soBufferStrides = {{
-    sizeof(Normal),
-  }};
-
-  if (FAILED(g_d3d11Device->CreateGeometryShaderWithStreamOutput(
-      gsBlob->GetBufferPointer(),
-      gsBlob->GetBufferSize(),
-      soDeclarations.data(),
-      soDeclarations.size(),
-      soBufferStrides.data(),
-      soBufferStrides.size(),
-      D3D11_SO_NO_RASTERIZED_STREAM,
-      nullptr, &g_geomShader))) {
-    std::cerr << "Failed to create geometry shader" << std::endl;
-    return 1;
-  }
-
-  std::array<D3D11_INPUT_ELEMENT_DESC, 1> iaElements = {{
-    { "VS_POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-  }};
-
-  if (FAILED(g_d3d11Device->CreateInputLayout(
-      iaElements.data(),
-      iaElements.size(),
-      vsBlob->GetBufferPointer(),
-      vsBlob->GetBufferSize(),
-      &g_inputLayout))) {
-    std::cerr << "Failed to create input layout" << std::endl;
-    return 1;
-  }
-
-  std::array<Vertex, 9> vertexData = {{
-    { 0.0f, 0.0f, 0.0f, 1.0f },
-    { 1.0f, 0.0f, 0.0f, 1.0f },
-    { 0.0f, 1.0f, 0.0f, 1.0f },
-
-    { 0.5f,-1.0f,-0.2f, 1.0f },
-    { 3.2f, 2.0f, 0.0f, 1.0f },
-    {-1.0f,-1.0f, 0.4f, 1.0f },
-
-    { 0.7f,-0.5f,-0.8f, 1.0f },
-    { 1.2f, 1.0f,-1.0f, 1.0f },
-    {-0.1f, 1.0f,-2.7f, 1.0f },
-  }};
-
-  D3D11_BUFFER_DESC vertexDesc;
-  vertexDesc.ByteWidth           = vertexData.size() * sizeof(Vertex);
-  vertexDesc.Usage               = D3D11_USAGE_IMMUTABLE;
-  vertexDesc.BindFlags           = D3D11_BIND_VERTEX_BUFFER;
-  vertexDesc.CPUAccessFlags      = 0;
-  vertexDesc.MiscFlags           = 0;
-  vertexDesc.StructureByteStride = 0;
-
-  D3D11_SUBRESOURCE_DATA vertexInfo;
-  vertexInfo.pSysMem             = vertexData.data();
-  vertexInfo.SysMemPitch         = vertexDesc.ByteWidth;
-  vertexInfo.SysMemSlicePitch    = vertexDesc.ByteWidth;
-
-  if (FAILED(g_d3d11Device->CreateBuffer(&vertexDesc, &vertexInfo, &g_vertexBuffer))) {
-    std::cerr << "Failed to create vertex buffer" << std::endl;
-    return 1;
-  }
-
-  std::array<Normal, 2> normalData = { };
-
-  D3D11_BUFFER_DESC normalDesc;
-  normalDesc.ByteWidth           = normalData.size() * sizeof(Normal);
-  normalDesc.Usage               = D3D11_USAGE_DEFAULT;
-  normalDesc.BindFlags           = D3D11_BIND_STREAM_OUTPUT;
-  normalDesc.CPUAccessFlags      = 0;
-  normalDesc.MiscFlags           = 0;
-  normalDesc.StructureByteStride = 0;
-
-  D3D11_SUBRESOURCE_DATA normalInfo;
-  normalInfo.pSysMem             = normalData.data();
-  normalInfo.SysMemPitch         = normalDesc.ByteWidth;
-  normalInfo.SysMemSlicePitch    = normalDesc.ByteWidth;
-
-  if (FAILED(g_d3d11Device->CreateBuffer(&normalDesc, &normalInfo, &g_normalBuffer))) {
-    std::cerr << "Failed to create normal buffer" << std::endl;
-    return 1;
-  }
-
-  D3D11_BUFFER_DESC readDesc;
-  readDesc.ByteWidth           = normalDesc.ByteWidth;
-  readDesc.Usage               = D3D11_USAGE_STAGING;
-  readDesc.BindFlags           = 0;
-  readDesc.CPUAccessFlags      = D3D11_CPU_ACCESS_READ;
-  readDesc.MiscFlags           = 0;
-  readDesc.StructureByteStride = 0;
-
-  if (FAILED(g_d3d11Device->CreateBuffer(&readDesc, nullptr, &g_readBuffer))) {
-    std::cerr << "Failed to create readback buffer" << std::endl;
-    return 1;
-  }
-
-  D3D11_QUERY_DESC soQueryDesc;
-  soQueryDesc.Query = D3D11_QUERY_SO_STATISTICS_STREAM0;
-  soQueryDesc.MiscFlags = 0;
-
-  if (FAILED(g_d3d11Device->CreateQuery(&soQueryDesc, &g_soStream))) {
-    std::cerr << "Failed to create streamout query" << std::endl;
-    return 1;
-  }
-
-  soQueryDesc.Query = D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM0;
-  if (FAILED(g_d3d11Device->CreateQuery(&soQueryDesc, &g_soOverflow))) {
-    std::cerr << "Failed to create streamout overflow query" << std::endl;
-    return 1;
-  }
-
-  UINT soOffset = 0;
-  UINT vbOffset = 0;
-  UINT vbStride = sizeof(Vertex);
-
-  FLOAT omBlendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
-
-  D3D11_VIEWPORT omViewport;
-  omViewport.TopLeftX =   0.0f;
-  omViewport.TopLeftY =   0.0f;
-  omViewport.Width    = 256.0f;
-  omViewport.Height   = 256.0f;
-  omViewport.MinDepth =   0.0f;
-  omViewport.MaxDepth =   1.0f;
-
-  g_d3d11Context->IASetInputLayout(g_inputLayout.ptr());
-  g_d3d11Context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
-  g_d3d11Context->IASetVertexBuffers(0, 1, &g_vertexBuffer, &vbStride, &vbOffset);
-
-  g_d3d11Context->RSSetState(nullptr);
-  g_d3d11Context->RSSetViewports(1, &omViewport);
-
-  g_d3d11Context->OMSetRenderTargets(0, nullptr, nullptr);
-  g_d3d11Context->OMSetBlendState(nullptr, omBlendFactor, 0xFFFFFFFF);
-  g_d3d11Context->OMSetDepthStencilState(nullptr, 0);
-
-  g_d3d11Context->SOSetTargets(1, &g_normalBuffer, &soOffset);
-  
-  g_d3d11Context->VSSetShader(g_vertShader.ptr(), nullptr, 0);
-  g_d3d11Context->GSSetShader(g_geomShader.ptr(), nullptr, 0);
-  
-  g_d3d11Context->Begin(g_soStream.ptr());
-  g_d3d11Context->Begin(g_soOverflow.ptr());
-
-  g_d3d11Context->Draw(vertexData.size(), 0);
-
-  g_d3d11Context->End(g_soOverflow.ptr());
-  g_d3d11Context->End(g_soStream.ptr());
-
-  g_d3d11Context->CopyResource(
-    g_readBuffer.ptr(),
-    g_normalBuffer.ptr());
-  
-  D3D11_QUERY_DATA_SO_STATISTICS soQueryData = { };
-  BOOL soOverflowData = false;
-  
-  while (g_d3d11Context->GetData(g_soStream.ptr(), &soQueryData, sizeof(soQueryData), 0) != S_OK
-      || g_d3d11Context->GetData(g_soOverflow.ptr(), &soOverflowData, sizeof(soOverflowData), 0) != S_OK)
-    continue;
-  
-  std::cout << "Written:  " << soQueryData.NumPrimitivesWritten << std::endl;
-  std::cout << "Needed:   " << soQueryData.PrimitivesStorageNeeded << std::endl;
-  std::cout << "Overflow: " << (soOverflowData ? "Yes" : "No") << std::endl;
-
-  D3D11_MAPPED_SUBRESOURCE mapInfo;
-
-  if (FAILED(g_d3d11Context->Map(g_readBuffer.ptr(), 0, D3D11_MAP_READ, 0, &mapInfo))) {
-    std::cerr << "Failed to map readback buffer" << std::endl;
-    return 1;
-  }
-
-  std::memcpy(normalData.data(), mapInfo.pData, normalDesc.ByteWidth);
-  g_d3d11Context->Unmap(g_readBuffer.ptr(), 0);
-  
-  for (uint32_t i = 0; i < normalData.size(); i++) {
-    std::cout << i << ": " << normalData[i].x << ","
-      << normalData[i].y << "," << normalData[i].z << ","
-      << normalData[i].len << std::endl;
-  }
-
-  return 0;
-}
diff --git a/tests/d3d11/test_d3d11_triangle.cpp b/tests/d3d11/test_d3d11_triangle.cpp
deleted file mode 100644
index 5c2ea78f0..000000000
--- a/tests/d3d11/test_d3d11_triangle.cpp
+++ /dev/null
@@ -1,606 +0,0 @@
-#include <d3dcompiler.h>
-#include <d3d11_1.h>
-#include <dxgi1_3.h>
-
-#include <windows.h>
-#include <windowsx.h>
-
-#include <cstring>
-#include <string>
-#include <sstream>
-
-#include "../test_utils.h"
-
-using namespace dxvk;
-
-struct Vertex {
-  float x, y;
-};
-
-struct VsConstants {
-  float x, y;
-  float w, h;
-};
-
-struct VsConstantsPad {
-  VsConstants data;
-  uint32_t pad[60];
-};
-
-struct PsConstants {
-  float r, g, b, a;
-};
-
-struct DrawOptions {
-  bool mapDiscardOnce;
-  bool sortByTexture;
-  bool drawIndexed;
-};
-
-const std::string g_vertexShaderCode =
-  "cbuffer vs_cb : register(b0) {\n"
-  "  float2 v_offset;\n"
-  "  float2 v_scale;\n"
-  "};\n"
-  "float4 main(float4 v_pos : IN_POSITION) : SV_POSITION {\n"
-  "  float2 coord = 2.0f * (v_pos * v_scale + v_offset) - 1.0f;\n"
-  "  return float4(coord, 0.0f, 1.0f);\n"
-  "}\n";
-
-const std::string g_pixelShaderCode =
-  "Texture2D<float4> tex0 : register(t0);"
-  "cbuffer ps_cb : register(b0) {\n"
-  "  float4 color;\n"
-  "};\n"
-  "float4 main() : SV_TARGET {\n"
-  "  return color * tex0.Load(int3(0, 0, 0));\n"
-  "}\n";
-
-class TriangleApp {
-  
-public:
-  
-  TriangleApp(HINSTANCE instance, HWND window)
-  : m_window(window) {
-    Com<ID3D11Device> device;
-
-    D3D_FEATURE_LEVEL fl = D3D_FEATURE_LEVEL_11_1;
-
-    HRESULT status = D3D11CreateDevice(
-      nullptr, D3D_DRIVER_TYPE_HARDWARE,
-      nullptr, 0, &fl, 1, D3D11_SDK_VERSION,
-      &device, nullptr, nullptr);
-
-    if (FAILED(status)) {
-      std::cerr << "Failed to create D3D11 device" << std::endl;
-      return;
-    }
-    
-    if (FAILED(device->QueryInterface(IID_PPV_ARGS(&m_device)))) {
-      std::cerr << "Failed to query ID3D11DeviceContext1" << std::endl;
-      return;
-    }
-
-    Com<IDXGIDevice> dxgiDevice;
-
-    if (FAILED(m_device->QueryInterface(IID_PPV_ARGS(&dxgiDevice)))) {
-      std::cerr << "Failed to query DXGI device" << std::endl;
-      return;
-    }
-
-    if (FAILED(dxgiDevice->GetAdapter(&m_adapter))) {
-      std::cerr << "Failed to query DXGI adapter" << std::endl;
-      return;
-    }
-
-    if (FAILED(m_adapter->GetParent(IID_PPV_ARGS(&m_factory)))) {
-      std::cerr << "Failed to query DXGI factory" << std::endl;
-      return;
-    }
-
-    m_device->GetImmediateContext1(&m_context);
-
-    DXGI_SWAP_CHAIN_DESC1 swapDesc;
-    swapDesc.Width          = m_windowSizeW;
-    swapDesc.Height         = m_windowSizeH;
-    swapDesc.Format         = DXGI_FORMAT_R8G8B8A8_UNORM;
-    swapDesc.Stereo         = FALSE;
-    swapDesc.SampleDesc     = { 1, 0 };
-    swapDesc.BufferUsage    = DXGI_USAGE_RENDER_TARGET_OUTPUT;
-    swapDesc.BufferCount    = 3;
-    swapDesc.Scaling        = DXGI_SCALING_STRETCH;
-    swapDesc.SwapEffect     = DXGI_SWAP_EFFECT_FLIP_DISCARD;
-    swapDesc.AlphaMode      = DXGI_ALPHA_MODE_UNSPECIFIED;
-    swapDesc.Flags          = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT
-                            | DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;
-
-    DXGI_SWAP_CHAIN_FULLSCREEN_DESC fsDesc;
-    fsDesc.RefreshRate      = { 0, 0 };
-    fsDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
-    fsDesc.Scaling          = DXGI_MODE_SCALING_UNSPECIFIED;
-    fsDesc.Windowed         = TRUE;
-    
-    Com<IDXGISwapChain1> swapChain;
-    if (FAILED(m_factory->CreateSwapChainForHwnd(m_device.ptr(), m_window, &swapDesc, &fsDesc, nullptr, &swapChain))) {
-      std::cerr << "Failed to create DXGI swap chain" << std::endl;
-      return;
-    }
-    
-    if (FAILED(swapChain->QueryInterface(IID_PPV_ARGS(&m_swapChain)))) {
-      std::cerr << "Failed to query DXGI swap chain interface" << std::endl;
-      return;
-    }
-
-    m_factory->MakeWindowAssociation(m_window, 0);
-
-    Com<ID3DBlob> vertexShaderBlob;
-    Com<ID3DBlob> pixelShaderBlob;
-    
-    if (FAILED(D3DCompile(g_vertexShaderCode.data(), g_vertexShaderCode.size(),
-        "Vertex shader", nullptr, nullptr, "main", "vs_5_0", 0, 0, &vertexShaderBlob, nullptr))) {
-      std::cerr << "Failed to compile vertex shader" << std::endl;
-      return;
-    }
-    
-    if (FAILED(D3DCompile(g_pixelShaderCode.data(), g_pixelShaderCode.size(),
-        "Pixel shader", nullptr, nullptr, "main", "ps_5_0", 0, 0, &pixelShaderBlob, nullptr))) {
-      std::cerr << "Failed to compile pixel shader" << std::endl;
-      return;
-    }
-    
-    if (FAILED(m_device->CreateVertexShader(
-        vertexShaderBlob->GetBufferPointer(),
-        vertexShaderBlob->GetBufferSize(),
-        nullptr, &m_vs))) {
-      std::cerr << "Failed to create vertex shader" << std::endl;
-      return;
-    }
-    
-    if (FAILED(m_device->CreatePixelShader(
-        pixelShaderBlob->GetBufferPointer(),
-        pixelShaderBlob->GetBufferSize(),
-        nullptr, &m_ps))) {
-      std::cerr << "Failed to create pixel shader" << std::endl;
-      return;
-    }
-    
-    std::array<D3D11_INPUT_ELEMENT_DESC, 1> vertexFormatDesc = {{
-      { "IN_POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-    }};
-    
-    if (FAILED(m_device->CreateInputLayout(
-        vertexFormatDesc.data(),
-        vertexFormatDesc.size(),
-        vertexShaderBlob->GetBufferPointer(),
-        vertexShaderBlob->GetBufferSize(),
-        &m_vertexFormat))) {
-      std::cerr << "Failed to create input layout" << std::endl;
-      return;
-    }
-
-    std::array<Vertex, 6> vertexData = {{
-      Vertex { -0.3f, 0.1f },
-      Vertex {  0.5f, 0.9f },
-      Vertex {  1.3f, 0.1f },
-      Vertex { -0.3f, 0.9f },
-      Vertex {  1.3f, 0.9f },
-      Vertex {  0.5f, 0.1f },
-    }};
-
-    D3D11_BUFFER_DESC vboDesc;
-    vboDesc.ByteWidth           = sizeof(vertexData);
-    vboDesc.Usage               = D3D11_USAGE_IMMUTABLE;
-    vboDesc.BindFlags           = D3D11_BIND_VERTEX_BUFFER;
-    vboDesc.CPUAccessFlags      = 0;
-    vboDesc.MiscFlags           = 0;
-    vboDesc.StructureByteStride = 0;
-
-    D3D11_SUBRESOURCE_DATA vboData;
-    vboData.pSysMem             = vertexData.data();
-    vboData.SysMemPitch         = vboDesc.ByteWidth;
-    vboData.SysMemSlicePitch    = vboDesc.ByteWidth;
-
-    if (FAILED(m_device->CreateBuffer(&vboDesc, &vboData, &m_vbo))) {
-      std::cerr << "Failed to create index buffer" << std::endl;
-      return;
-    }
-
-    std::array<uint32_t, 6> indexData = {{ 0, 1, 2, 3, 4, 5 }};
-
-    D3D11_BUFFER_DESC iboDesc;
-    iboDesc.ByteWidth           = sizeof(indexData);
-    iboDesc.Usage               = D3D11_USAGE_IMMUTABLE;
-    iboDesc.BindFlags           = D3D11_BIND_INDEX_BUFFER;
-    iboDesc.CPUAccessFlags      = 0;
-    iboDesc.MiscFlags           = 0;
-    iboDesc.StructureByteStride = 0;
-
-    D3D11_SUBRESOURCE_DATA iboData;
-    iboData.pSysMem             = indexData.data();
-    iboData.SysMemPitch         = iboDesc.ByteWidth;
-    iboData.SysMemSlicePitch    = iboDesc.ByteWidth;
-
-    if (FAILED(m_device->CreateBuffer(&iboDesc, &iboData, &m_ibo))) {
-      std::cerr << "Failed to create index buffer" << std::endl;
-      return;
-    }
-
-    D3D11_BUFFER_DESC cbDesc;
-    cbDesc.ByteWidth            = sizeof(PsConstants);
-    cbDesc.Usage                = D3D11_USAGE_DYNAMIC;
-    cbDesc.BindFlags            = D3D11_BIND_CONSTANT_BUFFER;
-    cbDesc.CPUAccessFlags       = D3D11_CPU_ACCESS_WRITE;
-    cbDesc.MiscFlags            = 0;
-    cbDesc.StructureByteStride  = 0;
-
-    if (FAILED(m_device->CreateBuffer(&cbDesc, nullptr, &m_cbPs))) {
-      std::cerr << "Failed to create constant buffer" << std::endl;
-      return;
-    }
-
-    cbDesc.ByteWidth            = sizeof(VsConstantsPad) * 128 * 8;
-
-    if (FAILED(m_device->CreateBuffer(&cbDesc, nullptr, &m_cbVs))) {
-      std::cerr << "Failed to create constant buffer" << std::endl;
-      return;
-    }
-
-    std::array<uint32_t, 2> colors = { 0xFFFFFFFF, 0xFFC0C0C0 };
-
-    D3D11_SUBRESOURCE_DATA texData;
-    texData.pSysMem             = &colors[0];
-    texData.SysMemPitch         = sizeof(colors[0]);
-    texData.SysMemSlicePitch    = sizeof(colors[0]);
-
-    D3D11_TEXTURE2D_DESC texDesc;
-    texDesc.Width               = 1;
-    texDesc.Height              = 1;
-    texDesc.MipLevels           = 1;
-    texDesc.ArraySize           = 1;
-    texDesc.Format              = DXGI_FORMAT_R8G8B8A8_UNORM;
-    texDesc.SampleDesc          = { 1, 0 };
-    texDesc.Usage               = D3D11_USAGE_IMMUTABLE;
-    texDesc.BindFlags           = D3D11_BIND_SHADER_RESOURCE;
-    texDesc.CPUAccessFlags      = 0;
-    texDesc.MiscFlags           = 0;
-
-    if (FAILED(m_device->CreateTexture2D(&texDesc, &texData, &m_tex0))) {
-      std::cerr << "Failed to create texture" << std::endl;
-      return;
-    }
-
-    texData.pSysMem             = &colors[1];
-
-    if (FAILED(m_device->CreateTexture2D(&texDesc, &texData, &m_tex1))) {
-      std::cerr << "Failed to create texture" << std::endl;
-      return;
-    }
-
-    if (FAILED(m_device->CreateShaderResourceView(m_tex0.ptr(), nullptr, &m_srv0))
-     || FAILED(m_device->CreateShaderResourceView(m_tex1.ptr(), nullptr, &m_srv1))) {
-      std::cerr << "Failed to create SRV" << std::endl;
-      return;
-    }
-
-    m_initialized = true;
-  }
-  
-  
-  ~TriangleApp() {
-    m_context->ClearState();
-  }
-  
-  
-  bool run() {
-    if (!m_initialized)
-      return false;
-
-    if (m_occluded && (m_occluded = isOccluded()))
-      return true;
-
-    if (!beginFrame())
-      return true;
-
-    std::array<PsConstants, 2> colors = {{
-      PsConstants { 0.25f, 0.25f, 0.25f, 1.0f },
-      PsConstants { 0.40f, 0.40f, 0.40f, 1.0f },
-    }};
-
-    for (uint32_t i = 0; i < 8; i++) {
-      DrawOptions options;
-      options.sortByTexture = i & 1;
-      options.drawIndexed = i & 2;
-      options.mapDiscardOnce = i & 4;
-      drawLines(colors[i & 1], options, i);
-    }
-
-    if (!endFrame())
-      return false;
-
-    updateFps();
-    return true;
-  }
-
-
-  void drawLines(const PsConstants& psData, const DrawOptions& options, uint32_t baseY) {
-    D3D11_MAPPED_SUBRESOURCE sr;
-
-    // Update color for the row
-    m_context->PSSetConstantBuffers(0, 1, &m_cbPs);
-    m_context->Map(m_cbPs.ptr(), 0, D3D11_MAP_WRITE_DISCARD, 0, &sr);
-    std::memcpy(sr.pData, &psData, sizeof(psData));
-    m_context->Unmap(m_cbPs.ptr(), 0);
-
-    baseY *= 8;
-
-    if (options.mapDiscardOnce) {
-      uint32_t drawIndex = 0;
-
-      // Discard and map the entire vertex constant buffer
-      // once, then bind sub-ranges while emitting draw calls
-      m_context->Map(m_cbVs.ptr(), 0, D3D11_MAP_WRITE_DISCARD, 0, &sr);
-      auto vsData = reinterpret_cast<VsConstantsPad*>(sr.pData);
-
-      for (uint32_t y = 0; y < 8; y++) {
-        for (uint32_t x = 0; x < 128; x++)
-          vsData[drawIndex++].data = getVsConstants(x, baseY + y);
-      }
-
-      m_context->Unmap(m_cbVs.ptr(), 0);
-    }
-
-    if (options.drawIndexed)
-      m_context->IASetIndexBuffer(m_ibo.ptr(), DXGI_FORMAT_R32_UINT, 0);
-
-    uint32_t vsStride = sizeof(Vertex);
-    uint32_t vsOffset = 0;
-    m_context->IASetVertexBuffers(0, 1, &m_vbo, &vsStride, &vsOffset);
-
-    uint32_t maxZ = options.sortByTexture ? 2 : 1;
-
-    for (uint32_t z = 0; z < maxZ; z++) {
-      uint32_t drawIndex = z;
-
-      if (options.sortByTexture) {
-        ID3D11ShaderResourceView* view = z ? m_srv1.ptr() : m_srv0.ptr();
-        m_context->PSSetShaderResources(0, 1, &view);
-      }
-
-      for (uint32_t y = 0; y < 8; y++) {
-        for (uint32_t x = z; x < 128; x += maxZ) {
-          uint32_t triIndex = (x ^ y) & 1;
-
-          if (!options.mapDiscardOnce) {
-            D3D11_MAP mapMode = drawIndex ? D3D11_MAP_WRITE_NO_OVERWRITE : D3D11_MAP_WRITE_DISCARD;
-            m_context->Map(m_cbVs.ptr(), 0, mapMode, 0, &sr);
-            auto vsData = reinterpret_cast<VsConstantsPad*>(sr.pData);
-            vsData[drawIndex].data = getVsConstants(x, baseY + y);
-            m_context->Unmap(m_cbVs.ptr(), 0);
-          }
-
-          uint32_t constantOffset = 16 * drawIndex;
-          uint32_t constantCount  = 16;
-          m_context->VSSetConstantBuffers1(0, 1, &m_cbVs, &constantOffset, &constantCount);
-
-          if (!options.sortByTexture) {
-            ID3D11ShaderResourceView* view = triIndex ? m_srv1.ptr() : m_srv0.ptr();
-            m_context->PSSetShaderResources(0, 1, &view);
-          }
-
-          // Submit draw call
-          uint32_t baseIndex = 3 * triIndex;
-
-          if (options.drawIndexed)
-            m_context->DrawIndexed(3, baseIndex, 0);
-          else
-            m_context->Draw(3, baseIndex);
-
-          drawIndex += maxZ;
-        }
-      }
-    }
-  }
-
-
-  static VsConstants getVsConstants(uint32_t x, uint32_t y) {
-    VsConstants result;
-    result.x = float(x) / 128.0f;
-    result.y = float(y) / 64.0f;
-    result.w = 1.0f / 128.0f;
-    result.h = 1.0f / 64.0f;
-    return result;
-  }
-
-
-  bool beginFrame() {
-    // Make sure we can actually render to the window
-    RECT windowRect = { 0, 0, 1024, 600 };
-    GetClientRect(m_window, &windowRect);
-    
-    uint32_t newWindowSizeW = uint32_t(windowRect.right - windowRect.left);
-    uint32_t newWindowSizeH = uint32_t(windowRect.bottom - windowRect.top);
-    
-    if (m_windowSizeW != newWindowSizeW || m_windowSizeH != newWindowSizeH) {
-      m_rtv = nullptr;
-      m_context->ClearState();
-
-      DXGI_SWAP_CHAIN_DESC1 desc;
-      m_swapChain->GetDesc1(&desc);
-
-      if (FAILED(m_swapChain->ResizeBuffers(desc.BufferCount,
-          newWindowSizeW, newWindowSizeH, desc.Format, desc.Flags))) {
-        std::cerr << "Failed to resize back buffers" << std::endl;
-        return false;
-      }
-      
-      Com<ID3D11Texture2D> backBuffer;
-      if (FAILED(m_swapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)))) {
-        std::cerr << "Failed to get swap chain back buffer" << std::endl;
-        return false;
-      }
-      
-      D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
-      rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
-      rtvDesc.Format        = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
-      rtvDesc.Texture2D     = { 0u };
-      
-      if (FAILED(m_device->CreateRenderTargetView(backBuffer.ptr(), &rtvDesc, &m_rtv))) {
-        std::cerr << "Failed to create render target view" << std::endl;
-        return false;
-      }
-
-      m_windowSizeW = newWindowSizeW;
-      m_windowSizeH = newWindowSizeH;
-    }
-
-    // Set up render state
-    FLOAT color[4] = { 0.5f, 0.5f, 0.5f, 1.0f };
-    m_context->OMSetRenderTargets(1, &m_rtv, nullptr);
-    m_context->ClearRenderTargetView(m_rtv.ptr(), color);
-
-    m_context->VSSetShader(m_vs.ptr(), nullptr, 0);
-    m_context->PSSetShader(m_ps.ptr(), nullptr, 0);
-
-    m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
-    m_context->IASetInputLayout(m_vertexFormat.ptr());
-
-    D3D11_VIEWPORT viewport;
-    viewport.TopLeftX     = 0.0f;
-    viewport.TopLeftY     = 0.0f;
-    viewport.Width        = float(m_windowSizeW);
-    viewport.Height       = float(m_windowSizeH);
-    viewport.MinDepth     = 0.0f;
-    viewport.MaxDepth     = 1.0f;
-    m_context->RSSetViewports(1, &viewport);
-    return true;
-  }
-
-
-  bool endFrame() {
-    HRESULT hr = m_swapChain->Present(0, DXGI_PRESENT_TEST);
-
-    if (hr == S_OK)
-      hr = m_swapChain->Present(0, 0);
-
-    m_occluded = hr == DXGI_STATUS_OCCLUDED;
-    return true;
-  }
-
-  void updateFps() {
-    if (!m_qpcFrequency.QuadPart)
-      QueryPerformanceFrequency(&m_qpcFrequency);
-
-    if (!m_qpcLastUpdate.QuadPart)
-      QueryPerformanceCounter(&m_qpcLastUpdate);
-
-    LARGE_INTEGER now;
-    QueryPerformanceCounter(&now);
-
-    m_frameCount++;
-
-    if (now.QuadPart - m_qpcLastUpdate.QuadPart < m_qpcFrequency.QuadPart)
-      return;
-
-    double seconds = double(now.QuadPart - m_qpcLastUpdate.QuadPart) / double(m_qpcFrequency.QuadPart);
-    double fps = double(m_frameCount) / seconds;
-
-    std::wstringstream str;
-    str << L"D3D11 triangle (" << fps << L" FPS)";
-
-    SetWindowTextW(m_window, str.str().c_str());
-
-    m_qpcLastUpdate = now;
-    m_frameCount = 0;
-  }
-
-  bool isOccluded() {
-    return m_swapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED;
-  }
-
-private:
-  
-  HWND                          m_window;
-  uint32_t                      m_windowSizeW = 1024;
-  uint32_t                      m_windowSizeH = 600;
-  bool                          m_initialized = false;
-  bool                          m_occluded = false;
-  
-  Com<IDXGIFactory3>            m_factory;
-  Com<IDXGIAdapter>             m_adapter;
-  Com<ID3D11Device1>            m_device;
-  Com<ID3D11DeviceContext1>     m_context;
-  Com<IDXGISwapChain2>          m_swapChain;
-
-  Com<ID3D11RenderTargetView>   m_rtv;
-  Com<ID3D11Buffer>             m_ibo;
-  Com<ID3D11Buffer>             m_vbo;
-  Com<ID3D11InputLayout>        m_vertexFormat;
-
-  Com<ID3D11Texture2D>          m_tex0;
-  Com<ID3D11Texture2D>          m_tex1;
-  Com<ID3D11ShaderResourceView> m_srv0;
-  Com<ID3D11ShaderResourceView> m_srv1;
-  
-  Com<ID3D11Buffer>             m_cbPs;
-  Com<ID3D11Buffer>             m_cbVs;
-
-  Com<ID3D11VertexShader>       m_vs;
-  Com<ID3D11PixelShader>        m_ps;
-
-  LARGE_INTEGER                 m_qpcLastUpdate = { };
-  LARGE_INTEGER                 m_qpcFrequency  = { };
-
-  uint32_t                      m_frameCount = 0;
-  
-};
-
-LRESULT CALLBACK WindowProc(HWND hWnd,
-                            UINT message,
-                            WPARAM wParam,
-                            LPARAM lParam);
-
-int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
-  WNDCLASSEXW wc = { };
-  wc.cbSize = sizeof(wc);
-  wc.style = CS_HREDRAW | CS_VREDRAW;
-  wc.lpfnWndProc = WindowProc;
-  wc.hInstance = hInstance;
-  wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
-  wc.hbrBackground = HBRUSH(COLOR_WINDOW);
-  wc.lpszClassName = L"WindowClass";
-  RegisterClassExW(&wc);
-
-  HWND hWnd = CreateWindowExW(0, L"WindowClass", L"D3D11 triangle",
-    WS_OVERLAPPEDWINDOW, 300, 300, 1024, 600,
-    nullptr, nullptr, hInstance, nullptr);
-  ShowWindow(hWnd, nCmdShow);
-
-  TriangleApp app(hInstance, hWnd);
-
-  MSG msg;
-
-  while (true) {
-    if (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE)) {
-      TranslateMessage(&msg);
-      DispatchMessageW(&msg);
-      
-      if (msg.message == WM_QUIT)
-        return msg.wParam;
-    } else {
-      if (!app.run())
-        break;
-    }
-  }
-
-  return msg.wParam;
-}
-
-LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
-  switch (message) {
-    case WM_CLOSE:
-      PostQuitMessage(0);
-      return 0;
-  }
-
-  return DefWindowProcW(hWnd, message, wParam, lParam);
-}
diff --git a/tests/d3d11/test_d3d11_video.cpp b/tests/d3d11/test_d3d11_video.cpp
deleted file mode 100644
index a974962a4..000000000
--- a/tests/d3d11/test_d3d11_video.cpp
+++ /dev/null
@@ -1,459 +0,0 @@
-#include <d3d11_1.h>
-
-#include <windows.h>
-#include <windowsx.h>
-
-#include <cmath>
-#include <fstream>
-#include <vector>
-
-#include "../test_utils.h"
-
-using namespace dxvk;
-
-class VideoApp {
-  
-public:
-  
-  VideoApp(HINSTANCE instance, HWND window)
-  : m_window(window) {
-    // Create base D3D11 device and swap chain
-    DXGI_SWAP_CHAIN_DESC swapchainDesc = { };
-    swapchainDesc.BufferDesc.Width = m_windowSizeX;
-    swapchainDesc.BufferDesc.Height = m_windowSizeY;
-    swapchainDesc.BufferDesc.RefreshRate = { 0, 0 };
-    swapchainDesc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
-    swapchainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
-    swapchainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
-    swapchainDesc.BufferCount = 2;
-    swapchainDesc.SampleDesc = { 1, 0 };
-    swapchainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
-    swapchainDesc.OutputWindow = m_window;
-    swapchainDesc.Windowed = true;
-    swapchainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
-    swapchainDesc.Flags = 0;
-
-    HRESULT hr = D3D11CreateDeviceAndSwapChain(nullptr,
-      D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0,
-      D3D11_SDK_VERSION, &swapchainDesc, &m_swapchain,
-      &m_device, nullptr, &m_context);
-
-    if (FAILED(hr)) {
-      std::cerr << "Failed to initialize D3D11 device and swap chain" << std::endl;
-      return;
-    }
-
-    if (FAILED(hr = m_device->QueryInterface(IID_PPV_ARGS(&m_vdevice)))) {
-      std::cerr << "Failed to query D3D11 video device" << std::endl;
-      return;
-    }
-
-    if (FAILED(hr = m_context->QueryInterface(IID_PPV_ARGS(&m_vcontext)))) {
-      std::cerr << "Failed to query D3D11 video context" << std::endl;
-      return;
-    }
-
-    if (FAILED(hr = m_swapchain->ResizeTarget(&swapchainDesc.BufferDesc))) {
-      std::cerr << "Failed to resize target" << std::endl;
-      return;
-    }
-
-    if (FAILED(hr = m_swapchain->GetBuffer(0, IID_PPV_ARGS(&m_swapImage)))) {
-      std::cerr << "Failed to query swap chain image" << std::endl;
-      return;
-    }
-
-    if (FAILED(hr = m_device->CreateRenderTargetView(m_swapImage.ptr(), nullptr, &m_swapImageView))) {
-      std::cerr << "Failed to create render target view" << std::endl;
-      return;
-    }
-
-    // Create video processor instance
-    D3D11_VIDEO_PROCESSOR_CONTENT_DESC videoEnumDesc = { };
-    videoEnumDesc.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE;
-    videoEnumDesc.InputFrameRate = { 60, 1 };
-    videoEnumDesc.InputWidth = 128;
-    videoEnumDesc.InputHeight = 128;
-    videoEnumDesc.OutputFrameRate = { 60, 1 };
-    videoEnumDesc.OutputWidth = 256;
-    videoEnumDesc.OutputHeight = 256;
-    videoEnumDesc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL;
-    
-    if (FAILED(hr = m_vdevice->CreateVideoProcessorEnumerator(&videoEnumDesc, &m_venum))) {
-      std::cerr << "Failed to create D3D11 video processor enumerator" << std::endl;
-      return;
-    }
-
-    if (FAILED(hr = m_vdevice->CreateVideoProcessor(m_venum.ptr(), 0, &m_vprocessor))) {
-      std::cerr << "Failed to create D3D11 video processor" << std::endl;
-      return;
-    }
-
-    // Video output image and view
-    D3D11_TEXTURE2D_DESC textureDesc = { };
-    textureDesc.Width = 256;
-    textureDesc.Height = 256;
-    textureDesc.MipLevels = 1;
-    textureDesc.ArraySize = 1;
-    textureDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
-    textureDesc.SampleDesc = { 1, 0 };
-    textureDesc.Usage = D3D11_USAGE_DEFAULT;
-    textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET;
-
-    if (FAILED(hr = m_device->CreateTexture2D(&textureDesc, nullptr, &m_videoOutput))) {
-      std::cerr << "Failed to create D3D11 video output image" << std::endl;
-      return;
-    }
-
-    D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC outputDesc = { };
-    outputDesc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D;
-    outputDesc.Texture2D.MipSlice = 0;
-
-    if (FAILED(hr = m_vdevice->CreateVideoProcessorOutputView(m_videoOutput.ptr(), m_venum.ptr(), &outputDesc, &m_videoOutputView))) {
-      std::cerr << "Failed to create D3D11 video output view" << std::endl;
-      return;
-    }
-
-    if (FAILED(hr = m_device->CreateRenderTargetView(m_videoOutput.ptr(), nullptr, &m_videoOutputRtv))) {
-      std::cerr << "Failed to create video render target view" << std::endl;
-      return;
-    }
-
-    // RGBA input image and view
-    textureDesc.Width = 128;
-    textureDesc.Height = 128;
-    textureDesc.BindFlags = 0;
-
-    size_t pixelCount = textureDesc.Width * textureDesc.Height;
-
-    size_t rowSizeRgba = textureDesc.Width * 4;
-    size_t rowSizeNv12 = textureDesc.Width;
-    size_t rowSizeYuy2 = textureDesc.Width * 2;
-    size_t imageSizeRgba = textureDesc.Height * rowSizeRgba;
-    size_t imageSizeNv12 = pixelCount + pixelCount / 2;
-    size_t imageSizeYuy2 = textureDesc.Height * rowSizeYuy2;
-
-    std::vector<uint8_t> srcData(pixelCount * 3);
-    std::vector<uint8_t> imgDataRgba(imageSizeRgba);
-    std::vector<uint8_t> imgDataNv12(imageSizeNv12);
-    std::vector<uint8_t> imgDataYuy2(imageSizeYuy2);
-    std::ifstream ifile("video_image.raw", std::ios::binary);
-
-    if (!ifile || !ifile.read(reinterpret_cast<char*>(srcData.data()), srcData.size())) {
-      std::cerr << "Failed to read image file" << std::endl;
-      return;
-    }
-
-    for (size_t i = 0; i < pixelCount; i++) {
-      imgDataRgba[4 * i + 0] = srcData[3 * i + 0];
-      imgDataRgba[4 * i + 1] = srcData[3 * i + 1];
-      imgDataRgba[4 * i + 2] = srcData[3 * i + 2];
-      imgDataRgba[4 * i + 3] = 0xFF;
-
-      imgDataNv12[i] = y_coeff(&srcData[3 * i], 0.299000f, 0.587000f, 0.114000f);
-
-      imgDataYuy2[2 * i + 0] = y_coeff(&srcData[3 * i], 0.299000f, 0.587000f, 0.114000f);
-      imgDataYuy2[2 * i + 1] = i % 2
-        ? c_coeff(&srcData[3 * i], -0.168736f, -0.331264f,  0.500000f)
-        : c_coeff(&srcData[3 * i],  0.500000f, -0.418688f, -0.081312f);
-    }
-
-    for (size_t y = 0; y < textureDesc.Height / 2; y++) {
-      for (size_t x = 0; x < textureDesc.Width / 2; x++) {
-        size_t p = textureDesc.Width * (2 * y) + 2 * x;
-        size_t i = pixelCount + textureDesc.Width * y + 2 * x;
-        imgDataNv12[i + 0] = c_coeff(&srcData[3 * p],  0.500000f, -0.418688f, -0.081312f);
-        imgDataNv12[i + 1] = c_coeff(&srcData[3 * p], -0.168736f, -0.331264f,  0.500000f);
-      }
-    }
-
-    D3D11_SUBRESOURCE_DATA subresourceData = { };
-    subresourceData.pSysMem = imgDataRgba.data();
-    subresourceData.SysMemPitch = rowSizeRgba;
-    subresourceData.SysMemSlicePitch = rowSizeRgba * textureDesc.Height;
-
-    if (FAILED(hr = m_device->CreateTexture2D(&textureDesc, &subresourceData, &m_videoInput))) {
-      std::cerr << "Failed to create D3D11 video input image" << std::endl;
-      return;
-    }
-
-    D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC inputDesc = { };
-    inputDesc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D;
-    inputDesc.Texture2D.MipSlice = 0;
-
-    if (FAILED(hr = m_vdevice->CreateVideoProcessorInputView(m_videoInput.ptr(), m_venum.ptr(), &inputDesc, &m_videoInputView))) {
-      std::cerr << "Failed to create D3D11 video input view" << std::endl;
-      return;
-    }
-
-    // NV12 input image and view
-    textureDesc.Format = DXGI_FORMAT_NV12;
-    textureDesc.BindFlags = 0;
-
-    subresourceData.pSysMem = imgDataNv12.data();
-    subresourceData.SysMemPitch = rowSizeNv12;
-    subresourceData.SysMemSlicePitch = rowSizeNv12 * textureDesc.Height;
-
-    if (SUCCEEDED(hr = m_device->CreateTexture2D(&textureDesc, nullptr, &m_videoInputNv12))) {
-      if (FAILED(hr = m_vdevice->CreateVideoProcessorInputView(m_videoInputNv12.ptr(), m_venum.ptr(), &inputDesc, &m_videoInputViewNv12))) {
-        std::cerr << "Failed to create D3D11 video input view for NV12" << std::endl;
-        return;
-      }
-    } else {
-      std::cerr << "NV12 not supported" << std::endl;
-    }
-
-    textureDesc.Usage = D3D11_USAGE_STAGING;
-    textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ;
-
-    if (SUCCEEDED(hr = m_device->CreateTexture2D(&textureDesc, nullptr, &m_videoInputNv12Host))) {
-      D3D11_MAPPED_SUBRESOURCE mr = { };
-      m_context->Map(m_videoInputNv12Host.ptr(), 0, D3D11_MAP_WRITE, D3D11_MAP_FLAG_DO_NOT_WAIT, &mr);
-      memcpy(mr.pData, imgDataNv12.data(), imgDataNv12.size());
-      m_context->Unmap(m_videoInputNv12Host.ptr(), 0);
-      D3D11_BOX box = { 0, 0, 0, 128, 128, 1 };
-      m_context->CopySubresourceRegion(m_videoInputNv12.ptr(), 0, 0, 0, 0, m_videoInputNv12Host.ptr(), 0, &box);
-    }
-
-    // YUY2 input image and view
-    textureDesc.Format = DXGI_FORMAT_YUY2;
-    textureDesc.BindFlags = 0;
-    textureDesc.Usage = D3D11_USAGE_DEFAULT;
-    textureDesc.CPUAccessFlags = 0;
-
-    subresourceData.pSysMem = imgDataYuy2.data();
-    subresourceData.SysMemPitch = rowSizeYuy2;
-    subresourceData.SysMemSlicePitch = imageSizeYuy2;
-
-    if (SUCCEEDED(hr = m_device->CreateTexture2D(&textureDesc, &subresourceData, &m_videoInputYuy2))) {
-      if (FAILED(hr = m_vdevice->CreateVideoProcessorInputView(m_videoInputYuy2.ptr(), m_venum.ptr(), &inputDesc, &m_videoInputViewYuy2))) {
-        std::cerr << "Failed to create D3D11 video input view for YUY2" << std::endl;
-        return;
-      }
-    } else {
-      std::cerr << "YUY2 not supported" << std::endl;
-    }
-
-    m_initialized = true;
-  }
-  
-  
-  ~VideoApp() {
-
-  }
-  
-  
-  void run() {
-    this->adjustBackBuffer();
-
-    float color[4] = { 0.5f, 0.5f, 0.5f, 1.0f };
-    m_context->ClearRenderTargetView(m_swapImageView.ptr(), color);
-
-    // Full range RGB output color space
-    D3D11_VIDEO_PROCESSOR_COLOR_SPACE csOut = { };
-    csOut.Usage     = 0; // Present
-    csOut.RGB_Range = 0; // Full range
-    csOut.Nominal_Range = 1; // Full range
-
-    D3D11_VIDEO_PROCESSOR_COLOR_SPACE csIn = { };
-    csIn.Usage     = 0; // Present
-    csIn.RGB_Range = 0; // Full range
-    csIn.Nominal_Range = 1; // Full range
-    csIn.YCbCr_Matrix = 0; // BT.601
-
-    m_vcontext->VideoProcessorSetStreamAutoProcessingMode(m_vprocessor.ptr(), 0, false);
-    m_vcontext->VideoProcessorSetOutputColorSpace(m_vprocessor.ptr(), &csOut);
-    m_vcontext->VideoProcessorSetStreamColorSpace(m_vprocessor.ptr(), 0, &csIn);
-    blit(m_videoInputView.ptr(), 32, 32);
-    blit(m_videoInputViewNv12.ptr(), 32, 320);
-    blit(m_videoInputViewYuy2.ptr(), 32, 608);
-
-    csIn.RGB_Range = 1; // Limited range
-    csIn.Nominal_Range = 0; // Limited range
-    m_vcontext->VideoProcessorSetStreamColorSpace(m_vprocessor.ptr(), 0, &csIn);
-    blit(m_videoInputView.ptr(), 320, 32);
-    blit(m_videoInputViewNv12.ptr(), 320, 320);
-    blit(m_videoInputViewYuy2.ptr(), 320, 608);
-
-    // Limited range RGB output color space
-    csOut.RGB_Range = 1;
-    csOut.Nominal_Range = 0;
-    m_vcontext->VideoProcessorSetOutputColorSpace(m_vprocessor.ptr(), &csOut);
-
-    csIn.RGB_Range = 0; // Full range
-    csIn.Nominal_Range = 1; // Full range
-    m_vcontext->VideoProcessorSetStreamColorSpace(m_vprocessor.ptr(), 0, &csIn);
-    blit(m_videoInputView.ptr(), 608, 32);
-    blit(m_videoInputViewNv12.ptr(), 608, 320);
-    blit(m_videoInputViewYuy2.ptr(), 608, 608);
-
-    csIn.RGB_Range = 1; // Limited range
-    csIn.Nominal_Range = 0; // Limited range
-    m_vcontext->VideoProcessorSetStreamColorSpace(m_vprocessor.ptr(), 0, &csIn);
-    blit(m_videoInputView.ptr(), 896, 32);
-    blit(m_videoInputViewNv12.ptr(), 896, 320);
-    blit(m_videoInputViewYuy2.ptr(), 896, 608);
-
-    m_swapchain->Present(1, 0);
-  }
-  
-
-  void blit(ID3D11VideoProcessorInputView* pView, uint32_t x, uint32_t y) {
-    if (!pView)
-      return;
-
-    D3D11_VIDEO_PROCESSOR_STREAM stream = { };
-    stream.Enable = true;
-    stream.pInputSurface = pView;
-
-    D3D11_BOX box;
-    box.left = 0;
-    box.top = 0;
-    box.front = 0;
-    box.right = 256;
-    box.bottom = 256;
-    box.back = 1;
-
-    FLOAT red[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
-    m_context->ClearRenderTargetView(m_videoOutputRtv.ptr(), red);
-    m_vcontext->VideoProcessorBlt(m_vprocessor.ptr(), m_videoOutputView.ptr(), 0, 1, &stream);
-    m_context->CopySubresourceRegion(m_swapImage.ptr(), 0, x, y, 0, m_videoOutput.ptr(), 0, &box);
-  }
-
-  
-  void adjustBackBuffer() {
-    RECT windowRect = { };
-    GetClientRect(m_window, &windowRect);
-
-    if (uint32_t(windowRect.right - windowRect.left) != m_windowSizeX
-     || uint32_t(windowRect.bottom - windowRect.top) != m_windowSizeY) {
-      m_windowSizeX = windowRect.right - windowRect.left;
-      m_windowSizeY = windowRect.bottom - windowRect.top;
-
-      m_swapImage = nullptr;
-      m_swapImageView = nullptr;
-
-      HRESULT hr = m_swapchain->ResizeBuffers(0,
-        m_windowSizeX, m_windowSizeY, DXGI_FORMAT_UNKNOWN, 0);
-
-      if (FAILED(hr)) {
-        std::cerr << "Failed to resize swap chain buffer" << std::endl;
-        return;
-      }
-
-      if (FAILED(hr = m_swapchain->GetBuffer(0, IID_PPV_ARGS(&m_swapImage)))) {
-        std::cerr << "Failed to query swap chain image" << std::endl;
-        return;
-      }
-
-      if (FAILED(hr = m_device->CreateRenderTargetView(m_swapImage.ptr(), nullptr, &m_swapImageView))) {
-        std::cerr << "Failed to create render target view" << std::endl;
-        return;
-      }
-    }
-  }
-
-  operator bool () const {
-    return m_initialized;
-  }
-    
-private:
-  
-  HWND                                m_window;
-  uint32_t                            m_windowSizeX = 1280;
-  uint32_t                            m_windowSizeY = 720;
-
-  Com<IDXGISwapChain>                 m_swapchain;
-  Com<ID3D11Device>                   m_device;
-  Com<ID3D11DeviceContext>            m_context;
-  Com<ID3D11VideoDevice>              m_vdevice;
-  Com<ID3D11VideoContext>             m_vcontext;
-  Com<ID3D11VideoProcessorEnumerator> m_venum;
-  Com<ID3D11VideoProcessor>           m_vprocessor;
-  Com<ID3D11Texture2D>                m_swapImage;
-  Com<ID3D11RenderTargetView>         m_swapImageView;
-  Com<ID3D11Texture2D>                m_videoOutput;
-  Com<ID3D11VideoProcessorOutputView> m_videoOutputView;
-  Com<ID3D11RenderTargetView>         m_videoOutputRtv;
-  Com<ID3D11Texture2D>                m_videoInput;
-  Com<ID3D11VideoProcessorInputView>  m_videoInputView;
-  Com<ID3D11Texture2D>                m_videoInputNv12;
-  Com<ID3D11Texture2D>                m_videoInputNv12Host;
-  Com<ID3D11Texture2D>                m_videoInputYuy2;
-  Com<ID3D11VideoProcessorInputView>  m_videoInputViewNv12;
-  Com<ID3D11VideoProcessorInputView>  m_videoInputViewYuy2;
-
-  bool                                m_initialized = false;
-
-  static inline uint8_t y_coeff(const uint8_t* rgb, float r, float g, float b) {
-    float x = (rgb[0] * r + rgb[1] * g + rgb[2] * b) / 255.0f;
-    return 16 + uint8_t(std::roundf(219.0f * std::clamp(x, 0.0f, 1.0f)));
-  }
-
-  static inline uint8_t c_coeff(const uint8_t* rgb, float r, float g, float b) {
-    float x = ((rgb[0] * r + rgb[1] * g + rgb[2] * b) / 255.0f) + 0.5f;
-    return uint8_t(std::roundf(255.0f * std::clamp(x, 0.0f, 1.0f)));
-  }
-
-};
-
-LRESULT CALLBACK WindowProc(HWND hWnd,
-                            UINT message,
-                            WPARAM wParam,
-                            LPARAM lParam);
-
-int WINAPI WinMain(HINSTANCE hInstance,
-                   HINSTANCE hPrevInstance,
-                   LPSTR lpCmdLine,
-                   int nCmdShow) {
-  HWND hWnd;
-  WNDCLASSEXW wc;
-  ZeroMemory(&wc, sizeof(WNDCLASSEX));
-  wc.cbSize = sizeof(WNDCLASSEX);
-  wc.style = CS_HREDRAW | CS_VREDRAW;
-  wc.lpfnWndProc = WindowProc;
-  wc.hInstance = hInstance;
-  wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
-  wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
-  wc.lpszClassName = L"WindowClass1";
-  RegisterClassExW(&wc);
-
-  hWnd = CreateWindowExW(0,
-    L"WindowClass1",
-    L"Our First Windowed Program",
-    WS_OVERLAPPEDWINDOW,
-    300, 300,
-    1280, 720,
-    nullptr,
-    nullptr,
-    hInstance,
-    nullptr);
-  ShowWindow(hWnd, nCmdShow);
-
-  MSG msg;
-  VideoApp app(hInstance, hWnd);
-  
-  while (app) {
-    if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
-      TranslateMessage(&msg);
-      DispatchMessage(&msg);
-      
-      if (msg.message == WM_QUIT)
-        return msg.wParam;
-    } else {
-      app.run();
-    }
-  }
-
-  return 0;
-}
-
-LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
-  switch (message) {
-    case WM_CLOSE:
-      PostQuitMessage(0);
-      return 0;
-  }
-
-  return DefWindowProc(hWnd, message, wParam, lParam);
-}
diff --git a/tests/d3d11/video_image.raw b/tests/d3d11/video_image.raw
deleted file mode 100644
index 7d1b5f38e0e2737f5c8fa77c85e25ead70ef986a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 49152
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

diff --git a/tests/dxgi/meson.build b/tests/dxgi/meson.build
deleted file mode 100644
index 0151d90cb..000000000
--- a/tests/dxgi/meson.build
+++ /dev/null
@@ -1,3 +0,0 @@
-test_dxgi_deps = [ util_dep, lib_dxgi ]
-
-executable('dxgi-factory'+exe_ext, files('test_dxgi_factory.cpp'), dependencies : test_dxgi_deps, install: true, gui_app : true)
diff --git a/tests/dxgi/test_dxgi_factory.cpp b/tests/dxgi/test_dxgi_factory.cpp
deleted file mode 100644
index 526be92ed..000000000
--- a/tests/dxgi/test_dxgi_factory.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-#include <vector>
-
-#include <dxgi.h>
-
-#include <windows.h>
-#include <windowsx.h>
-
-#include "../test_utils.h"
-
-using namespace dxvk;
-
-int WINAPI WinMain(HINSTANCE hInstance,
-                   HINSTANCE hPrevInstance,
-                   LPSTR lpCmdLine,
-                   int nCmdShow) {
-  Com<IDXGIFactory> factory;
-  
-  if (CreateDXGIFactory(__uuidof(IDXGIFactory),
-      reinterpret_cast<void**>(&factory)) != S_OK) {
-    std::cerr << "Failed to create DXGI factory" << std::endl;
-    return 1;
-  }
-  
-  Com<IDXGIAdapter> adapter;
-  
-  for (UINT i = 0; factory->EnumAdapters(i, &adapter) == S_OK; i++) {
-    DXGI_ADAPTER_DESC adapterDesc;
-    
-    if (adapter->GetDesc(&adapterDesc) != S_OK) {
-      std::cerr << "Failed to get DXGI adapter info" << std::endl;
-      return 1;
-    }
-    
-    DXGI_ADAPTER_DESC desc;
-    
-    if (adapter->GetDesc(&desc) != S_OK) {
-      std::cerr << "Failed to get DXGI adapter info" << std::endl;
-      return 1;
-    }
-    
-    std::cout << str::format("Adapter ", i, ":") << std::endl;
-    std::cout << str::format(" ", desc.Description) << std::endl;
-    std::cout << str::format(" Vendor: ", desc.VendorId) << std::endl;
-    std::cout << str::format(" Device: ", desc.DeviceId) << std::endl;
-    std::cout << str::format(" Dedicated RAM: ", desc.DedicatedVideoMemory) << std::endl;
-    std::cout << str::format(" Shared RAM: ", desc.SharedSystemMemory) << std::endl;
-    
-    Com<IDXGIOutput> output;
-    
-    for (UINT j = 0; adapter->EnumOutputs(j, &output) == S_OK; j++) {
-      std::vector<DXGI_MODE_DESC> modes;
-      
-      DXGI_OUTPUT_DESC desc;
-      
-      if (output->GetDesc(&desc) != S_OK) {
-        std::cerr << "Failed to get DXGI output info" << std::endl;
-        return 1;
-      }
-      
-      std::cout << str::format(" Output ", j, ":") << std::endl;
-      std::cout << str::format("  ", desc.DeviceName) << std::endl;
-      std::cout << str::format("  Coordinates: ",
-        desc.DesktopCoordinates.left, ",",
-        desc.DesktopCoordinates.top, ":",
-        desc.DesktopCoordinates.right - desc.DesktopCoordinates.left, "x",
-        desc.DesktopCoordinates.bottom - desc.DesktopCoordinates.top) << std::endl;
-      
-      HRESULT status = S_OK;
-      UINT    displayModeCount = 0;
-      
-      do {
-        if (output->GetDisplayModeList(
-          DXGI_FORMAT_R8G8B8A8_UNORM,
-          DXGI_ENUM_MODES_SCALING,
-          &displayModeCount, nullptr) != S_OK) {
-          std::cerr << "Failed to get DXGI output display mode count" << std::endl;
-          return 1;
-        }
-        
-        modes.resize(displayModeCount);
-        
-        status = output->GetDisplayModeList(
-          DXGI_FORMAT_R8G8B8A8_UNORM,
-          DXGI_ENUM_MODES_SCALING,
-          &displayModeCount, modes.data());
-      } while (status == DXGI_ERROR_MORE_DATA);
-      
-      if (status != S_OK) {
-        std::cerr << "Failed to get DXGI output display mode list" << std::endl;
-        return 1;
-      }
-      
-      for (auto mode : modes) {
-        std::cout << str::format("  ",
-          mode.Width, "x", mode.Height, " @ ",
-          mode.RefreshRate.Numerator / mode.RefreshRate.Denominator,
-          mode.Scaling == DXGI_MODE_SCALING_CENTERED ? " (native)" : "") << std::endl;
-
-        //test matching modes
-        DXGI_MODE_DESC matched_mode{ 0 };
-        status = output->FindClosestMatchingMode(&mode, &matched_mode, nullptr);
-
-        if (status != S_OK) {
-            std::cerr << "Failed to get matching mode" << std::endl;
-            return 1;
-        }
-        
-        if (matched_mode.Width != mode.Width ||
-            matched_mode.Height != mode.Height ||
-            matched_mode.RefreshRate.Numerator != mode.RefreshRate.Numerator ||
-            matched_mode.RefreshRate.Denominator != mode.RefreshRate.Denominator ||
-            matched_mode.Format != mode.Format)
-        {
-            std::cerr << "Matched mode is incorrect" << std::endl;
-            return 1;
-        }
-      }
-    }
-  }
-  
-  return 0;
-}
-
diff --git a/tests/meson.build b/tests/meson.build
index e92b2a03a..d2ec1394a 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -1,3 +1 @@
 subdir('d3d9')
-subdir('d3d11')
-subdir('dxgi')