blob: 5a76acf26f5205b2617e5c0a10deb382c9b53c20 [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 Madill5deea722017-02-16 10:44:46 -050032
33 mLinkedFragmentModule.destroy(device);
34 mLinkedVertexModule.destroy(device);
35 mPipelineLayout.destroy(device);
36}
37
Jamie Madillc564c072017-06-01 12:45:42 -040038LinkResult ProgramVk::load(const gl::Context *contextImpl,
Jamie Madilla7d12dc2016-12-13 15:08:19 -050039 gl::InfoLog &infoLog,
40 gl::BinaryInputStream *stream)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040041{
42 UNIMPLEMENTED();
Jamie Madillb0a838b2016-11-13 20:02:12 -050043 return gl::Error(GL_INVALID_OPERATION);
Jamie Madill9e54b5a2016-05-25 12:57:39 -040044}
45
46gl::Error ProgramVk::save(gl::BinaryOutputStream *stream)
47{
48 UNIMPLEMENTED();
49 return gl::Error(GL_INVALID_OPERATION);
50}
51
52void ProgramVk::setBinaryRetrievableHint(bool retrievable)
53{
54 UNIMPLEMENTED();
55}
56
Yunchao He61afff12017-03-14 15:34:03 +080057void ProgramVk::setSeparable(bool separable)
58{
59 UNIMPLEMENTED();
60}
61
Jamie Madillc564c072017-06-01 12:45:42 -040062LinkResult ProgramVk::link(const gl::Context *glContext,
Jamie Madill192745a2016-12-22 15:58:21 -050063 const gl::VaryingPacking &packing,
64 gl::InfoLog &infoLog)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040065{
Jamie Madillc564c072017-06-01 12:45:42 -040066 ContextVk *context = GetImplAs<ContextVk>(glContext);
Jamie Madill8ecf7f92017-01-13 17:29:52 -050067 RendererVk *renderer = context->getRenderer();
68 GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper();
69
Jamie Madillbd044ed2017-06-05 12:59:21 -040070 const std::string &vertexSource =
71 mState.getAttachedVertexShader()->getTranslatedSource(glContext);
72 const std::string &fragmentSource =
73 mState.getAttachedFragmentShader()->getTranslatedSource(glContext);
Jamie Madill8ecf7f92017-01-13 17:29:52 -050074
75 std::vector<uint32_t> vertexCode;
76 std::vector<uint32_t> fragmentCode;
77 bool linkSuccess = false;
78 ANGLE_TRY_RESULT(
79 glslangWrapper->linkProgram(vertexSource, fragmentSource, &vertexCode, &fragmentCode),
80 linkSuccess);
81 if (!linkSuccess)
82 {
83 return false;
84 }
85
Jamie Madill5deea722017-02-16 10:44:46 -050086 vk::ShaderModule vertexModule;
87 vk::ShaderModule fragmentModule;
88 VkDevice device = renderer->getDevice();
Jamie Madill8ecf7f92017-01-13 17:29:52 -050089
90 {
91 VkShaderModuleCreateInfo vertexShaderInfo;
92 vertexShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
93 vertexShaderInfo.pNext = nullptr;
94 vertexShaderInfo.flags = 0;
95 vertexShaderInfo.codeSize = vertexCode.size() * sizeof(uint32_t);
96 vertexShaderInfo.pCode = vertexCode.data();
Jamie Madill5deea722017-02-16 10:44:46 -050097 ANGLE_TRY(vertexModule.init(device, vertexShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -050098 }
99
100 {
101 VkShaderModuleCreateInfo fragmentShaderInfo;
102 fragmentShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
103 fragmentShaderInfo.pNext = nullptr;
104 fragmentShaderInfo.flags = 0;
105 fragmentShaderInfo.codeSize = fragmentCode.size() * sizeof(uint32_t);
106 fragmentShaderInfo.pCode = fragmentCode.data();
107
Jamie Madill5deea722017-02-16 10:44:46 -0500108 ANGLE_TRY(fragmentModule.init(device, fragmentShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500109 }
110
Jamie Madill5deea722017-02-16 10:44:46 -0500111 mLinkedVertexModule.retain(device, std::move(vertexModule));
112 mLinkedFragmentModule.retain(device, std::move(fragmentModule));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500113
Jamie Madill72106562017-03-24 14:18:50 -0400114 // TODO(jmadill): Use pipeline cache.
115 context->invalidateCurrentPipeline();
116
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500117 return true;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400118}
119
120GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
121{
122 UNIMPLEMENTED();
123 return GLboolean();
124}
125
126void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
127{
128 UNIMPLEMENTED();
129}
130
131void ProgramVk::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
132{
133 UNIMPLEMENTED();
134}
135
136void ProgramVk::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
137{
138 UNIMPLEMENTED();
139}
140
141void ProgramVk::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
142{
143 UNIMPLEMENTED();
144}
145
146void ProgramVk::setUniform1iv(GLint location, GLsizei count, const GLint *v)
147{
148 UNIMPLEMENTED();
149}
150
151void ProgramVk::setUniform2iv(GLint location, GLsizei count, const GLint *v)
152{
153 UNIMPLEMENTED();
154}
155
156void ProgramVk::setUniform3iv(GLint location, GLsizei count, const GLint *v)
157{
158 UNIMPLEMENTED();
159}
160
161void ProgramVk::setUniform4iv(GLint location, GLsizei count, const GLint *v)
162{
163 UNIMPLEMENTED();
164}
165
166void ProgramVk::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
167{
168 UNIMPLEMENTED();
169}
170
171void ProgramVk::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
172{
173 UNIMPLEMENTED();
174}
175
176void ProgramVk::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
177{
178 UNIMPLEMENTED();
179}
180
181void ProgramVk::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
182{
183 UNIMPLEMENTED();
184}
185
186void ProgramVk::setUniformMatrix2fv(GLint location,
187 GLsizei count,
188 GLboolean transpose,
189 const GLfloat *value)
190{
191 UNIMPLEMENTED();
192}
193
194void ProgramVk::setUniformMatrix3fv(GLint location,
195 GLsizei count,
196 GLboolean transpose,
197 const GLfloat *value)
198{
199 UNIMPLEMENTED();
200}
201
202void ProgramVk::setUniformMatrix4fv(GLint location,
203 GLsizei count,
204 GLboolean transpose,
205 const GLfloat *value)
206{
207 UNIMPLEMENTED();
208}
209
210void ProgramVk::setUniformMatrix2x3fv(GLint location,
211 GLsizei count,
212 GLboolean transpose,
213 const GLfloat *value)
214{
215 UNIMPLEMENTED();
216}
217
218void ProgramVk::setUniformMatrix3x2fv(GLint location,
219 GLsizei count,
220 GLboolean transpose,
221 const GLfloat *value)
222{
223 UNIMPLEMENTED();
224}
225
226void ProgramVk::setUniformMatrix2x4fv(GLint location,
227 GLsizei count,
228 GLboolean transpose,
229 const GLfloat *value)
230{
231 UNIMPLEMENTED();
232}
233
234void ProgramVk::setUniformMatrix4x2fv(GLint location,
235 GLsizei count,
236 GLboolean transpose,
237 const GLfloat *value)
238{
239 UNIMPLEMENTED();
240}
241
242void ProgramVk::setUniformMatrix3x4fv(GLint location,
243 GLsizei count,
244 GLboolean transpose,
245 const GLfloat *value)
246{
247 UNIMPLEMENTED();
248}
249
250void ProgramVk::setUniformMatrix4x3fv(GLint location,
251 GLsizei count,
252 GLboolean transpose,
253 const GLfloat *value)
254{
255 UNIMPLEMENTED();
256}
257
258void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
259{
260 UNIMPLEMENTED();
261}
262
263bool ProgramVk::getUniformBlockSize(const std::string &blockName, size_t *sizeOut) const
264{
265 UNIMPLEMENTED();
266 return bool();
267}
268
269bool ProgramVk::getUniformBlockMemberInfo(const std::string &memberUniformName,
270 sh::BlockMemberInfo *memberInfoOut) const
271{
272 UNIMPLEMENTED();
273 return bool();
274}
275
Sami Väisänen46eaa942016-06-29 10:26:37 +0300276void ProgramVk::setPathFragmentInputGen(const std::string &inputName,
277 GLenum genMode,
278 GLint components,
279 const GLfloat *coeffs)
280{
281 UNIMPLEMENTED();
282}
283
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500284const vk::ShaderModule &ProgramVk::getLinkedVertexModule() const
285{
286 ASSERT(mLinkedVertexModule.getHandle() != VK_NULL_HANDLE);
287 return mLinkedVertexModule;
288}
289
290const vk::ShaderModule &ProgramVk::getLinkedFragmentModule() const
291{
292 ASSERT(mLinkedFragmentModule.getHandle() != VK_NULL_HANDLE);
293 return mLinkedFragmentModule;
294}
295
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500296gl::ErrorOrResult<vk::PipelineLayout *> ProgramVk::getPipelineLayout(VkDevice device)
297{
Jamie Madill5deea722017-02-16 10:44:46 -0500298 vk::PipelineLayout newLayout;
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500299
300 // TODO(jmadill): Descriptor sets.
301 VkPipelineLayoutCreateInfo createInfo;
302 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
303 createInfo.pNext = nullptr;
304 createInfo.flags = 0;
305 createInfo.setLayoutCount = 0;
306 createInfo.pSetLayouts = nullptr;
307 createInfo.pushConstantRangeCount = 0;
308 createInfo.pPushConstantRanges = nullptr;
309
Jamie Madill5deea722017-02-16 10:44:46 -0500310 ANGLE_TRY(newLayout.init(device, createInfo));
311 mPipelineLayout.retain(device, std::move(newLayout));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500312
313 return &mPipelineLayout;
314}
315
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400316} // namespace rx