gl::LinkResult ProgramVk::link(const gl::Context *glContext, const gl::ProgramLinkedResources &resources, gl::InfoLog &infoLog) { ContextVk *contextVk = vk::GetImpl(glContext); RendererVk *renderer = contextVk->getRenderer(); GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper(); VkDevice device = renderer->getDevice(); reset(device); std::vector<uint32_t> vertexCode; std::vector<uint32_t> fragmentCode; bool linkSuccess = false; ANGLE_TRY_RESULT( glslangWrapper->linkProgram(glContext, mState, resources, &vertexCode, &fragmentCode), linkSuccess); if (!linkSuccess) { return false; } { VkShaderModuleCreateInfo vertexShaderInfo; vertexShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; vertexShaderInfo.pNext = nullptr; vertexShaderInfo.flags = 0; vertexShaderInfo.codeSize = vertexCode.size() * sizeof(uint32_t); vertexShaderInfo.pCode = vertexCode.data(); ANGLE_TRY(mLinkedVertexModule.init(device, vertexShaderInfo)); } { VkShaderModuleCreateInfo fragmentShaderInfo; fragmentShaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; fragmentShaderInfo.pNext = nullptr; fragmentShaderInfo.flags = 0; fragmentShaderInfo.codeSize = fragmentCode.size() * sizeof(uint32_t); fragmentShaderInfo.pCode = fragmentCode.data(); ANGLE_TRY(mLinkedFragmentModule.init(device, fragmentShaderInfo)); } ANGLE_TRY(initPipelineLayout(contextVk)); ANGLE_TRY(initDescriptorSets(contextVk)); ANGLE_TRY(initDefaultUniformBlocks(glContext)); return true; }