Bug Summary

File:root/firefox-clang/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/glsl_parser_extras.h
Warning:line 79, column 8
Excessive padding in 'struct _mesa_glsl_parse_state' (59 padding bytes, where 3 is optimal). Optimal fields order: ctx, scanner, symbols, linalloc, default_uniform_qualifier, default_shader_storage_qualifier, in_qualifier, out_qualifier, supported_version_string, current_function, toplevel_ir, loop_nesting_ast, user_structures, info_log, extensions, subroutine_types, subroutines, translation_unit, switch_state, num_supported_versions, language_version, forced_language_version, gl_version, stage, cs_derivative_group, num_user_structures, gs_input_size, fs_blend_support, tcs_output_size, num_subroutine_types, num_subroutines, clip_dist_size, cull_dist_size, cs_input_local_size, supported_versions, Const, atomic_counter_offsets, es_shader, compat_shader, had_version_string, zero_init, fs_redeclares_gl_fragcoord, fs_origin_upper_left, fs_pixel_center_integer, fs_redeclares_gl_fragcoord_with_no_layout_qualifiers, gs_input_prim_type_specified, tcs_output_vertices_specified, cs_input_local_size_specified, cs_input_local_size_variable_specified, bindless_sampler_specified, bindless_image_specified, bound_sampler_specified, bound_image_specified, found_return, found_begin_interlock, found_end_interlock, error, all_invariant, warnings_enabled, ARB_ES3_1_compatibility_enable, ARB_ES3_1_compatibility_warn, ARB_ES3_2_compatibility_enable, ARB_ES3_2_compatibility_warn, ARB_arrays_of_arrays_enable, ARB_arrays_of_arrays_warn, ARB_bindless_texture_enable, ARB_bindless_texture_warn, ARB_compatibility_enable, ARB_compatibility_warn, ARB_compute_shader_enable, ARB_compute_shader_warn, ARB_compute_variable_group_size_enable, ARB_compute_variable_group_size_warn, ARB_conservative_depth_enable, ARB_conservative_depth_warn, ARB_cull_distance_enable, ARB_cull_distance_warn, ARB_derivative_control_enable, ARB_derivative_control_warn, ARB_draw_buffers_enable, ARB_draw_buffers_warn, ARB_draw_instanced_enable, ARB_draw_instanced_warn, ARB_enhanced_layouts_enable, ARB_enhanced_layouts_warn, ARB_explicit_attrib_location_enable, ARB_explicit_attrib_location_warn, ARB_explicit_uniform_location_enable, ARB_explicit_uniform_location_warn, ARB_fragment_coord_conventions_enable, ARB_fragment_coord_conventions_warn, ARB_fragment_layer_viewport_enable, ARB_fragment_layer_viewport_warn, ARB_fragment_shader_interlock_enable, ARB_fragment_shader_interlock_warn, ARB_gpu_shader5_enable, ARB_gpu_shader5_warn, ARB_gpu_shader_fp64_enable, ARB_gpu_shader_fp64_warn, ARB_gpu_shader_int64_enable, ARB_gpu_shader_int64_warn, ARB_post_depth_coverage_enable, ARB_post_depth_coverage_warn, ARB_sample_shading_enable, ARB_sample_shading_warn, ARB_separate_shader_objects_enable, ARB_separate_shader_objects_warn, ARB_shader_atomic_counter_ops_enable, ARB_shader_atomic_counter_ops_warn, ARB_shader_atomic_counters_enable, ARB_shader_atomic_counters_warn, ARB_shader_ballot_enable, ARB_shader_ballot_warn, ARB_shader_bit_encoding_enable, ARB_shader_bit_encoding_warn, ARB_shader_clock_enable, ARB_shader_clock_warn, ARB_shader_draw_parameters_enable, ARB_shader_draw_parameters_warn, ARB_shader_group_vote_enable, ARB_shader_group_vote_warn, ARB_shader_image_load_store_enable, ARB_shader_image_load_store_warn, ARB_shader_image_size_enable, ARB_shader_image_size_warn, ARB_shader_precision_enable, ARB_shader_precision_warn, ARB_shader_stencil_export_enable, ARB_shader_stencil_export_warn, ARB_shader_storage_buffer_object_enable, ARB_shader_storage_buffer_object_warn, ARB_shader_subroutine_enable, ARB_shader_subroutine_warn, ARB_shader_texture_image_samples_enable, ARB_shader_texture_image_samples_warn, ARB_shader_texture_lod_enable, ARB_shader_texture_lod_warn, ARB_shader_viewport_layer_array_enable, ARB_shader_viewport_layer_array_warn, ARB_shading_language_420pack_enable, ARB_shading_language_420pack_warn, ARB_shading_language_include_enable, ARB_shading_language_include_warn, ARB_shading_language_packing_enable, ARB_shading_language_packing_warn, ARB_tessellation_shader_enable, ARB_tessellation_shader_warn, ARB_texture_cube_map_array_enable, ARB_texture_cube_map_array_warn, ARB_texture_gather_enable, ARB_texture_gather_warn, ARB_texture_multisample_enable, ARB_texture_multisample_warn, ARB_texture_query_levels_enable, ARB_texture_query_levels_warn, ARB_texture_query_lod_enable, ARB_texture_query_lod_warn, ARB_texture_rectangle_enable, ARB_texture_rectangle_warn, ARB_uniform_buffer_object_enable, ARB_uniform_buffer_object_warn, ARB_vertex_attrib_64bit_enable, ARB_vertex_attrib_64bit_warn, ARB_viewport_array_enable, ARB_viewport_array_warn, KHR_blend_equation_advanced_enable, KHR_blend_equation_advanced_warn, OES_EGL_image_external_enable, OES_EGL_image_external_warn, OES_EGL_image_external_essl3_enable, OES_EGL_image_external_essl3_warn, OES_geometry_point_size_enable, OES_geometry_point_size_warn, OES_geometry_shader_enable, OES_geometry_shader_warn, OES_gpu_shader5_enable, OES_gpu_shader5_warn, OES_primitive_bounding_box_enable, OES_primitive_bounding_box_warn, OES_sample_variables_enable, OES_sample_variables_warn, OES_shader_image_atomic_enable, OES_shader_image_atomic_warn, OES_shader_io_blocks_enable, OES_shader_io_blocks_warn, OES_shader_multisample_interpolation_enable, OES_shader_multisample_interpolation_warn, OES_standard_derivatives_enable, OES_standard_derivatives_warn, OES_tessellation_point_size_enable, OES_tessellation_point_size_warn, OES_tessellation_shader_enable, OES_tessellation_shader_warn, OES_texture_3D_enable, OES_texture_3D_warn, OES_texture_buffer_enable, OES_texture_buffer_warn, OES_texture_cube_map_array_enable, OES_texture_cube_map_array_warn, OES_texture_storage_multisample_2d_array_enable, OES_texture_storage_multisample_2d_array_warn, OES_viewport_array_enable, OES_viewport_array_warn, AMD_conservative_depth_enable, AMD_conservative_depth_warn, AMD_gpu_shader_int64_enable, AMD_gpu_shader_int64_warn, AMD_shader_stencil_export_enable, AMD_shader_stencil_export_warn, AMD_shader_trinary_minmax_enable, AMD_shader_trinary_minmax_warn, AMD_texture_texture4_enable, AMD_texture_texture4_warn, AMD_vertex_shader_layer_enable, AMD_vertex_shader_layer_warn, AMD_vertex_shader_viewport_index_enable, AMD_vertex_shader_viewport_index_warn, ANDROID_extension_pack_es31a_enable, ANDROID_extension_pack_es31a_warn, EXT_blend_func_extended_enable, EXT_blend_func_extended_warn, EXT_clip_cull_distance_enable, EXT_clip_cull_distance_warn, EXT_demote_to_helper_invocation_enable, EXT_demote_to_helper_invocation_warn, EXT_draw_buffers_enable, EXT_draw_buffers_warn, EXT_draw_instanced_enable, EXT_draw_instanced_warn, EXT_frag_depth_enable, EXT_frag_depth_warn, EXT_geometry_point_size_enable, EXT_geometry_point_size_warn, EXT_geometry_shader_enable, EXT_geometry_shader_warn, EXT_gpu_shader4_enable, EXT_gpu_shader4_warn, EXT_gpu_shader5_enable, EXT_gpu_shader5_warn, EXT_primitive_bounding_box_enable, EXT_primitive_bounding_box_warn, EXT_separate_shader_objects_enable, EXT_separate_shader_objects_warn, EXT_shader_framebuffer_fetch_enable, EXT_shader_framebuffer_fetch_warn, EXT_shader_framebuffer_fetch_non_coherent_enable, EXT_shader_framebuffer_fetch_non_coherent_warn, EXT_shader_image_load_formatted_enable, EXT_shader_image_load_formatted_warn, EXT_shader_image_load_store_enable, EXT_shader_image_load_store_warn, EXT_shader_implicit_conversions_enable, EXT_shader_implicit_conversions_warn, EXT_shader_integer_mix_enable, EXT_shader_integer_mix_warn, EXT_shader_io_blocks_enable, EXT_shader_io_blocks_warn, EXT_shader_samples_identical_enable, EXT_shader_samples_identical_warn, EXT_tessellation_point_size_enable, EXT_tessellation_point_size_warn, EXT_tessellation_shader_enable, EXT_tessellation_shader_warn, EXT_texture_array_enable, EXT_texture_array_warn, EXT_texture_buffer_enable, EXT_texture_buffer_warn, EXT_texture_cube_map_array_enable, EXT_texture_cube_map_array_warn, EXT_texture_query_lod_enable, EXT_texture_query_lod_warn, EXT_texture_shadow_lod_enable, EXT_texture_shadow_lod_warn, INTEL_conservative_rasterization_enable, INTEL_conservative_rasterization_warn, INTEL_shader_atomic_float_minmax_enable, INTEL_shader_atomic_float_minmax_warn, INTEL_shader_integer_functions2_enable, INTEL_shader_integer_functions2_warn, MESA_shader_integer_functions_enable, MESA_shader_integer_functions_warn, NV_compute_shader_derivatives_enable, NV_compute_shader_derivatives_warn, NV_fragment_shader_interlock_enable, NV_fragment_shader_interlock_warn, NV_image_formats_enable, NV_image_formats_warn, NV_shader_atomic_float_enable, NV_shader_atomic_float_warn, NV_viewport_array2_enable, NV_viewport_array2_warn, uses_builtin_functions, fs_uses_gl_fragcoord, fs_early_fragment_tests, fs_inner_coverage, fs_post_depth_coverage, fs_pixel_interlock_ordered, fs_pixel_interlock_unordered, fs_sample_interlock_ordered, fs_sample_interlock_unordered, redeclares_gl_layer, layer_viewport_relative, allow_extension_directive_midshader, allow_builtin_variable_redeclaration, allow_layout_qualifier_on_function_parameter, is_field, consider reordering the fields or adding explicit padding members

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name glsl_types.cpp -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/third_party/rust/glslopt -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/root/firefox-clang/third_party/rust/glslopt -resource-dir /usr/lib/llvm-21/lib/clang/21 -include /root/firefox-clang/config/gcc_hidden.h -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -I glsl-optimizer/include -I glsl-optimizer/src/mesa -I glsl-optimizer/src/mapi -I glsl-optimizer/src/compiler -I glsl-optimizer/src/compiler/glsl -I glsl-optimizer/src/gallium/auxiliary -I glsl-optimizer/src/gallium/include -I glsl-optimizer/src -I glsl-optimizer/src/util -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/stl_wrappers -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D _GLIBCXX_ASSERTIONS -D DEBUG=1 -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nspr -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nss -D MOZILLA_CLIENT -D MOZILLA_CONFIG_H -D __STDC_FORMAT_MACROS -D _GNU_SOURCE -D HAVE_ENDIAN_H -D HAVE_PTHREAD -D HAVE_TIMESPEC_GET -D MOZ_INCLUDE_MOZALLOC_H -D mozilla_throw_gcc_h -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/x86_64-linux-gnu/c++/14 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/backward -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-error=pessimizing-move -Wno-error=large-by-value-copy=128 -Wno-error=implicit-int-float-conversion -Wno-error=thread-safety-analysis -Wno-error=tautological-type-limit-compare -Wno-invalid-offsetof -Wno-range-loop-analysis -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conversion -Wno-deprecated-this-capture -Wno-inline-new-delete -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-vla-cxx-extension -Wno-unknown-warning-option -fdeprecated-macro -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fno-rtti -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fno-sized-deallocation -fno-aligned-allocation -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2025-06-27-100320-3286336-1 -x c++ glsl-optimizer/src/compiler/glsl_types.cpp
1/*
2 * Copyright © 2010 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 */
23
24#ifndef GLSL_PARSER_EXTRAS_H
25#define GLSL_PARSER_EXTRAS_H
26
27/*
28 * Most of the definitions here only apply to C++
29 */
30#ifdef __cplusplus201703L
31
32
33#include <stdlib.h>
34#include "glsl_symbol_table.h"
35
36/* THIS is a macro defined somewhere deep in the Windows MSVC header files.
37 * Undefine it here to avoid collision with the lexer's THIS token.
38 */
39#undef THIS
40
41struct gl_context;
42
43struct glsl_switch_state {
44 /** Temporary variables needed for switch statement. */
45 ir_variable *test_var;
46 ir_variable *is_fallthru_var;
47 ir_variable *is_break_var;
48 class ast_switch_statement *switch_nesting_ast;
49
50 /** Used to set condition if 'default' label should be chosen. */
51 ir_variable *run_default;
52
53 /** Table of constant values already used in case labels */
54 struct hash_table *labels_ht;
55 class ast_case_label *previous_default;
56
57 bool is_switch_innermost; // if switch stmt is closest to break, ...
58};
59
60const char *
61glsl_compute_version_string(void *mem_ctx, bool is_es, unsigned version);
62
63typedef struct YYLTYPE {
64 int first_line;
65 int first_column;
66 int last_line;
67 int last_column;
68 unsigned source;
69 /* Path for ARB_shading_language_include include source */
70 char *path;
71} YYLTYPE;
72# define YYLTYPE_IS_DECLARED1 1
73# define YYLTYPE_IS_TRIVIAL1 1
74
75extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
76 const char *fmt, ...);
77
78
79struct _mesa_glsl_parse_state {
Excessive padding in 'struct _mesa_glsl_parse_state' (59 padding bytes, where 3 is optimal). Optimal fields order: ctx, scanner, symbols, linalloc, default_uniform_qualifier, default_shader_storage_qualifier, in_qualifier, out_qualifier, supported_version_string, current_function, toplevel_ir, loop_nesting_ast, user_structures, info_log, extensions, subroutine_types, subroutines, translation_unit, switch_state, num_supported_versions, language_version, forced_language_version, gl_version, stage, cs_derivative_group, num_user_structures, gs_input_size, fs_blend_support, tcs_output_size, num_subroutine_types, num_subroutines, clip_dist_size, cull_dist_size, cs_input_local_size, supported_versions, Const, atomic_counter_offsets, es_shader, compat_shader, had_version_string, zero_init, fs_redeclares_gl_fragcoord, fs_origin_upper_left, fs_pixel_center_integer, fs_redeclares_gl_fragcoord_with_no_layout_qualifiers, gs_input_prim_type_specified, tcs_output_vertices_specified, cs_input_local_size_specified, cs_input_local_size_variable_specified, bindless_sampler_specified, bindless_image_specified, bound_sampler_specified, bound_image_specified, found_return, found_begin_interlock, found_end_interlock, error, all_invariant, warnings_enabled, ARB_ES3_1_compatibility_enable, ARB_ES3_1_compatibility_warn, ARB_ES3_2_compatibility_enable, ARB_ES3_2_compatibility_warn, ARB_arrays_of_arrays_enable, ARB_arrays_of_arrays_warn, ARB_bindless_texture_enable, ARB_bindless_texture_warn, ARB_compatibility_enable, ARB_compatibility_warn, ARB_compute_shader_enable, ARB_compute_shader_warn, ARB_compute_variable_group_size_enable, ARB_compute_variable_group_size_warn, ARB_conservative_depth_enable, ARB_conservative_depth_warn, ARB_cull_distance_enable, ARB_cull_distance_warn, ARB_derivative_control_enable, ARB_derivative_control_warn, ARB_draw_buffers_enable, ARB_draw_buffers_warn, ARB_draw_instanced_enable, ARB_draw_instanced_warn, ARB_enhanced_layouts_enable, ARB_enhanced_layouts_warn, ARB_explicit_attrib_location_enable, ARB_explicit_attrib_location_warn, ARB_explicit_uniform_location_enable, ARB_explicit_uniform_location_warn, ARB_fragment_coord_conventions_enable, ARB_fragment_coord_conventions_warn, ARB_fragment_layer_viewport_enable, ARB_fragment_layer_viewport_warn, ARB_fragment_shader_interlock_enable, ARB_fragment_shader_interlock_warn, ARB_gpu_shader5_enable, ARB_gpu_shader5_warn, ARB_gpu_shader_fp64_enable, ARB_gpu_shader_fp64_warn, ARB_gpu_shader_int64_enable, ARB_gpu_shader_int64_warn, ARB_post_depth_coverage_enable, ARB_post_depth_coverage_warn, ARB_sample_shading_enable, ARB_sample_shading_warn, ARB_separate_shader_objects_enable, ARB_separate_shader_objects_warn, ARB_shader_atomic_counter_ops_enable, ARB_shader_atomic_counter_ops_warn, ARB_shader_atomic_counters_enable, ARB_shader_atomic_counters_warn, ARB_shader_ballot_enable, ARB_shader_ballot_warn, ARB_shader_bit_encoding_enable, ARB_shader_bit_encoding_warn, ARB_shader_clock_enable, ARB_shader_clock_warn, ARB_shader_draw_parameters_enable, ARB_shader_draw_parameters_warn, ARB_shader_group_vote_enable, ARB_shader_group_vote_warn, ARB_shader_image_load_store_enable, ARB_shader_image_load_store_warn, ARB_shader_image_size_enable, ARB_shader_image_size_warn, ARB_shader_precision_enable, ARB_shader_precision_warn, ARB_shader_stencil_export_enable, ARB_shader_stencil_export_warn, ARB_shader_storage_buffer_object_enable, ARB_shader_storage_buffer_object_warn, ARB_shader_subroutine_enable, ARB_shader_subroutine_warn, ARB_shader_texture_image_samples_enable, ARB_shader_texture_image_samples_warn, ARB_shader_texture_lod_enable, ARB_shader_texture_lod_warn, ARB_shader_viewport_layer_array_enable, ARB_shader_viewport_layer_array_warn, ARB_shading_language_420pack_enable, ARB_shading_language_420pack_warn, ARB_shading_language_include_enable, ARB_shading_language_include_warn, ARB_shading_language_packing_enable, ARB_shading_language_packing_warn, ARB_tessellation_shader_enable, ARB_tessellation_shader_warn, ARB_texture_cube_map_array_enable, ARB_texture_cube_map_array_warn, ARB_texture_gather_enable, ARB_texture_gather_warn, ARB_texture_multisample_enable, ARB_texture_multisample_warn, ARB_texture_query_levels_enable, ARB_texture_query_levels_warn, ARB_texture_query_lod_enable, ARB_texture_query_lod_warn, ARB_texture_rectangle_enable, ARB_texture_rectangle_warn, ARB_uniform_buffer_object_enable, ARB_uniform_buffer_object_warn, ARB_vertex_attrib_64bit_enable, ARB_vertex_attrib_64bit_warn, ARB_viewport_array_enable, ARB_viewport_array_warn, KHR_blend_equation_advanced_enable, KHR_blend_equation_advanced_warn, OES_EGL_image_external_enable, OES_EGL_image_external_warn, OES_EGL_image_external_essl3_enable, OES_EGL_image_external_essl3_warn, OES_geometry_point_size_enable, OES_geometry_point_size_warn, OES_geometry_shader_enable, OES_geometry_shader_warn, OES_gpu_shader5_enable, OES_gpu_shader5_warn, OES_primitive_bounding_box_enable, OES_primitive_bounding_box_warn, OES_sample_variables_enable, OES_sample_variables_warn, OES_shader_image_atomic_enable, OES_shader_image_atomic_warn, OES_shader_io_blocks_enable, OES_shader_io_blocks_warn, OES_shader_multisample_interpolation_enable, OES_shader_multisample_interpolation_warn, OES_standard_derivatives_enable, OES_standard_derivatives_warn, OES_tessellation_point_size_enable, OES_tessellation_point_size_warn, OES_tessellation_shader_enable, OES_tessellation_shader_warn, OES_texture_3D_enable, OES_texture_3D_warn, OES_texture_buffer_enable, OES_texture_buffer_warn, OES_texture_cube_map_array_enable, OES_texture_cube_map_array_warn, OES_texture_storage_multisample_2d_array_enable, OES_texture_storage_multisample_2d_array_warn, OES_viewport_array_enable, OES_viewport_array_warn, AMD_conservative_depth_enable, AMD_conservative_depth_warn, AMD_gpu_shader_int64_enable, AMD_gpu_shader_int64_warn, AMD_shader_stencil_export_enable, AMD_shader_stencil_export_warn, AMD_shader_trinary_minmax_enable, AMD_shader_trinary_minmax_warn, AMD_texture_texture4_enable, AMD_texture_texture4_warn, AMD_vertex_shader_layer_enable, AMD_vertex_shader_layer_warn, AMD_vertex_shader_viewport_index_enable, AMD_vertex_shader_viewport_index_warn, ANDROID_extension_pack_es31a_enable, ANDROID_extension_pack_es31a_warn, EXT_blend_func_extended_enable, EXT_blend_func_extended_warn, EXT_clip_cull_distance_enable, EXT_clip_cull_distance_warn, EXT_demote_to_helper_invocation_enable, EXT_demote_to_helper_invocation_warn, EXT_draw_buffers_enable, EXT_draw_buffers_warn, EXT_draw_instanced_enable, EXT_draw_instanced_warn, EXT_frag_depth_enable, EXT_frag_depth_warn, EXT_geometry_point_size_enable, EXT_geometry_point_size_warn, EXT_geometry_shader_enable, EXT_geometry_shader_warn, EXT_gpu_shader4_enable, EXT_gpu_shader4_warn, EXT_gpu_shader5_enable, EXT_gpu_shader5_warn, EXT_primitive_bounding_box_enable, EXT_primitive_bounding_box_warn, EXT_separate_shader_objects_enable, EXT_separate_shader_objects_warn, EXT_shader_framebuffer_fetch_enable, EXT_shader_framebuffer_fetch_warn, EXT_shader_framebuffer_fetch_non_coherent_enable, EXT_shader_framebuffer_fetch_non_coherent_warn, EXT_shader_image_load_formatted_enable, EXT_shader_image_load_formatted_warn, EXT_shader_image_load_store_enable, EXT_shader_image_load_store_warn, EXT_shader_implicit_conversions_enable, EXT_shader_implicit_conversions_warn, EXT_shader_integer_mix_enable, EXT_shader_integer_mix_warn, EXT_shader_io_blocks_enable, EXT_shader_io_blocks_warn, EXT_shader_samples_identical_enable, EXT_shader_samples_identical_warn, EXT_tessellation_point_size_enable, EXT_tessellation_point_size_warn, EXT_tessellation_shader_enable, EXT_tessellation_shader_warn, EXT_texture_array_enable, EXT_texture_array_warn, EXT_texture_buffer_enable, EXT_texture_buffer_warn, EXT_texture_cube_map_array_enable, EXT_texture_cube_map_array_warn, EXT_texture_query_lod_enable, EXT_texture_query_lod_warn, EXT_texture_shadow_lod_enable, EXT_texture_shadow_lod_warn, INTEL_conservative_rasterization_enable, INTEL_conservative_rasterization_warn, INTEL_shader_atomic_float_minmax_enable, INTEL_shader_atomic_float_minmax_warn, INTEL_shader_integer_functions2_enable, INTEL_shader_integer_functions2_warn, MESA_shader_integer_functions_enable, MESA_shader_integer_functions_warn, NV_compute_shader_derivatives_enable, NV_compute_shader_derivatives_warn, NV_fragment_shader_interlock_enable, NV_fragment_shader_interlock_warn, NV_image_formats_enable, NV_image_formats_warn, NV_shader_atomic_float_enable, NV_shader_atomic_float_warn, NV_viewport_array2_enable, NV_viewport_array2_warn, uses_builtin_functions, fs_uses_gl_fragcoord, fs_early_fragment_tests, fs_inner_coverage, fs_post_depth_coverage, fs_pixel_interlock_ordered, fs_pixel_interlock_unordered, fs_sample_interlock_ordered, fs_sample_interlock_unordered, redeclares_gl_layer, layer_viewport_relative, allow_extension_directive_midshader, allow_builtin_variable_redeclaration, allow_layout_qualifier_on_function_parameter, is_field, consider reordering the fields or adding explicit padding members
80 _mesa_glsl_parse_state(struct gl_context *_ctx, gl_shader_stage stage,
81 void *mem_ctx);
82
83 DECLARE_RZALLOC_CXX_OPERATORS(_mesa_glsl_parse_state)private: static void _ralloc_destructor(void *p) { reinterpret_cast
<_mesa_glsl_parse_state *>(p)->_mesa_glsl_parse_state
::~_mesa_glsl_parse_state(); } public: static void* operator new
(size_t size, void *mem_ctx) { void *p = rzalloc_size(mem_ctx
, size); (static_cast <bool> (p != __null) ? void (0) :
__assert_fail ("p != NULL", __builtin_FILE (), __builtin_LINE
(), __extension__ __PRETTY_FUNCTION__)); if (!__has_trivial_destructor
(_mesa_glsl_parse_state)) ralloc_set_destructor(p, _ralloc_destructor
); return p; } static void operator delete(void *p) { if (!__has_trivial_destructor
(_mesa_glsl_parse_state)) ralloc_set_destructor(p, __null); ralloc_free
(p); }
;
84
85 /**
86 * Generate a string representing the GLSL version currently being compiled
87 * (useful for error messages).
88 */
89 const char *get_version_string()
90 {
91 return glsl_compute_version_string(this, this->es_shader,
92 this->language_version);
93 }
94
95 /**
96 * Determine whether the current GLSL version is sufficiently high to
97 * support a certain feature.
98 *
99 * \param required_glsl_version is the desktop GLSL version that is
100 * required to support the feature, or 0 if no version of desktop GLSL
101 * supports the feature.
102 *
103 * \param required_glsl_es_version is the GLSL ES version that is required
104 * to support the feature, or 0 if no version of GLSL ES supports the
105 * feature.
106 */
107 bool is_version(unsigned required_glsl_version,
108 unsigned required_glsl_es_version) const
109 {
110 unsigned required_version = this->es_shader ?
111 required_glsl_es_version : required_glsl_version;
112 unsigned this_version = this->forced_language_version
113 ? this->forced_language_version : this->language_version;
114 return required_version != 0
115 && this_version >= required_version;
116 }
117
118 bool check_version(unsigned required_glsl_version,
119 unsigned required_glsl_es_version,
120 YYLTYPE *locp, const char *fmt, ...) PRINTFLIKE(5, 6);
121
122 bool check_arrays_of_arrays_allowed(YYLTYPE *locp)
123 {
124 if (!(ARB_arrays_of_arrays_enable || is_version(430, 310))) {
125 const char *const requirement = this->es_shader
126 ? "GLSL ES 3.10"
127 : "GL_ARB_arrays_of_arrays or GLSL 4.30";
128 _mesa_glsl_error(locp, this,
129 "%s required for defining arrays of arrays.",
130 requirement);
131 return false;
132 }
133 return true;
134 }
135
136 bool check_precision_qualifiers_allowed(YYLTYPE *locp)
137 {
138 return check_version(130, 100, locp,
139 "precision qualifiers are forbidden");
140 }
141
142 bool check_bitwise_operations_allowed(YYLTYPE *locp)
143 {
144 return EXT_gpu_shader4_enable ||
145 check_version(130, 300, locp, "bit-wise operations are forbidden");
146 }
147
148 bool check_explicit_attrib_stream_allowed(YYLTYPE *locp)
149 {
150 if (!this->has_explicit_attrib_stream()) {
151 const char *const requirement = "GL_ARB_gpu_shader5 extension or GLSL 4.00";
152
153 _mesa_glsl_error(locp, this, "explicit stream requires %s",
154 requirement);
155 return false;
156 }
157
158 return true;
159 }
160
161 bool check_explicit_attrib_location_allowed(YYLTYPE *locp,
162 const ir_variable *var)
163 {
164 if (!this->has_explicit_attrib_location()) {
165 const char *const requirement = this->es_shader
166 ? "GLSL ES 3.00"
167 : "GL_ARB_explicit_attrib_location extension or GLSL 3.30";
168
169 _mesa_glsl_error(locp, this, "%s explicit location requires %s",
170 mode_string(var), requirement);
171 return false;
172 }
173
174 return true;
175 }
176
177 bool check_separate_shader_objects_allowed(YYLTYPE *locp,
178 const ir_variable *var)
179 {
180 if (!this->has_separate_shader_objects()) {
181 const char *const requirement = this->es_shader
182 ? "GL_EXT_separate_shader_objects extension or GLSL ES 3.10"
183 : "GL_ARB_separate_shader_objects extension or GLSL 4.20";
184
185 _mesa_glsl_error(locp, this, "%s explicit location requires %s",
186 mode_string(var), requirement);
187 return false;
188 }
189
190 return true;
191 }
192
193 bool check_explicit_uniform_location_allowed(YYLTYPE *locp,
194 const ir_variable *)
195 {
196 if (!this->has_explicit_attrib_location() ||
197 !this->has_explicit_uniform_location()) {
198 const char *const requirement = this->es_shader
199 ? "GLSL ES 3.10"
200 : "GL_ARB_explicit_uniform_location and either "
201 "GL_ARB_explicit_attrib_location or GLSL 3.30.";
202
203 _mesa_glsl_error(locp, this,
204 "uniform explicit location requires %s",
205 requirement);
206 return false;
207 }
208
209 return true;
210 }
211
212 bool has_atomic_counters() const
213 {
214 return ARB_shader_atomic_counters_enable || is_version(420, 310);
215 }
216
217 bool has_enhanced_layouts() const
218 {
219 return ARB_enhanced_layouts_enable || is_version(440, 0);
220 }
221
222 bool has_explicit_attrib_stream() const
223 {
224 return ARB_gpu_shader5_enable || is_version(400, 0);
225 }
226
227 bool has_explicit_attrib_location() const
228 {
229 return ARB_explicit_attrib_location_enable || is_version(330, 300);
230 }
231
232 bool has_explicit_uniform_location() const
233 {
234 return ARB_explicit_uniform_location_enable || is_version(430, 310);
235 }
236
237 bool has_uniform_buffer_objects() const
238 {
239 return ARB_uniform_buffer_object_enable || is_version(140, 300);
240 }
241
242 bool has_shader_storage_buffer_objects() const
243 {
244 return ARB_shader_storage_buffer_object_enable || is_version(430, 310);
245 }
246
247 bool has_separate_shader_objects() const
248 {
249 return ARB_separate_shader_objects_enable || is_version(410, 310)
250 || EXT_separate_shader_objects_enable;
251 }
252
253 bool has_double() const
254 {
255 return ARB_gpu_shader_fp64_enable || is_version(400, 0);
256 }
257
258 bool has_int64() const
259 {
260 return ARB_gpu_shader_int64_enable ||
261 AMD_gpu_shader_int64_enable;
262 }
263
264 bool has_420pack() const
265 {
266 return ARB_shading_language_420pack_enable || is_version(420, 0);
267 }
268
269 bool has_420pack_or_es31() const
270 {
271 return ARB_shading_language_420pack_enable || is_version(420, 310);
272 }
273
274 bool has_compute_shader() const
275 {
276 return ARB_compute_shader_enable || is_version(430, 310);
277 }
278
279 bool has_shader_io_blocks() const
280 {
281 /* The OES_geometry_shader_specification says:
282 *
283 * "If the OES_geometry_shader extension is enabled, the
284 * OES_shader_io_blocks extension is also implicitly enabled."
285 *
286 * The OES_tessellation_shader extension has similar wording.
287 */
288 return OES_shader_io_blocks_enable ||
289 EXT_shader_io_blocks_enable ||
290 OES_geometry_shader_enable ||
291 EXT_geometry_shader_enable ||
292 OES_tessellation_shader_enable ||
293 EXT_tessellation_shader_enable ||
294
295 is_version(150, 320);
296 }
297
298 bool has_geometry_shader() const
299 {
300 return OES_geometry_shader_enable || EXT_geometry_shader_enable ||
301 is_version(150, 320);
302 }
303
304 bool has_tessellation_shader() const
305 {
306 return ARB_tessellation_shader_enable ||
307 OES_tessellation_shader_enable ||
308 EXT_tessellation_shader_enable ||
309 is_version(400, 320);
310 }
311
312 bool has_clip_distance() const
313 {
314 return EXT_clip_cull_distance_enable || is_version(130, 0);
315 }
316
317 bool has_cull_distance() const
318 {
319 return EXT_clip_cull_distance_enable ||
320 ARB_cull_distance_enable ||
321 is_version(450, 0);
322 }
323
324 bool has_framebuffer_fetch() const
325 {
326 return EXT_shader_framebuffer_fetch_enable ||
327 EXT_shader_framebuffer_fetch_non_coherent_enable;
328 }
329
330 bool has_texture_cube_map_array() const
331 {
332 return ARB_texture_cube_map_array_enable ||
333 EXT_texture_cube_map_array_enable ||
334 OES_texture_cube_map_array_enable ||
335 is_version(400, 320);
336 }
337
338 bool has_shader_image_load_store() const
339 {
340 return ARB_shader_image_load_store_enable ||
341 EXT_shader_image_load_store_enable ||
342 is_version(420, 310);
343 }
344
345 bool has_bindless() const
346 {
347 return ARB_bindless_texture_enable;
348 }
349
350 bool has_image_load_formatted() const
351 {
352 return EXT_shader_image_load_formatted_enable;
353 }
354
355 bool has_implicit_conversions() const
356 {
357 return EXT_shader_implicit_conversions_enable || is_version(120, 0);
358 }
359
360 bool has_implicit_uint_to_int_conversion() const
361 {
362 return ARB_gpu_shader5_enable ||
363 MESA_shader_integer_functions_enable ||
364 EXT_shader_implicit_conversions_enable ||
365 is_version(400, 0);
366 }
367
368 void process_version_directive(YYLTYPE *locp, int version,
369 const char *ident);
370
371 struct gl_context *const ctx;
372 void *scanner;
373 exec_list translation_unit;
374 glsl_symbol_table *symbols;
375
376 void *linalloc;
377
378 unsigned num_supported_versions;
379 struct {
380 unsigned ver;
381 uint8_t gl_ver;
382 bool es;
383 } supported_versions[17];
384
385 bool es_shader;
386 bool compat_shader;
387 unsigned language_version;
388 unsigned forced_language_version;
389 bool had_version_string;
390 bool zero_init;
391 unsigned gl_version;
392 gl_shader_stage stage;
393
394 /**
395 * Default uniform layout qualifiers tracked during parsing.
396 * Currently affects uniform blocks and uniform buffer variables in
397 * those blocks.
398 */
399 struct ast_type_qualifier *default_uniform_qualifier;
400
401 /**
402 * Default shader storage layout qualifiers tracked during parsing.
403 * Currently affects shader storage blocks and shader storage buffer
404 * variables in those blocks.
405 */
406 struct ast_type_qualifier *default_shader_storage_qualifier;
407
408 /**
409 * Variables to track different cases if a fragment shader redeclares
410 * built-in variable gl_FragCoord.
411 *
412 * Note: These values are computed at ast_to_hir time rather than at parse
413 * time.
414 */
415 bool fs_redeclares_gl_fragcoord;
416 bool fs_origin_upper_left;
417 bool fs_pixel_center_integer;
418 bool fs_redeclares_gl_fragcoord_with_no_layout_qualifiers;
419
420 /**
421 * True if a geometry shader input primitive type or tessellation control
422 * output vertices were specified using a layout directive.
423 *
424 * Note: these values are computed at ast_to_hir time rather than at parse
425 * time.
426 */
427 bool gs_input_prim_type_specified;
428 bool tcs_output_vertices_specified;
429
430 /**
431 * Input layout qualifiers from GLSL 1.50 (geometry shader controls),
432 * and GLSL 4.00 (tessellation evaluation shader)
433 */
434 struct ast_type_qualifier *in_qualifier;
435
436 /**
437 * True if a compute shader input local size was specified using a layout
438 * directive.
439 *
440 * Note: this value is computed at ast_to_hir time rather than at parse
441 * time.
442 */
443 bool cs_input_local_size_specified;
444
445 /**
446 * If cs_input_local_size_specified is true, the local size that was
447 * specified. Otherwise ignored.
448 */
449 unsigned cs_input_local_size[3];
450
451 /**
452 * True if a compute shader input local variable size was specified using
453 * a layout directive as specified by ARB_compute_variable_group_size.
454 */
455 bool cs_input_local_size_variable_specified;
456
457 /**
458 * Arrangement of invocations used to calculate derivatives in a compute
459 * shader. From NV_compute_shader_derivatives.
460 */
461 enum gl_derivative_group cs_derivative_group;
462
463 /**
464 * True if a shader declare bindless_sampler/bindless_image, and
465 * respectively bound_sampler/bound_image at global scope as specified by
466 * ARB_bindless_texture.
467 */
468 bool bindless_sampler_specified;
469 bool bindless_image_specified;
470 bool bound_sampler_specified;
471 bool bound_image_specified;
472
473 /**
474 * Output layout qualifiers from GLSL 1.50 (geometry shader controls),
475 * and GLSL 4.00 (tessellation control shader).
476 */
477 struct ast_type_qualifier *out_qualifier;
478
479 /**
480 * Printable list of GLSL versions supported by the current context
481 *
482 * \note
483 * This string should probably be generated per-context instead of per
484 * invokation of the compiler. This should be changed when the method of
485 * tracking supported GLSL versions changes.
486 */
487 const char *supported_version_string;
488
489 /**
490 * Implementation defined limits that affect built-in variables, etc.
491 *
492 * \sa struct gl_constants (in mtypes.h)
493 */
494 struct {
495 /* 1.10 */
496 unsigned MaxLights;
497 unsigned MaxClipPlanes;
498 unsigned MaxTextureUnits;
499 unsigned MaxTextureCoords;
500 unsigned MaxVertexAttribs;
501 unsigned MaxVertexUniformComponents;
502 unsigned MaxVertexTextureImageUnits;
503 unsigned MaxCombinedTextureImageUnits;
504 unsigned MaxTextureImageUnits;
505 unsigned MaxFragmentUniformComponents;
506
507 /* ARB_draw_buffers */
508 unsigned MaxDrawBuffers;
509
510 /* ARB_enhanced_layouts */
511 unsigned MaxTransformFeedbackBuffers;
512 unsigned MaxTransformFeedbackInterleavedComponents;
513
514 /* ARB_blend_func_extended */
515 unsigned MaxDualSourceDrawBuffers;
516
517 /* 3.00 ES */
518 int MinProgramTexelOffset;
519 int MaxProgramTexelOffset;
520
521 /* 1.50 */
522 unsigned MaxVertexOutputComponents;
523 unsigned MaxGeometryInputComponents;
524 unsigned MaxGeometryOutputComponents;
525 unsigned MaxGeometryShaderInvocations;
526 unsigned MaxFragmentInputComponents;
527 unsigned MaxGeometryTextureImageUnits;
528 unsigned MaxGeometryOutputVertices;
529 unsigned MaxGeometryTotalOutputComponents;
530 unsigned MaxGeometryUniformComponents;
531
532 /* ARB_shader_atomic_counters */
533 unsigned MaxVertexAtomicCounters;
534 unsigned MaxTessControlAtomicCounters;
535 unsigned MaxTessEvaluationAtomicCounters;
536 unsigned MaxGeometryAtomicCounters;
537 unsigned MaxFragmentAtomicCounters;
538 unsigned MaxCombinedAtomicCounters;
539 unsigned MaxAtomicBufferBindings;
540
541 /* These are also atomic counter related, but they weren't added to
542 * until atomic counters were added to core in GLSL 4.20 and GLSL ES
543 * 3.10.
544 */
545 unsigned MaxVertexAtomicCounterBuffers;
546 unsigned MaxTessControlAtomicCounterBuffers;
547 unsigned MaxTessEvaluationAtomicCounterBuffers;
548 unsigned MaxGeometryAtomicCounterBuffers;
549 unsigned MaxFragmentAtomicCounterBuffers;
550 unsigned MaxCombinedAtomicCounterBuffers;
551 unsigned MaxAtomicCounterBufferSize;
552
553 /* ARB_compute_shader */
554 unsigned MaxComputeAtomicCounterBuffers;
555 unsigned MaxComputeAtomicCounters;
556 unsigned MaxComputeImageUniforms;
557 unsigned MaxComputeTextureImageUnits;
558 unsigned MaxComputeUniformComponents;
559 unsigned MaxComputeWorkGroupCount[3];
560 unsigned MaxComputeWorkGroupSize[3];
561
562 /* ARB_shader_image_load_store */
563 unsigned MaxImageUnits;
564 unsigned MaxCombinedShaderOutputResources;
565 unsigned MaxImageSamples;
566 unsigned MaxVertexImageUniforms;
567 unsigned MaxTessControlImageUniforms;
568 unsigned MaxTessEvaluationImageUniforms;
569 unsigned MaxGeometryImageUniforms;
570 unsigned MaxFragmentImageUniforms;
571 unsigned MaxCombinedImageUniforms;
572
573 /* ARB_viewport_array */
574 unsigned MaxViewports;
575
576 /* ARB_tessellation_shader */
577 unsigned MaxPatchVertices;
578 unsigned MaxTessGenLevel;
579 unsigned MaxTessControlInputComponents;
580 unsigned MaxTessControlOutputComponents;
581 unsigned MaxTessControlTextureImageUnits;
582 unsigned MaxTessEvaluationInputComponents;
583 unsigned MaxTessEvaluationOutputComponents;
584 unsigned MaxTessEvaluationTextureImageUnits;
585 unsigned MaxTessPatchComponents;
586 unsigned MaxTessControlTotalOutputComponents;
587 unsigned MaxTessControlUniformComponents;
588 unsigned MaxTessEvaluationUniformComponents;
589
590 /* GL 4.5 / OES_sample_variables */
591 unsigned MaxSamples;
592 } Const;
593
594 /**
595 * During AST to IR conversion, pointer to current IR function
596 *
597 * Will be \c NULL whenever the AST to IR conversion is not inside a
598 * function definition.
599 */
600 class ir_function_signature *current_function;
601
602 /**
603 * During AST to IR conversion, pointer to the toplevel IR
604 * instruction list being generated.
605 */
606 exec_list *toplevel_ir;
607
608 /** Have we found a return statement in this function? */
609 bool found_return;
610
611 /** Have we found the interlock builtins in this function? */
612 bool found_begin_interlock;
613 bool found_end_interlock;
614
615 /** Was there an error during compilation? */
616 bool error;
617
618 /**
619 * Are all shader inputs / outputs invariant?
620 *
621 * This is set when the 'STDGL invariant(all)' pragma is used.
622 */
623 bool all_invariant;
624
625 /** Loop or switch statement containing the current instructions. */
626 class ast_iteration_statement *loop_nesting_ast;
627
628 struct glsl_switch_state switch_state;
629
630 /** List of structures defined in user code. */
631 const glsl_type **user_structures;
632 unsigned num_user_structures;
633
634 char *info_log;
635
636 /**
637 * Are warnings enabled?
638 *
639 * Emission of warngins is controlled by '#pragma warning(...)'.
640 */
641 bool warnings_enabled;
642
643 /**
644 * \name Enable bits for GLSL extensions
645 */
646 /*@{*/
647 /* ARB extensions go here, sorted alphabetically.
648 */
649 bool ARB_ES3_1_compatibility_enable;
650 bool ARB_ES3_1_compatibility_warn;
651 bool ARB_ES3_2_compatibility_enable;
652 bool ARB_ES3_2_compatibility_warn;
653 bool ARB_arrays_of_arrays_enable;
654 bool ARB_arrays_of_arrays_warn;
655 bool ARB_bindless_texture_enable;
656 bool ARB_bindless_texture_warn;
657 bool ARB_compatibility_enable;
658 bool ARB_compatibility_warn;
659 bool ARB_compute_shader_enable;
660 bool ARB_compute_shader_warn;
661 bool ARB_compute_variable_group_size_enable;
662 bool ARB_compute_variable_group_size_warn;
663 bool ARB_conservative_depth_enable;
664 bool ARB_conservative_depth_warn;
665 bool ARB_cull_distance_enable;
666 bool ARB_cull_distance_warn;
667 bool ARB_derivative_control_enable;
668 bool ARB_derivative_control_warn;
669 bool ARB_draw_buffers_enable;
670 bool ARB_draw_buffers_warn;
671 bool ARB_draw_instanced_enable;
672 bool ARB_draw_instanced_warn;
673 bool ARB_enhanced_layouts_enable;
674 bool ARB_enhanced_layouts_warn;
675 bool ARB_explicit_attrib_location_enable;
676 bool ARB_explicit_attrib_location_warn;
677 bool ARB_explicit_uniform_location_enable;
678 bool ARB_explicit_uniform_location_warn;
679 bool ARB_fragment_coord_conventions_enable;
680 bool ARB_fragment_coord_conventions_warn;
681 bool ARB_fragment_layer_viewport_enable;
682 bool ARB_fragment_layer_viewport_warn;
683 bool ARB_fragment_shader_interlock_enable;
684 bool ARB_fragment_shader_interlock_warn;
685 bool ARB_gpu_shader5_enable;
686 bool ARB_gpu_shader5_warn;
687 bool ARB_gpu_shader_fp64_enable;
688 bool ARB_gpu_shader_fp64_warn;
689 bool ARB_gpu_shader_int64_enable;
690 bool ARB_gpu_shader_int64_warn;
691 bool ARB_post_depth_coverage_enable;
692 bool ARB_post_depth_coverage_warn;
693 bool ARB_sample_shading_enable;
694 bool ARB_sample_shading_warn;
695 bool ARB_separate_shader_objects_enable;
696 bool ARB_separate_shader_objects_warn;
697 bool ARB_shader_atomic_counter_ops_enable;
698 bool ARB_shader_atomic_counter_ops_warn;
699 bool ARB_shader_atomic_counters_enable;
700 bool ARB_shader_atomic_counters_warn;
701 bool ARB_shader_ballot_enable;
702 bool ARB_shader_ballot_warn;
703 bool ARB_shader_bit_encoding_enable;
704 bool ARB_shader_bit_encoding_warn;
705 bool ARB_shader_clock_enable;
706 bool ARB_shader_clock_warn;
707 bool ARB_shader_draw_parameters_enable;
708 bool ARB_shader_draw_parameters_warn;
709 bool ARB_shader_group_vote_enable;
710 bool ARB_shader_group_vote_warn;
711 bool ARB_shader_image_load_store_enable;
712 bool ARB_shader_image_load_store_warn;
713 bool ARB_shader_image_size_enable;
714 bool ARB_shader_image_size_warn;
715 bool ARB_shader_precision_enable;
716 bool ARB_shader_precision_warn;
717 bool ARB_shader_stencil_export_enable;
718 bool ARB_shader_stencil_export_warn;
719 bool ARB_shader_storage_buffer_object_enable;
720 bool ARB_shader_storage_buffer_object_warn;
721 bool ARB_shader_subroutine_enable;
722 bool ARB_shader_subroutine_warn;
723 bool ARB_shader_texture_image_samples_enable;
724 bool ARB_shader_texture_image_samples_warn;
725 bool ARB_shader_texture_lod_enable;
726 bool ARB_shader_texture_lod_warn;
727 bool ARB_shader_viewport_layer_array_enable;
728 bool ARB_shader_viewport_layer_array_warn;
729 bool ARB_shading_language_420pack_enable;
730 bool ARB_shading_language_420pack_warn;
731 bool ARB_shading_language_include_enable;
732 bool ARB_shading_language_include_warn;
733 bool ARB_shading_language_packing_enable;
734 bool ARB_shading_language_packing_warn;
735 bool ARB_tessellation_shader_enable;
736 bool ARB_tessellation_shader_warn;
737 bool ARB_texture_cube_map_array_enable;
738 bool ARB_texture_cube_map_array_warn;
739 bool ARB_texture_gather_enable;
740 bool ARB_texture_gather_warn;
741 bool ARB_texture_multisample_enable;
742 bool ARB_texture_multisample_warn;
743 bool ARB_texture_query_levels_enable;
744 bool ARB_texture_query_levels_warn;
745 bool ARB_texture_query_lod_enable;
746 bool ARB_texture_query_lod_warn;
747 bool ARB_texture_rectangle_enable;
748 bool ARB_texture_rectangle_warn;
749 bool ARB_uniform_buffer_object_enable;
750 bool ARB_uniform_buffer_object_warn;
751 bool ARB_vertex_attrib_64bit_enable;
752 bool ARB_vertex_attrib_64bit_warn;
753 bool ARB_viewport_array_enable;
754 bool ARB_viewport_array_warn;
755
756 /* KHR extensions go here, sorted alphabetically.
757 */
758 bool KHR_blend_equation_advanced_enable;
759 bool KHR_blend_equation_advanced_warn;
760
761 /* OES extensions go here, sorted alphabetically.
762 */
763 bool OES_EGL_image_external_enable;
764 bool OES_EGL_image_external_warn;
765 bool OES_EGL_image_external_essl3_enable;
766 bool OES_EGL_image_external_essl3_warn;
767 bool OES_geometry_point_size_enable;
768 bool OES_geometry_point_size_warn;
769 bool OES_geometry_shader_enable;
770 bool OES_geometry_shader_warn;
771 bool OES_gpu_shader5_enable;
772 bool OES_gpu_shader5_warn;
773 bool OES_primitive_bounding_box_enable;
774 bool OES_primitive_bounding_box_warn;
775 bool OES_sample_variables_enable;
776 bool OES_sample_variables_warn;
777 bool OES_shader_image_atomic_enable;
778 bool OES_shader_image_atomic_warn;
779 bool OES_shader_io_blocks_enable;
780 bool OES_shader_io_blocks_warn;
781 bool OES_shader_multisample_interpolation_enable;
782 bool OES_shader_multisample_interpolation_warn;
783 bool OES_standard_derivatives_enable;
784 bool OES_standard_derivatives_warn;
785 bool OES_tessellation_point_size_enable;
786 bool OES_tessellation_point_size_warn;
787 bool OES_tessellation_shader_enable;
788 bool OES_tessellation_shader_warn;
789 bool OES_texture_3D_enable;
790 bool OES_texture_3D_warn;
791 bool OES_texture_buffer_enable;
792 bool OES_texture_buffer_warn;
793 bool OES_texture_cube_map_array_enable;
794 bool OES_texture_cube_map_array_warn;
795 bool OES_texture_storage_multisample_2d_array_enable;
796 bool OES_texture_storage_multisample_2d_array_warn;
797 bool OES_viewport_array_enable;
798 bool OES_viewport_array_warn;
799
800 /* All other extensions go here, sorted alphabetically.
801 */
802 bool AMD_conservative_depth_enable;
803 bool AMD_conservative_depth_warn;
804 bool AMD_gpu_shader_int64_enable;
805 bool AMD_gpu_shader_int64_warn;
806 bool AMD_shader_stencil_export_enable;
807 bool AMD_shader_stencil_export_warn;
808 bool AMD_shader_trinary_minmax_enable;
809 bool AMD_shader_trinary_minmax_warn;
810 bool AMD_texture_texture4_enable;
811 bool AMD_texture_texture4_warn;
812 bool AMD_vertex_shader_layer_enable;
813 bool AMD_vertex_shader_layer_warn;
814 bool AMD_vertex_shader_viewport_index_enable;
815 bool AMD_vertex_shader_viewport_index_warn;
816 bool ANDROID_extension_pack_es31a_enable;
817 bool ANDROID_extension_pack_es31a_warn;
818 bool EXT_blend_func_extended_enable;
819 bool EXT_blend_func_extended_warn;
820 bool EXT_clip_cull_distance_enable;
821 bool EXT_clip_cull_distance_warn;
822 bool EXT_demote_to_helper_invocation_enable;
823 bool EXT_demote_to_helper_invocation_warn;
824 bool EXT_draw_buffers_enable;
825 bool EXT_draw_buffers_warn;
826 bool EXT_draw_instanced_enable;
827 bool EXT_draw_instanced_warn;
828 bool EXT_frag_depth_enable;
829 bool EXT_frag_depth_warn;
830 bool EXT_geometry_point_size_enable;
831 bool EXT_geometry_point_size_warn;
832 bool EXT_geometry_shader_enable;
833 bool EXT_geometry_shader_warn;
834 bool EXT_gpu_shader4_enable;
835 bool EXT_gpu_shader4_warn;
836 bool EXT_gpu_shader5_enable;
837 bool EXT_gpu_shader5_warn;
838 bool EXT_primitive_bounding_box_enable;
839 bool EXT_primitive_bounding_box_warn;
840 bool EXT_separate_shader_objects_enable;
841 bool EXT_separate_shader_objects_warn;
842 bool EXT_shader_framebuffer_fetch_enable;
843 bool EXT_shader_framebuffer_fetch_warn;
844 bool EXT_shader_framebuffer_fetch_non_coherent_enable;
845 bool EXT_shader_framebuffer_fetch_non_coherent_warn;
846 bool EXT_shader_image_load_formatted_enable;
847 bool EXT_shader_image_load_formatted_warn;
848 bool EXT_shader_image_load_store_enable;
849 bool EXT_shader_image_load_store_warn;
850 bool EXT_shader_implicit_conversions_enable;
851 bool EXT_shader_implicit_conversions_warn;
852 bool EXT_shader_integer_mix_enable;
853 bool EXT_shader_integer_mix_warn;
854 bool EXT_shader_io_blocks_enable;
855 bool EXT_shader_io_blocks_warn;
856 bool EXT_shader_samples_identical_enable;
857 bool EXT_shader_samples_identical_warn;
858 bool EXT_tessellation_point_size_enable;
859 bool EXT_tessellation_point_size_warn;
860 bool EXT_tessellation_shader_enable;
861 bool EXT_tessellation_shader_warn;
862 bool EXT_texture_array_enable;
863 bool EXT_texture_array_warn;
864 bool EXT_texture_buffer_enable;
865 bool EXT_texture_buffer_warn;
866 bool EXT_texture_cube_map_array_enable;
867 bool EXT_texture_cube_map_array_warn;
868 bool EXT_texture_query_lod_enable;
869 bool EXT_texture_query_lod_warn;
870 bool EXT_texture_shadow_lod_enable;
871 bool EXT_texture_shadow_lod_warn;
872 bool INTEL_conservative_rasterization_enable;
873 bool INTEL_conservative_rasterization_warn;
874 bool INTEL_shader_atomic_float_minmax_enable;
875 bool INTEL_shader_atomic_float_minmax_warn;
876 bool INTEL_shader_integer_functions2_enable;
877 bool INTEL_shader_integer_functions2_warn;
878 bool MESA_shader_integer_functions_enable;
879 bool MESA_shader_integer_functions_warn;
880 bool NV_compute_shader_derivatives_enable;
881 bool NV_compute_shader_derivatives_warn;
882 bool NV_fragment_shader_interlock_enable;
883 bool NV_fragment_shader_interlock_warn;
884 bool NV_image_formats_enable;
885 bool NV_image_formats_warn;
886 bool NV_shader_atomic_float_enable;
887 bool NV_shader_atomic_float_warn;
888 bool NV_viewport_array2_enable;
889 bool NV_viewport_array2_warn;
890 /*@}*/
891
892 /** Extensions supported by the OpenGL implementation. */
893 const struct gl_extensions *extensions;
894
895 bool uses_builtin_functions;
896 bool fs_uses_gl_fragcoord;
897
898 /**
899 * For geometry shaders, size of the most recently seen input declaration
900 * that was a sized array, or 0 if no sized input array declarations have
901 * been seen.
902 *
903 * Unused for other shader types.
904 */
905 unsigned gs_input_size;
906
907 bool fs_early_fragment_tests;
908
909 bool fs_inner_coverage;
910
911 bool fs_post_depth_coverage;
912
913 bool fs_pixel_interlock_ordered;
914 bool fs_pixel_interlock_unordered;
915 bool fs_sample_interlock_ordered;
916 bool fs_sample_interlock_unordered;
917
918 unsigned fs_blend_support;
919
920 /**
921 * For tessellation control shaders, size of the most recently seen output
922 * declaration that was a sized array, or 0 if no sized output array
923 * declarations have been seen.
924 *
925 * Unused for other shader types.
926 */
927 unsigned tcs_output_size;
928
929 /** Atomic counter offsets by binding */
930 unsigned atomic_counter_offsets[MAX_COMBINED_ATOMIC_BUFFERS(15 * 6)];
931
932 /** Whether gl_Layer output is viewport-relative. */
933 bool redeclares_gl_layer;
934 bool layer_viewport_relative;
935
936 bool allow_extension_directive_midshader;
937 bool allow_builtin_variable_redeclaration;
938 bool allow_layout_qualifier_on_function_parameter;
939
940 /**
941 * Known subroutine type declarations.
942 */
943 int num_subroutine_types;
944 ir_function **subroutine_types;
945
946 /**
947 * Functions that are associated with
948 * subroutine types.
949 */
950 int num_subroutines;
951 ir_function **subroutines;
952
953 /**
954 * field selection temporary parser storage -
955 * did the parser just parse a dot.
956 */
957 bool is_field;
958
959 /**
960 * seen values for clip/cull distance sizes
961 * so we can check totals aren't too large.
962 */
963 unsigned clip_dist_size, cull_dist_size;
964};
965
966# define YYLLOC_DEFAULT(Current, Rhs, N)do { if (N) { (Current).first_line = YYRHSLOC(Rhs, 1).first_line
; (Current).first_column = YYRHSLOC(Rhs, 1).first_column; (Current
).last_line = YYRHSLOC(Rhs, N).last_line; (Current).last_column
= YYRHSLOC(Rhs, N).last_column; (Current).path = YYRHSLOC(Rhs
, N).path; } else { (Current).first_line = (Current).last_line
= YYRHSLOC(Rhs, 0).last_line; (Current).first_column = (Current
).last_column = YYRHSLOC(Rhs, 0).last_column; (Current).path =
YYRHSLOC(Rhs, 0).path; } (Current).source = 0; } while (0)
\
967do { \
968 if (N) \
969 { \
970 (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \
971 (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \
972 (Current).last_line = YYRHSLOC(Rhs, N).last_line; \
973 (Current).last_column = YYRHSLOC(Rhs, N).last_column; \
974 (Current).path = YYRHSLOC(Rhs, N).path; \
975 } \
976 else \
977 { \
978 (Current).first_line = (Current).last_line = \
979 YYRHSLOC(Rhs, 0).last_line; \
980 (Current).first_column = (Current).last_column = \
981 YYRHSLOC(Rhs, 0).last_column; \
982 (Current).path = YYRHSLOC(Rhs, 0).path; \
983 } \
984 (Current).source = 0; \
985} while (0)
986
987/**
988 * Emit a warning to the shader log
989 *
990 * \sa _mesa_glsl_error
991 */
992extern void _mesa_glsl_warning(const YYLTYPE *locp,
993 _mesa_glsl_parse_state *state,
994 const char *fmt, ...);
995
996extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state,
997 const char *string);
998
999extern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state);
1000
1001union YYSTYPE;
1002extern int _mesa_glsl_lexer_lex(union YYSTYPE *yylval, YYLTYPE *yylloc,
1003 void *scanner);
1004
1005extern int _mesa_glsl_parse(struct _mesa_glsl_parse_state *);
1006
1007/**
1008 * Process elements of the #extension directive
1009 *
1010 * \return
1011 * If \c name and \c behavior are valid, \c true is returned. Otherwise
1012 * \c false is returned.
1013 */
1014extern bool _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
1015 const char *behavior,
1016 YYLTYPE *behavior_locp,
1017 _mesa_glsl_parse_state *state);
1018
1019#endif /* __cplusplus */
1020
1021
1022/*
1023 * These definitions apply to C and C++
1024 */
1025#ifdef __cplusplus201703L
1026extern "C" {
1027#endif
1028
1029struct glcpp_parser;
1030struct _mesa_glsl_parse_state;
1031
1032typedef void (*glcpp_extension_iterator)(
1033 struct _mesa_glsl_parse_state *state,
1034 void (*add_builtin_define)(struct glcpp_parser *, const char *, int),
1035 struct glcpp_parser *data,
1036 unsigned version,
1037 bool es);
1038
1039extern int glcpp_preprocess(void *ctx, const char **shader, char **info_log,
1040 glcpp_extension_iterator extensions,
1041 struct _mesa_glsl_parse_state *state,
1042 struct gl_context *gl_ctx);
1043
1044void add_builtin_defines(struct _mesa_glsl_parse_state *state,
1045 void (*add_builtin_define)(struct glcpp_parser *, const char *, int),
1046 struct glcpp_parser *data,
1047 unsigned version,
1048 bool es);
1049
1050extern void
1051_mesa_glsl_copy_symbols_from_table(struct exec_list *shader_ir,
1052 struct glsl_symbol_table *src,
1053 struct glsl_symbol_table *dest);
1054
1055#ifdef __cplusplus201703L
1056}
1057#endif
1058
1059
1060#endif /* GLSL_PARSER_EXTRAS_H */