blob: cd0af64319bd45107722bcbb8afa51ea72a728c7 [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 Madillc564c072017-06-01 12:45:42 -040013#include "libANGLE/Context.h"
Jamie Madill8ecf7f92017-01-13 17:29:52 -050014#include "libANGLE/renderer/vulkan/ContextVk.h"
15#include "libANGLE/renderer/vulkan/GlslangWrapper.h"
16#include "libANGLE/renderer/vulkan/RendererVk.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040017
18namespace rx
19{
20
21ProgramVk::ProgramVk(const gl::ProgramState &state) : ProgramImpl(state)
22{
23}
24
25ProgramVk::~ProgramVk()
26{
27}
28
Jamie Madillc564c072017-06-01 12:45:42 -040029void ProgramVk::destroy(const gl::Context *contextImpl)
Jamie Madill5deea722017-02-16 10:44:46 -050030{
Jamie Madillc564c072017-06-01 12:45:42 -040031 VkDevice device = GetImplAs<ContextVk>(contextImpl)->getDevice();
Jamie Madillc5143482017-10-15 20:20:06 -040032 reset(device);
33}
Jamie Madill5deea722017-02-16 10:44:46 -050034
Jamie Madillc5143482017-10-15 20:20:06 -040035void ProgramVk::reset(VkDevice device)
36{
Jamie Madill5deea722017-02-16 10:44:46 -050037 mLinkedFragmentModule.destroy(device);
38 mLinkedVertexModule.destroy(device);
39 mPipelineLayout.destroy(device);
40}
41
Jamie Madill9cf9e872017-06-05 12:59:25 -040042gl::LinkResult ProgramVk::load(const gl::Context *contextImpl,
43 gl::InfoLog &infoLog,
44 gl::BinaryInputStream *stream)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040045{
46 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -050047 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -040048}
49
Jamie Madill27a60632017-06-30 15:12:01 -040050void ProgramVk::save(const gl::Context *context, gl::BinaryOutputStream *stream)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040051{
52 UNIMPLEMENTED();
Jamie Madill9e54b5a2016-05-25 12:57:39 -040053}
54
55void ProgramVk::setBinaryRetrievableHint(bool retrievable)
56{
57 UNIMPLEMENTED();
58}
59
Yunchao He61afff12017-03-14 15:34:03 +080060void ProgramVk::setSeparable(bool separable)
61{
62 UNIMPLEMENTED();
63}
64
Jamie Madill9cf9e872017-06-05 12:59:25 -040065gl::LinkResult ProgramVk::link(const gl::Context *glContext,
66 const gl::VaryingPacking &packing,
67 gl::InfoLog &infoLog)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040068{
Jamie Madillc5143482017-10-15 20:20:06 -040069 ContextVk *contextVk = GetImplAs<ContextVk>(glContext);
70 RendererVk *renderer = contextVk->getRenderer();
Jamie Madill8ecf7f92017-01-13 17:29:52 -050071 GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper();
Jamie Madillc5143482017-10-15 20:20:06 -040072 VkDevice device = renderer->getDevice();
73
74 reset(device);
Jamie Madill8ecf7f92017-01-13 17:29:52 -050075
Jamie Madill8ecf7f92017-01-13 17:29:52 -050076 std::vector<uint32_t> vertexCode;
77 std::vector<uint32_t> fragmentCode;
78 bool linkSuccess = false;
Jamie Madill2a9e1072017-09-22 11:31:57 -040079 ANGLE_TRY_RESULT(glslangWrapper->linkProgram(glContext, mState, &vertexCode, &fragmentCode),
80 linkSuccess);
Jamie Madill8ecf7f92017-01-13 17:29:52 -050081 if (!linkSuccess)
82 {
83 return false;
84 }
85
Jamie Madill8ecf7f92017-01-13 17:29:52 -050086 {
87 VkShaderModuleCreateInfo vertexShaderInfo;
88 vertexShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
89 vertexShaderInfo.pNext = nullptr;
90 vertexShaderInfo.flags = 0;
91 vertexShaderInfo.codeSize = vertexCode.size() * sizeof(uint32_t);
92 vertexShaderInfo.pCode = vertexCode.data();
Jamie Madillc5143482017-10-15 20:20:06 -040093
94 ANGLE_TRY(mLinkedVertexModule.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 Madillc5143482017-10-15 20:20:06 -0400105 ANGLE_TRY(mLinkedFragmentModule.init(device, fragmentShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500106 }
107
Jamie Madillc5143482017-10-15 20:20:06 -0400108 ANGLE_TRY(initPipelineLayout(contextVk));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500109
110 return true;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400111}
112
113GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
114{
115 UNIMPLEMENTED();
116 return GLboolean();
117}
118
119void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
120{
121 UNIMPLEMENTED();
122}
123
124void ProgramVk::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
125{
126 UNIMPLEMENTED();
127}
128
129void ProgramVk::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
130{
131 UNIMPLEMENTED();
132}
133
134void ProgramVk::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
135{
136 UNIMPLEMENTED();
137}
138
139void ProgramVk::setUniform1iv(GLint location, GLsizei count, const GLint *v)
140{
141 UNIMPLEMENTED();
142}
143
144void ProgramVk::setUniform2iv(GLint location, GLsizei count, const GLint *v)
145{
146 UNIMPLEMENTED();
147}
148
149void ProgramVk::setUniform3iv(GLint location, GLsizei count, const GLint *v)
150{
151 UNIMPLEMENTED();
152}
153
154void ProgramVk::setUniform4iv(GLint location, GLsizei count, const GLint *v)
155{
156 UNIMPLEMENTED();
157}
158
159void ProgramVk::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
160{
161 UNIMPLEMENTED();
162}
163
164void ProgramVk::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
165{
166 UNIMPLEMENTED();
167}
168
169void ProgramVk::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
170{
171 UNIMPLEMENTED();
172}
173
174void ProgramVk::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
175{
176 UNIMPLEMENTED();
177}
178
179void ProgramVk::setUniformMatrix2fv(GLint location,
180 GLsizei count,
181 GLboolean transpose,
182 const GLfloat *value)
183{
184 UNIMPLEMENTED();
185}
186
187void ProgramVk::setUniformMatrix3fv(GLint location,
188 GLsizei count,
189 GLboolean transpose,
190 const GLfloat *value)
191{
192 UNIMPLEMENTED();
193}
194
195void ProgramVk::setUniformMatrix4fv(GLint location,
196 GLsizei count,
197 GLboolean transpose,
198 const GLfloat *value)
199{
200 UNIMPLEMENTED();
201}
202
203void ProgramVk::setUniformMatrix2x3fv(GLint location,
204 GLsizei count,
205 GLboolean transpose,
206 const GLfloat *value)
207{
208 UNIMPLEMENTED();
209}
210
211void ProgramVk::setUniformMatrix3x2fv(GLint location,
212 GLsizei count,
213 GLboolean transpose,
214 const GLfloat *value)
215{
216 UNIMPLEMENTED();
217}
218
219void ProgramVk::setUniformMatrix2x4fv(GLint location,
220 GLsizei count,
221 GLboolean transpose,
222 const GLfloat *value)
223{
224 UNIMPLEMENTED();
225}
226
227void ProgramVk::setUniformMatrix4x2fv(GLint location,
228 GLsizei count,
229 GLboolean transpose,
230 const GLfloat *value)
231{
232 UNIMPLEMENTED();
233}
234
235void ProgramVk::setUniformMatrix3x4fv(GLint location,
236 GLsizei count,
237 GLboolean transpose,
238 const GLfloat *value)
239{
240 UNIMPLEMENTED();
241}
242
243void ProgramVk::setUniformMatrix4x3fv(GLint location,
244 GLsizei count,
245 GLboolean transpose,
246 const GLfloat *value)
247{
248 UNIMPLEMENTED();
249}
250
251void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
252{
253 UNIMPLEMENTED();
254}
255
Olli Etuaho855d9642017-05-17 14:05:06 +0300256bool ProgramVk::getUniformBlockSize(const std::string &blockName,
257 const std::string &blockMappedName,
258 size_t *sizeOut) const
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400259{
260 UNIMPLEMENTED();
261 return bool();
262}
263
264bool ProgramVk::getUniformBlockMemberInfo(const std::string &memberUniformName,
Olli Etuaho855d9642017-05-17 14:05:06 +0300265 const std::string &memberUniformMappedName,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400266 sh::BlockMemberInfo *memberInfoOut) const
267{
268 UNIMPLEMENTED();
269 return bool();
270}
271
Sami Väisänen46eaa942016-06-29 10:26:37 +0300272void ProgramVk::setPathFragmentInputGen(const std::string &inputName,
273 GLenum genMode,
274 GLint components,
275 const GLfloat *coeffs)
276{
277 UNIMPLEMENTED();
278}
279
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500280const vk::ShaderModule &ProgramVk::getLinkedVertexModule() const
281{
282 ASSERT(mLinkedVertexModule.getHandle() != VK_NULL_HANDLE);
283 return mLinkedVertexModule;
284}
285
286const vk::ShaderModule &ProgramVk::getLinkedFragmentModule() const
287{
288 ASSERT(mLinkedFragmentModule.getHandle() != VK_NULL_HANDLE);
289 return mLinkedFragmentModule;
290}
291
Jamie Madillc5143482017-10-15 20:20:06 -0400292const vk::PipelineLayout &ProgramVk::getPipelineLayout() const
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500293{
Jamie Madillc5143482017-10-15 20:20:06 -0400294 return mPipelineLayout;
295}
296
297vk::Error ProgramVk::initPipelineLayout(ContextVk *context)
298{
299 ASSERT(!mPipelineLayout.valid());
300
301 VkDevice device = context->getDevice();
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500302
303 // TODO(jmadill): Descriptor sets.
304 VkPipelineLayoutCreateInfo createInfo;
305 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
306 createInfo.pNext = nullptr;
307 createInfo.flags = 0;
308 createInfo.setLayoutCount = 0;
309 createInfo.pSetLayouts = nullptr;
310 createInfo.pushConstantRangeCount = 0;
311 createInfo.pPushConstantRanges = nullptr;
312
Jamie Madillc5143482017-10-15 20:20:06 -0400313 ANGLE_TRY(mPipelineLayout.init(device, createInfo));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500314
Jamie Madillc5143482017-10-15 20:20:06 -0400315 return vk::NoError();
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500316}
317
Jamie Madill54164b02017-08-28 15:17:37 -0400318void ProgramVk::getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const
319{
320 UNIMPLEMENTED();
321}
322
323void ProgramVk::getUniformiv(const gl::Context *context, GLint location, GLint *params) const
324{
325 UNIMPLEMENTED();
326}
327
328void ProgramVk::getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const
329{
330 UNIMPLEMENTED();
331}
332
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400333} // namespace rx