summaryrefslogtreecommitdiffstats
path: root/tools/render-test/render-d3d11.cpp
diff options
context:
space:
mode:
authorYONGH\yongh <yonghe@outlook.com>2017-10-19 18:18:21 -0400
committerYONGH\yongh <yonghe@outlook.com>2017-10-19 18:18:21 -0400
commit8ff7412f988c77f21196b907820b94aa67eb6f21 (patch)
tree27bea95dec68c42e5d3dd924da0cd8fa74f0d9e4 /tools/render-test/render-d3d11.cpp
parent88023aea669f258d66e53eab10215337a7f72853 (diff)
Support running and comparing execution results of compute shaders in testing framework.
Diffstat (limited to 'tools/render-test/render-d3d11.cpp')
-rw-r--r--tools/render-test/render-d3d11.cpp129
1 files changed, 99 insertions, 30 deletions
diff --git a/tools/render-test/render-d3d11.cpp b/tools/render-test/render-d3d11.cpp
index bc86809e6..6e9e04a78 100644
--- a/tools/render-test/render-d3d11.cpp
+++ b/tools/render-test/render-d3d11.cpp
@@ -1,4 +1,4 @@
-// render-d3d11.cpp
+// render-d3d11.cpp
#include "render-d3d11.h"
#include "options.h"
@@ -418,6 +418,12 @@ public:
return this;
}
+ struct D3DBuffer
+ {
+ ID3D11UnorderedAccessView * view = nullptr;
+ ID3D11Buffer * buffer = nullptr;
+ };
+
virtual Buffer* createBuffer(BufferDesc const& desc) override
{
D3D11_BUFFER_DESC dxBufferDesc = { 0 };
@@ -437,6 +443,14 @@ public:
dxBufferDesc.CPUAccessFlags = 0;
break;
+ case BufferFlavor::Storage:
+ dxBufferDesc.Usage = D3D11_USAGE_DEFAULT;
+ dxBufferDesc.BindFlags = D3D11_BIND_UNORDERED_ACCESS;
+ dxBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
+ dxBufferDesc.StructureByteStride = sizeof(float);
+ dxBufferDesc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
+ break;
+
default:
return nullptr;
}
@@ -452,7 +466,20 @@ public:
&dxBuffer);
if(FAILED(hr)) return nullptr;
- return (Buffer*) dxBuffer;
+ D3DBuffer * rs = new D3DBuffer();
+ rs->buffer = dxBuffer;
+ if (desc.flavor == BufferFlavor::Storage)
+ {
+ D3D11_UNORDERED_ACCESS_VIEW_DESC viewDesc;
+ memset(&viewDesc, 0, sizeof(viewDesc));
+ viewDesc.Buffer.FirstElement = 0;
+ viewDesc.Buffer.NumElements = 512;
+ viewDesc.Buffer.Flags = 0;
+ viewDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+ viewDesc.Format = DXGI_FORMAT_UNKNOWN;
+ dxDevice->CreateUnorderedAccessView(dxBuffer, &viewDesc, &rs->view);
+ }
+ return (Buffer*) rs;
}
static DXGI_FORMAT mapFormat(Format format)
@@ -535,7 +562,7 @@ public:
{
auto dxContext = dxImmediateContext;
- auto dxBuffer = (ID3D11Buffer*) buffer;
+ auto dxBuffer = ((D3DBuffer*)buffer)->buffer;
D3D11_MAP dxMapFlavor;
switch( flavor )
@@ -543,7 +570,12 @@ public:
case MapFlavor::WriteDiscard:
dxMapFlavor = D3D11_MAP_WRITE_DISCARD;
break;
-
+ case MapFlavor::HostWrite:
+ dxMapFlavor = D3D11_MAP_WRITE;
+ break;
+ case MapFlavor::HostRead:
+ dxMapFlavor = D3D11_MAP_READ;
+ break;
default:
return nullptr;
}
@@ -563,7 +595,7 @@ public:
{
auto dxContext = dxImmediateContext;
- auto dxBuffer = (ID3D11Buffer*) buffer;
+ auto dxBuffer = ((D3DBuffer*)buffer)->buffer;
dxContext->Unmap(dxBuffer, 0);
}
@@ -609,11 +641,11 @@ public:
dxVertexOffsets[ii] = (UINT) offsets[ii];
}
- auto dxVertexBuffers = (ID3D11Buffer* const*) buffers;
+ auto dxVertexBuffers = (D3DBuffer* const*) buffers;
dxContext->IASetVertexBuffers(
(UINT) startSlot,
- (UINT) slotCount, &dxVertexBuffers[0], &dxVertexStrides[0], &dxVertexOffsets[0]);
+ (UINT) slotCount, &(dxVertexBuffers[0])->buffer, &dxVertexStrides[0], &dxVertexOffsets[0]);
}
virtual void setShaderProgram(ShaderProgram* inProgram) override
@@ -621,7 +653,7 @@ public:
auto dxContext = dxImmediateContext;
auto program = (D3D11ShaderProgram*) inProgram;
-
+ dxContext->CSSetShader(program->dxComputeShader, NULL, 0);
dxContext->VSSetShader(program->dxVertexShader, NULL, 0);
dxContext->PSSetShader(program->dxPixelShader, NULL, 0);
}
@@ -632,14 +664,24 @@ public:
// TODO: actually use those offsets
- auto dxConstantBuffers = (ID3D11Buffer* const*) buffers;
-
+ auto dxConstantBuffers = (D3DBuffer* const*) buffers;
dxContext->VSSetConstantBuffers(
- (UINT) startSlot, (UINT) slotCount, &dxConstantBuffers[0]);
+ (UINT) startSlot, (UINT) slotCount, &dxConstantBuffers[0]->buffer);
dxContext->VSSetConstantBuffers(
- (UINT) startSlot, (UINT) slotCount, &dxConstantBuffers[0]);
+ (UINT) startSlot, (UINT) slotCount, &dxConstantBuffers[0]->buffer);
}
+ virtual void setStorageBuffers(UInt startSlot, UInt slotCount, Buffer* const* buffers, UInt const* offsets) override
+ {
+ auto dxContext = dxImmediateContext;
+
+ // TODO: actually use those offsets
+
+ auto dxStorageBuffers = (D3DBuffer* const*)buffers;
+ dxContext->CSSetUnorderedAccessViews(
+ (UINT)startSlot, (UINT)slotCount, &dxStorageBuffers[0]->view, 0);
+ }
+
virtual void draw(UInt vertexCount, UInt startVertex) override
{
@@ -653,35 +695,62 @@ public:
struct D3D11ShaderProgram
{
- ID3D11VertexShader* dxVertexShader;
- ID3D11PixelShader* dxPixelShader;
+ ID3D11VertexShader* dxVertexShader = nullptr;
+ ID3D11PixelShader* dxPixelShader = nullptr;
+ ID3D11ComputeShader* dxComputeShader = nullptr;
};
virtual ShaderProgram* compileProgram(ShaderCompileRequest const& request) override
{
- auto dxVertexShaderBlob = compileHLSLShader(request.vertexShader.source.path, request.vertexShader.source.text, request.vertexShader .name, request.vertexShader .profile);
- if(!dxVertexShaderBlob) return nullptr;
+ if (request.computeShader.name)
+ {
+ auto dxComputeShaderBlob = compileHLSLShader(request.computeShader.source.path, request.computeShader.source.text, request.computeShader.name, request.computeShader.profile);
+ if (!dxComputeShaderBlob) return nullptr;
+
+ ID3D11ComputeShader* dxComputeShader;
+
+ HRESULT csResult = dxDevice->CreateComputeShader(dxComputeShaderBlob->GetBufferPointer(), dxComputeShaderBlob->GetBufferSize(), nullptr, &dxComputeShader);
+
+ dxComputeShaderBlob->Release();
- auto dxFragmentShaderBlob = compileHLSLShader(request.fragmentShader.source.path, request.fragmentShader.source.text, request.fragmentShader .name, request.fragmentShader .profile);
- if(!dxFragmentShaderBlob) return nullptr;
+ if (FAILED(csResult)) return nullptr;
- ID3D11VertexShader* dxVertexShader;
- ID3D11PixelShader* dxPixelShader;
+ D3D11ShaderProgram* shaderProgram = new D3D11ShaderProgram();
+ shaderProgram->dxComputeShader = dxComputeShader;
+ return (ShaderProgram*)shaderProgram;
+ }
+ else
+ {
+ auto dxVertexShaderBlob = compileHLSLShader(request.vertexShader.source.path, request.vertexShader.source.text, request.vertexShader.name, request.vertexShader.profile);
+ if (!dxVertexShaderBlob) return nullptr;
- HRESULT vsResult = dxDevice->CreateVertexShader( dxVertexShaderBlob ->GetBufferPointer(), dxVertexShaderBlob ->GetBufferSize(), nullptr, &dxVertexShader);
- HRESULT psResult = dxDevice->CreatePixelShader( dxFragmentShaderBlob->GetBufferPointer(), dxFragmentShaderBlob->GetBufferSize(), nullptr, &dxPixelShader);
+ auto dxFragmentShaderBlob = compileHLSLShader(request.fragmentShader.source.path, request.fragmentShader.source.text, request.fragmentShader.name, request.fragmentShader.profile);
+ if (!dxFragmentShaderBlob) return nullptr;
- dxVertexShaderBlob ->Release();
- dxFragmentShaderBlob->Release();
+ ID3D11VertexShader* dxVertexShader;
+ ID3D11PixelShader* dxPixelShader;
- if(FAILED(vsResult)) return nullptr;
- if(FAILED(psResult)) return nullptr;
+ HRESULT vsResult = dxDevice->CreateVertexShader(dxVertexShaderBlob->GetBufferPointer(), dxVertexShaderBlob->GetBufferSize(), nullptr, &dxVertexShader);
+ HRESULT psResult = dxDevice->CreatePixelShader(dxFragmentShaderBlob->GetBufferPointer(), dxFragmentShaderBlob->GetBufferSize(), nullptr, &dxPixelShader);
- D3D11ShaderProgram* shaderProgram = new D3D11ShaderProgram();
- shaderProgram->dxVertexShader = dxVertexShader;
- shaderProgram->dxPixelShader = dxPixelShader;
- return (ShaderProgram*) shaderProgram;
+ dxVertexShaderBlob->Release();
+ dxFragmentShaderBlob->Release();
+
+ if (FAILED(vsResult)) return nullptr;
+ if (FAILED(psResult)) return nullptr;
+
+ D3D11ShaderProgram* shaderProgram = new D3D11ShaderProgram();
+ shaderProgram->dxVertexShader = dxVertexShader;
+ shaderProgram->dxPixelShader = dxPixelShader;
+ return (ShaderProgram*)shaderProgram;
+ }
}
+
+ virtual void dispatchCompute(int x, int y, int z) override
+ {
+ auto dxContext = dxImmediateContext;
+ dxContext->Dispatch(x, y, z);
+ }
};