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