xref: /aosp_15_r20/external/angle/src/libANGLE/Compiler.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 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 // Compiler.cpp: implements the gl::Compiler class.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Compiler.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/State.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/CompilerImpl.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/GLImplFactory.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace gl
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker namespace
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker // To know when to call sh::Initialize and sh::Finalize.
25*8975f5c5SAndroid Build Coastguard Worker size_t gActiveCompilers = 0;
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
28*8975f5c5SAndroid Build Coastguard Worker 
Compiler(rx::GLImplFactory * implFactory,const State & state,egl::Display * display)29*8975f5c5SAndroid Build Coastguard Worker Compiler::Compiler(rx::GLImplFactory *implFactory, const State &state, egl::Display *display)
30*8975f5c5SAndroid Build Coastguard Worker     : mImplementation(implFactory->createCompiler()),
31*8975f5c5SAndroid Build Coastguard Worker       mSpec(SelectShaderSpec(state)),
32*8975f5c5SAndroid Build Coastguard Worker       mOutputType(mImplementation->getTranslatorOutputType()),
33*8975f5c5SAndroid Build Coastguard Worker       mResources()
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker     // TODO(http://anglebug.com/42262462): Update for GL version specific validation
36*8975f5c5SAndroid Build Coastguard Worker     ASSERT(state.getClientMajorVersion() == 1 || state.getClientMajorVersion() == 2 ||
37*8975f5c5SAndroid Build Coastguard Worker            state.getClientMajorVersion() == 3 || state.getClientMajorVersion() == 4);
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker     {
40*8975f5c5SAndroid Build Coastguard Worker         std::lock_guard<angle::SimpleMutex> lock(display->getDisplayGlobalMutex());
41*8975f5c5SAndroid Build Coastguard Worker         if (gActiveCompilers == 0)
42*8975f5c5SAndroid Build Coastguard Worker         {
43*8975f5c5SAndroid Build Coastguard Worker             sh::Initialize();
44*8975f5c5SAndroid Build Coastguard Worker         }
45*8975f5c5SAndroid Build Coastguard Worker         ++gActiveCompilers;
46*8975f5c5SAndroid Build Coastguard Worker     }
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker     const Caps &caps             = state.getCaps();
49*8975f5c5SAndroid Build Coastguard Worker     const Extensions &extensions = state.getExtensions();
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker     sh::InitBuiltInResources(&mResources);
52*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxVertexAttribs             = caps.maxVertexAttributes;
53*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxVertexUniformVectors      = caps.maxVertexUniformVectors;
54*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxVaryingVectors            = caps.maxVaryingVectors;
55*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxVertexTextureImageUnits   = caps.maxShaderTextureImageUnits[ShaderType::Vertex];
56*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
57*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTextureImageUnits         = caps.maxShaderTextureImageUnits[ShaderType::Fragment];
58*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxFragmentUniformVectors    = caps.maxFragmentUniformVectors;
59*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxDrawBuffers               = caps.maxDrawBuffers;
60*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_standard_derivatives     = extensions.standardDerivativesOES;
61*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_draw_buffers             = extensions.drawBuffersEXT;
62*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_shader_texture_lod       = extensions.shaderTextureLodEXT;
63*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_shader_non_constant_global_initializers =
64*8975f5c5SAndroid Build Coastguard Worker         extensions.shaderNonConstantGlobalInitializersEXT;
65*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_EGL_image_external          = extensions.EGLImageExternalOES;
66*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_EGL_image_external_essl3    = extensions.EGLImageExternalEssl3OES;
67*8975f5c5SAndroid Build Coastguard Worker     mResources.NV_EGL_stream_consumer_external = extensions.EGLStreamConsumerExternalNV;
68*8975f5c5SAndroid Build Coastguard Worker     mResources.NV_shader_noperspective_interpolation =
69*8975f5c5SAndroid Build Coastguard Worker         extensions.shaderNoperspectiveInterpolationNV;
70*8975f5c5SAndroid Build Coastguard Worker     mResources.ARB_texture_rectangle = extensions.textureRectangleANGLE;
71*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_gpu_shader5       = extensions.gpuShader5EXT;
72*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_gpu_shader5       = extensions.gpuShader5OES;
73*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_shader_io_blocks  = extensions.shaderIoBlocksOES;
74*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_shader_io_blocks  = extensions.shaderIoBlocksEXT;
75*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_texture_storage_multisample_2d_array =
76*8975f5c5SAndroid Build Coastguard Worker         extensions.textureStorageMultisample2dArrayOES;
77*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_texture_3D = extensions.texture3DOES;
78*8975f5c5SAndroid Build Coastguard Worker     mResources.ANGLE_base_vertex_base_instance_shader_builtin =
79*8975f5c5SAndroid Build Coastguard Worker         extensions.baseVertexBaseInstanceShaderBuiltinANGLE;
80*8975f5c5SAndroid Build Coastguard Worker     mResources.ANGLE_multi_draw                 = extensions.multiDrawANGLE;
81*8975f5c5SAndroid Build Coastguard Worker     mResources.ANGLE_shader_pixel_local_storage = extensions.shaderPixelLocalStorageANGLE;
82*8975f5c5SAndroid Build Coastguard Worker     mResources.ANGLE_texture_multisample        = extensions.textureMultisampleANGLE;
83*8975f5c5SAndroid Build Coastguard Worker     mResources.APPLE_clip_distance              = extensions.clipDistanceAPPLE;
84*8975f5c5SAndroid Build Coastguard Worker     // OES_shader_multisample_interpolation
85*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_shader_multisample_interpolation = extensions.shaderMultisampleInterpolationOES;
86*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_shader_image_atomic              = extensions.shaderImageAtomicOES;
87*8975f5c5SAndroid Build Coastguard Worker     // TODO: use shader precision caps to determine if high precision is supported?
88*8975f5c5SAndroid Build Coastguard Worker     mResources.FragmentPrecisionHigh = 1;
89*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_frag_depth        = extensions.fragDepthEXT;
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     // OVR_multiview state
92*8975f5c5SAndroid Build Coastguard Worker     mResources.OVR_multiview = extensions.multiviewOVR;
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker     // OVR_multiview2 state
95*8975f5c5SAndroid Build Coastguard Worker     mResources.OVR_multiview2 = extensions.multiview2OVR;
96*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxViewsOVR    = caps.maxViews;
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     // EXT_multisampled_render_to_texture and EXT_multisampled_render_to_texture2
99*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_multisampled_render_to_texture  = extensions.multisampledRenderToTextureEXT;
100*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_multisampled_render_to_texture2 = extensions.multisampledRenderToTexture2EXT;
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker     // WEBGL_video_texture
103*8975f5c5SAndroid Build Coastguard Worker     mResources.WEBGL_video_texture = extensions.videoTextureWEBGL;
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker     // OES_texture_cube_map_array
106*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_texture_cube_map_array = extensions.textureCubeMapArrayOES;
107*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_texture_cube_map_array = extensions.textureCubeMapArrayEXT;
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker     // EXT_texture_query_lod
110*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_texture_query_lod = extensions.textureQueryLodEXT;
111*8975f5c5SAndroid Build Coastguard Worker 
112*8975f5c5SAndroid Build Coastguard Worker     // EXT_texture_shadow_lod
113*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_texture_shadow_lod = extensions.textureShadowLodEXT;
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     // EXT_shadow_samplers
116*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_shadow_samplers = extensions.shadowSamplersEXT;
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     // OES_texture_buffer
119*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_texture_buffer = extensions.textureBufferOES;
120*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_texture_buffer = extensions.textureBufferEXT;
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_YUV_target
123*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_YUV_target = extensions.YUVTargetEXT;
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_shader_framebuffer_fetch_non_coherent =
126*8975f5c5SAndroid Build Coastguard Worker         extensions.shaderFramebufferFetchNonCoherentEXT;
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_shader_framebuffer_fetch = extensions.shaderFramebufferFetchEXT;
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_clip_cull_distance
131*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_clip_cull_distance = extensions.clipCullDistanceEXT;
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_clip_cull_distance
134*8975f5c5SAndroid Build Coastguard Worker     mResources.ANGLE_clip_cull_distance = extensions.clipCullDistanceANGLE;
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_primitive_bounding_box
137*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_primitive_bounding_box = extensions.primitiveBoundingBoxEXT;
138*8975f5c5SAndroid Build Coastguard Worker 
139*8975f5c5SAndroid Build Coastguard Worker     // GL_OES_primitive_bounding_box
140*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_primitive_bounding_box = extensions.primitiveBoundingBoxOES;
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_separate_shader_objects
143*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_separate_shader_objects = extensions.separateShaderObjectsEXT;
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker     // GL_ARM_shader_framebuffer_fetch
146*8975f5c5SAndroid Build Coastguard Worker     mResources.ARM_shader_framebuffer_fetch = extensions.shaderFramebufferFetchARM;
147*8975f5c5SAndroid Build Coastguard Worker 
148*8975f5c5SAndroid Build Coastguard Worker     // GL_ARM_shader_framebuffer_fetch_depth_stencil
149*8975f5c5SAndroid Build Coastguard Worker     mResources.ARM_shader_framebuffer_fetch_depth_stencil =
150*8975f5c5SAndroid Build Coastguard Worker         extensions.shaderFramebufferFetchDepthStencilARM;
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker     // GLSL ES 3.0 constants
153*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxVertexOutputVectors  = caps.maxVertexOutputComponents / 4;
154*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4;
155*8975f5c5SAndroid Build Coastguard Worker     mResources.MinProgramTexelOffset   = caps.minProgramTexelOffset;
156*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxProgramTexelOffset   = caps.maxProgramTexelOffset;
157*8975f5c5SAndroid Build Coastguard Worker 
158*8975f5c5SAndroid Build Coastguard Worker     // EXT_blend_func_extended
159*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_blend_func_extended  = extensions.blendFuncExtendedEXT;
160*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxDualSourceDrawBuffers = caps.maxDualSourceDrawBuffers;
161*8975f5c5SAndroid Build Coastguard Worker 
162*8975f5c5SAndroid Build Coastguard Worker     // EXT_conservative_depth
163*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_conservative_depth = extensions.conservativeDepthEXT;
164*8975f5c5SAndroid Build Coastguard Worker 
165*8975f5c5SAndroid Build Coastguard Worker     // APPLE_clip_distance / EXT_clip_cull_distance / ANGLE_clip_cull_distance
166*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxClipDistances                = caps.maxClipDistances;
167*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxCullDistances                = caps.maxCullDistances;
168*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxCombinedClipAndCullDistances = caps.maxCombinedClipAndCullDistances;
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker     // ANGLE_shader_pixel_local_storage.
171*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxPixelLocalStoragePlanes = caps.maxPixelLocalStoragePlanes;
172*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxColorAttachmentsWithActivePixelLocalStorage =
173*8975f5c5SAndroid Build Coastguard Worker         caps.maxColorAttachmentsWithActivePixelLocalStorage;
174*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxCombinedDrawBuffersAndPixelLocalStoragePlanes =
175*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedDrawBuffersAndPixelLocalStoragePlanes;
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker     // OES_sample_variables
178*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_sample_variables = extensions.sampleVariablesOES;
179*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxSamples           = caps.maxSamples;
180*8975f5c5SAndroid Build Coastguard Worker 
181*8975f5c5SAndroid Build Coastguard Worker     // ANDROID_extension_pack_es31a
182*8975f5c5SAndroid Build Coastguard Worker     mResources.ANDROID_extension_pack_es31a = extensions.extensionPackEs31aANDROID;
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker     // KHR_blend_equation_advanced
185*8975f5c5SAndroid Build Coastguard Worker     mResources.KHR_blend_equation_advanced = extensions.blendEquationAdvancedKHR;
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker     // GLSL ES 3.1 constants
188*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxProgramTextureGatherOffset    = caps.maxProgramTextureGatherOffset;
189*8975f5c5SAndroid Build Coastguard Worker     mResources.MinProgramTextureGatherOffset    = caps.minProgramTextureGatherOffset;
190*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxImageUnits                    = caps.maxImageUnits;
191*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxVertexImageUniforms           = caps.maxShaderImageUniforms[ShaderType::Vertex];
192*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxFragmentImageUniforms         = caps.maxShaderImageUniforms[ShaderType::Fragment];
193*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxComputeImageUniforms          = caps.maxShaderImageUniforms[ShaderType::Compute];
194*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxCombinedImageUniforms         = caps.maxCombinedImageUniforms;
195*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxCombinedShaderOutputResources = caps.maxCombinedShaderOutputResources;
196*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxUniformLocations              = caps.maxUniformLocations;
197*8975f5c5SAndroid Build Coastguard Worker 
198*8975f5c5SAndroid Build Coastguard Worker     for (size_t index = 0u; index < 3u; ++index)
199*8975f5c5SAndroid Build Coastguard Worker     {
200*8975f5c5SAndroid Build Coastguard Worker         mResources.MaxComputeWorkGroupCount[index] = caps.maxComputeWorkGroupCount[index];
201*8975f5c5SAndroid Build Coastguard Worker         mResources.MaxComputeWorkGroupSize[index]  = caps.maxComputeWorkGroupSize[index];
202*8975f5c5SAndroid Build Coastguard Worker     }
203*8975f5c5SAndroid Build Coastguard Worker 
204*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxComputeUniformComponents = caps.maxShaderUniformComponents[ShaderType::Compute];
205*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxComputeTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Compute];
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxComputeAtomicCounters = caps.maxShaderAtomicCounters[ShaderType::Compute];
208*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxComputeAtomicCounterBuffers =
209*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxVertexAtomicCounters   = caps.maxShaderAtomicCounters[ShaderType::Vertex];
212*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxFragmentAtomicCounters = caps.maxShaderAtomicCounters[ShaderType::Fragment];
213*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxCombinedAtomicCounters = caps.maxCombinedAtomicCounters;
214*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxAtomicCounterBindings  = caps.maxAtomicCounterBufferBindings;
215*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxVertexAtomicCounterBuffers =
216*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
217*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxFragmentAtomicCounterBuffers =
218*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
219*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxCombinedAtomicCounterBuffers = caps.maxCombinedAtomicCounterBuffers;
220*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxAtomicCounterBufferSize      = caps.maxAtomicCounterBufferSize;
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxUniformBufferBindings       = caps.maxUniformBufferBindings;
223*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxShaderStorageBufferBindings = caps.maxShaderStorageBufferBindings;
224*8975f5c5SAndroid Build Coastguard Worker 
225*8975f5c5SAndroid Build Coastguard Worker     // Needed by point size clamping workaround
226*8975f5c5SAndroid Build Coastguard Worker     mResources.MinPointSize = caps.minAliasedPointSize;
227*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxPointSize = caps.maxAliasedPointSize;
228*8975f5c5SAndroid Build Coastguard Worker 
229*8975f5c5SAndroid Build Coastguard Worker     if (state.getClientMajorVersion() == 2 && !extensions.drawBuffersEXT)
230*8975f5c5SAndroid Build Coastguard Worker     {
231*8975f5c5SAndroid Build Coastguard Worker         mResources.MaxDrawBuffers = 1;
232*8975f5c5SAndroid Build Coastguard Worker     }
233*8975f5c5SAndroid Build Coastguard Worker 
234*8975f5c5SAndroid Build Coastguard Worker     // Geometry Shader constants
235*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_geometry_shader          = extensions.geometryShaderEXT;
236*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_geometry_shader          = extensions.geometryShaderOES;
237*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryUniformComponents = caps.maxShaderUniformComponents[ShaderType::Geometry];
238*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryUniformBlocks     = caps.maxShaderUniformBlocks[ShaderType::Geometry];
239*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryInputComponents   = caps.maxGeometryInputComponents;
240*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryOutputComponents  = caps.maxGeometryOutputComponents;
241*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryOutputVertices    = caps.maxGeometryOutputVertices;
242*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryTotalOutputComponents = caps.maxGeometryTotalOutputComponents;
243*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Geometry];
244*8975f5c5SAndroid Build Coastguard Worker 
245*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryAtomicCounterBuffers =
246*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
247*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryAtomicCounters      = caps.maxShaderAtomicCounters[ShaderType::Geometry];
248*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryShaderStorageBlocks = caps.maxShaderStorageBlocks[ShaderType::Geometry];
249*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryShaderInvocations   = caps.maxGeometryShaderInvocations;
250*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxGeometryImageUniforms       = caps.maxShaderImageUniforms[ShaderType::Geometry];
251*8975f5c5SAndroid Build Coastguard Worker 
252*8975f5c5SAndroid Build Coastguard Worker     // Tessellation Shader constants
253*8975f5c5SAndroid Build Coastguard Worker     mResources.EXT_tessellation_shader        = extensions.tessellationShaderEXT;
254*8975f5c5SAndroid Build Coastguard Worker     mResources.OES_tessellation_shader        = extensions.tessellationShaderOES;
255*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessControlInputComponents  = caps.maxTessControlInputComponents;
256*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessControlOutputComponents = caps.maxTessControlOutputComponents;
257*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessControlTextureImageUnits =
258*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderTextureImageUnits[ShaderType::TessControl];
259*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessControlUniformComponents =
260*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformComponents[ShaderType::TessControl];
261*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessControlTotalOutputComponents = caps.maxTessControlTotalOutputComponents;
262*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessControlImageUniforms  = caps.maxShaderImageUniforms[ShaderType::TessControl];
263*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessControlAtomicCounters = caps.maxShaderAtomicCounters[ShaderType::TessControl];
264*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessControlAtomicCounterBuffers =
265*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::TessControl];
266*8975f5c5SAndroid Build Coastguard Worker 
267*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessPatchComponents = caps.maxTessPatchComponents;
268*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxPatchVertices       = caps.maxPatchVertices;
269*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessGenLevel        = caps.maxTessGenLevel;
270*8975f5c5SAndroid Build Coastguard Worker 
271*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessEvaluationInputComponents  = caps.maxTessEvaluationInputComponents;
272*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessEvaluationOutputComponents = caps.maxTessEvaluationOutputComponents;
273*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessEvaluationTextureImageUnits =
274*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderTextureImageUnits[ShaderType::TessEvaluation];
275*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessEvaluationUniformComponents =
276*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformComponents[ShaderType::TessEvaluation];
277*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessEvaluationImageUniforms =
278*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderImageUniforms[ShaderType::TessEvaluation];
279*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessEvaluationAtomicCounters =
280*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounters[ShaderType::TessEvaluation];
281*8975f5c5SAndroid Build Coastguard Worker     mResources.MaxTessEvaluationAtomicCounterBuffers =
282*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::TessEvaluation];
283*8975f5c5SAndroid Build Coastguard Worker 
284*8975f5c5SAndroid Build Coastguard Worker     // Subpixel bits.
285*8975f5c5SAndroid Build Coastguard Worker     mResources.SubPixelBits = static_cast<int>(caps.subPixelBits);
286*8975f5c5SAndroid Build Coastguard Worker }
287*8975f5c5SAndroid Build Coastguard Worker 
288*8975f5c5SAndroid Build Coastguard Worker Compiler::~Compiler() = default;
289*8975f5c5SAndroid Build Coastguard Worker 
onDestroy(const Context * context)290*8975f5c5SAndroid Build Coastguard Worker void Compiler::onDestroy(const Context *context)
291*8975f5c5SAndroid Build Coastguard Worker {
292*8975f5c5SAndroid Build Coastguard Worker     std::lock_guard<angle::SimpleMutex> lock(context->getDisplay()->getDisplayGlobalMutex());
293*8975f5c5SAndroid Build Coastguard Worker     for (auto &pool : mPools)
294*8975f5c5SAndroid Build Coastguard Worker     {
295*8975f5c5SAndroid Build Coastguard Worker         for (ShCompilerInstance &instance : pool)
296*8975f5c5SAndroid Build Coastguard Worker         {
297*8975f5c5SAndroid Build Coastguard Worker             instance.destroy();
298*8975f5c5SAndroid Build Coastguard Worker         }
299*8975f5c5SAndroid Build Coastguard Worker     }
300*8975f5c5SAndroid Build Coastguard Worker     --gActiveCompilers;
301*8975f5c5SAndroid Build Coastguard Worker     if (gActiveCompilers == 0)
302*8975f5c5SAndroid Build Coastguard Worker     {
303*8975f5c5SAndroid Build Coastguard Worker         sh::Finalize();
304*8975f5c5SAndroid Build Coastguard Worker     }
305*8975f5c5SAndroid Build Coastguard Worker }
306*8975f5c5SAndroid Build Coastguard Worker 
getInstance(ShaderType type)307*8975f5c5SAndroid Build Coastguard Worker ShCompilerInstance Compiler::getInstance(ShaderType type)
308*8975f5c5SAndroid Build Coastguard Worker {
309*8975f5c5SAndroid Build Coastguard Worker     ASSERT(type != ShaderType::InvalidEnum);
310*8975f5c5SAndroid Build Coastguard Worker     auto &pool = mPools[type];
311*8975f5c5SAndroid Build Coastguard Worker     if (pool.empty())
312*8975f5c5SAndroid Build Coastguard Worker     {
313*8975f5c5SAndroid Build Coastguard Worker         ShHandle handle = sh::ConstructCompiler(ToGLenum(type), mSpec, mOutputType, &mResources);
314*8975f5c5SAndroid Build Coastguard Worker         ASSERT(handle);
315*8975f5c5SAndroid Build Coastguard Worker         return ShCompilerInstance(handle, mOutputType, type);
316*8975f5c5SAndroid Build Coastguard Worker     }
317*8975f5c5SAndroid Build Coastguard Worker     else
318*8975f5c5SAndroid Build Coastguard Worker     {
319*8975f5c5SAndroid Build Coastguard Worker         ShCompilerInstance instance = std::move(pool.back());
320*8975f5c5SAndroid Build Coastguard Worker         pool.pop_back();
321*8975f5c5SAndroid Build Coastguard Worker         return instance;
322*8975f5c5SAndroid Build Coastguard Worker     }
323*8975f5c5SAndroid Build Coastguard Worker }
324*8975f5c5SAndroid Build Coastguard Worker 
putInstance(ShCompilerInstance && instance)325*8975f5c5SAndroid Build Coastguard Worker void Compiler::putInstance(ShCompilerInstance &&instance)
326*8975f5c5SAndroid Build Coastguard Worker {
327*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kMaxPoolSize = 32;
328*8975f5c5SAndroid Build Coastguard Worker     auto &pool                           = mPools[instance.getShaderType()];
329*8975f5c5SAndroid Build Coastguard Worker     if (pool.size() < kMaxPoolSize)
330*8975f5c5SAndroid Build Coastguard Worker     {
331*8975f5c5SAndroid Build Coastguard Worker         pool.push_back(std::move(instance));
332*8975f5c5SAndroid Build Coastguard Worker     }
333*8975f5c5SAndroid Build Coastguard Worker     else
334*8975f5c5SAndroid Build Coastguard Worker     {
335*8975f5c5SAndroid Build Coastguard Worker         instance.destroy();
336*8975f5c5SAndroid Build Coastguard Worker     }
337*8975f5c5SAndroid Build Coastguard Worker }
338*8975f5c5SAndroid Build Coastguard Worker 
SelectShaderSpec(const State & state)339*8975f5c5SAndroid Build Coastguard Worker ShShaderSpec Compiler::SelectShaderSpec(const State &state)
340*8975f5c5SAndroid Build Coastguard Worker {
341*8975f5c5SAndroid Build Coastguard Worker     const GLint majorVersion = state.getClientMajorVersion();
342*8975f5c5SAndroid Build Coastguard Worker     const GLint minorVersion = state.getClientMinorVersion();
343*8975f5c5SAndroid Build Coastguard Worker     bool isWebGL             = state.isWebGL();
344*8975f5c5SAndroid Build Coastguard Worker 
345*8975f5c5SAndroid Build Coastguard Worker     if (majorVersion >= 3)
346*8975f5c5SAndroid Build Coastguard Worker     {
347*8975f5c5SAndroid Build Coastguard Worker         switch (minorVersion)
348*8975f5c5SAndroid Build Coastguard Worker         {
349*8975f5c5SAndroid Build Coastguard Worker             case 2:
350*8975f5c5SAndroid Build Coastguard Worker                 ASSERT(!isWebGL);
351*8975f5c5SAndroid Build Coastguard Worker                 return SH_GLES3_2_SPEC;
352*8975f5c5SAndroid Build Coastguard Worker             case 1:
353*8975f5c5SAndroid Build Coastguard Worker                 return isWebGL ? SH_WEBGL3_SPEC : SH_GLES3_1_SPEC;
354*8975f5c5SAndroid Build Coastguard Worker             case 0:
355*8975f5c5SAndroid Build Coastguard Worker                 return isWebGL ? SH_WEBGL2_SPEC : SH_GLES3_SPEC;
356*8975f5c5SAndroid Build Coastguard Worker             default:
357*8975f5c5SAndroid Build Coastguard Worker                 UNREACHABLE();
358*8975f5c5SAndroid Build Coastguard Worker         }
359*8975f5c5SAndroid Build Coastguard Worker     }
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker     // GLES1 emulation: Use GLES3 shader spec.
362*8975f5c5SAndroid Build Coastguard Worker     if (!isWebGL && majorVersion == 1)
363*8975f5c5SAndroid Build Coastguard Worker     {
364*8975f5c5SAndroid Build Coastguard Worker         return SH_GLES3_SPEC;
365*8975f5c5SAndroid Build Coastguard Worker     }
366*8975f5c5SAndroid Build Coastguard Worker 
367*8975f5c5SAndroid Build Coastguard Worker     return isWebGL ? SH_WEBGL_SPEC : SH_GLES2_SPEC;
368*8975f5c5SAndroid Build Coastguard Worker }
369*8975f5c5SAndroid Build Coastguard Worker 
ShCompilerInstance()370*8975f5c5SAndroid Build Coastguard Worker ShCompilerInstance::ShCompilerInstance() : mHandle(nullptr) {}
371*8975f5c5SAndroid Build Coastguard Worker 
ShCompilerInstance(ShHandle handle,ShShaderOutput outputType,ShaderType shaderType)372*8975f5c5SAndroid Build Coastguard Worker ShCompilerInstance::ShCompilerInstance(ShHandle handle,
373*8975f5c5SAndroid Build Coastguard Worker                                        ShShaderOutput outputType,
374*8975f5c5SAndroid Build Coastguard Worker                                        ShaderType shaderType)
375*8975f5c5SAndroid Build Coastguard Worker     : mHandle(handle), mOutputType(outputType), mShaderType(shaderType)
376*8975f5c5SAndroid Build Coastguard Worker {}
377*8975f5c5SAndroid Build Coastguard Worker 
~ShCompilerInstance()378*8975f5c5SAndroid Build Coastguard Worker ShCompilerInstance::~ShCompilerInstance()
379*8975f5c5SAndroid Build Coastguard Worker {
380*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mHandle == nullptr);
381*8975f5c5SAndroid Build Coastguard Worker }
382*8975f5c5SAndroid Build Coastguard Worker 
destroy()383*8975f5c5SAndroid Build Coastguard Worker void ShCompilerInstance::destroy()
384*8975f5c5SAndroid Build Coastguard Worker {
385*8975f5c5SAndroid Build Coastguard Worker     if (mHandle != nullptr)
386*8975f5c5SAndroid Build Coastguard Worker     {
387*8975f5c5SAndroid Build Coastguard Worker         sh::Destruct(mHandle);
388*8975f5c5SAndroid Build Coastguard Worker         mHandle = nullptr;
389*8975f5c5SAndroid Build Coastguard Worker     }
390*8975f5c5SAndroid Build Coastguard Worker }
391*8975f5c5SAndroid Build Coastguard Worker 
ShCompilerInstance(ShCompilerInstance && other)392*8975f5c5SAndroid Build Coastguard Worker ShCompilerInstance::ShCompilerInstance(ShCompilerInstance &&other)
393*8975f5c5SAndroid Build Coastguard Worker     : mHandle(other.mHandle), mOutputType(other.mOutputType), mShaderType(other.mShaderType)
394*8975f5c5SAndroid Build Coastguard Worker {
395*8975f5c5SAndroid Build Coastguard Worker     other.mHandle = nullptr;
396*8975f5c5SAndroid Build Coastguard Worker }
397*8975f5c5SAndroid Build Coastguard Worker 
operator =(ShCompilerInstance && other)398*8975f5c5SAndroid Build Coastguard Worker ShCompilerInstance &ShCompilerInstance::operator=(ShCompilerInstance &&other)
399*8975f5c5SAndroid Build Coastguard Worker {
400*8975f5c5SAndroid Build Coastguard Worker     mHandle       = other.mHandle;
401*8975f5c5SAndroid Build Coastguard Worker     mOutputType   = other.mOutputType;
402*8975f5c5SAndroid Build Coastguard Worker     mShaderType   = other.mShaderType;
403*8975f5c5SAndroid Build Coastguard Worker     other.mHandle = nullptr;
404*8975f5c5SAndroid Build Coastguard Worker     return *this;
405*8975f5c5SAndroid Build Coastguard Worker }
406*8975f5c5SAndroid Build Coastguard Worker 
getHandle()407*8975f5c5SAndroid Build Coastguard Worker ShHandle ShCompilerInstance::getHandle()
408*8975f5c5SAndroid Build Coastguard Worker {
409*8975f5c5SAndroid Build Coastguard Worker     return mHandle;
410*8975f5c5SAndroid Build Coastguard Worker }
411*8975f5c5SAndroid Build Coastguard Worker 
getShaderType() const412*8975f5c5SAndroid Build Coastguard Worker ShaderType ShCompilerInstance::getShaderType() const
413*8975f5c5SAndroid Build Coastguard Worker {
414*8975f5c5SAndroid Build Coastguard Worker     return mShaderType;
415*8975f5c5SAndroid Build Coastguard Worker }
416*8975f5c5SAndroid Build Coastguard Worker 
getBuiltInResources() const417*8975f5c5SAndroid Build Coastguard Worker ShBuiltInResources ShCompilerInstance::getBuiltInResources() const
418*8975f5c5SAndroid Build Coastguard Worker {
419*8975f5c5SAndroid Build Coastguard Worker     return sh::GetBuiltInResources(mHandle);
420*8975f5c5SAndroid Build Coastguard Worker }
421*8975f5c5SAndroid Build Coastguard Worker 
getShaderOutputType() const422*8975f5c5SAndroid Build Coastguard Worker ShShaderOutput ShCompilerInstance::getShaderOutputType() const
423*8975f5c5SAndroid Build Coastguard Worker {
424*8975f5c5SAndroid Build Coastguard Worker     return mOutputType;
425*8975f5c5SAndroid Build Coastguard Worker }
426*8975f5c5SAndroid Build Coastguard Worker 
427*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
428