blob: d9767da459f0d03dde06dbed32d23d28c79f16a5 [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
Jamie Madill8ecf7f92017-01-13 17:29:52 -050056LinkResult ProgramVk::link(ContextImpl *contextImpl,
Jamie Madill192745a2016-12-22 15:58:21 -050057 const gl::VaryingPacking &packing,
58 gl::InfoLog &infoLog)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040059{
Jamie Madill8ecf7f92017-01-13 17:29:52 -050060 ContextVk *context = GetAs<ContextVk>(contextImpl);
61 RendererVk *renderer = context->getRenderer();
62 GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper();
63
64 const std::string &vertexSource = mState.getAttachedVertexShader()->getTranslatedSource();
65 const std::string &fragmentSource = mState.getAttachedFragmentShader()->getTranslatedSource();
66
67 std::vector<uint32_t> vertexCode;
68 std::vector<uint32_t> fragmentCode;
69 bool linkSuccess = false;
70 ANGLE_TRY_RESULT(
71 glslangWrapper->linkProgram(vertexSource, fragmentSource, &vertexCode, &fragmentCode),
72 linkSuccess);
73 if (!linkSuccess)
74 {
75 return false;
76 }
77
Jamie Madill5deea722017-02-16 10:44:46 -050078 vk::ShaderModule vertexModule;
79 vk::ShaderModule fragmentModule;
80 VkDevice device = renderer->getDevice();
Jamie Madill8ecf7f92017-01-13 17:29:52 -050081
82 {
83 VkShaderModuleCreateInfo vertexShaderInfo;
84 vertexShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
85 vertexShaderInfo.pNext = nullptr;
86 vertexShaderInfo.flags = 0;
87 vertexShaderInfo.codeSize = vertexCode.size() * sizeof(uint32_t);
88 vertexShaderInfo.pCode = vertexCode.data();
Jamie Madill5deea722017-02-16 10:44:46 -050089 ANGLE_TRY(vertexModule.init(device, vertexShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -050090 }
91
92 {
93 VkShaderModuleCreateInfo fragmentShaderInfo;
94 fragmentShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
95 fragmentShaderInfo.pNext = nullptr;
96 fragmentShaderInfo.flags = 0;
97 fragmentShaderInfo.codeSize = fragmentCode.size() * sizeof(uint32_t);
98 fragmentShaderInfo.pCode = fragmentCode.data();
99
Jamie Madill5deea722017-02-16 10:44:46 -0500100 ANGLE_TRY(fragmentModule.init(device, fragmentShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500101 }
102
Jamie Madill5deea722017-02-16 10:44:46 -0500103 mLinkedVertexModule.retain(device, std::move(vertexModule));
104 mLinkedFragmentModule.retain(device, std::move(fragmentModule));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500105
106 return true;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400107}
108
109GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
110{
111 UNIMPLEMENTED();
112 return GLboolean();
113}
114
115void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
116{
117 UNIMPLEMENTED();
118}
119
120void ProgramVk::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
121{
122 UNIMPLEMENTED();
123}
124
125void ProgramVk::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
126{
127 UNIMPLEMENTED();
128}
129
130void ProgramVk::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
131{
132 UNIMPLEMENTED();
133}
134
135void ProgramVk::setUniform1iv(GLint location, GLsizei count, const GLint *v)
136{
137 UNIMPLEMENTED();
138}
139
140void ProgramVk::setUniform2iv(GLint location, GLsizei count, const GLint *v)
141{
142 UNIMPLEMENTED();
143}
144
145void ProgramVk::setUniform3iv(GLint location, GLsizei count, const GLint *v)
146{
147 UNIMPLEMENTED();
148}
149
150void ProgramVk::setUniform4iv(GLint location, GLsizei count, const GLint *v)
151{
152 UNIMPLEMENTED();
153}
154
155void ProgramVk::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
156{
157 UNIMPLEMENTED();
158}
159
160void ProgramVk::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
161{
162 UNIMPLEMENTED();
163}
164
165void ProgramVk::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
166{
167 UNIMPLEMENTED();
168}
169
170void ProgramVk::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
171{
172 UNIMPLEMENTED();
173}
174
175void ProgramVk::setUniformMatrix2fv(GLint location,
176 GLsizei count,
177 GLboolean transpose,
178 const GLfloat *value)
179{
180 UNIMPLEMENTED();
181}
182
183void ProgramVk::setUniformMatrix3fv(GLint location,
184 GLsizei count,
185 GLboolean transpose,
186 const GLfloat *value)
187{
188 UNIMPLEMENTED();
189}
190
191void ProgramVk::setUniformMatrix4fv(GLint location,
192 GLsizei count,
193 GLboolean transpose,
194 const GLfloat *value)
195{
196 UNIMPLEMENTED();
197}
198
199void ProgramVk::setUniformMatrix2x3fv(GLint location,
200 GLsizei count,
201 GLboolean transpose,
202 const GLfloat *value)
203{
204 UNIMPLEMENTED();
205}
206
207void ProgramVk::setUniformMatrix3x2fv(GLint location,
208 GLsizei count,
209 GLboolean transpose,
210 const GLfloat *value)
211{
212 UNIMPLEMENTED();
213}
214
215void ProgramVk::setUniformMatrix2x4fv(GLint location,
216 GLsizei count,
217 GLboolean transpose,
218 const GLfloat *value)
219{
220 UNIMPLEMENTED();
221}
222
223void ProgramVk::setUniformMatrix4x2fv(GLint location,
224 GLsizei count,
225 GLboolean transpose,
226 const GLfloat *value)
227{
228 UNIMPLEMENTED();
229}
230
231void ProgramVk::setUniformMatrix3x4fv(GLint location,
232 GLsizei count,
233 GLboolean transpose,
234 const GLfloat *value)
235{
236 UNIMPLEMENTED();
237}
238
239void ProgramVk::setUniformMatrix4x3fv(GLint location,
240 GLsizei count,
241 GLboolean transpose,
242 const GLfloat *value)
243{
244 UNIMPLEMENTED();
245}
246
247void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
248{
249 UNIMPLEMENTED();
250}
251
252bool ProgramVk::getUniformBlockSize(const std::string &blockName, size_t *sizeOut) const
253{
254 UNIMPLEMENTED();
255 return bool();
256}
257
258bool ProgramVk::getUniformBlockMemberInfo(const std::string &memberUniformName,
259 sh::BlockMemberInfo *memberInfoOut) const
260{
261 UNIMPLEMENTED();
262 return bool();
263}
264
Sami Väisänen46eaa942016-06-29 10:26:37 +0300265void ProgramVk::setPathFragmentInputGen(const std::string &inputName,
266 GLenum genMode,
267 GLint components,
268 const GLfloat *coeffs)
269{
270 UNIMPLEMENTED();
271}
272
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500273const vk::ShaderModule &ProgramVk::getLinkedVertexModule() const
274{
275 ASSERT(mLinkedVertexModule.getHandle() != VK_NULL_HANDLE);
276 return mLinkedVertexModule;
277}
278
279const vk::ShaderModule &ProgramVk::getLinkedFragmentModule() const
280{
281 ASSERT(mLinkedFragmentModule.getHandle() != VK_NULL_HANDLE);
282 return mLinkedFragmentModule;
283}
284
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500285gl::ErrorOrResult<vk::PipelineLayout *> ProgramVk::getPipelineLayout(VkDevice device)
286{
Jamie Madill5deea722017-02-16 10:44:46 -0500287 vk::PipelineLayout newLayout;
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500288
289 // TODO(jmadill): Descriptor sets.
290 VkPipelineLayoutCreateInfo createInfo;
291 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
292 createInfo.pNext = nullptr;
293 createInfo.flags = 0;
294 createInfo.setLayoutCount = 0;
295 createInfo.pSetLayouts = nullptr;
296 createInfo.pushConstantRangeCount = 0;
297 createInfo.pPushConstantRanges = nullptr;
298
Jamie Madill5deea722017-02-16 10:44:46 -0500299 ANGLE_TRY(newLayout.init(device, createInfo));
300 mPipelineLayout.retain(device, std::move(newLayout));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500301
302 return &mPipelineLayout;
303}
304
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400305} // namespace rx