blob: b0a06ddc61bed1c9555b10093aa1600133a2ee32 [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.cpp:
7// Implements the class methods for ProgramVk.
8//
9
10#include "libANGLE/renderer/vulkan/ProgramVk.h"
11
12#include "common/debug.h"
Jamie Madill8ecf7f92017-01-13 17:29:52 -050013#include "libANGLE/renderer/vulkan/ContextVk.h"
14#include "libANGLE/renderer/vulkan/GlslangWrapper.h"
15#include "libANGLE/renderer/vulkan/RendererVk.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040016
17namespace rx
18{
19
20ProgramVk::ProgramVk(const gl::ProgramState &state) : ProgramImpl(state)
21{
22}
23
24ProgramVk::~ProgramVk()
25{
26}
27
Jamie Madill5deea722017-02-16 10:44:46 -050028void ProgramVk::destroy(const ContextImpl *contextImpl)
29{
30 VkDevice device = GetAs<ContextVk>(contextImpl)->getDevice();
31
32 mLinkedFragmentModule.destroy(device);
33 mLinkedVertexModule.destroy(device);
34 mPipelineLayout.destroy(device);
35}
36
Jamie Madilla7d12dc2016-12-13 15:08:19 -050037LinkResult ProgramVk::load(const ContextImpl *contextImpl,
38 gl::InfoLog &infoLog,
39 gl::BinaryInputStream *stream)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040040{
41 UNIMPLEMENTED();
Jamie Madillb0a838b2016-11-13 20:02:12 -050042 return gl::Error(GL_INVALID_OPERATION);
Jamie Madill9e54b5a2016-05-25 12:57:39 -040043}
44
45gl::Error ProgramVk::save(gl::BinaryOutputStream *stream)
46{
47 UNIMPLEMENTED();
48 return gl::Error(GL_INVALID_OPERATION);
49}
50
51void ProgramVk::setBinaryRetrievableHint(bool retrievable)
52{
53 UNIMPLEMENTED();
54}
55
Yunchao He61afff12017-03-14 15:34:03 +080056void ProgramVk::setSeparable(bool separable)
57{
58 UNIMPLEMENTED();
59}
60
Jamie Madill8ecf7f92017-01-13 17:29:52 -050061LinkResult ProgramVk::link(ContextImpl *contextImpl,
Jamie Madill192745a2016-12-22 15:58:21 -050062 const gl::VaryingPacking &packing,
63 gl::InfoLog &infoLog)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040064{
Jamie Madill8ecf7f92017-01-13 17:29:52 -050065 ContextVk *context = GetAs<ContextVk>(contextImpl);
66 RendererVk *renderer = context->getRenderer();
67 GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper();
68
69 const std::string &vertexSource = mState.getAttachedVertexShader()->getTranslatedSource();
70 const std::string &fragmentSource = mState.getAttachedFragmentShader()->getTranslatedSource();
71
72 std::vector<uint32_t> vertexCode;
73 std::vector<uint32_t> fragmentCode;
74 bool linkSuccess = false;
75 ANGLE_TRY_RESULT(
76 glslangWrapper->linkProgram(vertexSource, fragmentSource, &vertexCode, &fragmentCode),
77 linkSuccess);
78 if (!linkSuccess)
79 {
80 return false;
81 }
82
Jamie Madill5deea722017-02-16 10:44:46 -050083 vk::ShaderModule vertexModule;
84 vk::ShaderModule fragmentModule;
85 VkDevice device = renderer->getDevice();
Jamie Madill8ecf7f92017-01-13 17:29:52 -050086
87 {
88 VkShaderModuleCreateInfo vertexShaderInfo;
89 vertexShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
90 vertexShaderInfo.pNext = nullptr;
91 vertexShaderInfo.flags = 0;
92 vertexShaderInfo.codeSize = vertexCode.size() * sizeof(uint32_t);
93 vertexShaderInfo.pCode = vertexCode.data();
Jamie Madill5deea722017-02-16 10:44:46 -050094 ANGLE_TRY(vertexModule.init(device, vertexShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -050095 }
96
97 {
98 VkShaderModuleCreateInfo fragmentShaderInfo;
99 fragmentShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
100 fragmentShaderInfo.pNext = nullptr;
101 fragmentShaderInfo.flags = 0;
102 fragmentShaderInfo.codeSize = fragmentCode.size() * sizeof(uint32_t);
103 fragmentShaderInfo.pCode = fragmentCode.data();
104
Jamie Madill5deea722017-02-16 10:44:46 -0500105 ANGLE_TRY(fragmentModule.init(device, fragmentShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500106 }
107
Jamie Madill5deea722017-02-16 10:44:46 -0500108 mLinkedVertexModule.retain(device, std::move(vertexModule));
109 mLinkedFragmentModule.retain(device, std::move(fragmentModule));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500110
111 return true;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400112}
113
114GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
115{
116 UNIMPLEMENTED();
117 return GLboolean();
118}
119
120void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
121{
122 UNIMPLEMENTED();
123}
124
125void ProgramVk::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
126{
127 UNIMPLEMENTED();
128}
129
130void ProgramVk::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
131{
132 UNIMPLEMENTED();
133}
134
135void ProgramVk::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
136{
137 UNIMPLEMENTED();
138}
139
140void ProgramVk::setUniform1iv(GLint location, GLsizei count, const GLint *v)
141{
142 UNIMPLEMENTED();
143}
144
145void ProgramVk::setUniform2iv(GLint location, GLsizei count, const GLint *v)
146{
147 UNIMPLEMENTED();
148}
149
150void ProgramVk::setUniform3iv(GLint location, GLsizei count, const GLint *v)
151{
152 UNIMPLEMENTED();
153}
154
155void ProgramVk::setUniform4iv(GLint location, GLsizei count, const GLint *v)
156{
157 UNIMPLEMENTED();
158}
159
160void ProgramVk::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
161{
162 UNIMPLEMENTED();
163}
164
165void ProgramVk::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
166{
167 UNIMPLEMENTED();
168}
169
170void ProgramVk::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
171{
172 UNIMPLEMENTED();
173}
174
175void ProgramVk::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
176{
177 UNIMPLEMENTED();
178}
179
180void ProgramVk::setUniformMatrix2fv(GLint location,
181 GLsizei count,
182 GLboolean transpose,
183 const GLfloat *value)
184{
185 UNIMPLEMENTED();
186}
187
188void ProgramVk::setUniformMatrix3fv(GLint location,
189 GLsizei count,
190 GLboolean transpose,
191 const GLfloat *value)
192{
193 UNIMPLEMENTED();
194}
195
196void ProgramVk::setUniformMatrix4fv(GLint location,
197 GLsizei count,
198 GLboolean transpose,
199 const GLfloat *value)
200{
201 UNIMPLEMENTED();
202}
203
204void ProgramVk::setUniformMatrix2x3fv(GLint location,
205 GLsizei count,
206 GLboolean transpose,
207 const GLfloat *value)
208{
209 UNIMPLEMENTED();
210}
211
212void ProgramVk::setUniformMatrix3x2fv(GLint location,
213 GLsizei count,
214 GLboolean transpose,
215 const GLfloat *value)
216{
217 UNIMPLEMENTED();
218}
219
220void ProgramVk::setUniformMatrix2x4fv(GLint location,
221 GLsizei count,
222 GLboolean transpose,
223 const GLfloat *value)
224{
225 UNIMPLEMENTED();
226}
227
228void ProgramVk::setUniformMatrix4x2fv(GLint location,
229 GLsizei count,
230 GLboolean transpose,
231 const GLfloat *value)
232{
233 UNIMPLEMENTED();
234}
235
236void ProgramVk::setUniformMatrix3x4fv(GLint location,
237 GLsizei count,
238 GLboolean transpose,
239 const GLfloat *value)
240{
241 UNIMPLEMENTED();
242}
243
244void ProgramVk::setUniformMatrix4x3fv(GLint location,
245 GLsizei count,
246 GLboolean transpose,
247 const GLfloat *value)
248{
249 UNIMPLEMENTED();
250}
251
252void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
253{
254 UNIMPLEMENTED();
255}
256
257bool ProgramVk::getUniformBlockSize(const std::string &blockName, size_t *sizeOut) const
258{
259 UNIMPLEMENTED();
260 return bool();
261}
262
263bool ProgramVk::getUniformBlockMemberInfo(const std::string &memberUniformName,
264 sh::BlockMemberInfo *memberInfoOut) const
265{
266 UNIMPLEMENTED();
267 return bool();
268}
269
Sami Väisänen46eaa942016-06-29 10:26:37 +0300270void ProgramVk::setPathFragmentInputGen(const std::string &inputName,
271 GLenum genMode,
272 GLint components,
273 const GLfloat *coeffs)
274{
275 UNIMPLEMENTED();
276}
277
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500278const vk::ShaderModule &ProgramVk::getLinkedVertexModule() const
279{
280 ASSERT(mLinkedVertexModule.getHandle() != VK_NULL_HANDLE);
281 return mLinkedVertexModule;
282}
283
284const vk::ShaderModule &ProgramVk::getLinkedFragmentModule() const
285{
286 ASSERT(mLinkedFragmentModule.getHandle() != VK_NULL_HANDLE);
287 return mLinkedFragmentModule;
288}
289
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500290gl::ErrorOrResult<vk::PipelineLayout *> ProgramVk::getPipelineLayout(VkDevice device)
291{
Jamie Madill5deea722017-02-16 10:44:46 -0500292 vk::PipelineLayout newLayout;
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500293
294 // TODO(jmadill): Descriptor sets.
295 VkPipelineLayoutCreateInfo createInfo;
296 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
297 createInfo.pNext = nullptr;
298 createInfo.flags = 0;
299 createInfo.setLayoutCount = 0;
300 createInfo.pSetLayouts = nullptr;
301 createInfo.pushConstantRangeCount = 0;
302 createInfo.pPushConstantRanges = nullptr;
303
Jamie Madill5deea722017-02-16 10:44:46 -0500304 ANGLE_TRY(newLayout.init(device, createInfo));
305 mPipelineLayout.retain(device, std::move(newLayout));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500306
307 return &mPipelineLayout;
308}
309
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400310} // namespace rx