Updated spirv-cross.
This commit is contained in:
parent
9ba15cd473
commit
2d80545bb7
4
3rdparty/spirv-cross/spirv_common.hpp
vendored
4
3rdparty/spirv-cross/spirv_common.hpp
vendored
@ -729,6 +729,9 @@ struct SPIRExpression : IVariant
|
||||
// Whether or not this is an access chain expression.
|
||||
bool access_chain = false;
|
||||
|
||||
// Whether or not gl_MeshVerticesEXT[].gl_Position (as a whole or .y) is referenced
|
||||
bool access_meshlet_position_y = false;
|
||||
|
||||
// A list of expressions which this expression depends on.
|
||||
SmallVector<ID> expression_dependencies;
|
||||
|
||||
@ -1580,6 +1583,7 @@ struct AccessChainMeta
|
||||
bool storage_is_invariant = false;
|
||||
bool flattened_struct = false;
|
||||
bool relaxed_precision = false;
|
||||
bool access_meshlet_position_y = false;
|
||||
};
|
||||
|
||||
enum ExtendedDecorations
|
||||
|
40
3rdparty/spirv-cross/spirv_glsl.cpp
vendored
40
3rdparty/spirv-cross/spirv_glsl.cpp
vendored
@ -9942,6 +9942,12 @@ string CompilerGLSL::access_chain_internal(uint32_t base, const uint32_t *indice
|
||||
bool relaxed_precision = has_decoration(base, DecorationRelaxedPrecision);
|
||||
bool pending_array_enclose = false;
|
||||
bool dimension_flatten = false;
|
||||
bool access_meshlet_position_y = false;
|
||||
|
||||
if (auto *base_expr = maybe_get<SPIRExpression>(base))
|
||||
{
|
||||
access_meshlet_position_y = base_expr->access_meshlet_position_y;
|
||||
}
|
||||
|
||||
// If we are translating access to a structured buffer, the first subscript '._m0' must be hidden
|
||||
bool hide_first_subscript = count > 1 && is_user_type_structured(base);
|
||||
@ -10114,6 +10120,13 @@ string CompilerGLSL::access_chain_internal(uint32_t base, const uint32_t *indice
|
||||
append_index(index, is_literal);
|
||||
}
|
||||
|
||||
if (var && has_decoration(var->self, DecorationBuiltIn) &&
|
||||
get_decoration(var->self, DecorationBuiltIn) == BuiltInPosition &&
|
||||
get_execution_model() == ExecutionModelMeshEXT)
|
||||
{
|
||||
access_meshlet_position_y = true;
|
||||
}
|
||||
|
||||
type_id = type->parent_type;
|
||||
type = &get<SPIRType>(type_id);
|
||||
|
||||
@ -10149,6 +10162,11 @@ string CompilerGLSL::access_chain_internal(uint32_t base, const uint32_t *indice
|
||||
}
|
||||
else
|
||||
expr = builtin_to_glsl(builtin, type->storage);
|
||||
|
||||
if (builtin == BuiltInPosition && get_execution_model() == ExecutionModelMeshEXT)
|
||||
{
|
||||
access_meshlet_position_y = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -10293,6 +10311,26 @@ string CompilerGLSL::access_chain_internal(uint32_t base, const uint32_t *indice
|
||||
is_packed);
|
||||
}
|
||||
|
||||
if (access_meshlet_position_y)
|
||||
{
|
||||
if (is_literal)
|
||||
{
|
||||
access_meshlet_position_y = index == 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
const auto *c = maybe_get<SPIRConstant>(index);
|
||||
if (c)
|
||||
access_meshlet_position_y = c->scalar() == 1;
|
||||
else
|
||||
{
|
||||
// We don't know, but we have to assume no.
|
||||
// Flip Y in mesh shaders is an opt-in horrible hack, so we'll have to assume shaders try to behave.
|
||||
access_meshlet_position_y = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
expr += deferred_index;
|
||||
row_major_matrix_needs_conversion = false;
|
||||
|
||||
@ -10319,6 +10357,7 @@ string CompilerGLSL::access_chain_internal(uint32_t base, const uint32_t *indice
|
||||
meta->storage_is_invariant = is_invariant;
|
||||
meta->storage_physical_type = physical_type;
|
||||
meta->relaxed_precision = relaxed_precision;
|
||||
meta->access_meshlet_position_y = access_meshlet_position_y;
|
||||
}
|
||||
|
||||
return expr;
|
||||
@ -11891,6 +11930,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
|
||||
expr.loaded_from = backing_variable ? backing_variable->self : ID(ops[2]);
|
||||
expr.need_transpose = meta.need_transpose;
|
||||
expr.access_chain = true;
|
||||
expr.access_meshlet_position_y = meta.access_meshlet_position_y;
|
||||
|
||||
// Mark the result as being packed. Some platforms handled packed vectors differently than non-packed.
|
||||
if (meta.storage_is_packed)
|
||||
|
27
3rdparty/spirv-cross/spirv_hlsl.cpp
vendored
27
3rdparty/spirv-cross/spirv_hlsl.cpp
vendored
@ -2254,6 +2254,20 @@ void CompilerHLSL::emit_resources()
|
||||
end_scope();
|
||||
statement("");
|
||||
}
|
||||
|
||||
if (is_mesh_shader && options.vertex.flip_vert_y)
|
||||
{
|
||||
statement("float4 spvFlipVertY(float4 v)");
|
||||
begin_scope();
|
||||
statement("return float4(v.x, -v.y, v.z, v.w);");
|
||||
end_scope();
|
||||
statement("");
|
||||
statement("float spvFlipVertY(float v)");
|
||||
begin_scope();
|
||||
statement("return -v;");
|
||||
end_scope();
|
||||
statement("");
|
||||
}
|
||||
}
|
||||
|
||||
void CompilerHLSL::emit_texture_size_variants(uint64_t variant_mask, const char *vecsize_qualifier, bool uav,
|
||||
@ -4950,6 +4964,19 @@ void CompilerHLSL::write_access_chain(const SPIRAccessChain &chain, uint32_t val
|
||||
void CompilerHLSL::emit_store(const Instruction &instruction)
|
||||
{
|
||||
auto ops = stream(instruction);
|
||||
if (options.vertex.flip_vert_y)
|
||||
{
|
||||
auto *expr = maybe_get<SPIRExpression>(ops[0]);
|
||||
if (expr != nullptr && expr->access_meshlet_position_y)
|
||||
{
|
||||
auto lhs = to_dereferenced_expression(ops[0]);
|
||||
auto rhs = to_unpacked_expression(ops[1]);
|
||||
statement(lhs, " = spvFlipVertY(", rhs, ");");
|
||||
register_write(ops[0]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
auto *chain = maybe_get<SPIRAccessChain>(ops[0]);
|
||||
if (chain)
|
||||
write_access_chain(*chain, ops[1], {});
|
||||
|
32
3rdparty/spirv-cross/spirv_msl.cpp
vendored
32
3rdparty/spirv-cross/spirv_msl.cpp
vendored
@ -7187,6 +7187,35 @@ void CompilerMSL::emit_custom_functions()
|
||||
end_scope();
|
||||
end_scope_decl();
|
||||
statement("");
|
||||
break;
|
||||
|
||||
case SPVFuncImplRayQueryIntersectionParams:
|
||||
statement("intersection_params spvMakeIntersectionParams(uint flags)");
|
||||
begin_scope();
|
||||
statement("intersection_params ip;");
|
||||
statement("if ((flags & ", RayFlagsOpaqueKHRMask, ") != 0)");
|
||||
statement(" ip.force_opacity(forced_opacity::opaque);");
|
||||
statement("if ((flags & ", RayFlagsNoOpaqueKHRMask, ") != 0)");
|
||||
statement(" ip.force_opacity(forced_opacity::non_opaque);");
|
||||
statement("if ((flags & ", RayFlagsTerminateOnFirstHitKHRMask, ") != 0)");
|
||||
statement(" ip.accept_any_intersection(true);");
|
||||
// RayFlagsSkipClosestHitShaderKHRMask is not available in MSL
|
||||
statement("if ((flags & ", RayFlagsCullBackFacingTrianglesKHRMask, ") != 0)");
|
||||
statement(" ip.set_triangle_cull_mode(triangle_cull_mode::back);");
|
||||
statement("if ((flags & ", RayFlagsCullFrontFacingTrianglesKHRMask, ") != 0)");
|
||||
statement(" ip.set_triangle_cull_mode(triangle_cull_mode::front);");
|
||||
statement("if ((flags & ", RayFlagsCullOpaqueKHRMask, ") != 0)");
|
||||
statement(" ip.set_opacity_cull_mode(opacity_cull_mode::opaque);");
|
||||
statement("if ((flags & ", RayFlagsCullNoOpaqueKHRMask, ") != 0)");
|
||||
statement(" ip.set_opacity_cull_mode(opacity_cull_mode::non_opaque);");
|
||||
statement("if ((flags & ", RayFlagsSkipTrianglesKHRMask, ") != 0)");
|
||||
statement(" ip.set_geometry_cull_mode(geometry_cull_mode::triangle);");
|
||||
statement("if ((flags & ", RayFlagsSkipAABBsKHRMask, ") != 0)");
|
||||
statement(" ip.set_geometry_cull_mode(geometry_cull_mode::bounding_box);");
|
||||
statement("return ip;");
|
||||
end_scope();
|
||||
statement("");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
@ -9237,10 +9266,11 @@ void CompilerMSL::emit_instruction(const Instruction &instruction)
|
||||
case OpRayQueryInitializeKHR:
|
||||
{
|
||||
flush_variable_declaration(ops[0]);
|
||||
add_spv_func_and_recompile(SPVFuncImplRayQueryIntersectionParams);
|
||||
|
||||
statement(to_expression(ops[0]), ".reset(", "ray(", to_expression(ops[4]), ", ", to_expression(ops[6]), ", ",
|
||||
to_expression(ops[5]), ", ", to_expression(ops[7]), "), ", to_expression(ops[1]),
|
||||
", intersection_params());");
|
||||
", spvMakeIntersectionParams(", to_expression(ops[2]), "));");
|
||||
break;
|
||||
}
|
||||
case OpRayQueryProceedKHR:
|
||||
|
1
3rdparty/spirv-cross/spirv_msl.hpp
vendored
1
3rdparty/spirv-cross/spirv_msl.hpp
vendored
@ -795,6 +795,7 @@ protected:
|
||||
SPVFuncImplConvertYCbCrBT601,
|
||||
SPVFuncImplConvertYCbCrBT2020,
|
||||
SPVFuncImplDynamicImageSampler,
|
||||
SPVFuncImplRayQueryIntersectionParams,
|
||||
};
|
||||
|
||||
// If the underlying resource has been used for comparison then duplicate loads of that resource must be too
|
||||
|
Loading…
Reference in New Issue
Block a user