blob: 6e53883df8157ac8422ec8ea7b7f880dccbe7cb3 [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
Jamie Madill72106562017-03-24 14:18:50 -0400111 // TODO(jmadill): Use pipeline cache.
112 context->invalidateCurrentPipeline();
113
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500114 return true;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400115}
116
117GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
118{
119 UNIMPLEMENTED();
120 return GLboolean();
121}
122
123void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
124{
125 UNIMPLEMENTED();
126}
127
128void ProgramVk::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
129{
130 UNIMPLEMENTED();
131}
132
133void ProgramVk::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
134{
135 UNIMPLEMENTED();
136}
137
138void ProgramVk::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
139{
140 UNIMPLEMENTED();
141}
142
143void ProgramVk::setUniform1iv(GLint location, GLsizei count, const GLint *v)
144{
145 UNIMPLEMENTED();
146}
147
148void ProgramVk::setUniform2iv(GLint location, GLsizei count, const GLint *v)
149{
150 UNIMPLEMENTED();
151}
152
153void ProgramVk::setUniform3iv(GLint location, GLsizei count, const GLint *v)
154{
155 UNIMPLEMENTED();
156}
157
158void ProgramVk::setUniform4iv(GLint location, GLsizei count, const GLint *v)
159{
160 UNIMPLEMENTED();
161}
162
163void ProgramVk::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
164{
165 UNIMPLEMENTED();
166}
167
168void ProgramVk::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
169{
170 UNIMPLEMENTED();
171}
172
173void ProgramVk::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
174{
175 UNIMPLEMENTED();
176}
177
178void ProgramVk::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
179{
180 UNIMPLEMENTED();
181}
182
183void ProgramVk::setUniformMatrix2fv(GLint location,
184 GLsizei count,
185 GLboolean transpose,
186 const GLfloat *value)
187{
188 UNIMPLEMENTED();
189}
190
191void ProgramVk::setUniformMatrix3fv(GLint location,
192 GLsizei count,
193 GLboolean transpose,
194 const GLfloat *value)
195{
196 UNIMPLEMENTED();
197}
198
199void ProgramVk::setUniformMatrix4fv(GLint location,
200 GLsizei count,
201 GLboolean transpose,
202 const GLfloat *value)
203{
204 UNIMPLEMENTED();
205}
206
207void ProgramVk::setUniformMatrix2x3fv(GLint location,
208 GLsizei count,
209 GLboolean transpose,
210 const GLfloat *value)
211{
212 UNIMPLEMENTED();
213}
214
215void ProgramVk::setUniformMatrix3x2fv(GLint location,
216 GLsizei count,
217 GLboolean transpose,
218 const GLfloat *value)
219{
220 UNIMPLEMENTED();
221}
222
223void ProgramVk::setUniformMatrix2x4fv(GLint location,
224 GLsizei count,
225 GLboolean transpose,
226 const GLfloat *value)
227{
228 UNIMPLEMENTED();
229}
230
231void ProgramVk::setUniformMatrix4x2fv(GLint location,
232 GLsizei count,
233 GLboolean transpose,
234 const GLfloat *value)
235{
236 UNIMPLEMENTED();
237}
238
239void ProgramVk::setUniformMatrix3x4fv(GLint location,
240 GLsizei count,
241 GLboolean transpose,
242 const GLfloat *value)
243{
244 UNIMPLEMENTED();
245}
246
247void ProgramVk::setUniformMatrix4x3fv(GLint location,
248 GLsizei count,
249 GLboolean transpose,
250 const GLfloat *value)
251{
252 UNIMPLEMENTED();
253}
254
255void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
256{
257 UNIMPLEMENTED();
258}
259
260bool ProgramVk::getUniformBlockSize(const std::string &blockName, size_t *sizeOut) const
261{
262 UNIMPLEMENTED();
263 return bool();
264}
265
266bool ProgramVk::getUniformBlockMemberInfo(const std::string &memberUniformName,
267 sh::BlockMemberInfo *memberInfoOut) const
268{
269 UNIMPLEMENTED();
270 return bool();
271}
272
Sami Väisänen46eaa942016-06-29 10:26:37 +0300273void ProgramVk::setPathFragmentInputGen(const std::string &inputName,
274 GLenum genMode,
275 GLint components,
276 const GLfloat *coeffs)
277{
278 UNIMPLEMENTED();
279}
280
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500281const vk::ShaderModule &ProgramVk::getLinkedVertexModule() const
282{
283 ASSERT(mLinkedVertexModule.getHandle() != VK_NULL_HANDLE);
284 return mLinkedVertexModule;
285}
286
287const vk::ShaderModule &ProgramVk::getLinkedFragmentModule() const
288{
289 ASSERT(mLinkedFragmentModule.getHandle() != VK_NULL_HANDLE);
290 return mLinkedFragmentModule;
291}
292
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500293gl::ErrorOrResult<vk::PipelineLayout *> ProgramVk::getPipelineLayout(VkDevice device)
294{
Jamie Madill5deea722017-02-16 10:44:46 -0500295 vk::PipelineLayout newLayout;
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500296
297 // TODO(jmadill): Descriptor sets.
298 VkPipelineLayoutCreateInfo createInfo;
299 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
300 createInfo.pNext = nullptr;
301 createInfo.flags = 0;
302 createInfo.setLayoutCount = 0;
303 createInfo.pSetLayouts = nullptr;
304 createInfo.pushConstantRangeCount = 0;
305 createInfo.pPushConstantRanges = nullptr;
306
Jamie Madill5deea722017-02-16 10:44:46 -0500307 ANGLE_TRY(newLayout.init(device, createInfo));
308 mPipelineLayout.retain(device, std::move(newLayout));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500309
310 return &mPipelineLayout;
311}
312
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400313} // namespace rx