Skip to content

Commit

Permalink
Merge pull request KhronosGroup#2220 from KhronosGroup/pr-2208
Browse files Browse the repository at this point in the history
Land PR 2208 and fix more issues with sample mask
  • Loading branch information
HansKristian-Work authored Oct 23, 2023
2 parents 2de1265 + 2fba284 commit 637cff3
Show file tree
Hide file tree
Showing 33 changed files with 682 additions and 80 deletions.
10 changes: 5 additions & 5 deletions reference/opt/shaders-hlsl/frag/sample-mask-in-and-out.frag
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
static int gl_SampleMaskIn;
static int gl_SampleMask;
static int gl_SampleMaskIn[1];
static int gl_SampleMask[1];
static float4 FragColor;

struct SPIRV_Cross_Input
Expand All @@ -16,15 +16,15 @@ struct SPIRV_Cross_Output
void frag_main()
{
FragColor = 1.0f.xxxx;
gl_SampleMask = gl_SampleMaskIn;
gl_SampleMask[0] = gl_SampleMaskIn[0];
}

SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_SampleMaskIn = stage_input.gl_SampleMaskIn;
gl_SampleMaskIn[0] = stage_input.gl_SampleMaskIn;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_SampleMask = gl_SampleMask;
stage_output.gl_SampleMask = gl_SampleMask[0];
stage_output.FragColor = FragColor;
return stage_output;
}
6 changes: 3 additions & 3 deletions reference/opt/shaders-hlsl/frag/sample-mask-in.frag
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
static int gl_SampleID;
static int gl_SampleMaskIn;
static int gl_SampleMaskIn[1];
static float4 FragColor;

struct SPIRV_Cross_Input
Expand All @@ -15,7 +15,7 @@ struct SPIRV_Cross_Output

void frag_main()
{
if ((gl_SampleMaskIn & (1 << gl_SampleID)) != 0)
if ((gl_SampleMaskIn[0] & (1 << gl_SampleID)) != 0)
{
FragColor = 1.0f.xxxx;
}
Expand All @@ -24,7 +24,7 @@ void frag_main()
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_SampleID = stage_input.gl_SampleID;
gl_SampleMaskIn = stage_input.gl_SampleMaskIn;
gl_SampleMaskIn[0] = stage_input.gl_SampleMaskIn;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.FragColor = FragColor;
Expand Down
6 changes: 3 additions & 3 deletions reference/opt/shaders-hlsl/frag/sample-mask-out.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
static int gl_SampleMask;
static int gl_SampleMask[1];
static float4 FragColor;

struct SPIRV_Cross_Output
Expand All @@ -10,14 +10,14 @@ struct SPIRV_Cross_Output
void frag_main()
{
FragColor = 1.0f.xxxx;
gl_SampleMask = 0;
gl_SampleMask[0] = 0;
}

SPIRV_Cross_Output main()
{
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_SampleMask = gl_SampleMask;
stage_output.gl_SampleMask = gl_SampleMask[0];
stage_output.FragColor = FragColor;
return stage_output;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ struct main0_out
[[ early_fragment_tests ]] fragment main0_out main0(uint gl_SampleMaskIn [[sample_mask, post_depth_coverage]])
{
main0_out out = {};
out.FragColor = float4(float(gl_SampleMaskIn));
out.FragColor = float4(float(int(gl_SampleMaskIn)));
return out;
}

Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ struct main0_out
[[ early_fragment_tests ]] fragment main0_out main0(uint gl_SampleMaskIn [[sample_mask, post_depth_coverage]])
{
main0_out out = {};
out.FragColor = float4(float(gl_SampleMaskIn));
out.FragColor = float4(float(int(gl_SampleMaskIn)));
return out;
}

Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ fragment main0_out main0(uint gl_SampleMaskIn [[sample_mask]], uint gl_SampleID
{
main0_out out = {};
out.FragColor = float4(1.0);
out.gl_SampleMask = (gl_SampleMaskIn & 0x22 & (1 << gl_SampleID));
out.gl_SampleMask = int((gl_SampleMaskIn & 0x22 & (1 << gl_SampleID)));
out.gl_SampleMask &= 0x22;
return out;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ fragment main0_out main0(uint gl_SampleMaskIn [[sample_mask]])
{
main0_out out = {};
out.FragColor = float4(1.0);
out.gl_SampleMask = (gl_SampleMaskIn & 0x22);
out.gl_SampleMask = int((gl_SampleMaskIn & 0x22));
out.gl_SampleMask &= 0x22;
return out;
}
Expand Down
45 changes: 43 additions & 2 deletions reference/opt/shaders-ue4/asm/frag/sample-mask-not-array.asm.frag
Original file line number Diff line number Diff line change
@@ -1,8 +1,49 @@
#pragma clang diagnostic ignored "-Wmissing-prototypes"
#pragma clang diagnostic ignored "-Wmissing-braces"

#include <metal_stdlib>
#include <simd/simd.h>

using namespace metal;

template<typename T, size_t Num>
struct spvUnsafeArray
{
T elements[Num ? Num : 1];

thread T& operator [] (size_t pos) thread
{
return elements[pos];
}
constexpr const thread T& operator [] (size_t pos) const thread
{
return elements[pos];
}

device T& operator [] (size_t pos) device
{
return elements[pos];
}
constexpr const device T& operator [] (size_t pos) const device
{
return elements[pos];
}

constexpr const constant T& operator [] (size_t pos) const constant
{
return elements[pos];
}

threadgroup T& operator [] (size_t pos) threadgroup
{
return elements[pos];
}
constexpr const threadgroup T& operator [] (size_t pos) const threadgroup
{
return elements[pos];
}
};

struct type_View
{
float4x4 View_TranslatedWorldToClip;
Expand Down Expand Up @@ -489,12 +530,12 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_View& View [[bu
if (View.View_NumSceneColorMSAASamples > 1)
{
_268 = _255 * float4(float(View.View_NumSceneColorMSAASamples) * 0.25);
_269 = gl_SampleMaskIn & 15u;
_269 = (spvUnsafeArray<uint, 1>({ uint(gl_SampleMaskIn) }))[0] & 15u;
}
else
{
_268 = _255;
_269 = gl_SampleMaskIn;
_269 = (spvUnsafeArray<uint, 1>({ uint(gl_SampleMaskIn) }))[0];
}
out.out_var_SV_Target0 = _268;
out.gl_SampleMask = _269;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
static uint gl_SampleMaskIn[1];
static uint gl_SampleMask[1];
struct SPIRV_Cross_Input
{
uint gl_SampleMaskIn : SV_Coverage;
};

struct SPIRV_Cross_Output
{
uint gl_SampleMask : SV_Coverage;
};

void frag_main()
{
uint copy_sample_mask[1] = gl_SampleMaskIn;
gl_SampleMask = copy_sample_mask;
}

SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_SampleMaskIn[0] = stage_input.gl_SampleMaskIn;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_SampleMask = gl_SampleMask[0];
return stage_output;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
static int gl_SampleMaskIn[1];
static int gl_SampleMask[1];
struct SPIRV_Cross_Input
{
uint gl_SampleMaskIn : SV_Coverage;
};

struct SPIRV_Cross_Output
{
uint gl_SampleMask : SV_Coverage;
};

void frag_main()
{
int copy_sample_mask[1] = gl_SampleMaskIn;
gl_SampleMask = copy_sample_mask;
}

SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_SampleMaskIn[0] = stage_input.gl_SampleMaskIn;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_SampleMask = gl_SampleMask[0];
return stage_output;
}
10 changes: 5 additions & 5 deletions reference/shaders-hlsl/frag/sample-mask-in-and-out.frag
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
static int gl_SampleMaskIn;
static int gl_SampleMask;
static int gl_SampleMaskIn[1];
static int gl_SampleMask[1];
static float4 FragColor;

struct SPIRV_Cross_Input
Expand All @@ -16,15 +16,15 @@ struct SPIRV_Cross_Output
void frag_main()
{
FragColor = 1.0f.xxxx;
gl_SampleMask = gl_SampleMaskIn;
gl_SampleMask[0] = gl_SampleMaskIn[0];
}

SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_SampleMaskIn = stage_input.gl_SampleMaskIn;
gl_SampleMaskIn[0] = stage_input.gl_SampleMaskIn;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_SampleMask = gl_SampleMask;
stage_output.gl_SampleMask = gl_SampleMask[0];
stage_output.FragColor = FragColor;
return stage_output;
}
6 changes: 3 additions & 3 deletions reference/shaders-hlsl/frag/sample-mask-in.frag
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
static int gl_SampleID;
static int gl_SampleMaskIn;
static int gl_SampleMaskIn[1];
static float4 FragColor;

struct SPIRV_Cross_Input
Expand All @@ -15,7 +15,7 @@ struct SPIRV_Cross_Output

void frag_main()
{
if ((gl_SampleMaskIn & (1 << gl_SampleID)) != 0)
if ((gl_SampleMaskIn[0] & (1 << gl_SampleID)) != 0)
{
FragColor = 1.0f.xxxx;
}
Expand All @@ -24,7 +24,7 @@ void frag_main()
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_SampleID = stage_input.gl_SampleID;
gl_SampleMaskIn = stage_input.gl_SampleMaskIn;
gl_SampleMaskIn[0] = stage_input.gl_SampleMaskIn;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.FragColor = FragColor;
Expand Down
6 changes: 3 additions & 3 deletions reference/shaders-hlsl/frag/sample-mask-out.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
static int gl_SampleMask;
static int gl_SampleMask[1];
static float4 FragColor;

struct SPIRV_Cross_Output
Expand All @@ -10,14 +10,14 @@ struct SPIRV_Cross_Output
void frag_main()
{
FragColor = 1.0f.xxxx;
gl_SampleMask = 0;
gl_SampleMask[0] = 0;
}

SPIRV_Cross_Output main()
{
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_SampleMask = gl_SampleMask;
stage_output.gl_SampleMask = gl_SampleMask[0];
stage_output.FragColor = FragColor;
return stage_output;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#pragma clang diagnostic ignored "-Wmissing-prototypes"
#pragma clang diagnostic ignored "-Wmissing-braces"

#include <metal_stdlib>
#include <simd/simd.h>

using namespace metal;

template<typename T, size_t Num>
struct spvUnsafeArray
{
T elements[Num ? Num : 1];

thread T& operator [] (size_t pos) thread
{
return elements[pos];
}
constexpr const thread T& operator [] (size_t pos) const thread
{
return elements[pos];
}

device T& operator [] (size_t pos) device
{
return elements[pos];
}
constexpr const device T& operator [] (size_t pos) const device
{
return elements[pos];
}

constexpr const constant T& operator [] (size_t pos) const constant
{
return elements[pos];
}

threadgroup T& operator [] (size_t pos) threadgroup
{
return elements[pos];
}
constexpr const threadgroup T& operator [] (size_t pos) const threadgroup
{
return elements[pos];
}
};

struct main0_out
{
uint gl_SampleMask [[sample_mask]];
};

fragment main0_out main0(uint gl_SampleMaskIn [[sample_mask]])
{
main0_out out = {};
spvUnsafeArray<uint, 1> copy_sample_mask = spvUnsafeArray<uint, 1>({ uint(gl_SampleMaskIn) });
out.gl_SampleMask = copy_sample_mask[0];
return out;
}

Loading

0 comments on commit 637cff3

Please sign in to comment.