blob: f8382ea041d7e3d880a86024d66bcf389f0415ed [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 Madill9cf9e872017-06-05 12:59:25 -040038gl::LinkResult ProgramVk::load(const gl::Context *contextImpl,
39 gl::InfoLog &infoLog,
40 gl::BinaryInputStream *stream)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040041{
42 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -050043 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -040044}
45
Jamie Madill27a60632017-06-30 15:12:01 -040046void ProgramVk::save(const gl::Context *context, gl::BinaryOutputStream *stream)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040047{
48 UNIMPLEMENTED();
Jamie Madill9e54b5a2016-05-25 12:57:39 -040049}
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 Madill9cf9e872017-06-05 12:59:25 -040061gl::LinkResult ProgramVk::link(const gl::Context *glContext,
62 const gl::VaryingPacking &packing,
63 gl::InfoLog &infoLog)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040064{
Jamie Madillc564c072017-06-01 12:45:42 -040065 ContextVk *context = GetImplAs<ContextVk>(glContext);
Jamie Madill8ecf7f92017-01-13 17:29:52 -050066 RendererVk *renderer = context->getRenderer();
67 GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper();
68
Jamie Madill8ecf7f92017-01-13 17:29:52 -050069 std::vector<uint32_t> vertexCode;
70 std::vector<uint32_t> fragmentCode;
71 bool linkSuccess = false;
Jamie Madill2a9e1072017-09-22 11:31:57 -040072 ANGLE_TRY_RESULT(glslangWrapper->linkProgram(glContext, mState, &vertexCode, &fragmentCode),
73 linkSuccess);
Jamie Madill8ecf7f92017-01-13 17:29:52 -050074 if (!linkSuccess)
75 {
76 return false;
77 }
78
Jamie Madill5deea722017-02-16 10:44:46 -050079 vk::ShaderModule vertexModule;
80 vk::ShaderModule fragmentModule;
81 VkDevice device = renderer->getDevice();
Jamie Madill8ecf7f92017-01-13 17:29:52 -050082
83 {
84 VkShaderModuleCreateInfo vertexShaderInfo;
85 vertexShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
86 vertexShaderInfo.pNext = nullptr;
87 vertexShaderInfo.flags = 0;
88 vertexShaderInfo.codeSize = vertexCode.size() * sizeof(uint32_t);
89 vertexShaderInfo.pCode = vertexCode.data();
Jamie Madill5deea722017-02-16 10:44:46 -050090 ANGLE_TRY(vertexModule.init(device, vertexShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -050091 }
92
93 {
94 VkShaderModuleCreateInfo fragmentShaderInfo;
95 fragmentShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
96 fragmentShaderInfo.pNext = nullptr;
97 fragmentShaderInfo.flags = 0;
98 fragmentShaderInfo.codeSize = fragmentCode.size() * sizeof(uint32_t);
99 fragmentShaderInfo.pCode = fragmentCode.data();
100
Jamie Madill5deea722017-02-16 10:44:46 -0500101 ANGLE_TRY(fragmentModule.init(device, fragmentShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500102 }
103
Jamie Madill5deea722017-02-16 10:44:46 -0500104 mLinkedVertexModule.retain(device, std::move(vertexModule));
105 mLinkedFragmentModule.retain(device, std::move(fragmentModule));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500106
107 return true;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400108}
109
110GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
111{
112 UNIMPLEMENTED();
113 return GLboolean();
114}
115
116void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
117{
118 UNIMPLEMENTED();
119}
120
121void ProgramVk::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
122{
123 UNIMPLEMENTED();
124}
125
126void ProgramVk::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
127{
128 UNIMPLEMENTED();
129}
130
131void ProgramVk::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
132{
133 UNIMPLEMENTED();
134}
135
136void ProgramVk::setUniform1iv(GLint location, GLsizei count, const GLint *v)
137{
138 UNIMPLEMENTED();
139}
140
141void ProgramVk::setUniform2iv(GLint location, GLsizei count, const GLint *v)
142{
143 UNIMPLEMENTED();
144}
145
146void ProgramVk::setUniform3iv(GLint location, GLsizei count, const GLint *v)
147{
148 UNIMPLEMENTED();
149}
150
151void ProgramVk::setUniform4iv(GLint location, GLsizei count, const GLint *v)
152{
153 UNIMPLEMENTED();
154}
155
156void ProgramVk::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
157{
158 UNIMPLEMENTED();
159}
160
161void ProgramVk::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
162{
163 UNIMPLEMENTED();
164}
165
166void ProgramVk::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
167{
168 UNIMPLEMENTED();
169}
170
171void ProgramVk::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
172{
173 UNIMPLEMENTED();
174}
175
176void ProgramVk::setUniformMatrix2fv(GLint location,
177 GLsizei count,
178 GLboolean transpose,
179 const GLfloat *value)
180{
181 UNIMPLEMENTED();
182}
183
184void ProgramVk::setUniformMatrix3fv(GLint location,
185 GLsizei count,
186 GLboolean transpose,
187 const GLfloat *value)
188{
189 UNIMPLEMENTED();
190}
191
192void ProgramVk::setUniformMatrix4fv(GLint location,
193 GLsizei count,
194 GLboolean transpose,
195 const GLfloat *value)
196{
197 UNIMPLEMENTED();
198}
199
200void ProgramVk::setUniformMatrix2x3fv(GLint location,
201 GLsizei count,
202 GLboolean transpose,
203 const GLfloat *value)
204{
205 UNIMPLEMENTED();
206}
207
208void ProgramVk::setUniformMatrix3x2fv(GLint location,
209 GLsizei count,
210 GLboolean transpose,
211 const GLfloat *value)
212{
213 UNIMPLEMENTED();
214}
215
216void ProgramVk::setUniformMatrix2x4fv(GLint location,
217 GLsizei count,
218 GLboolean transpose,
219 const GLfloat *value)
220{
221 UNIMPLEMENTED();
222}
223
224void ProgramVk::setUniformMatrix4x2fv(GLint location,
225 GLsizei count,
226 GLboolean transpose,
227 const GLfloat *value)
228{
229 UNIMPLEMENTED();
230}
231
232void ProgramVk::setUniformMatrix3x4fv(GLint location,
233 GLsizei count,
234 GLboolean transpose,
235 const GLfloat *value)
236{
237 UNIMPLEMENTED();
238}
239
240void ProgramVk::setUniformMatrix4x3fv(GLint location,
241 GLsizei count,
242 GLboolean transpose,
243 const GLfloat *value)
244{
245 UNIMPLEMENTED();
246}
247
248void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
249{
250 UNIMPLEMENTED();
251}
252
Olli Etuaho855d9642017-05-17 14:05:06 +0300253bool ProgramVk::getUniformBlockSize(const std::string &blockName,
254 const std::string &blockMappedName,
255 size_t *sizeOut) const
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400256{
257 UNIMPLEMENTED();
258 return bool();
259}
260
261bool ProgramVk::getUniformBlockMemberInfo(const std::string &memberUniformName,
Olli Etuaho855d9642017-05-17 14:05:06 +0300262 const std::string &memberUniformMappedName,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400263 sh::BlockMemberInfo *memberInfoOut) const
264{
265 UNIMPLEMENTED();
266 return bool();
267}
268
Sami Väisänen46eaa942016-06-29 10:26:37 +0300269void ProgramVk::setPathFragmentInputGen(const std::string &inputName,
270 GLenum genMode,
271 GLint components,
272 const GLfloat *coeffs)
273{
274 UNIMPLEMENTED();
275}
276
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500277const vk::ShaderModule &ProgramVk::getLinkedVertexModule() const
278{
279 ASSERT(mLinkedVertexModule.getHandle() != VK_NULL_HANDLE);
280 return mLinkedVertexModule;
281}
282
283const vk::ShaderModule &ProgramVk::getLinkedFragmentModule() const
284{
285 ASSERT(mLinkedFragmentModule.getHandle() != VK_NULL_HANDLE);
286 return mLinkedFragmentModule;
287}
288
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500289gl::ErrorOrResult<vk::PipelineLayout *> ProgramVk::getPipelineLayout(VkDevice device)
290{
Jamie Madill5deea722017-02-16 10:44:46 -0500291 vk::PipelineLayout newLayout;
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500292
293 // TODO(jmadill): Descriptor sets.
294 VkPipelineLayoutCreateInfo createInfo;
295 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
296 createInfo.pNext = nullptr;
297 createInfo.flags = 0;
298 createInfo.setLayoutCount = 0;
299 createInfo.pSetLayouts = nullptr;
300 createInfo.pushConstantRangeCount = 0;
301 createInfo.pPushConstantRanges = nullptr;
302
Jamie Madill5deea722017-02-16 10:44:46 -0500303 ANGLE_TRY(newLayout.init(device, createInfo));
304 mPipelineLayout.retain(device, std::move(newLayout));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500305
306 return &mPipelineLayout;
307}
308
Jamie Madill54164b02017-08-28 15:17:37 -0400309void ProgramVk::getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const
310{
311 UNIMPLEMENTED();
312}
313
314void ProgramVk::getUniformiv(const gl::Context *context, GLint location, GLint *params) const
315{
316 UNIMPLEMENTED();
317}
318
319void ProgramVk::getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const
320{
321 UNIMPLEMENTED();
322}
323
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400324} // namespace rx