xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/ContextVk.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 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 // ContextVk.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the class interface for ContextVk, implementing ContextImpl.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_CONTEXTVK_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_CONTEXTVK_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include <condition_variable>
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEnums.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "common/vulkan/vk_headers.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "image_util/loadimage.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ContextImpl.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/renderer_utils.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/DisplayVk.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/OverlayVk.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/PersistentCommandPool.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/ShareGroupVk.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_renderer.h"
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker namespace angle
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker struct FeaturesVk;
30*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker namespace rx
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker namespace vk
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker class SyncHelper;
37*8975f5c5SAndroid Build Coastguard Worker }  // namespace vk
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker class ConversionBuffer;
40*8975f5c5SAndroid Build Coastguard Worker class ProgramExecutableVk;
41*8975f5c5SAndroid Build Coastguard Worker class WindowSurfaceVk;
42*8975f5c5SAndroid Build Coastguard Worker class OffscreenSurfaceVk;
43*8975f5c5SAndroid Build Coastguard Worker class ShareGroupVk;
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker static constexpr uint32_t kMaxGpuEventNameLen = 32;
46*8975f5c5SAndroid Build Coastguard Worker using EventName                               = std::array<char, kMaxGpuEventNameLen>;
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker using ContextVkDescriptorSetList = angle::PackedEnumMap<PipelineType, uint32_t>;
49*8975f5c5SAndroid Build Coastguard Worker using CounterPipelineTypeMap     = angle::PackedEnumMap<PipelineType, uint32_t>;
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker enum class GraphicsEventCmdBuf
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker     NotInQueryCmd              = 0,
54*8975f5c5SAndroid Build Coastguard Worker     InOutsideCmdBufQueryCmd    = 1,
55*8975f5c5SAndroid Build Coastguard Worker     InRenderPassCmdBufQueryCmd = 2,
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum = 3,
58*8975f5c5SAndroid Build Coastguard Worker     EnumCount   = 3,
59*8975f5c5SAndroid Build Coastguard Worker };
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker // Why depth/stencil feedback loop is being updated.  Based on whether it's due to a draw or clear,
62*8975f5c5SAndroid Build Coastguard Worker // different GL state affect depth/stencil write.
63*8975f5c5SAndroid Build Coastguard Worker enum class UpdateDepthFeedbackLoopReason
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker     None,
66*8975f5c5SAndroid Build Coastguard Worker     Draw,
67*8975f5c5SAndroid Build Coastguard Worker     Clear,
68*8975f5c5SAndroid Build Coastguard Worker };
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker static constexpr GLbitfield kBufferMemoryBarrierBits =
71*8975f5c5SAndroid Build Coastguard Worker     GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT | GL_ELEMENT_ARRAY_BARRIER_BIT | GL_UNIFORM_BARRIER_BIT |
72*8975f5c5SAndroid Build Coastguard Worker     GL_COMMAND_BARRIER_BIT | GL_PIXEL_BUFFER_BARRIER_BIT | GL_BUFFER_UPDATE_BARRIER_BIT |
73*8975f5c5SAndroid Build Coastguard Worker     GL_TRANSFORM_FEEDBACK_BARRIER_BIT | GL_ATOMIC_COUNTER_BARRIER_BIT |
74*8975f5c5SAndroid Build Coastguard Worker     GL_SHADER_STORAGE_BARRIER_BIT | GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT;
75*8975f5c5SAndroid Build Coastguard Worker static constexpr GLbitfield kImageMemoryBarrierBits =
76*8975f5c5SAndroid Build Coastguard Worker     GL_TEXTURE_FETCH_BARRIER_BIT | GL_SHADER_IMAGE_ACCESS_BARRIER_BIT |
77*8975f5c5SAndroid Build Coastguard Worker     GL_TEXTURE_UPDATE_BARRIER_BIT | GL_FRAMEBUFFER_BARRIER_BIT;
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker class ContextVk : public ContextImpl, public vk::Context, public MultisampleTextureInitializer
80*8975f5c5SAndroid Build Coastguard Worker {
81*8975f5c5SAndroid Build Coastguard Worker   public:
82*8975f5c5SAndroid Build Coastguard Worker     ContextVk(const gl::State &state, gl::ErrorSet *errorSet, vk::Renderer *renderer);
83*8975f5c5SAndroid Build Coastguard Worker     ~ContextVk() override;
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     angle::Result initialize(const angle::ImageLoadContext &imageLoadContext) override;
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker     void onDestroy(const gl::Context *context) override;
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker     // Flush and finish.
90*8975f5c5SAndroid Build Coastguard Worker     angle::Result flush(const gl::Context *context) override;
91*8975f5c5SAndroid Build Coastguard Worker     angle::Result finish(const gl::Context *context) override;
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     // Drawing methods.
94*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawArrays(const gl::Context *context,
95*8975f5c5SAndroid Build Coastguard Worker                              gl::PrimitiveMode mode,
96*8975f5c5SAndroid Build Coastguard Worker                              GLint first,
97*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count) override;
98*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawArraysInstanced(const gl::Context *context,
99*8975f5c5SAndroid Build Coastguard Worker                                       gl::PrimitiveMode mode,
100*8975f5c5SAndroid Build Coastguard Worker                                       GLint first,
101*8975f5c5SAndroid Build Coastguard Worker                                       GLsizei count,
102*8975f5c5SAndroid Build Coastguard Worker                                       GLsizei instanceCount) override;
103*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawArraysInstancedBaseInstance(const gl::Context *context,
104*8975f5c5SAndroid Build Coastguard Worker                                                   gl::PrimitiveMode mode,
105*8975f5c5SAndroid Build Coastguard Worker                                                   GLint first,
106*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei count,
107*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei instanceCount,
108*8975f5c5SAndroid Build Coastguard Worker                                                   GLuint baseInstance) override;
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawElements(const gl::Context *context,
111*8975f5c5SAndroid Build Coastguard Worker                                gl::PrimitiveMode mode,
112*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
113*8975f5c5SAndroid Build Coastguard Worker                                gl::DrawElementsType type,
114*8975f5c5SAndroid Build Coastguard Worker                                const void *indices) override;
115*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawElementsBaseVertex(const gl::Context *context,
116*8975f5c5SAndroid Build Coastguard Worker                                          gl::PrimitiveMode mode,
117*8975f5c5SAndroid Build Coastguard Worker                                          GLsizei count,
118*8975f5c5SAndroid Build Coastguard Worker                                          gl::DrawElementsType type,
119*8975f5c5SAndroid Build Coastguard Worker                                          const void *indices,
120*8975f5c5SAndroid Build Coastguard Worker                                          GLint baseVertex) override;
121*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawElementsInstanced(const gl::Context *context,
122*8975f5c5SAndroid Build Coastguard Worker                                         gl::PrimitiveMode mode,
123*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei count,
124*8975f5c5SAndroid Build Coastguard Worker                                         gl::DrawElementsType type,
125*8975f5c5SAndroid Build Coastguard Worker                                         const void *indices,
126*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei instanceCount) override;
127*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawElementsInstancedBaseVertex(const gl::Context *context,
128*8975f5c5SAndroid Build Coastguard Worker                                                   gl::PrimitiveMode mode,
129*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei count,
130*8975f5c5SAndroid Build Coastguard Worker                                                   gl::DrawElementsType type,
131*8975f5c5SAndroid Build Coastguard Worker                                                   const void *indices,
132*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei instanceCount,
133*8975f5c5SAndroid Build Coastguard Worker                                                   GLint baseVertex) override;
134*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
135*8975f5c5SAndroid Build Coastguard Worker                                                               gl::PrimitiveMode mode,
136*8975f5c5SAndroid Build Coastguard Worker                                                               GLsizei count,
137*8975f5c5SAndroid Build Coastguard Worker                                                               gl::DrawElementsType type,
138*8975f5c5SAndroid Build Coastguard Worker                                                               const void *indices,
139*8975f5c5SAndroid Build Coastguard Worker                                                               GLsizei instances,
140*8975f5c5SAndroid Build Coastguard Worker                                                               GLint baseVertex,
141*8975f5c5SAndroid Build Coastguard Worker                                                               GLuint baseInstance) override;
142*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawRangeElements(const gl::Context *context,
143*8975f5c5SAndroid Build Coastguard Worker                                     gl::PrimitiveMode mode,
144*8975f5c5SAndroid Build Coastguard Worker                                     GLuint start,
145*8975f5c5SAndroid Build Coastguard Worker                                     GLuint end,
146*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei count,
147*8975f5c5SAndroid Build Coastguard Worker                                     gl::DrawElementsType type,
148*8975f5c5SAndroid Build Coastguard Worker                                     const void *indices) override;
149*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawRangeElementsBaseVertex(const gl::Context *context,
150*8975f5c5SAndroid Build Coastguard Worker                                               gl::PrimitiveMode mode,
151*8975f5c5SAndroid Build Coastguard Worker                                               GLuint start,
152*8975f5c5SAndroid Build Coastguard Worker                                               GLuint end,
153*8975f5c5SAndroid Build Coastguard Worker                                               GLsizei count,
154*8975f5c5SAndroid Build Coastguard Worker                                               gl::DrawElementsType type,
155*8975f5c5SAndroid Build Coastguard Worker                                               const void *indices,
156*8975f5c5SAndroid Build Coastguard Worker                                               GLint baseVertex) override;
157*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawArraysIndirect(const gl::Context *context,
158*8975f5c5SAndroid Build Coastguard Worker                                      gl::PrimitiveMode mode,
159*8975f5c5SAndroid Build Coastguard Worker                                      const void *indirect) override;
160*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawElementsIndirect(const gl::Context *context,
161*8975f5c5SAndroid Build Coastguard Worker                                        gl::PrimitiveMode mode,
162*8975f5c5SAndroid Build Coastguard Worker                                        gl::DrawElementsType type,
163*8975f5c5SAndroid Build Coastguard Worker                                        const void *indirect) override;
164*8975f5c5SAndroid Build Coastguard Worker 
165*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawArrays(const gl::Context *context,
166*8975f5c5SAndroid Build Coastguard Worker                                   gl::PrimitiveMode mode,
167*8975f5c5SAndroid Build Coastguard Worker                                   const GLint *firsts,
168*8975f5c5SAndroid Build Coastguard Worker                                   const GLsizei *counts,
169*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei drawcount) override;
170*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawArraysInstanced(const gl::Context *context,
171*8975f5c5SAndroid Build Coastguard Worker                                            gl::PrimitiveMode mode,
172*8975f5c5SAndroid Build Coastguard Worker                                            const GLint *firsts,
173*8975f5c5SAndroid Build Coastguard Worker                                            const GLsizei *counts,
174*8975f5c5SAndroid Build Coastguard Worker                                            const GLsizei *instanceCounts,
175*8975f5c5SAndroid Build Coastguard Worker                                            GLsizei drawcount) override;
176*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawArraysIndirect(const gl::Context *context,
177*8975f5c5SAndroid Build Coastguard Worker                                           gl::PrimitiveMode mode,
178*8975f5c5SAndroid Build Coastguard Worker                                           const void *indirect,
179*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei drawcount,
180*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei stride) override;
181*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawElements(const gl::Context *context,
182*8975f5c5SAndroid Build Coastguard Worker                                     gl::PrimitiveMode mode,
183*8975f5c5SAndroid Build Coastguard Worker                                     const GLsizei *counts,
184*8975f5c5SAndroid Build Coastguard Worker                                     gl::DrawElementsType type,
185*8975f5c5SAndroid Build Coastguard Worker                                     const GLvoid *const *indices,
186*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei drawcount) override;
187*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawElementsInstanced(const gl::Context *context,
188*8975f5c5SAndroid Build Coastguard Worker                                              gl::PrimitiveMode mode,
189*8975f5c5SAndroid Build Coastguard Worker                                              const GLsizei *counts,
190*8975f5c5SAndroid Build Coastguard Worker                                              gl::DrawElementsType type,
191*8975f5c5SAndroid Build Coastguard Worker                                              const GLvoid *const *indices,
192*8975f5c5SAndroid Build Coastguard Worker                                              const GLsizei *instanceCounts,
193*8975f5c5SAndroid Build Coastguard Worker                                              GLsizei drawcount) override;
194*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawElementsIndirect(const gl::Context *context,
195*8975f5c5SAndroid Build Coastguard Worker                                             gl::PrimitiveMode mode,
196*8975f5c5SAndroid Build Coastguard Worker                                             gl::DrawElementsType type,
197*8975f5c5SAndroid Build Coastguard Worker                                             const void *indirect,
198*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei drawcount,
199*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei stride) override;
200*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context,
201*8975f5c5SAndroid Build Coastguard Worker                                                        gl::PrimitiveMode mode,
202*8975f5c5SAndroid Build Coastguard Worker                                                        const GLint *firsts,
203*8975f5c5SAndroid Build Coastguard Worker                                                        const GLsizei *counts,
204*8975f5c5SAndroid Build Coastguard Worker                                                        const GLsizei *instanceCounts,
205*8975f5c5SAndroid Build Coastguard Worker                                                        const GLuint *baseInstances,
206*8975f5c5SAndroid Build Coastguard Worker                                                        GLsizei drawcount) override;
207*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
208*8975f5c5SAndroid Build Coastguard Worker                                                                    gl::PrimitiveMode mode,
209*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLsizei *counts,
210*8975f5c5SAndroid Build Coastguard Worker                                                                    gl::DrawElementsType type,
211*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLvoid *const *indices,
212*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLsizei *instanceCounts,
213*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLint *baseVertices,
214*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLuint *baseInstances,
215*8975f5c5SAndroid Build Coastguard Worker                                                                    GLsizei drawcount) override;
216*8975f5c5SAndroid Build Coastguard Worker 
217*8975f5c5SAndroid Build Coastguard Worker     // MultiDrawIndirect helper functions
218*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawElementsIndirectHelper(const gl::Context *context,
219*8975f5c5SAndroid Build Coastguard Worker                                                   gl::PrimitiveMode mode,
220*8975f5c5SAndroid Build Coastguard Worker                                                   gl::DrawElementsType type,
221*8975f5c5SAndroid Build Coastguard Worker                                                   const void *indirect,
222*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei drawcount,
223*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei stride);
224*8975f5c5SAndroid Build Coastguard Worker     angle::Result multiDrawArraysIndirectHelper(const gl::Context *context,
225*8975f5c5SAndroid Build Coastguard Worker                                                 gl::PrimitiveMode mode,
226*8975f5c5SAndroid Build Coastguard Worker                                                 const void *indirect,
227*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei drawcount,
228*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei stride);
229*8975f5c5SAndroid Build Coastguard Worker 
230*8975f5c5SAndroid Build Coastguard Worker     // ShareGroup
getShareGroup()231*8975f5c5SAndroid Build Coastguard Worker     ShareGroupVk *getShareGroup() { return mShareGroupVk; }
getPipelineLayoutCache()232*8975f5c5SAndroid Build Coastguard Worker     PipelineLayoutCache &getPipelineLayoutCache()
233*8975f5c5SAndroid Build Coastguard Worker     {
234*8975f5c5SAndroid Build Coastguard Worker         return mShareGroupVk->getPipelineLayoutCache();
235*8975f5c5SAndroid Build Coastguard Worker     }
getDescriptorSetLayoutCache()236*8975f5c5SAndroid Build Coastguard Worker     DescriptorSetLayoutCache &getDescriptorSetLayoutCache()
237*8975f5c5SAndroid Build Coastguard Worker     {
238*8975f5c5SAndroid Build Coastguard Worker         return mShareGroupVk->getDescriptorSetLayoutCache();
239*8975f5c5SAndroid Build Coastguard Worker     }
getMetaDescriptorPools()240*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetArray<vk::MetaDescriptorPool> &getMetaDescriptorPools()
241*8975f5c5SAndroid Build Coastguard Worker     {
242*8975f5c5SAndroid Build Coastguard Worker         return mShareGroupVk->getMetaDescriptorPools();
243*8975f5c5SAndroid Build Coastguard Worker     }
244*8975f5c5SAndroid Build Coastguard Worker 
245*8975f5c5SAndroid Build Coastguard Worker     // Device loss
246*8975f5c5SAndroid Build Coastguard Worker     gl::GraphicsResetStatus getResetStatus() override;
247*8975f5c5SAndroid Build Coastguard Worker 
isDebugEnabled()248*8975f5c5SAndroid Build Coastguard Worker     bool isDebugEnabled()
249*8975f5c5SAndroid Build Coastguard Worker     {
250*8975f5c5SAndroid Build Coastguard Worker         return mRenderer->enableDebugUtils() || mRenderer->angleDebuggerMode();
251*8975f5c5SAndroid Build Coastguard Worker     }
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker     // EXT_debug_marker
254*8975f5c5SAndroid Build Coastguard Worker     angle::Result insertEventMarker(GLsizei length, const char *marker) override;
255*8975f5c5SAndroid Build Coastguard Worker     angle::Result pushGroupMarker(GLsizei length, const char *marker) override;
256*8975f5c5SAndroid Build Coastguard Worker     angle::Result popGroupMarker() override;
257*8975f5c5SAndroid Build Coastguard Worker 
258*8975f5c5SAndroid Build Coastguard Worker     void insertEventMarkerImpl(GLenum source, const char *marker);
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker     // KHR_debug
261*8975f5c5SAndroid Build Coastguard Worker     angle::Result pushDebugGroup(const gl::Context *context,
262*8975f5c5SAndroid Build Coastguard Worker                                  GLenum source,
263*8975f5c5SAndroid Build Coastguard Worker                                  GLuint id,
264*8975f5c5SAndroid Build Coastguard Worker                                  const std::string &message) override;
265*8975f5c5SAndroid Build Coastguard Worker     angle::Result popDebugGroup(const gl::Context *context) override;
266*8975f5c5SAndroid Build Coastguard Worker 
267*8975f5c5SAndroid Build Coastguard Worker     // Record GL API calls for debuggers
268*8975f5c5SAndroid Build Coastguard Worker     void logEvent(const char *eventString);
269*8975f5c5SAndroid Build Coastguard Worker     void endEventLog(angle::EntryPoint entryPoint, PipelineType pipelineType);
270*8975f5c5SAndroid Build Coastguard Worker     void endEventLogForClearOrQuery();
271*8975f5c5SAndroid Build Coastguard Worker 
272*8975f5c5SAndroid Build Coastguard Worker     bool isViewportFlipEnabledForDrawFBO() const;
273*8975f5c5SAndroid Build Coastguard Worker     bool isViewportFlipEnabledForReadFBO() const;
274*8975f5c5SAndroid Build Coastguard Worker     // When the device/surface is rotated such that the surface's aspect ratio is different than
275*8975f5c5SAndroid Build Coastguard Worker     // the native device (e.g. 90 degrees), the width and height of the viewport, scissor, and
276*8975f5c5SAndroid Build Coastguard Worker     // render area must be swapped.
277*8975f5c5SAndroid Build Coastguard Worker     bool isRotatedAspectRatioForDrawFBO() const;
278*8975f5c5SAndroid Build Coastguard Worker     bool isRotatedAspectRatioForReadFBO() const;
279*8975f5c5SAndroid Build Coastguard Worker     SurfaceRotation getRotationDrawFramebuffer() const;
280*8975f5c5SAndroid Build Coastguard Worker     SurfaceRotation getRotationReadFramebuffer() const;
281*8975f5c5SAndroid Build Coastguard Worker     SurfaceRotation getSurfaceRotationImpl(const gl::Framebuffer *framebuffer,
282*8975f5c5SAndroid Build Coastguard Worker                                            const egl::Surface *surface);
283*8975f5c5SAndroid Build Coastguard Worker 
284*8975f5c5SAndroid Build Coastguard Worker     // View port (x, y, w, h) will be determined by a combination of -
285*8975f5c5SAndroid Build Coastguard Worker     // 1. clip space origin
286*8975f5c5SAndroid Build Coastguard Worker     // 2. isViewportFlipEnabledForDrawFBO
287*8975f5c5SAndroid Build Coastguard Worker     // For userdefined FBOs it will be based on the value of isViewportFlipEnabledForDrawFBO.
288*8975f5c5SAndroid Build Coastguard Worker     // For default FBOs it will be XOR of ClipOrigin and isViewportFlipEnabledForDrawFBO.
289*8975f5c5SAndroid Build Coastguard Worker     // isYFlipEnabledForDrawFBO indicates the rendered image is upside-down.
isYFlipEnabledForDrawFBO()290*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool isYFlipEnabledForDrawFBO() const
291*8975f5c5SAndroid Build Coastguard Worker     {
292*8975f5c5SAndroid Build Coastguard Worker         return mState.getClipOrigin() == gl::ClipOrigin::UpperLeft
293*8975f5c5SAndroid Build Coastguard Worker                    ? !isViewportFlipEnabledForDrawFBO()
294*8975f5c5SAndroid Build Coastguard Worker                    : isViewportFlipEnabledForDrawFBO();
295*8975f5c5SAndroid Build Coastguard Worker     }
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker     // State sync with dirty bits.
298*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncState(const gl::Context *context,
299*8975f5c5SAndroid Build Coastguard Worker                             const gl::state::DirtyBits dirtyBits,
300*8975f5c5SAndroid Build Coastguard Worker                             const gl::state::DirtyBits bitMask,
301*8975f5c5SAndroid Build Coastguard Worker                             const gl::state::ExtendedDirtyBits extendedDirtyBits,
302*8975f5c5SAndroid Build Coastguard Worker                             const gl::state::ExtendedDirtyBits extendedBitMask,
303*8975f5c5SAndroid Build Coastguard Worker                             gl::Command command) override;
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker     // Disjoint timer queries
306*8975f5c5SAndroid Build Coastguard Worker     GLint getGPUDisjoint() override;
307*8975f5c5SAndroid Build Coastguard Worker     GLint64 getTimestamp() override;
308*8975f5c5SAndroid Build Coastguard Worker 
309*8975f5c5SAndroid Build Coastguard Worker     // Context switching
310*8975f5c5SAndroid Build Coastguard Worker     angle::Result onMakeCurrent(const gl::Context *context) override;
311*8975f5c5SAndroid Build Coastguard Worker     angle::Result onUnMakeCurrent(const gl::Context *context) override;
312*8975f5c5SAndroid Build Coastguard Worker     angle::Result onSurfaceUnMakeCurrent(WindowSurfaceVk *surface);
313*8975f5c5SAndroid Build Coastguard Worker     angle::Result onSurfaceUnMakeCurrent(OffscreenSurfaceVk *surface);
314*8975f5c5SAndroid Build Coastguard Worker 
315*8975f5c5SAndroid Build Coastguard Worker     // Native capabilities, unmodified by gl::Context.
316*8975f5c5SAndroid Build Coastguard Worker     gl::Caps getNativeCaps() const override;
317*8975f5c5SAndroid Build Coastguard Worker     const gl::TextureCapsMap &getNativeTextureCaps() const override;
318*8975f5c5SAndroid Build Coastguard Worker     const gl::Extensions &getNativeExtensions() const override;
319*8975f5c5SAndroid Build Coastguard Worker     const gl::Limitations &getNativeLimitations() const override;
320*8975f5c5SAndroid Build Coastguard Worker     const ShPixelLocalStorageOptions &getNativePixelLocalStorageOptions() const override;
321*8975f5c5SAndroid Build Coastguard Worker 
322*8975f5c5SAndroid Build Coastguard Worker     // Shader creation
323*8975f5c5SAndroid Build Coastguard Worker     CompilerImpl *createCompiler() override;
324*8975f5c5SAndroid Build Coastguard Worker     ShaderImpl *createShader(const gl::ShaderState &state) override;
325*8975f5c5SAndroid Build Coastguard Worker     ProgramImpl *createProgram(const gl::ProgramState &state) override;
326*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutableImpl *createProgramExecutable(
327*8975f5c5SAndroid Build Coastguard Worker         const gl::ProgramExecutable *executable) override;
328*8975f5c5SAndroid Build Coastguard Worker 
329*8975f5c5SAndroid Build Coastguard Worker     // Framebuffer creation
330*8975f5c5SAndroid Build Coastguard Worker     FramebufferImpl *createFramebuffer(const gl::FramebufferState &state) override;
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker     // Texture creation
333*8975f5c5SAndroid Build Coastguard Worker     TextureImpl *createTexture(const gl::TextureState &state) override;
334*8975f5c5SAndroid Build Coastguard Worker 
335*8975f5c5SAndroid Build Coastguard Worker     // Renderbuffer creation
336*8975f5c5SAndroid Build Coastguard Worker     RenderbufferImpl *createRenderbuffer(const gl::RenderbufferState &state) override;
337*8975f5c5SAndroid Build Coastguard Worker 
338*8975f5c5SAndroid Build Coastguard Worker     // Buffer creation
339*8975f5c5SAndroid Build Coastguard Worker     BufferImpl *createBuffer(const gl::BufferState &state) override;
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker     // Vertex Array creation
342*8975f5c5SAndroid Build Coastguard Worker     VertexArrayImpl *createVertexArray(const gl::VertexArrayState &state) override;
343*8975f5c5SAndroid Build Coastguard Worker 
344*8975f5c5SAndroid Build Coastguard Worker     // Query and Fence creation
345*8975f5c5SAndroid Build Coastguard Worker     QueryImpl *createQuery(gl::QueryType type) override;
346*8975f5c5SAndroid Build Coastguard Worker     FenceNVImpl *createFenceNV() override;
347*8975f5c5SAndroid Build Coastguard Worker     SyncImpl *createSync() override;
348*8975f5c5SAndroid Build Coastguard Worker 
349*8975f5c5SAndroid Build Coastguard Worker     // Transform Feedback creation
350*8975f5c5SAndroid Build Coastguard Worker     TransformFeedbackImpl *createTransformFeedback(
351*8975f5c5SAndroid Build Coastguard Worker         const gl::TransformFeedbackState &state) override;
352*8975f5c5SAndroid Build Coastguard Worker 
353*8975f5c5SAndroid Build Coastguard Worker     // Sampler object creation
354*8975f5c5SAndroid Build Coastguard Worker     SamplerImpl *createSampler(const gl::SamplerState &state) override;
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker     // Program Pipeline object creation
357*8975f5c5SAndroid Build Coastguard Worker     ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override;
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker     // Memory object creation.
360*8975f5c5SAndroid Build Coastguard Worker     MemoryObjectImpl *createMemoryObject() override;
361*8975f5c5SAndroid Build Coastguard Worker 
362*8975f5c5SAndroid Build Coastguard Worker     // Semaphore creation.
363*8975f5c5SAndroid Build Coastguard Worker     SemaphoreImpl *createSemaphore() override;
364*8975f5c5SAndroid Build Coastguard Worker 
365*8975f5c5SAndroid Build Coastguard Worker     // Overlay creation.
366*8975f5c5SAndroid Build Coastguard Worker     OverlayImpl *createOverlay(const gl::OverlayState &state) override;
367*8975f5c5SAndroid Build Coastguard Worker 
368*8975f5c5SAndroid Build Coastguard Worker     angle::Result dispatchCompute(const gl::Context *context,
369*8975f5c5SAndroid Build Coastguard Worker                                   GLuint numGroupsX,
370*8975f5c5SAndroid Build Coastguard Worker                                   GLuint numGroupsY,
371*8975f5c5SAndroid Build Coastguard Worker                                   GLuint numGroupsZ) override;
372*8975f5c5SAndroid Build Coastguard Worker     angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect) override;
373*8975f5c5SAndroid Build Coastguard Worker 
374*8975f5c5SAndroid Build Coastguard Worker     angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override;
375*8975f5c5SAndroid Build Coastguard Worker     angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override;
376*8975f5c5SAndroid Build Coastguard Worker 
invalidateTexture(gl::TextureType target)377*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void invalidateTexture(gl::TextureType target) override {}
378*8975f5c5SAndroid Build Coastguard Worker 
hasDisplayTextureShareGroup()379*8975f5c5SAndroid Build Coastguard Worker     bool hasDisplayTextureShareGroup() const { return mState.hasDisplayTextureShareGroup(); }
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker     // EXT_shader_framebuffer_fetch_non_coherent
382*8975f5c5SAndroid Build Coastguard Worker     void framebufferFetchBarrier() override;
383*8975f5c5SAndroid Build Coastguard Worker 
384*8975f5c5SAndroid Build Coastguard Worker     // KHR_blend_equation_advanced
385*8975f5c5SAndroid Build Coastguard Worker     void blendBarrier() override;
386*8975f5c5SAndroid Build Coastguard Worker 
387*8975f5c5SAndroid Build Coastguard Worker     // GL_ANGLE_vulkan_image
388*8975f5c5SAndroid Build Coastguard Worker     angle::Result acquireTextures(const gl::Context *context,
389*8975f5c5SAndroid Build Coastguard Worker                                   const gl::TextureBarrierVector &textureBarriers) override;
390*8975f5c5SAndroid Build Coastguard Worker     angle::Result releaseTextures(const gl::Context *context,
391*8975f5c5SAndroid Build Coastguard Worker                                   gl::TextureBarrierVector *textureBarriers) override;
392*8975f5c5SAndroid Build Coastguard Worker 
393*8975f5c5SAndroid Build Coastguard Worker     // Sets effective Context Priority. Changed by ShareGroupVk.
setPriority(egl::ContextPriority newPriority)394*8975f5c5SAndroid Build Coastguard Worker     void setPriority(egl::ContextPriority newPriority)
395*8975f5c5SAndroid Build Coastguard Worker     {
396*8975f5c5SAndroid Build Coastguard Worker         mContextPriority  = newPriority;
397*8975f5c5SAndroid Build Coastguard Worker         mDeviceQueueIndex = mRenderer->getDeviceQueueIndex(mContextPriority);
398*8975f5c5SAndroid Build Coastguard Worker     }
399*8975f5c5SAndroid Build Coastguard Worker 
400*8975f5c5SAndroid Build Coastguard Worker     VkDevice getDevice() const;
401*8975f5c5SAndroid Build Coastguard Worker     // Effective Context Priority
getPriority()402*8975f5c5SAndroid Build Coastguard Worker     egl::ContextPriority getPriority() const { return mContextPriority; }
getProtectionType()403*8975f5c5SAndroid Build Coastguard Worker     vk::ProtectionType getProtectionType() const { return mProtectionType; }
404*8975f5c5SAndroid Build Coastguard Worker 
getFeatures()405*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE const angle::FeaturesVk &getFeatures() const { return mRenderer->getFeatures(); }
406*8975f5c5SAndroid Build Coastguard Worker 
invalidateVertexAndIndexBuffers()407*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void invalidateVertexAndIndexBuffers()
408*8975f5c5SAndroid Build Coastguard Worker     {
409*8975f5c5SAndroid Build Coastguard Worker         mGraphicsDirtyBits |= kIndexAndVertexDirtyBits;
410*8975f5c5SAndroid Build Coastguard Worker     }
411*8975f5c5SAndroid Build Coastguard Worker 
412*8975f5c5SAndroid Build Coastguard Worker     angle::Result onVertexBufferChange(const vk::BufferHelper *vertexBuffer);
413*8975f5c5SAndroid Build Coastguard Worker 
414*8975f5c5SAndroid Build Coastguard Worker     angle::Result onVertexAttributeChange(size_t attribIndex,
415*8975f5c5SAndroid Build Coastguard Worker                                           GLuint stride,
416*8975f5c5SAndroid Build Coastguard Worker                                           GLuint divisor,
417*8975f5c5SAndroid Build Coastguard Worker                                           angle::FormatID format,
418*8975f5c5SAndroid Build Coastguard Worker                                           bool compressed,
419*8975f5c5SAndroid Build Coastguard Worker                                           GLuint relativeOffset,
420*8975f5c5SAndroid Build Coastguard Worker                                           const vk::BufferHelper *vertexBuffer);
421*8975f5c5SAndroid Build Coastguard Worker 
422*8975f5c5SAndroid Build Coastguard Worker     void invalidateDefaultAttribute(size_t attribIndex);
423*8975f5c5SAndroid Build Coastguard Worker     void invalidateDefaultAttributes(const gl::AttributesMask &dirtyMask);
424*8975f5c5SAndroid Build Coastguard Worker     angle::Result onFramebufferChange(FramebufferVk *framebufferVk, gl::Command command);
425*8975f5c5SAndroid Build Coastguard Worker     void onDrawFramebufferRenderPassDescChange(FramebufferVk *framebufferVk,
426*8975f5c5SAndroid Build Coastguard Worker                                                bool *renderPassDescChangedOut);
onHostVisibleBufferWrite()427*8975f5c5SAndroid Build Coastguard Worker     void onHostVisibleBufferWrite() { mIsAnyHostVisibleBufferWritten = true; }
428*8975f5c5SAndroid Build Coastguard Worker 
429*8975f5c5SAndroid Build Coastguard Worker     void invalidateCurrentTransformFeedbackBuffers();
430*8975f5c5SAndroid Build Coastguard Worker     void onTransformFeedbackStateChanged();
431*8975f5c5SAndroid Build Coastguard Worker     angle::Result onBeginTransformFeedback(
432*8975f5c5SAndroid Build Coastguard Worker         size_t bufferCount,
433*8975f5c5SAndroid Build Coastguard Worker         const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &buffers,
434*8975f5c5SAndroid Build Coastguard Worker         const gl::TransformFeedbackBuffersArray<vk::BufferHelper> &counterBuffers);
435*8975f5c5SAndroid Build Coastguard Worker     void onEndTransformFeedback();
436*8975f5c5SAndroid Build Coastguard Worker     angle::Result onPauseTransformFeedback();
437*8975f5c5SAndroid Build Coastguard Worker     void pauseTransformFeedbackIfActiveUnpaused();
438*8975f5c5SAndroid Build Coastguard Worker 
onColorAccessChange()439*8975f5c5SAndroid Build Coastguard Worker     void onColorAccessChange() { mGraphicsDirtyBits |= kColorAccessChangeDirtyBits; }
onDepthStencilAccessChange()440*8975f5c5SAndroid Build Coastguard Worker     void onDepthStencilAccessChange() { mGraphicsDirtyBits |= kDepthStencilAccessChangeDirtyBits; }
441*8975f5c5SAndroid Build Coastguard Worker 
442*8975f5c5SAndroid Build Coastguard Worker     // When UtilsVk issues draw or dispatch calls, it binds a new pipeline and descriptor sets that
443*8975f5c5SAndroid Build Coastguard Worker     // the context is not aware of.  These functions are called to make sure the pipeline and
444*8975f5c5SAndroid Build Coastguard Worker     // affected descriptor set bindings are dirtied for the next application draw/dispatch call.
445*8975f5c5SAndroid Build Coastguard Worker     void invalidateGraphicsPipelineBinding();
446*8975f5c5SAndroid Build Coastguard Worker     void invalidateComputePipelineBinding();
447*8975f5c5SAndroid Build Coastguard Worker     void invalidateGraphicsDescriptorSet(DescriptorSetIndex usedDescriptorSet);
448*8975f5c5SAndroid Build Coastguard Worker     void invalidateComputeDescriptorSet(DescriptorSetIndex usedDescriptorSet);
449*8975f5c5SAndroid Build Coastguard Worker     void invalidateAllDynamicState();
450*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateRenderPassDepthFeedbackLoopMode(
451*8975f5c5SAndroid Build Coastguard Worker         UpdateDepthFeedbackLoopReason depthReason,
452*8975f5c5SAndroid Build Coastguard Worker         UpdateDepthFeedbackLoopReason stencilReason);
453*8975f5c5SAndroid Build Coastguard Worker 
454*8975f5c5SAndroid Build Coastguard Worker     angle::Result optimizeRenderPassForPresent(vk::ImageViewHelper *colorImageView,
455*8975f5c5SAndroid Build Coastguard Worker                                                vk::ImageHelper *colorImage,
456*8975f5c5SAndroid Build Coastguard Worker                                                vk::ImageHelper *colorImageMS,
457*8975f5c5SAndroid Build Coastguard Worker                                                vk::PresentMode presentMode,
458*8975f5c5SAndroid Build Coastguard Worker                                                bool *imageResolved);
459*8975f5c5SAndroid Build Coastguard Worker 
460*8975f5c5SAndroid Build Coastguard Worker     vk::DynamicQueryPool *getQueryPool(gl::QueryType queryType);
461*8975f5c5SAndroid Build Coastguard Worker 
462*8975f5c5SAndroid Build Coastguard Worker     const VkClearValue &getClearColorValue() const;
463*8975f5c5SAndroid Build Coastguard Worker     const VkClearValue &getClearDepthStencilValue() const;
464*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::ColorMaskStorage::Type getClearColorMasks() const;
getScissor()465*8975f5c5SAndroid Build Coastguard Worker     const VkRect2D &getScissor() const { return mScissor; }
466*8975f5c5SAndroid Build Coastguard Worker     angle::Result getIncompleteTexture(const gl::Context *context,
467*8975f5c5SAndroid Build Coastguard Worker                                        gl::TextureType type,
468*8975f5c5SAndroid Build Coastguard Worker                                        gl::SamplerFormat format,
469*8975f5c5SAndroid Build Coastguard Worker                                        gl::Texture **textureOut);
470*8975f5c5SAndroid Build Coastguard Worker     void updateColorMasks();
471*8975f5c5SAndroid Build Coastguard Worker     void updateBlendFuncsAndEquations();
472*8975f5c5SAndroid Build Coastguard Worker 
473*8975f5c5SAndroid Build Coastguard Worker     void handleError(VkResult errorCode,
474*8975f5c5SAndroid Build Coastguard Worker                      const char *file,
475*8975f5c5SAndroid Build Coastguard Worker                      const char *function,
476*8975f5c5SAndroid Build Coastguard Worker                      unsigned int line) override;
477*8975f5c5SAndroid Build Coastguard Worker 
478*8975f5c5SAndroid Build Coastguard Worker     angle::Result onIndexBufferChange(const vk::BufferHelper *currentIndexBuffer);
479*8975f5c5SAndroid Build Coastguard Worker 
480*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushAndSubmitCommands(const vk::Semaphore *semaphore,
481*8975f5c5SAndroid Build Coastguard Worker                                          const vk::SharedExternalFence *externalFence,
482*8975f5c5SAndroid Build Coastguard Worker                                          RenderPassClosureReason renderPassClosureReason);
483*8975f5c5SAndroid Build Coastguard Worker 
484*8975f5c5SAndroid Build Coastguard Worker     angle::Result finishImpl(RenderPassClosureReason renderPassClosureReason);
485*8975f5c5SAndroid Build Coastguard Worker 
486*8975f5c5SAndroid Build Coastguard Worker     void addWaitSemaphore(VkSemaphore semaphore, VkPipelineStageFlags stageMask);
487*8975f5c5SAndroid Build Coastguard Worker 
488*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
addGarbage(T * object)489*8975f5c5SAndroid Build Coastguard Worker     void addGarbage(T *object)
490*8975f5c5SAndroid Build Coastguard Worker     {
491*8975f5c5SAndroid Build Coastguard Worker         if (object->valid())
492*8975f5c5SAndroid Build Coastguard Worker         {
493*8975f5c5SAndroid Build Coastguard Worker             mCurrentGarbage.emplace_back(vk::GetGarbage(object));
494*8975f5c5SAndroid Build Coastguard Worker         }
495*8975f5c5SAndroid Build Coastguard Worker     }
496*8975f5c5SAndroid Build Coastguard Worker 
497*8975f5c5SAndroid Build Coastguard Worker     angle::Result getCompatibleRenderPass(const vk::RenderPassDesc &desc,
498*8975f5c5SAndroid Build Coastguard Worker                                           const vk::RenderPass **renderPassOut);
499*8975f5c5SAndroid Build Coastguard Worker     angle::Result getRenderPassWithOps(const vk::RenderPassDesc &desc,
500*8975f5c5SAndroid Build Coastguard Worker                                        const vk::AttachmentOpsArray &ops,
501*8975f5c5SAndroid Build Coastguard Worker                                        const vk::RenderPass **renderPassOut);
502*8975f5c5SAndroid Build Coastguard Worker 
getShaderLibrary()503*8975f5c5SAndroid Build Coastguard Worker     vk::ShaderLibrary &getShaderLibrary() { return mShaderLibrary; }
getUtils()504*8975f5c5SAndroid Build Coastguard Worker     UtilsVk &getUtils() { return mUtils; }
505*8975f5c5SAndroid Build Coastguard Worker 
506*8975f5c5SAndroid Build Coastguard Worker     angle::Result getTimestamp(uint64_t *timestampOut);
507*8975f5c5SAndroid Build Coastguard Worker 
508*8975f5c5SAndroid Build Coastguard Worker     // Create Begin/End/Instant GPU trace events, which take their timestamps from GPU queries.
509*8975f5c5SAndroid Build Coastguard Worker     // The events are queued until the query results are available.  Possible values for `phase`
510*8975f5c5SAndroid Build Coastguard Worker     // are TRACE_EVENT_PHASE_*
traceGpuEvent(vk::OutsideRenderPassCommandBuffer * commandBuffer,char phase,const EventName & name)511*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE angle::Result traceGpuEvent(vk::OutsideRenderPassCommandBuffer *commandBuffer,
512*8975f5c5SAndroid Build Coastguard Worker                                              char phase,
513*8975f5c5SAndroid Build Coastguard Worker                                              const EventName &name)
514*8975f5c5SAndroid Build Coastguard Worker     {
515*8975f5c5SAndroid Build Coastguard Worker         if (mGpuEventsEnabled)
516*8975f5c5SAndroid Build Coastguard Worker             return traceGpuEventImpl(commandBuffer, phase, name);
517*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
518*8975f5c5SAndroid Build Coastguard Worker     }
519*8975f5c5SAndroid Build Coastguard Worker 
getDebug()520*8975f5c5SAndroid Build Coastguard Worker     const gl::Debug &getDebug() const { return mState.getDebug(); }
getOverlay()521*8975f5c5SAndroid Build Coastguard Worker     const gl::OverlayType *getOverlay() const { return mState.getOverlay(); }
522*8975f5c5SAndroid Build Coastguard Worker 
523*8975f5c5SAndroid Build Coastguard Worker     angle::Result onBufferReleaseToExternal(const vk::BufferHelper &buffer);
524*8975f5c5SAndroid Build Coastguard Worker     angle::Result onImageReleaseToExternal(const vk::ImageHelper &image);
525*8975f5c5SAndroid Build Coastguard Worker 
onImageRenderPassRead(VkImageAspectFlags aspectFlags,vk::ImageLayout imageLayout,vk::ImageHelper * image)526*8975f5c5SAndroid Build Coastguard Worker     void onImageRenderPassRead(VkImageAspectFlags aspectFlags,
527*8975f5c5SAndroid Build Coastguard Worker                                vk::ImageLayout imageLayout,
528*8975f5c5SAndroid Build Coastguard Worker                                vk::ImageHelper *image)
529*8975f5c5SAndroid Build Coastguard Worker     {
530*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mRenderPassCommands->started());
531*8975f5c5SAndroid Build Coastguard Worker         mRenderPassCommands->imageRead(this, aspectFlags, imageLayout, image);
532*8975f5c5SAndroid Build Coastguard Worker     }
533*8975f5c5SAndroid Build Coastguard Worker 
onImageRenderPassWrite(gl::LevelIndex level,uint32_t layerStart,uint32_t layerCount,VkImageAspectFlags aspectFlags,vk::ImageLayout imageLayout,vk::ImageHelper * image)534*8975f5c5SAndroid Build Coastguard Worker     void onImageRenderPassWrite(gl::LevelIndex level,
535*8975f5c5SAndroid Build Coastguard Worker                                 uint32_t layerStart,
536*8975f5c5SAndroid Build Coastguard Worker                                 uint32_t layerCount,
537*8975f5c5SAndroid Build Coastguard Worker                                 VkImageAspectFlags aspectFlags,
538*8975f5c5SAndroid Build Coastguard Worker                                 vk::ImageLayout imageLayout,
539*8975f5c5SAndroid Build Coastguard Worker                                 vk::ImageHelper *image)
540*8975f5c5SAndroid Build Coastguard Worker     {
541*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mRenderPassCommands->started());
542*8975f5c5SAndroid Build Coastguard Worker         mRenderPassCommands->imageWrite(this, level, layerStart, layerCount, aspectFlags,
543*8975f5c5SAndroid Build Coastguard Worker                                         imageLayout, image);
544*8975f5c5SAndroid Build Coastguard Worker     }
545*8975f5c5SAndroid Build Coastguard Worker 
onColorDraw(gl::LevelIndex level,uint32_t layerStart,uint32_t layerCount,vk::ImageHelper * image,vk::ImageHelper * resolveImage,UniqueSerial imageSiblingSerial,vk::PackedAttachmentIndex packedAttachmentIndex)546*8975f5c5SAndroid Build Coastguard Worker     void onColorDraw(gl::LevelIndex level,
547*8975f5c5SAndroid Build Coastguard Worker                      uint32_t layerStart,
548*8975f5c5SAndroid Build Coastguard Worker                      uint32_t layerCount,
549*8975f5c5SAndroid Build Coastguard Worker                      vk::ImageHelper *image,
550*8975f5c5SAndroid Build Coastguard Worker                      vk::ImageHelper *resolveImage,
551*8975f5c5SAndroid Build Coastguard Worker                      UniqueSerial imageSiblingSerial,
552*8975f5c5SAndroid Build Coastguard Worker                      vk::PackedAttachmentIndex packedAttachmentIndex)
553*8975f5c5SAndroid Build Coastguard Worker     {
554*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mRenderPassCommands->started());
555*8975f5c5SAndroid Build Coastguard Worker         mRenderPassCommands->colorImagesDraw(level, layerStart, layerCount, image, resolveImage,
556*8975f5c5SAndroid Build Coastguard Worker                                              imageSiblingSerial, packedAttachmentIndex);
557*8975f5c5SAndroid Build Coastguard Worker     }
onColorResolve(gl::LevelIndex level,uint32_t layerStart,uint32_t layerCount,vk::ImageHelper * image,VkImageView view,UniqueSerial imageSiblingSerial,size_t colorIndexGL)558*8975f5c5SAndroid Build Coastguard Worker     void onColorResolve(gl::LevelIndex level,
559*8975f5c5SAndroid Build Coastguard Worker                         uint32_t layerStart,
560*8975f5c5SAndroid Build Coastguard Worker                         uint32_t layerCount,
561*8975f5c5SAndroid Build Coastguard Worker                         vk::ImageHelper *image,
562*8975f5c5SAndroid Build Coastguard Worker                         VkImageView view,
563*8975f5c5SAndroid Build Coastguard Worker                         UniqueSerial imageSiblingSerial,
564*8975f5c5SAndroid Build Coastguard Worker                         size_t colorIndexGL)
565*8975f5c5SAndroid Build Coastguard Worker     {
566*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mRenderPassCommands->started());
567*8975f5c5SAndroid Build Coastguard Worker         mRenderPassCommands->addColorResolveAttachment(colorIndexGL, image, view, level, layerStart,
568*8975f5c5SAndroid Build Coastguard Worker                                                        layerCount, imageSiblingSerial);
569*8975f5c5SAndroid Build Coastguard Worker     }
onDepthStencilDraw(gl::LevelIndex level,uint32_t layerStart,uint32_t layerCount,vk::ImageHelper * image,vk::ImageHelper * resolveImage,UniqueSerial imageSiblingSerial)570*8975f5c5SAndroid Build Coastguard Worker     void onDepthStencilDraw(gl::LevelIndex level,
571*8975f5c5SAndroid Build Coastguard Worker                             uint32_t layerStart,
572*8975f5c5SAndroid Build Coastguard Worker                             uint32_t layerCount,
573*8975f5c5SAndroid Build Coastguard Worker                             vk::ImageHelper *image,
574*8975f5c5SAndroid Build Coastguard Worker                             vk::ImageHelper *resolveImage,
575*8975f5c5SAndroid Build Coastguard Worker                             UniqueSerial imageSiblingSerial)
576*8975f5c5SAndroid Build Coastguard Worker     {
577*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mRenderPassCommands->started());
578*8975f5c5SAndroid Build Coastguard Worker         mRenderPassCommands->depthStencilImagesDraw(level, layerStart, layerCount, image,
579*8975f5c5SAndroid Build Coastguard Worker                                                     resolveImage, imageSiblingSerial);
580*8975f5c5SAndroid Build Coastguard Worker     }
onDepthStencilResolve(gl::LevelIndex level,uint32_t layerStart,uint32_t layerCount,VkImageAspectFlags aspects,vk::ImageHelper * image,VkImageView view,UniqueSerial imageSiblingSerial)581*8975f5c5SAndroid Build Coastguard Worker     void onDepthStencilResolve(gl::LevelIndex level,
582*8975f5c5SAndroid Build Coastguard Worker                                uint32_t layerStart,
583*8975f5c5SAndroid Build Coastguard Worker                                uint32_t layerCount,
584*8975f5c5SAndroid Build Coastguard Worker                                VkImageAspectFlags aspects,
585*8975f5c5SAndroid Build Coastguard Worker                                vk::ImageHelper *image,
586*8975f5c5SAndroid Build Coastguard Worker                                VkImageView view,
587*8975f5c5SAndroid Build Coastguard Worker                                UniqueSerial imageSiblingSerial)
588*8975f5c5SAndroid Build Coastguard Worker     {
589*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mRenderPassCommands->started());
590*8975f5c5SAndroid Build Coastguard Worker         mRenderPassCommands->addDepthStencilResolveAttachment(
591*8975f5c5SAndroid Build Coastguard Worker             image, view, aspects, level, layerStart, layerCount, imageSiblingSerial);
592*8975f5c5SAndroid Build Coastguard Worker     }
593*8975f5c5SAndroid Build Coastguard Worker 
onFragmentShadingRateRead(vk::ImageHelper * image)594*8975f5c5SAndroid Build Coastguard Worker     void onFragmentShadingRateRead(vk::ImageHelper *image)
595*8975f5c5SAndroid Build Coastguard Worker     {
596*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mRenderPassCommands->started());
597*8975f5c5SAndroid Build Coastguard Worker         mRenderPassCommands->fragmentShadingRateImageRead(image);
598*8975f5c5SAndroid Build Coastguard Worker     }
599*8975f5c5SAndroid Build Coastguard Worker 
finalizeImageLayout(const vk::ImageHelper * image,UniqueSerial imageSiblingSerial)600*8975f5c5SAndroid Build Coastguard Worker     void finalizeImageLayout(const vk::ImageHelper *image, UniqueSerial imageSiblingSerial)
601*8975f5c5SAndroid Build Coastguard Worker     {
602*8975f5c5SAndroid Build Coastguard Worker         if (mRenderPassCommands->started())
603*8975f5c5SAndroid Build Coastguard Worker         {
604*8975f5c5SAndroid Build Coastguard Worker             mRenderPassCommands->finalizeImageLayout(this, image, imageSiblingSerial);
605*8975f5c5SAndroid Build Coastguard Worker         }
606*8975f5c5SAndroid Build Coastguard Worker     }
607*8975f5c5SAndroid Build Coastguard Worker 
getOutsideRenderPassCommandBuffer(const vk::CommandBufferAccess & access,vk::OutsideRenderPassCommandBuffer ** commandBufferOut)608*8975f5c5SAndroid Build Coastguard Worker     angle::Result getOutsideRenderPassCommandBuffer(
609*8975f5c5SAndroid Build Coastguard Worker         const vk::CommandBufferAccess &access,
610*8975f5c5SAndroid Build Coastguard Worker         vk::OutsideRenderPassCommandBuffer **commandBufferOut)
611*8975f5c5SAndroid Build Coastguard Worker     {
612*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(onResourceAccess(access));
613*8975f5c5SAndroid Build Coastguard Worker         *commandBufferOut = &mOutsideRenderPassCommands->getCommandBuffer();
614*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
615*8975f5c5SAndroid Build Coastguard Worker     }
616*8975f5c5SAndroid Build Coastguard Worker 
getOutsideRenderPassCommandBufferHelper(const vk::CommandBufferAccess & access,vk::OutsideRenderPassCommandBufferHelper ** commandBufferHelperOut)617*8975f5c5SAndroid Build Coastguard Worker     angle::Result getOutsideRenderPassCommandBufferHelper(
618*8975f5c5SAndroid Build Coastguard Worker         const vk::CommandBufferAccess &access,
619*8975f5c5SAndroid Build Coastguard Worker         vk::OutsideRenderPassCommandBufferHelper **commandBufferHelperOut)
620*8975f5c5SAndroid Build Coastguard Worker     {
621*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(onResourceAccess(access));
622*8975f5c5SAndroid Build Coastguard Worker         *commandBufferHelperOut = mOutsideRenderPassCommands;
623*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
624*8975f5c5SAndroid Build Coastguard Worker     }
625*8975f5c5SAndroid Build Coastguard Worker 
trackImageWithOutsideRenderPassEvent(vk::ImageHelper * image)626*8975f5c5SAndroid Build Coastguard Worker     void trackImageWithOutsideRenderPassEvent(vk::ImageHelper *image)
627*8975f5c5SAndroid Build Coastguard Worker     {
628*8975f5c5SAndroid Build Coastguard Worker         if (mRenderer->getFeatures().useVkEventForImageBarrier.enabled)
629*8975f5c5SAndroid Build Coastguard Worker         {
630*8975f5c5SAndroid Build Coastguard Worker             mOutsideRenderPassCommands->trackImageWithEvent(this, image);
631*8975f5c5SAndroid Build Coastguard Worker         }
632*8975f5c5SAndroid Build Coastguard Worker     }
submitStagedTextureUpdates()633*8975f5c5SAndroid Build Coastguard Worker     angle::Result submitStagedTextureUpdates()
634*8975f5c5SAndroid Build Coastguard Worker     {
635*8975f5c5SAndroid Build Coastguard Worker         // Staged updates are recorded in outside RP cammand buffer, submit them.
636*8975f5c5SAndroid Build Coastguard Worker         return flushOutsideRenderPassCommands();
637*8975f5c5SAndroid Build Coastguard Worker     }
638*8975f5c5SAndroid Build Coastguard Worker 
onEGLImageQueueChange()639*8975f5c5SAndroid Build Coastguard Worker     angle::Result onEGLImageQueueChange()
640*8975f5c5SAndroid Build Coastguard Worker     {
641*8975f5c5SAndroid Build Coastguard Worker         // Flush the barrier inserted to change the queue and layout of an EGL image.  Another
642*8975f5c5SAndroid Build Coastguard Worker         // thread may start using this image without issuing a sync object.
643*8975f5c5SAndroid Build Coastguard Worker         return flushOutsideRenderPassCommands();
644*8975f5c5SAndroid Build Coastguard Worker     }
645*8975f5c5SAndroid Build Coastguard Worker 
646*8975f5c5SAndroid Build Coastguard Worker     angle::Result beginNewRenderPass(vk::RenderPassFramebuffer &&framebuffer,
647*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Rectangle &renderArea,
648*8975f5c5SAndroid Build Coastguard Worker                                      const vk::RenderPassDesc &renderPassDesc,
649*8975f5c5SAndroid Build Coastguard Worker                                      const vk::AttachmentOpsArray &renderPassAttachmentOps,
650*8975f5c5SAndroid Build Coastguard Worker                                      const vk::PackedAttachmentCount colorAttachmentCount,
651*8975f5c5SAndroid Build Coastguard Worker                                      const vk::PackedAttachmentIndex depthStencilAttachmentIndex,
652*8975f5c5SAndroid Build Coastguard Worker                                      const vk::PackedClearValuesArray &clearValues,
653*8975f5c5SAndroid Build Coastguard Worker                                      vk::RenderPassCommandBuffer **commandBufferOut);
654*8975f5c5SAndroid Build Coastguard Worker 
disableRenderPassReactivation()655*8975f5c5SAndroid Build Coastguard Worker     void disableRenderPassReactivation() { mAllowRenderPassToReactivate = false; }
656*8975f5c5SAndroid Build Coastguard Worker 
657*8975f5c5SAndroid Build Coastguard Worker     // Only returns true if we have a started RP and we've run setupDraw.
hasActiveRenderPass()658*8975f5c5SAndroid Build Coastguard Worker     bool hasActiveRenderPass() const
659*8975f5c5SAndroid Build Coastguard Worker     {
660*8975f5c5SAndroid Build Coastguard Worker         // If mRenderPassCommandBuffer is not null, mRenderPassCommands must already started, we
661*8975f5c5SAndroid Build Coastguard Worker         // call this active render pass. A started render pass will have null
662*8975f5c5SAndroid Build Coastguard Worker         // mRenderPassCommandBuffer after onRenderPassFinished call, we call this state started but
663*8975f5c5SAndroid Build Coastguard Worker         // inactive.
664*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mRenderPassCommandBuffer == nullptr || mRenderPassCommands->started());
665*8975f5c5SAndroid Build Coastguard Worker         // Checking mRenderPassCommandBuffer ensures we've called setupDraw.
666*8975f5c5SAndroid Build Coastguard Worker         return mRenderPassCommandBuffer != nullptr;
667*8975f5c5SAndroid Build Coastguard Worker     }
668*8975f5c5SAndroid Build Coastguard Worker 
hasStartedRenderPassWithQueueSerial(const QueueSerial & queueSerial)669*8975f5c5SAndroid Build Coastguard Worker     bool hasStartedRenderPassWithQueueSerial(const QueueSerial &queueSerial) const
670*8975f5c5SAndroid Build Coastguard Worker     {
671*8975f5c5SAndroid Build Coastguard Worker         return mRenderPassCommands->started() &&
672*8975f5c5SAndroid Build Coastguard Worker                mRenderPassCommands->getQueueSerial() == queueSerial;
673*8975f5c5SAndroid Build Coastguard Worker     }
hasStartedRenderPassWithDefaultFramebuffer()674*8975f5c5SAndroid Build Coastguard Worker     bool hasStartedRenderPassWithDefaultFramebuffer() const
675*8975f5c5SAndroid Build Coastguard Worker     {
676*8975f5c5SAndroid Build Coastguard Worker         // WindowSurfaceVk caches its own framebuffers and guarantees that render passes are not
677*8975f5c5SAndroid Build Coastguard Worker         // kept open between frames (including when a swapchain is recreated and framebuffer handles
678*8975f5c5SAndroid Build Coastguard Worker         // change).  It is therefore safe to verify an open render pass just by checking if it
679*8975f5c5SAndroid Build Coastguard Worker         // originated from the default framebuffer.
680*8975f5c5SAndroid Build Coastguard Worker         return mRenderPassCommands->started() && mRenderPassCommands->isDefault();
681*8975f5c5SAndroid Build Coastguard Worker     }
682*8975f5c5SAndroid Build Coastguard Worker 
isRenderPassStartedAndUsesBuffer(const vk::BufferHelper & buffer)683*8975f5c5SAndroid Build Coastguard Worker     bool isRenderPassStartedAndUsesBuffer(const vk::BufferHelper &buffer) const
684*8975f5c5SAndroid Build Coastguard Worker     {
685*8975f5c5SAndroid Build Coastguard Worker         return mRenderPassCommands->started() && mRenderPassCommands->usesBuffer(buffer);
686*8975f5c5SAndroid Build Coastguard Worker     }
687*8975f5c5SAndroid Build Coastguard Worker 
isRenderPassStartedAndUsesBufferForWrite(const vk::BufferHelper & buffer)688*8975f5c5SAndroid Build Coastguard Worker     bool isRenderPassStartedAndUsesBufferForWrite(const vk::BufferHelper &buffer) const
689*8975f5c5SAndroid Build Coastguard Worker     {
690*8975f5c5SAndroid Build Coastguard Worker         return mRenderPassCommands->started() && mRenderPassCommands->usesBufferForWrite(buffer);
691*8975f5c5SAndroid Build Coastguard Worker     }
692*8975f5c5SAndroid Build Coastguard Worker 
isRenderPassStartedAndUsesImage(const vk::ImageHelper & image)693*8975f5c5SAndroid Build Coastguard Worker     bool isRenderPassStartedAndUsesImage(const vk::ImageHelper &image) const
694*8975f5c5SAndroid Build Coastguard Worker     {
695*8975f5c5SAndroid Build Coastguard Worker         return mRenderPassCommands->started() && mRenderPassCommands->usesImage(image);
696*8975f5c5SAndroid Build Coastguard Worker     }
697*8975f5c5SAndroid Build Coastguard Worker 
getStartedRenderPassCommands()698*8975f5c5SAndroid Build Coastguard Worker     vk::RenderPassCommandBufferHelper &getStartedRenderPassCommands()
699*8975f5c5SAndroid Build Coastguard Worker     {
700*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mRenderPassCommands->started());
701*8975f5c5SAndroid Build Coastguard Worker         return *mRenderPassCommands;
702*8975f5c5SAndroid Build Coastguard Worker     }
703*8975f5c5SAndroid Build Coastguard Worker 
704*8975f5c5SAndroid Build Coastguard Worker     uint32_t getCurrentSubpassIndex() const;
705*8975f5c5SAndroid Build Coastguard Worker     uint32_t getCurrentViewCount() const;
706*8975f5c5SAndroid Build Coastguard Worker 
707*8975f5c5SAndroid Build Coastguard Worker     // Initial Context Priority. Used for EGL_CONTEXT_PRIORITY_LEVEL_IMG attribute.
getContextPriority()708*8975f5c5SAndroid Build Coastguard Worker     egl::ContextPriority getContextPriority() const override { return mInitialContextPriority; }
709*8975f5c5SAndroid Build Coastguard Worker     angle::Result startRenderPass(gl::Rectangle renderArea,
710*8975f5c5SAndroid Build Coastguard Worker                                   vk::RenderPassCommandBuffer **commandBufferOut,
711*8975f5c5SAndroid Build Coastguard Worker                                   bool *renderPassDescChangedOut);
712*8975f5c5SAndroid Build Coastguard Worker     angle::Result startNextSubpass();
713*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushCommandsAndEndRenderPass(RenderPassClosureReason reason);
714*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushCommandsAndEndRenderPassWithoutSubmit(RenderPassClosureReason reason);
715*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushAndSubmitOutsideRenderPassCommands();
716*8975f5c5SAndroid Build Coastguard Worker 
717*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncExternalMemory();
718*8975f5c5SAndroid Build Coastguard Worker 
719*8975f5c5SAndroid Build Coastguard Worker     // Either issue a submission or defer it when a sync object is initialized.  If deferred, a
720*8975f5c5SAndroid Build Coastguard Worker     // submission will have to be incurred during client wait.
721*8975f5c5SAndroid Build Coastguard Worker     angle::Result onSyncObjectInit(vk::SyncHelper *syncHelper, SyncFenceScope scope);
722*8975f5c5SAndroid Build Coastguard Worker     // Called when a sync object is waited on while its submission was deffered in onSyncObjectInit.
723*8975f5c5SAndroid Build Coastguard Worker     // It's a no-op if this context doesn't have a pending submission.  Note that due to
724*8975f5c5SAndroid Build Coastguard Worker     // mHasDeferredFlush being set, flushing the render pass leads to a submission automatically.
725*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushCommandsAndEndRenderPassIfDeferredSyncInit(RenderPassClosureReason reason);
726*8975f5c5SAndroid Build Coastguard Worker 
727*8975f5c5SAndroid Build Coastguard Worker     void addCommandBufferDiagnostics(const std::string &commandBufferDiagnostics);
728*8975f5c5SAndroid Build Coastguard Worker 
729*8975f5c5SAndroid Build Coastguard Worker     VkIndexType getVkIndexType(gl::DrawElementsType glIndexType) const;
730*8975f5c5SAndroid Build Coastguard Worker     size_t getVkIndexTypeSize(gl::DrawElementsType glIndexType) const;
731*8975f5c5SAndroid Build Coastguard Worker     bool shouldConvertUint8VkIndexType(gl::DrawElementsType glIndexType) const;
732*8975f5c5SAndroid Build Coastguard Worker 
733*8975f5c5SAndroid Build Coastguard Worker     bool isRobustResourceInitEnabled() const;
hasRobustAccess()734*8975f5c5SAndroid Build Coastguard Worker     bool hasRobustAccess() const { return mState.hasRobustAccess(); }
735*8975f5c5SAndroid Build Coastguard Worker 
736*8975f5c5SAndroid Build Coastguard Worker     // Queries that begin and end automatically with render pass start and end
737*8975f5c5SAndroid Build Coastguard Worker     angle::Result beginRenderPassQuery(QueryVk *queryVk);
738*8975f5c5SAndroid Build Coastguard Worker     angle::Result endRenderPassQuery(QueryVk *queryVk);
739*8975f5c5SAndroid Build Coastguard Worker     void pauseRenderPassQueriesIfActive();
740*8975f5c5SAndroid Build Coastguard Worker     angle::Result resumeRenderPassQueriesIfActive();
741*8975f5c5SAndroid Build Coastguard Worker     angle::Result resumeXfbRenderPassQueriesIfActive();
742*8975f5c5SAndroid Build Coastguard Worker     bool doesPrimitivesGeneratedQuerySupportRasterizerDiscard() const;
743*8975f5c5SAndroid Build Coastguard Worker     bool isEmulatingRasterizerDiscardDuringPrimitivesGeneratedQuery(
744*8975f5c5SAndroid Build Coastguard Worker         bool isPrimitivesGeneratedQueryActive) const;
745*8975f5c5SAndroid Build Coastguard Worker 
746*8975f5c5SAndroid Build Coastguard Worker     // Used by QueryVk to share query helpers between transform feedback queries.
747*8975f5c5SAndroid Build Coastguard Worker     QueryVk *getActiveRenderPassQuery(gl::QueryType queryType) const;
748*8975f5c5SAndroid Build Coastguard Worker 
749*8975f5c5SAndroid Build Coastguard Worker     void syncObjectPerfCounters(const angle::VulkanPerfCounters &commandQueuePerfCounters);
750*8975f5c5SAndroid Build Coastguard Worker     void updateOverlayOnPresent();
751*8975f5c5SAndroid Build Coastguard Worker     void addOverlayUsedBuffersCount(vk::CommandBufferHelperCommon *commandBuffer);
752*8975f5c5SAndroid Build Coastguard Worker 
753*8975f5c5SAndroid Build Coastguard Worker     // For testing only.
754*8975f5c5SAndroid Build Coastguard Worker     void setDefaultUniformBlocksMinSizeForTesting(size_t minSize);
755*8975f5c5SAndroid Build Coastguard Worker 
getEmptyBuffer()756*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper &getEmptyBuffer() { return mEmptyBuffer; }
757*8975f5c5SAndroid Build Coastguard Worker 
758*8975f5c5SAndroid Build Coastguard Worker     // Keeping track of the buffer copy size. Used to determine when to submit the outside command
759*8975f5c5SAndroid Build Coastguard Worker     // buffer.
760*8975f5c5SAndroid Build Coastguard Worker     angle::Result onCopyUpdate(VkDeviceSize size, bool *commandBufferWasFlushedOut);
761*8975f5c5SAndroid Build Coastguard Worker 
762*8975f5c5SAndroid Build Coastguard Worker     // Implementation of MultisampleTextureInitializer
763*8975f5c5SAndroid Build Coastguard Worker     angle::Result initializeMultisampleTextureToBlack(const gl::Context *context,
764*8975f5c5SAndroid Build Coastguard Worker                                                       gl::Texture *glTexture) override;
765*8975f5c5SAndroid Build Coastguard Worker 
766*8975f5c5SAndroid Build Coastguard Worker     // TODO(http://anglebug.com/42264159): rework updateActiveTextures(), createPipelineLayout(),
767*8975f5c5SAndroid Build Coastguard Worker     // handleDirtyGraphicsPipeline(), and ProgramPipelineVk::link().
resetCurrentGraphicsPipeline()768*8975f5c5SAndroid Build Coastguard Worker     void resetCurrentGraphicsPipeline()
769*8975f5c5SAndroid Build Coastguard Worker     {
770*8975f5c5SAndroid Build Coastguard Worker         mCurrentGraphicsPipeline        = nullptr;
771*8975f5c5SAndroid Build Coastguard Worker         mCurrentGraphicsPipelineShaders = nullptr;
772*8975f5c5SAndroid Build Coastguard Worker     }
773*8975f5c5SAndroid Build Coastguard Worker 
774*8975f5c5SAndroid Build Coastguard Worker     void onProgramExecutableReset(ProgramExecutableVk *executableVk);
775*8975f5c5SAndroid Build Coastguard Worker 
776*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleGraphicsEventLog(GraphicsEventCmdBuf queryEventType);
777*8975f5c5SAndroid Build Coastguard Worker 
778*8975f5c5SAndroid Build Coastguard Worker     void flushDescriptorSetUpdates();
779*8975f5c5SAndroid Build Coastguard Worker 
getDefaultBufferPool(VkDeviceSize size,uint32_t memoryTypeIndex,BufferUsageType usageType)780*8975f5c5SAndroid Build Coastguard Worker     vk::BufferPool *getDefaultBufferPool(VkDeviceSize size,
781*8975f5c5SAndroid Build Coastguard Worker                                          uint32_t memoryTypeIndex,
782*8975f5c5SAndroid Build Coastguard Worker                                          BufferUsageType usageType)
783*8975f5c5SAndroid Build Coastguard Worker     {
784*8975f5c5SAndroid Build Coastguard Worker         return mShareGroupVk->getDefaultBufferPool(size, memoryTypeIndex, usageType);
785*8975f5c5SAndroid Build Coastguard Worker     }
786*8975f5c5SAndroid Build Coastguard Worker 
allocateStreamedVertexBuffer(size_t attribIndex,size_t bytesToAllocate,vk::BufferHelper ** vertexBufferOut)787*8975f5c5SAndroid Build Coastguard Worker     angle::Result allocateStreamedVertexBuffer(size_t attribIndex,
788*8975f5c5SAndroid Build Coastguard Worker                                                size_t bytesToAllocate,
789*8975f5c5SAndroid Build Coastguard Worker                                                vk::BufferHelper **vertexBufferOut)
790*8975f5c5SAndroid Build Coastguard Worker     {
791*8975f5c5SAndroid Build Coastguard Worker         bool newBufferOut;
792*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(mStreamedVertexBuffers[attribIndex].allocate(this, bytesToAllocate,
793*8975f5c5SAndroid Build Coastguard Worker                                                                vertexBufferOut, &newBufferOut));
794*8975f5c5SAndroid Build Coastguard Worker         if (newBufferOut)
795*8975f5c5SAndroid Build Coastguard Worker         {
796*8975f5c5SAndroid Build Coastguard Worker             mHasInFlightStreamedVertexBuffers.set(attribIndex);
797*8975f5c5SAndroid Build Coastguard Worker         }
798*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
799*8975f5c5SAndroid Build Coastguard Worker     }
800*8975f5c5SAndroid Build Coastguard Worker 
801*8975f5c5SAndroid Build Coastguard Worker     // Put the context in framebuffer fetch mode.  If the permanentlySwitchToFramebufferFetchMode
802*8975f5c5SAndroid Build Coastguard Worker     // feature is enabled, this is done on first encounter of framebuffer fetch, and makes the
803*8975f5c5SAndroid Build Coastguard Worker     // context use framebuffer-fetch-enabled render passes from here on.
804*8975f5c5SAndroid Build Coastguard Worker     angle::Result switchToColorFramebufferFetchMode(bool hasColorFramebufferFetch);
isInColorFramebufferFetchMode()805*8975f5c5SAndroid Build Coastguard Worker     bool isInColorFramebufferFetchMode() const
806*8975f5c5SAndroid Build Coastguard Worker     {
807*8975f5c5SAndroid Build Coastguard Worker         ASSERT(!getFeatures().preferDynamicRendering.enabled);
808*8975f5c5SAndroid Build Coastguard Worker         return mIsInColorFramebufferFetchMode;
809*8975f5c5SAndroid Build Coastguard Worker     }
810*8975f5c5SAndroid Build Coastguard Worker 
811*8975f5c5SAndroid Build Coastguard Worker     const angle::PerfMonitorCounterGroups &getPerfMonitorCounters() override;
812*8975f5c5SAndroid Build Coastguard Worker 
813*8975f5c5SAndroid Build Coastguard Worker     void resetPerFramePerfCounters();
814*8975f5c5SAndroid Build Coastguard Worker 
815*8975f5c5SAndroid Build Coastguard Worker     // Accumulate cache stats for a specific cache
accumulateCacheStats(VulkanCacheType cache,const CacheStats & stats)816*8975f5c5SAndroid Build Coastguard Worker     void accumulateCacheStats(VulkanCacheType cache, const CacheStats &stats)
817*8975f5c5SAndroid Build Coastguard Worker     {
818*8975f5c5SAndroid Build Coastguard Worker         mVulkanCacheStats[cache].accumulate(stats);
819*8975f5c5SAndroid Build Coastguard Worker     }
820*8975f5c5SAndroid Build Coastguard Worker 
821*8975f5c5SAndroid Build Coastguard Worker     // Whether VK_EXT_pipeline_robustness should be used to enable robust buffer access in the
822*8975f5c5SAndroid Build Coastguard Worker     // pipeline.
pipelineRobustness()823*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineRobustness pipelineRobustness() const
824*8975f5c5SAndroid Build Coastguard Worker     {
825*8975f5c5SAndroid Build Coastguard Worker         return getFeatures().supportsPipelineRobustness.enabled && mState.hasRobustAccess()
826*8975f5c5SAndroid Build Coastguard Worker                    ? vk::PipelineRobustness::Robust
827*8975f5c5SAndroid Build Coastguard Worker                    : vk::PipelineRobustness::NonRobust;
828*8975f5c5SAndroid Build Coastguard Worker     }
829*8975f5c5SAndroid Build Coastguard Worker     // Whether VK_EXT_pipeline_protected_access should be used to restrict the pipeline to protected
830*8975f5c5SAndroid Build Coastguard Worker     // command buffers.  Note that when false, if the extension is supported, the pipeline can be
831*8975f5c5SAndroid Build Coastguard Worker     // restricted to unprotected command buffers.
pipelineProtectedAccess()832*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineProtectedAccess pipelineProtectedAccess() const
833*8975f5c5SAndroid Build Coastguard Worker     {
834*8975f5c5SAndroid Build Coastguard Worker         return getFeatures().supportsPipelineProtectedAccess.enabled && mState.hasProtectedContent()
835*8975f5c5SAndroid Build Coastguard Worker                    ? vk::PipelineProtectedAccess::Protected
836*8975f5c5SAndroid Build Coastguard Worker                    : vk::PipelineProtectedAccess::Unprotected;
837*8975f5c5SAndroid Build Coastguard Worker     }
838*8975f5c5SAndroid Build Coastguard Worker 
getImageLoadContext()839*8975f5c5SAndroid Build Coastguard Worker     const angle::ImageLoadContext &getImageLoadContext() const { return mImageLoadContext; }
840*8975f5c5SAndroid Build Coastguard Worker 
841*8975f5c5SAndroid Build Coastguard Worker     bool hasUnsubmittedUse(const vk::ResourceUse &use) const;
hasUnsubmittedUse(const vk::Resource & resource)842*8975f5c5SAndroid Build Coastguard Worker     bool hasUnsubmittedUse(const vk::Resource &resource) const
843*8975f5c5SAndroid Build Coastguard Worker     {
844*8975f5c5SAndroid Build Coastguard Worker         return hasUnsubmittedUse(resource.getResourceUse());
845*8975f5c5SAndroid Build Coastguard Worker     }
hasUnsubmittedUse(const vk::ReadWriteResource & resource)846*8975f5c5SAndroid Build Coastguard Worker     bool hasUnsubmittedUse(const vk::ReadWriteResource &resource) const
847*8975f5c5SAndroid Build Coastguard Worker     {
848*8975f5c5SAndroid Build Coastguard Worker         return hasUnsubmittedUse(resource.getResourceUse());
849*8975f5c5SAndroid Build Coastguard Worker     }
850*8975f5c5SAndroid Build Coastguard Worker 
getLastSubmittedQueueSerial()851*8975f5c5SAndroid Build Coastguard Worker     const QueueSerial &getLastSubmittedQueueSerial() const { return mLastSubmittedQueueSerial; }
getSubmittedResourceUse()852*8975f5c5SAndroid Build Coastguard Worker     const vk::ResourceUse &getSubmittedResourceUse() const { return mSubmittedResourceUse; }
853*8975f5c5SAndroid Build Coastguard Worker 
854*8975f5c5SAndroid Build Coastguard Worker     // Uploading mutable mipmap textures is currently restricted to single-context applications.
isEligibleForMutableTextureFlush()855*8975f5c5SAndroid Build Coastguard Worker     bool isEligibleForMutableTextureFlush() const
856*8975f5c5SAndroid Build Coastguard Worker     {
857*8975f5c5SAndroid Build Coastguard Worker         return getFeatures().mutableMipmapTextureUpload.enabled && !hasDisplayTextureShareGroup() &&
858*8975f5c5SAndroid Build Coastguard Worker                mShareGroupVk->getContexts().size() == 1;
859*8975f5c5SAndroid Build Coastguard Worker     }
860*8975f5c5SAndroid Build Coastguard Worker 
getDepthStencilAttachmentFlags()861*8975f5c5SAndroid Build Coastguard Worker     vk::RenderPassUsageFlags getDepthStencilAttachmentFlags() const
862*8975f5c5SAndroid Build Coastguard Worker     {
863*8975f5c5SAndroid Build Coastguard Worker         return mDepthStencilAttachmentFlags;
864*8975f5c5SAndroid Build Coastguard Worker     }
865*8975f5c5SAndroid Build Coastguard Worker 
isDitherEnabled()866*8975f5c5SAndroid Build Coastguard Worker     bool isDitherEnabled() { return mState.isDitherEnabled(); }
867*8975f5c5SAndroid Build Coastguard Worker 
868*8975f5c5SAndroid Build Coastguard Worker     // The following functions try to allocate memory for buffers and images. If they fail due to
869*8975f5c5SAndroid Build Coastguard Worker     // OOM errors, they will try other options for memory allocation.
870*8975f5c5SAndroid Build Coastguard Worker     angle::Result initBufferAllocation(vk::BufferHelper *bufferHelper,
871*8975f5c5SAndroid Build Coastguard Worker                                        uint32_t memoryTypeIndex,
872*8975f5c5SAndroid Build Coastguard Worker                                        size_t allocationSize,
873*8975f5c5SAndroid Build Coastguard Worker                                        size_t alignment,
874*8975f5c5SAndroid Build Coastguard Worker                                        BufferUsageType bufferUsageType);
875*8975f5c5SAndroid Build Coastguard Worker     angle::Result initImageAllocation(vk::ImageHelper *imageHelper,
876*8975f5c5SAndroid Build Coastguard Worker                                       bool hasProtectedContent,
877*8975f5c5SAndroid Build Coastguard Worker                                       const vk::MemoryProperties &memoryProperties,
878*8975f5c5SAndroid Build Coastguard Worker                                       VkMemoryPropertyFlags flags,
879*8975f5c5SAndroid Build Coastguard Worker                                       vk::MemoryAllocationType allocationType);
880*8975f5c5SAndroid Build Coastguard Worker 
881*8975f5c5SAndroid Build Coastguard Worker     angle::Result releaseBufferAllocation(vk::BufferHelper *bufferHelper);
882*8975f5c5SAndroid Build Coastguard Worker 
883*8975f5c5SAndroid Build Coastguard Worker     // Helper functions to initialize a buffer for a specific usage
884*8975f5c5SAndroid Build Coastguard Worker     // Suballocate a host visible buffer with alignment good for copyBuffer.
885*8975f5c5SAndroid Build Coastguard Worker     angle::Result initBufferForBufferCopy(vk::BufferHelper *bufferHelper,
886*8975f5c5SAndroid Build Coastguard Worker                                           size_t size,
887*8975f5c5SAndroid Build Coastguard Worker                                           vk::MemoryCoherency coherency);
888*8975f5c5SAndroid Build Coastguard Worker     // Suballocate a host visible buffer with alignment good for copyImage.
889*8975f5c5SAndroid Build Coastguard Worker     angle::Result initBufferForImageCopy(vk::BufferHelper *bufferHelper,
890*8975f5c5SAndroid Build Coastguard Worker                                          size_t size,
891*8975f5c5SAndroid Build Coastguard Worker                                          vk::MemoryCoherency coherency,
892*8975f5c5SAndroid Build Coastguard Worker                                          angle::FormatID formatId,
893*8975f5c5SAndroid Build Coastguard Worker                                          VkDeviceSize *offset,
894*8975f5c5SAndroid Build Coastguard Worker                                          uint8_t **dataPtr);
895*8975f5c5SAndroid Build Coastguard Worker     // Suballocate a buffer with alignment good for shader storage or copyBuffer.
896*8975f5c5SAndroid Build Coastguard Worker     angle::Result initBufferForVertexConversion(ConversionBuffer *conversionBuffer,
897*8975f5c5SAndroid Build Coastguard Worker                                                 size_t size,
898*8975f5c5SAndroid Build Coastguard Worker                                                 vk::MemoryHostVisibility hostVisibility);
899*8975f5c5SAndroid Build Coastguard Worker 
900*8975f5c5SAndroid Build Coastguard Worker     // In the event of collecting too much garbage, we should flush the garbage so it can be freed.
901*8975f5c5SAndroid Build Coastguard Worker     void addToPendingImageGarbage(vk::ResourceUse use, VkDeviceSize size);
902*8975f5c5SAndroid Build Coastguard Worker 
903*8975f5c5SAndroid Build Coastguard Worker     bool hasExcessPendingGarbage() const;
904*8975f5c5SAndroid Build Coastguard Worker 
905*8975f5c5SAndroid Build Coastguard Worker     angle::Result onFramebufferBoundary(const gl::Context *contextGL);
906*8975f5c5SAndroid Build Coastguard Worker 
getCurrentFrameCount()907*8975f5c5SAndroid Build Coastguard Worker     uint32_t getCurrentFrameCount() const { return mShareGroupVk->getCurrentFrameCount(); }
908*8975f5c5SAndroid Build Coastguard Worker 
909*8975f5c5SAndroid Build Coastguard Worker   private:
910*8975f5c5SAndroid Build Coastguard Worker     // Dirty bits.
911*8975f5c5SAndroid Build Coastguard Worker     enum DirtyBitType : size_t
912*8975f5c5SAndroid Build Coastguard Worker     {
913*8975f5c5SAndroid Build Coastguard Worker         // Dirty bits that must be processed before the render pass is started.  The handlers for
914*8975f5c5SAndroid Build Coastguard Worker         // these dirty bits don't record any commands.
915*8975f5c5SAndroid Build Coastguard Worker 
916*8975f5c5SAndroid Build Coastguard Worker         // the AnySamplePassed render pass query has been ended.
917*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_ANY_SAMPLE_PASSED_QUERY_END,
918*8975f5c5SAndroid Build Coastguard Worker         // A glMemoryBarrier has been called and command buffers may need flushing.
919*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_MEMORY_BARRIER,
920*8975f5c5SAndroid Build Coastguard Worker         // Update default attribute buffers.
921*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DEFAULT_ATTRIBS,
922*8975f5c5SAndroid Build Coastguard Worker         // The pipeline has changed and needs to be recreated.  This dirty bit may close the render
923*8975f5c5SAndroid Build Coastguard Worker         // pass.
924*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_PIPELINE_DESC,
925*8975f5c5SAndroid Build Coastguard Worker         // Support for depth/stencil read-only feedback loop.  When depth/stencil access changes,
926*8975f5c5SAndroid Build Coastguard Worker         // the render pass may need closing.
927*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_READ_ONLY_DEPTH_FEEDBACK_LOOP_MODE,
928*8975f5c5SAndroid Build Coastguard Worker 
929*8975f5c5SAndroid Build Coastguard Worker         // Start the render pass.
930*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_RENDER_PASS,
931*8975f5c5SAndroid Build Coastguard Worker 
932*8975f5c5SAndroid Build Coastguard Worker         // Dirty bits that must be processed after the render pass is started.  Their handlers
933*8975f5c5SAndroid Build Coastguard Worker         // record commands.
934*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_EVENT_LOG,
935*8975f5c5SAndroid Build Coastguard Worker         // Update color and depth/stencil accesses in the render pass.
936*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_COLOR_ACCESS,
937*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DEPTH_STENCIL_ACCESS,
938*8975f5c5SAndroid Build Coastguard Worker         // Pipeline needs to rebind because a new command buffer has been allocated, or UtilsVk has
939*8975f5c5SAndroid Build Coastguard Worker         // changed the binding.  The pipeline itself doesn't need to be recreated.
940*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_PIPELINE_BINDING,
941*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_TEXTURES,
942*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_VERTEX_BUFFERS,
943*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_INDEX_BUFFER,
944*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_UNIFORMS,
945*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DRIVER_UNIFORMS,
946*8975f5c5SAndroid Build Coastguard Worker         // Shader resources excluding textures, which are handled separately.
947*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_SHADER_RESOURCES,
948*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_UNIFORM_BUFFERS,
949*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_TRANSFORM_FEEDBACK_BUFFERS,
950*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_TRANSFORM_FEEDBACK_RESUME,
951*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DESCRIPTOR_SETS,
952*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_FRAMEBUFFER_FETCH_BARRIER,
953*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_BLEND_BARRIER,
954*8975f5c5SAndroid Build Coastguard Worker 
955*8975f5c5SAndroid Build Coastguard Worker         // Dynamic state
956*8975f5c5SAndroid Build Coastguard Worker         // - In core Vulkan 1.0
957*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_VIEWPORT,
958*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_SCISSOR,
959*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_LINE_WIDTH,
960*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_DEPTH_BIAS,
961*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_BLEND_CONSTANTS,
962*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_STENCIL_COMPARE_MASK,
963*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_STENCIL_WRITE_MASK,
964*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_STENCIL_REFERENCE,
965*8975f5c5SAndroid Build Coastguard Worker         // - In VK_EXT_extended_dynamic_state
966*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_CULL_MODE,
967*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_FRONT_FACE,
968*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_DEPTH_TEST_ENABLE,
969*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_DEPTH_WRITE_ENABLE,
970*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_DEPTH_COMPARE_OP,
971*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_STENCIL_TEST_ENABLE,
972*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_STENCIL_OP,
973*8975f5c5SAndroid Build Coastguard Worker         // - In VK_EXT_extended_dynamic_state2
974*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_RASTERIZER_DISCARD_ENABLE,
975*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_DEPTH_BIAS_ENABLE,
976*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_LOGIC_OP,
977*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_PRIMITIVE_RESTART_ENABLE,
978*8975f5c5SAndroid Build Coastguard Worker         // - In VK_KHR_fragment_shading_rate
979*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DYNAMIC_FRAGMENT_SHADING_RATE,
980*8975f5c5SAndroid Build Coastguard Worker 
981*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_MAX,
982*8975f5c5SAndroid Build Coastguard Worker     };
983*8975f5c5SAndroid Build Coastguard Worker 
984*8975f5c5SAndroid Build Coastguard Worker     // Dirty bit handlers that can break the render pass must always be specified before
985*8975f5c5SAndroid Build Coastguard Worker     // DIRTY_BIT_RENDER_PASS.
986*8975f5c5SAndroid Build Coastguard Worker     static_assert(
987*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_ANY_SAMPLE_PASSED_QUERY_END < DIRTY_BIT_RENDER_PASS,
988*8975f5c5SAndroid Build Coastguard Worker         "Render pass breaking dirty bit must be handled before the render pass dirty bit");
989*8975f5c5SAndroid Build Coastguard Worker     static_assert(
990*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_MEMORY_BARRIER < DIRTY_BIT_RENDER_PASS,
991*8975f5c5SAndroid Build Coastguard Worker         "Render pass breaking dirty bit must be handled before the render pass dirty bit");
992*8975f5c5SAndroid Build Coastguard Worker     static_assert(
993*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_DEFAULT_ATTRIBS < DIRTY_BIT_RENDER_PASS,
994*8975f5c5SAndroid Build Coastguard Worker         "Render pass breaking dirty bit must be handled before the render pass dirty bit");
995*8975f5c5SAndroid Build Coastguard Worker     static_assert(
996*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_PIPELINE_DESC < DIRTY_BIT_RENDER_PASS,
997*8975f5c5SAndroid Build Coastguard Worker         "Render pass breaking dirty bit must be handled before the render pass dirty bit");
998*8975f5c5SAndroid Build Coastguard Worker     static_assert(
999*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_READ_ONLY_DEPTH_FEEDBACK_LOOP_MODE < DIRTY_BIT_RENDER_PASS,
1000*8975f5c5SAndroid Build Coastguard Worker         "Render pass breaking dirty bit must be handled before the render pass dirty bit");
1001*8975f5c5SAndroid Build Coastguard Worker 
1002*8975f5c5SAndroid Build Coastguard Worker     // Dirty bit handlers that record commands or otherwise expect to manipulate the render pass
1003*8975f5c5SAndroid Build Coastguard Worker     // that will be used for the draw call must be specified after DIRTY_BIT_RENDER_PASS.
1004*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_EVENT_LOG > DIRTY_BIT_RENDER_PASS,
1005*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1006*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_COLOR_ACCESS > DIRTY_BIT_RENDER_PASS,
1007*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1008*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DEPTH_STENCIL_ACCESS > DIRTY_BIT_RENDER_PASS,
1009*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1010*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_PIPELINE_BINDING > DIRTY_BIT_RENDER_PASS,
1011*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1012*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_TEXTURES > DIRTY_BIT_RENDER_PASS,
1013*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1014*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_VERTEX_BUFFERS > DIRTY_BIT_RENDER_PASS,
1015*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1016*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_INDEX_BUFFER > DIRTY_BIT_RENDER_PASS,
1017*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1018*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DRIVER_UNIFORMS > DIRTY_BIT_RENDER_PASS,
1019*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1020*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_SHADER_RESOURCES > DIRTY_BIT_RENDER_PASS,
1021*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1022*8975f5c5SAndroid Build Coastguard Worker     static_assert(
1023*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_UNIFORM_BUFFERS > DIRTY_BIT_SHADER_RESOURCES,
1024*8975f5c5SAndroid Build Coastguard Worker         "Uniform buffer using dirty bit must be handled after the shader resource dirty bit");
1025*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_TRANSFORM_FEEDBACK_BUFFERS > DIRTY_BIT_RENDER_PASS,
1026*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1027*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_TRANSFORM_FEEDBACK_RESUME > DIRTY_BIT_RENDER_PASS,
1028*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1029*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DESCRIPTOR_SETS > DIRTY_BIT_RENDER_PASS,
1030*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1031*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_UNIFORMS > DIRTY_BIT_RENDER_PASS,
1032*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1033*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_FRAMEBUFFER_FETCH_BARRIER > DIRTY_BIT_RENDER_PASS,
1034*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1035*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_BLEND_BARRIER > DIRTY_BIT_RENDER_PASS,
1036*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1037*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_VIEWPORT > DIRTY_BIT_RENDER_PASS,
1038*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1039*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_SCISSOR > DIRTY_BIT_RENDER_PASS,
1040*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1041*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_LINE_WIDTH > DIRTY_BIT_RENDER_PASS,
1042*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1043*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_DEPTH_BIAS > DIRTY_BIT_RENDER_PASS,
1044*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1045*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_BLEND_CONSTANTS > DIRTY_BIT_RENDER_PASS,
1046*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1047*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_STENCIL_COMPARE_MASK > DIRTY_BIT_RENDER_PASS,
1048*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1049*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_STENCIL_WRITE_MASK > DIRTY_BIT_RENDER_PASS,
1050*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1051*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_STENCIL_REFERENCE > DIRTY_BIT_RENDER_PASS,
1052*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1053*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_CULL_MODE > DIRTY_BIT_RENDER_PASS,
1054*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1055*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_FRONT_FACE > DIRTY_BIT_RENDER_PASS,
1056*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1057*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_DEPTH_TEST_ENABLE > DIRTY_BIT_RENDER_PASS,
1058*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1059*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_DEPTH_WRITE_ENABLE > DIRTY_BIT_RENDER_PASS,
1060*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1061*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_DEPTH_COMPARE_OP > DIRTY_BIT_RENDER_PASS,
1062*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1063*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_STENCIL_TEST_ENABLE > DIRTY_BIT_RENDER_PASS,
1064*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1065*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_STENCIL_OP > DIRTY_BIT_RENDER_PASS,
1066*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1067*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_RASTERIZER_DISCARD_ENABLE > DIRTY_BIT_RENDER_PASS,
1068*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1069*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_DEPTH_BIAS_ENABLE > DIRTY_BIT_RENDER_PASS,
1070*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1071*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_LOGIC_OP > DIRTY_BIT_RENDER_PASS,
1072*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1073*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_PRIMITIVE_RESTART_ENABLE > DIRTY_BIT_RENDER_PASS,
1074*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1075*8975f5c5SAndroid Build Coastguard Worker     static_assert(DIRTY_BIT_DYNAMIC_FRAGMENT_SHADING_RATE > DIRTY_BIT_RENDER_PASS,
1076*8975f5c5SAndroid Build Coastguard Worker                   "Render pass using dirty bit must be handled after the render pass dirty bit");
1077*8975f5c5SAndroid Build Coastguard Worker 
1078*8975f5c5SAndroid Build Coastguard Worker     using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>;
1079*8975f5c5SAndroid Build Coastguard Worker 
1080*8975f5c5SAndroid Build Coastguard Worker     using GraphicsDirtyBitHandler = angle::Result (
1081*8975f5c5SAndroid Build Coastguard Worker         ContextVk::*)(DirtyBits::Iterator *dirtyBitsIterator, DirtyBits dirtyBitMask);
1082*8975f5c5SAndroid Build Coastguard Worker     using ComputeDirtyBitHandler =
1083*8975f5c5SAndroid Build Coastguard Worker         angle::Result (ContextVk::*)(DirtyBits::Iterator *dirtyBitsIterator);
1084*8975f5c5SAndroid Build Coastguard Worker 
1085*8975f5c5SAndroid Build Coastguard Worker     // The GpuEventQuery struct holds together a timestamp query and enough data to create a
1086*8975f5c5SAndroid Build Coastguard Worker     // trace event based on that. Use traceGpuEvent to insert such queries.  They will be readback
1087*8975f5c5SAndroid Build Coastguard Worker     // when the results are available, without inserting a GPU bubble.
1088*8975f5c5SAndroid Build Coastguard Worker     //
1089*8975f5c5SAndroid Build Coastguard Worker     // - eventName will be the reported name of the event
1090*8975f5c5SAndroid Build Coastguard Worker     // - phase is either 'B' (duration begin), 'E' (duration end) or 'i' (instant // event).
1091*8975f5c5SAndroid Build Coastguard Worker     //   See Google's "Trace Event Format":
1092*8975f5c5SAndroid Build Coastguard Worker     //   https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU
1093*8975f5c5SAndroid Build Coastguard Worker     // - serial is the serial of the batch the query was submitted on.  Until the batch is
1094*8975f5c5SAndroid Build Coastguard Worker     //   submitted, the query is not checked to avoid incuring a flush.
1095*8975f5c5SAndroid Build Coastguard Worker     struct GpuEventQuery final
1096*8975f5c5SAndroid Build Coastguard Worker     {
1097*8975f5c5SAndroid Build Coastguard Worker         EventName name;
1098*8975f5c5SAndroid Build Coastguard Worker         char phase;
1099*8975f5c5SAndroid Build Coastguard Worker         vk::QueryHelper queryHelper;
1100*8975f5c5SAndroid Build Coastguard Worker     };
1101*8975f5c5SAndroid Build Coastguard Worker 
1102*8975f5c5SAndroid Build Coastguard Worker     // Once a query result is available, the timestamp is read and a GpuEvent object is kept until
1103*8975f5c5SAndroid Build Coastguard Worker     // the next clock sync, at which point the clock drift is compensated in the results before
1104*8975f5c5SAndroid Build Coastguard Worker     // handing them off to the application.
1105*8975f5c5SAndroid Build Coastguard Worker     struct GpuEvent final
1106*8975f5c5SAndroid Build Coastguard Worker     {
1107*8975f5c5SAndroid Build Coastguard Worker         uint64_t gpuTimestampCycles;
1108*8975f5c5SAndroid Build Coastguard Worker         std::array<char, kMaxGpuEventNameLen> name;
1109*8975f5c5SAndroid Build Coastguard Worker         char phase;
1110*8975f5c5SAndroid Build Coastguard Worker     };
1111*8975f5c5SAndroid Build Coastguard Worker 
1112*8975f5c5SAndroid Build Coastguard Worker     struct GpuClockSyncInfo
1113*8975f5c5SAndroid Build Coastguard Worker     {
1114*8975f5c5SAndroid Build Coastguard Worker         double gpuTimestampS;
1115*8975f5c5SAndroid Build Coastguard Worker         double cpuTimestampS;
1116*8975f5c5SAndroid Build Coastguard Worker     };
1117*8975f5c5SAndroid Build Coastguard Worker 
1118*8975f5c5SAndroid Build Coastguard Worker     class ScopedDescriptorSetUpdates;
1119*8975f5c5SAndroid Build Coastguard Worker 
1120*8975f5c5SAndroid Build Coastguard Worker     bool isSingleBufferedWindowCurrent() const;
1121*8975f5c5SAndroid Build Coastguard Worker     bool hasSomethingToFlush() const;
1122*8975f5c5SAndroid Build Coastguard Worker 
1123*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupDraw(const gl::Context *context,
1124*8975f5c5SAndroid Build Coastguard Worker                             gl::PrimitiveMode mode,
1125*8975f5c5SAndroid Build Coastguard Worker                             GLint firstVertexOrInvalid,
1126*8975f5c5SAndroid Build Coastguard Worker                             GLsizei vertexOrIndexCount,
1127*8975f5c5SAndroid Build Coastguard Worker                             GLsizei instanceCount,
1128*8975f5c5SAndroid Build Coastguard Worker                             gl::DrawElementsType indexTypeOrInvalid,
1129*8975f5c5SAndroid Build Coastguard Worker                             const void *indices,
1130*8975f5c5SAndroid Build Coastguard Worker                             DirtyBits dirtyBitMask);
1131*8975f5c5SAndroid Build Coastguard Worker 
1132*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupIndexedDraw(const gl::Context *context,
1133*8975f5c5SAndroid Build Coastguard Worker                                    gl::PrimitiveMode mode,
1134*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei indexCount,
1135*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei instanceCount,
1136*8975f5c5SAndroid Build Coastguard Worker                                    gl::DrawElementsType indexType,
1137*8975f5c5SAndroid Build Coastguard Worker                                    const void *indices);
1138*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupIndirectDraw(const gl::Context *context,
1139*8975f5c5SAndroid Build Coastguard Worker                                     gl::PrimitiveMode mode,
1140*8975f5c5SAndroid Build Coastguard Worker                                     DirtyBits dirtyBitMask,
1141*8975f5c5SAndroid Build Coastguard Worker                                     vk::BufferHelper *indirectBuffer);
1142*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupIndexedIndirectDraw(const gl::Context *context,
1143*8975f5c5SAndroid Build Coastguard Worker                                            gl::PrimitiveMode mode,
1144*8975f5c5SAndroid Build Coastguard Worker                                            gl::DrawElementsType indexType,
1145*8975f5c5SAndroid Build Coastguard Worker                                            vk::BufferHelper *indirectBuffer);
1146*8975f5c5SAndroid Build Coastguard Worker 
1147*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupLineLoopIndexedIndirectDraw(const gl::Context *context,
1148*8975f5c5SAndroid Build Coastguard Worker                                                    gl::PrimitiveMode mode,
1149*8975f5c5SAndroid Build Coastguard Worker                                                    gl::DrawElementsType indexType,
1150*8975f5c5SAndroid Build Coastguard Worker                                                    vk::BufferHelper *srcIndexBuffer,
1151*8975f5c5SAndroid Build Coastguard Worker                                                    vk::BufferHelper *srcIndirectBuffer,
1152*8975f5c5SAndroid Build Coastguard Worker                                                    VkDeviceSize indirectBufferOffset,
1153*8975f5c5SAndroid Build Coastguard Worker                                                    vk::BufferHelper **indirectBufferOut);
1154*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupLineLoopIndirectDraw(const gl::Context *context,
1155*8975f5c5SAndroid Build Coastguard Worker                                             gl::PrimitiveMode mode,
1156*8975f5c5SAndroid Build Coastguard Worker                                             vk::BufferHelper *indirectBuffer,
1157*8975f5c5SAndroid Build Coastguard Worker                                             VkDeviceSize indirectBufferOffset,
1158*8975f5c5SAndroid Build Coastguard Worker                                             vk::BufferHelper **indirectBufferOut);
1159*8975f5c5SAndroid Build Coastguard Worker 
1160*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupLineLoopDraw(const gl::Context *context,
1161*8975f5c5SAndroid Build Coastguard Worker                                     gl::PrimitiveMode mode,
1162*8975f5c5SAndroid Build Coastguard Worker                                     GLint firstVertex,
1163*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei vertexOrIndexCount,
1164*8975f5c5SAndroid Build Coastguard Worker                                     gl::DrawElementsType indexTypeOrInvalid,
1165*8975f5c5SAndroid Build Coastguard Worker                                     const void *indices,
1166*8975f5c5SAndroid Build Coastguard Worker                                     uint32_t *numIndicesOut);
1167*8975f5c5SAndroid Build Coastguard Worker 
1168*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupDispatch(const gl::Context *context);
1169*8975f5c5SAndroid Build Coastguard Worker 
1170*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle getCorrectedViewport(const gl::Rectangle &viewport) const;
1171*8975f5c5SAndroid Build Coastguard Worker     void updateViewport(FramebufferVk *framebufferVk,
1172*8975f5c5SAndroid Build Coastguard Worker                         const gl::Rectangle &viewport,
1173*8975f5c5SAndroid Build Coastguard Worker                         float nearPlane,
1174*8975f5c5SAndroid Build Coastguard Worker                         float farPlane);
1175*8975f5c5SAndroid Build Coastguard Worker     void updateFrontFace();
1176*8975f5c5SAndroid Build Coastguard Worker     void updateDepthRange(float nearPlane, float farPlane);
1177*8975f5c5SAndroid Build Coastguard Worker     void updateMissingOutputsMask();
1178*8975f5c5SAndroid Build Coastguard Worker     void updateSampleMaskWithRasterizationSamples(const uint32_t rasterizationSamples);
1179*8975f5c5SAndroid Build Coastguard Worker     void updateAlphaToCoverageWithRasterizationSamples(const uint32_t rasterizationSamples);
1180*8975f5c5SAndroid Build Coastguard Worker     void updateFrameBufferFetchSamples(const uint32_t prevSamples, const uint32_t curSamples);
1181*8975f5c5SAndroid Build Coastguard Worker     void updateFlipViewportDrawFramebuffer(const gl::State &glState);
1182*8975f5c5SAndroid Build Coastguard Worker     void updateFlipViewportReadFramebuffer(const gl::State &glState);
1183*8975f5c5SAndroid Build Coastguard Worker     void updateSurfaceRotationDrawFramebuffer(const gl::State &glState,
1184*8975f5c5SAndroid Build Coastguard Worker                                               const egl::Surface *currentDrawSurface);
1185*8975f5c5SAndroid Build Coastguard Worker     void updateSurfaceRotationReadFramebuffer(const gl::State &glState,
1186*8975f5c5SAndroid Build Coastguard Worker                                               const egl::Surface *currentReadSurface);
1187*8975f5c5SAndroid Build Coastguard Worker 
1188*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateActiveTextures(const gl::Context *context, gl::Command command);
1189*8975f5c5SAndroid Build Coastguard Worker     template <typename CommandBufferHelperT>
1190*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateActiveImages(CommandBufferHelperT *commandBufferHelper);
1191*8975f5c5SAndroid Build Coastguard Worker 
invalidateCurrentGraphicsPipeline()1192*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void invalidateCurrentGraphicsPipeline()
1193*8975f5c5SAndroid Build Coastguard Worker     {
1194*8975f5c5SAndroid Build Coastguard Worker         // Note: DIRTY_BIT_PIPELINE_BINDING will be automatically set if pipeline bind is necessary.
1195*8975f5c5SAndroid Build Coastguard Worker         mGraphicsDirtyBits.set(DIRTY_BIT_PIPELINE_DESC);
1196*8975f5c5SAndroid Build Coastguard Worker     }
1197*8975f5c5SAndroid Build Coastguard Worker 
invalidateCurrentComputePipeline()1198*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE void invalidateCurrentComputePipeline()
1199*8975f5c5SAndroid Build Coastguard Worker     {
1200*8975f5c5SAndroid Build Coastguard Worker         mComputeDirtyBits |= kPipelineDescAndBindingDirtyBits;
1201*8975f5c5SAndroid Build Coastguard Worker         mCurrentComputePipeline = nullptr;
1202*8975f5c5SAndroid Build Coastguard Worker     }
1203*8975f5c5SAndroid Build Coastguard Worker 
1204*8975f5c5SAndroid Build Coastguard Worker     angle::Result invalidateProgramExecutableHelper(const gl::Context *context);
1205*8975f5c5SAndroid Build Coastguard Worker 
1206*8975f5c5SAndroid Build Coastguard Worker     void invalidateCurrentDefaultUniforms();
1207*8975f5c5SAndroid Build Coastguard Worker     angle::Result invalidateCurrentTextures(const gl::Context *context, gl::Command command);
1208*8975f5c5SAndroid Build Coastguard Worker     angle::Result invalidateCurrentShaderResources(gl::Command command);
1209*8975f5c5SAndroid Build Coastguard Worker     angle::Result invalidateCurrentShaderUniformBuffers(gl::Command command);
1210*8975f5c5SAndroid Build Coastguard Worker     void invalidateGraphicsDriverUniforms();
1211*8975f5c5SAndroid Build Coastguard Worker     void invalidateDriverUniforms();
1212*8975f5c5SAndroid Build Coastguard Worker 
1213*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleNoopDrawEvent() override;
1214*8975f5c5SAndroid Build Coastguard Worker 
1215*8975f5c5SAndroid Build Coastguard Worker     // Handlers for graphics pipeline dirty bits.
1216*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsMemoryBarrier(DirtyBits::Iterator *dirtyBitsIterator,
1217*8975f5c5SAndroid Build Coastguard Worker                                                    DirtyBits dirtyBitMask);
1218*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDefaultAttribs(DirtyBits::Iterator *dirtyBitsIterator,
1219*8975f5c5SAndroid Build Coastguard Worker                                                     DirtyBits dirtyBitMask);
1220*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsPipelineDesc(DirtyBits::Iterator *dirtyBitsIterator,
1221*8975f5c5SAndroid Build Coastguard Worker                                                   DirtyBits dirtyBitMask);
1222*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsReadOnlyDepthFeedbackLoopMode(
1223*8975f5c5SAndroid Build Coastguard Worker         DirtyBits::Iterator *dirtyBitsIterator,
1224*8975f5c5SAndroid Build Coastguard Worker         DirtyBits dirtyBitMask);
1225*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyAnySamplePassedQueryEnd(DirtyBits::Iterator *dirtyBitsIterator,
1226*8975f5c5SAndroid Build Coastguard Worker                                                      DirtyBits dirtyBitMask);
1227*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsRenderPass(DirtyBits::Iterator *dirtyBitsIterator,
1228*8975f5c5SAndroid Build Coastguard Worker                                                 DirtyBits dirtyBitMask);
1229*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsEventLog(DirtyBits::Iterator *dirtyBitsIterator,
1230*8975f5c5SAndroid Build Coastguard Worker                                               DirtyBits dirtyBitMask);
1231*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsColorAccess(DirtyBits::Iterator *dirtyBitsIterator,
1232*8975f5c5SAndroid Build Coastguard Worker                                                  DirtyBits dirtyBitMask);
1233*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDepthStencilAccess(DirtyBits::Iterator *dirtyBitsIterator,
1234*8975f5c5SAndroid Build Coastguard Worker                                                         DirtyBits dirtyBitMask);
1235*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsPipelineBinding(DirtyBits::Iterator *dirtyBitsIterator,
1236*8975f5c5SAndroid Build Coastguard Worker                                                      DirtyBits dirtyBitMask);
1237*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsTextures(DirtyBits::Iterator *dirtyBitsIterator,
1238*8975f5c5SAndroid Build Coastguard Worker                                               DirtyBits dirtyBitMask);
1239*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsVertexBuffers(DirtyBits::Iterator *dirtyBitsIterator,
1240*8975f5c5SAndroid Build Coastguard Worker                                                    DirtyBits dirtyBitMask);
1241*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsIndexBuffer(DirtyBits::Iterator *dirtyBitsIterator,
1242*8975f5c5SAndroid Build Coastguard Worker                                                  DirtyBits dirtyBitMask);
1243*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDriverUniforms(DirtyBits::Iterator *dirtyBitsIterator,
1244*8975f5c5SAndroid Build Coastguard Worker                                                     DirtyBits dirtyBitMask);
1245*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsShaderResources(DirtyBits::Iterator *dirtyBitsIterator,
1246*8975f5c5SAndroid Build Coastguard Worker                                                      DirtyBits dirtyBitMask);
1247*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsUniformBuffers(DirtyBits::Iterator *dirtyBitsIterator,
1248*8975f5c5SAndroid Build Coastguard Worker                                                     DirtyBits dirtyBitMask);
1249*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsFramebufferFetchBarrier(DirtyBits::Iterator *dirtyBitsIterator,
1250*8975f5c5SAndroid Build Coastguard Worker                                                              DirtyBits dirtyBitMask);
1251*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsBlendBarrier(DirtyBits::Iterator *dirtyBitsIterator,
1252*8975f5c5SAndroid Build Coastguard Worker                                                   DirtyBits dirtyBitMask);
1253*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsTransformFeedbackBuffersEmulation(
1254*8975f5c5SAndroid Build Coastguard Worker         DirtyBits::Iterator *dirtyBitsIterator,
1255*8975f5c5SAndroid Build Coastguard Worker         DirtyBits dirtyBitMask);
1256*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsTransformFeedbackBuffersExtension(
1257*8975f5c5SAndroid Build Coastguard Worker         DirtyBits::Iterator *dirtyBitsIterator,
1258*8975f5c5SAndroid Build Coastguard Worker         DirtyBits dirtyBitMask);
1259*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsTransformFeedbackResume(DirtyBits::Iterator *dirtyBitsIterator,
1260*8975f5c5SAndroid Build Coastguard Worker                                                              DirtyBits dirtyBitMask);
1261*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDescriptorSets(DirtyBits::Iterator *dirtyBitsIterator,
1262*8975f5c5SAndroid Build Coastguard Worker                                                     DirtyBits dirtyBitMask);
1263*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsUniforms(DirtyBits::Iterator *dirtyBitsIterator,
1264*8975f5c5SAndroid Build Coastguard Worker                                               DirtyBits dirtyBitMask);
1265*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicViewport(DirtyBits::Iterator *dirtyBitsIterator,
1266*8975f5c5SAndroid Build Coastguard Worker                                                      DirtyBits dirtyBitMask);
1267*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicScissor(DirtyBits::Iterator *dirtyBitsIterator,
1268*8975f5c5SAndroid Build Coastguard Worker                                                     DirtyBits dirtyBitMask);
1269*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicLineWidth(DirtyBits::Iterator *dirtyBitsIterator,
1270*8975f5c5SAndroid Build Coastguard Worker                                                       DirtyBits dirtyBitMask);
1271*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicDepthBias(DirtyBits::Iterator *dirtyBitsIterator,
1272*8975f5c5SAndroid Build Coastguard Worker                                                       DirtyBits dirtyBitMask);
1273*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicBlendConstants(DirtyBits::Iterator *dirtyBitsIterator,
1274*8975f5c5SAndroid Build Coastguard Worker                                                            DirtyBits dirtyBitMask);
1275*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicStencilCompareMask(
1276*8975f5c5SAndroid Build Coastguard Worker         DirtyBits::Iterator *dirtyBitsIterator,
1277*8975f5c5SAndroid Build Coastguard Worker         DirtyBits dirtyBitMask);
1278*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicStencilWriteMask(DirtyBits::Iterator *dirtyBitsIterator,
1279*8975f5c5SAndroid Build Coastguard Worker                                                              DirtyBits dirtyBitMask);
1280*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicStencilReference(DirtyBits::Iterator *dirtyBitsIterator,
1281*8975f5c5SAndroid Build Coastguard Worker                                                              DirtyBits dirtyBitMask);
1282*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicCullMode(DirtyBits::Iterator *dirtyBitsIterator,
1283*8975f5c5SAndroid Build Coastguard Worker                                                      DirtyBits dirtyBitMask);
1284*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicFrontFace(DirtyBits::Iterator *dirtyBitsIterator,
1285*8975f5c5SAndroid Build Coastguard Worker                                                       DirtyBits dirtyBitMask);
1286*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicDepthTestEnable(DirtyBits::Iterator *dirtyBitsIterator,
1287*8975f5c5SAndroid Build Coastguard Worker                                                             DirtyBits dirtyBitMask);
1288*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicDepthWriteEnable(DirtyBits::Iterator *dirtyBitsIterator,
1289*8975f5c5SAndroid Build Coastguard Worker                                                              DirtyBits dirtyBitMask);
1290*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicDepthCompareOp(DirtyBits::Iterator *dirtyBitsIterator,
1291*8975f5c5SAndroid Build Coastguard Worker                                                            DirtyBits dirtyBitMask);
1292*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicStencilTestEnable(
1293*8975f5c5SAndroid Build Coastguard Worker         DirtyBits::Iterator *dirtyBitsIterator,
1294*8975f5c5SAndroid Build Coastguard Worker         DirtyBits dirtyBitMask);
1295*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicStencilOp(DirtyBits::Iterator *dirtyBitsIterator,
1296*8975f5c5SAndroid Build Coastguard Worker                                                       DirtyBits dirtyBitMask);
1297*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicRasterizerDiscardEnable(
1298*8975f5c5SAndroid Build Coastguard Worker         DirtyBits::Iterator *dirtyBitsIterator,
1299*8975f5c5SAndroid Build Coastguard Worker         DirtyBits dirtyBitMask);
1300*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicDepthBiasEnable(DirtyBits::Iterator *dirtyBitsIterator,
1301*8975f5c5SAndroid Build Coastguard Worker                                                             DirtyBits dirtyBitMask);
1302*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicLogicOp(DirtyBits::Iterator *dirtyBitsIterator,
1303*8975f5c5SAndroid Build Coastguard Worker                                                     DirtyBits dirtyBitMask);
1304*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicPrimitiveRestartEnable(
1305*8975f5c5SAndroid Build Coastguard Worker         DirtyBits::Iterator *dirtyBitsIterator,
1306*8975f5c5SAndroid Build Coastguard Worker         DirtyBits dirtyBitMask);
1307*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyGraphicsDynamicFragmentShadingRate(
1308*8975f5c5SAndroid Build Coastguard Worker         DirtyBits::Iterator *dirtyBitsIterator,
1309*8975f5c5SAndroid Build Coastguard Worker         DirtyBits dirtyBitMask);
1310*8975f5c5SAndroid Build Coastguard Worker 
1311*8975f5c5SAndroid Build Coastguard Worker     // Handlers for compute pipeline dirty bits.
1312*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputeMemoryBarrier(DirtyBits::Iterator *dirtyBitsIterator);
1313*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputeEventLog(DirtyBits::Iterator *dirtyBitsIterator);
1314*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputePipelineDesc(DirtyBits::Iterator *dirtyBitsIterator);
1315*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputePipelineBinding(DirtyBits::Iterator *dirtyBitsIterator);
1316*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputeTextures(DirtyBits::Iterator *dirtyBitsIterator);
1317*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputeDriverUniforms(DirtyBits::Iterator *dirtyBitsIterator);
1318*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputeShaderResources(DirtyBits::Iterator *dirtyBitsIterator);
1319*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputeUniformBuffers(DirtyBits::Iterator *dirtyBitsIterator);
1320*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputeDescriptorSets(DirtyBits::Iterator *dirtyBitsIterator);
1321*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyComputeUniforms(DirtyBits::Iterator *dirtyBitsIterator);
1322*8975f5c5SAndroid Build Coastguard Worker 
1323*8975f5c5SAndroid Build Coastguard Worker     // Common parts of the common dirty bit handlers.
1324*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyUniformsImpl(DirtyBits::Iterator *dirtyBitsIterator);
1325*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyMemoryBarrierImpl(DirtyBits::Iterator *dirtyBitsIterator,
1326*8975f5c5SAndroid Build Coastguard Worker                                                DirtyBits dirtyBitMask);
1327*8975f5c5SAndroid Build Coastguard Worker     template <typename CommandBufferT>
1328*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyEventLogImpl(CommandBufferT *commandBuffer);
1329*8975f5c5SAndroid Build Coastguard Worker     template <typename CommandBufferHelperT>
1330*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyTexturesImpl(CommandBufferHelperT *commandBufferHelper,
1331*8975f5c5SAndroid Build Coastguard Worker                                           PipelineType pipelineType);
1332*8975f5c5SAndroid Build Coastguard Worker     template <typename CommandBufferHelperT>
1333*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyShaderResourcesImpl(CommandBufferHelperT *commandBufferHelper,
1334*8975f5c5SAndroid Build Coastguard Worker                                                  PipelineType pipelineType,
1335*8975f5c5SAndroid Build Coastguard Worker                                                  DirtyBits::Iterator *dirtyBitsIterator);
1336*8975f5c5SAndroid Build Coastguard Worker     template <typename CommandBufferHelperT>
1337*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyUniformBuffersImpl(CommandBufferHelperT *commandBufferHelper);
1338*8975f5c5SAndroid Build Coastguard Worker     template <typename CommandBufferHelperT>
1339*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDirtyDescriptorSetsImpl(CommandBufferHelperT *commandBufferHelper,
1340*8975f5c5SAndroid Build Coastguard Worker                                                 PipelineType pipelineType);
1341*8975f5c5SAndroid Build Coastguard Worker     void handleDirtyGraphicsDynamicScissorImpl(bool isPrimitivesGeneratedQueryActive);
1342*8975f5c5SAndroid Build Coastguard Worker 
1343*8975f5c5SAndroid Build Coastguard Worker     void writeAtomicCounterBufferDriverUniformOffsets(uint32_t *offsetsOut, size_t offsetsSize);
1344*8975f5c5SAndroid Build Coastguard Worker 
1345*8975f5c5SAndroid Build Coastguard Worker     enum class Submit
1346*8975f5c5SAndroid Build Coastguard Worker     {
1347*8975f5c5SAndroid Build Coastguard Worker         OutsideRenderPassCommandsOnly,
1348*8975f5c5SAndroid Build Coastguard Worker         AllCommands,
1349*8975f5c5SAndroid Build Coastguard Worker     };
1350*8975f5c5SAndroid Build Coastguard Worker 
1351*8975f5c5SAndroid Build Coastguard Worker     angle::Result submitCommands(const vk::Semaphore *signalSemaphore,
1352*8975f5c5SAndroid Build Coastguard Worker                                  const vk::SharedExternalFence *externalFence,
1353*8975f5c5SAndroid Build Coastguard Worker                                  Submit submission);
1354*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushImpl(const gl::Context *context);
1355*8975f5c5SAndroid Build Coastguard Worker 
1356*8975f5c5SAndroid Build Coastguard Worker     angle::Result synchronizeCpuGpuTime();
1357*8975f5c5SAndroid Build Coastguard Worker     angle::Result traceGpuEventImpl(vk::OutsideRenderPassCommandBuffer *commandBuffer,
1358*8975f5c5SAndroid Build Coastguard Worker                                     char phase,
1359*8975f5c5SAndroid Build Coastguard Worker                                     const EventName &name);
1360*8975f5c5SAndroid Build Coastguard Worker     angle::Result checkCompletedGpuEvents();
1361*8975f5c5SAndroid Build Coastguard Worker     void flushGpuEvents(double nextSyncGpuTimestampS, double nextSyncCpuTimestampS);
1362*8975f5c5SAndroid Build Coastguard Worker     void handleDeviceLost();
1363*8975f5c5SAndroid Build Coastguard Worker     bool shouldEmulateSeamfulCubeMapSampling() const;
1364*8975f5c5SAndroid Build Coastguard Worker     void clearAllGarbage();
1365*8975f5c5SAndroid Build Coastguard Worker     void dumpCommandStreamDiagnostics();
1366*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushOutsideRenderPassCommands();
1367*8975f5c5SAndroid Build Coastguard Worker     // Flush commands and end render pass without setting any dirty bits.
1368*8975f5c5SAndroid Build Coastguard Worker     // flushCommandsAndEndRenderPass() and flushDirtyGraphicsRenderPass() will set the dirty bits
1369*8975f5c5SAndroid Build Coastguard Worker     // directly or through the iterator respectively.  Outside those two functions, this shouldn't
1370*8975f5c5SAndroid Build Coastguard Worker     // be called directly.
1371*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushDirtyGraphicsRenderPass(DirtyBits::Iterator *dirtyBitsIterator,
1372*8975f5c5SAndroid Build Coastguard Worker                                                DirtyBits dirtyBitMask,
1373*8975f5c5SAndroid Build Coastguard Worker                                                RenderPassClosureReason reason);
1374*8975f5c5SAndroid Build Coastguard Worker 
1375*8975f5c5SAndroid Build Coastguard Worker     // Mark the render pass to be closed on the next draw call.  The render pass is not actually
1376*8975f5c5SAndroid Build Coastguard Worker     // closed and can be restored with restoreFinishedRenderPass if necessary, for example to append
1377*8975f5c5SAndroid Build Coastguard Worker     // a resolve attachment.
1378*8975f5c5SAndroid Build Coastguard Worker     void onRenderPassFinished(RenderPassClosureReason reason);
1379*8975f5c5SAndroid Build Coastguard Worker 
1380*8975f5c5SAndroid Build Coastguard Worker     void initIndexTypeMap();
1381*8975f5c5SAndroid Build Coastguard Worker 
1382*8975f5c5SAndroid Build Coastguard Worker     VertexArrayVk *getVertexArray() const;
1383*8975f5c5SAndroid Build Coastguard Worker     FramebufferVk *getDrawFramebuffer() const;
1384*8975f5c5SAndroid Build Coastguard Worker 
1385*8975f5c5SAndroid Build Coastguard Worker     // Read-after-write hazards are generally handled with |glMemoryBarrier| when the source of
1386*8975f5c5SAndroid Build Coastguard Worker     // write is storage output.  When the write is outside render pass, the natural placement of the
1387*8975f5c5SAndroid Build Coastguard Worker     // render pass after the current outside render pass commands ensures that the memory barriers
1388*8975f5c5SAndroid Build Coastguard Worker     // and image layout transitions automatically take care of such synchronizations.
1389*8975f5c5SAndroid Build Coastguard Worker     //
1390*8975f5c5SAndroid Build Coastguard Worker     // There are a number of read-after-write cases that require breaking the render pass however to
1391*8975f5c5SAndroid Build Coastguard Worker     // preserve the order of operations:
1392*8975f5c5SAndroid Build Coastguard Worker     //
1393*8975f5c5SAndroid Build Coastguard Worker     // - Transform feedback write (in render pass), then vertex/index read (in render pass)
1394*8975f5c5SAndroid Build Coastguard Worker     // - Transform feedback write (in render pass), then ubo read (outside render pass)
1395*8975f5c5SAndroid Build Coastguard Worker     // - Framebuffer attachment write (in render pass), then texture sample (outside render pass)
1396*8975f5c5SAndroid Build Coastguard Worker     //   * Note that texture sampling inside render pass would cause a feedback loop
1397*8975f5c5SAndroid Build Coastguard Worker     //
1398*8975f5c5SAndroid Build Coastguard Worker     angle::Result endRenderPassIfTransformFeedbackBuffer(const vk::BufferHelper *buffer);
1399*8975f5c5SAndroid Build Coastguard Worker     angle::Result endRenderPassIfComputeReadAfterTransformFeedbackWrite();
1400*8975f5c5SAndroid Build Coastguard Worker     angle::Result endRenderPassIfComputeAccessAfterGraphicsImageAccess();
1401*8975f5c5SAndroid Build Coastguard Worker 
1402*8975f5c5SAndroid Build Coastguard Worker     // Update read-only depth feedback loop mode.  Typically called from
1403*8975f5c5SAndroid Build Coastguard Worker     // handleDirtyGraphicsReadOnlyDepthFeedbackLoopMode, but can be called from UtilsVk in functions
1404*8975f5c5SAndroid Build Coastguard Worker     // that don't necessarily break the render pass.
1405*8975f5c5SAndroid Build Coastguard Worker     angle::Result switchOutReadOnlyDepthStencilMode(DirtyBits::Iterator *dirtyBitsIterator,
1406*8975f5c5SAndroid Build Coastguard Worker                                                     DirtyBits dirtyBitMask,
1407*8975f5c5SAndroid Build Coastguard Worker                                                     UpdateDepthFeedbackLoopReason depthReason,
1408*8975f5c5SAndroid Build Coastguard Worker                                                     UpdateDepthFeedbackLoopReason stencilReason);
1409*8975f5c5SAndroid Build Coastguard Worker     angle::Result switchToReadOnlyDepthStencilMode(gl::Texture *texture,
1410*8975f5c5SAndroid Build Coastguard Worker                                                    gl::Command command,
1411*8975f5c5SAndroid Build Coastguard Worker                                                    FramebufferVk *drawFramebuffer,
1412*8975f5c5SAndroid Build Coastguard Worker                                                    bool isStencilTexture);
1413*8975f5c5SAndroid Build Coastguard Worker 
1414*8975f5c5SAndroid Build Coastguard Worker     angle::Result onResourceAccess(const vk::CommandBufferAccess &access);
1415*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushCommandBuffersIfNecessary(const vk::CommandBufferAccess &access);
1416*8975f5c5SAndroid Build Coastguard Worker     bool renderPassUsesStorageResources() const;
1417*8975f5c5SAndroid Build Coastguard Worker 
1418*8975f5c5SAndroid Build Coastguard Worker     angle::Result pushDebugGroupImpl(GLenum source, GLuint id, const char *message);
1419*8975f5c5SAndroid Build Coastguard Worker     angle::Result popDebugGroupImpl();
1420*8975f5c5SAndroid Build Coastguard Worker 
1421*8975f5c5SAndroid Build Coastguard Worker     void updateScissor(const gl::State &glState);
1422*8975f5c5SAndroid Build Coastguard Worker 
1423*8975f5c5SAndroid Build Coastguard Worker     void updateDepthStencil(const gl::State &glState);
1424*8975f5c5SAndroid Build Coastguard Worker     void updateDepthTestEnabled(const gl::State &glState);
1425*8975f5c5SAndroid Build Coastguard Worker     void updateDepthWriteEnabled(const gl::State &glState);
1426*8975f5c5SAndroid Build Coastguard Worker     void updateDepthFunc(const gl::State &glState);
1427*8975f5c5SAndroid Build Coastguard Worker     void updateStencilTestEnabled(const gl::State &glState);
1428*8975f5c5SAndroid Build Coastguard Worker 
1429*8975f5c5SAndroid Build Coastguard Worker     void updateSampleShadingWithRasterizationSamples(const uint32_t rasterizationSamples);
1430*8975f5c5SAndroid Build Coastguard Worker     void updateRasterizationSamples(const uint32_t rasterizationSamples);
1431*8975f5c5SAndroid Build Coastguard Worker     void updateRasterizerDiscardEnabled(bool isPrimitivesGeneratedQueryActive);
1432*8975f5c5SAndroid Build Coastguard Worker 
1433*8975f5c5SAndroid Build Coastguard Worker     void updateAdvancedBlendEquations(const gl::ProgramExecutable *executable);
1434*8975f5c5SAndroid Build Coastguard Worker 
1435*8975f5c5SAndroid Build Coastguard Worker     void updateDither();
1436*8975f5c5SAndroid Build Coastguard Worker 
1437*8975f5c5SAndroid Build Coastguard Worker     // For dynamic rendering only, mark the current render pass as being in framebuffer fetch mode.
1438*8975f5c5SAndroid Build Coastguard Worker     // In this mode, the FramebufferVk object and its render pass description are unaffected by
1439*8975f5c5SAndroid Build Coastguard Worker     // framebuffer fetch use, and the context needs to just configure the command buffer for
1440*8975f5c5SAndroid Build Coastguard Worker     // framebuffer fetch.
1441*8975f5c5SAndroid Build Coastguard Worker     void onFramebufferFetchUse(vk::FramebufferFetchMode framebufferFetchMode);
1442*8975f5c5SAndroid Build Coastguard Worker 
1443*8975f5c5SAndroid Build Coastguard Worker     // When the useNonZeroStencilWriteMaskStaticState workaround is enabled, the static state for
1444*8975f5c5SAndroid Build Coastguard Worker     // stencil should be non-zero despite the state being dynamic.  This is done when:
1445*8975f5c5SAndroid Build Coastguard Worker     //
1446*8975f5c5SAndroid Build Coastguard Worker     // - The shader includes discard, or
1447*8975f5c5SAndroid Build Coastguard Worker     // - Alpha-to-coverage is enabled.
1448*8975f5c5SAndroid Build Coastguard Worker     //
1449*8975f5c5SAndroid Build Coastguard Worker     // An alternative could have been to set the static state unconditionally to non-zero.  This is
1450*8975f5c5SAndroid Build Coastguard Worker     // avoided however, as on the affected driver that would disable certain optimizations.
1451*8975f5c5SAndroid Build Coastguard Worker     void updateStencilWriteWorkaround();
1452*8975f5c5SAndroid Build Coastguard Worker 
1453*8975f5c5SAndroid Build Coastguard Worker     void updateShaderResourcesWithSharedCacheKey(
1454*8975f5c5SAndroid Build Coastguard Worker         const vk::SharedDescriptorSetCacheKey &sharedCacheKey);
1455*8975f5c5SAndroid Build Coastguard Worker 
1456*8975f5c5SAndroid Build Coastguard Worker     angle::Result createGraphicsPipeline();
1457*8975f5c5SAndroid Build Coastguard Worker 
1458*8975f5c5SAndroid Build Coastguard Worker     angle::Result allocateQueueSerialIndex();
1459*8975f5c5SAndroid Build Coastguard Worker     void releaseQueueSerialIndex();
1460*8975f5c5SAndroid Build Coastguard Worker 
1461*8975f5c5SAndroid Build Coastguard Worker     void generateOutsideRenderPassCommandsQueueSerial();
1462*8975f5c5SAndroid Build Coastguard Worker     void generateRenderPassCommandsQueueSerial(QueueSerial *queueSerialOut);
1463*8975f5c5SAndroid Build Coastguard Worker 
1464*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureInterfacePipelineCache();
1465*8975f5c5SAndroid Build Coastguard Worker 
1466*8975f5c5SAndroid Build Coastguard Worker     angle::ImageLoadContext mImageLoadContext;
1467*8975f5c5SAndroid Build Coastguard Worker 
1468*8975f5c5SAndroid Build Coastguard Worker     std::array<GraphicsDirtyBitHandler, DIRTY_BIT_MAX> mGraphicsDirtyBitHandlers;
1469*8975f5c5SAndroid Build Coastguard Worker     std::array<ComputeDirtyBitHandler, DIRTY_BIT_MAX> mComputeDirtyBitHandlers;
1470*8975f5c5SAndroid Build Coastguard Worker 
1471*8975f5c5SAndroid Build Coastguard Worker     vk::RenderPassCommandBuffer *mRenderPassCommandBuffer;
1472*8975f5c5SAndroid Build Coastguard Worker 
1473*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineHelper *mCurrentGraphicsPipeline;
1474*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineHelper *mCurrentGraphicsPipelineShaders;
1475*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineHelper *mCurrentGraphicsPipelineVertexInput;
1476*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineHelper *mCurrentGraphicsPipelineFragmentOutput;
1477*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineHelper *mCurrentComputePipeline;
1478*8975f5c5SAndroid Build Coastguard Worker     gl::PrimitiveMode mCurrentDrawMode;
1479*8975f5c5SAndroid Build Coastguard Worker 
1480*8975f5c5SAndroid Build Coastguard Worker     WindowSurfaceVk *mCurrentWindowSurface;
1481*8975f5c5SAndroid Build Coastguard Worker     // Records the current rotation of the surface (draw/read) framebuffer, derived from
1482*8975f5c5SAndroid Build Coastguard Worker     // mCurrentWindowSurface->getPreTransform().
1483*8975f5c5SAndroid Build Coastguard Worker     SurfaceRotation mCurrentRotationDrawFramebuffer;
1484*8975f5c5SAndroid Build Coastguard Worker     SurfaceRotation mCurrentRotationReadFramebuffer;
1485*8975f5c5SAndroid Build Coastguard Worker 
1486*8975f5c5SAndroid Build Coastguard Worker     // Tracks if we are in depth/stencil *read-only* or feedback loop mode. The read only is
1487*8975f5c5SAndroid Build Coastguard Worker     // specially allowed as both usages attachment and texture are read-only. When switching away
1488*8975f5c5SAndroid Build Coastguard Worker     // from read-only mode, the render pass is broken is to accommodate the new writable layout.
1489*8975f5c5SAndroid Build Coastguard Worker     vk::RenderPassUsageFlags mDepthStencilAttachmentFlags;
1490*8975f5c5SAndroid Build Coastguard Worker 
1491*8975f5c5SAndroid Build Coastguard Worker     // Keep a cached pipeline description structure that can be used to query the pipeline cache.
1492*8975f5c5SAndroid Build Coastguard Worker     // Kept in a pointer so allocations can be aligned, and structs can be portably packed.
1493*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<vk::GraphicsPipelineDesc> mGraphicsPipelineDesc;
1494*8975f5c5SAndroid Build Coastguard Worker     // Transition bits indicating which state has changed since last pipeline recreation.  It is
1495*8975f5c5SAndroid Build Coastguard Worker     // used to look up pipelines in the cache without iterating over the entire key as a performance
1496*8975f5c5SAndroid Build Coastguard Worker     // optimization.
1497*8975f5c5SAndroid Build Coastguard Worker     //
1498*8975f5c5SAndroid Build Coastguard Worker     // |mGraphicsPipelineTransition| tracks transition bits since the last complete pipeline
1499*8975f5c5SAndroid Build Coastguard Worker     // creation/retrieval.  |mGraphicsPipelineLibraryTransition| tracks the same but for the case
1500*8975f5c5SAndroid Build Coastguard Worker     // where the pipeline is created through libraries.  The latter accumulates
1501*8975f5c5SAndroid Build Coastguard Worker     // |mGraphicsPipelineTransition| while the caches are hit, so that the bits are not lost if a
1502*8975f5c5SAndroid Build Coastguard Worker     // partial library needs to be created in the future.
1503*8975f5c5SAndroid Build Coastguard Worker     vk::GraphicsPipelineTransitionBits mGraphicsPipelineTransition;
1504*8975f5c5SAndroid Build Coastguard Worker     vk::GraphicsPipelineTransitionBits mGraphicsPipelineLibraryTransition;
1505*8975f5c5SAndroid Build Coastguard Worker 
1506*8975f5c5SAndroid Build Coastguard Worker     // A pipeline cache specifically used for vertex input and fragment output pipelines, when there
1507*8975f5c5SAndroid Build Coastguard Worker     // is no blob reuse between libraries and monolithic pipelines.  In that case, there's no point
1508*8975f5c5SAndroid Build Coastguard Worker     // in making monolithic pipelines be stored in the same cache as these partial pipelines.
1509*8975f5c5SAndroid Build Coastguard Worker     //
1510*8975f5c5SAndroid Build Coastguard Worker     // Note additionally that applications only create a handful of vertex input and fragment output
1511*8975f5c5SAndroid Build Coastguard Worker     // pipelines, which is also s fast operation, so this cache is both small and ephemeral (i.e.
1512*8975f5c5SAndroid Build Coastguard Worker     // not cached to disk).
1513*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineCache mInterfacePipelinesCache;
1514*8975f5c5SAndroid Build Coastguard Worker 
1515*8975f5c5SAndroid Build Coastguard Worker     // These pools are externally synchronized, so cannot be accessed from different
1516*8975f5c5SAndroid Build Coastguard Worker     // threads simultaneously. Hence, we keep them in the ContextVk instead of the vk::Renderer.
1517*8975f5c5SAndroid Build Coastguard Worker     // Note that this implementation would need to change in shared resource scenarios. Likely
1518*8975f5c5SAndroid Build Coastguard Worker     // we'd instead share a single set of pools between the share groups.
1519*8975f5c5SAndroid Build Coastguard Worker     gl::QueryTypeMap<vk::DynamicQueryPool> mQueryPools;
1520*8975f5c5SAndroid Build Coastguard Worker 
1521*8975f5c5SAndroid Build Coastguard Worker     // Queries that need to be closed and reopened with the render pass:
1522*8975f5c5SAndroid Build Coastguard Worker     //
1523*8975f5c5SAndroid Build Coastguard Worker     // - Occlusion queries
1524*8975f5c5SAndroid Build Coastguard Worker     // - Transform feedback queries, if not emulated
1525*8975f5c5SAndroid Build Coastguard Worker     gl::QueryTypeMap<QueryVk *> mActiveRenderPassQueries;
1526*8975f5c5SAndroid Build Coastguard Worker 
1527*8975f5c5SAndroid Build Coastguard Worker     // Dirty bits.
1528*8975f5c5SAndroid Build Coastguard Worker     DirtyBits mGraphicsDirtyBits;
1529*8975f5c5SAndroid Build Coastguard Worker     DirtyBits mComputeDirtyBits;
1530*8975f5c5SAndroid Build Coastguard Worker     DirtyBits mNonIndexedDirtyBitsMask;
1531*8975f5c5SAndroid Build Coastguard Worker     DirtyBits mIndexedDirtyBitsMask;
1532*8975f5c5SAndroid Build Coastguard Worker     DirtyBits mNewGraphicsCommandBufferDirtyBits;
1533*8975f5c5SAndroid Build Coastguard Worker     DirtyBits mNewComputeCommandBufferDirtyBits;
1534*8975f5c5SAndroid Build Coastguard Worker     DirtyBits mDynamicStateDirtyBits;
1535*8975f5c5SAndroid Build Coastguard Worker     DirtyBits mPersistentGraphicsDirtyBits;
1536*8975f5c5SAndroid Build Coastguard Worker     static constexpr DirtyBits kColorAccessChangeDirtyBits{DIRTY_BIT_COLOR_ACCESS};
1537*8975f5c5SAndroid Build Coastguard Worker     static constexpr DirtyBits kDepthStencilAccessChangeDirtyBits{
1538*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_READ_ONLY_DEPTH_FEEDBACK_LOOP_MODE, DIRTY_BIT_DEPTH_STENCIL_ACCESS};
1539*8975f5c5SAndroid Build Coastguard Worker     static constexpr DirtyBits kIndexAndVertexDirtyBits{DIRTY_BIT_VERTEX_BUFFERS,
1540*8975f5c5SAndroid Build Coastguard Worker                                                         DIRTY_BIT_INDEX_BUFFER};
1541*8975f5c5SAndroid Build Coastguard Worker     static constexpr DirtyBits kPipelineDescAndBindingDirtyBits{DIRTY_BIT_PIPELINE_DESC,
1542*8975f5c5SAndroid Build Coastguard Worker                                                                 DIRTY_BIT_PIPELINE_BINDING};
1543*8975f5c5SAndroid Build Coastguard Worker     static constexpr DirtyBits kTexturesAndDescSetDirtyBits{DIRTY_BIT_TEXTURES,
1544*8975f5c5SAndroid Build Coastguard Worker                                                             DIRTY_BIT_DESCRIPTOR_SETS};
1545*8975f5c5SAndroid Build Coastguard Worker     static constexpr DirtyBits kResourcesAndDescSetDirtyBits{DIRTY_BIT_SHADER_RESOURCES,
1546*8975f5c5SAndroid Build Coastguard Worker                                                              DIRTY_BIT_DESCRIPTOR_SETS};
1547*8975f5c5SAndroid Build Coastguard Worker     static constexpr DirtyBits kUniformBuffersAndDescSetDirtyBits{DIRTY_BIT_UNIFORM_BUFFERS,
1548*8975f5c5SAndroid Build Coastguard Worker                                                                   DIRTY_BIT_DESCRIPTOR_SETS};
1549*8975f5c5SAndroid Build Coastguard Worker     static constexpr DirtyBits kXfbBuffersAndDescSetDirtyBits{DIRTY_BIT_TRANSFORM_FEEDBACK_BUFFERS,
1550*8975f5c5SAndroid Build Coastguard Worker                                                               DIRTY_BIT_DESCRIPTOR_SETS};
1551*8975f5c5SAndroid Build Coastguard Worker 
1552*8975f5c5SAndroid Build Coastguard Worker     // The offset we had the last time we bound the index buffer.
1553*8975f5c5SAndroid Build Coastguard Worker     const GLvoid *mLastIndexBufferOffset;
1554*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper *mCurrentIndexBuffer;
1555*8975f5c5SAndroid Build Coastguard Worker     VkDeviceSize mCurrentIndexBufferOffset;
1556*8975f5c5SAndroid Build Coastguard Worker     gl::DrawElementsType mCurrentDrawElementsType;
1557*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<gl::DrawElementsType, VkIndexType> mIndexTypeMap;
1558*8975f5c5SAndroid Build Coastguard Worker 
1559*8975f5c5SAndroid Build Coastguard Worker     // Cache the current draw call's firstVertex to be passed to
1560*8975f5c5SAndroid Build Coastguard Worker     // TransformFeedbackVk::getBufferOffsets.  Unfortunately, gl_BaseVertex support in Vulkan is
1561*8975f5c5SAndroid Build Coastguard Worker     // not yet ubiquitous, which would have otherwise removed the need for this value to be passed
1562*8975f5c5SAndroid Build Coastguard Worker     // as a uniform.
1563*8975f5c5SAndroid Build Coastguard Worker     GLint mXfbBaseVertex;
1564*8975f5c5SAndroid Build Coastguard Worker     // Cache the current draw call's vertex count as well to support instanced draw calls
1565*8975f5c5SAndroid Build Coastguard Worker     GLuint mXfbVertexCountPerInstance;
1566*8975f5c5SAndroid Build Coastguard Worker 
1567*8975f5c5SAndroid Build Coastguard Worker     // Cached clear value/mask for color and depth/stencil.
1568*8975f5c5SAndroid Build Coastguard Worker     VkClearValue mClearColorValue;
1569*8975f5c5SAndroid Build Coastguard Worker     VkClearValue mClearDepthStencilValue;
1570*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::ColorMaskStorage::Type mClearColorMasks;
1571*8975f5c5SAndroid Build Coastguard Worker 
1572*8975f5c5SAndroid Build Coastguard Worker     // The unprocessed bits passed in from the previous glMemoryBarrier call
1573*8975f5c5SAndroid Build Coastguard Worker     GLbitfield mDeferredMemoryBarriers;
1574*8975f5c5SAndroid Build Coastguard Worker 
1575*8975f5c5SAndroid Build Coastguard Worker     IncompleteTextureSet mIncompleteTextures;
1576*8975f5c5SAndroid Build Coastguard Worker 
1577*8975f5c5SAndroid Build Coastguard Worker     // If the current surface bound to this context wants to have all rendering flipped vertically.
1578*8975f5c5SAndroid Build Coastguard Worker     // Updated on calls to onMakeCurrent.
1579*8975f5c5SAndroid Build Coastguard Worker     bool mFlipYForCurrentSurface;
1580*8975f5c5SAndroid Build Coastguard Worker     bool mFlipViewportForDrawFramebuffer;
1581*8975f5c5SAndroid Build Coastguard Worker     bool mFlipViewportForReadFramebuffer;
1582*8975f5c5SAndroid Build Coastguard Worker 
1583*8975f5c5SAndroid Build Coastguard Worker     // If any host-visible buffer is written by the GPU since last submission, a barrier is inserted
1584*8975f5c5SAndroid Build Coastguard Worker     // at the end of the command buffer to make that write available to the host.
1585*8975f5c5SAndroid Build Coastguard Worker     bool mIsAnyHostVisibleBufferWritten;
1586*8975f5c5SAndroid Build Coastguard Worker 
1587*8975f5c5SAndroid Build Coastguard Worker     // This info is used in the descriptor update step.
1588*8975f5c5SAndroid Build Coastguard Worker     gl::ActiveTextureArray<TextureVk *> mActiveTextures;
1589*8975f5c5SAndroid Build Coastguard Worker 
1590*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetDescBuilder mShaderBuffersDescriptorDesc;
1591*8975f5c5SAndroid Build Coastguard Worker     // The WriteDescriptorDescs from ProgramExecutableVk with InputAttachment update.
1592*8975f5c5SAndroid Build Coastguard Worker     vk::WriteDescriptorDescs mShaderBufferWriteDescriptorDescs;
1593*8975f5c5SAndroid Build Coastguard Worker 
1594*8975f5c5SAndroid Build Coastguard Worker     gl::ActiveTextureArray<TextureVk *> mActiveImages;
1595*8975f5c5SAndroid Build Coastguard Worker 
1596*8975f5c5SAndroid Build Coastguard Worker     // "Current Value" aka default vertex attribute state.
1597*8975f5c5SAndroid Build Coastguard Worker     gl::AttributesMask mDirtyDefaultAttribsMask;
1598*8975f5c5SAndroid Build Coastguard Worker 
1599*8975f5c5SAndroid Build Coastguard Worker     // DynamicBuffers for streaming vertex data from client memory pointer as well as for default
1600*8975f5c5SAndroid Build Coastguard Worker     // attributes. mHasInFlightStreamedVertexBuffers indicates if the dynamic buffer has any
1601*8975f5c5SAndroid Build Coastguard Worker     // in-flight buffer or not that we need to release at submission time.
1602*8975f5c5SAndroid Build Coastguard Worker     gl::AttribArray<vk::DynamicBuffer> mStreamedVertexBuffers;
1603*8975f5c5SAndroid Build Coastguard Worker     gl::AttributesMask mHasInFlightStreamedVertexBuffers;
1604*8975f5c5SAndroid Build Coastguard Worker 
1605*8975f5c5SAndroid Build Coastguard Worker     // We use a single pool for recording commands. We also keep a free list for pool recycling.
1606*8975f5c5SAndroid Build Coastguard Worker     vk::SecondaryCommandPools mCommandPools;
1607*8975f5c5SAndroid Build Coastguard Worker 
1608*8975f5c5SAndroid Build Coastguard Worker     // Per context queue serial
1609*8975f5c5SAndroid Build Coastguard Worker     SerialIndex mCurrentQueueSerialIndex;
1610*8975f5c5SAndroid Build Coastguard Worker     QueueSerial mLastFlushedQueueSerial;
1611*8975f5c5SAndroid Build Coastguard Worker     QueueSerial mLastSubmittedQueueSerial;
1612*8975f5c5SAndroid Build Coastguard Worker     // All submitted queue serials over the life time of this context.
1613*8975f5c5SAndroid Build Coastguard Worker     vk::ResourceUse mSubmittedResourceUse;
1614*8975f5c5SAndroid Build Coastguard Worker     // Current active transform feedback buffer queue serial. Invalid if TF not active.
1615*8975f5c5SAndroid Build Coastguard Worker     QueueSerial mCurrentTransformFeedbackQueueSerial;
1616*8975f5c5SAndroid Build Coastguard Worker 
1617*8975f5c5SAndroid Build Coastguard Worker     // The garbage list for single context use objects. The list will be GPU tracked by next
1618*8975f5c5SAndroid Build Coastguard Worker     // submission queueSerial. Note: Resource based shared object should always be added to
1619*8975f5c5SAndroid Build Coastguard Worker     // renderer's mSharedGarbageList.
1620*8975f5c5SAndroid Build Coastguard Worker     vk::GarbageObjects mCurrentGarbage;
1621*8975f5c5SAndroid Build Coastguard Worker 
1622*8975f5c5SAndroid Build Coastguard Worker     RenderPassCache mRenderPassCache;
1623*8975f5c5SAndroid Build Coastguard Worker     // Used with dynamic rendering as it doesn't use render passes.
1624*8975f5c5SAndroid Build Coastguard Worker     vk::RenderPass mNullRenderPass;
1625*8975f5c5SAndroid Build Coastguard Worker 
1626*8975f5c5SAndroid Build Coastguard Worker     vk::OutsideRenderPassCommandBufferHelper *mOutsideRenderPassCommands;
1627*8975f5c5SAndroid Build Coastguard Worker     vk::RenderPassCommandBufferHelper *mRenderPassCommands;
1628*8975f5c5SAndroid Build Coastguard Worker 
1629*8975f5c5SAndroid Build Coastguard Worker     // Allocators for the render pass command buffers. They are utilized only when shared ring
1630*8975f5c5SAndroid Build Coastguard Worker     // buffer allocators are being used.
1631*8975f5c5SAndroid Build Coastguard Worker     vk::SecondaryCommandMemoryAllocator mOutsideRenderPassCommandsAllocator;
1632*8975f5c5SAndroid Build Coastguard Worker     vk::SecondaryCommandMemoryAllocator mRenderPassCommandsAllocator;
1633*8975f5c5SAndroid Build Coastguard Worker 
1634*8975f5c5SAndroid Build Coastguard Worker     // The following is used when creating debug-util markers for graphics debuggers (e.g. AGI).  A
1635*8975f5c5SAndroid Build Coastguard Worker     // given gl{Begin|End}Query command may result in commands being submitted to the outside or
1636*8975f5c5SAndroid Build Coastguard Worker     // render-pass command buffer.  The ContextVk::handleGraphicsEventLog() method records the
1637*8975f5c5SAndroid Build Coastguard Worker     // appropriate command buffer for use by ContextVk::endEventLogForQuery().  The knowledge of
1638*8975f5c5SAndroid Build Coastguard Worker     // which command buffer to use depends on the particular type of query (e.g. samples
1639*8975f5c5SAndroid Build Coastguard Worker     // vs. timestamp), and is only known by the query code, which is what calls
1640*8975f5c5SAndroid Build Coastguard Worker     // ContextVk::handleGraphicsEventLog().  After all back-end processing of the gl*Query command
1641*8975f5c5SAndroid Build Coastguard Worker     // is complete, the front-end calls ContextVk::endEventLogForQuery(), which needs to know which
1642*8975f5c5SAndroid Build Coastguard Worker     // command buffer to call endDebugUtilsLabelEXT() for.
1643*8975f5c5SAndroid Build Coastguard Worker     GraphicsEventCmdBuf mQueryEventType;
1644*8975f5c5SAndroid Build Coastguard Worker 
1645*8975f5c5SAndroid Build Coastguard Worker     // Internal shader library.
1646*8975f5c5SAndroid Build Coastguard Worker     vk::ShaderLibrary mShaderLibrary;
1647*8975f5c5SAndroid Build Coastguard Worker     UtilsVk mUtils;
1648*8975f5c5SAndroid Build Coastguard Worker 
1649*8975f5c5SAndroid Build Coastguard Worker     bool mGpuEventsEnabled;
1650*8975f5c5SAndroid Build Coastguard Worker     vk::DynamicQueryPool mGpuEventQueryPool;
1651*8975f5c5SAndroid Build Coastguard Worker     // A list of queries that have yet to be turned into an event (their result is not yet
1652*8975f5c5SAndroid Build Coastguard Worker     // available).
1653*8975f5c5SAndroid Build Coastguard Worker     std::vector<GpuEventQuery> mInFlightGpuEventQueries;
1654*8975f5c5SAndroid Build Coastguard Worker     // A list of gpu events since the last clock sync.
1655*8975f5c5SAndroid Build Coastguard Worker     std::vector<GpuEvent> mGpuEvents;
1656*8975f5c5SAndroid Build Coastguard Worker     // The current frame index, used to generate a submission-encompassing event tagged with it.
1657*8975f5c5SAndroid Build Coastguard Worker     uint32_t mPrimaryBufferEventCounter;
1658*8975f5c5SAndroid Build Coastguard Worker 
1659*8975f5c5SAndroid Build Coastguard Worker     // Cached value of the color attachment mask of the current draw framebuffer.  This is used to
1660*8975f5c5SAndroid Build Coastguard Worker     // know which attachment indices have their blend state set in |mGraphicsPipelineDesc|, and
1661*8975f5c5SAndroid Build Coastguard Worker     // subsequently is used to clear the blend state for attachments that no longer exist when a new
1662*8975f5c5SAndroid Build Coastguard Worker     // framebuffer is bound.
1663*8975f5c5SAndroid Build Coastguard Worker     gl::DrawBufferMask mCachedDrawFramebufferColorAttachmentMask;
1664*8975f5c5SAndroid Build Coastguard Worker 
1665*8975f5c5SAndroid Build Coastguard Worker     // Whether a flush was requested, but is deferred as an optimization to avoid breaking the
1666*8975f5c5SAndroid Build Coastguard Worker     // render pass.
1667*8975f5c5SAndroid Build Coastguard Worker     bool mHasDeferredFlush;
1668*8975f5c5SAndroid Build Coastguard Worker 
1669*8975f5c5SAndroid Build Coastguard Worker     // Whether this context has produced any commands so far.  While the renderer already skips
1670*8975f5c5SAndroid Build Coastguard Worker     // vkQueueSubmit when there is no command recorded, this variable allows glFlush itself to be
1671*8975f5c5SAndroid Build Coastguard Worker     // entirely skipped.  This is particularly needed for an optimization where the Surface is in
1672*8975f5c5SAndroid Build Coastguard Worker     // shared-present mode, and the app is unnecessarily calling eglSwapBuffers (which equates
1673*8975f5c5SAndroid Build Coastguard Worker     // glFlush in that mode).
1674*8975f5c5SAndroid Build Coastguard Worker     bool mHasAnyCommandsPendingSubmission;
1675*8975f5c5SAndroid Build Coastguard Worker 
1676*8975f5c5SAndroid Build Coastguard Worker     // Whether color framebuffer fetch is active.  When the permanentlySwitchToFramebufferFetchMode
1677*8975f5c5SAndroid Build Coastguard Worker     // feature is enabled, if any program uses framebuffer fetch, rendering switches to assuming
1678*8975f5c5SAndroid Build Coastguard Worker     // framebuffer fetch could happen in any render pass.  This incurs a potential cost due to usage
1679*8975f5c5SAndroid Build Coastguard Worker     // of the GENERAL layout instead of COLOR_ATTACHMENT_OPTIMAL, but has definite benefits of
1680*8975f5c5SAndroid Build Coastguard Worker     // avoiding render pass breaks when a framebuffer fetch program is used mid render pass.
1681*8975f5c5SAndroid Build Coastguard Worker     //
1682*8975f5c5SAndroid Build Coastguard Worker     // This only applies to legacy render passes (i.e. when dynamic rendering is NOT used).  In the
1683*8975f5c5SAndroid Build Coastguard Worker     // case of dynamic rendering, every render pass starts with the assumption of not needing input
1684*8975f5c5SAndroid Build Coastguard Worker     // attachments and switches later if it needs to with no penalty.
1685*8975f5c5SAndroid Build Coastguard Worker     //
1686*8975f5c5SAndroid Build Coastguard Worker     // Note that depth/stencil framebuffer fetch does not need this sort of tracking because it is
1687*8975f5c5SAndroid Build Coastguard Worker     // only enabled with dynamic rendering.
1688*8975f5c5SAndroid Build Coastguard Worker     bool mIsInColorFramebufferFetchMode;
1689*8975f5c5SAndroid Build Coastguard Worker 
1690*8975f5c5SAndroid Build Coastguard Worker     // True if current started render pass is allowed to reactivate.
1691*8975f5c5SAndroid Build Coastguard Worker     bool mAllowRenderPassToReactivate;
1692*8975f5c5SAndroid Build Coastguard Worker 
1693*8975f5c5SAndroid Build Coastguard Worker     // The size of copy commands issued between buffers and images. Used to submit the command
1694*8975f5c5SAndroid Build Coastguard Worker     // buffer for the outside render pass.
1695*8975f5c5SAndroid Build Coastguard Worker     VkDeviceSize mTotalBufferToImageCopySize;
1696*8975f5c5SAndroid Build Coastguard Worker     VkDeviceSize mEstimatedPendingImageGarbageSize;
1697*8975f5c5SAndroid Build Coastguard Worker 
1698*8975f5c5SAndroid Build Coastguard Worker     // Semaphores that must be flushed before the current commands. Flushed semaphores will be
1699*8975f5c5SAndroid Build Coastguard Worker     // waited on in the next submission.
1700*8975f5c5SAndroid Build Coastguard Worker     std::vector<VkSemaphore> mWaitSemaphores;
1701*8975f5c5SAndroid Build Coastguard Worker     std::vector<VkPipelineStageFlags> mWaitSemaphoreStageMasks;
1702*8975f5c5SAndroid Build Coastguard Worker     // Whether this context has wait semaphores (flushed and unflushed) that must be submitted.
1703*8975f5c5SAndroid Build Coastguard Worker     bool mHasWaitSemaphoresPendingSubmission;
1704*8975f5c5SAndroid Build Coastguard Worker 
1705*8975f5c5SAndroid Build Coastguard Worker     // Hold information from the last gpu clock sync for future gpu-to-cpu timestamp conversions.
1706*8975f5c5SAndroid Build Coastguard Worker     GpuClockSyncInfo mGpuClockSync;
1707*8975f5c5SAndroid Build Coastguard Worker 
1708*8975f5c5SAndroid Build Coastguard Worker     // The very first timestamp queried for a GPU event is used as origin, so event timestamps would
1709*8975f5c5SAndroid Build Coastguard Worker     // have a value close to zero, to avoid losing 12 bits when converting these 64 bit values to
1710*8975f5c5SAndroid Build Coastguard Worker     // double.
1711*8975f5c5SAndroid Build Coastguard Worker     uint64_t mGpuEventTimestampOrigin;
1712*8975f5c5SAndroid Build Coastguard Worker 
1713*8975f5c5SAndroid Build Coastguard Worker     // A mix of per-frame and per-run counters.
1714*8975f5c5SAndroid Build Coastguard Worker     angle::PerfMonitorCounterGroups mPerfMonitorCounters;
1715*8975f5c5SAndroid Build Coastguard Worker 
1716*8975f5c5SAndroid Build Coastguard Worker     gl::state::DirtyBits mPipelineDirtyBitsMask;
1717*8975f5c5SAndroid Build Coastguard Worker 
1718*8975f5c5SAndroid Build Coastguard Worker     egl::ContextPriority mInitialContextPriority;
1719*8975f5c5SAndroid Build Coastguard Worker     egl::ContextPriority mContextPriority;
1720*8975f5c5SAndroid Build Coastguard Worker     vk::ProtectionType mProtectionType;
1721*8975f5c5SAndroid Build Coastguard Worker 
1722*8975f5c5SAndroid Build Coastguard Worker     ShareGroupVk *mShareGroupVk;
1723*8975f5c5SAndroid Build Coastguard Worker 
1724*8975f5c5SAndroid Build Coastguard Worker     // This is a special "empty" placeholder buffer for use when we just need a placeholder buffer
1725*8975f5c5SAndroid Build Coastguard Worker     // but not the data. Examples are shader that has no uniform or doesn't use all slots in the
1726*8975f5c5SAndroid Build Coastguard Worker     // atomic counter buffer array, or places where there is no vertex buffer since Vulkan does not
1727*8975f5c5SAndroid Build Coastguard Worker     // allow binding a null vertex buffer.
1728*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper mEmptyBuffer;
1729*8975f5c5SAndroid Build Coastguard Worker 
1730*8975f5c5SAndroid Build Coastguard Worker     // Storage for default uniforms of ProgramVks and ProgramPipelineVks.
1731*8975f5c5SAndroid Build Coastguard Worker     vk::DynamicBuffer mDefaultUniformStorage;
1732*8975f5c5SAndroid Build Coastguard Worker 
1733*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::string> mCommandBufferDiagnostics;
1734*8975f5c5SAndroid Build Coastguard Worker 
1735*8975f5c5SAndroid Build Coastguard Worker     // Record GL API calls for debuggers
1736*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::string> mEventLog;
1737*8975f5c5SAndroid Build Coastguard Worker 
1738*8975f5c5SAndroid Build Coastguard Worker     // Viewport and scissor are handled as dynamic state.
1739*8975f5c5SAndroid Build Coastguard Worker     VkViewport mViewport;
1740*8975f5c5SAndroid Build Coastguard Worker     VkRect2D mScissor;
1741*8975f5c5SAndroid Build Coastguard Worker 
1742*8975f5c5SAndroid Build Coastguard Worker     VulkanCacheStats mVulkanCacheStats;
1743*8975f5c5SAndroid Build Coastguard Worker 
1744*8975f5c5SAndroid Build Coastguard Worker     RangedSerialFactory mOutsideRenderPassSerialFactory;
1745*8975f5c5SAndroid Build Coastguard Worker };
1746*8975f5c5SAndroid Build Coastguard Worker 
endRenderPassIfTransformFeedbackBuffer(const vk::BufferHelper * buffer)1747*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE angle::Result ContextVk::endRenderPassIfTransformFeedbackBuffer(
1748*8975f5c5SAndroid Build Coastguard Worker     const vk::BufferHelper *buffer)
1749*8975f5c5SAndroid Build Coastguard Worker {
1750*8975f5c5SAndroid Build Coastguard Worker     if (!mCurrentTransformFeedbackQueueSerial.valid() || !buffer ||
1751*8975f5c5SAndroid Build Coastguard Worker         !buffer->writtenByCommandBuffer(mCurrentTransformFeedbackQueueSerial))
1752*8975f5c5SAndroid Build Coastguard Worker     {
1753*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
1754*8975f5c5SAndroid Build Coastguard Worker     }
1755*8975f5c5SAndroid Build Coastguard Worker 
1756*8975f5c5SAndroid Build Coastguard Worker     return flushCommandsAndEndRenderPass(RenderPassClosureReason::XfbWriteThenVertexIndexBuffer);
1757*8975f5c5SAndroid Build Coastguard Worker }
1758*8975f5c5SAndroid Build Coastguard Worker 
onIndexBufferChange(const vk::BufferHelper * currentIndexBuffer)1759*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE angle::Result ContextVk::onIndexBufferChange(
1760*8975f5c5SAndroid Build Coastguard Worker     const vk::BufferHelper *currentIndexBuffer)
1761*8975f5c5SAndroid Build Coastguard Worker {
1762*8975f5c5SAndroid Build Coastguard Worker     mGraphicsDirtyBits.set(DIRTY_BIT_INDEX_BUFFER);
1763*8975f5c5SAndroid Build Coastguard Worker     mLastIndexBufferOffset = reinterpret_cast<const void *>(angle::DirtyPointer);
1764*8975f5c5SAndroid Build Coastguard Worker     return endRenderPassIfTransformFeedbackBuffer(currentIndexBuffer);
1765*8975f5c5SAndroid Build Coastguard Worker }
1766*8975f5c5SAndroid Build Coastguard Worker 
onVertexBufferChange(const vk::BufferHelper * vertexBuffer)1767*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE angle::Result ContextVk::onVertexBufferChange(const vk::BufferHelper *vertexBuffer)
1768*8975f5c5SAndroid Build Coastguard Worker {
1769*8975f5c5SAndroid Build Coastguard Worker     mGraphicsDirtyBits.set(DIRTY_BIT_VERTEX_BUFFERS);
1770*8975f5c5SAndroid Build Coastguard Worker     return endRenderPassIfTransformFeedbackBuffer(vertexBuffer);
1771*8975f5c5SAndroid Build Coastguard Worker }
1772*8975f5c5SAndroid Build Coastguard Worker 
onVertexAttributeChange(size_t attribIndex,GLuint stride,GLuint divisor,angle::FormatID format,bool compressed,GLuint relativeOffset,const vk::BufferHelper * vertexBuffer)1773*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE angle::Result ContextVk::onVertexAttributeChange(size_t attribIndex,
1774*8975f5c5SAndroid Build Coastguard Worker                                                               GLuint stride,
1775*8975f5c5SAndroid Build Coastguard Worker                                                               GLuint divisor,
1776*8975f5c5SAndroid Build Coastguard Worker                                                               angle::FormatID format,
1777*8975f5c5SAndroid Build Coastguard Worker                                                               bool compressed,
1778*8975f5c5SAndroid Build Coastguard Worker                                                               GLuint relativeOffset,
1779*8975f5c5SAndroid Build Coastguard Worker                                                               const vk::BufferHelper *vertexBuffer)
1780*8975f5c5SAndroid Build Coastguard Worker {
1781*8975f5c5SAndroid Build Coastguard Worker     const GLuint staticStride =
1782*8975f5c5SAndroid Build Coastguard Worker         mRenderer->getFeatures().useVertexInputBindingStrideDynamicState.enabled ? 0 : stride;
1783*8975f5c5SAndroid Build Coastguard Worker 
1784*8975f5c5SAndroid Build Coastguard Worker     if (!getFeatures().supportsVertexInputDynamicState.enabled)
1785*8975f5c5SAndroid Build Coastguard Worker     {
1786*8975f5c5SAndroid Build Coastguard Worker         invalidateCurrentGraphicsPipeline();
1787*8975f5c5SAndroid Build Coastguard Worker 
1788*8975f5c5SAndroid Build Coastguard Worker         // Set divisor to 1 for attribs with emulated divisor
1789*8975f5c5SAndroid Build Coastguard Worker         mGraphicsPipelineDesc->updateVertexInput(
1790*8975f5c5SAndroid Build Coastguard Worker             this, &mGraphicsPipelineTransition, static_cast<uint32_t>(attribIndex), staticStride,
1791*8975f5c5SAndroid Build Coastguard Worker             divisor > mRenderer->getMaxVertexAttribDivisor() ? 1 : divisor, format, compressed,
1792*8975f5c5SAndroid Build Coastguard Worker             relativeOffset);
1793*8975f5c5SAndroid Build Coastguard Worker     }
1794*8975f5c5SAndroid Build Coastguard Worker     return onVertexBufferChange(vertexBuffer);
1795*8975f5c5SAndroid Build Coastguard Worker }
1796*8975f5c5SAndroid Build Coastguard Worker 
hasUnsubmittedUse(const vk::ResourceUse & use)1797*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE bool ContextVk::hasUnsubmittedUse(const vk::ResourceUse &use) const
1798*8975f5c5SAndroid Build Coastguard Worker {
1799*8975f5c5SAndroid Build Coastguard Worker     return mCurrentQueueSerialIndex != kInvalidQueueSerialIndex &&
1800*8975f5c5SAndroid Build Coastguard Worker            use > QueueSerial(mCurrentQueueSerialIndex,
1801*8975f5c5SAndroid Build Coastguard Worker                              mRenderer->getLastSubmittedSerial(mCurrentQueueSerialIndex));
1802*8975f5c5SAndroid Build Coastguard Worker }
1803*8975f5c5SAndroid Build Coastguard Worker 
UseLineRaster(const ContextVk * contextVk,gl::PrimitiveMode mode)1804*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE bool UseLineRaster(const ContextVk *contextVk, gl::PrimitiveMode mode)
1805*8975f5c5SAndroid Build Coastguard Worker {
1806*8975f5c5SAndroid Build Coastguard Worker     return gl::IsLineMode(mode);
1807*8975f5c5SAndroid Build Coastguard Worker }
1808*8975f5c5SAndroid Build Coastguard Worker 
1809*8975f5c5SAndroid Build Coastguard Worker uint32_t GetDriverUniformSize(vk::Context *context, PipelineType pipelineType);
1810*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
1811*8975f5c5SAndroid Build Coastguard Worker 
1812*8975f5c5SAndroid Build Coastguard Worker // Generate a perf warning, and insert an event marker in the command buffer.
1813*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_VK_PERF_WARNING(contextVk, severity, ...)                             \
1814*8975f5c5SAndroid Build Coastguard Worker     do                                                                              \
1815*8975f5c5SAndroid Build Coastguard Worker     {                                                                               \
1816*8975f5c5SAndroid Build Coastguard Worker         ANGLE_PERF_WARNING(contextVk->getDebug(), severity, __VA_ARGS__);           \
1817*8975f5c5SAndroid Build Coastguard Worker         if (contextVk->isDebugEnabled())                                            \
1818*8975f5c5SAndroid Build Coastguard Worker         {                                                                           \
1819*8975f5c5SAndroid Build Coastguard Worker             char ANGLE_MESSAGE[200];                                                \
1820*8975f5c5SAndroid Build Coastguard Worker             snprintf(ANGLE_MESSAGE, sizeof(ANGLE_MESSAGE), __VA_ARGS__);            \
1821*8975f5c5SAndroid Build Coastguard Worker             contextVk->insertEventMarkerImpl(GL_DEBUG_SOURCE_OTHER, ANGLE_MESSAGE); \
1822*8975f5c5SAndroid Build Coastguard Worker         }                                                                           \
1823*8975f5c5SAndroid Build Coastguard Worker     } while (0)
1824*8975f5c5SAndroid Build Coastguard Worker 
1825*8975f5c5SAndroid Build Coastguard Worker // Generate a trace event for graphics profiler, and insert an event marker in the command buffer.
1826*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_VK_TRACE_EVENT_AND_MARKER(contextVk, ...)                         \
1827*8975f5c5SAndroid Build Coastguard Worker     do                                                                          \
1828*8975f5c5SAndroid Build Coastguard Worker     {                                                                           \
1829*8975f5c5SAndroid Build Coastguard Worker         char ANGLE_MESSAGE[200];                                                \
1830*8975f5c5SAndroid Build Coastguard Worker         snprintf(ANGLE_MESSAGE, sizeof(ANGLE_MESSAGE), __VA_ARGS__);            \
1831*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRACE_EVENT0("gpu.angle", ANGLE_MESSAGE);                         \
1832*8975f5c5SAndroid Build Coastguard Worker                                                                                 \
1833*8975f5c5SAndroid Build Coastguard Worker         contextVk->insertEventMarkerImpl(GL_DEBUG_SOURCE_OTHER, ANGLE_MESSAGE); \
1834*8975f5c5SAndroid Build Coastguard Worker     } while (0)
1835*8975f5c5SAndroid Build Coastguard Worker 
1836*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_CONTEXTVK_H_
1837