Граф коммитов

4756 Коммитов

Автор SHA1 Сообщение Дата
Xiang Li 84f68ed1a4
Open source DxilHash (#6846)
This pull request introduces the open-source implementation of hashing
functionality for DXIL containers.

DxilHash.cpp: Implements DXBC/DXIL container hashing functions.

This is first part for #6808
2024-08-07 11:43:10 -07:00
Cassandra Beckley 99f2d49810
[SPIR-V] Implement Shader Model 6.8 Extended Command Information (#6843)
Compile `SV_StartVertexLocation` as `BaseVertex` and
`SV_StartInstanceLocation` as `BaseInstance`.
2024-08-07 15:32:53 +02:00
Steve Urquhart 1e782479c6
[SPIRV] Generate DebugFunctionDefinition in real function instead of wrapper (#6758)
This PR moves the DebugFunctionDefinition instruction from the SPIR-V
wrapper to the real function. This supplies debugger users with greater
accuracy.
2024-08-07 15:29:03 +02:00
Nathan Gauër b52f9ba477
[SPIR-V] Don't flatten arrays during legalization (#6767)
When struct contains opaque resources, we must legalize the SPIR-V to
move those resources out of the struct (Vulkan doesn't allow composite
to store opaque resources).
Before this change, any resource array would also be flattened due to
the pass flattening everything by default.

Patched SPIRV-Tools to allow some level of selection in what we flatten.
Not perfect, as we would flatten all arrays or all composites and cannot
pick only one variable to flatten, but for now this should be enough.

Fixes #6745
Signed-off-by: Nathan Gauër <brioche@google.com>

---------

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-08-06 10:09:34 -04:00
Xiang Li 8652894e69
[Validator] Remove the pModule input for RunInternalValidator (#6845)
This change ensures that data validation occurs within the container
itself,
rather than relying on the module—especially since the module may be
modified during container assembly.

Furthermore, simplifying the validator’s interface would be an added
benefit.
2024-08-05 10:43:44 -07:00
Xiang Li cc6c6656d5
[DOC] update release note for remove WaveMatrix. (#6842)
Add remove WaveMatrix in release note.
2024-08-02 06:51:33 -07:00
Antonio Maiorano 91b348912b
Add llvm assertions trap and no strings (#6838)
Add option LLVM_ASSERTIONS_NO_STRINGS
    
When defined, drop the stringized expression, __FILE__, and __FUNCTION__
    strings passed to llvm_assert. This dramatically reduces the binary
    size, which is useful when enabling assertions in a non-debug build.

   Add option LLVM_ASSERTIONS_TRAP
    
When enabled, this forces asserts to always trap. Currently, on Windows
    asserts calls RaiseException, while they trap on non-Windows. This
    option makes the assertion behaviour consistent across platforms.
2024-08-01 15:37:02 -04:00
Minmin Gong 71d6766881
Fix the SAL of IDxcResult::GetOutput (#4487)
The ppOutputName parameter can be nullptr and can return nullptr. Change
its SAL to _COM_Outptr_opt_result_maybenull_.

Related to #4149 .
2024-08-01 12:05:56 -07:00
Devon Loehr 5ecee0b599
[NFC] Remove implicit `this` capture in lambdas (#6761)
When declaring a lambda with a value-capture default [=, ...], the this
pointer is implicitly captured by value as well. This results in
potentially-unintuitive behavior and has been deprecated in C++20. It
produces a warning in newer versions of clang
(https://reviews.llvm.org/D142639).

This PR makes the implicit captures explicit, preventing the warning. It
does not change the compiled code at all, since it's just removing some
syntactic sugar.
2024-08-01 11:50:30 -07:00
Xiang Li 8b33431849
Remove WaveMatrix (#6807)
Remove WaveMatrix from main branch.
The DXIL operations are changed to Reserved to avoid affect DXIL
operation ID.
2024-08-01 10:52:13 -07:00
David Neto d324261642
Reassociation: fix counting of constant multiplicative factors (#6830)
In the middle of rewriting expressions like (A*B + A*C + D) to pull
common factor A out, the algorithm finds that there's actually only one
A. This is unexpected, and it fires an assertion.

This can occur when A is a constant, and constant -A also appears in the
terms somewhere else.

There is no harm in this situation, however, because the algorithm then
creates an addition-tree, but with a single element, and that's still
correct.

This bookkeeping issue was fixed later in LLVM, at
95abfa35d6

Unfortunately the associated test doesn't translate cleanly to DXC-era
LLVM. I've added test case reduced from our original case.

Fixed: #6829
2024-08-01 11:41:05 -04:00
Steven Perron 4fabd7a318
[SPIRV] Implement Gis option for spir-v (#6840)
Fixes #3331
2024-07-31 19:55:36 -04:00
Steven Perron 01fa18a57b
[SPRIV] Allow vk-invert-y for MS shaders (#6839)
Fixes #3154
2024-07-31 13:53:48 -07:00
Steven Perron bb373fb88e
[spirv] Avoid adding spec and push constants to global ubo (#6832)
The code the decides which global variables to include in the implicit
global cbuffer does not check for spec constant or push constant. They
end up being incorrectly include in it, causing problems.

The solution is to add those to the type of variable that should be
skipped.

Fixes #4542
2024-07-31 08:40:01 -04:00
Xiang Li ef043e90f3
Fix warning when use implicit launch type. (#6837)
By default, the launch type should be set to ‘Broadcast’ when diagnosing
barriers. However, the current behavior sets the default launch type to
‘Invalid,’ resulting in warnings when the launch type is not explicitly
specified as an attribute.

To address this issue, we’ll adjust the default setting to ‘Broadcast’
and thereby resolve the problem.

Fixes #6836

---------

Co-authored-by: Damyan Pepper <damyanp@microsoft.com>
2024-07-30 17:16:06 -07:00
Antonio Maiorano b6f7ff81e9
Use llvm_assert/assert.h on all platforms, not just Windows (#6815)
This makes it possible to define how assert works on all platforms. The
header was already being included by String.cpp, and was already
designed to work for non-Windows platforms.

Also modify the non-Windows llvm_assert to emit the assertion message to
stderr and trap. We cannot call standard assert as we are overriding it
via include dirs, so there's no way to include the standard one and call
it.
2024-07-29 20:42:09 +00:00
David Neto 9ef04817ef
Avoid OOB index when fixing constant array-initialization (#6825)
If the index on a constant store into an array is negative or out of
bounds, that's an error, but shouldn't make the compiler index a vector
out of bounds.

Fixed: #6824
2024-07-26 18:44:08 -04:00
David Neto aa048b81ed
Fix escape in Python string in lit.cfg (#6826)
Change Python regexp ' clang\+\+ ' to ' clang\\+\\+' We're trying to
match fixed strings like ` clang++ `, but `\+` is not a valid Python
escape sequence. Use `\\+` so the regexp machinery sees `\+`
2024-07-26 18:43:38 -04:00
Xiang Li 716e74100a
[NFC] create static lib for validator. (#6811)
A static lib dxcvalidator is added.
The validators in dxcompiler and dxrfallbackcompiler links dxcvalidator.

Fixes #6790

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-07-26 14:46:07 -07:00
Jesse Natalie bc91bc57c4
Reserve some RDAT/DXIL enum values used by the mesh node preview (#6818)
Let's ensure we don't accidentally stomp on these. If we do choose to
break them, it should be intentional, not accidental.
2024-07-26 14:23:38 -07:00
Antonio Maiorano ef4f44de20
Fix MSAN use-after-free in SmallVectorImpl dtor (#6819)
Hit when compiled with `-fsanitize-memory-use-after-dtor`. This was
fixed upstream here:

527352b6ac
This applies the same patch.
2024-07-26 13:38:15 -04:00
Xiang Li 0777bff092
[Doc] Release note update for 1.8.2407. (#6821)
Add note for loop structurizer fixes.
Fix the ReleaseNotes.md path.
2024-07-25 10:31:34 -07:00
David Peixotto 83e4cd4084
Fix crash in constant initializer lowering for global variable. (#6820)
In #6814, we modified the compiler to avoid generating bad code in some
cases for array initializers. However, this caused a crash in the case
where the initializer does not use a GEP expression for addressing
because the `GV` will be null.

I considered setting `GV` to the value in the `store` pointer operand,
but it looked like `GV` was also checked elsewhere for null and did not
want to modify the behavior of the code in other places.

The fix is to check if we found a global variable before validating the
array case.
2024-07-25 09:19:04 -07:00
Steve Urquhart e0fbce714d
[SPIRV] Generate DebugTypeMatrix (#6757)
When the OpenCL.DebugInfo.100 debug info was implemented, there was no
DebugTypeMatrix. Now that NonSemantic.Shader.DebugInfo.100 has been
merged, we should use DebugTypeMatrix. This PR corrects that oversight.
2024-07-24 11:13:00 +02:00
Antonio Maiorano 4a5253d003
Fix assertion when compiling array of struct init (#6814)
In CGHLSLMSFinishCodeGen's BuildImmInit, when initializing an array, if
the init value type doesn't match the array element type, we must bail
and instead, have it inject a call to the global ctor. Without this,
builds with asserts enabled would assert later with "Wrong type in array
element initializer". In non-assert builds, this invalid IR would be
removed, and valid code emitted.

See https://github.com/microsoft/DirectXShaderCompiler/issues/5294
2024-07-23 20:46:16 +00:00
Nathan Gauër 4a3a5dad43
[SPIR-V] Add support for D3D12 descriptor heaps (#6650)
This commit adds support for Sampler/Resource descriptor heaps in DXC.
Support for those heaps on the SPIR-V side requires no other extension
than SPV_EXT_descriptor_indexing.
On the Vulkan side, the VK_EXT_mutable_descriptor_type will be required
as multiple descriptor types must be allowed on the same binding.

When loading a type from a heap, DXC generates a new OpRuntimeArray of
the correct type, and binds it to `set=0,
binding=<BindingNumberOfTheHeap>`.
This means multiple OpRuntimeArrays will share the same binding. This is
why VK_EXT_mutable_descriptor_type is required.

This implementation uses at most 3 bindings:
 - N OpRuntimeArray as binding A for the ResourceDescriptorHeap
 - N OpRuntimeArray as binding B for the SamplerDescriptorHeap
- 1 OpRuntimeArray %counter_type for the ResourceDescriptorHeap
counters.

The bindings are only allocated if used. If only the
SamplerDescriptorHeap is used, a single binding is required.

The binding allocation logic is:
 1. allocate bindings for every resources, excluding heaps.
2. If ResourceDescriptorHeap is used, find the first unused binding in
set=0 and use it.
 3. Same for the SamplerDescriptorHeap
 4. Same for the counters.

UAV counters are not always created, only if used.
When used, they are stored in an OpRuntimeArray. The index of a counter
in that array
is equal to the index of the associated resource in its own
OpRuntimeArray.

```hlsl
        RWStructuredBuffer a = ResourceDescriptorHeap[2];
        a.IncrementCounter();
        // buffer in descriptorSet 0, binding 0, OpRuntimeArray[index=2]
        // counter in descriptorSet 0, binding 1, OpRuntimeArray[index=2]
```

As-is, this PR doesn't allow resource heaps to alias regular resources,
or to overlap.
A follow-up PR will add 3 flags to override each binding/set pairs:
 - 'fvk-bind-resource-heap <set> <binding>'
 - 'fvk-bind-sampler-heap <set> <binding>'
 - 'fvk-bind-counter-heap <set> <binding>'

---------

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-07-22 12:08:13 -04:00
Nathan Gauër 3508cdc01a
[SPIR-V] Lower templated enums correctly. (#6768)
Templated enums lowering was not supported. This commit fixes those
cases.

Fixes #6753

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-07-19 21:25:04 -04:00
Nathan Gauër e0c83a8cf2
[SPIR-V] Fix crash when using entrypoint prototype (#6760)
When the prototype of an entrypoint was defined, the codegen crashed
because it failed to filter this partial declaration when adding
functions to the work-queue.

Fixes #6750

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-07-19 21:23:42 -04:00
Chris B 4f46fbc1ec
[Action] Use pull_request_target (#6803)
We should use the pull_request_target option here so that the PR runs
from the pipeline in the target rather than the PR source branch. This
allows the action to run with reduced security implications.
2024-07-19 18:35:34 -05:00
gracezhang72 84c0a09557
Fix debug info offsets for vectors with 16-bit types (#6775)
This fixes a bug where the offsets for elements in vectors with 16-bit
types doesn't take into account alignment bits and PIX wouldn't display
vector element values correctly in the shader debugger. Eg. if
`-enable-16bit-types` wasn't set, the offsets for a min16float4 would be
0, 16, 32, 48 instead of 0, 32, 64, 96.

Also removed the assert in PopulateAllocaMap_StructType that was
checking whether the calculated aligned offset matches the packed offset
(from SortedMembers) because it was false for members with sizes smaller
than the alignment size.
2024-07-19 14:02:18 -07:00
Greg Roth c4e9976904
Add upcoming release section to release notes (#6802)
This is the section where the next release notes will be inserted. It's
just a placeholder instruction for now.

Fixes #6697
2024-07-19 13:37:47 -07:00
Biswapriyo Nath 5cb6faaf1b
[NFC] Fix incorrect use of UNREFERENCED_PARAMETER macro (#6806)
In CalcResTypeSize function, UNREFERENCED_PARAMETER macro is used with a
parameter which is referenced in return statement. That macro was added
in
    6ee4074a4b but it was not removed when
"DxilModule &M" was referenced in
86073a3b0b
    
This fixes the following compiler error with clang 18.1.8 with mingw-w64
toolchain.
    
DxilContainerReflection.cpp:1512:3: error: object of type 'DxilModule'
cannot be assigned because its copy assignment operator is implicitly
deleted
     1512 |   UNREFERENCED_PARAMETER(M);
          |   ^
    winnt.h:1387:40: note: expanded from macro 'UNREFERENCED_PARAMETER'
     1387 | #define UNREFERENCED_PARAMETER(P) {(P) = (P);}
          |                                        ^
2024-07-19 11:59:20 -07:00
Steven Perron c01b4f4c96
Iterate over the spir-v fields to handle bitfields (#6746)
The code that implements `RWByteAddressBuffer::Store` will iterate over
all of the fields in a struct to write each element in the struct.
However, it does not use the "Spir-V fields", which accounts for
multiple fields being packed into the same bitfield. This is fixed by
using the `forEachSpirvField` function to make sure that the bitfield
are correctly handled.

Fixes #6483
2024-07-19 17:33:40 +00:00
Steven Perron 74ba8452df
Splat function argument (#6747)
When a scalar variable is passed as the argument to an inout vector
parameter,
then the scalar is suppose to be splatted. After returning from the
function, we need to extract the first element from the parameter to
store back into the scalar.

Fixes #6568
2024-07-19 16:13:47 +00:00
Nathan Gauër 9c154fb190
[SPIR-V] Fix flattened SPIR-V variable codegen. (#6756)
When the [branch] annotation is used, switches are converted into an
if/else tree.
Issue arise when declaring a variable into a switch case:
- when flattened, the same variable could be traversed twice in case of
a case fall-through.

In addition, there was a small bug in the flattening logic: only breaks
were stopping the handling of further statements, while early-returns
were ignored. This was not an important bug as it only added more
dead-code, but it was wrong.

Fixes #6718

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-07-19 11:32:42 -04:00
Nathan Gauër 1028410a55
[SPIR-V] Fix invalid isnan codegen (#6754)
IsNan returns a boolean, even is the input-type is a float. This was
working in most cases except:
 - if the layout was not Void
 - if the input type was not a matrix

The first bug is because a bool memory layout/representation is not
specified, and shall never be exposed to externaly-accessible memory.
Hence, if we saw a layout rule != Void, we converted it to a UINT. When
calling isnan, the layout rule should not be propagated as we loose any
layout info.

The second is because our codegen assumed matrix operations returned a
matrix with the same type as the input parameters. In the case of isnan,
this was just wrong.

Fixes #6712

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-07-19 11:18:07 -04:00
Tianlan Zhou 6f1c8e2443
Disassembler: Remove duplicated "signature" in output (#6726)
There is an extra "signature" in the Patch Constant signature part of
the disassembler output, causing the "Patch Constant signature
signature" to appear. This PR removes the extra "signature" from the
output.

Example HLSL input:

```hlsl
struct OutputConstantData {
    float tessFactor[4] : SV_TessFactor;
    float insideTessFactor[2] : SV_InsideTessFactor;
};

OutputConstantData HSConstant() {
    OutputConstantData output;
    return output;
}

[domain("quad")]
[partitioning("integer")]
[outputtopology("triangle_cw")]
[outputcontrolpoints(1)]
[patchconstantfunc("HSConstant")]
void HSMain() {}
```

Example Disassembler output:

```diff
  ...
  ;
- ; Patch Constant signature signature:
+ ; Patch Constant signature:
  ;
  ; Name                 Index   Mask Register SysValue  Format   Used
  ; -------------------- ----- ------ -------- -------- ------- ------
  ; SV_TessFactor            0      w        0 QUADEDGE   float      w
  ; SV_TessFactor            1      w        1 QUADEDGE   float      w
  ; SV_TessFactor            2      w        2 QUADEDGE   float      w
  ; SV_TessFactor            3      w        3 QUADEDGE   float      w
  ; SV_InsideTessFactor      0      w        4  QUADINT   float      w
  ; SV_InsideTessFactor      1      w        5  QUADINT   float      w
  ;
  ...
```
2024-07-18 15:17:16 -07:00
Biswapriyo Nath 198e61b788
[NFC]: Rename a template parameter conflict with CALLBACK macro (#6759)
This imports upstream commit

54bff1522f
    
This fixes the following compiler error with clang 18.1.8 with mingw-w64
toolchain.
    
    CFG.h:916:22: error: expected a qualified name after 'typename'
      916 |   template <typename CALLBACK>
          |                      ^
    minwindef.h:90:18: note: expanded from macro 'CALLBACK'
       90 | #define CALLBACK __stdcall
          |                  ^
2024-07-18 15:10:40 -07:00
Chris B a2a220bc61
[CMake] Add an option to disable source generation (#6730)
This change adds a new CMake configuration option
`HLSL_DISABLE_SOURCE_GENERATION` which allows a user to disable
generating the in-tree sources which contributte to DXC's source
releases. This option should only be used by users building DXC and not
modifying it.

Resolves #6728
2024-07-18 10:51:54 -05:00
Tex Riddell 5cfefc7d0b
Fix CB vector to scalar array translation generating invalid IR (#6777)
In the special code to handle the memcpy pattern where a constant buffer
contains a vector array that initializes a local (or static global)
scalar array for use by the shader, an invalid assumption was made that
if the memcpy dest was global, that the src is global as well.

This was not the case, and when expecting to generate constant
expressions to index the src, these generated orphaned instructions
instead, leading to invalid IR.

This fixes the issue by leveraging ReplaceConstantWithInst, and setting
the insertion point for the Builder. Now, replacement *could* fail, if
src instructions don't dominate replacement uses, so bool for replaced
all is returned from replaceScalarArrayWithVectorArray.

Another issue was that it would replace the dest for the original memcpy
with src along the way. Now, if we don't replace all uses, this turns
the memcpy into a no-op and any remaining uses are no longer coming from
src, but an undef dest instead. This was also fixed to skip this
replacement, then clean up this use if all other uses have been
successfully replaced.

Fixes #6510
2024-07-17 20:32:50 -07:00
Steven Perron 759e9e1da7
Allow cap and extention attribute on member variables and type aliases (#6742)
This implements the changes proposed in
https://github.com/microsoft/hlsl-specs/pull/270.
2024-07-17 14:59:45 +00:00
Steven Perron 0703d9efad
[SPIRV] Fix documentation for RayTCurrent (#6784)
The documentation says that we use the HitTKHR builtin to implement
RayTCurrent. However, HitTKHR was renamed to RayTMaxKHR. We update
the documentation to represent that change.

Fixes #6739
2024-07-17 08:49:50 -04:00
Xiang Li 4cde6be812
[Release Note] Add release note for 1.8.2407 (#6776)
Add initial release note for 1.8.2407.

---------

Co-authored-by: Greg Roth <grroth@microsoft.com>
2024-07-16 20:36:03 -07:00
Greg Roth 9fa4618de9
Release Note for OS-normalized include paths (#6789)
The behavior was changed with #6317 so that regardless of spelling in
the shader, the include path will conform to the host OS style for the
purposes of the include handler. This just adds a release note for that
new behavior.

Fixes #6669
2024-07-16 19:22:55 +00:00
Greg Roth 9f0764b4f9
Add Release Notes Guidance to CONTRIBUTING (#6778)
Add guidance for how release notes should be documented at the time
of the change going in as well as some suggestions for how to format
that documentation.

Contributes to #6697

---------

Co-authored-by: Chris B <cbieneman@microsoft.com>
2024-07-16 10:48:05 -07:00
Natalie Chouinard a54abe841e
Add earlier check for invalid SV_Target[n] (#6771)
According to the HLSL semantics documentation, the valid semantic
indices for SV_Target[n] are 0 <= n <= 7:

https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics

A check for this already exists in DXIL validation, but for large values
of n, crashes and/or buffer overruns may occur during compilation before
validation, so an earlier check is needed.

Fixes #6115
2024-07-12 22:37:59 +00:00
David Neto b18fe87633
Add CMake option DXC_CODEGEN_EXCEPTIONS_TRAP (#6764)
When enabled, any hlsl::Exception thrown during code generation and
optimization will cause the process to trap.


---
edit: I've changed the implementation to generate a trap, instead of
std::abort
2024-07-12 09:41:08 -04:00
Greg Roth 8fce06b03c
Enable Living Release Notes (#6772)
Moving the source file for the README.md for github and nuget releases
into the DXC repo. It should be updated with relevant notes for the
upcoming release whenever they are made in main such that they will
already be available when the release is built.

Part of #6697
2024-07-11 22:47:31 +00:00
David Neto ffee5dcbe9
Use a real instruction for the sentinel in the Instruction intrusive … (#6762)
…list

Instructions in a BasicBlock are maintained in a doubly-linked list. The
links are "instrusive" in the sense that with inheritance tricks the
Next and Prev nodes are embedded in the Instruction object itself.

The linked list uses a sentinel object to mark the tail of the list.

Previously, the sentinel was an ilist_half_node<Instruction> which just
consists of a 'Instruction* Prev', but then it was cast to Instruction*.
This is flagged by the undefined behaviour sanitizer in some cases.
Also, it's weird and wrong.

Upstream LLVM has entirely reimplimented the intrusive list to avoid
such problems. But that's a massive change.

This change uses a real Instruction object as the sentinel. The
instruction is only used for its Next and Prev properties. I used an
UnreachableInst becuase it's small and simple.

Issue: #6446
2024-07-11 18:10:20 -04:00
Justin Bogner d91523292e
Clean up inaccurate type information in resource metadata docs (#6763)
The `ResElem` type doesn't exist, and the example here seemed to imply
that the similar `ResRet` type was used in resource metadata. This is
incorrect, so fix the examples to match types that would actually show
up in this metadata.

Note: In practice the metadata doesn't generally actually refer to a
variable, but just an `undef` of the right type. I've opted not to
change the examples to reflect that here to minimize the change, but it
might be nice to describe when/why this occurs.

Fixes #3411
2024-07-10 21:11:33 +00:00