mirror of
https://github.com/KhronosGroup/SPIRV-Cross.git
synced 2024-11-08 21:30:05 +00:00
GLSL: Emit num_views for OVR_multiview2.
This commit is contained in:
parent
9cdeefb5e3
commit
d75666b170
@ -332,7 +332,7 @@ if (SPIRV_CROSS_STATIC)
|
||||
endif()
|
||||
|
||||
set(spirv-cross-abi-major 0)
|
||||
set(spirv-cross-abi-minor 47)
|
||||
set(spirv-cross-abi-minor 48)
|
||||
set(spirv-cross-abi-patch 0)
|
||||
|
||||
if (SPIRV_CROSS_SHARED)
|
||||
|
4
main.cpp
4
main.cpp
@ -662,6 +662,7 @@ struct CLIArguments
|
||||
bool glsl_emit_push_constant_as_ubo = false;
|
||||
bool glsl_emit_ubo_as_plain_uniforms = false;
|
||||
bool glsl_force_flattened_io_blocks = false;
|
||||
uint32_t glsl_ovr_multiview_view_count = 0;
|
||||
SmallVector<pair<uint32_t, uint32_t>> glsl_ext_framebuffer_fetch;
|
||||
bool glsl_ext_framebuffer_fetch_noncoherent = false;
|
||||
bool vulkan_glsl_disable_ext_samplerless_texture_functions = false;
|
||||
@ -779,6 +780,7 @@ static void print_help_glsl()
|
||||
"\t[--remap-variable-type <variable_name> <new_variable_type>]:\n\t\tRemaps a variable type based on name.\n"
|
||||
"\t\tPrimary use case is supporting external samplers in ESSL for video rendering on Android where you could remap a texture to a YUV one.\n"
|
||||
"\t[--glsl-force-flattened-io-blocks]:\n\t\tAlways flatten I/O blocks and structs.\n"
|
||||
"\t[--glsl-ovr-multiview-view-count count]:\n\t\tIn GL_OVR_multiview2, specify layout(num_views).\n"
|
||||
);
|
||||
// clang-format on
|
||||
}
|
||||
@ -1280,6 +1282,7 @@ static string compile_iteration(const CLIArguments &args, std::vector<uint32_t>
|
||||
opts.emit_push_constant_as_uniform_buffer = args.glsl_emit_push_constant_as_ubo;
|
||||
opts.emit_uniform_buffer_as_plain_uniforms = args.glsl_emit_ubo_as_plain_uniforms;
|
||||
opts.force_flattened_io_blocks = args.glsl_force_flattened_io_blocks;
|
||||
opts.ovr_multiview_view_count = args.glsl_ovr_multiview_view_count;
|
||||
opts.emit_line_directives = args.emit_line_directives;
|
||||
opts.enable_storage_image_qualifier_deduction = args.enable_storage_image_qualifier_deduction;
|
||||
opts.force_zero_initialized_variables = args.force_zero_initialized_variables;
|
||||
@ -1471,6 +1474,7 @@ static int main_inner(int argc, char *argv[])
|
||||
cbs.add("--glsl-emit-push-constant-as-ubo", [&args](CLIParser &) { args.glsl_emit_push_constant_as_ubo = true; });
|
||||
cbs.add("--glsl-emit-ubo-as-plain-uniforms", [&args](CLIParser &) { args.glsl_emit_ubo_as_plain_uniforms = true; });
|
||||
cbs.add("--glsl-force-flattened-io-blocks", [&args](CLIParser &) { args.glsl_force_flattened_io_blocks = true; });
|
||||
cbs.add("--glsl-ovr-multiview-view-count", [&args](CLIParser &parser) { args.glsl_ovr_multiview_view_count = parser.next_uint(); });
|
||||
cbs.add("--glsl-remap-ext-framebuffer-fetch", [&args](CLIParser &parser) {
|
||||
uint32_t input_index = parser.next_uint();
|
||||
uint32_t color_attachment = parser.next_uint();
|
||||
|
@ -472,6 +472,9 @@ spvc_result spvc_compiler_options_set_uint(spvc_compiler_options options, spvc_c
|
||||
case SPVC_COMPILER_OPTION_GLSL_FORCE_FLATTENED_IO_BLOCKS:
|
||||
options->glsl.force_flattened_io_blocks = value != 0;
|
||||
break;
|
||||
case SPVC_COMPILER_OPTION_GLSL_OVR_MULTIVIEW_VIEW_COUNT:
|
||||
options->glsl.ovr_multiview_view_count = value;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if SPIRV_CROSS_C_API_HLSL
|
||||
|
@ -40,7 +40,7 @@ extern "C" {
|
||||
/* Bumped if ABI or API breaks backwards compatibility. */
|
||||
#define SPVC_C_API_VERSION_MAJOR 0
|
||||
/* Bumped if APIs or enumerations are added in a backwards compatible way. */
|
||||
#define SPVC_C_API_VERSION_MINOR 47
|
||||
#define SPVC_C_API_VERSION_MINOR 48
|
||||
/* Bumped if internal implementation details change. */
|
||||
#define SPVC_C_API_VERSION_PATCH 0
|
||||
|
||||
@ -675,6 +675,8 @@ typedef enum spvc_compiler_option
|
||||
SPVC_COMPILER_OPTION_MSL_FORCE_SAMPLE_RATE_SHADING = 75 | SPVC_COMPILER_OPTION_MSL_BIT,
|
||||
SPVC_COMPILER_OPTION_MSL_IOS_SUPPORT_BASE_VERTEX_INSTANCE = 76 | SPVC_COMPILER_OPTION_MSL_BIT,
|
||||
|
||||
SPVC_COMPILER_OPTION_GLSL_OVR_MULTIVIEW_VIEW_COUNT = 77 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
||||
|
||||
SPVC_COMPILER_OPTION_INT_MAX = 0x7fffffff
|
||||
} spvc_compiler_option;
|
||||
|
||||
|
@ -566,10 +566,32 @@ void CompilerGLSL::find_static_extensions()
|
||||
case CapabilityVariablePointersStorageBuffer:
|
||||
SPIRV_CROSS_THROW("VariablePointers capability is not supported in GLSL.");
|
||||
|
||||
case CapabilityMultiView:
|
||||
if (options.vulkan_semantics)
|
||||
require_extension_internal("GL_EXT_multiview");
|
||||
else
|
||||
{
|
||||
require_extension_internal("GL_OVR_multiview2");
|
||||
if (options.ovr_multiview_view_count == 0)
|
||||
SPIRV_CROSS_THROW("ovr_multiview_view_count must be non-zero when using GL_OVR_multiview2.");
|
||||
if (get_execution_model() != ExecutionModelVertex)
|
||||
SPIRV_CROSS_THROW("OVR_multiview2 can only be used with Vertex shaders.");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (options.ovr_multiview_view_count)
|
||||
{
|
||||
if (options.vulkan_semantics)
|
||||
SPIRV_CROSS_THROW("OVR_multiview2 cannot be used with Vulkan semantics.");
|
||||
if (get_execution_model() != ExecutionModelVertex)
|
||||
SPIRV_CROSS_THROW("OVR_multiview2 can only be used with Vertex shaders.");
|
||||
require_extension_internal("GL_OVR_multiview2");
|
||||
}
|
||||
}
|
||||
|
||||
void CompilerGLSL::ray_tracing_khr_fixup_locations()
|
||||
@ -890,6 +912,10 @@ void CompilerGLSL::emit_header()
|
||||
|
||||
switch (execution.model)
|
||||
{
|
||||
case ExecutionModelVertex:
|
||||
if (options.ovr_multiview_view_count)
|
||||
inputs.push_back(join("num_views = ", options.ovr_multiview_view_count));
|
||||
break;
|
||||
case ExecutionModelGeometry:
|
||||
if ((execution.flags.get(ExecutionModeInvocations)) && execution.invocations != 1)
|
||||
inputs.push_back(join("invocations = ", execution.invocations));
|
||||
@ -8308,15 +8334,9 @@ string CompilerGLSL::builtin_to_glsl(BuiltIn builtin, StorageClass storage)
|
||||
|
||||
case BuiltInViewIndex:
|
||||
if (options.vulkan_semantics)
|
||||
{
|
||||
require_extension_internal("GL_EXT_multiview");
|
||||
return "gl_ViewIndex";
|
||||
}
|
||||
else
|
||||
{
|
||||
require_extension_internal("GL_OVR_multiview2");
|
||||
return "gl_ViewID_OVR";
|
||||
}
|
||||
|
||||
case BuiltInNumSubgroups:
|
||||
request_subgroup_feature(ShaderSubgroupSupportHelper::NumSubgroups);
|
||||
|
@ -133,6 +133,9 @@ public:
|
||||
// what happens on legacy GLSL targets for blocks and structs.
|
||||
bool force_flattened_io_blocks = false;
|
||||
|
||||
// If non-zero, controls layout(num_views = N) in; in GL_OVR_multiview2.
|
||||
uint32_t ovr_multiview_view_count = 0;
|
||||
|
||||
enum Precision
|
||||
{
|
||||
DontCare,
|
||||
|
Loading…
Reference in New Issue
Block a user