diff --git a/include/fast/backends/gfx_dxgi.h b/include/fast/backends/gfx_dxgi.h index fb720c0ca..608b766de 100644 --- a/include/fast/backends/gfx_dxgi.h +++ b/include/fast/backends/gfx_dxgi.h @@ -116,6 +116,7 @@ class GfxWindowBackendDXGI final : public GfxWindowBackend { #ifdef DECLARE_GFX_DXGI_FUNCTIONS void ThrowIfFailed(HRESULT res); void ThrowIfFailed(HRESULT res, HWND h_wnd, const char* message); +void ThrowWithMessage(HWND h_wnd, const char* message); #endif #endif diff --git a/src/fast/backends/gfx_direct3d11.cpp b/src/fast/backends/gfx_direct3d11.cpp index 1077d2a42..aadc7d9e4 100644 --- a/src/fast/backends/gfx_direct3d11.cpp +++ b/src/fast/backends/gfx_direct3d11.cpp @@ -221,6 +221,13 @@ void GfxRenderingAPIDX11::Init() { mWindowBackend->GetWindowHandle(), "Failed to create per-draw constant buffer."); // Create compute shader that can be used to retrieve depth buffer values + D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS features; + mDevice->CheckFeatureSupport(D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &features, + sizeof(D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS)); + if (features.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x == false) { + ThrowWithMessage(mWindowBackend->GetWindowHandle(), + "D3D device doesn't support compute shaders 4.0 or greater."); + } const char* shader_source = R"( sampler my_sampler : register(s0); @@ -236,7 +243,7 @@ void CSMain(uint3 DTid : SV_DispatchThreadID) { const char* shader_source_msaa = R"( sampler my_sampler : register(s0); -Texture2DMS tex : register(t0); +Texture2DMS tex : register(t0); StructuredBuffer coord : register(t1); RWStructuredBuffer output : register(u0); diff --git a/src/fast/backends/gfx_dxgi.cpp b/src/fast/backends/gfx_dxgi.cpp index ac45102ba..7cf1a75d5 100644 --- a/src/fast/backends/gfx_dxgi.cpp +++ b/src/fast/backends/gfx_dxgi.cpp @@ -1089,5 +1089,11 @@ void ThrowIfFailed(HRESULT res, HWND h_wnd, const char* message) { throw res; } } +void ThrowWithMessage(HWND h_wnd, const char* message) { + char full_message[256]; + sprintf(full_message, message); + MessageBoxA(h_wnd, full_message, "Error", MB_OK | MB_ICONERROR); + throw; +} #endif