Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/libANGLE/Compiler.cpp
1693 views
1
//
2
// Copyright 2014 The ANGLE Project Authors. All rights reserved.
3
// Use of this source code is governed by a BSD-style license that can be
4
// found in the LICENSE file.
5
//
6
7
// Compiler.cpp: implements the gl::Compiler class.
8
9
#include "libANGLE/Compiler.h"
10
11
#include "common/debug.h"
12
#include "libANGLE/Context.h"
13
#include "libANGLE/Display.h"
14
#include "libANGLE/State.h"
15
#include "libANGLE/renderer/CompilerImpl.h"
16
#include "libANGLE/renderer/GLImplFactory.h"
17
18
namespace gl
19
{
20
21
namespace
22
{
23
24
// To know when to call sh::Initialize and sh::Finalize.
25
size_t gActiveCompilers = 0;
26
27
ShShaderSpec SelectShaderSpec(GLint majorVersion,
28
GLint minorVersion,
29
bool isWebGL,
30
EGLenum clientType)
31
{
32
// For Desktop GL
33
if (clientType == EGL_OPENGL_API)
34
{
35
return SH_GL_COMPATIBILITY_SPEC;
36
}
37
38
if (majorVersion >= 3)
39
{
40
switch (minorVersion)
41
{
42
case 2:
43
ASSERT(!isWebGL);
44
return SH_GLES3_2_SPEC;
45
case 1:
46
return isWebGL ? SH_WEBGL3_SPEC : SH_GLES3_1_SPEC;
47
case 0:
48
return isWebGL ? SH_WEBGL2_SPEC : SH_GLES3_SPEC;
49
default:
50
UNREACHABLE();
51
}
52
}
53
54
// GLES1 emulation: Use GLES3 shader spec.
55
if (!isWebGL && majorVersion == 1)
56
{
57
return SH_GLES3_SPEC;
58
}
59
60
return isWebGL ? SH_WEBGL_SPEC : SH_GLES2_SPEC;
61
}
62
63
} // anonymous namespace
64
65
Compiler::Compiler(rx::GLImplFactory *implFactory, const State &state, egl::Display *display)
66
: mImplementation(implFactory->createCompiler()),
67
mSpec(SelectShaderSpec(state.getClientMajorVersion(),
68
state.getClientMinorVersion(),
69
state.getExtensions().webglCompatibility,
70
state.getClientType())),
71
mOutputType(mImplementation->getTranslatorOutputType()),
72
mResources()
73
{
74
// TODO(http://anglebug.com/3819): Update for GL version specific validation
75
ASSERT(state.getClientMajorVersion() == 1 || state.getClientMajorVersion() == 2 ||
76
state.getClientMajorVersion() == 3 || state.getClientMajorVersion() == 4);
77
78
const gl::Caps &caps = state.getCaps();
79
const gl::Extensions &extensions = state.getExtensions();
80
81
{
82
std::lock_guard<std::mutex> lock(display->getDisplayGlobalMutex());
83
if (gActiveCompilers == 0)
84
{
85
sh::Initialize();
86
}
87
++gActiveCompilers;
88
}
89
90
sh::InitBuiltInResources(&mResources);
91
mResources.MaxVertexAttribs = caps.maxVertexAttributes;
92
mResources.MaxVertexUniformVectors = caps.maxVertexUniformVectors;
93
mResources.MaxVaryingVectors = caps.maxVaryingVectors;
94
mResources.MaxVertexTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Vertex];
95
mResources.MaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
96
mResources.MaxTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Fragment];
97
mResources.MaxFragmentUniformVectors = caps.maxFragmentUniformVectors;
98
mResources.MaxDrawBuffers = caps.maxDrawBuffers;
99
mResources.OES_standard_derivatives = extensions.standardDerivativesOES;
100
mResources.EXT_draw_buffers = extensions.drawBuffers;
101
mResources.EXT_shader_texture_lod = extensions.shaderTextureLOD;
102
mResources.EXT_shader_non_constant_global_initializers =
103
extensions.shaderNonConstGlobalInitializersEXT;
104
mResources.OES_EGL_image_external = extensions.eglImageExternalOES;
105
mResources.OES_EGL_image_external_essl3 = extensions.eglImageExternalEssl3OES;
106
mResources.NV_EGL_stream_consumer_external = extensions.eglStreamConsumerExternalNV;
107
mResources.NV_shader_noperspective_interpolation = extensions.noperspectiveInterpolationNV;
108
mResources.ARB_texture_rectangle = extensions.textureRectangle;
109
mResources.EXT_gpu_shader5 = extensions.gpuShader5EXT;
110
mResources.OES_shader_io_blocks = extensions.shaderIoBlocksOES;
111
mResources.EXT_shader_io_blocks = extensions.shaderIoBlocksEXT;
112
mResources.OES_texture_storage_multisample_2d_array =
113
extensions.textureStorageMultisample2DArrayOES;
114
mResources.OES_texture_3D = extensions.texture3DOES;
115
mResources.ANGLE_texture_multisample = extensions.textureMultisample;
116
mResources.ANGLE_multi_draw = extensions.multiDraw;
117
mResources.ANGLE_base_vertex_base_instance = extensions.baseVertexBaseInstance;
118
mResources.APPLE_clip_distance = extensions.clipDistanceAPPLE;
119
// OES_shader_multisample_interpolation
120
mResources.OES_shader_multisample_interpolation = extensions.multisampleInterpolationOES;
121
mResources.OES_shader_image_atomic = extensions.shaderImageAtomicOES;
122
// TODO: use shader precision caps to determine if high precision is supported?
123
mResources.FragmentPrecisionHigh = 1;
124
mResources.EXT_frag_depth = extensions.fragDepth;
125
126
// OVR_multiview state
127
mResources.OVR_multiview = extensions.multiview;
128
129
// OVR_multiview2 state
130
mResources.OVR_multiview2 = extensions.multiview2;
131
mResources.MaxViewsOVR = extensions.maxViews;
132
133
// EXT_multisampled_render_to_texture and EXT_multisampled_render_to_texture2
134
mResources.EXT_multisampled_render_to_texture = extensions.multisampledRenderToTexture;
135
mResources.EXT_multisampled_render_to_texture2 = extensions.multisampledRenderToTexture2;
136
137
// WEBGL_video_texture
138
mResources.WEBGL_video_texture = extensions.webglVideoTexture;
139
140
// OES_texture_cube_map_array
141
mResources.OES_texture_cube_map_array = extensions.textureCubeMapArrayOES;
142
mResources.EXT_texture_cube_map_array = extensions.textureCubeMapArrayEXT;
143
144
// EXT_shadow_samplers
145
mResources.EXT_shadow_samplers = extensions.shadowSamplersEXT;
146
147
// OES_texture_buffer
148
mResources.OES_texture_buffer = extensions.textureBufferOES;
149
mResources.EXT_texture_buffer = extensions.textureBufferEXT;
150
151
// GL_EXT_YUV_target
152
mResources.EXT_YUV_target = extensions.yuvTargetEXT;
153
154
mResources.EXT_shader_framebuffer_fetch_non_coherent =
155
extensions.shaderFramebufferFetchNonCoherentEXT;
156
157
// GL_EXT_clip_cull_distance
158
mResources.EXT_clip_cull_distance = extensions.clipCullDistanceEXT;
159
160
// GL_EXT_primitive_bounding_box
161
mResources.EXT_primitive_bounding_box = extensions.primitiveBoundingBoxEXT;
162
163
// GLSL ES 3.0 constants
164
mResources.MaxVertexOutputVectors = caps.maxVertexOutputComponents / 4;
165
mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4;
166
mResources.MinProgramTexelOffset = caps.minProgramTexelOffset;
167
mResources.MaxProgramTexelOffset = caps.maxProgramTexelOffset;
168
169
// EXT_blend_func_extended
170
mResources.EXT_blend_func_extended = extensions.blendFuncExtended;
171
mResources.MaxDualSourceDrawBuffers = extensions.maxDualSourceDrawBuffers;
172
173
// APPLE_clip_distance/EXT_clip_cull_distance
174
mResources.MaxClipDistances = caps.maxClipDistances;
175
mResources.MaxCullDistances = caps.maxCullDistances;
176
mResources.MaxCombinedClipAndCullDistances = caps.maxCombinedClipAndCullDistances;
177
178
// OES_sample_variables
179
mResources.OES_sample_variables = extensions.sampleVariablesOES;
180
mResources.MaxSamples = caps.maxSamples;
181
182
// GLSL ES 3.1 constants
183
mResources.MaxProgramTextureGatherOffset = caps.maxProgramTextureGatherOffset;
184
mResources.MinProgramTextureGatherOffset = caps.minProgramTextureGatherOffset;
185
mResources.MaxImageUnits = caps.maxImageUnits;
186
mResources.MaxVertexImageUniforms = caps.maxShaderImageUniforms[ShaderType::Vertex];
187
mResources.MaxFragmentImageUniforms = caps.maxShaderImageUniforms[ShaderType::Fragment];
188
mResources.MaxComputeImageUniforms = caps.maxShaderImageUniforms[ShaderType::Compute];
189
mResources.MaxCombinedImageUniforms = caps.maxCombinedImageUniforms;
190
mResources.MaxCombinedShaderOutputResources = caps.maxCombinedShaderOutputResources;
191
mResources.MaxUniformLocations = caps.maxUniformLocations;
192
193
for (size_t index = 0u; index < 3u; ++index)
194
{
195
mResources.MaxComputeWorkGroupCount[index] = caps.maxComputeWorkGroupCount[index];
196
mResources.MaxComputeWorkGroupSize[index] = caps.maxComputeWorkGroupSize[index];
197
}
198
199
mResources.MaxComputeUniformComponents = caps.maxShaderUniformComponents[ShaderType::Compute];
200
mResources.MaxComputeTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Compute];
201
202
mResources.MaxComputeAtomicCounters = caps.maxShaderAtomicCounters[ShaderType::Compute];
203
mResources.MaxComputeAtomicCounterBuffers =
204
caps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
205
206
mResources.MaxVertexAtomicCounters = caps.maxShaderAtomicCounters[ShaderType::Vertex];
207
mResources.MaxFragmentAtomicCounters = caps.maxShaderAtomicCounters[ShaderType::Fragment];
208
mResources.MaxCombinedAtomicCounters = caps.maxCombinedAtomicCounters;
209
mResources.MaxAtomicCounterBindings = caps.maxAtomicCounterBufferBindings;
210
mResources.MaxVertexAtomicCounterBuffers =
211
caps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
212
mResources.MaxFragmentAtomicCounterBuffers =
213
caps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
214
mResources.MaxCombinedAtomicCounterBuffers = caps.maxCombinedAtomicCounterBuffers;
215
mResources.MaxAtomicCounterBufferSize = caps.maxAtomicCounterBufferSize;
216
217
mResources.MaxUniformBufferBindings = caps.maxUniformBufferBindings;
218
mResources.MaxShaderStorageBufferBindings = caps.maxShaderStorageBufferBindings;
219
220
// Needed by point size clamping workaround
221
mResources.MaxPointSize = caps.maxAliasedPointSize;
222
223
if (state.getClientMajorVersion() == 2 && !extensions.drawBuffers)
224
{
225
mResources.MaxDrawBuffers = 1;
226
}
227
228
// Geometry Shader constants
229
mResources.EXT_geometry_shader = extensions.geometryShaderEXT;
230
mResources.OES_geometry_shader = extensions.geometryShaderOES;
231
mResources.MaxGeometryUniformComponents = caps.maxShaderUniformComponents[ShaderType::Geometry];
232
mResources.MaxGeometryUniformBlocks = caps.maxShaderUniformBlocks[ShaderType::Geometry];
233
mResources.MaxGeometryInputComponents = caps.maxGeometryInputComponents;
234
mResources.MaxGeometryOutputComponents = caps.maxGeometryOutputComponents;
235
mResources.MaxGeometryOutputVertices = caps.maxGeometryOutputVertices;
236
mResources.MaxGeometryTotalOutputComponents = caps.maxGeometryTotalOutputComponents;
237
mResources.MaxGeometryTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Geometry];
238
239
mResources.MaxGeometryAtomicCounterBuffers =
240
caps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
241
mResources.MaxGeometryAtomicCounters = caps.maxShaderAtomicCounters[ShaderType::Geometry];
242
mResources.MaxGeometryShaderStorageBlocks = caps.maxShaderStorageBlocks[ShaderType::Geometry];
243
mResources.MaxGeometryShaderInvocations = caps.maxGeometryShaderInvocations;
244
mResources.MaxGeometryImageUniforms = caps.maxShaderImageUniforms[ShaderType::Geometry];
245
246
// Tessellation Shader constants
247
mResources.EXT_tessellation_shader = extensions.tessellationShaderEXT;
248
mResources.MaxTessControlInputComponents = caps.maxTessControlInputComponents;
249
mResources.MaxTessControlOutputComponents = caps.maxTessControlOutputComponents;
250
mResources.MaxTessControlTextureImageUnits =
251
caps.maxShaderTextureImageUnits[ShaderType::TessControl];
252
mResources.MaxTessControlUniformComponents =
253
caps.maxShaderUniformComponents[ShaderType::TessControl];
254
mResources.MaxTessControlTotalOutputComponents = caps.maxTessControlTotalOutputComponents;
255
mResources.MaxTessControlImageUniforms = caps.maxShaderImageUniforms[ShaderType::TessControl];
256
mResources.MaxTessControlAtomicCounters = caps.maxShaderAtomicCounters[ShaderType::TessControl];
257
mResources.MaxTessControlAtomicCounterBuffers =
258
caps.maxShaderAtomicCounterBuffers[ShaderType::TessControl];
259
260
mResources.MaxTessPatchComponents = caps.maxTessPatchComponents;
261
mResources.MaxPatchVertices = caps.maxPatchVertices;
262
mResources.MaxTessGenLevel = caps.maxTessGenLevel;
263
264
mResources.MaxTessEvaluationInputComponents = caps.maxTessEvaluationInputComponents;
265
mResources.MaxTessEvaluationOutputComponents = caps.maxTessEvaluationOutputComponents;
266
mResources.MaxTessEvaluationTextureImageUnits =
267
caps.maxShaderTextureImageUnits[ShaderType::TessEvaluation];
268
mResources.MaxTessEvaluationUniformComponents =
269
caps.maxShaderUniformComponents[ShaderType::TessEvaluation];
270
mResources.MaxTessEvaluationImageUniforms =
271
caps.maxShaderImageUniforms[ShaderType::TessEvaluation];
272
mResources.MaxTessEvaluationAtomicCounters =
273
caps.maxShaderAtomicCounters[ShaderType::TessEvaluation];
274
mResources.MaxTessEvaluationAtomicCounterBuffers =
275
caps.maxShaderAtomicCounterBuffers[ShaderType::TessEvaluation];
276
277
// Subpixel bits.
278
mResources.SubPixelBits = static_cast<int>(caps.subPixelBits);
279
280
// Direct-to-metal constants:
281
mResources.DriverUniformsBindingIndex = caps.driverUniformsBindingIndex;
282
mResources.DefaultUniformsBindingIndex = caps.defaultUniformsBindingIndex;
283
mResources.UBOArgumentBufferBindingIndex = caps.UBOArgumentBufferBindingIndex;
284
}
285
286
Compiler::~Compiler() = default;
287
288
void Compiler::onDestroy(const Context *context)
289
{
290
std::lock_guard<std::mutex> lock(context->getDisplay()->getDisplayGlobalMutex());
291
for (auto &pool : mPools)
292
{
293
for (ShCompilerInstance &instance : pool)
294
{
295
instance.destroy();
296
}
297
}
298
--gActiveCompilers;
299
if (gActiveCompilers == 0)
300
{
301
sh::Finalize();
302
}
303
}
304
305
ShCompilerInstance Compiler::getInstance(ShaderType type)
306
{
307
ASSERT(type != ShaderType::InvalidEnum);
308
auto &pool = mPools[type];
309
if (pool.empty())
310
{
311
ShHandle handle = sh::ConstructCompiler(ToGLenum(type), mSpec, mOutputType, &mResources);
312
ASSERT(handle);
313
return ShCompilerInstance(handle, mOutputType, type);
314
}
315
else
316
{
317
ShCompilerInstance instance = std::move(pool.back());
318
pool.pop_back();
319
return instance;
320
}
321
}
322
323
void Compiler::putInstance(ShCompilerInstance &&instance)
324
{
325
static constexpr size_t kMaxPoolSize = 32;
326
auto &pool = mPools[instance.getShaderType()];
327
if (pool.size() < kMaxPoolSize)
328
{
329
pool.push_back(std::move(instance));
330
}
331
else
332
{
333
instance.destroy();
334
}
335
}
336
337
ShCompilerInstance::ShCompilerInstance() : mHandle(nullptr) {}
338
339
ShCompilerInstance::ShCompilerInstance(ShHandle handle,
340
ShShaderOutput outputType,
341
ShaderType shaderType)
342
: mHandle(handle), mOutputType(outputType), mShaderType(shaderType)
343
{}
344
345
ShCompilerInstance::~ShCompilerInstance()
346
{
347
ASSERT(mHandle == nullptr);
348
}
349
350
void ShCompilerInstance::destroy()
351
{
352
if (mHandle != nullptr)
353
{
354
sh::Destruct(mHandle);
355
mHandle = nullptr;
356
}
357
}
358
359
ShCompilerInstance::ShCompilerInstance(ShCompilerInstance &&other)
360
: mHandle(other.mHandle), mOutputType(other.mOutputType), mShaderType(other.mShaderType)
361
{
362
other.mHandle = nullptr;
363
}
364
365
ShCompilerInstance &ShCompilerInstance::operator=(ShCompilerInstance &&other)
366
{
367
mHandle = other.mHandle;
368
mOutputType = other.mOutputType;
369
mShaderType = other.mShaderType;
370
other.mHandle = nullptr;
371
return *this;
372
}
373
374
ShHandle ShCompilerInstance::getHandle()
375
{
376
return mHandle;
377
}
378
379
ShaderType ShCompilerInstance::getShaderType() const
380
{
381
return mShaderType;
382
}
383
384
const std::string &ShCompilerInstance::getBuiltinResourcesString()
385
{
386
return sh::GetBuiltInResourcesString(mHandle);
387
}
388
389
ShShaderOutput ShCompilerInstance::getShaderOutputType() const
390
{
391
return mOutputType;
392
}
393
394
} // namespace gl
395
396