Support samplerBuffer as function parameters in HLSL.
This commit is contained in:
Родитель
e8d5d71cad
Коммит
e8d2c8e710
|
@ -8,9 +8,14 @@ struct SPIRV_Cross_Output
|
||||||
float4 gl_Position : SV_Position;
|
float4 gl_Position : SV_Position;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
float4 sample_from_function(Buffer<float4> s0, Buffer<int4> s1, Buffer<uint4> s2)
|
||||||
|
{
|
||||||
|
return (s0.Load(20) + asfloat(s1.Load(40))) + asfloat(s2.Load(60));
|
||||||
|
}
|
||||||
|
|
||||||
void vert_main()
|
void vert_main()
|
||||||
{
|
{
|
||||||
gl_Position = (uFloatSampler.Load(20) + asfloat(uIntSampler.Load(40))) + asfloat(uUintSampler.Load(60));
|
gl_Position = sample_from_function(uFloatSampler, uIntSampler, uUintSampler);
|
||||||
}
|
}
|
||||||
|
|
||||||
SPIRV_Cross_Output main()
|
SPIRV_Cross_Output main()
|
||||||
|
|
|
@ -4,10 +4,14 @@ layout(binding = 1) uniform samplerBuffer uFloatSampler;
|
||||||
layout(binding = 2) uniform isamplerBuffer uIntSampler;
|
layout(binding = 2) uniform isamplerBuffer uIntSampler;
|
||||||
layout(binding = 3) uniform usamplerBuffer uUintSampler;
|
layout(binding = 3) uniform usamplerBuffer uUintSampler;
|
||||||
|
|
||||||
|
vec4 sample_from_function(samplerBuffer s0, isamplerBuffer s1, usamplerBuffer s2)
|
||||||
|
{
|
||||||
|
return texelFetch(s0, 20) +
|
||||||
|
intBitsToFloat(texelFetch(s1, 40)) +
|
||||||
|
uintBitsToFloat(texelFetch(s2, 60));
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position =
|
gl_Position = sample_from_function(uFloatSampler, uIntSampler, uUintSampler);
|
||||||
texelFetch(uFloatSampler, 20) +
|
|
||||||
intBitsToFloat(texelFetch(uIntSampler, 40)) +
|
|
||||||
uintBitsToFloat(texelFetch(uUintSampler, 60));
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1032,7 +1032,7 @@ string CompilerHLSL::to_func_call_arg(uint32_t id)
|
||||||
// We don't have to consider combined image samplers here via OpSampledImage because
|
// We don't have to consider combined image samplers here via OpSampledImage because
|
||||||
// those variables cannot be passed as arguments to functions.
|
// those variables cannot be passed as arguments to functions.
|
||||||
// Only global SampledImage variables may be used as arguments.
|
// Only global SampledImage variables may be used as arguments.
|
||||||
if (type.basetype == SPIRType::SampledImage)
|
if (type.basetype == SPIRType::SampledImage && type.image.dim != DimBuffer)
|
||||||
arg_str += ", " + to_sampler_expression(id);
|
arg_str += ", " + to_sampler_expression(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1080,11 +1080,10 @@ void CompilerHLSL::emit_function_prototype(SPIRFunction &func, uint64_t return_f
|
||||||
|
|
||||||
// Flatten a combined sampler to two separate arguments in modern HLSL.
|
// Flatten a combined sampler to two separate arguments in modern HLSL.
|
||||||
auto &arg_type = get<SPIRType>(arg.type);
|
auto &arg_type = get<SPIRType>(arg.type);
|
||||||
if (options.shader_model > 30 && arg_type.basetype == SPIRType::SampledImage)
|
if (options.shader_model > 30 && arg_type.basetype == SPIRType::SampledImage && arg_type.image.dim != DimBuffer)
|
||||||
{
|
{
|
||||||
// Manufacture automatic sampler arg for SampledImage texture
|
// Manufacture automatic sampler arg for SampledImage texture
|
||||||
decl += ", ";
|
decl += ", ";
|
||||||
if (arg_type.basetype == SPIRType::SampledImage)
|
|
||||||
decl += join(arg_type.image.depth ? "SamplerComparisonState " : "SamplerState ",
|
decl += join(arg_type.image.depth ? "SamplerComparisonState " : "SamplerState ",
|
||||||
to_sampler_expression(arg.id));
|
to_sampler_expression(arg.id));
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче