summaryrefslogtreecommitdiffstats
path: root/tools/gfx/d3d11/render-d3d11.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2020-08-21 16:04:42 -0400
committerGitHub <noreply@github.com>2020-08-21 13:04:42 -0700
commitfcac02e405661de311b5ceebbd6d3e2c78bf8aea (patch)
tree6e79865b39f0739d2ac9c3f91cc4129c244b6977 /tools/gfx/d3d11/render-d3d11.cpp
parent49067fd2e97b40649df3fa2ce096f78c2e45da5a (diff)
Vulkan update/NVAPI support (#1511)
* First pass at incorporating nvapi into test harness. * D3d12 Atomic Float Add via NVAPI working * Dx12 atomic float appears to work. * Atomic float add on Dx12. * Added atomic64 feature addition to vk. Fix correct output for atomic-float-byte-address.slang * Disable atomic float failing tests. * Upgraded VK headers. * Detect atomic float availability on VK. * Try to get test working for in64 atomic. * Made HLSL prelude controlled via the render-test requirements. * Added -enable-nvapi to premake. * Fix D3D12Renderer when NVAPI is not available. * Small improvements to VKRenderer. * Improve atomic documentation in target-compatibility.md.
Diffstat (limited to 'tools/gfx/d3d11/render-d3d11.cpp')
-rw-r--r--tools/gfx/d3d11/render-d3d11.cpp101
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);