Add initial support for compute pipelines
This commit is contained in:
committed by
Jérôme Leclercq
parent
e4064997d8
commit
9578ba3ef5
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
});
|
||||
|
||||
@@ -150,7 +150,7 @@ namespace Nz
|
||||
|
||||
bindings.push_back({
|
||||
textureSlot.bindingIndex,
|
||||
ShaderBinding::TextureBinding {
|
||||
ShaderBinding::SampledTextureBinding {
|
||||
texture.get(), sampler.get()
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user