Skip to content
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
2 changes: 2 additions & 0 deletions tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -8069,6 +8069,8 @@ def err_hlsl_vk_pointer_cast_alignment: Error<
"Vulkan buffer pointer cannot be cast to greater alignment">;
def err_hlsl_vk_static_pointer_cast_type: Error<
"vk::static_pointer_cast() content type must be base class of argument's content type">;
def err_hlsl_vk_rwbyteaddressbuffer_16bit_store : Error<
"RWByteAddressBuffer does not support storing 16bit types in Vulkan">;
def warn_spirv_node_shaders_experimental : Warning<
"SPIR-V implementation of node shaders is experimental and subject to change">;
// SPIRV Change Ends
Expand Down
12 changes: 12 additions & 0 deletions tools/clang/lib/Sema/SemaHLSL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11332,6 +11332,18 @@ HLSLExternalSource::DeduceTemplateArgumentsForHLSL(
IsBABLoad = intrinsicOp == (UINT)IntrinsicOp::MOP_Load;
IsBABStore = intrinsicOp == (UINT)IntrinsicOp::MOP_Store;
}
#ifdef ENABLE_SPIRV_CODEGEN
// We don't support 16 bit stores in SPIRV for RWByteAddressBuffer due to
// representing the buffer as a series of 32 bit values.
// See https://github.com/microsoft/DirectXShaderCompiler/issues/8172
if (IsBABStore && getSema()->getLangOpts().SPIRV) {
if (getSema()->getASTContext().getIntWidth(argTypes[2]) == 16) {
getSema()->Diag(Args[1]->getLocStart(),
diag::err_hlsl_vk_rwbyteaddressbuffer_16bit_store);
return Sema::TemplateDeductionResult::TDK_Invalid;
}
}
#endif
if (ExplicitTemplateArgs && ExplicitTemplateArgs->size() >= 1) {
SourceLocation Loc = ExplicitTemplateArgs->getLAngleLoc();
if (!IsBABLoad && !IsBABStore) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// REQUIRES: spirv
// RUN: %dxc -T cs_6_2 -E main -spirv -enable-16bit-types -fcgl %s -verify

RWByteAddressBuffer DstBuffer : register(u1);

[numthreads(1, 1, 1)]
void main()
{
DstBuffer.Store<uint16_t>(0, 1); // expected-error {{RWByteAddressBuffer does not support storing 16bit types in Vulkan}}
}
Loading