7eecf5a46b
This is needed to support `VK_KHR_multiview`, which is in turn needed for Vulkan 1.1 support. Unfortunately, Metal provides no native support for this, and Apple is once again less than forthcoming, so we have to implement it all ourselves. Tessellation and geometry shaders are deliberately unsupported for now. The problem is that the current implementation encodes the `ViewIndex` as part of the `InstanceIndex`, which in the SPIR-V environment at least only exists in the vertex shader. So we need to work out a way to pass the view index along to the later stages. This implementation runs vertex shaders for all views up to the highest bit set in the view mask, even those whose bits are clear. The fragments for the inactive views are then discarded. Avoiding this is difficult: calculating the view indices becomes far more complicated if we can only run for those views which are set in the mask.
30 lines
544 B
GLSL
30 lines
544 B
GLSL
#include <metal_stdlib>
|
|
#include <simd/simd.h>
|
|
|
|
using namespace metal;
|
|
|
|
struct MVPs
|
|
{
|
|
float4x4 MVP[2];
|
|
};
|
|
|
|
struct main0_out
|
|
{
|
|
float4 gl_Position [[position]];
|
|
uint gl_Layer [[render_target_array_index]];
|
|
};
|
|
|
|
struct main0_in
|
|
{
|
|
float4 Position [[attribute(0)]];
|
|
};
|
|
|
|
vertex main0_out main0(main0_in in [[stage_in]], constant MVPs& _19 [[buffer(0)]], uint gl_InstanceIndex [[instance_id]])
|
|
{
|
|
main0_out out = {};
|
|
const uint gl_ViewIndex = 0;
|
|
out.gl_Position = _19.MVP[int(gl_ViewIndex)] * in.Position;
|
|
return out;
|
|
}
|
|
|