xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2017 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // ProgramPipelineVk.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //    Implements the class methods for ProgramPipelineVk.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/ProgramPipelineVk.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker namespace rx
13*8975f5c5SAndroid Build Coastguard Worker {
14*8975f5c5SAndroid Build Coastguard Worker 
ProgramPipelineVk(const gl::ProgramPipelineState & state)15*8975f5c5SAndroid Build Coastguard Worker ProgramPipelineVk::ProgramPipelineVk(const gl::ProgramPipelineState &state)
16*8975f5c5SAndroid Build Coastguard Worker     : ProgramPipelineImpl(state)
17*8975f5c5SAndroid Build Coastguard Worker {}
18*8975f5c5SAndroid Build Coastguard Worker 
~ProgramPipelineVk()19*8975f5c5SAndroid Build Coastguard Worker ProgramPipelineVk::~ProgramPipelineVk() {}
20*8975f5c5SAndroid Build Coastguard Worker 
destroy(const gl::Context * context)21*8975f5c5SAndroid Build Coastguard Worker void ProgramPipelineVk::destroy(const gl::Context *context)
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker     ContextVk *contextVk = vk::GetImpl(context);
24*8975f5c5SAndroid Build Coastguard Worker     reset(contextVk);
25*8975f5c5SAndroid Build Coastguard Worker }
26*8975f5c5SAndroid Build Coastguard Worker 
reset(ContextVk * contextVk)27*8975f5c5SAndroid Build Coastguard Worker void ProgramPipelineVk::reset(ContextVk *contextVk)
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker     getExecutable()->reset(contextVk);
30*8975f5c5SAndroid Build Coastguard Worker }
31*8975f5c5SAndroid Build Coastguard Worker 
link(const gl::Context * glContext,const gl::ProgramMergedVaryings & mergedVaryings,const gl::ProgramVaryingPacking & varyingPacking)32*8975f5c5SAndroid Build Coastguard Worker angle::Result ProgramPipelineVk::link(const gl::Context *glContext,
33*8975f5c5SAndroid Build Coastguard Worker                                       const gl::ProgramMergedVaryings &mergedVaryings,
34*8975f5c5SAndroid Build Coastguard Worker                                       const gl::ProgramVaryingPacking &varyingPacking)
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker     ContextVk *contextVk                      = vk::GetImpl(glContext);
37*8975f5c5SAndroid Build Coastguard Worker     vk::Renderer *renderer                    = contextVk->getRenderer();
38*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable &glExecutable = mState.getExecutable();
39*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutableVk *executableVk         = vk::GetImpl(&glExecutable);
40*8975f5c5SAndroid Build Coastguard Worker     SpvSourceOptions options                  = SpvCreateSourceOptions(contextVk->getFeatures(),
41*8975f5c5SAndroid Build Coastguard Worker                                                                        renderer->getMaxColorInputAttachmentCount());
42*8975f5c5SAndroid Build Coastguard Worker     SpvProgramInterfaceInfo spvProgramInterfaceInfo = {};
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     reset(contextVk);
45*8975f5c5SAndroid Build Coastguard Worker     executableVk->clearVariableInfoMap();
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     // Now that the program pipeline has all of the programs attached, the various descriptor
48*8975f5c5SAndroid Build Coastguard Worker     // set/binding locations need to be re-assigned to their correct values.
49*8975f5c5SAndroid Build Coastguard Worker     const gl::ShaderType linkedTransformFeedbackStage =
50*8975f5c5SAndroid Build Coastguard Worker         glExecutable.getLinkedTransformFeedbackStage();
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker     // This should be done before assigning varying locations. Otherwise, we can encounter shader
53*8975f5c5SAndroid Build Coastguard Worker     // interface mismatching problems when the transform feedback stage is not the vertex stage.
54*8975f5c5SAndroid Build Coastguard Worker     if (options.supportsTransformFeedbackExtension)
55*8975f5c5SAndroid Build Coastguard Worker     {
56*8975f5c5SAndroid Build Coastguard Worker         for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages())
57*8975f5c5SAndroid Build Coastguard Worker         {
58*8975f5c5SAndroid Build Coastguard Worker             const gl::SharedProgramExecutable &glShaderExecutable =
59*8975f5c5SAndroid Build Coastguard Worker                 mState.getShaderProgramExecutable(shaderType);
60*8975f5c5SAndroid Build Coastguard Worker             if (glShaderExecutable && gl::ShaderTypeSupportsTransformFeedback(shaderType))
61*8975f5c5SAndroid Build Coastguard Worker             {
62*8975f5c5SAndroid Build Coastguard Worker                 const bool isTransformFeedbackStage =
63*8975f5c5SAndroid Build Coastguard Worker                     shaderType == linkedTransformFeedbackStage &&
64*8975f5c5SAndroid Build Coastguard Worker                     !glShaderExecutable->getLinkedTransformFeedbackVaryings().empty();
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker                 SpvAssignTransformFeedbackLocations(
67*8975f5c5SAndroid Build Coastguard Worker                     shaderType, *glShaderExecutable.get(), isTransformFeedbackStage,
68*8975f5c5SAndroid Build Coastguard Worker                     &spvProgramInterfaceInfo, &executableVk->mVariableInfoMap);
69*8975f5c5SAndroid Build Coastguard Worker             }
70*8975f5c5SAndroid Build Coastguard Worker         }
71*8975f5c5SAndroid Build Coastguard Worker     }
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker     executableVk->mOriginalShaderInfo.clear();
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker     SpvAssignLocations(options, glExecutable, varyingPacking, linkedTransformFeedbackStage,
76*8975f5c5SAndroid Build Coastguard Worker                        &spvProgramInterfaceInfo, &executableVk->mVariableInfoMap);
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages())
79*8975f5c5SAndroid Build Coastguard Worker     {
80*8975f5c5SAndroid Build Coastguard Worker         const gl::SharedProgramExecutable &glShaderExecutable =
81*8975f5c5SAndroid Build Coastguard Worker             mState.getShaderProgramExecutable(shaderType);
82*8975f5c5SAndroid Build Coastguard Worker         ProgramExecutableVk *programExecutableVk = vk::GetImpl(glShaderExecutable.get());
83*8975f5c5SAndroid Build Coastguard Worker         executableVk->mDefaultUniformBlocks[shaderType] =
84*8975f5c5SAndroid Build Coastguard Worker             programExecutableVk->getSharedDefaultUniformBlock(shaderType);
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker         executableVk->mOriginalShaderInfo.initShaderFromProgram(
87*8975f5c5SAndroid Build Coastguard Worker             shaderType, programExecutableVk->mOriginalShaderInfo);
88*8975f5c5SAndroid Build Coastguard Worker     }
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker     executableVk->setAllDefaultUniformsDirty();
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker     if (contextVk->getFeatures().varyingsRequireMatchingPrecisionInSpirv.enabled &&
93*8975f5c5SAndroid Build Coastguard Worker         contextVk->getFeatures().enablePrecisionQualifiers.enabled)
94*8975f5c5SAndroid Build Coastguard Worker     {
95*8975f5c5SAndroid Build Coastguard Worker         executableVk->resolvePrecisionMismatch(mergedVaryings);
96*8975f5c5SAndroid Build Coastguard Worker     }
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     executableVk->resetLayout(contextVk);
99*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(executableVk->createPipelineLayout(contextVk, &contextVk->getPipelineLayoutCache(),
100*8975f5c5SAndroid Build Coastguard Worker                                                  &contextVk->getDescriptorSetLayoutCache(),
101*8975f5c5SAndroid Build Coastguard Worker                                                  nullptr));
102*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(executableVk->initializeDescriptorPools(contextVk,
103*8975f5c5SAndroid Build Coastguard Worker                                                       &contextVk->getDescriptorSetLayoutCache(),
104*8975f5c5SAndroid Build Coastguard Worker                                                       &contextVk->getMetaDescriptorPools()));
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     angle::Result result = angle::Result::Continue;
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     if (contextVk->getFeatures().warmUpPipelineCacheAtLink.enabled)
109*8975f5c5SAndroid Build Coastguard Worker     {
110*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(executableVk->warmUpPipelineCache(renderer, contextVk->pipelineRobustness(),
111*8975f5c5SAndroid Build Coastguard Worker                                                     contextVk->pipelineProtectedAccess()));
112*8975f5c5SAndroid Build Coastguard Worker     }
113*8975f5c5SAndroid Build Coastguard Worker 
114*8975f5c5SAndroid Build Coastguard Worker     return result;
115*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
118