Add initial support for compute pipelines

This commit is contained in:
SirLynix
2022-12-24 11:54:55 +01:00
committed by Jérôme Leclercq
parent e4064997d8
commit 9578ba3ef5
57 changed files with 915 additions and 182 deletions

View File

@@ -402,7 +402,7 @@ namespace Nz
viewerData.blitShaderBinding->Update({
{
0,
ShaderBinding::TextureBinding {
ShaderBinding::SampledTextureBinding {
m_bakedFrameGraph.GetAttachmentTexture(viewerData.debugColorAttachment).get(),
sampler.get()
}
@@ -419,7 +419,7 @@ namespace Nz
renderTargetData.blitShaderBinding->Update({
{
0,
ShaderBinding::TextureBinding {
ShaderBinding::SampledTextureBinding {
m_bakedFrameGraph.GetAttachmentTexture(renderTargetData.finalAttachment).get(),
sampler.get()
}
@@ -456,7 +456,7 @@ namespace Nz
{
builder.SetScissor(renderRegion);
builder.SetViewport(renderRegion);
builder.BindPipeline(*graphics->GetBlitPipeline(false));
builder.BindRenderPipeline(*graphics->GetBlitPipeline(false));
builder.BindShaderBinding(0, *data.blitShaderBinding);
builder.Draw(3);
@@ -644,7 +644,7 @@ namespace Nz
builder.SetViewport(env.renderRect);
Graphics* graphics = Graphics::Instance();
builder.BindPipeline(*graphics->GetBlitPipeline(false));
builder.BindRenderPipeline(*graphics->GetBlitPipeline(false));
bool first = true;
@@ -657,7 +657,7 @@ namespace Nz
if (first)
{
builder.BindPipeline(*graphics->GetBlitPipeline(true));
builder.BindRenderPipeline(*graphics->GetBlitPipeline(true));
first = false;
}
}

View File

@@ -108,9 +108,14 @@ namespace Nz
RenderDeviceFeatures enabledFeatures;
enabledFeatures.anisotropicFiltering = !config.forceDisableFeatures.anisotropicFiltering && renderDeviceInfo[bestRenderDeviceIndex].features.anisotropicFiltering;
enabledFeatures.computeShaders = !config.forceDisableFeatures.computeShaders && renderDeviceInfo[bestRenderDeviceIndex].features.computeShaders;
enabledFeatures.depthClamping = !config.forceDisableFeatures.depthClamping && renderDeviceInfo[bestRenderDeviceIndex].features.depthClamping;
enabledFeatures.nonSolidFaceFilling = !config.forceDisableFeatures.nonSolidFaceFilling && renderDeviceInfo[bestRenderDeviceIndex].features.nonSolidFaceFilling;
enabledFeatures.storageBuffers = !config.forceDisableFeatures.storageBuffers && renderDeviceInfo[bestRenderDeviceIndex].features.storageBuffers;
enabledFeatures.textureRead = !config.forceDisableFeatures.textureRead && renderDeviceInfo[bestRenderDeviceIndex].features.textureRead;
enabledFeatures.textureReadWithoutFormat = !config.forceDisableFeatures.textureReadWithoutFormat && renderDeviceInfo[bestRenderDeviceIndex].features.textureReadWithoutFormat;
enabledFeatures.textureWrite = !config.forceDisableFeatures.textureWrite && renderDeviceInfo[bestRenderDeviceIndex].features.textureWrite;
enabledFeatures.textureWriteWithoutFormat = !config.forceDisableFeatures.textureWriteWithoutFormat && renderDeviceInfo[bestRenderDeviceIndex].features.textureWriteWithoutFormat;
enabledFeatures.unrestrictedTextureViews = !config.forceDisableFeatures.unrestrictedTextureViews && renderDeviceInfo[bestRenderDeviceIndex].features.unrestrictedTextureViews;
m_renderDevice = renderer->InstanciateRenderDevice(bestRenderDeviceIndex, enabledFeatures);
@@ -176,7 +181,7 @@ namespace Nz
layoutInfo.bindings.assign({
{
0, 0, 1,
ShaderBindingType::Texture,
ShaderBindingType::Sampler,
nzsl::ShaderStageType::Fragment
}
});

View File

@@ -150,7 +150,7 @@ namespace Nz
bindings.push_back({
textureSlot.bindingIndex,
ShaderBinding::TextureBinding {
ShaderBinding::SampledTextureBinding {
texture.get(), sampler.get()
}
});

View File

@@ -56,6 +56,8 @@ namespace Nz
if (IsStorageType(*varType))
bindingType = ShaderBindingType::StorageBuffer;
else if (IsSamplerType(*varType))
bindingType = ShaderBindingType::Sampler;
else if (IsTextureType(*varType))
bindingType = ShaderBindingType::Texture;
else if (IsUniformType(*varType))
bindingType = ShaderBindingType::UniformBuffer;
@@ -67,7 +69,7 @@ namespace Nz
throw std::runtime_error("unexpected type " + ToString(innerType) + " in array " + ToString(arrayType));
arraySize = arrayType.length;
bindingType = ShaderBindingType::Texture;
bindingType = ShaderBindingType::Sampler;
varType = &innerType;
}
else
@@ -86,6 +88,21 @@ namespace Nz
{
switch (bindingType)
{
case ShaderBindingType::Sampler:
{
if (externalBlock->samplers.find(externalVar.tag) != externalBlock->samplers.end())
throw std::runtime_error("duplicate sampler tag " + externalVar.tag + " in external block " + node.tag);
const auto& samplerType = std::get<nzsl::Ast::SamplerType>(*varType);
ExternalSampler& texture = externalBlock->samplers[externalVar.tag];
texture.bindingIndex = bindingIndex;
texture.bindingSet = bindingSet;
texture.imageType = samplerType.dim;
texture.sampledType = samplerType.sampledType;
break;
}
case ShaderBindingType::StorageBuffer:
{
if (externalBlock->storageBlocks.find(externalVar.tag) != externalBlock->storageBlocks.end())
@@ -100,16 +117,18 @@ namespace Nz
case ShaderBindingType::Texture:
{
if (externalBlock->samplers.find(externalVar.tag) != externalBlock->samplers.end())
if (externalBlock->textures.find(externalVar.tag) != externalBlock->textures.end())
throw std::runtime_error("duplicate textures tag " + externalVar.tag + " in external block " + node.tag);
const auto& samplerType = std::get<nzsl::Ast::SamplerType>(*varType);
const auto& textureType = std::get<nzsl::Ast::TextureType>(*varType);
ExternalTexture& texture = externalBlock->samplers[externalVar.tag];
ExternalTexture& texture = externalBlock->textures[externalVar.tag];
texture.bindingIndex = bindingIndex;
texture.bindingSet = bindingSet;
texture.imageType = samplerType.dim;
texture.sampledType = samplerType.sampledType;
texture.bindingSet = bindingSet;
texture.accessPolicy = textureType.accessPolicy;
texture.baseType = textureType.baseType;
texture.imageFormat = textureType.format;
texture.imageType = textureType.dim;
break;
}

View File

@@ -199,7 +199,7 @@ namespace Nz
{
auto& bindingEntry = m_bindingCache.emplace_back();
bindingEntry.bindingIndex = bindingIndex;
bindingEntry.content = ShaderBinding::TextureBinding{
bindingEntry.content = ShaderBinding::SampledTextureBinding{
m_pendingData.currentTextureOverlay, defaultSampler.get()
};
}
@@ -310,7 +310,7 @@ namespace Nz
if (currentPipeline != drawData.renderPipeline)
{
commandBuffer.BindPipeline(*drawData.renderPipeline);
commandBuffer.BindRenderPipeline(*drawData.renderPipeline);
currentPipeline = drawData.renderPipeline;
}

View File

@@ -175,7 +175,7 @@ namespace Nz
auto& bindingEntry = m_bindingCache.emplace_back();
bindingEntry.bindingIndex = bindingIndex;
bindingEntry.content = ShaderBinding::TextureBindings {
bindingEntry.content = ShaderBinding::SampledTextureBindings {
SafeCast<UInt32>(renderState.shadowMaps2D.size()), &m_textureBindingCache[textureBindingBaseIndex]
};
}
@@ -197,7 +197,7 @@ namespace Nz
auto& bindingEntry = m_bindingCache.emplace_back();
bindingEntry.bindingIndex = bindingIndex;
bindingEntry.content = ShaderBinding::TextureBindings {
bindingEntry.content = ShaderBinding::SampledTextureBindings {
SafeCast<UInt32>(renderState.shadowMapsCube.size()), &m_textureBindingCache[textureBindingBaseIndex]
};
}
@@ -230,7 +230,7 @@ namespace Nz
{
auto& bindingEntry = m_bindingCache.emplace_back();
bindingEntry.bindingIndex = bindingIndex;
bindingEntry.content = ShaderBinding::TextureBinding{
bindingEntry.content = ShaderBinding::SampledTextureBinding{
whiteTexture2D.get(), defaultSampler.get()
};
}
@@ -285,7 +285,7 @@ namespace Nz
if (currentPipeline != drawData.renderPipeline)
{
commandBuffer.BindPipeline(*drawData.renderPipeline);
commandBuffer.BindRenderPipeline(*drawData.renderPipeline);
currentPipeline = drawData.renderPipeline;
}