diff options
Diffstat (limited to 'tools/gfx/d3d11/render-d3d11.cpp')
| -rw-r--r-- | tools/gfx/d3d11/render-d3d11.cpp | 101 |
1 files changed, 98 insertions, 3 deletions
diff --git a/tools/gfx/d3d11/render-d3d11.cpp b/tools/gfx/d3d11/render-d3d11.cpp index 4eba4edaf..8eafd24b4 100644 --- a/tools/gfx/d3d11/render-d3d11.cpp +++ b/tools/gfx/d3d11/render-d3d11.cpp @@ -7,6 +7,7 @@ //WORKING: #include "options.h" #include "../render.h" #include "../d3d/d3d-util.h" +#include "../nvapi/nvapi-util.h" #include "../surface.h" @@ -29,6 +30,13 @@ #include <d3d11_2.h> #include <d3dcompiler.h> +#ifdef GFX_NVAPI +// NVAPI integration is desribed here +// https://developer.nvidia.com/unlocking-gpu-intrinsics-hlsl + +# include "../nvapi/nvapi-include.h" +#endif + // We will use the C standard library just for printing error messages. #include <stdio.h> @@ -52,6 +60,7 @@ public: kMaxRTVs = 8, }; + // Renderer implementation virtual SlangResult initialize(const Desc& desc, void* inWindowHandle) override; virtual const List<String>& getFeatures() override { return m_features; } @@ -102,6 +111,17 @@ public: protected: + class ScopeNVAPI + { + public: + ScopeNVAPI() : m_renderer(nullptr) {} + SlangResult init(D3D11Renderer* renderer, Index regIndex); + ~ScopeNVAPI(); + + protected: + D3D11Renderer* m_renderer; + }; + #if 0 struct BindingDetail { @@ -124,6 +144,7 @@ public: }; #endif + enum class D3D11DescriptorSlotType { ConstantBuffer, @@ -391,6 +412,8 @@ public: float m_clearColor[4] = { 0, 0, 0, 0 }; List<String> m_features; + + bool m_nvapi = false; }; Renderer* createD3D11Renderer() @@ -398,6 +421,44 @@ Renderer* createD3D11Renderer() return new D3D11Renderer(); } +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ScopeNVAPI !!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +SlangResult D3D11Renderer::ScopeNVAPI::init(D3D11Renderer* renderer, Index regIndex) +{ + if (!renderer->m_nvapi) + { + // There is nothing to set as nvapi is not set + return SLANG_OK; + } + +#ifdef GFX_NVAPI + NvAPI_Status nvapiStatus = NvAPI_D3D11_SetNvShaderExtnSlot(renderer->m_device, NvU32(regIndex)); + if (nvapiStatus != NVAPI_OK) + { + return SLANG_FAIL; + } +#endif + + // Record the renderer so it can be freed + m_renderer = renderer; + return SLANG_OK; +} + +D3D11Renderer::ScopeNVAPI::~ScopeNVAPI() +{ + // If the m_renderer is not set, it must not have been set up + if (m_renderer) + { +#ifdef GFX_NVAPI + // Disable the slot used + NvAPI_Status nvapiStatus = NvAPI_D3D11_SetNvShaderExtnSlot(m_renderer->m_device, ~0); + SLANG_ASSERT(nvapiStatus == NVAPI_OK); +#endif + } +} + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!D3D11Renderer !!!!!!!!!!!!!!!!!!!!!!!!!!!!! + /* static */HRESULT D3D11Renderer::captureTextureToSurface(ID3D11Device* device, ID3D11DeviceContext* context, ID3D11Texture2D* texture, Surface& surfaceOut) { if (!context) return E_INVALIDARG; @@ -585,6 +646,30 @@ SlangResult D3D11Renderer::initialize(const Desc& desc, void* inWindowHandle) SLANG_ASSERT(m_immediateContext && m_swapChain && m_device); } + // NVAPI + { + const char* features[] = { "nvapi", "atomic-float", "atomic-int64" }; + bool needsNvapi = false; + for (Index i = 0; i < SLANG_COUNT_OF(features); ++i) + { + if (desc.requiredFeatures.indexOf(features[i]) >= 0) + { + needsNvapi = true; + break; + } + } + + if (needsNvapi && SLANG_SUCCEEDED(NVAPIUtil::initialize())) + { + // TODO(JS): We should test for specific features here. + for (Index i = 0; i < SLANG_COUNT_OF(features); ++i) + { + m_features.add(features[i]); + } + m_nvapi = true; + } + } + // TODO: Add support for debugging to help detect leaks: // // ComPtr<ID3D11Debug> gDebug; @@ -1505,7 +1590,12 @@ Result D3D11Renderer::createProgram(const ShaderProgram::Desc& desc, ShaderProgr auto computeKernel = desc.findKernel(StageType::Compute); ComPtr<ID3D11ComputeShader> computeShader; - SLANG_RETURN_ON_FAIL(m_device->CreateComputeShader(computeKernel->codeBegin, computeKernel->getCodeSize(), nullptr, computeShader.writeRef())); + + { + ScopeNVAPI scopeNVAPI; + SLANG_RETURN_ON_FAIL(scopeNVAPI.init(this, 0)); + SLANG_RETURN_ON_FAIL(m_device->CreateComputeShader(computeKernel->codeBegin, computeKernel->getCodeSize(), nullptr, computeShader.writeRef())); + } RefPtr<ShaderProgramImpl> shaderProgram = new ShaderProgramImpl(); shaderProgram->m_computeShader.swap(computeShader); @@ -1521,8 +1611,13 @@ Result D3D11Renderer::createProgram(const ShaderProgram::Desc& desc, ShaderProgr ComPtr<ID3D11VertexShader> vertexShader; ComPtr<ID3D11PixelShader> pixelShader; - SLANG_RETURN_ON_FAIL(m_device->CreateVertexShader(vertexKernel->codeBegin, vertexKernel->getCodeSize(), nullptr, vertexShader.writeRef())); - SLANG_RETURN_ON_FAIL(m_device->CreatePixelShader(fragmentKernel->codeBegin, fragmentKernel->getCodeSize(), nullptr, pixelShader.writeRef())); + { + ScopeNVAPI scopeNVAPI; + SLANG_RETURN_ON_FAIL(scopeNVAPI.init(this, 0)); + + SLANG_RETURN_ON_FAIL(m_device->CreateVertexShader(vertexKernel->codeBegin, vertexKernel->getCodeSize(), nullptr, vertexShader.writeRef())); + SLANG_RETURN_ON_FAIL(m_device->CreatePixelShader(fragmentKernel->codeBegin, fragmentKernel->getCodeSize(), nullptr, pixelShader.writeRef())); + } RefPtr<ShaderProgramImpl> shaderProgram = new ShaderProgramImpl(); shaderProgram->m_vertexShader.swap(vertexShader); |
