2
// Copyright 2019 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.
7
// Defines the class interface for ProgramMtl, implementing ProgramImpl.
10
#ifndef LIBANGLE_RENDERER_METAL_PROGRAMMTL_H_
11
#define LIBANGLE_RENDERER_METAL_PROGRAMMTL_H_
13
#import <Metal/Metal.h>
17
#include "common/Optional.h"
18
#include "common/utilities.h"
19
#include "libANGLE/renderer/ProgramImpl.h"
20
#include "libANGLE/renderer/glslang_wrapper_utils.h"
21
#include "libANGLE/renderer/metal/mtl_command_buffer.h"
22
#include "libANGLE/renderer/metal/mtl_resources.h"
23
#include "libANGLE/renderer/metal/mtl_state_cache.h"
29
class ProgramMtl : public ProgramImpl
32
ProgramMtl(const gl::ProgramState &state);
33
~ProgramMtl() override;
35
void destroy(const gl::Context *context) override;
37
std::unique_ptr<LinkEvent> load(const gl::Context *context,
38
gl::BinaryInputStream *stream,
39
gl::InfoLog &infoLog) override;
40
void save(const gl::Context *context, gl::BinaryOutputStream *stream) override;
41
void setBinaryRetrievableHint(bool retrievable) override;
42
void setSeparable(bool separable) override;
44
std::unique_ptr<LinkEvent> link(const gl::Context *context,
45
const gl::ProgramLinkedResources &resources,
46
gl::InfoLog &infoLog) override;
47
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
49
void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
50
void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override;
51
void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override;
52
void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override;
53
void setUniform1iv(GLint location, GLsizei count, const GLint *v) override;
54
void setUniform2iv(GLint location, GLsizei count, const GLint *v) override;
55
void setUniform3iv(GLint location, GLsizei count, const GLint *v) override;
56
void setUniform4iv(GLint location, GLsizei count, const GLint *v) override;
57
void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override;
58
void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override;
59
void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override;
60
void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override;
61
void setUniformMatrix2fv(GLint location,
64
const GLfloat *value) override;
65
void setUniformMatrix3fv(GLint location,
68
const GLfloat *value) override;
69
void setUniformMatrix4fv(GLint location,
72
const GLfloat *value) override;
73
void setUniformMatrix2x3fv(GLint location,
76
const GLfloat *value) override;
77
void setUniformMatrix3x2fv(GLint location,
80
const GLfloat *value) override;
81
void setUniformMatrix2x4fv(GLint location,
84
const GLfloat *value) override;
85
void setUniformMatrix4x2fv(GLint location,
88
const GLfloat *value) override;
89
void setUniformMatrix3x4fv(GLint location,
92
const GLfloat *value) override;
93
void setUniformMatrix4x3fv(GLint location,
96
const GLfloat *value) override;
98
void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override;
99
void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override;
100
void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override;
102
void setPathFragmentInputGen(const std::string &inputName,
105
const GLfloat *coeffs) override;
107
// Calls this before drawing, changedPipelineDesc is passed when vertex attributes desc and/or
108
// shader program changed.
109
angle::Result setupDraw(const gl::Context *glContext,
110
mtl::RenderCommandEncoder *cmdEncoder,
111
const Optional<mtl::RenderPipelineDesc> &changedPipelineDesc,
112
bool forceTexturesSetting);
115
template <int cols, int rows>
116
void setUniformMatrixfv(GLint location,
119
const GLfloat *value);
121
void getUniformImpl(GLint location, T *v, GLenum entryPointType) const;
123
template <typename T>
124
void setUniformImpl(GLint location, GLsizei count, const T *v, GLenum entryPointType);
126
angle::Result initDefaultUniformBlocks(const gl::Context *glContext);
128
angle::Result commitUniforms(ContextMtl *context, mtl::RenderCommandEncoder *cmdEncoder);
129
angle::Result updateTextures(const gl::Context *glContext,
130
mtl::RenderCommandEncoder *cmdEncoder,
133
void reset(ContextMtl *context);
134
void linkResources(const gl::ProgramLinkedResources &resources);
135
angle::Result linkImpl(const gl::Context *glContext, gl::InfoLog &infoLog);
136
angle::Result convertToMsl(const gl::Context *glContext,
137
gl::ShaderType shaderType,
138
gl::InfoLog &infoLog,
139
std::vector<uint32_t> *sprivCode);
141
angle::Result createMslShader(const gl::Context *glContext,
142
gl::ShaderType shaderType,
143
gl::InfoLog &infoLog,
144
const std::string &translatedSource);
146
// State for the default uniform blocks.
147
struct DefaultUniformBlock final : private angle::NonCopyable
149
DefaultUniformBlock();
150
~DefaultUniformBlock();
152
// Shadow copies of the shader uniform data.
153
angle::MemoryBuffer uniformData;
155
// Since the default blocks are laid out in std140, this tells us where to write on a call
156
// to a setUniform method. They are arranged in uniform location order.
157
std::vector<sh::BlockMemberInfo> uniformLayout;
160
gl::ShaderBitSet mDefaultUniformBlocksDirty;
161
gl::ShaderBitSet mSamplerBindingsDirty;
162
gl::ShaderMap<DefaultUniformBlock> mDefaultUniformBlocks;
164
// We keep the translated linked shader sources to use with shader draw call patching.
165
gl::ShaderMap<std::string> mShaderSource;
166
ShaderInterfaceVariableInfoMap mVariableInfoMap;
168
mtl::RenderPipelineCache mMetalRenderPipelineCache;
173
#endif /* LIBANGLE_RENDERER_METAL_PROGRAMMTL_H_ */