PIX: Add Amplification/Mesh shader to shader debugging instrumentation (#2521)
This commit is contained in:
Родитель
77afe15b0d
Коммит
779f2f878e
|
@ -225,7 +225,7 @@ private:
|
||||||
void addInvocationSelectionProlog(BuilderContext &BC, SystemValueIndices SVIndices);
|
void addInvocationSelectionProlog(BuilderContext &BC, SystemValueIndices SVIndices);
|
||||||
Value * addPixelShaderProlog(BuilderContext &BC, SystemValueIndices SVIndices);
|
Value * addPixelShaderProlog(BuilderContext &BC, SystemValueIndices SVIndices);
|
||||||
Value * addGeometryShaderProlog(BuilderContext &BC, SystemValueIndices SVIndices);
|
Value * addGeometryShaderProlog(BuilderContext &BC, SystemValueIndices SVIndices);
|
||||||
Value * addComputeShaderProlog(BuilderContext &BC);
|
Value * addDispatchedShaderProlog(BuilderContext &BC);
|
||||||
Value * addVertexShaderProlog(BuilderContext &BC, SystemValueIndices SVIndices);
|
Value * addVertexShaderProlog(BuilderContext &BC, SystemValueIndices SVIndices);
|
||||||
void addDebugEntryValue(BuilderContext &BC, Value * TheValue);
|
void addDebugEntryValue(BuilderContext &BC, Value * TheValue);
|
||||||
void addInvocationStartMarker(BuilderContext &BC);
|
void addInvocationStartMarker(BuilderContext &BC);
|
||||||
|
@ -260,30 +260,11 @@ DxilDebugInstrumentation::SystemValueIndices DxilDebugInstrumentation::addRequir
|
||||||
|
|
||||||
auto ShaderModel = BC.DM.GetShaderModel();
|
auto ShaderModel = BC.DM.GetShaderModel();
|
||||||
switch (ShaderModel->GetKind()) {
|
switch (ShaderModel->GetKind()) {
|
||||||
case DXIL::ShaderKind::Pixel: {
|
case DXIL::ShaderKind::Amplification:
|
||||||
auto Existing_SV_Position = std::find_if(
|
case DXIL::ShaderKind::Mesh:
|
||||||
InputElements.begin(), InputElements.end(),
|
case DXIL::ShaderKind::Compute:
|
||||||
[](const std::unique_ptr<DxilSignatureElement> & Element) {
|
// Dispatch* thread Id is not in the input signature
|
||||||
return Element->GetSemantic()->GetKind() == hlsl::DXIL::SemanticKind::Position; });
|
break;
|
||||||
|
|
||||||
// SV_Position, if present, has to have full mask, so we needn't worry
|
|
||||||
// about the shader having selected components that don't include x or y.
|
|
||||||
// If not present, we add it.
|
|
||||||
if (Existing_SV_Position == InputElements.end()) {
|
|
||||||
auto Added_SV_Position = llvm::make_unique<DxilSignatureElement>(DXIL::SigPointKind::PSIn);
|
|
||||||
Added_SV_Position->Initialize("Position", hlsl::CompType::getF32(), hlsl::DXIL::InterpolationMode::Linear, 1, 4);
|
|
||||||
Added_SV_Position->AppendSemanticIndex(0);
|
|
||||||
Added_SV_Position->SetSigPointKind(DXIL::SigPointKind::PSIn);
|
|
||||||
Added_SV_Position->SetKind(hlsl::DXIL::SemanticKind::Position);
|
|
||||||
|
|
||||||
auto index = InputSignature.AppendElement(std::move(Added_SV_Position));
|
|
||||||
SVIndices.PixelShader.Position = InputElements[index]->GetID();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
SVIndices.PixelShader.Position = Existing_SV_Position->get()->GetID();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DXIL::ShaderKind::Vertex: {
|
case DXIL::ShaderKind::Vertex: {
|
||||||
{
|
{
|
||||||
auto Existing_SV_VertexId = std::find_if(
|
auto Existing_SV_VertexId = std::find_if(
|
||||||
|
@ -325,14 +306,37 @@ DxilDebugInstrumentation::SystemValueIndices DxilDebugInstrumentation::addRequir
|
||||||
SVIndices.VertexShader.InstanceId = Existing_SV_InstanceId->get()->GetID();
|
SVIndices.VertexShader.InstanceId = Existing_SV_InstanceId->get()->GetID();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} break;
|
||||||
break;
|
|
||||||
case DXIL::ShaderKind::Geometry:
|
case DXIL::ShaderKind::Geometry:
|
||||||
// GS Instance Id and Primitive Id are not in the input signature
|
// GS Instance Id and Primitive Id are not in the input signature
|
||||||
break;
|
break;
|
||||||
case DXIL::ShaderKind::Compute:
|
case DXIL::ShaderKind::Pixel: {
|
||||||
// Compute thread Id is not in the input signature
|
auto Existing_SV_Position =
|
||||||
break;
|
std::find_if(InputElements.begin(), InputElements.end(),
|
||||||
|
[](const std::unique_ptr<DxilSignatureElement> &Element) {
|
||||||
|
return Element->GetSemantic()->GetKind() ==
|
||||||
|
hlsl::DXIL::SemanticKind::Position;
|
||||||
|
});
|
||||||
|
|
||||||
|
// SV_Position, if present, has to have full mask, so we needn't worry
|
||||||
|
// about the shader having selected components that don't include x or y.
|
||||||
|
// If not present, we add it.
|
||||||
|
if (Existing_SV_Position == InputElements.end()) {
|
||||||
|
auto Added_SV_Position =
|
||||||
|
llvm::make_unique<DxilSignatureElement>(DXIL::SigPointKind::PSIn);
|
||||||
|
Added_SV_Position->Initialize("Position", hlsl::CompType::getF32(),
|
||||||
|
hlsl::DXIL::InterpolationMode::Linear, 1,
|
||||||
|
4);
|
||||||
|
Added_SV_Position->AppendSemanticIndex(0);
|
||||||
|
Added_SV_Position->SetSigPointKind(DXIL::SigPointKind::PSIn);
|
||||||
|
Added_SV_Position->SetKind(hlsl::DXIL::SemanticKind::Position);
|
||||||
|
|
||||||
|
auto index = InputSignature.AppendElement(std::move(Added_SV_Position));
|
||||||
|
SVIndices.PixelShader.Position = InputElements[index]->GetID();
|
||||||
|
} else {
|
||||||
|
SVIndices.PixelShader.Position = Existing_SV_Position->get()->GetID();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
default:
|
default:
|
||||||
assert(false); // guaranteed by runOnModule
|
assert(false); // guaranteed by runOnModule
|
||||||
}
|
}
|
||||||
|
@ -340,7 +344,7 @@ DxilDebugInstrumentation::SystemValueIndices DxilDebugInstrumentation::addRequir
|
||||||
return SVIndices;
|
return SVIndices;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value * DxilDebugInstrumentation::addComputeShaderProlog(BuilderContext &BC) {
|
Value * DxilDebugInstrumentation::addDispatchedShaderProlog(BuilderContext &BC) {
|
||||||
Constant* Zero32Arg = BC.HlslOP->GetU32Const(0);
|
Constant* Zero32Arg = BC.HlslOP->GetU32Const(0);
|
||||||
Constant* One32Arg = BC.HlslOP->GetU32Const(1);
|
Constant* One32Arg = BC.HlslOP->GetU32Const(1);
|
||||||
Constant* Two32Arg = BC.HlslOP->GetU32Const(2);
|
Constant* Two32Arg = BC.HlslOP->GetU32Const(2);
|
||||||
|
@ -482,8 +486,10 @@ void DxilDebugInstrumentation::addInvocationSelectionProlog(BuilderContext &BC,
|
||||||
|
|
||||||
Value * ParameterTestResult = nullptr;
|
Value * ParameterTestResult = nullptr;
|
||||||
switch (ShaderModel->GetKind()) {
|
switch (ShaderModel->GetKind()) {
|
||||||
case DXIL::ShaderKind::Pixel:
|
case DXIL::ShaderKind::Compute:
|
||||||
ParameterTestResult = addPixelShaderProlog(BC, SVIndices);
|
case DXIL::ShaderKind::Amplification:
|
||||||
|
case DXIL::ShaderKind::Mesh:
|
||||||
|
ParameterTestResult = addDispatchedShaderProlog(BC);
|
||||||
break;
|
break;
|
||||||
case DXIL::ShaderKind::Geometry:
|
case DXIL::ShaderKind::Geometry:
|
||||||
ParameterTestResult = addGeometryShaderProlog(BC, SVIndices);
|
ParameterTestResult = addGeometryShaderProlog(BC, SVIndices);
|
||||||
|
@ -491,8 +497,8 @@ void DxilDebugInstrumentation::addInvocationSelectionProlog(BuilderContext &BC,
|
||||||
case DXIL::ShaderKind::Vertex:
|
case DXIL::ShaderKind::Vertex:
|
||||||
ParameterTestResult = addVertexShaderProlog(BC, SVIndices);
|
ParameterTestResult = addVertexShaderProlog(BC, SVIndices);
|
||||||
break;
|
break;
|
||||||
case DXIL::ShaderKind::Compute:
|
case DXIL::ShaderKind::Pixel:
|
||||||
ParameterTestResult = addComputeShaderProlog(BC);
|
ParameterTestResult = addPixelShaderProlog(BC, SVIndices);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false); // guaranteed by runOnModule
|
assert(false); // guaranteed by runOnModule
|
||||||
|
@ -744,10 +750,12 @@ bool DxilDebugInstrumentation::runOnModule(Module &M) {
|
||||||
|
|
||||||
auto ShaderModel = DM.GetShaderModel();
|
auto ShaderModel = DM.GetShaderModel();
|
||||||
switch (ShaderModel->GetKind()) {
|
switch (ShaderModel->GetKind()) {
|
||||||
case DXIL::ShaderKind::Pixel:
|
case DXIL::ShaderKind::Amplification:
|
||||||
|
case DXIL::ShaderKind::Mesh:
|
||||||
case DXIL::ShaderKind::Vertex:
|
case DXIL::ShaderKind::Vertex:
|
||||||
case DXIL::ShaderKind::Compute:
|
|
||||||
case DXIL::ShaderKind::Geometry:
|
case DXIL::ShaderKind::Geometry:
|
||||||
|
case DXIL::ShaderKind::Pixel:
|
||||||
|
case DXIL::ShaderKind::Compute:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
// RUN: %dxc -Emain -Tas_6_5 %s | %opt -S -hlsl-dxil-debug-instrumentation,parameter0=10,parameter1=20,parameter2=30 | %FileCheck %s
|
||||||
|
|
||||||
|
// Check that the AS thread IDs are added properly
|
||||||
|
|
||||||
|
// CHECK: %PIX_DebugUAV_Handle = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 0, i1 false)
|
||||||
|
// CHECK: %ThreadIdX = call i32 @dx.op.threadId.i32(i32 93, i32 0)
|
||||||
|
// CHECK: %ThreadIdY = call i32 @dx.op.threadId.i32(i32 93, i32 1)
|
||||||
|
// CHECK: %ThreadIdZ = call i32 @dx.op.threadId.i32(i32 93, i32 2)
|
||||||
|
// CHECK: %CompareToThreadIdX = icmp eq i32 %ThreadIdX, 10
|
||||||
|
// CHECK: %CompareToThreadIdY = icmp eq i32 %ThreadIdY, 20
|
||||||
|
// CHECK: %CompareToThreadIdZ = icmp eq i32 %ThreadIdZ, 30
|
||||||
|
// CHECK: %CompareXAndY = and i1 %CompareToThreadIdX, %CompareToThreadIdY
|
||||||
|
// CHECK: %CompareAll = and i1 %CompareXAndY, %CompareToThreadIdZ
|
||||||
|
|
||||||
|
struct smallPayload {
|
||||||
|
uint dummy;
|
||||||
|
};
|
||||||
|
|
||||||
|
[numthreads(1, 1, 1)] void main() {
|
||||||
|
smallPayload p;
|
||||||
|
p.dummy = 0;
|
||||||
|
DispatchMesh(2, 1, 1, p);
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
// RUN: %dxc -Emain -Tms_6_5 %s | %opt -S -hlsl-dxil-debug-instrumentation,parameter0=10,parameter1=20,parameter2=30 | %FileCheck %s
|
||||||
|
|
||||||
|
// Check that the MS thread IDs are added properly
|
||||||
|
|
||||||
|
// CHECK: %PIX_DebugUAV_Handle = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 0, i1 false)
|
||||||
|
// CHECK: %ThreadIdX = call i32 @dx.op.threadId.i32(i32 93, i32 0)
|
||||||
|
// CHECK: %ThreadIdY = call i32 @dx.op.threadId.i32(i32 93, i32 1)
|
||||||
|
// CHECK: %ThreadIdZ = call i32 @dx.op.threadId.i32(i32 93, i32 2)
|
||||||
|
// CHECK: %CompareToThreadIdX = icmp eq i32 %ThreadIdX, 10
|
||||||
|
// CHECK: %CompareToThreadIdY = icmp eq i32 %ThreadIdY, 20
|
||||||
|
// CHECK: %CompareToThreadIdZ = icmp eq i32 %ThreadIdZ, 30
|
||||||
|
// CHECK: %CompareXAndY = and i1 %CompareToThreadIdX, %CompareToThreadIdY
|
||||||
|
// CHECK: %CompareAll = and i1 %CompareXAndY, %CompareToThreadIdZ
|
||||||
|
|
||||||
|
struct smallPayload {
|
||||||
|
uint dummy;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PSInput {
|
||||||
|
float4 position : SV_POSITION;
|
||||||
|
float4 color : COLOR;
|
||||||
|
};
|
||||||
|
|
||||||
|
[outputtopology("triangle")]
|
||||||
|
[numthreads(3, 1, 1)]
|
||||||
|
void main(
|
||||||
|
in payload smallPayload small,
|
||||||
|
in uint tid : SV_DispatchThreadID,
|
||||||
|
in uint tig : SV_GroupIndex,
|
||||||
|
in uint groupId : SV_GroupID,
|
||||||
|
out vertices PSInput verts[3],
|
||||||
|
out indices uint3 triangles[1]) {
|
||||||
|
|
||||||
|
SetMeshOutputCounts(3 /*verts*/, 1 /*prims*/);
|
||||||
|
verts[tid].position = float4(0, 0, 0, 0);
|
||||||
|
verts[tid].color = float4(0,0,0,0);
|
||||||
|
triangles[0] = uint3(0, 1, 2);
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче