Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HLSL: added support for tesselation shaders (WIP) #1904

Closed
wants to merge 5 commits into from
Closed
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
47 changes: 47 additions & 0 deletions reference/shaders-hlsl/tese/input-array.tese
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
static float4 gl_Position;
static float gl_TessLevelOuter[4];
static float gl_TessLevelInner[2];
static float3 gl_TessCoord;
struct SPIRV_Cross_DS_Point_Input
{
float4 Floats : TEXCOORD0;
float4 Floats2 : TEXCOORD2;
};

struct SPIRV_Cross_Input
{
float gl_TessLevelOuter[4] : SV_TessFactor;
float gl_TessLevelInner[2] : SV_InsideTessFactor;
float2 gl_TessCoord : SV_DomainLocation;
};

struct SPIRV_Cross_Output
{
};

struct SPIRV_Cross_DS_Point_Output
{
float4 gl_Position : SV_Position;
};

void set_position(OutputPatch<SPIRV_Cross_DS_Point_Input,3> gl_in)
{
gl_Position = (gl_in[0].Floats * gl_TessCoord.x) + (gl_in[1].Floats2 * gl_TessCoord.y);
}

void tese_main(OutputPatch<SPIRV_Cross_DS_Point_Input,3> gl_in)
{
set_position(gl_in);
}

[domain("quad")]
SPIRV_Cross_DS_Point_Output main(SPIRV_Cross_Input stage_input, OutputPatch<SPIRV_Cross_DS_Point_Input, 3> gl_in)
{
gl_TessLevelOuter = stage_input.gl_TessLevelOuter;
gl_TessLevelInner = stage_input.gl_TessLevelInner;
gl_TessCoord = float3(stage_input.gl_TessCoord, 0.0);
tese_main(gl_in);
SPIRV_Cross_DS_Point_Output stage_output;
stage_output.gl_Position = gl_Position;
return stage_output;
}
74 changes: 74 additions & 0 deletions reference/shaders-hlsl/tese/input-types.tese
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
struct Foo
{
float4 a;
float4 b;
};

static float4 gl_Position;
static float gl_TessLevelOuter[4];
static float gl_TessLevelInner[2];
static float3 gl_TessCoord;
static float4 vColors;
static Foo vFoo;
static float4 vColorsArray[2];

struct SPIRV_Cross_DS_Point_Input
{
float4 vColor : TEXCOORD0;
Foo vFoos : TEXCOORD14;
};

struct SPIRV_Cross_Input
{
float gl_TessLevelOuter[4] : SV_TessFactor;
float gl_TessLevelInner[2] : SV_InsideTessFactor;
float2 gl_TessCoord : SV_DomainLocation;
float4 vColors : TEXCOORD1;
float4 vColorsArray[2] : TEXCOORD2;
Foo vFoo : TEXCOORD8;
};

struct SPIRV_Cross_Output
{
};

struct SPIRV_Cross_DS_Point_Output
{
float4 gl_Position : SV_Position;
};

void set_from_function(OutputPatch<SPIRV_Cross_DS_Point_Input,3> gl_in)
{
gl_Position += gl_in[0].vColor;
gl_Position += gl_in[1].vColor;
gl_Position += vColors;
Foo foo = vFoo;
gl_Position += foo.a;
gl_Position += foo.b;
foo = gl_in[0].vFoos;
gl_Position += foo.a;
gl_Position += foo.b;
foo = gl_in[1].vFoos;
gl_Position += foo.a;
gl_Position += foo.b;
}

void tese_main(OutputPatch<SPIRV_Cross_DS_Point_Input,3> gl_in)
{
set_from_function(gl_in);
}

[domain("quad")]
SPIRV_Cross_DS_Point_Output main(SPIRV_Cross_Input stage_input, OutputPatch<SPIRV_Cross_DS_Point_Input, 3> gl_in)
{
gl_TessLevelOuter = stage_input.gl_TessLevelOuter;
gl_TessLevelInner = stage_input.gl_TessLevelInner;
gl_TessCoord = float3(stage_input.gl_TessCoord, 0.0);
vColors = stage_input.vColors;
vFoo = stage_input.vFoo;
vColorsArray = stage_input.vColorsArray;
tese_main(gl_in);
SPIRV_Cross_DS_Point_Output stage_output;
stage_output.gl_Position = gl_Position;
return stage_output;
}
38 changes: 38 additions & 0 deletions reference/shaders-hlsl/tese/triangle-tess-level.tese
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
static float4 gl_Position;
static float gl_TessLevelOuter[4];
static float gl_TessLevelInner[2];
static float3 gl_TessCoord;
struct SPIRV_Cross_Input
{
float gl_TessLevelOuter[3] : SV_TessFactor;
float gl_TessLevelInner : SV_InsideTessFactor;
float3 gl_TessCoord : SV_DomainLocation;
};

struct SPIRV_Cross_Output
{
};

struct SPIRV_Cross_DS_Point_Output
{
float4 gl_Position : SV_Position;
};

void tese_main()
{
gl_Position = float4((gl_TessCoord.x * gl_TessLevelInner[0]) * gl_TessLevelOuter[0], (gl_TessCoord.y * gl_TessLevelInner[0]) * gl_TessLevelOuter[1], (gl_TessCoord.z * gl_TessLevelInner[0]) * gl_TessLevelOuter[2], 1.0f);
}

[domain("tri")]
SPIRV_Cross_DS_Point_Output main(SPIRV_Cross_Input stage_input)
{
gl_TessLevelOuter[0] = stage_input.gl_TessLevelOuter[0];
gl_TessLevelOuter[1] = stage_input.gl_TessLevelOuter[1];
gl_TessLevelOuter[2] = stage_input.gl_TessLevelOuter[2];
gl_TessLevelInner[0] = stage_input.gl_TessLevelInner;
gl_TessCoord = stage_input.gl_TessCoord;
tese_main();
SPIRV_Cross_DS_Point_Output stage_output;
stage_output.gl_Position = gl_Position;
return stage_output;
}
38 changes: 38 additions & 0 deletions reference/shaders-hlsl/tese/triangle.tese
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
static float4 gl_Position;
static float gl_TessLevelOuter[4];
static float gl_TessLevelInner[2];
static float3 gl_TessCoord;
struct SPIRV_Cross_Input
{
float gl_TessLevelOuter[3] : SV_TessFactor;
float gl_TessLevelInner : SV_InsideTessFactor;
float3 gl_TessCoord : SV_DomainLocation;
};

struct SPIRV_Cross_Output
{
};

struct SPIRV_Cross_DS_Point_Output
{
float4 gl_Position : SV_Position;
};

void tese_main()
{
gl_Position = 1.0f.xxxx;
}

[domain("tri")]
SPIRV_Cross_DS_Point_Output main(SPIRV_Cross_Input stage_input)
{
gl_TessLevelOuter[0] = stage_input.gl_TessLevelOuter[0];
gl_TessLevelOuter[1] = stage_input.gl_TessLevelOuter[1];
gl_TessLevelOuter[2] = stage_input.gl_TessLevelOuter[2];
gl_TessLevelInner[0] = stage_input.gl_TessLevelInner;
gl_TessCoord = stage_input.gl_TessCoord;
tese_main();
SPIRV_Cross_DS_Point_Output stage_output;
stage_output.gl_Position = gl_Position;
return stage_output;
}
15 changes: 15 additions & 0 deletions shaders-hlsl/tese/input-array.tese
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#version 450

layout(ccw, quads, fractional_odd_spacing) in;
layout(location = 0) in vec4 Floats[];
layout(location = 2) in vec4 Floats2[gl_MaxPatchVertices];

void set_position()
{
gl_Position = Floats[0] * gl_TessCoord.x + Floats2[1] * gl_TessCoord.y;
}

void main()
{
set_position();
}
77 changes: 77 additions & 0 deletions shaders-hlsl/tese/input-types.tese
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#version 450

layout(ccw, quads, fractional_even_spacing) in;

// Try to use the whole taxonomy of input methods.

// Per-vertex vector.
layout(location = 0) in vec4 vColor[];
// Per-patch vector.
layout(location = 1) patch in vec4 vColors;
// Per-patch vector array.
layout(location = 2) patch in vec4 vColorsArray[2];

// I/O blocks, per patch and per control point.
/*
layout(location = 4) in Block
{
vec4 a;
vec4 b;
} blocks[];

layout(location = 6) patch in PatchBlock
{
vec4 a;
vec4 b;
} patch_block;
*/
// Composites.
struct Foo
{
vec4 a;
vec4 b;
};
layout(location = 8) patch in Foo vFoo;
//layout(location = 10) patch in Foo vFooArray[2]; // FIXME: Handling of array-of-struct input is broken!

// Per-control point struct.
layout(location = 14) in Foo vFoos[];

void set_from_function()
{
/*
gl_Position = blocks[0].a;
gl_Position += blocks[0].b;
gl_Position += blocks[1].a;
gl_Position += blocks[1].b;
gl_Position += patch_block.a;
gl_Position += patch_block.b;
*/
gl_Position += vColor[0];
gl_Position += vColor[1];
gl_Position += vColors;

Foo foo = vFoo;
gl_Position += foo.a;
gl_Position += foo.b;

/*foo = vFooArray[0];
gl_Position += foo.a;
gl_Position += foo.b;
foo = vFooArray[1];
gl_Position += foo.a;
gl_Position += foo.b;*/

foo = vFoos[0];
gl_Position += foo.a;
gl_Position += foo.b;

foo = vFoos[1];
gl_Position += foo.a;
gl_Position += foo.b;
}

void main()
{
set_from_function();
}
12 changes: 12 additions & 0 deletions shaders-hlsl/tese/triangle-tess-level.tese
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#version 310 es
#extension GL_EXT_tessellation_shader : require

layout(cw, triangles, fractional_even_spacing) in;

void main()
{
gl_Position = vec4(gl_TessCoord.x * gl_TessLevelInner[0] * gl_TessLevelOuter[0],
gl_TessCoord.y * gl_TessLevelInner[0] * gl_TessLevelOuter[1],
gl_TessCoord.z * gl_TessLevelInner[0] * gl_TessLevelOuter[2],
1);
}
9 changes: 9 additions & 0 deletions shaders-hlsl/tese/triangle.tese
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#version 310 es
#extension GL_EXT_tessellation_shader : require

layout(cw, triangles, fractional_even_spacing) in;

void main()
{
gl_Position = vec4(1.0);
}
5 changes: 5 additions & 0 deletions spirv_glsl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8879,6 +8879,11 @@ string CompilerGLSL::access_chain_internal(uint32_t base, const uint32_t *indice
break;
}
}
else if (backend.force_gl_in_block_hlsl && i == 0 && var && !is_builtin_variable(*var) &&
var->storage == StorageClassInput && !has_decoration(var->self, DecorationPatch))
{
expr = join("gl_in[", to_expression(index, register_expression_read), "].", expr);
}
else if (options.flatten_multidimensional_arrays && dimension_flatten)
{
// If we are flattening multidimensional arrays, do manual stride computation.
Expand Down
6 changes: 4 additions & 2 deletions spirv_glsl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,7 @@ class CompilerGLSL : public Compiler
bool allow_precision_qualifiers = false;
bool can_swizzle_scalar = false;
bool force_gl_in_out_block = false;
bool force_gl_in_block_hlsl = false;
bool can_return_array = true;
bool allow_truncated_access_chain = false;
bool supports_extensions = false;
Expand Down Expand Up @@ -706,8 +707,9 @@ class CompilerGLSL : public Compiler
virtual void prepare_access_chain_for_scalar_access(std::string &expr, const SPIRType &type,
spv::StorageClass storage, bool &is_packed);

std::string access_chain(uint32_t base, const uint32_t *indices, uint32_t count, const SPIRType &target_type,
AccessChainMeta *meta = nullptr, bool ptr_chain = false);
virtual std::string access_chain(uint32_t base, const uint32_t *indices, uint32_t count,
const SPIRType &target_type, AccessChainMeta *meta = nullptr,
bool ptr_chain = false);

std::string flattened_access_chain(uint32_t base, const uint32_t *indices, uint32_t count,
const SPIRType &target_type, uint32_t offset, uint32_t matrix_stride,
Expand Down
Loading