From b487516880f56fd69ff76bf7cb3f0f1711bc356d Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Wed, 29 Nov 2017 11:45:15 -0800 Subject: Add API to query stage of varying parameter (#302) Fixes #301 The problem here is that if you have input GLSL code like: ```glsl // example.vs in vec3 pos; ``` and: ```glsl // example.fs in vec3 worldPos; ``` Then both `pos` and `worldPos` are reflected as global variables (parameters of the *program*), which both get bound to "varying input" resources, but there is no way to tell through the API that `pos` is a vertex parameter while `worldPos` is a fragment one. The original request in issue #301 was to expose parameters like this not as a global variables, but rather as parameters of the entry point in their specific file. That is, treat it as if the user had written, e.g.: ```glsl // example.vs void vsMain(in vec3 pos) { ... } ``` Doing that would unify the GLSL and HLSL/Slang cases a bit, but would require the Slang reflection API to lie about the structure of code the user wrote. At a more basic level, that would have been hard to implement because the current reflection API just exposes the underlying AST, and the AST *needs* to leave `pos` at the global scope so that when we go and spit GLSL back out we retain the original structure. This PR implements a more simplistic solution, where the user is allowed to query the stage that a varying parameter "belongs" to. For right now I'm only enabling this to work for varying parameters (but it doesn't care if they are entry-point or global-scope varyings). Despite what I said on #301, this should work for both the top-level parameter's variable layout, *and* any variable layouts for fields within its type reflection. In terms of implementation, I took the simple but wasteful route: every `VarLayout` now has a `stage` field that is by default initialized to `SLANG_STAGE_NONE`. When collecting varying parameters, I take advantage of the fact that everything bottlenecks through `processEntryPointParameter()` which takes an `EntryPointParameterState` so that I can set the `VarLayout::stage` field for any varying parameter in one place. While I was making this change, I also did a bit of cleanup so that the "official" names for the varying parameter categories are `VARYING_INPUT` and `VARYING_OUTPUT`, with `VERTEX_INPUT` and `FRAGMENT_OUTPUT` being "deprecated" in principle. I didn't do the bulk rename inside the codebase yet. --- tests/reflection/sample-rate-input.glsl.expected | 6 ++-- .../vertex-input-semantics.hlsl.expected | 33 ++++++++++++++-------- 2 files changed, 26 insertions(+), 13 deletions(-) (limited to 'tests/reflection') diff --git a/tests/reflection/sample-rate-input.glsl.expected b/tests/reflection/sample-rate-input.glsl.expected index 5800a3630..53e0b6e17 100644 --- a/tests/reflection/sample-rate-input.glsl.expected +++ b/tests/reflection/sample-rate-input.glsl.expected @@ -21,7 +21,8 @@ standard output = { }, { "name": "uv", - "binding": {"kind": "vertexInput", "index": 0}, + "stage": "fragment", + "binding": {"kind": "varyingInput", "index": 0}, "type": { "kind": "vector", "elementCount": 2, @@ -33,7 +34,8 @@ standard output = { }, { "name": "c", - "binding": {"kind": "fragmentOutput", "index": 0}, + "stage": "fragment", + "binding": {"kind": "varyingOutput", "index": 0}, "type": { "kind": "vector", "elementCount": 4, diff --git a/tests/reflection/vertex-input-semantics.hlsl.expected b/tests/reflection/vertex-input-semantics.hlsl.expected index a3747a86a..06b7bc95a 100644 --- a/tests/reflection/vertex-input-semantics.hlsl.expected +++ b/tests/reflection/vertex-input-semantics.hlsl.expected @@ -13,7 +13,8 @@ standard output = { "parameters": [ { "name": "a", - "binding": {"kind": "vertexInput", "index": 0}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 0}, "semanticName": "A", "type": { "kind": "vector", @@ -26,7 +27,8 @@ standard output = { }, { "name": "b", - "binding": {"kind": "vertexInput", "index": 1, "count": 3}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 1, "count": 3}, "semanticName": "B", "type": { "kind": "struct", @@ -42,7 +44,8 @@ standard output = { "scalarType": "int32" } }, - "binding": {"kind": "vertexInput", "index": 0}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 0}, "semanticName": "B" }, { @@ -61,7 +64,8 @@ standard output = { "scalarType": "float32" } }, - "binding": {"kind": "vertexInput", "index": 0}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 0}, "semanticName": "B", "semanticIndex": 1 }, @@ -75,13 +79,15 @@ standard output = { "scalarType": "float32" } }, - "binding": {"kind": "vertexInput", "index": 1}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 1}, "semanticName": "B", "semanticIndex": 2 } ] }, - "binding": {"kind": "vertexInput", "index": 1, "count": 2}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 1, "count": 2}, "semanticName": "B", "semanticIndex": 1 } @@ -90,7 +96,8 @@ standard output = { }, { "name": "c", - "binding": {"kind": "vertexInput", "index": 4, "count": 3}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 4, "count": 3}, "type": { "kind": "struct", "name": "C", @@ -111,7 +118,8 @@ standard output = { "scalarType": "float32" } }, - "binding": {"kind": "vertexInput", "index": 0}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 0}, "semanticName": "CX" }, { @@ -124,13 +132,15 @@ standard output = { "scalarType": "float32" } }, - "binding": {"kind": "vertexInput", "index": 1}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 1}, "semanticName": "CX", "semanticIndex": 1 } ] }, - "binding": {"kind": "vertexInput", "index": 0, "count": 2}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 0, "count": 2}, "semanticName": "CX" }, { @@ -143,7 +153,8 @@ standard output = { "scalarType": "int32" } }, - "binding": {"kind": "vertexInput", "index": 2}, + "stage": "vertex", + "binding": {"kind": "varyingInput", "index": 2}, "semanticName": "CY" } ] -- cgit v1.2.3