1cb93a386Sopenharmony_ci//
2cb93a386Sopenharmony_ci// Copyright 2014 The ANGLE Project Authors. All rights reserved.
3cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be
4cb93a386Sopenharmony_ci// found in the LICENSE file.
5cb93a386Sopenharmony_ci//
6cb93a386Sopenharmony_ci
7cb93a386Sopenharmony_ci// Compiler.h: Defines the gl::Compiler class, abstracting the ESSL compiler
8cb93a386Sopenharmony_ci// that a GL context holds.
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#ifndef LIBANGLE_COMPILER_H_
11cb93a386Sopenharmony_ci#define LIBANGLE_COMPILER_H_
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_ci#include <vector>
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ci#include "GLSLANG/ShaderLang.h"
16cb93a386Sopenharmony_ci#include "common/PackedEnums.h"
17cb93a386Sopenharmony_ci#include "libANGLE/Error.h"
18cb93a386Sopenharmony_ci#include "libANGLE/RefCountObject.h"
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_cinamespace rx
21cb93a386Sopenharmony_ci{
22cb93a386Sopenharmony_ciclass CompilerImpl;
23cb93a386Sopenharmony_ciclass GLImplFactory;
24cb93a386Sopenharmony_ci}  // namespace rx
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_cinamespace gl
27cb93a386Sopenharmony_ci{
28cb93a386Sopenharmony_ciclass ShCompilerInstance;
29cb93a386Sopenharmony_ciclass State;
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ciclass Compiler final : public RefCountObjectNoID
32cb93a386Sopenharmony_ci{
33cb93a386Sopenharmony_ci  public:
34cb93a386Sopenharmony_ci    Compiler(rx::GLImplFactory *implFactory, const State &data, egl::Display *display);
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci    void onDestroy(const Context *context) override;
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ci    ShCompilerInstance getInstance(ShaderType shaderType);
39cb93a386Sopenharmony_ci    void putInstance(ShCompilerInstance &&instance);
40cb93a386Sopenharmony_ci    ShShaderOutput getShaderOutputType() const { return mOutputType; }
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ci  private:
43cb93a386Sopenharmony_ci    ~Compiler() override;
44cb93a386Sopenharmony_ci    std::unique_ptr<rx::CompilerImpl> mImplementation;
45cb93a386Sopenharmony_ci    ShShaderSpec mSpec;
46cb93a386Sopenharmony_ci    ShShaderOutput mOutputType;
47cb93a386Sopenharmony_ci    ShBuiltInResources mResources;
48cb93a386Sopenharmony_ci    ShaderMap<std::vector<ShCompilerInstance>> mPools;
49cb93a386Sopenharmony_ci};
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ciclass ShCompilerInstance final : public angle::NonCopyable
52cb93a386Sopenharmony_ci{
53cb93a386Sopenharmony_ci  public:
54cb93a386Sopenharmony_ci    ShCompilerInstance();
55cb93a386Sopenharmony_ci    ShCompilerInstance(ShHandle handle, ShShaderOutput outputType, ShaderType shaderType);
56cb93a386Sopenharmony_ci    ~ShCompilerInstance();
57cb93a386Sopenharmony_ci    void destroy();
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ci    ShCompilerInstance(ShCompilerInstance &&other);
60cb93a386Sopenharmony_ci    ShCompilerInstance &operator=(ShCompilerInstance &&other);
61cb93a386Sopenharmony_ci
62cb93a386Sopenharmony_ci    ShHandle getHandle();
63cb93a386Sopenharmony_ci    ShaderType getShaderType() const;
64cb93a386Sopenharmony_ci    const std::string &getBuiltinResourcesString();
65cb93a386Sopenharmony_ci    ShShaderOutput getShaderOutputType() const;
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_ci  private:
68cb93a386Sopenharmony_ci    ShHandle mHandle;
69cb93a386Sopenharmony_ci    ShShaderOutput mOutputType;
70cb93a386Sopenharmony_ci    ShaderType mShaderType;
71cb93a386Sopenharmony_ci};
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci}  // namespace gl
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ci#endif  // LIBANGLE_COMPILER_H_
76