Merge pull request #684 from cdavis5e/msl-builtin-vector-cast
MSL: Cast uses of builtin vectors to their declared SPIR-V type.
This commit is contained in:
Коммит
403011e973
|
@ -18,8 +18,8 @@ uint2 spvTexelBufferCoord(uint tc)
|
|||
|
||||
kernel void main0(constant cb5_struct& cb0_5 [[buffer(1)]], texture2d<uint, access::write> u0 [[texture(0)]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]])
|
||||
{
|
||||
uint _44 = as_type<uint>(as_type<float>(gl_LocalInvocationID.x << 4)) >> 2u;
|
||||
uint4 _51 = as_type<uint4>(cb0_5._m0[uint(as_type<int>(as_type<float>(gl_LocalInvocationID.x))) + 1u]);
|
||||
uint _44 = as_type<uint>(as_type<float>(int(gl_LocalInvocationID.x) << 4)) >> 2u;
|
||||
uint4 _51 = as_type<uint4>(cb0_5._m0[uint(as_type<int>(as_type<float>(int(gl_LocalInvocationID.x)))) + 1u]);
|
||||
u0.write(_51.xxxx, spvTexelBufferCoord(_44));
|
||||
u0.write(_51.yyyy, spvTexelBufferCoord((_44 + 1u)));
|
||||
u0.write(_51.zzzz, spvTexelBufferCoord((_44 + 2u)));
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
#include <metal_stdlib>
|
||||
#include <simd/simd.h>
|
||||
|
||||
using namespace metal;
|
||||
|
||||
constant uint3 gl_WorkGroupSize = uint3(16u, 16u, 1u);
|
||||
|
||||
struct cb1_struct
|
||||
{
|
||||
float4 _m0[1];
|
||||
};
|
||||
|
||||
kernel void main0(constant cb1_struct& cb0_1 [[buffer(0)]], texture2d<float, access::write> u0 [[texture(1)]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]])
|
||||
{
|
||||
int2 _46 = int2(u0.get_width(), u0.get_height()) >> int2(uint2(4u));
|
||||
int _99;
|
||||
_99 = 0;
|
||||
for (; _99 < _46.y; _99++)
|
||||
{
|
||||
for (int _100 = 0; _100 < _46.x; )
|
||||
{
|
||||
u0.write(cb0_1._m0[0].xxxx, uint2(((_46 * int3(gl_LocalInvocationID).xy) + int2(_99, _100))));
|
||||
_100++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
#include <metal_stdlib>
|
||||
#include <simd/simd.h>
|
||||
|
||||
using namespace metal;
|
||||
|
||||
constant uint3 gl_WorkGroupSize = uint3(16u, 16u, 1u);
|
||||
|
||||
struct cb1_struct
|
||||
{
|
||||
float4 _m0[1];
|
||||
};
|
||||
|
||||
kernel void main0(constant cb1_struct& cb0_1 [[buffer(0)]], texture2d<float, access::write> u0 [[texture(1)]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]])
|
||||
{
|
||||
int2 _40 = int2(u0.get_width(), u0.get_height()) >> int2(uint2(4u));
|
||||
int _82;
|
||||
_82 = 0;
|
||||
for (; _82 < _40.y; _82++)
|
||||
{
|
||||
for (int _83 = 0; _83 < _40.x; )
|
||||
{
|
||||
u0.write(cb0_1._m0[0].xxxx, uint2(((_40 * int3(gl_LocalInvocationID).xy) + int2(_82, _83))));
|
||||
_83++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -19,8 +19,8 @@ uint2 spvTexelBufferCoord(uint tc)
|
|||
kernel void main0(constant cb5_struct& cb0_5 [[buffer(1)]], texture2d<uint, access::write> u0 [[texture(0)]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]])
|
||||
{
|
||||
float4 r0;
|
||||
r0.x = as_type<float>(gl_LocalInvocationID.x << 4);
|
||||
r0.y = as_type<float>(gl_LocalInvocationID.x);
|
||||
r0.x = as_type<float>(int(gl_LocalInvocationID.x) << 4);
|
||||
r0.y = as_type<float>(int(gl_LocalInvocationID.x));
|
||||
uint _44 = as_type<uint>(r0.x) >> 2u;
|
||||
uint4 _51 = as_type<uint4>(cb0_5._m0[uint(as_type<int>(r0.y)) + 1u]);
|
||||
u0.write(_51.xxxx, spvTexelBufferCoord(_44));
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
#pragma clang diagnostic ignored "-Wmissing-prototypes"
|
||||
|
||||
#include <metal_stdlib>
|
||||
#include <simd/simd.h>
|
||||
|
||||
using namespace metal;
|
||||
|
||||
constant uint3 gl_WorkGroupSize = uint3(16u, 16u, 1u);
|
||||
|
||||
struct cb1_struct
|
||||
{
|
||||
float4 _m0[1];
|
||||
};
|
||||
|
||||
int2 get_texcoord(thread const int2& base, thread const int2& index, thread uint3& gl_LocalInvocationID)
|
||||
{
|
||||
return (base * int3(gl_LocalInvocationID).xy) + index;
|
||||
}
|
||||
|
||||
kernel void main0(constant cb1_struct& cb0_1 [[buffer(0)]], texture2d<float, access::write> u0 [[texture(1)]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]])
|
||||
{
|
||||
int2 r0 = int2(int2(u0.get_width(), u0.get_height()) >> int2(uint2(4u)));
|
||||
for (int i = 0; i < r0.y; i++)
|
||||
{
|
||||
for (int j = 0; j < r0.x; j++)
|
||||
{
|
||||
int2 param = r0;
|
||||
int2 param_1 = int2(i, j);
|
||||
u0.write(cb0_1._m0[0].xxxx, uint2(get_texcoord(param, param_1, gl_LocalInvocationID)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
#include <metal_stdlib>
|
||||
#include <simd/simd.h>
|
||||
|
||||
using namespace metal;
|
||||
|
||||
constant uint3 gl_WorkGroupSize = uint3(16u, 16u, 1u);
|
||||
|
||||
struct cb1_struct
|
||||
{
|
||||
float4 _m0[1];
|
||||
};
|
||||
|
||||
kernel void main0(constant cb1_struct& cb0_1 [[buffer(0)]], texture2d<float, access::write> u0 [[texture(1)]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]])
|
||||
{
|
||||
int2 r0 = int2(int2(u0.get_width(), u0.get_height()) >> int2(uint2(4u)));
|
||||
for (int i = 0; i < r0.y; i++)
|
||||
{
|
||||
for (int j = 0; j < r0.x; j++)
|
||||
{
|
||||
u0.write(cb0_1._m0[0].xxxx, uint2(((r0 * int3(gl_LocalInvocationID).xy) + int2(i, j))));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,147 @@
|
|||
; SPIR-V
|
||||
; Version: 1.3
|
||||
; Generator: Khronos Glslang Reference Front End; 6
|
||||
; Bound: 90
|
||||
; Schema: 0
|
||||
OpCapability Shader
|
||||
OpCapability ImageQuery
|
||||
OpCapability StorageImageWriteWithoutFormat
|
||||
%1 = OpExtInstImport "GLSL.std.450"
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %gl_LocalInvocationID
|
||||
OpExecutionMode %main LocalSize 16 16 1
|
||||
OpSource GLSL 450
|
||||
OpName %main "main"
|
||||
OpName %get_texcoord_vi2_vi2_ "get_texcoord(vi2;vi2;"
|
||||
OpName %base "base"
|
||||
OpName %index "index"
|
||||
OpName %gl_LocalInvocationID "gl_LocalInvocationID"
|
||||
OpName %r0 "r0"
|
||||
OpName %u0 "u0"
|
||||
OpName %i "i"
|
||||
OpName %j "j"
|
||||
OpName %param "param"
|
||||
OpName %param_0 "param"
|
||||
OpName %cb1_struct "cb1_struct"
|
||||
OpMemberName %cb1_struct 0 "_m0"
|
||||
OpName %cb0_1 "cb0_1"
|
||||
OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
|
||||
OpDecorate %u0 DescriptorSet 0
|
||||
OpDecorate %u0 Binding 1
|
||||
OpDecorate %u0 NonReadable
|
||||
OpDecorate %_arr_v4float_uint_1 ArrayStride 16
|
||||
OpMemberDecorate %cb1_struct 0 Offset 0
|
||||
OpDecorate %cb1_struct Block
|
||||
OpDecorate %cb0_1 DescriptorSet 0
|
||||
OpDecorate %cb0_1 Binding 0
|
||||
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
|
||||
%void = OpTypeVoid
|
||||
%3 = OpTypeFunction %void
|
||||
%int = OpTypeInt 32 1
|
||||
%v2int = OpTypeVector %int 2
|
||||
%_ptr_Function_v2int = OpTypePointer Function %v2int
|
||||
%9 = OpTypeFunction %v2int %_ptr_Function_v2int %_ptr_Function_v2int
|
||||
%v3int = OpTypeVector %int 3
|
||||
%_ptr_Input_v3int = OpTypePointer Input %v3int
|
||||
%gl_LocalInvocationID = OpVariable %_ptr_Input_v3int Input
|
||||
%uint = OpTypeInt 32 0
|
||||
%v2uint = OpTypeVector %uint 2
|
||||
%float = OpTypeFloat 32
|
||||
%30 = OpTypeImage %float 2D 0 0 0 2 Unknown
|
||||
%_ptr_UniformConstant_30 = OpTypePointer UniformConstant %30
|
||||
%u0 = OpVariable %_ptr_UniformConstant_30 UniformConstant
|
||||
%uint_4 = OpConstant %uint 4
|
||||
%_ptr_Function_int = OpTypePointer Function %int
|
||||
%int_0 = OpConstant %int 0
|
||||
%uint_1 = OpConstant %uint 1
|
||||
%bool = OpTypeBool
|
||||
%uint_0 = OpConstant %uint 0
|
||||
%v4float = OpTypeVector %float 4
|
||||
%_arr_v4float_uint_1 = OpTypeArray %v4float %uint_1
|
||||
%cb1_struct = OpTypeStruct %_arr_v4float_uint_1
|
||||
%_ptr_Uniform_cb1_struct = OpTypePointer Uniform %cb1_struct
|
||||
%cb0_1 = OpVariable %_ptr_Uniform_cb1_struct Uniform
|
||||
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
|
||||
%int_1 = OpConstant %int 1
|
||||
%uint_16 = OpConstant %uint 16
|
||||
%v3uint = OpTypeVector %uint 3
|
||||
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_1
|
||||
%main = OpFunction %void None %3
|
||||
%5 = OpLabel
|
||||
%r0 = OpVariable %_ptr_Function_v2int Function
|
||||
%i = OpVariable %_ptr_Function_int Function
|
||||
%j = OpVariable %_ptr_Function_int Function
|
||||
%param = OpVariable %_ptr_Function_v2int Function
|
||||
%param_0 = OpVariable %_ptr_Function_v2int Function
|
||||
%33 = OpLoad %30 %u0
|
||||
%34 = OpImageQuerySize %v2int %33
|
||||
%36 = OpCompositeConstruct %v2uint %uint_4 %uint_4
|
||||
%37 = OpShiftRightArithmetic %v2int %34 %36
|
||||
%38 = OpCompositeExtract %int %37 0
|
||||
%39 = OpCompositeExtract %int %37 1
|
||||
%40 = OpCompositeConstruct %v2int %38 %39
|
||||
OpStore %r0 %40
|
||||
OpStore %i %int_0
|
||||
OpBranch %44
|
||||
%44 = OpLabel
|
||||
OpLoopMerge %46 %47 None
|
||||
OpBranch %48
|
||||
%48 = OpLabel
|
||||
%49 = OpLoad %int %i
|
||||
%51 = OpAccessChain %_ptr_Function_int %r0 %uint_1
|
||||
%52 = OpLoad %int %51
|
||||
%54 = OpSLessThan %bool %49 %52
|
||||
OpBranchConditional %54 %45 %46
|
||||
%45 = OpLabel
|
||||
OpStore %j %int_0
|
||||
OpBranch %56
|
||||
%56 = OpLabel
|
||||
OpLoopMerge %58 %59 None
|
||||
OpBranch %60
|
||||
%60 = OpLabel
|
||||
%61 = OpLoad %int %j
|
||||
%63 = OpAccessChain %_ptr_Function_int %r0 %uint_0
|
||||
%64 = OpLoad %int %63
|
||||
%65 = OpSLessThan %bool %61 %64
|
||||
OpBranchConditional %65 %57 %58
|
||||
%57 = OpLabel
|
||||
%66 = OpLoad %30 %u0
|
||||
%67 = OpLoad %int %i
|
||||
%68 = OpLoad %int %j
|
||||
%69 = OpCompositeConstruct %v2int %67 %68
|
||||
%71 = OpLoad %v2int %r0
|
||||
OpStore %param %71
|
||||
OpStore %param_0 %69
|
||||
%73 = OpFunctionCall %v2int %get_texcoord_vi2_vi2_ %param %param_0
|
||||
%80 = OpAccessChain %_ptr_Uniform_v4float %cb0_1 %int_0 %int_0
|
||||
%81 = OpLoad %v4float %80
|
||||
%82 = OpVectorShuffle %v4float %81 %81 0 0 0 0
|
||||
OpImageWrite %66 %73 %82
|
||||
OpBranch %59
|
||||
%59 = OpLabel
|
||||
%83 = OpLoad %int %j
|
||||
%85 = OpIAdd %int %83 %int_1
|
||||
OpStore %j %85
|
||||
OpBranch %56
|
||||
%58 = OpLabel
|
||||
OpBranch %47
|
||||
%47 = OpLabel
|
||||
%86 = OpLoad %int %i
|
||||
%87 = OpIAdd %int %86 %int_1
|
||||
OpStore %i %87
|
||||
OpBranch %44
|
||||
%46 = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
%get_texcoord_vi2_vi2_ = OpFunction %v2int None %9
|
||||
%base = OpFunctionParameter %_ptr_Function_v2int
|
||||
%index = OpFunctionParameter %_ptr_Function_v2int
|
||||
%13 = OpLabel
|
||||
%14 = OpLoad %v2int %base
|
||||
%20 = OpLoad %v3int %gl_LocalInvocationID
|
||||
%21 = OpVectorShuffle %v2int %20 %20 0 1
|
||||
%23 = OpIMul %v2int %14 %21
|
||||
%24 = OpLoad %v2int %index
|
||||
%25 = OpIAdd %v2int %23 %24
|
||||
OpReturnValue %25
|
||||
OpFunctionEnd
|
|
@ -0,0 +1,128 @@
|
|||
; SPIR-V
|
||||
; Version: 1.3
|
||||
; Generator: Khronos Glslang Reference Front End; 6
|
||||
; Bound: 78
|
||||
; Schema: 0
|
||||
OpCapability Shader
|
||||
OpCapability ImageQuery
|
||||
OpCapability StorageImageWriteWithoutFormat
|
||||
%1 = OpExtInstImport "GLSL.std.450"
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %gl_LocalInvocationID
|
||||
OpExecutionMode %main LocalSize 16 16 1
|
||||
OpSource GLSL 450
|
||||
OpName %main "main"
|
||||
OpName %r0 "r0"
|
||||
OpName %u0 "u0"
|
||||
OpName %i "i"
|
||||
OpName %j "j"
|
||||
OpName %gl_LocalInvocationID "gl_LocalInvocationID"
|
||||
OpName %cb1_struct "cb1_struct"
|
||||
OpMemberName %cb1_struct 0 "_m0"
|
||||
OpName %cb0_1 "cb0_1"
|
||||
OpDecorate %u0 DescriptorSet 0
|
||||
OpDecorate %u0 Binding 1
|
||||
OpDecorate %u0 NonReadable
|
||||
OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
|
||||
OpDecorate %_arr_v4float_uint_1 ArrayStride 16
|
||||
OpMemberDecorate %cb1_struct 0 Offset 0
|
||||
OpDecorate %cb1_struct Block
|
||||
OpDecorate %cb0_1 DescriptorSet 0
|
||||
OpDecorate %cb0_1 Binding 0
|
||||
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
|
||||
%void = OpTypeVoid
|
||||
%3 = OpTypeFunction %void
|
||||
%int = OpTypeInt 32 1
|
||||
%v2int = OpTypeVector %int 2
|
||||
%_ptr_Function_v2int = OpTypePointer Function %v2int
|
||||
%float = OpTypeFloat 32
|
||||
%11 = OpTypeImage %float 2D 0 0 0 2 Unknown
|
||||
%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
|
||||
%u0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
|
||||
%uint = OpTypeInt 32 0
|
||||
%uint_4 = OpConstant %uint 4
|
||||
%v2uint = OpTypeVector %uint 2
|
||||
%_ptr_Function_int = OpTypePointer Function %int
|
||||
%int_0 = OpConstant %int 0
|
||||
%uint_1 = OpConstant %uint 1
|
||||
%bool = OpTypeBool
|
||||
%uint_0 = OpConstant %uint 0
|
||||
%v3int = OpTypeVector %int 3
|
||||
%_ptr_Input_v3int = OpTypePointer Input %v3int
|
||||
%gl_LocalInvocationID = OpVariable %_ptr_Input_v3int Input
|
||||
%v4float = OpTypeVector %float 4
|
||||
%_arr_v4float_uint_1 = OpTypeArray %v4float %uint_1
|
||||
%cb1_struct = OpTypeStruct %_arr_v4float_uint_1
|
||||
%_ptr_Uniform_cb1_struct = OpTypePointer Uniform %cb1_struct
|
||||
%cb0_1 = OpVariable %_ptr_Uniform_cb1_struct Uniform
|
||||
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
|
||||
%int_1 = OpConstant %int 1
|
||||
%uint_16 = OpConstant %uint 16
|
||||
%v3uint = OpTypeVector %uint 3
|
||||
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_1
|
||||
%main = OpFunction %void None %3
|
||||
%5 = OpLabel
|
||||
%r0 = OpVariable %_ptr_Function_v2int Function
|
||||
%i = OpVariable %_ptr_Function_int Function
|
||||
%j = OpVariable %_ptr_Function_int Function
|
||||
%14 = OpLoad %11 %u0
|
||||
%15 = OpImageQuerySize %v2int %14
|
||||
%19 = OpCompositeConstruct %v2uint %uint_4 %uint_4
|
||||
%20 = OpShiftRightArithmetic %v2int %15 %19
|
||||
%21 = OpCompositeExtract %int %20 0
|
||||
%22 = OpCompositeExtract %int %20 1
|
||||
%23 = OpCompositeConstruct %v2int %21 %22
|
||||
OpStore %r0 %23
|
||||
OpStore %i %int_0
|
||||
OpBranch %27
|
||||
%27 = OpLabel
|
||||
OpLoopMerge %29 %30 None
|
||||
OpBranch %31
|
||||
%31 = OpLabel
|
||||
%32 = OpLoad %int %i
|
||||
%34 = OpAccessChain %_ptr_Function_int %r0 %uint_1
|
||||
%35 = OpLoad %int %34
|
||||
%37 = OpSLessThan %bool %32 %35
|
||||
OpBranchConditional %37 %28 %29
|
||||
%28 = OpLabel
|
||||
OpStore %j %int_0
|
||||
OpBranch %39
|
||||
%39 = OpLabel
|
||||
OpLoopMerge %41 %42 None
|
||||
OpBranch %43
|
||||
%43 = OpLabel
|
||||
%44 = OpLoad %int %j
|
||||
%46 = OpAccessChain %_ptr_Function_int %r0 %uint_0
|
||||
%47 = OpLoad %int %46
|
||||
%48 = OpSLessThan %bool %44 %47
|
||||
OpBranchConditional %48 %40 %41
|
||||
%40 = OpLabel
|
||||
%49 = OpLoad %11 %u0
|
||||
%50 = OpLoad %v2int %r0
|
||||
%54 = OpLoad %v3int %gl_LocalInvocationID
|
||||
%55 = OpVectorShuffle %v2int %54 %54 0 1
|
||||
%57 = OpIMul %v2int %50 %55
|
||||
%58 = OpLoad %int %i
|
||||
%59 = OpLoad %int %j
|
||||
%60 = OpCompositeConstruct %v2int %58 %59
|
||||
%61 = OpIAdd %v2int %57 %60
|
||||
%68 = OpAccessChain %_ptr_Uniform_v4float %cb0_1 %int_0 %int_0
|
||||
%69 = OpLoad %v4float %68
|
||||
%70 = OpVectorShuffle %v4float %69 %69 0 0 0 0
|
||||
OpImageWrite %49 %61 %70
|
||||
OpBranch %42
|
||||
%42 = OpLabel
|
||||
%71 = OpLoad %int %j
|
||||
%73 = OpIAdd %int %71 %int_1
|
||||
OpStore %j %73
|
||||
OpBranch %39
|
||||
%41 = OpLabel
|
||||
OpBranch %30
|
||||
%30 = OpLabel
|
||||
%74 = OpLoad %int %i
|
||||
%75 = OpIAdd %int %74 %int_1
|
||||
OpStore %i %75
|
||||
OpBranch %27
|
||||
%29 = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
|
@ -4545,11 +4545,38 @@ void CompilerMSL::remap_constexpr_sampler(uint32_t id, const MSLConstexprSampler
|
|||
constexpr_samplers[id] = sampler;
|
||||
}
|
||||
|
||||
// MSL always declares builtins with their SPIR-V type.
|
||||
void CompilerMSL::bitcast_from_builtin_load(uint32_t, std::string &, const SPIRType &)
|
||||
void CompilerMSL::bitcast_from_builtin_load(uint32_t source_id, std::string &expr, const SPIRType &expr_type)
|
||||
{
|
||||
auto *var = maybe_get_backing_variable(source_id);
|
||||
if (var)
|
||||
source_id = var->self;
|
||||
|
||||
// Only interested in standalone builtin variables.
|
||||
if (!has_decoration(source_id, DecorationBuiltIn))
|
||||
return;
|
||||
|
||||
auto builtin = static_cast<BuiltIn>(get_decoration(source_id, DecorationBuiltIn));
|
||||
auto expected_type = expr_type.basetype;
|
||||
switch (builtin)
|
||||
{
|
||||
case BuiltInGlobalInvocationId:
|
||||
case BuiltInLocalInvocationId:
|
||||
case BuiltInWorkgroupId:
|
||||
case BuiltInLocalInvocationIndex:
|
||||
case BuiltInWorkgroupSize:
|
||||
case BuiltInNumWorkgroups:
|
||||
expected_type = SPIRType::UInt;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (expected_type != expr_type.basetype)
|
||||
expr = bitcast_expression(expr_type, expected_type, expr);
|
||||
}
|
||||
|
||||
// MSL always declares output builtins with the SPIR-V type.
|
||||
void CompilerMSL::bitcast_to_builtin_store(uint32_t, std::string &, const SPIRType &)
|
||||
{
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче