SPIRV-Cross/reference/shaders-msl-no-opt/frag/ray-query-mutability.spv14.vk.msl24.frag
Bill Hollings 4a42191240 MSL: Fix regression error in argument buffer runtime arrays.
Argument buffers can contain multiple runtime arrays if they have fixed
lengths as specified by the binding API. Regression error had assumed each
runtime array is in separate argument buffer with undefined array length.

- Add CompilerMSL::is_var_runtime_size_array() to include test for
  setting of array length via CompilerMSL::add_msl_resource_binding().

- Fixed unrelated test case MSL compile syntax failure when acceleration
  structure is the first entry point function argument (unrelated).
2023-11-02 23:53:59 -04:00

71 lines
2.3 KiB
JavaScript

#pragma clang diagnostic ignored "-Wmissing-prototypes"
#include <metal_stdlib>
#include <simd/simd.h>
#if __METAL_VERSION__ >= 230
#include <metal_raytracing>
using namespace metal::raytracing;
#endif
using namespace metal;
intersection_params spvMakeIntersectionParams(uint flags)
{
intersection_params ip;
if ((flags & 1) != 0)
ip.force_opacity(forced_opacity::opaque);
if ((flags & 2) != 0)
ip.force_opacity(forced_opacity::non_opaque);
if ((flags & 4) != 0)
ip.accept_any_intersection(true);
if ((flags & 16) != 0)
ip.set_triangle_cull_mode(triangle_cull_mode::back);
if ((flags & 32) != 0)
ip.set_triangle_cull_mode(triangle_cull_mode::front);
if ((flags & 64) != 0)
ip.set_opacity_cull_mode(opacity_cull_mode::opaque);
if ((flags & 128) != 0)
ip.set_opacity_cull_mode(opacity_cull_mode::non_opaque);
if ((flags & 256) != 0)
ip.set_geometry_cull_mode(geometry_cull_mode::triangle);
if ((flags & 512) != 0)
ip.set_geometry_cull_mode(geometry_cull_mode::bounding_box);
return ip;
}
static inline __attribute__((always_inline))
void initFn(thread raytracing::intersection_query<raytracing::instancing, raytracing::triangle_data>& rayQuery, const raytracing::acceleration_structure<raytracing::instancing> topLevelAS)
{
float3 rayOrigin = float3(0.0, 0.0, 1.0);
float3 rayDirection = float3(0.0, 0.0, -1.0);
float rayDistance = 2.0;
rayQuery.reset(ray(rayOrigin, rayDirection, 0.001000000047497451305389404296875, rayDistance), topLevelAS, spvMakeIntersectionParams(4u));
}
static inline __attribute__((always_inline))
uint proceeFn(thread raytracing::intersection_query<raytracing::instancing, raytracing::triangle_data>& rayQuery)
{
for (;;)
{
bool _46 = rayQuery.next();
if (_46)
{
continue;
}
else
{
break;
}
}
uint _50 = uint(rayQuery.get_committed_intersection_type());
return _50;
}
fragment void main0(raytracing::acceleration_structure<raytracing::instancing> topLevelAS [[buffer(0)]])
{
raytracing::intersection_query<raytracing::instancing, raytracing::triangle_data> rayQuery;
initFn(rayQuery, topLevelAS);
uint _55 = proceeFn(rayQuery);
}