summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-02-28 18:09:27 -0800
committerGitHub <noreply@github.com>2022-02-28 18:09:27 -0800
commite6c9625e0f0d5d9703451fd2ebb8b206d210009c (patch)
treead2c46f5e9a5f7a6e67cacf5b7227d726f392088 /tools
parentc31577953d5041c82375c22d847c2eba06106c58 (diff)
Use GLSL scalar layout for constant buffers. (#2147)
Diffstat (limited to 'tools')
-rw-r--r--tools/gfx/d3d/d3d-util.cpp1
-rw-r--r--tools/gfx/debug-layer.cpp36
-rw-r--r--tools/gfx/debug-layer.h4
-rw-r--r--tools/gfx/renderer-shared.cpp31
-rw-r--r--tools/gfx/renderer-shared.h12
-rw-r--r--tools/gfx/vulkan/render-vk.cpp17
-rw-r--r--tools/render-test/render-test-main.cpp2
7 files changed, 94 insertions, 9 deletions
diff --git a/tools/gfx/d3d/d3d-util.cpp b/tools/gfx/d3d/d3d-util.cpp
index 5d7aa4dd8..942764d01 100644
--- a/tools/gfx/d3d/d3d-util.cpp
+++ b/tools/gfx/d3d/d3d-util.cpp
@@ -808,6 +808,7 @@ D3D12_RESOURCE_STATES D3DUtil::getResourceState(ResourceState state)
case ResourceState::StreamOutput:
return D3D12_RESOURCE_STATE_STREAM_OUT;
case ResourceState::ShaderResource:
+ case ResourceState::AccelerationStructureBuildInput:
return D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
case ResourceState::UnorderedAccess:
return D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
diff --git a/tools/gfx/debug-layer.cpp b/tools/gfx/debug-layer.cpp
index 0926c5273..ec51dbee3 100644
--- a/tools/gfx/debug-layer.cpp
+++ b/tools/gfx/debug-layer.cpp
@@ -669,6 +669,42 @@ Result DebugDevice::createMutableRootShaderObject(
return result;
}
+Result DebugDevice::createShaderObjectFromTypeLayout(
+ slang::TypeLayoutReflection* typeLayout, IShaderObject** outShaderObject)
+{
+ SLANG_GFX_API_FUNC;
+
+ RefPtr<DebugShaderObject> outObject = new DebugShaderObject();
+ auto result = baseObject->createShaderObjectFromTypeLayout(typeLayout, outObject->baseObject.writeRef());
+ auto type = typeLayout->getType();
+ auto typeName = type->getName();
+ outObject->m_typeName = typeName;
+ outObject->m_device = this;
+ outObject->m_slangType = type;
+ if (SLANG_FAILED(result))
+ return result;
+ returnComPtr(outShaderObject, outObject);
+ return result;
+}
+
+Result DebugDevice::createMutableShaderObjectFromTypeLayout(
+ slang::TypeLayoutReflection* typeLayout, IShaderObject** outShaderObject)
+{
+ SLANG_GFX_API_FUNC;
+ RefPtr<DebugShaderObject> outObject = new DebugShaderObject();
+ auto result = baseObject->createMutableShaderObjectFromTypeLayout(
+ typeLayout, outObject->baseObject.writeRef());
+ if (SLANG_FAILED(result))
+ return result;
+ auto type = typeLayout->getType();
+ auto typeName = type->getName();
+ outObject->m_typeName = typeName;
+ outObject->m_device = this;
+ outObject->m_slangType = type;
+ returnComPtr(outShaderObject, outObject);
+ return result;
+}
+
Result DebugDevice::createProgram(
const IShaderProgram::Desc& desc, IShaderProgram** outProgram, ISlangBlob** outDiagnostics)
{
diff --git a/tools/gfx/debug-layer.h b/tools/gfx/debug-layer.h
index a8cb0e849..5a139fd10 100644
--- a/tools/gfx/debug-layer.h
+++ b/tools/gfx/debug-layer.h
@@ -120,6 +120,10 @@ public:
slang::TypeReflection* type,
ShaderObjectContainerType container,
IShaderObject** outObject) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectFromTypeLayout(
+ slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createMutableShaderObjectFromTypeLayout(
+ slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject) override;
virtual SLANG_NO_THROW Result SLANG_MCALL
createMutableRootShaderObject(IShaderProgram* program, IShaderObject** outObject) override;
virtual SLANG_NO_THROW Result SLANG_MCALL
diff --git a/tools/gfx/renderer-shared.cpp b/tools/gfx/renderer-shared.cpp
index 555186840..83fc9223d 100644
--- a/tools/gfx/renderer-shared.cpp
+++ b/tools/gfx/renderer-shared.cpp
@@ -366,6 +366,7 @@ Result RendererBase::getFormatSupportedResourceStates(Format format, ResourceSta
{
SLANG_UNUSED(format);
outStates->add(ResourceState::AccelerationStructure);
+ outStates->add(ResourceState::AccelerationStructureBuildInput);
outStates->add(ResourceState::ConstantBuffer);
outStates->add(ResourceState::CopyDestination);
outStates->add(ResourceState::CopySource);
@@ -459,6 +460,22 @@ SLANG_NO_THROW Result SLANG_MCALL RendererBase::createMutableShaderObject(
return createMutableShaderObject(shaderObjectLayout, outObject);
}
+SLANG_NO_THROW Result SLANG_MCALL RendererBase::createShaderObjectFromTypeLayout(
+ slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject)
+{
+ RefPtr<ShaderObjectLayoutBase> shaderObjectLayout;
+ SLANG_RETURN_ON_FAIL(getShaderObjectLayout(typeLayout, shaderObjectLayout.writeRef()));
+ return createShaderObject(shaderObjectLayout, outObject);
+}
+
+SLANG_NO_THROW Result SLANG_MCALL RendererBase::createMutableShaderObjectFromTypeLayout(
+ slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject)
+{
+ RefPtr<ShaderObjectLayoutBase> shaderObjectLayout;
+ SLANG_RETURN_ON_FAIL(getShaderObjectLayout(typeLayout, shaderObjectLayout.writeRef()));
+ return createMutableShaderObject(shaderObjectLayout, outObject);
+}
+
Result RendererBase::getAccelerationStructurePrebuildInfo(
const IAccelerationStructure::BuildInputs& buildInputs,
IAccelerationStructure::PrebuildInfo* outPrebuildInfo)
@@ -531,7 +548,6 @@ Result RendererBase::getShaderObjectLayout(
ShaderObjectContainerType container,
ShaderObjectLayoutBase** outLayout)
{
- RefPtr<ShaderObjectLayoutBase> shaderObjectLayout;
switch (container)
{
case ShaderObjectContainerType::StructuredBuffer:
@@ -544,11 +560,18 @@ Result RendererBase::getShaderObjectLayout(
break;
}
- if( !m_shaderObjectLayoutCache.TryGetValue(type, shaderObjectLayout) )
+ auto typeLayout = slangContext.session->getTypeLayout(type);
+ return getShaderObjectLayout(typeLayout, outLayout);
+}
+
+Result RendererBase::getShaderObjectLayout(
+ slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout)
+{
+ RefPtr<ShaderObjectLayoutBase> shaderObjectLayout;
+ if (!m_shaderObjectLayoutCache.TryGetValue(typeLayout, shaderObjectLayout))
{
- auto typeLayout = slangContext.session->getTypeLayout(type);
SLANG_RETURN_ON_FAIL(createShaderObjectLayout(typeLayout, shaderObjectLayout.writeRef()));
- m_shaderObjectLayoutCache.Add(type, shaderObjectLayout);
+ m_shaderObjectLayoutCache.Add(typeLayout, shaderObjectLayout);
}
*outLayout = shaderObjectLayout.detach();
return SLANG_OK;
diff --git a/tools/gfx/renderer-shared.h b/tools/gfx/renderer-shared.h
index e82bc83d0..0462b802b 100644
--- a/tools/gfx/renderer-shared.h
+++ b/tools/gfx/renderer-shared.h
@@ -1240,6 +1240,12 @@ public:
ShaderObjectContainerType containerType,
IShaderObject** outObject) SLANG_OVERRIDE;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectFromTypeLayout(
+ slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createMutableShaderObjectFromTypeLayout(
+ slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject) override;
+
// Provides a default implementation that returns SLANG_E_NOT_AVAILABLE for platforms
// without ray tracing support.
virtual SLANG_NO_THROW Result SLANG_MCALL getAccelerationStructurePrebuildInfo(
@@ -1283,6 +1289,10 @@ public:
ShaderObjectContainerType container,
ShaderObjectLayoutBase** outLayout);
+ Result getShaderObjectLayout(
+ slang::TypeLayoutReflection* typeLayout,
+ ShaderObjectLayoutBase** outLayout);
+
public:
ExtendedShaderObjectTypeList specializationArgs;
// Given current pipeline and root shader object binding, generate and bind a specialized pipeline if necessary.
@@ -1316,7 +1326,7 @@ public:
SlangContext slangContext;
ShaderCache shaderCache;
- Slang::Dictionary<slang::TypeReflection*, Slang::RefPtr<ShaderObjectLayoutBase>> m_shaderObjectLayoutCache;
+ Slang::Dictionary<slang::TypeLayoutReflection*, Slang::RefPtr<ShaderObjectLayoutBase>> m_shaderObjectLayoutCache;
};
bool isDepthFormat(Format format);
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index 7cfdf06c8..8cec9d4a0 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -4252,6 +4252,8 @@ public:
return VkAccessFlagBits(
VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR |
VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR);
+ case ResourceState::AccelerationStructureBuildInput:
+ return VkAccessFlagBits(VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR);
case ResourceState::General:
return VkAccessFlagBits(VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT);
default:
@@ -4314,6 +4316,8 @@ public:
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR |
VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR);
+ case ResourceState::AccelerationStructureBuildInput:
+ return VkPipelineStageFlagBits(VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR);
default:
assert(!"Unsupported");
return VkPipelineStageFlagBits(0);
@@ -4666,7 +4670,8 @@ public:
region.bufferImageHeight = 0;
region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- region.imageSubresource.mipLevel = uint32_t(j);
+ region.imageSubresource.mipLevel =
+ subResourceRange.mipLevel + uint32_t(j);
region.imageSubresource.baseArrayLayer =
subResourceRange.baseArrayLayer + i;
region.imageSubresource.layerCount = 1;
@@ -6393,7 +6398,7 @@ public:
m_desc.format = Format::B8G8R8A8_UNORM;
}
- SLANG_RETURN_ON_FAIL(createSwapchainAndImages());
+ createSwapchainAndImages();
return SLANG_OK;
}
@@ -7771,7 +7776,8 @@ static VkBufferUsageFlagBits _calcBufferUsageFlags(ResourceState state)
case ResourceState::UnorderedAccess:
return (VkBufferUsageFlagBits)(VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
case ResourceState::ShaderResource:
- return (VkBufferUsageFlagBits)(VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ return (VkBufferUsageFlagBits)(VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
case ResourceState::CopySource:
return VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
case ResourceState::CopyDestination:
@@ -7780,6 +7786,8 @@ static VkBufferUsageFlagBits _calcBufferUsageFlags(ResourceState state)
return VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR;
case ResourceState::IndirectArgument:
return VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
+ case ResourceState::AccelerationStructureBuildInput:
+ return VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR;
default:
return VkBufferUsageFlagBits(0);
}
@@ -8740,7 +8748,10 @@ Result VKDevice::getFormatSupportedResourceStates(Format format, ResourceStateSe
}
// AccelerationStructure
if (bufferFeatures & VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR)
+ {
allowedStates.add(ResourceState::AccelerationStructure);
+ allowedStates.add(ResourceState::AccelerationStructureBuildInput);
+ }
*outStates = allowedStates;
return SLANG_OK;
diff --git a/tools/render-test/render-test-main.cpp b/tools/render-test/render-test-main.cpp
index a62cc7a9b..7046e2fda 100644
--- a/tools/render-test/render-test-main.cpp
+++ b/tools/render-test/render-test-main.cpp
@@ -804,7 +804,7 @@ void RenderTestApp::_initializeAccelerationStructure()
instanceBufferDesc.type = IResource::Type::Buffer;
instanceBufferDesc.sizeInBytes =
instanceDescs.getCount() * sizeof(IAccelerationStructure::InstanceDesc);
- instanceBufferDesc.defaultState = ResourceState::ShaderResource;
+ instanceBufferDesc.defaultState = ResourceState::AccelerationStructureBuildInput;
ComPtr<IBufferResource> instanceBuffer =
m_device->createBufferResource(instanceBufferDesc, instanceDescs.getBuffer());