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