summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2017-07-21Merge pull request #135 from tfoleyNV/falcor-hashed-alpha-fixupsTim Foley
Map HLSL `frac()` to GLSL `fract()`
2017-07-21Map HLSL `frac()` to GLSL `fract()`Tim Foley
2017-07-21Merge pull request #134 from tfoleyNV/gh-133Tim Foley
Don't add `flat` qualifier to integer fragment output
2017-07-21Don't add `flat` qualifier to integer fragment outputTim Foley
Fixes #133 We already had logic to skip adding `flat` to a vertex input, and this just extends it to not adding `flat` to a fragment output. Note that explicit qualifiers in the input HLSL/Slang will still be carried through to the output, so it is still possible for a Slang user to shoot themself in the foot with interpolation qualifiers.
2017-07-21Merge pull request #132 from tfoleyNV/line-directive-controlTim Foley
Add an API option to control emission of `#line` directives
2017-07-21Add an API option to control emission of `#line` directivesTim Foley
- API users can use this to get "clean" output to aid with debugging Slang issues - Also changes the prefix on intermediate files that Slang dumps, to make them easier to ignore with a regexp
2017-07-20Merge pull request #130 from tfoleyNV/vs-write-gllayerTim Foley
Require extension when using `gl_Layer` in VS
2017-07-20Require extension when using `gl_Layer` in VSTim Foley
The requirements for using `gl_Layer` differ by stage, and so we need to pick an appropriate GL version based on the target stage, and then also require a specific extension for anything other than geometry or fragment.
2017-07-20Merge pull request #129 from tfoleyNV/single-pass-stereo-extTim Foley
Translate NV single-pass stereo extension from Slang to GLSL
2017-07-20Translate NV single-pass stereo extension from Slang to GLSLTim Foley
- The easy part here is treating `NV_` prefixed semantics as another case of "system-value" semantics - Mapping the new semantics (`NV_X_RIGHT` and `NV_VIEWPORT_MASK`) to their GLSL equivalents is harder - Instead of a single "right-eye vertex" output, GLSL defines an array of per-view positions - Instead of a vector of masks, GLSL defines an array of per-view masks - Another point here is that a lot of semantics that appear as `uint` in HLSL are `int` in GLSL, which can lead to conversion issues. - The approach here is to have the lowering pass introduce a notion of assignment with "fixups," which will try to cast things as needed - When assigning to a simple value with the "wrong" type, introduce a cast - When assigning to an array from a vector, break out multiple assignments of individual vector/array elements - In order to facilitate the above, I needed to add actual types to the magic expressions I introduce to represent GLSL builtin variables. These were taken by scanning the online documentation for GL, so they might not be perfect. - Major issues with the approach in this change: - No attempt is being made here to check that the original declaration used a type appropriate to the semantic. The assumption is that this logic only ever triggers for Slang entry points, or GLSL entry points using a Slang `struct` type for input/output (and for right now Slang code is only ever written by "understanding" developers) - In the case of a Slang entry point, we always copy varying parameters in/out around the call to `main_`, so this approach should handle calls to functions with `out` or `in out` parameters okay, but it is *not* robust to cases where we don't want to copy in all the entry point parameters first thing (e.g., a GS), so that will have to change - In the GLSL case (or if we revise the approach to Slang entry points), there is going to be a problem if these converted varying parameters are ever passed as arguments to `out` or `in out` parameters. In these cases we need to do more sleight-of-hand to reify a temporary variable and do the necessary copy-in/copy-out. Being able to do that logic relies on having correct information about callees, which requires having robust semantic analysis of the function body. There is only so much we can do... - A better long-term approach would not rely on an ad-hoc "fixup" conversion during assignment, but would instead implement the GLSL builtin variables as, effectively, global "property" declarations that have both `get` and `set` accessors, and then tunnel a reference to such a property down through lowering, where it can lower to uses of the "getter" or "setter" as appropriate in context (and the result type of the getter/setter can be what we'd want/expect).
2017-07-19Merge pull request #128 from tfoleyNV/improve-failure-modesTim Foley
Try to improve handling of failures during compilation
2017-07-19Try to improve handling of failures during compilationTim Foley
The change is mostly about trying to make sure the compiler "fails safe" when it encounters an internal assumption that isn't met. Most internal errors will now throw exceptions (yes, exceptions are evil, but this will work for now), and these get caught in `spCompile` so that they don't propagate to the user (they just see a message that compilation aborted due to an internal error). Subsequent changes are going to need to work on diagnosing as many of these situations as possible, so that users can at least know what construct in their code was unexpected or unhandled by the compiler.
2017-07-19Merge pull request #127 from tfoleyNV/deploymentTim Foley
Use AppVeyor to deploy to GitHub Releases
2017-07-19Use AppVeyor to deploy to GitHub ReleasesTim Foley
- Change naming convention for output directory - `windows-x86` and `windows-x64` - Lower-case for `debug`, `release` - Test script needed to be patched up for this - Add packaging and deployment logic to AppVeyor CI script - Trigger deployment on new tag - Compute a release version based on Git tag name (`vX.Y.Z` becomes `X.Y.Z`) - Fallback to hash in case tag isn't available (it should always be) - Bundle files into a few artifacts (binary package + source package) - Set up to push those files into existing GitHub tag/release
2017-07-19Merge pull request #126 from tfoleyNV/dynamic-library-buildTim Foley
Build a dynamic library for Slang
2017-07-19Build a dynamic library for SlangTim Foley
- Change the `slang` project from a static library to a dynamic one - Add some details around `slang.h` to make sure DLL export stuff is working - Make the `slangc` executable use the dynamic library - Rename the `glslang` sub-project to `slang-glslang` and move it into the main source hierarchy - This reflects the fact that it isn't a stand-alone tool, and isn't in any way a standard binary of glslang, but rather just an artifact of how Slang uses glslang
2017-07-19Merge pull request #124 from tfoleyNV/gh-122Tim Foley
Fix up translation of `GetDimensions()`
2017-07-19Fix up translation of `GetDimensions()`Tim Foley
Fixes #122 - In cases with an explicit mip level being specified, there was a mistake in how the argument for setting the mip level in the GLSL code was constructed that led to a parse error in GLSL - Also, that argument is a `uint` in HLSL and an `int` in GLSL, so an explicit cast was needed - The GLSL functions here seem to require a newer GLSL (at least higher than `420`), so I had to add in a capability for builtins to specify a required GLSL version. For now I made these ones require `450`. - Added a test case to confirm that our lowering works (for some definition of "works")
2017-07-19Merge pull request #123 from tfoleyNV/parameter-block-name-fixesTim Foley
Fixes for how parameter block names are set up.
2017-07-19Fixes for how parameter block names are set up.Tim Foley
We generate implicit names for global-scope parameter blocks (including HLSL `cbuffer`s, since the "name" the user sees is really just for reflection purposes), but this had a few problems: - We used the generated names for parameter-binding purposes - Except for a GLSL block with an explicit name, in which case we'd use the internal name and not the reflection name for matching - The generated named didn't match between GLSL and HLSL/Slang declarations This change tries to fix both of these issues. I changed the name generation to try to make it identical between HLSL and GLSL (to the extent we can control it), just in case. But then I also went and changed the parameter-binding-generation logic to use the *reflection* name instead of the internal name when deciding if things are the "same" parameter.
2017-07-18Merge pull request #121 from tfoleyNV/gaussian-blur-fixesTim Foley
Gaussian blur fixes
2017-07-18Merge pull request #120 from tfoleyNV/compile-time-loopTim Foley
Add a compile-time loop construct to Slang
2017-07-18Swizzle result of buffer load based on element typeTim Foley
When lowering `buf[i]` to `texelFetch(..., i)` we need to deal with the case where the type of `b` might be `Buffer<float>` in which case we want to add a `.x` swizzle to the end of the fetch.
2017-07-18Add basic GLSL lowering buffer `Buffer` loadsTim Foley
- This isn't going to work for writable buffers, and certainly not for writes - As it exists right now, this shows a flaw in how I'm handling texture-type results on fetches
2017-07-18Add a compile-time loop construct to SlangTim Foley
The basic syntax is: $for(i in Range(0,99)) { /* stuff goes here */ } Note that the exact form is very restrictive. All that you are allowed to change is `i`, `0`, `99` or `/* stuff goes here */`. As a tiny bit of syntax sugar, the following should work: $for(i in Range(99)) { /* stuff goes here */ } Note that the range given is half-open (C++ iterator `[begin,end)` style). Both the beginning and end of the range must be compile-time constant expressions that Slang knows how to constant-fold. The implementation will basically generate code for `/* stuff goes here */` N times, once for each value in the half-open range. Each time, the variable `i` will be replaced with a different compile-time-constant expression. While I was working on a test case for this, I also found that our build of glslang had an issue with resource limits, so I fixed that. Clients will need to build a new glslang to use the fix.
2017-07-18Merge pull request #118 from tfoleyNV/falcor-shadow-fixesTim Foley
Falcor shadow fixes
2017-07-18Support scalarization of varying input/output for GLSLTim Foley
GLSL technically supports varying (`in`, `out`) parameters of `struct` type, but there are some annoying constraints (not allowed for VS input), and it doesn't work with how an HLSL user would usually put "system-value" inputs/outputs into a `struct` together with ordinary inputs/outputs. To work around this, this change adds support for using an imported Slang `struct` type for an `in` or `out` parameter, in which case it will (1) be scalarized and (2) will have system-value semantics mapped appropriately, just as for an entry-point parameter when cross-compiling an HLSL-style `main()`. Changes: - Add a notion of a `VaryingTupleExpr` and `VaryingTupleVarDecl`, similar to those for the resources-in-structs case - Trigger use of these when we have a global-scope varying in/out using an imported `struct` type - Also use these in the cross-compilation case for ordinary varying input/output (since this approach seems like it should be more general, and can hopefully handle stuff like GS input/output some day) - When generating parameter binding information, special case global-scope input/output, and treat it the same as entry-point-parameter input/output - Revamp how used resource ranges are computed so that we can eventually make this specific to an entry point - Actually implement first signs of life for `maybeMoveTemp` so that assignments to the tuple-ified outputs will work better - Add first test case that actually seems to work - Add diagnostics for conflicting explicit bindings on a parameter - Add diagnostic for different parameters with overlapping bindings - Make global-scope varying input/output use a tracking data structure specific to the translation unit for computing locations (so that they are independent of other TUs)
2017-07-18Map HLSL `GatherRed` to GLSL `textureGather`, etc.Tim Foley
This is a straightforward mapping given the infrastructure already in place.
2017-07-18Don't allow varying parameters to be merged in reflection dataTim Foley
All varying input/output parameters need to be specified to the entry point that declared them. In the case of HLSL/Slang this happens for free, but in the case of GLSL we need to be careful not to merge global-scope `in` or `out` parameters in ways that don't make sense.
2017-07-17Merge pull request #114 from tfoleyNV/csm-shadow-sampler-fixTim Foley
Make sure to treat imported modules as Slang
2017-07-17Make sure to treat imported modules as SlangTim Foley
- When generating parameter binding/reflection info, treated imported modules as Slang code, instead of the source language of the outer translation unit - This fixes an issue where global-scope shader parameters in a `.slang` file were getting ignored for binding-generation purposes when imported by a GLSL file
2017-07-17Merge pull request #112 from tfoleyNV/gh-94Tim Foley
Handle `Buffer` types more like textures
2017-07-17Handle `Buffer` types more like texturesTim Foley
Fixes #94 We'd been handling HLSL `Buffer` and `RWBuffer` in a one-off fashion, and that led to a lot of code duplication, and also to the issue that we weren't handling `RasterizerOrderedBuffer` at all. This change basically folds `Buffer` in so that it is conceptually a texture type (just with a unique shape). Hopefully all the other logic still works.
2017-07-17Merge pull request #111 from tfoleyNV/falcor-shadows-fixesTim Foley
Falcor shadows fixes
2017-07-17Handle arrays when scalarizing "resources in structs"Tim Foley
The basic idea is that an array of `struct`s will get scalarized into per-field arrays (for any fields that need to be scalarized). So given: struct Foo { float x; Texture2D t; }; cbuffer C { Foo foo[4]; } We'll get output like: struct Foo { float x; }; cbuffer C { Foo foo[4]; } Texture2D C_foo_t[4]; (Of course the output would also be translated over to GLSL, but I'm only concerned about this one transformation here).
2017-07-17Map HLSL `SampleGrad` to GLSL `textureGrad[Offset]`Tim Foley
- This was an easy case, as far as these things go.
2017-07-17Add hacky GLSL lowering for `GetDimensions`Tim Foley
This is hacky for two big reasons: 1. It uses "operator comma" in the output to deal with calling multiple functions in an expression context 2. The way I'm lowering things to GLSL ends up using certain function arguments more than once, which means they get emitted as GLSL more than once, which means their *side effects* get evaluated more than once. Please don't put an expression with side effects in as an argument to `GetDimensions` when cross-compiling. Solving these issues requires the translation of builtins to be more directly handled as part of lowering, rather than a purely textual operation done during emission. I don't have time to fix that right now.
2017-07-17Improve handling of `SampleCmpLevelZero`Tim Foley
- We map `SampleCmpLevelZero` to either `textureLod` or `textureGrad` based on what the GLSL spec seems to allow - We map `SamplerComparisonState` to `samplerShadow` (instead of just `sampler`)
2017-07-17Map HLSL `linear` to GLSL... nothingTim Foley
The behavior of the `linear` modifier should be the default interpolation behavior in GLSL.
2017-07-17Merge pull request #110 from tfoleyNV/gl-layer-pick-versionTim Foley
Pick correct GLSL version when `gl_Layer` used
2017-07-17Pick correct GLSL version when `gl_Layer` usedTim Foley
`gl_Layer` as a fragment input requires at least version 4.30 of GLSL, so we try to track that information when we see the name used. Note that this does *not* override a user-specified `#version` line. This required re-ordering when lowering happens relative to emitting the `#version` directive, since this code works by actually modifying the chosen profile for the entry point. Yes, that is kind of gross and we should do something cleaner in the long term.
2017-07-17Merge pull request #108 from tfoleyNV/gh-105Tim Foley
Don't crash-fail on errors in entry point parameters
2017-07-17Merge pull request #107 from tfoleyNV/glsl-matrix-mult-bugTim Foley
Add explicit operator overloads for scalar/matrix cases
2017-07-17Add emit logic for generic app expressionsTim Foley
Work on #105 These can occur in unchecked code (or code that had a semantic error), so we need to be able to handle them.
2017-07-17Fix AST node type for `TriangleStream`Tim Foley
- This was being mapped to `HLSLLineStreamType` because of a copy-paste typo
2017-07-17Skip unknown types during parameter-binding/-reflection stepTim Foley
Work on #105 If a semantic error occurs in the type of an entry-point parameter, we need to be able to skip over it when doing parameter binding and reflection-generation work.
2017-07-17Add explicit operator overloads for scalar/matrix casesTim Foley
Fixes #103 - Previously I was relying on scalar-to-vector promotion to pick the right type in these cases, but I hadn't implemented scalar-to-matrix promotion (I should...) - Rather than relying on promotion behavior, this change goes ahead and adds explicit overloads. I think this is probably a better decision in the long term, since one might want to support these cases for operators, while warning (or erroring) on the more general cases of implicit conversion. - This covers matrix/scalar, scalar/matrix, vector/scalar, and scalar/vector cases
2017-07-17Merge pull request #106 from tfoleyNV/varying-integerTim Foley
Handle `flat` interpolation cases in cross compilation
2017-07-17Handle `flat` interpolation cases in cross compilationTim Foley
Fixes #104 - Map HLSL `nointerpolation` to GLSL `flat` - When lowering a `struct` type varying input/output, look for interpolation modifiers along the "chain" from the leaf field up to the original shader input variable (and take the first one found) - Not sure if this is strictly needed, but it seems like a reasonable policy - Add `flat` to varying input of integer type, with no other interpolation modifier - Note: I do *not* do anything to ignore a manually imposed interpolation modifier that might be incorrect
2017-07-14Merge pull request #92 from tfoleyNV/glsl-thread-group-sizeTim Foley
Add reflection support for GLSL thread-group-size modifier