blob: 50550c77997178d2712c5f1ceb79b5ff99015d9a [file] [log] [blame]
Jamie Madill9e54b5a2016-05-25 12:57:39 -04001//
2// Copyright 2016 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// ProgramVk.h:
7// Defines the class interface for ProgramVk, implementing ProgramImpl.
8//
9
10#ifndef LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_
11#define LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_
12
13#include "libANGLE/renderer/ProgramImpl.h"
Jamie Madill8ecf7f92017-01-13 17:29:52 -050014#include "libANGLE/renderer/vulkan/renderervk_utils.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040015
16namespace rx
17{
18
19class ProgramVk : public ProgramImpl
20{
21 public:
22 ProgramVk(const gl::ProgramState &state);
23 ~ProgramVk() override;
Jamie Madillc564c072017-06-01 12:45:42 -040024 void destroy(const gl::Context *context) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040025
Jamie Madill9cf9e872017-06-05 12:59:25 -040026 gl::LinkResult load(const gl::Context *context,
27 gl::InfoLog &infoLog,
28 gl::BinaryInputStream *stream) override;
Jamie Madill27a60632017-06-30 15:12:01 -040029 void save(const gl::Context *context, gl::BinaryOutputStream *stream) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040030 void setBinaryRetrievableHint(bool retrievable) override;
Yunchao He61afff12017-03-14 15:34:03 +080031 void setSeparable(bool separable) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040032
Jamie Madill9cf9e872017-06-05 12:59:25 -040033 gl::LinkResult link(const gl::Context *context,
34 const gl::VaryingPacking &packing,
35 gl::InfoLog &infoLog) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040036 GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
37
38 void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
39 void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override;
40 void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override;
41 void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override;
42 void setUniform1iv(GLint location, GLsizei count, const GLint *v) override;
43 void setUniform2iv(GLint location, GLsizei count, const GLint *v) override;
44 void setUniform3iv(GLint location, GLsizei count, const GLint *v) override;
45 void setUniform4iv(GLint location, GLsizei count, const GLint *v) override;
46 void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override;
47 void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override;
48 void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override;
49 void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override;
50 void setUniformMatrix2fv(GLint location,
51 GLsizei count,
52 GLboolean transpose,
53 const GLfloat *value) override;
54 void setUniformMatrix3fv(GLint location,
55 GLsizei count,
56 GLboolean transpose,
57 const GLfloat *value) override;
58 void setUniformMatrix4fv(GLint location,
59 GLsizei count,
60 GLboolean transpose,
61 const GLfloat *value) override;
62 void setUniformMatrix2x3fv(GLint location,
63 GLsizei count,
64 GLboolean transpose,
65 const GLfloat *value) override;
66 void setUniformMatrix3x2fv(GLint location,
67 GLsizei count,
68 GLboolean transpose,
69 const GLfloat *value) override;
70 void setUniformMatrix2x4fv(GLint location,
71 GLsizei count,
72 GLboolean transpose,
73 const GLfloat *value) override;
74 void setUniformMatrix4x2fv(GLint location,
75 GLsizei count,
76 GLboolean transpose,
77 const GLfloat *value) override;
78 void setUniformMatrix3x4fv(GLint location,
79 GLsizei count,
80 GLboolean transpose,
81 const GLfloat *value) override;
82 void setUniformMatrix4x3fv(GLint location,
83 GLsizei count,
84 GLboolean transpose,
85 const GLfloat *value) override;
86
Jamie Madill54164b02017-08-28 15:17:37 -040087 void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override;
88 void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override;
89 void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override;
90
Jamie Madill9e54b5a2016-05-25 12:57:39 -040091 // TODO: synchronize in syncState when dirty bits exist.
92 void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override;
93
94 // May only be called after a successful link operation.
95 // Return false for inactive blocks.
96 bool getUniformBlockSize(const std::string &blockName, size_t *sizeOut) const override;
97
98 // May only be called after a successful link operation.
99 // Returns false for inactive members.
100 bool getUniformBlockMemberInfo(const std::string &memberUniformName,
101 sh::BlockMemberInfo *memberInfoOut) const override;
Sami Väisänen46eaa942016-06-29 10:26:37 +0300102
103 void setPathFragmentInputGen(const std::string &inputName,
104 GLenum genMode,
105 GLint components,
106 const GLfloat *coeffs) override;
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500107
108 const vk::ShaderModule &getLinkedVertexModule() const;
109 const vk::ShaderModule &getLinkedFragmentModule() const;
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500110 gl::ErrorOrResult<vk::PipelineLayout *> getPipelineLayout(VkDevice device);
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500111
112 private:
113 vk::ShaderModule mLinkedVertexModule;
114 vk::ShaderModule mLinkedFragmentModule;
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500115 vk::PipelineLayout mPipelineLayout;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400116};
117
118} // namespace rx
119
120#endif // LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_