summaryrefslogtreecommitdiffstats
path: root/tools/render-test/render-d3d11.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/render-test/render-d3d11.cpp')
-rw-r--r--tools/render-test/render-d3d11.cpp536
1 files changed, 247 insertions, 289 deletions
diff --git a/tools/render-test/render-d3d11.cpp b/tools/render-test/render-d3d11.cpp
index 18e41db7e..a0c4956f2 100644
--- a/tools/render-test/render-d3d11.cpp
+++ b/tools/render-test/render-d3d11.cpp
@@ -9,8 +9,6 @@
#include <slang.h>
-#include "slang-support.h"
-
#include "../../source/core/slang-com-ptr.h"
#ifdef _MSC_VER
@@ -56,9 +54,8 @@ public:
virtual TextureResource* createTextureResource(Resource::Type type, Resource::Usage initialUsage, const TextureResource::Desc& desc, const TextureResource::Data* initData) override;
virtual BufferResource* createBufferResource(Resource::Usage initialUsage, const BufferResource::Desc& bufferDesc, const void* initData) override;
virtual SlangResult captureScreenShot(char const* outputPath) override;
- virtual void serializeOutput(BindingState* state, const char* fileName) override;
virtual InputLayout* createInputLayout( const InputElementDesc* inputElements, UInt inputElementCount) override;
- virtual BindingState * createBindingState(const ShaderInputLayout& layout) override;
+ virtual BindingState* createBindingState(const BindingState::Desc& desc) override;
virtual ShaderCompiler* getShaderCompiler() override;
virtual void* map(BufferResource* buffer, MapFlavor flavor) override;
virtual void unmap(BufferResource* buffer) override;
@@ -78,27 +75,28 @@ public:
protected:
- struct Binding
+ struct BindingDetail
{
- ShaderInputType type;
- InputBufferType bufferType; // Only valid if `type` is `Buffer`
-
- ComPtr<ID3D11ShaderResourceView> srv;
- ComPtr<ID3D11UnorderedAccessView> uav;
- ComPtr<ID3D11SamplerState> samplerState;
-
- RefPtr<Resource> resource; /// Can hold texture of buffer
+ ComPtr<ID3D11ShaderResourceView> m_srv;
+ ComPtr<ID3D11UnorderedAccessView> m_uav;
+ ComPtr<ID3D11SamplerState> m_samplerState;
- int binding = 0;
- bool isOutput = false;
+ int m_binding = 0;
};
class BindingStateImpl: public BindingState
{
public:
- List<Binding> m_bindings;
- int m_numRenderTargets = 0;
+ typedef BindingState Parent;
+
+ /// Ctor
+ BindingStateImpl(const Desc& desc):
+ Parent(desc)
+ {}
+
+ List<BindingDetail> m_bindingDetails;
};
+
class ShaderProgramImpl: public ShaderProgram
{
public:
@@ -146,16 +144,6 @@ public:
/// Capture a texture to a file
static HRESULT captureTextureToFile(ID3D11Device* device, ID3D11DeviceContext* context, ID3D11Texture2D* texture, char const* outputPath);
- //void* map(ID3D11Buffer* buffer, MapFlavor flavor);
- //void unmap(ID3D11Buffer* buffer);
-
- Result createInputBuffer(const InputBufferDesc& bufferDesc, bool isOutput, const List<unsigned int>& bufferData,
- RefPtr<Resource>& resourceOut, ComPtr<ID3D11UnorderedAccessView>& viewOut, ComPtr<ID3D11ShaderResourceView>& srvOut);
-
- Result createInputTexture(const InputTextureDesc& inputDesc, RefPtr<Resource>& resourceOut, ComPtr<ID3D11ShaderResourceView>& viewOut);
-
- Result createInputSampler(const InputSamplerDesc& inputDesc, ComPtr<ID3D11SamplerState>& stateOut);
-
void applyBindingState(bool isCompute);
ComPtr<IDXGISwapChain> m_swapChain;
@@ -871,283 +859,284 @@ void D3D11Renderer::dispatchCompute(int x, int y, int z)
m_immediateContext->Dispatch(x, y, z);
}
-Result D3D11Renderer::createInputBuffer(const InputBufferDesc& bufferDesc, bool isOutput, const List<unsigned int>& bufferData,
- RefPtr<Resource>& resourceOut, ComPtr<ID3D11UnorderedAccessView>& viewOut, ComPtr<ID3D11ShaderResourceView>& srvOut)
+BindingState* D3D11Renderer::createBindingState(const BindingState::Desc& bindingStateDesc)
{
- const size_t bufferSize = bufferData.Count() * sizeof(unsigned int);
- RefPtr<BufferResource> bufferResource;
- SLANG_RETURN_ON_FAIL(createInputBufferResource(bufferDesc, isOutput, bufferSize, bufferData.Buffer(), this, bufferResource));
-
- BufferResourceImpl* bufferImpl = static_cast<BufferResourceImpl*>(bufferResource.Ptr());
-
- const int elemSize = bufferDesc.stride <= 0 ? 1 : bufferDesc.stride;
- if (bufferDesc.type == InputBufferType::StorageBuffer)
- {
- D3D11_UNORDERED_ACCESS_VIEW_DESC viewDesc;
- memset(&viewDesc, 0, sizeof(viewDesc));
- viewDesc.Buffer.FirstElement = 0;
- viewDesc.Buffer.NumElements = (UINT)(bufferData.Count() * sizeof(unsigned int) / elemSize);
- viewDesc.Buffer.Flags = 0;
- viewDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
- viewDesc.Format = DXGI_FORMAT_UNKNOWN;
-
- if (bufferDesc.stride == 0)
- {
- // TODO: are there UAV cases we need to handle that are neither
- // raw nor structured? RWBuffer<T> would be one...
+ RefPtr<BindingStateImpl> bindingState(new BindingStateImpl(bindingStateDesc));
- viewDesc.Buffer.Flags |= D3D11_BUFFER_UAV_FLAG_RAW;
- viewDesc.Format = DXGI_FORMAT_R32_TYPELESS;
- }
+ const auto& srcBindings = bindingStateDesc.m_bindings;
+ const int numBindings = int(srcBindings.Count());
+
+ auto& dstDetails = bindingState->m_bindingDetails;
+ dstDetails.SetSize(numBindings);
- SLANG_RETURN_ON_FAIL(m_device->CreateUnorderedAccessView(bufferImpl->m_buffer, &viewDesc, viewOut.writeRef()));
- }
- if (bufferDesc.type != InputBufferType::ConstantBuffer)
+ for (int i = 0; i < numBindings; ++i)
{
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- memset(&srvDesc, 0, sizeof(srvDesc));
- srvDesc.Buffer.FirstElement = 0;
- srvDesc.Buffer.ElementWidth = elemSize;
- srvDesc.Buffer.NumElements = (UINT)(bufferData.Count() * sizeof(unsigned int) / elemSize);
- srvDesc.Buffer.ElementOffset = 0;
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
- srvDesc.Format = DXGI_FORMAT_UNKNOWN;
-
- if (bufferDesc.stride == 0)
- {
- srvDesc.Format = DXGI_FORMAT_R32_FLOAT;
- }
-
- SLANG_RETURN_ON_FAIL(m_device->CreateShaderResourceView(bufferImpl->m_buffer, &srvDesc, srvOut.writeRef()));
- }
+ auto& dstDetail = dstDetails[i];
+ const auto& srcBinding = srcBindings[i];
+
+ dstDetail.m_binding = bindingStateDesc.getFirst(BindingState::ShaderStyle::Hlsl, srcBinding.registerDesc);
- resourceOut = bufferResource;
+ switch (srcBinding.bindingType)
+ {
+ case BindingType::Buffer:
+ {
+ assert(srcBinding.resource && srcBinding.resource->isBuffer());
- return SLANG_OK;
-}
+ BufferResourceImpl* buffer = static_cast<BufferResourceImpl*>(srcBinding.resource.Ptr());
+ const BufferResource::Desc& bufferDesc = buffer->getDesc();
-Result D3D11Renderer::createInputTexture(const InputTextureDesc& inputDesc, RefPtr<Resource>& resourceOut, ComPtr<ID3D11ShaderResourceView>& viewOut)
-{
- ComPtr<ID3D11ShaderResourceView> view;
+ const int elemSize = bufferDesc.elementSize <= 0 ? 1 : bufferDesc.elementSize;
- int bindFlags = 0;
+ if (bufferDesc.bindFlags & Resource::BindFlag::UnorderedAccess)
+ {
+ D3D11_UNORDERED_ACCESS_VIEW_DESC viewDesc;
+ memset(&viewDesc, 0, sizeof(viewDesc));
+ viewDesc.Buffer.FirstElement = 0;
+ viewDesc.Buffer.NumElements = (UINT)(bufferDesc.sizeInBytes / elemSize);
+ viewDesc.Buffer.Flags = 0;
+ viewDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+ viewDesc.Format = DXGI_FORMAT_UNKNOWN;
+
+ if (bufferDesc.elementSize == 0)
+ {
+ // TODO: are there UAV cases we need to handle that are neither
+ // raw nor structured? RWBuffer<T> would be one...
+
+ viewDesc.Buffer.Flags |= D3D11_BUFFER_UAV_FLAG_RAW;
+ viewDesc.Format = DXGI_FORMAT_R32_TYPELESS;
+ }
+
+ SLANG_RETURN_NULL_ON_FAIL(m_device->CreateUnorderedAccessView(buffer->m_buffer, &viewDesc, dstDetail.m_uav.writeRef()));
+ }
+ if (bufferDesc.bindFlags & (Resource::BindFlag::NonPixelShaderResource | Resource::BindFlag::PixelShaderResource))
+ {
+ D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
+ memset(&viewDesc, 0, sizeof(viewDesc));
+ viewDesc.Buffer.FirstElement = 0;
+ viewDesc.Buffer.ElementWidth = elemSize;
+ viewDesc.Buffer.NumElements = (UINT)(bufferDesc.sizeInBytes / elemSize);
+ viewDesc.Buffer.ElementOffset = 0;
+ viewDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
+ viewDesc.Format = DXGI_FORMAT_UNKNOWN;
+
+ if (bufferDesc.elementSize == 0)
+ {
+ viewDesc.Format = DXGI_FORMAT_R32_FLOAT;
+ }
+
+ SLANG_RETURN_NULL_ON_FAIL(m_device->CreateShaderResourceView(buffer->m_buffer, &viewDesc, dstDetail.m_srv.writeRef()));
+ }
+ break;
+ }
+ case BindingType::Texture:
+ case BindingType::CombinedTextureSampler:
+ {
+ assert(srcBinding.resource && srcBinding.resource->isTexture());
+
+ TextureResourceImpl* texture = static_cast<TextureResourceImpl*>(srcBinding.resource.Ptr());
- RefPtr<TextureResource> texture;
- SLANG_RETURN_ON_FAIL(generateTextureResource(inputDesc, bindFlags, this, texture));
+ const TextureResource::Desc& textureDesc = texture->getDesc();
- //DXGI_FORMAT format = textureImpl->m_resource->GetD
- const TextureResource::Desc& textureDesc = texture->getDesc();
+ D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
+ viewDesc.Format = D3DUtil::getMapFormat(textureDesc.format);
- DXGI_FORMAT format = D3DUtil::getMapFormat(textureDesc.format);
+ switch (texture->getType())
+ {
+ case Resource::Type::Texture1D:
+ {
+ if (textureDesc.arraySize <= 0)
+ {
+ viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D;
+ viewDesc.Texture1D.MipLevels = textureDesc.numMipLevels;
+ viewDesc.Texture1D.MostDetailedMip = 0;
+ }
+ else
+ {
+ viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY;
+ viewDesc.Texture1DArray.ArraySize = textureDesc.arraySize;
+ viewDesc.Texture1DArray.FirstArraySlice = 0;
+ viewDesc.Texture1DArray.MipLevels = textureDesc.numMipLevels;
+ viewDesc.Texture1DArray.MostDetailedMip = 0;
+ }
+ break;
+ }
+ case Resource::Type::Texture2D:
+ {
+ if (textureDesc.arraySize <= 0)
+ {
+ viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
+ viewDesc.Texture2D.MipLevels = textureDesc.numMipLevels;
+ viewDesc.Texture2D.MostDetailedMip = 0;
+ }
+ else
+ {
+ viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
+ viewDesc.Texture2DArray.ArraySize = textureDesc.arraySize;
+ viewDesc.Texture2DArray.FirstArraySlice = 0;
+ viewDesc.Texture2DArray.MipLevels = textureDesc.numMipLevels;
+ viewDesc.Texture2DArray.MostDetailedMip = 0;
+ }
+ break;
+ }
+ case Resource::Type::TextureCube:
+ {
+ if (textureDesc.arraySize <= 0)
+ {
+ viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
+ viewDesc.TextureCube.MipLevels = textureDesc.numMipLevels;
+ viewDesc.TextureCube.MostDetailedMip = 0;
+ }
+ else
+ {
+ viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY;
+ viewDesc.TextureCubeArray.MipLevels = textureDesc.numMipLevels;
+ viewDesc.TextureCubeArray.MostDetailedMip = 0;
+ viewDesc.TextureCubeArray.First2DArrayFace = 0;
+ viewDesc.TextureCubeArray.NumCubes = textureDesc.arraySize;
+ }
+ break;
+ }
+ case Resource::Type::Texture3D:
+ {
+ viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
+ viewDesc.Texture3D.MipLevels = textureDesc.numMipLevels; // Old code fixed as one
+ viewDesc.Texture3D.MostDetailedMip = 0;
+ break;
+ }
+ default:
+ {
+ assert(!"Unhandled type");
+ return nullptr;
+ }
+ }
- TextureResourceImpl* textureImpl = static_cast<TextureResourceImpl*>(texture.Ptr());
+ SLANG_RETURN_NULL_ON_FAIL(m_device->CreateShaderResourceView(texture->m_resource, &viewDesc, dstDetail.m_srv.writeRef()));
+ break;
+ }
+ case BindingType::Sampler:
+ {
+ const BindingState::SamplerDesc& samplerDesc = bindingStateDesc.m_samplerDescs[srcBinding.descIndex];
- if (inputDesc.dimension == 1)
- {
- D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
- viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D;
- if (inputDesc.arrayLength != 0)
- viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY;
- viewDesc.Texture1D.MipLevels = textureDesc.numMipLevels;
- viewDesc.Texture1D.MostDetailedMip = 0;
- viewDesc.Texture1DArray.ArraySize = textureDesc.arraySize;
- viewDesc.Texture1DArray.FirstArraySlice = 0;
- viewDesc.Texture1DArray.MipLevels = textureDesc.numMipLevels;
- viewDesc.Texture1DArray.MostDetailedMip = 0;
- viewDesc.Format = format;
- m_device->CreateShaderResourceView(textureImpl->m_resource, &viewDesc, view.writeRef());
- }
- else if (inputDesc.dimension == 2)
- {
- D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
+ D3D11_SAMPLER_DESC desc = {};
+ desc.AddressU = desc.AddressV = desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
- if (inputDesc.isCube)
- {
- viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
- viewDesc.TextureCube.MipLevels = textureDesc.numMipLevels;
- viewDesc.TextureCube.MostDetailedMip = 0;
- viewDesc.TextureCubeArray.MipLevels = textureDesc.numMipLevels;
- viewDesc.TextureCubeArray.MostDetailedMip = 0;
- viewDesc.TextureCubeArray.First2DArrayFace = 0;
- viewDesc.TextureCubeArray.NumCubes = inputDesc.arrayLength;
- }
- else
- {
- viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- viewDesc.Texture2D.MipLevels = textureDesc.numMipLevels;
- viewDesc.Texture2D.MostDetailedMip = 0;
- viewDesc.Texture2DArray.ArraySize = textureDesc.arraySize;
- viewDesc.Texture2DArray.FirstArraySlice = 0;
- viewDesc.Texture2DArray.MipLevels = textureDesc.numMipLevels;
- viewDesc.Texture2DArray.MostDetailedMip = 0;
+ if (samplerDesc.isCompareSampler)
+ {
+ desc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL;
+ desc.Filter = D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT;
+ desc.MinLOD = desc.MaxLOD = 0.0f;
+ }
+ else
+ {
+ desc.Filter = D3D11_FILTER_ANISOTROPIC;
+ desc.MaxAnisotropy = 8;
+ desc.MinLOD = 0.0f;
+ desc.MaxLOD = 100.0f;
+ }
+ SLANG_RETURN_NULL_ON_FAIL(m_device->CreateSamplerState(&desc, dstDetail.m_samplerState.writeRef()));
+ break;
+ }
+ default:
+ {
+ assert(!"Unhandled type");
+ return nullptr;
+ }
}
- if (inputDesc.arrayLength != 0)
- viewDesc.ViewDimension = (D3D11_SRV_DIMENSION)(int)(viewDesc.ViewDimension + 1);
-
- viewDesc.Format = format;
-
- SLANG_RETURN_ON_FAIL(m_device->CreateShaderResourceView(textureImpl->m_resource, &viewDesc, view.writeRef()));
- }
- else if (inputDesc.dimension == 3)
- {
- D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
- viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
- viewDesc.Texture3D.MipLevels = 1;
- viewDesc.Texture3D.MostDetailedMip = 0;
- viewDesc.Format = format;
- m_device->CreateShaderResourceView(textureImpl->m_resource, &viewDesc, view.writeRef());
}
- resourceOut = texture;
- viewOut.swap(view);
- return SLANG_OK;
-}
-
-Result D3D11Renderer::createInputSampler(const InputSamplerDesc& inputDesc, ComPtr<ID3D11SamplerState>& stateOut)
-{
- D3D11_SAMPLER_DESC desc;
- memset(&desc, 0, sizeof(desc));
- desc.AddressU = desc.AddressV = desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
- if (inputDesc.isCompareSampler)
- {
- desc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL;
- desc.Filter = D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT;
- desc.MinLOD = desc.MaxLOD = 0.0f;
- }
- else
- {
- desc.Filter = D3D11_FILTER_ANISOTROPIC;
- desc.MaxAnisotropy = 8;
- desc.MinLOD = 0.0f;
- desc.MaxLOD = 100.0f;
- }
- return m_device->CreateSamplerState(&desc, stateOut.writeRef());
+ // Done
+ return bindingState.detach();
}
-BindingState* D3D11Renderer::createBindingState(const ShaderInputLayout& layout)
+void D3D11Renderer::applyBindingState(bool isCompute)
{
- RefPtr<BindingStateImpl> bindingState(new BindingStateImpl);
+ auto context = m_immediateContext.get();
- const List<ShaderInputLayoutEntry>& srcBindings = layout.entries;
- const int numBindings = int(srcBindings.Count());
+ const auto& details = m_currentBindings->m_bindingDetails;
+ const auto& bindings = m_currentBindings->getDesc().m_bindings;
- List<Binding>& dstBindings = bindingState->m_bindings;
- dstBindings.SetSize(numBindings);
+ const int numBindings = int(bindings.Count());
- bindingState->m_numRenderTargets = layout.numRenderTargets;
-
for (int i = 0; i < numBindings; ++i)
{
- Binding& dstBinding = dstBindings[i];
- const ShaderInputLayoutEntry& srcBinding = srcBindings[i];
+ const auto& binding = bindings[i];
+ const auto& detail = details[i];
- dstBinding.type = srcBinding.type;
- dstBinding.binding = srcBinding.hlslBinding;
- dstBinding.isOutput = srcBinding.isOutput;
- switch (srcBinding.type)
+ switch (binding.bindingType)
{
- case ShaderInputType::Buffer:
- {
- SLANG_RETURN_NULL_ON_FAIL(createInputBuffer(srcBinding.bufferDesc, srcBinding.isOutput, srcBinding.bufferData, dstBinding.resource, dstBinding.uav, dstBinding.srv));
- dstBinding.bufferType = srcBinding.bufferDesc.type;
- break;
- }
- case ShaderInputType::Texture:
- {
- SLANG_RETURN_NULL_ON_FAIL(createInputTexture(srcBinding.textureDesc, dstBinding.resource, dstBinding.srv));
- break;
- }
- case ShaderInputType::Sampler:
- {
- SLANG_RETURN_NULL_ON_FAIL(createInputSampler(srcBinding.samplerDesc, dstBinding.samplerState));
- break;
- }
- case ShaderInputType::CombinedTextureSampler:
+ case BindingType::Buffer:
{
- assert(!"Not implemented");
- //throw "not implemented";
- return nullptr;
- break;
- }
- }
- }
-
- return bindingState.detach();
-}
-
-void D3D11Renderer::applyBindingState(bool isCompute)
-{
- auto context = m_immediateContext.get();
- for (auto & binding : m_currentBindings->m_bindings)
- {
- if (binding.type == ShaderInputType::Buffer)
- {
-
- if (binding.bufferType == InputBufferType::ConstantBuffer)
- {
- BufferResourceImpl* bufferResource = static_cast<BufferResourceImpl*>(binding.resource.Ptr());
- ID3D11Buffer* buffer = bufferResource->m_buffer;
-
- if (isCompute)
- context->CSSetConstantBuffers(binding.binding, 1, &buffer);
- else
+ assert(binding.resource && binding.resource->isBuffer());
+ if (binding.resource->canBind(Resource::BindFlag::ConstantBuffer))
{
- context->VSSetConstantBuffers(binding.binding, 1, &buffer);
- context->PSSetConstantBuffers(binding.binding, 1, &buffer);
+ ID3D11Buffer* buffer = static_cast<BufferResourceImpl*>(binding.resource.Ptr())->m_buffer;
+ if (isCompute)
+ context->CSSetConstantBuffers(detail.m_binding, 1, &buffer);
+ else
+ {
+ context->VSSetConstantBuffers(detail.m_binding, 1, &buffer);
+ context->PSSetConstantBuffers(detail.m_binding, 1, &buffer);
+ }
+ }
+ else if (detail.m_uav)
+ {
+ if (isCompute)
+ context->CSSetUnorderedAccessViews(detail.m_binding, 1, detail.m_uav.readRef(), nullptr);
+ else
+ context->OMSetRenderTargetsAndUnorderedAccessViews(m_currentBindings->getDesc().m_numRenderTargets,
+ m_renderTargetViews.Buffer()->readRef(), nullptr, detail.m_binding, 1, detail.m_uav.readRef(), nullptr);
}
- }
- else if (binding.uav)
- {
- if (isCompute)
- context->CSSetUnorderedAccessViews(binding.binding, 1, binding.uav.readRef(), nullptr);
- else
- context->OMSetRenderTargetsAndUnorderedAccessViews(m_currentBindings->m_numRenderTargets,
- m_renderTargetViews.Buffer()->readRef(), nullptr, binding.binding, 1, binding.uav.readRef(), nullptr);
- }
- else
- {
- if (isCompute)
- context->CSSetShaderResources(binding.binding, 1, binding.srv.readRef());
else
{
- context->PSSetShaderResources(binding.binding, 1, binding.srv.readRef());
- context->VSSetShaderResources(binding.binding, 1, binding.srv.readRef());
+ if (isCompute)
+ context->CSSetShaderResources(detail.m_binding, 1, detail.m_srv.readRef());
+ else
+ {
+ context->PSSetShaderResources(detail.m_binding, 1, detail.m_srv.readRef());
+ context->VSSetShaderResources(detail.m_binding, 1, detail.m_srv.readRef());
+ }
}
+ break;
}
- }
- else if (binding.type == ShaderInputType::Texture)
- {
- if (binding.uav)
+ case BindingType::Texture:
{
- if (isCompute)
- context->CSSetUnorderedAccessViews(binding.binding, 1, binding.uav.readRef(), nullptr);
+ if (detail.m_uav)
+ {
+ if (isCompute)
+ context->CSSetUnorderedAccessViews(detail.m_binding, 1, detail.m_uav.readRef(), nullptr);
+ else
+ context->OMSetRenderTargetsAndUnorderedAccessViews(D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL,
+ nullptr, nullptr, detail.m_binding, 1, detail.m_uav.readRef(), nullptr);
+ }
else
- context->OMSetRenderTargetsAndUnorderedAccessViews(D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL,
- nullptr, nullptr, binding.binding, 1, binding.uav.readRef(), nullptr);
+ {
+ if (isCompute)
+ context->CSSetShaderResources(detail.m_binding, 1, detail.m_srv.readRef());
+ else
+ {
+ context->PSSetShaderResources(detail.m_binding, 1, detail.m_srv.readRef());
+ context->VSSetShaderResources(detail.m_binding, 1, detail.m_srv.readRef());
+ }
+ }
+ break;
}
- else
+ case BindingType::Sampler:
{
if (isCompute)
- context->CSSetShaderResources(binding.binding, 1, binding.srv.readRef());
+ context->CSSetSamplers(detail.m_binding, 1, detail.m_samplerState.readRef());
else
{
- context->PSSetShaderResources(binding.binding, 1, binding.srv.readRef());
- context->VSSetShaderResources(binding.binding, 1, binding.srv.readRef());
+ context->PSSetSamplers(detail.m_binding, 1, detail.m_samplerState.readRef());
+ context->VSSetSamplers(detail.m_binding, 1, detail.m_samplerState.readRef());
}
+ break;
}
- }
- else if (binding.type == ShaderInputType::Sampler)
- {
- if (isCompute)
- context->CSSetSamplers(binding.binding, 1, binding.samplerState.readRef());
- else
+ default:
{
- context->PSSetSamplers(binding.binding, 1, binding.samplerState.readRef());
- context->VSSetSamplers(binding.binding, 1, binding.samplerState.readRef());
+ assert(!"Not implemented");
+ return;
}
}
- else
- throw "not implemented";
}
}
@@ -1156,35 +1145,4 @@ void D3D11Renderer::setBindingState(BindingState* state)
m_currentBindings = static_cast<BindingStateImpl*>(state);
}
-void D3D11Renderer::serializeOutput(BindingState* stateIn, const char* fileName)
-{
- auto bindingState = static_cast<BindingStateImpl*>(stateIn);
- FILE * f = fopen(fileName, "wb");
- int id = 0;
- for (auto & binding : bindingState->m_bindings)
- {
- if (binding.isOutput)
- {
- if (binding.resource && binding.resource->isBuffer())
- {
- BufferResource* bufferResource = static_cast<BufferResource*>(binding.resource.Ptr());
- const size_t bufferSize = bufferResource->getDesc().sizeInBytes;
-
- unsigned int* ptr = (unsigned int*)map(bufferResource, MapFlavor::HostRead);
- for (auto i = 0u; i < bufferSize / sizeof(unsigned int); i++)
- {
- fprintf(f, "%X\n", ptr[i]);
- }
- unmap(bufferResource);
- }
- else
- {
- printf("invalid output type at %d.\n", id);
- }
- }
- id++;
- }
- fclose(f);
-}
-
} // renderer_test