summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2018-01-21specialize witness tables when needed when specializing ↵Yong He
`lookup_witness_table` instruction. (#376)
2018-01-21Merge pull request #372 from csyonghe/masterYong He
Allow type expression as type argument, fix global param enum order
2018-01-21Add directive to ignore file for test runnerTim Foley
2018-01-21Improvements and bug fixes for global type parametersYong He
1. allow spReflection_FindTypeByName to accept arbitrary type expression string 2. allow const int generic value to be used as expression value, and as array size 3. various bug fixes in witness table specialization / function cloning during specializeIRForEntryPoint to avoid creating duplicate global values, not copying the right definition of a function from the other module, not cloning witness tables that are required by specializeGenerics etc.
2018-01-20bug fixesYong He
fixes #373 fixes bug that misses current translation unit's scope when resolving entry-point global type argument expression.
2018-01-19Make specialization presserve global parameter enumeration order in ↵Yong He
reflection data
2018-01-19Allow arbitrary type string as type argument in spAddEntryPointEx.Yong He
2018-01-18Merge pull request #371 from csyonghe/masterYong He
All compiler fixes to get ir branch work with falcor feature demo.
2018-01-18rename expected test result file.Yong He
2018-01-17cleanup unused code.Yong He
2018-01-17All compiler fixes to get ir branch work with falcor feature demo.Yong He
- support overloaded generic function. this involves adding a new expression type, `OverloadedExpr2` to hold the candidate expressions for the generic function decl being referenced. - make BitNot a normal IROp instead of an IRPseudoOp - make sure we clone the decorations of parameters when cloning ir functions - propagate geometry shader entry point attributes (`[maxvertexcount]` and `[instance]`) through HLSL emit - IR emit: handle geometry shader entry-point parameter decorations, such as 'triangle'. - IR emit: treat geometry shader stream output typed ir value as `should fold into use`.
2018-01-16Merge pull request #370 from csyonghe/masterYong He
bug fixes to get falcor example shader code to compile.
2018-01-16bug fixes to get falcor example shader code to compile.Yong He
1. prevent cyclic lookups when an interface inherits transitively from itself. 2. in `createGlobalGenericParamSubstitution`, create a default substitution for the base type declref before using it to lookup the witness table.
2018-01-16Allow extension on interface (#369)Yong He
This completes item 5 in issue #361. The interesting change is that when checking for interface conformance, we include the requirements (include transitive interfaces) defined in extensions as well. (check.cpp line 1946) All the other changes are for one thing: reoder the semantic checkings to two explicit stages: check header and check body. In check header phase, we check everything except function bodies, register all extensions with their target decls, then check interface conformances for all concrete types. In body checking phase, we look inside the function bodies and check concrete statements/expressions. This change ensures that we take extension into consideration in all places where it should be.
2018-01-15Merge pull request #367 from csyonghe/extension2Yong He
Support transitive interfaces
2018-01-15cleanup debug codeYong He
2018-01-15Support transitive interfacesYong He
This commit is a bunch of quick hacks to get transitive interfaces to work. The idea is for each concrete type we create one giant witness table that contains entries for all the transitively reachable interface requirements, and then create one copy of that witness table for each interface it implements. `DoLocalLookupImpl` now also looks up in inherited interface decles when looking up for a symbol in an interface decl. When visiting `InheritanceDecl` in `lower-to-ir`, create copies of the giant witness table for each transitively inherited interface, so that these witness tables can be found later when the IR is specialized. Re-enable the `copy all witness tables` hack in `specializeIRForEntryPoint` to ensure those transitive witness tables are copied over.
2018-01-15Merge pull request #365 from csyonghe/extensionYong He
Allow extension of a concrete type to implement additional interface
2018-01-15Merge branch 'master' into extensionYong He
2018-01-15Merge pull request #366 from csyonghe/keywordrenameYong He
add support for `extension` and `type_param` keywords
2018-01-14add support for `extension` and `type_param` keywordsYong He
2018-01-14temporary workaround to fix test case failures.Yong He
2018-01-14Fixup field lookup from a member function defined in an extensionYong He
This fixes item 2 in #361 Modifies existing extension-multi-interface.slang test case to cover the additional scenario.
2018-01-14allow extension of a concrete type to implement additional interfaceYong He
Also support the scenario that the extension declares conformance to interface I, and a method M in I is already supported by the base implementation.
2018-01-13Merge pull request #364 from csyonghe/assoctypeYong He
Support nested generics
2018-01-13Fix creation of `ThisTypeSubstitution`.Yong He
`createDefaultSubstitutions` now responsible for creating a `ThisTypeSubstitution` when `decl` is an `InterfaceDecl`. This is to ensure a reference to an associated type decl from the same interface that defines the assoctype decl will get a `ThisTypeSubstitution` so that the right hand side of it can be replaced by future substitutions.
2018-01-13remove out-of-date changesYong He
2018-01-12Support nested genericsYong He
fixes #362
2018-01-12Refactor substitution representation in DeclRefBase (#363)Yong He
This commit changes the type of `DeclRefBase::substitutions` from `RefPtr<Substitutions>` to `SubstitutionSet`, which is a new type defined as following: ``` struct SubstitutionSet { RefPtr<GenericSubstitution> genericSubstitutions; RefPtr<ThisTypeSubstitution> thisTypeSubstitution; RefPtr<GlobalGenericParamSubstitution> globalGenParamSubstitutions; } ``` This change get rid of most helper functions to retreive the substitution of a certain type, as well as surgery operations to insert a `ThisTypeSubstitution` or `GlobalGenericTypeSubstittuion` at top or bottom of the substitution chain. It also simplies type comparison when certain type of substitution should not be considered as part of type definition.
2018-01-09bruteforce implementation of witness table resolution for associated (#358)Yong He
2018-01-04Bug fixes for Slang integration (#356)Yong He
* fix #353 * move validateEntryPoint to after all entrypoints has been checked * bug fix: DeclRefType::SubstituteImpl should change ioDiff * bug fix: generic resource usage should have count of 1 instead of 0. * update test case
2018-01-03Merge pull request #349 from csyonghe/masterYong He
Add API for querying TypeLayout from a Type
2018-01-03Fix type lookup of global type argumentsYong He
Global type argument lookup should be done in both loaded modules and current trnaslation units. This is the same as the logic of spReflection_FindTypeByName, so it is extracted into `CompileRequest::lookupGlobalDecl(Name*)` method and reused in places.
2018-01-03Merge https://github.com/shader-slang/slangYong He
2018-01-03Fix bug around arrays of structs of resources (#352)Tim Foley
Should fix #351 The basic problem is that the type layout logic in Slang isn't taking into account the way that resource-type fields in aggregate types get split. When you just have a bare aggregate, this oversight doesn't cause a problem, but once you put those aggregates into an array, the problems become clear. Given: ```hlsl struct Test { Texture2D a; Texture2D b; }; Test test[8]; ``` The default type-layout algorithm gives `Test::a` an offset of zero, and `Test::b` an offset of one. However, after splitting, we have something like: ```hlsl Texture2D test_a[8]; Texture2D test_b[8]; ``` It is clear in this case that `test_b` can't start at an offset of one relative to `test_a` - it needs to start at `register(t8)`. This change handles things by adjusting the layout of an array type to account for this detail as soon as it is created. The alternative would have been to not change layout rules at all, but to instead try to adjust things at the point where types get split (and the layout for the un-split case gets applied to the split variable). The reason for doing it the way it is in this change is that the reflection API will hopefully provide accurate information. Related to reflection information, one thing that is missing here is proper computation of the "stride" for an array like this. We'll see if that needs to be addressed in a follow-up.
2018-01-03spReflection_FindTypeByName: add lookup in translationUnits.Yong He
2018-01-03Merge https://github.com/shader-slang/slangYong He
2018-01-03Add API for querying TypeLayout from a TypeYong He
Added two API functions: 1. `spReflection_FindTypeByName`, which returns a DeclRefType to the struct type with the given name. The function finds from all loaded modules in a `CompileRequest` for a decl with the given name, construct a `Type` object and cache it in `CompileRequest::types` dictionary. The subsequent calls to `spReflection_FindTypeByName` with the same name will simply returned the cached Type objects. 2. `spReflection_GetTypeLayout`, which returns a `TypeLayout` for a given `Type`. This function creates and caches the `TypeLayout` in the `TargetRequest` object that is used to create the `ProgramLayout`.
2018-01-03add call to `EnsureDecl` in `SpecializeGenericForOverload`.Yong He
2018-01-03Fix struct decl order again (#348)Tim Foley
* Add core.natvis file to Slang DLL build It seems that when `slang.dll` gets loaded into a user's project, the debugger is able to pick up the custom visualizers implemented in `slang.natvis` (which is directly added to the DLL project) but not `core.natvis` (which is added to a static library project that the DLL project references). Adding `core.natvis` to the DLL project directly seems to resolve this and greatly improve the debugging experience when in user code. * Bug fix: emit type of CB before CB when using IR The problem here was the logic for emitting types used by an IR declaration before the declaration. I refactored it to share logic between variables with initializers and functions, but in doing so failed to have an ordinary variable (which includes constant buffers) ensure that its own type was emitted before the variable. This is a one-line fix.
2018-01-02no-codegen compile flag and global generics reflection (#347)Yong He
* no-codegen compile flag and global generics reflection 1. Add SLANG_COMPILE_FLAG_NO_CODEGEN (-no-codegen) compiler flag to skip code generation stage, so that a shader that uses global generic type parmameters can be parsed, checked and introspected without knowing the final specialization. 2. Add reflection API to query for global generic type parameters, global parameters of generic type, and the generic type parameter index related to a global generic parameter. 3. Add a reflection test case for global generic type parameters. * add expected result for global-type-params test case. * fix reflection json output. * fix branch condition errors * fix expected result for global-type-params.slang * fix expected test case output
2018-01-02Bug fix for humane source location computation. (#346)Tim Foley
Fixes #345 A brief refresher: a `SourceLoc` in the Slang implementation is just an integer (more or less an absolute byte index into all of the source compiled so far). We convert that integer to a "humane" source location (a file name and line/column numbers) by finding the file and line that match the integer via binary search. The data structures used for that search are owned by a `SourceManager`. In order to avoid running out of source locations when used in a long-running application (that might reload shaders many times), the implementation creates one `SourceManager` per `CompileRequest`, along with a single shared `SourceManager` that is used for locations in the builtin libraries. The root of the bug here was that some code was using the `SourceManager` for a compile request when it should have been using the one for the builtins. This happened because one source manager was asked to translate a `SourceLoc` into a humane location, which first involves "expanding" that location (figuring out which file it belongs to, and which source manager owns that file), and failed to realize that the expanded location might use a different source manager (either the current one or one of its "parents"). I fixed this by reworking the API so that the mapping from an expanded location to a humane one is no longer a member of a source manager (since the correct source manager can be looked up in the associated expanded location). Hopefully this will prevent this class of error in the future.
2018-01-02Always respect dependency order when lowering decls via AST (#344)Tim Foley
Fixes #333 The code in `ast-legalize` is passed an array of declarations that have been ordered by dependencies using a topological sort. Unfortunately, it was only using that list in the case where the request was considered to be a "rewrite" request, and would otherwise rely on the order in which things get forced during the recursive walk (which doesn't really work for our needs).
2017-12-28Merge pull request #342 from csyonghe/fix-341Yong He
Fix type substitution for associatedtype
2017-12-28fixup substitution of typedef associated type implementation via GetType() call.Yong He
2017-12-28Merge branch 'struct-in-generic'Yong He
2017-12-28Fix substitution for associatedtype.Yong He
fixes #341 When a typedef definition is used to satisfy an associated type, we must also substitute the resulting typedef type using parent substitution, in the case that the typedef is a generic application.
2017-12-28Merge pull request #340 from csyonghe/struct-in-genericYong He
Fix NameExprType returning deleted canonical type when it's in a generic parent
2017-12-28Fix NameExprType returning deleted canonical type when it's in a generic parent.Yong He
fixes #339 `NamedExpressionType::CreateCanonicalType()` may return a deleted pointer. The original implementation is as follows: ``` Type* NamedExpressionType::CreateCanonicalType() { return GetType(declRef)->GetCanonicalType(); } ``` If `GetType()` returns a newly constructed Type (this happens when the `typedef` is defined inside a generic parent, which triggers a non-trivial substitution), the temporary type will be deleted when the function returns. The fix is to store the temporary type as a field of NamedExpressionType (`innerType`). A relevant fix (though not the true cause of issue #339) is to have `Type::GetCanonicalType()` also hold a `RefPtr` to the constructed canonical type, when the canonical type is not `this`. This prevents a returned canonical type being assigned to a RefPtr, which makes it possible for that RefPtr to be the sole owner of the canonical type and deleteing the canonical type when that RefPtr is destroyed.
2017-12-28Merge pull request #337 from csyonghe/masterYong He
Using a visitor to replace lookup scopes of generic function's return type expr