Skip to content

Rewriter generate consistent bindings #7643

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/dxc/Support/HLSLOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ class DxcDefines {

struct RewriterOpts {
bool Unchanged = false; // OPT_rw_unchanged
bool ConsistentBindings = false; // OPT_rw_consistent_bindings
bool SkipFunctionBody = false; // OPT_rw_skip_function_body
bool SkipStatic = false; // OPT_rw_skip_static
bool GlobalExternByDefault = false; // OPT_rw_global_extern_by_default
Expand Down
2 changes: 2 additions & 0 deletions include/dxc/Support/HLSLOptions.td
Original file line number Diff line number Diff line change
Expand Up @@ -563,6 +563,8 @@ def nologo : Flag<["-", "/"], "nologo">, Group<hlslcore_Group>, Flags<[DriverOpt

def rw_unchanged : Flag<["-", "/"], "unchanged">, Group<hlslrewrite_Group>, Flags<[RewriteOption]>,
HelpText<"Rewrite HLSL, without changes.">;
def rw_consistent_bindings : Flag<["-", "/"], "consistent-bindings">, Group<hlslrewrite_Group>, Flags<[RewriteOption]>,
HelpText<"Generate bindings for registers that aren't fully qualified (to have consistent bindings).">;
def rw_skip_function_body : Flag<["-", "/"], "skip-fn-body">, Group<hlslrewrite_Group>, Flags<[RewriteOption]>,
HelpText<"Translate function definitions to declarations">;
def rw_skip_static : Flag<["-", "/"], "skip-static">, Group<hlslrewrite_Group>, Flags<[RewriteOption]>,
Expand Down
2 changes: 2 additions & 0 deletions lib/DxcSupport/HLSLOptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1349,6 +1349,8 @@ int ReadDxcOpts(const OptTable *optionTable, unsigned flagsToInclude,
// Rewriter Options
if (flagsToInclude & hlsl::options::RewriteOption) {
opts.RWOpt.Unchanged = Args.hasFlag(OPT_rw_unchanged, OPT_INVALID, false);
opts.RWOpt.ConsistentBindings =
Args.hasFlag(OPT_rw_consistent_bindings, OPT_INVALID, false);
opts.RWOpt.SkipFunctionBody =
Args.hasFlag(OPT_rw_skip_function_body, OPT_INVALID, false);
opts.RWOpt.SkipStatic =
Expand Down
1 change: 1 addition & 0 deletions tools/clang/include/clang/AST/HlslTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,7 @@ bool IsHLSLNumericOrAggregateOfNumericType(clang::QualType type);
bool IsHLSLCopyableAnnotatableRecord(clang::QualType QT);
bool IsHLSLBuiltinRayAttributeStruct(clang::QualType QT);
bool IsHLSLAggregateType(clang::QualType type);
hlsl::DXIL::ResourceClass GetHLSLResourceClass(clang::QualType type);
clang::QualType GetHLSLResourceResultType(clang::QualType type);
clang::QualType GetHLSLNodeIOResultType(clang::ASTContext &astContext,
clang::QualType type);
Expand Down
8 changes: 8 additions & 0 deletions tools/clang/lib/AST/HlslTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,14 @@ bool IsHLSLResourceType(clang::QualType type) {
return false;
}

hlsl::DXIL::ResourceClass GetHLSLResourceClass(clang::QualType type) {

if (HLSLResourceAttr *attr = getAttr<HLSLResourceAttr>(type))
return attr->getResClass();

return hlsl::DXIL::ResourceClass::Invalid;
}

bool IsHLSLHitObjectType(QualType type) {
return nullptr != getAttr<HLSLHitObjectAttr>(type);
}
Expand Down
48 changes: 48 additions & 0 deletions tools/clang/test/HLSL/rewriter/consistent_bindings.hlsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//UAV

RWByteAddressBuffer output1;
RWByteAddressBuffer output2;
RWByteAddressBuffer output3 : register(u0);
RWByteAddressBuffer output4 : register(space1);
RWByteAddressBuffer output5 : SEMA;
RWByteAddressBuffer output6;
RWByteAddressBuffer output7 : register(u1);
RWByteAddressBuffer output8[12] : register(u3);
RWByteAddressBuffer output9[12];
RWByteAddressBuffer output10[33] : register(space1);
RWByteAddressBuffer output11[33] : register(space2);
RWByteAddressBuffer output12[33] : register(u0, space2);

//SRV

StructuredBuffer<float> test;
ByteAddressBuffer input13 : SEMA;
ByteAddressBuffer input14;
ByteAddressBuffer input15 : register(t0);
ByteAddressBuffer input16[12] : register(t3);
ByteAddressBuffer input17[2] : register(space1);
ByteAddressBuffer input18[12] : register(t1, space1);
ByteAddressBuffer input19[3] : register(space1);
ByteAddressBuffer input20 : register(space1);

//Sampler

SamplerState sampler0;
SamplerState sampler1;
SamplerState sampler2 : register(s0);
SamplerState sampler3 : register(space1);
SamplerState sampler4 : register(s0, space1);

//CBV

cbuffer test : register(b0) { float a; };
cbuffer test2 { float b; };
cbuffer test3 : register(space1) { float c; };
cbuffer test4 : register(space1) { float d; };

float e;

[numthreads(16, 16, 1)]
void main(uint id : SV_DispatchThreadID) {
output2.Store(id * 4, 1); //Only use 1 output, but this won't result into output2 receiving wrong bindings
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
RWByteAddressBuffer output1 : register(u2);
RWByteAddressBuffer output2 : register(u15);
RWByteAddressBuffer output3 : register(u0);
RWByteAddressBuffer output4 : register(u0, space1);
RWByteAddressBuffer output5 : SEMA : register(u16);
RWByteAddressBuffer output6 : register(u17);
RWByteAddressBuffer output7 : register(u1);
RWByteAddressBuffer output8[12] : register(u3);
RWByteAddressBuffer output9[12] : register(u18);
RWByteAddressBuffer output10[33] : register(u1, space1);
RWByteAddressBuffer output11[33] : register(u33, space2);
RWByteAddressBuffer output12[33] : register(u0, space2);
StructuredBuffer<float> test : register(t1);
ByteAddressBuffer input13 : SEMA : register(t2);
ByteAddressBuffer input14 : register(t15);
ByteAddressBuffer input15 : register(t0);
ByteAddressBuffer input16[12] : register(t3);
ByteAddressBuffer input17[2] : register(t13, space1);
ByteAddressBuffer input18[12] : register(t1, space1);
ByteAddressBuffer input19[3] : register(t15, space1);
ByteAddressBuffer input20 : register(t0, space1);
SamplerState sampler0 : register(s1);
SamplerState sampler1 : register(s2);
SamplerState sampler2 : register(s0);
SamplerState sampler3 : register(s1, space1);
SamplerState sampler4 : register(s0, space1);
cbuffer test : register(b0) {
const float a;
}
;
cbuffer test2 : register(b1) {
const float b;
}
;
cbuffer test3 : register(b0, space1) {
const float c;
}
;
cbuffer test4 : register(b1, space1) {
const float d;
}
;
const float e;
[numthreads(16, 16, 1)]
void main(uint id : SV_DispatchThreadID) {
output2.Store(id * 4, 1);
}


Loading