xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/ProgramExecutableImpl.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2023 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 // ProgramExecutableImpl.h: Defines the abstract rx::ProgramExecutableImpl class.
8 
9 #ifndef LIBANGLE_RENDERER_PROGRAMEXECUTABLEIMPL_H_
10 #define LIBANGLE_RENDERER_PROGRAMEXECUTABLEIMPL_H_
11 
12 #include "common/angleutils.h"
13 
14 namespace gl
15 {
16 class Context;
17 class ProgramExecutable;
18 }  // namespace gl
19 
20 namespace rx
21 {
22 // ProgramExecutable holds the result of link.  The backend ProgramExecutable* classes similarly
23 // hold additonaly backend-specific link results.  A program's executable is changed on successful
24 // link.  This allows the program to continue to work with its existing executable despite a failed
25 // relink.
26 class ProgramExecutableImpl : angle::NonCopyable
27 {
28   public:
ProgramExecutableImpl(const gl::ProgramExecutable * executable)29     ProgramExecutableImpl(const gl::ProgramExecutable *executable) : mExecutable(executable) {}
~ProgramExecutableImpl()30     virtual ~ProgramExecutableImpl() {}
31 
destroy(const gl::Context * context)32     virtual void destroy(const gl::Context *context) {}
33 
34     virtual void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) = 0;
35     virtual void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) = 0;
36     virtual void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) = 0;
37     virtual void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) = 0;
38     virtual void setUniform1iv(GLint location, GLsizei count, const GLint *v)   = 0;
39     virtual void setUniform2iv(GLint location, GLsizei count, const GLint *v)   = 0;
40     virtual void setUniform3iv(GLint location, GLsizei count, const GLint *v)   = 0;
41     virtual void setUniform4iv(GLint location, GLsizei count, const GLint *v)   = 0;
42     virtual void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) = 0;
43     virtual void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) = 0;
44     virtual void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) = 0;
45     virtual void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) = 0;
46     virtual void setUniformMatrix2fv(GLint location,
47                                      GLsizei count,
48                                      GLboolean transpose,
49                                      const GLfloat *value)                      = 0;
50     virtual void setUniformMatrix3fv(GLint location,
51                                      GLsizei count,
52                                      GLboolean transpose,
53                                      const GLfloat *value)                      = 0;
54     virtual void setUniformMatrix4fv(GLint location,
55                                      GLsizei count,
56                                      GLboolean transpose,
57                                      const GLfloat *value)                      = 0;
58     virtual void setUniformMatrix2x3fv(GLint location,
59                                        GLsizei count,
60                                        GLboolean transpose,
61                                        const GLfloat *value)                    = 0;
62     virtual void setUniformMatrix3x2fv(GLint location,
63                                        GLsizei count,
64                                        GLboolean transpose,
65                                        const GLfloat *value)                    = 0;
66     virtual void setUniformMatrix2x4fv(GLint location,
67                                        GLsizei count,
68                                        GLboolean transpose,
69                                        const GLfloat *value)                    = 0;
70     virtual void setUniformMatrix4x2fv(GLint location,
71                                        GLsizei count,
72                                        GLboolean transpose,
73                                        const GLfloat *value)                    = 0;
74     virtual void setUniformMatrix3x4fv(GLint location,
75                                        GLsizei count,
76                                        GLboolean transpose,
77                                        const GLfloat *value)                    = 0;
78     virtual void setUniformMatrix4x3fv(GLint location,
79                                        GLsizei count,
80                                        GLboolean transpose,
81                                        const GLfloat *value)                    = 0;
82 
83     // Done in the back-end to avoid having to keep a system copy of uniform data.
84     virtual void getUniformfv(const gl::Context *context,
85                               GLint location,
86                               GLfloat *params) const                                           = 0;
87     virtual void getUniformiv(const gl::Context *context, GLint location, GLint *params) const = 0;
88     virtual void getUniformuiv(const gl::Context *context,
89                                GLint location,
90                                GLuint *params) const                                           = 0;
91     // Optional. Implement in backends that fill |postLinkSubTasksOut| in |LinkTask|.
waitForPostLinkTasks(const gl::Context * context)92     virtual void waitForPostLinkTasks(const gl::Context *context) { UNIMPLEMENTED(); }
getExecutable()93     const gl::ProgramExecutable *getExecutable() const { return mExecutable; }
94 
95   protected:
96     const gl::ProgramExecutable *mExecutable;
97 };
98 }  // namespace rx
99 
100 #endif  // LIBANGLE_RENDERER_PROGRAMEXECUTABLEIMPL_H_
101