blob: b5e63da6498101bb89acdb2ed5e532f5cb3f08eb [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
70 const std::string &vertexSource = mState.getAttachedVertexShader()->getTranslatedSource();
71 const std::string &fragmentSource = mState.getAttachedFragmentShader()->getTranslatedSource();
72
73 std::vector<uint32_t> vertexCode;
74 std::vector<uint32_t> fragmentCode;
75 bool linkSuccess = false;
76 ANGLE_TRY_RESULT(
77 glslangWrapper->linkProgram(vertexSource, fragmentSource, &vertexCode, &fragmentCode),
78 linkSuccess);
79 if (!linkSuccess)
80 {
81 return false;
82 }
83
Jamie Madill5deea722017-02-16 10:44:46 -050084 vk::ShaderModule vertexModule;
85 vk::ShaderModule fragmentModule;
86 VkDevice device = renderer->getDevice();
Jamie Madill8ecf7f92017-01-13 17:29:52 -050087
88 {
89 VkShaderModuleCreateInfo vertexShaderInfo;
90 vertexShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
91 vertexShaderInfo.pNext = nullptr;
92 vertexShaderInfo.flags = 0;
93 vertexShaderInfo.codeSize = vertexCode.size() * sizeof(uint32_t);
94 vertexShaderInfo.pCode = vertexCode.data();
Jamie Madill5deea722017-02-16 10:44:46 -050095 ANGLE_TRY(vertexModule.init(device, vertexShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -050096 }
97
98 {
99 VkShaderModuleCreateInfo fragmentShaderInfo;
100 fragmentShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
101 fragmentShaderInfo.pNext = nullptr;
102 fragmentShaderInfo.flags = 0;
103 fragmentShaderInfo.codeSize = fragmentCode.size() * sizeof(uint32_t);
104 fragmentShaderInfo.pCode = fragmentCode.data();
105
Jamie Madill5deea722017-02-16 10:44:46 -0500106 ANGLE_TRY(fragmentModule.init(device, fragmentShaderInfo));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500107 }
108
Jamie Madill5deea722017-02-16 10:44:46 -0500109 mLinkedVertexModule.retain(device, std::move(vertexModule));
110 mLinkedFragmentModule.retain(device, std::move(fragmentModule));
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500111
Jamie Madill72106562017-03-24 14:18:50 -0400112 // TODO(jmadill): Use pipeline cache.
113 context->invalidateCurrentPipeline();
114
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500115 return true;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400116}
117
118GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
119{
120 UNIMPLEMENTED();
121 return GLboolean();
122}
123
124void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
125{
126 UNIMPLEMENTED();
127}
128
129void ProgramVk::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
130{
131 UNIMPLEMENTED();
132}
133
134void ProgramVk::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
135{
136 UNIMPLEMENTED();
137}
138
139void ProgramVk::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
140{
141 UNIMPLEMENTED();
142}
143
144void ProgramVk::setUniform1iv(GLint location, GLsizei count, const GLint *v)
145{
146 UNIMPLEMENTED();
147}
148
149void ProgramVk::setUniform2iv(GLint location, GLsizei count, const GLint *v)
150{
151 UNIMPLEMENTED();
152}
153
154void ProgramVk::setUniform3iv(GLint location, GLsizei count, const GLint *v)
155{
156 UNIMPLEMENTED();
157}
158
159void ProgramVk::setUniform4iv(GLint location, GLsizei count, const GLint *v)
160{
161 UNIMPLEMENTED();
162}
163
164void ProgramVk::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
165{
166 UNIMPLEMENTED();
167}
168
169void ProgramVk::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
170{
171 UNIMPLEMENTED();
172}
173
174void ProgramVk::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
175{
176 UNIMPLEMENTED();
177}
178
179void ProgramVk::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
180{
181 UNIMPLEMENTED();
182}
183
184void ProgramVk::setUniformMatrix2fv(GLint location,
185 GLsizei count,
186 GLboolean transpose,
187 const GLfloat *value)
188{
189 UNIMPLEMENTED();
190}
191
192void ProgramVk::setUniformMatrix3fv(GLint location,
193 GLsizei count,
194 GLboolean transpose,
195 const GLfloat *value)
196{
197 UNIMPLEMENTED();
198}
199
200void ProgramVk::setUniformMatrix4fv(GLint location,
201 GLsizei count,
202 GLboolean transpose,
203 const GLfloat *value)
204{
205 UNIMPLEMENTED();
206}
207
208void ProgramVk::setUniformMatrix2x3fv(GLint location,
209 GLsizei count,
210 GLboolean transpose,
211 const GLfloat *value)
212{
213 UNIMPLEMENTED();
214}
215
216void ProgramVk::setUniformMatrix3x2fv(GLint location,
217 GLsizei count,
218 GLboolean transpose,
219 const GLfloat *value)
220{
221 UNIMPLEMENTED();
222}
223
224void ProgramVk::setUniformMatrix2x4fv(GLint location,
225 GLsizei count,
226 GLboolean transpose,
227 const GLfloat *value)
228{
229 UNIMPLEMENTED();
230}
231
232void ProgramVk::setUniformMatrix4x2fv(GLint location,
233 GLsizei count,
234 GLboolean transpose,
235 const GLfloat *value)
236{
237 UNIMPLEMENTED();
238}
239
240void ProgramVk::setUniformMatrix3x4fv(GLint location,
241 GLsizei count,
242 GLboolean transpose,
243 const GLfloat *value)
244{
245 UNIMPLEMENTED();
246}
247
248void ProgramVk::setUniformMatrix4x3fv(GLint location,
249 GLsizei count,
250 GLboolean transpose,
251 const GLfloat *value)
252{
253 UNIMPLEMENTED();
254}
255
256void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
257{
258 UNIMPLEMENTED();
259}
260
261bool ProgramVk::getUniformBlockSize(const std::string &blockName, size_t *sizeOut) const
262{
263 UNIMPLEMENTED();
264 return bool();
265}
266
267bool ProgramVk::getUniformBlockMemberInfo(const std::string &memberUniformName,
268 sh::BlockMemberInfo *memberInfoOut) const
269{
270 UNIMPLEMENTED();
271 return bool();
272}
273
Sami Väisänen46eaa942016-06-29 10:26:37 +0300274void ProgramVk::setPathFragmentInputGen(const std::string &inputName,
275 GLenum genMode,
276 GLint components,
277 const GLfloat *coeffs)
278{
279 UNIMPLEMENTED();
280}
281
Jamie Madill8ecf7f92017-01-13 17:29:52 -0500282const vk::ShaderModule &ProgramVk::getLinkedVertexModule() const
283{
284 ASSERT(mLinkedVertexModule.getHandle() != VK_NULL_HANDLE);
285 return mLinkedVertexModule;
286}
287
288const vk::ShaderModule &ProgramVk::getLinkedFragmentModule() const
289{
290 ASSERT(mLinkedFragmentModule.getHandle() != VK_NULL_HANDLE);
291 return mLinkedFragmentModule;
292}
293
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500294gl::ErrorOrResult<vk::PipelineLayout *> ProgramVk::getPipelineLayout(VkDevice device)
295{
Jamie Madill5deea722017-02-16 10:44:46 -0500296 vk::PipelineLayout newLayout;
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500297
298 // TODO(jmadill): Descriptor sets.
299 VkPipelineLayoutCreateInfo createInfo;
300 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
301 createInfo.pNext = nullptr;
302 createInfo.flags = 0;
303 createInfo.setLayoutCount = 0;
304 createInfo.pSetLayouts = nullptr;
305 createInfo.pushConstantRangeCount = 0;
306 createInfo.pPushConstantRanges = nullptr;
307
Jamie Madill5deea722017-02-16 10:44:46 -0500308 ANGLE_TRY(newLayout.init(device, createInfo));
309 mPipelineLayout.retain(device, std::move(newLayout));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500310
311 return &mPipelineLayout;
312}
313
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400314} // namespace rx