1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Initialize.h" 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker namespace sh 10*8975f5c5SAndroid Build Coastguard Worker { 11*8975f5c5SAndroid Build Coastguard Worker InitExtensionBehavior(const ShBuiltInResources & resources,TExtensionBehavior & extBehavior)12*8975f5c5SAndroid Build Coastguard Workervoid InitExtensionBehavior(const ShBuiltInResources &resources, TExtensionBehavior &extBehavior) 13*8975f5c5SAndroid Build Coastguard Worker { 14*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_standard_derivatives) 15*8975f5c5SAndroid Build Coastguard Worker { 16*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_standard_derivatives] = EBhUndefined; 17*8975f5c5SAndroid Build Coastguard Worker } 18*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_EGL_image_external) 19*8975f5c5SAndroid Build Coastguard Worker { 20*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_EGL_image_external] = EBhUndefined; 21*8975f5c5SAndroid Build Coastguard Worker } 22*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_EGL_image_external_essl3) 23*8975f5c5SAndroid Build Coastguard Worker { 24*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_EGL_image_external_essl3] = EBhUndefined; 25*8975f5c5SAndroid Build Coastguard Worker } 26*8975f5c5SAndroid Build Coastguard Worker if (resources.NV_EGL_stream_consumer_external) 27*8975f5c5SAndroid Build Coastguard Worker { 28*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::NV_EGL_stream_consumer_external] = EBhUndefined; 29*8975f5c5SAndroid Build Coastguard Worker } 30*8975f5c5SAndroid Build Coastguard Worker if (resources.ARB_texture_rectangle) 31*8975f5c5SAndroid Build Coastguard Worker { 32*8975f5c5SAndroid Build Coastguard Worker // Special: ARB_texture_rectangle extension does not follow the standard for #extension 33*8975f5c5SAndroid Build Coastguard Worker // directives - it is enabled by default. An extension directive may still disable it. 34*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ARB_texture_rectangle] = EBhEnable; 35*8975f5c5SAndroid Build Coastguard Worker } 36*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_blend_func_extended) 37*8975f5c5SAndroid Build Coastguard Worker { 38*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_blend_func_extended] = EBhUndefined; 39*8975f5c5SAndroid Build Coastguard Worker } 40*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_conservative_depth) 41*8975f5c5SAndroid Build Coastguard Worker { 42*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_conservative_depth] = EBhUndefined; 43*8975f5c5SAndroid Build Coastguard Worker } 44*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_draw_buffers) 45*8975f5c5SAndroid Build Coastguard Worker { 46*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_draw_buffers] = EBhUndefined; 47*8975f5c5SAndroid Build Coastguard Worker } 48*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_frag_depth) 49*8975f5c5SAndroid Build Coastguard Worker { 50*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_frag_depth] = EBhUndefined; 51*8975f5c5SAndroid Build Coastguard Worker } 52*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_primitive_bounding_box) 53*8975f5c5SAndroid Build Coastguard Worker { 54*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_primitive_bounding_box] = EBhUndefined; 55*8975f5c5SAndroid Build Coastguard Worker } 56*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_primitive_bounding_box) 57*8975f5c5SAndroid Build Coastguard Worker { 58*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_primitive_bounding_box] = EBhUndefined; 59*8975f5c5SAndroid Build Coastguard Worker } 60*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_separate_shader_objects) 61*8975f5c5SAndroid Build Coastguard Worker { 62*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_separate_shader_objects] = EBhUndefined; 63*8975f5c5SAndroid Build Coastguard Worker } 64*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_shader_texture_lod) 65*8975f5c5SAndroid Build Coastguard Worker { 66*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_shader_texture_lod] = EBhUndefined; 67*8975f5c5SAndroid Build Coastguard Worker } 68*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_shader_framebuffer_fetch) 69*8975f5c5SAndroid Build Coastguard Worker { 70*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_shader_framebuffer_fetch] = EBhUndefined; 71*8975f5c5SAndroid Build Coastguard Worker } 72*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_shader_framebuffer_fetch_non_coherent) 73*8975f5c5SAndroid Build Coastguard Worker { 74*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_shader_framebuffer_fetch_non_coherent] = EBhUndefined; 75*8975f5c5SAndroid Build Coastguard Worker } 76*8975f5c5SAndroid Build Coastguard Worker if (resources.NV_shader_framebuffer_fetch) 77*8975f5c5SAndroid Build Coastguard Worker { 78*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::NV_shader_framebuffer_fetch] = EBhUndefined; 79*8975f5c5SAndroid Build Coastguard Worker } 80*8975f5c5SAndroid Build Coastguard Worker if (resources.NV_shader_noperspective_interpolation) 81*8975f5c5SAndroid Build Coastguard Worker { 82*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::NV_shader_noperspective_interpolation] = EBhUndefined; 83*8975f5c5SAndroid Build Coastguard Worker } 84*8975f5c5SAndroid Build Coastguard Worker if (resources.ARM_shader_framebuffer_fetch) 85*8975f5c5SAndroid Build Coastguard Worker { 86*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ARM_shader_framebuffer_fetch] = EBhUndefined; 87*8975f5c5SAndroid Build Coastguard Worker } 88*8975f5c5SAndroid Build Coastguard Worker if (resources.ARM_shader_framebuffer_fetch_depth_stencil) 89*8975f5c5SAndroid Build Coastguard Worker { 90*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ARM_shader_framebuffer_fetch_depth_stencil] = EBhUndefined; 91*8975f5c5SAndroid Build Coastguard Worker } 92*8975f5c5SAndroid Build Coastguard Worker if (resources.OVR_multiview) 93*8975f5c5SAndroid Build Coastguard Worker { 94*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OVR_multiview] = EBhUndefined; 95*8975f5c5SAndroid Build Coastguard Worker } 96*8975f5c5SAndroid Build Coastguard Worker if (resources.OVR_multiview2) 97*8975f5c5SAndroid Build Coastguard Worker { 98*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OVR_multiview2] = EBhUndefined; 99*8975f5c5SAndroid Build Coastguard Worker } 100*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_YUV_target) 101*8975f5c5SAndroid Build Coastguard Worker { 102*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_YUV_target] = EBhUndefined; 103*8975f5c5SAndroid Build Coastguard Worker } 104*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_geometry_shader) 105*8975f5c5SAndroid Build Coastguard Worker { 106*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_geometry_shader] = EBhUndefined; 107*8975f5c5SAndroid Build Coastguard Worker } 108*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_geometry_shader) 109*8975f5c5SAndroid Build Coastguard Worker { 110*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_geometry_shader] = EBhUndefined; 111*8975f5c5SAndroid Build Coastguard Worker } 112*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_shader_io_blocks) 113*8975f5c5SAndroid Build Coastguard Worker { 114*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_shader_io_blocks] = EBhUndefined; 115*8975f5c5SAndroid Build Coastguard Worker } 116*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_shader_io_blocks) 117*8975f5c5SAndroid Build Coastguard Worker { 118*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_shader_io_blocks] = EBhUndefined; 119*8975f5c5SAndroid Build Coastguard Worker } 120*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_gpu_shader5) 121*8975f5c5SAndroid Build Coastguard Worker { 122*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_gpu_shader5] = EBhUndefined; 123*8975f5c5SAndroid Build Coastguard Worker } 124*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_gpu_shader5) 125*8975f5c5SAndroid Build Coastguard Worker { 126*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_gpu_shader5] = EBhUndefined; 127*8975f5c5SAndroid Build Coastguard Worker } 128*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_shader_non_constant_global_initializers) 129*8975f5c5SAndroid Build Coastguard Worker { 130*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_shader_non_constant_global_initializers] = EBhUndefined; 131*8975f5c5SAndroid Build Coastguard Worker } 132*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_texture_storage_multisample_2d_array) 133*8975f5c5SAndroid Build Coastguard Worker { 134*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_texture_storage_multisample_2d_array] = EBhUndefined; 135*8975f5c5SAndroid Build Coastguard Worker } 136*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_texture_3D) 137*8975f5c5SAndroid Build Coastguard Worker { 138*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_texture_3D] = EBhUndefined; 139*8975f5c5SAndroid Build Coastguard Worker } 140*8975f5c5SAndroid Build Coastguard Worker if (resources.ANGLE_shader_pixel_local_storage) 141*8975f5c5SAndroid Build Coastguard Worker { 142*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ANGLE_shader_pixel_local_storage] = EBhUndefined; 143*8975f5c5SAndroid Build Coastguard Worker } 144*8975f5c5SAndroid Build Coastguard Worker if (resources.ANGLE_texture_multisample) 145*8975f5c5SAndroid Build Coastguard Worker { 146*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ANGLE_texture_multisample] = EBhUndefined; 147*8975f5c5SAndroid Build Coastguard Worker } 148*8975f5c5SAndroid Build Coastguard Worker if (resources.ANGLE_multi_draw) 149*8975f5c5SAndroid Build Coastguard Worker { 150*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ANGLE_multi_draw] = EBhUndefined; 151*8975f5c5SAndroid Build Coastguard Worker } 152*8975f5c5SAndroid Build Coastguard Worker if (resources.ANGLE_base_vertex_base_instance_shader_builtin) 153*8975f5c5SAndroid Build Coastguard Worker { 154*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ANGLE_base_vertex_base_instance_shader_builtin] = EBhUndefined; 155*8975f5c5SAndroid Build Coastguard Worker } 156*8975f5c5SAndroid Build Coastguard Worker if (resources.WEBGL_video_texture) 157*8975f5c5SAndroid Build Coastguard Worker { 158*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::WEBGL_video_texture] = EBhUndefined; 159*8975f5c5SAndroid Build Coastguard Worker } 160*8975f5c5SAndroid Build Coastguard Worker if (resources.APPLE_clip_distance) 161*8975f5c5SAndroid Build Coastguard Worker { 162*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::APPLE_clip_distance] = EBhUndefined; 163*8975f5c5SAndroid Build Coastguard Worker } 164*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_texture_cube_map_array) 165*8975f5c5SAndroid Build Coastguard Worker { 166*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_texture_cube_map_array] = EBhUndefined; 167*8975f5c5SAndroid Build Coastguard Worker } 168*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_texture_cube_map_array) 169*8975f5c5SAndroid Build Coastguard Worker { 170*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_texture_cube_map_array] = EBhUndefined; 171*8975f5c5SAndroid Build Coastguard Worker } 172*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_texture_query_lod) 173*8975f5c5SAndroid Build Coastguard Worker { 174*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_texture_query_lod] = EBhUndefined; 175*8975f5c5SAndroid Build Coastguard Worker } 176*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_texture_shadow_lod) 177*8975f5c5SAndroid Build Coastguard Worker { 178*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_texture_shadow_lod] = EBhUndefined; 179*8975f5c5SAndroid Build Coastguard Worker } 180*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_shadow_samplers) 181*8975f5c5SAndroid Build Coastguard Worker { 182*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_shadow_samplers] = EBhUndefined; 183*8975f5c5SAndroid Build Coastguard Worker } 184*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_shader_multisample_interpolation) 185*8975f5c5SAndroid Build Coastguard Worker { 186*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_shader_multisample_interpolation] = EBhUndefined; 187*8975f5c5SAndroid Build Coastguard Worker } 188*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_shader_image_atomic) 189*8975f5c5SAndroid Build Coastguard Worker { 190*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_shader_image_atomic] = EBhUndefined; 191*8975f5c5SAndroid Build Coastguard Worker } 192*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_tessellation_shader) 193*8975f5c5SAndroid Build Coastguard Worker { 194*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_tessellation_shader] = EBhUndefined; 195*8975f5c5SAndroid Build Coastguard Worker } 196*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_tessellation_shader) 197*8975f5c5SAndroid Build Coastguard Worker { 198*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_tessellation_shader] = EBhUndefined; 199*8975f5c5SAndroid Build Coastguard Worker } 200*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_texture_buffer) 201*8975f5c5SAndroid Build Coastguard Worker { 202*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_texture_buffer] = EBhUndefined; 203*8975f5c5SAndroid Build Coastguard Worker } 204*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_texture_buffer) 205*8975f5c5SAndroid Build Coastguard Worker { 206*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_texture_buffer] = EBhUndefined; 207*8975f5c5SAndroid Build Coastguard Worker } 208*8975f5c5SAndroid Build Coastguard Worker if (resources.OES_sample_variables) 209*8975f5c5SAndroid Build Coastguard Worker { 210*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::OES_sample_variables] = EBhUndefined; 211*8975f5c5SAndroid Build Coastguard Worker } 212*8975f5c5SAndroid Build Coastguard Worker if (resources.EXT_clip_cull_distance) 213*8975f5c5SAndroid Build Coastguard Worker { 214*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::EXT_clip_cull_distance] = EBhUndefined; 215*8975f5c5SAndroid Build Coastguard Worker } 216*8975f5c5SAndroid Build Coastguard Worker if (resources.ANGLE_clip_cull_distance) 217*8975f5c5SAndroid Build Coastguard Worker { 218*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ANGLE_clip_cull_distance] = EBhUndefined; 219*8975f5c5SAndroid Build Coastguard Worker } 220*8975f5c5SAndroid Build Coastguard Worker if (resources.ANDROID_extension_pack_es31a) 221*8975f5c5SAndroid Build Coastguard Worker { 222*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ANDROID_extension_pack_es31a] = EBhUndefined; 223*8975f5c5SAndroid Build Coastguard Worker } 224*8975f5c5SAndroid Build Coastguard Worker if (resources.KHR_blend_equation_advanced) 225*8975f5c5SAndroid Build Coastguard Worker { 226*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::KHR_blend_equation_advanced] = EBhUndefined; 227*8975f5c5SAndroid Build Coastguard Worker } 228*8975f5c5SAndroid Build Coastguard Worker } 229*8975f5c5SAndroid Build Coastguard Worker ResetExtensionBehavior(const ShBuiltInResources & resources,TExtensionBehavior & extBehavior,const ShCompileOptions & compileOptions)230*8975f5c5SAndroid Build Coastguard Workervoid ResetExtensionBehavior(const ShBuiltInResources &resources, 231*8975f5c5SAndroid Build Coastguard Worker TExtensionBehavior &extBehavior, 232*8975f5c5SAndroid Build Coastguard Worker const ShCompileOptions &compileOptions) 233*8975f5c5SAndroid Build Coastguard Worker { 234*8975f5c5SAndroid Build Coastguard Worker for (auto &ext : extBehavior) 235*8975f5c5SAndroid Build Coastguard Worker { 236*8975f5c5SAndroid Build Coastguard Worker ext.second = EBhUndefined; 237*8975f5c5SAndroid Build Coastguard Worker } 238*8975f5c5SAndroid Build Coastguard Worker if (resources.ARB_texture_rectangle) 239*8975f5c5SAndroid Build Coastguard Worker { 240*8975f5c5SAndroid Build Coastguard Worker if (compileOptions.disableARBTextureRectangle) 241*8975f5c5SAndroid Build Coastguard Worker { 242*8975f5c5SAndroid Build Coastguard Worker // Remove ARB_texture_rectangle so it can't be enabled by extension directives. 243*8975f5c5SAndroid Build Coastguard Worker extBehavior.erase(TExtension::ARB_texture_rectangle); 244*8975f5c5SAndroid Build Coastguard Worker } 245*8975f5c5SAndroid Build Coastguard Worker else 246*8975f5c5SAndroid Build Coastguard Worker { 247*8975f5c5SAndroid Build Coastguard Worker // Restore ARB_texture_rectangle in case it was removed during an earlier reset. As 248*8975f5c5SAndroid Build Coastguard Worker // noted above, it doesn't follow the standard for extension directives and is 249*8975f5c5SAndroid Build Coastguard Worker // enabled by default. 250*8975f5c5SAndroid Build Coastguard Worker extBehavior[TExtension::ARB_texture_rectangle] = EBhEnable; 251*8975f5c5SAndroid Build Coastguard Worker } 252*8975f5c5SAndroid Build Coastguard Worker } 253*8975f5c5SAndroid Build Coastguard Worker } 254*8975f5c5SAndroid Build Coastguard Worker 255*8975f5c5SAndroid Build Coastguard Worker } // namespace sh 256