xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/UtilsVk.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2018 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 // UtilsVk.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the UtilsVk class, a helper for various internal draw/dispatch utilities such as
8*8975f5c5SAndroid Build Coastguard Worker //    buffer clear and copy, image clear and copy, texture mip map generation, etc.
9*8975f5c5SAndroid Build Coastguard Worker //
10*8975f5c5SAndroid Build Coastguard Worker //    - Convert index buffer:
11*8975f5c5SAndroid Build Coastguard Worker //      * Used by VertexArrayVk::convertIndexBufferGPU() to convert a ubyte element array to ushort
12*8975f5c5SAndroid Build Coastguard Worker //    - Convert vertex buffer:
13*8975f5c5SAndroid Build Coastguard Worker //      * Used by VertexArrayVk::convertVertexBufferGPU() to convert vertex attributes from
14*8975f5c5SAndroid Build Coastguard Worker //        unsupported formats to their fallbacks.
15*8975f5c5SAndroid Build Coastguard Worker //    - Image clear: Used by FramebufferVk::clearWithDraw().
16*8975f5c5SAndroid Build Coastguard Worker //    - Image copy: Used by TextureVk::copySubImageImplWithDraw().
17*8975f5c5SAndroid Build Coastguard Worker //    - Image copy bits: Used by ImageHelper::CopyImageSubData() to perform bitwise copies between
18*8975f5c5SAndroid Build Coastguard Worker //      RGB formats where at least one of src and dst use RGBA as fallback.
19*8975f5c5SAndroid Build Coastguard Worker //    - Color blit/resolve: Used by FramebufferVk::blit() to implement blit or multisample resolve
20*8975f5c5SAndroid Build Coastguard Worker //      on color images.
21*8975f5c5SAndroid Build Coastguard Worker //    - Depth/Stencil blit/resolve: Used by FramebufferVk::blit() to implement blit or multisample
22*8975f5c5SAndroid Build Coastguard Worker //      resolve on depth/stencil images.
23*8975f5c5SAndroid Build Coastguard Worker //    - Generate mipmap: Used by TextureVk::generateMipmapsWithCompute().
24*8975f5c5SAndroid Build Coastguard Worker //    - Overlay Draw: Used by OverlayVk to draw a UI for debugging.
25*8975f5c5SAndroid Build Coastguard Worker //    - Mipmap generation: Used by TextureVk to generate mipmaps more efficiently in compute.
26*8975f5c5SAndroid Build Coastguard Worker //
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_UTILSVK_H_
29*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_UTILSVK_H_
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/BufferVk.h"
32*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_cache_utils.h"
33*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
34*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h"
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker namespace rx
37*8975f5c5SAndroid Build Coastguard Worker {
38*8975f5c5SAndroid Build Coastguard Worker class UtilsVk : angle::NonCopyable
39*8975f5c5SAndroid Build Coastguard Worker {
40*8975f5c5SAndroid Build Coastguard Worker   public:
41*8975f5c5SAndroid Build Coastguard Worker     UtilsVk();
42*8975f5c5SAndroid Build Coastguard Worker     ~UtilsVk();
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     void destroy(ContextVk *contextVk);
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker     struct ConvertIndexParameters
47*8975f5c5SAndroid Build Coastguard Worker     {
48*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcOffset = 0;
49*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstOffset = 0;
50*8975f5c5SAndroid Build Coastguard Worker         uint32_t maxIndex  = 0;
51*8975f5c5SAndroid Build Coastguard Worker     };
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker     struct ConvertIndexIndirectParameters
54*8975f5c5SAndroid Build Coastguard Worker     {
55*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcIndirectBufOffset = 0;
56*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcIndexBufOffset    = 0;
57*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstIndexBufOffset    = 0;
58*8975f5c5SAndroid Build Coastguard Worker         uint32_t maxIndex             = 0;
59*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstIndirectBufOffset = 0;
60*8975f5c5SAndroid Build Coastguard Worker     };
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     struct ConvertLineLoopIndexIndirectParameters
63*8975f5c5SAndroid Build Coastguard Worker     {
64*8975f5c5SAndroid Build Coastguard Worker         uint32_t indirectBufferOffset    = 0;
65*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstIndirectBufferOffset = 0;
66*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcIndexBufferOffset    = 0;
67*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstIndexBufferOffset    = 0;
68*8975f5c5SAndroid Build Coastguard Worker         uint32_t indicesBitsWidth        = 0;
69*8975f5c5SAndroid Build Coastguard Worker     };
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     struct ConvertLineLoopArrayIndirectParameters
72*8975f5c5SAndroid Build Coastguard Worker     {
73*8975f5c5SAndroid Build Coastguard Worker         uint32_t indirectBufferOffset    = 0;
74*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstIndirectBufferOffset = 0;
75*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstIndexBufferOffset    = 0;
76*8975f5c5SAndroid Build Coastguard Worker     };
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     struct OffsetAndVertexCount
79*8975f5c5SAndroid Build Coastguard Worker     {
80*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcOffset;
81*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstOffset;
82*8975f5c5SAndroid Build Coastguard Worker         uint32_t vertexCount;
83*8975f5c5SAndroid Build Coastguard Worker     };
84*8975f5c5SAndroid Build Coastguard Worker     using OffsetAndVertexCounts = std::vector<OffsetAndVertexCount>;
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker     struct ConvertVertexParameters
87*8975f5c5SAndroid Build Coastguard Worker     {
88*8975f5c5SAndroid Build Coastguard Worker         size_t vertexCount;
89*8975f5c5SAndroid Build Coastguard Worker         const angle::Format *srcFormat;
90*8975f5c5SAndroid Build Coastguard Worker         const angle::Format *dstFormat;
91*8975f5c5SAndroid Build Coastguard Worker         size_t srcStride;
92*8975f5c5SAndroid Build Coastguard Worker         size_t srcOffset;
93*8975f5c5SAndroid Build Coastguard Worker         size_t dstOffset;
94*8975f5c5SAndroid Build Coastguard Worker     };
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker     struct ClearFramebufferParameters
97*8975f5c5SAndroid Build Coastguard Worker     {
98*8975f5c5SAndroid Build Coastguard Worker         // Satisfy chromium-style with a constructor that does what = {} was already doing in a
99*8975f5c5SAndroid Build Coastguard Worker         // safer way.
100*8975f5c5SAndroid Build Coastguard Worker         ClearFramebufferParameters();
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker         gl::Rectangle clearArea;
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker         bool clearColor;
105*8975f5c5SAndroid Build Coastguard Worker         bool clearDepth;
106*8975f5c5SAndroid Build Coastguard Worker         bool clearStencil;
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker         uint8_t stencilMask;
109*8975f5c5SAndroid Build Coastguard Worker         VkColorComponentFlags colorMaskFlags;
110*8975f5c5SAndroid Build Coastguard Worker         uint32_t colorAttachmentIndexGL;
111*8975f5c5SAndroid Build Coastguard Worker         const angle::Format *colorFormat;
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker         VkClearColorValue colorClearValue;
114*8975f5c5SAndroid Build Coastguard Worker         VkClearDepthStencilValue depthStencilClearValue;
115*8975f5c5SAndroid Build Coastguard Worker     };
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     struct ClearTextureParameters
118*8975f5c5SAndroid Build Coastguard Worker     {
119*8975f5c5SAndroid Build Coastguard Worker         VkImageAspectFlags aspectFlags;
120*8975f5c5SAndroid Build Coastguard Worker         vk::LevelIndex level;
121*8975f5c5SAndroid Build Coastguard Worker         uint32_t layer;
122*8975f5c5SAndroid Build Coastguard Worker         gl::Box clearArea;
123*8975f5c5SAndroid Build Coastguard Worker         VkClearValue clearValue;
124*8975f5c5SAndroid Build Coastguard Worker     };
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker     struct BlitResolveParameters
127*8975f5c5SAndroid Build Coastguard Worker     {
128*8975f5c5SAndroid Build Coastguard Worker         // |srcOffset| and |dstIndexBufferOffset| define the original blit/resolve offsets, possibly
129*8975f5c5SAndroid Build Coastguard Worker         // flipped.
130*8975f5c5SAndroid Build Coastguard Worker         int srcOffset[2];
131*8975f5c5SAndroid Build Coastguard Worker         int dstOffset[2];
132*8975f5c5SAndroid Build Coastguard Worker         // Amount to add to x and y axis for certain rotations
133*8975f5c5SAndroid Build Coastguard Worker         int rotatedOffsetFactor[2];
134*8975f5c5SAndroid Build Coastguard Worker         // |stretch| is SourceDimension / DestDimension used to transfer dst coordinates to source.
135*8975f5c5SAndroid Build Coastguard Worker         float stretch[2];
136*8975f5c5SAndroid Build Coastguard Worker         // |srcExtents| is used to normalize source coordinates for sampling.
137*8975f5c5SAndroid Build Coastguard Worker         int srcExtents[2];
138*8975f5c5SAndroid Build Coastguard Worker         // |blitArea| is the area in destination where blit happens.  It's expected that scissor
139*8975f5c5SAndroid Build Coastguard Worker         // and source clipping effects have already been applied to it.
140*8975f5c5SAndroid Build Coastguard Worker         gl::Rectangle blitArea;
141*8975f5c5SAndroid Build Coastguard Worker         int srcLayer;
142*8975f5c5SAndroid Build Coastguard Worker         // Whether linear or point sampling should be used.
143*8975f5c5SAndroid Build Coastguard Worker         bool linear;
144*8975f5c5SAndroid Build Coastguard Worker         bool flipX;
145*8975f5c5SAndroid Build Coastguard Worker         bool flipY;
146*8975f5c5SAndroid Build Coastguard Worker         SurfaceRotation rotation;
147*8975f5c5SAndroid Build Coastguard Worker     };
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     struct ClearImageParameters
150*8975f5c5SAndroid Build Coastguard Worker     {
151*8975f5c5SAndroid Build Coastguard Worker         gl::Rectangle clearArea;
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker         vk::LevelIndex dstMip;
154*8975f5c5SAndroid Build Coastguard Worker         int dstLayer;
155*8975f5c5SAndroid Build Coastguard Worker 
156*8975f5c5SAndroid Build Coastguard Worker         VkColorComponentFlags colorMaskFlags;
157*8975f5c5SAndroid Build Coastguard Worker         VkClearColorValue colorClearValue;
158*8975f5c5SAndroid Build Coastguard Worker     };
159*8975f5c5SAndroid Build Coastguard Worker 
160*8975f5c5SAndroid Build Coastguard Worker     struct CopyImageParameters
161*8975f5c5SAndroid Build Coastguard Worker     {
162*8975f5c5SAndroid Build Coastguard Worker         int srcOffset[2];
163*8975f5c5SAndroid Build Coastguard Worker         int srcExtents[2];
164*8975f5c5SAndroid Build Coastguard Worker         int dstOffset[2];
165*8975f5c5SAndroid Build Coastguard Worker         int srcMip;
166*8975f5c5SAndroid Build Coastguard Worker         int srcLayer;
167*8975f5c5SAndroid Build Coastguard Worker         int srcSampleCount;
168*8975f5c5SAndroid Build Coastguard Worker         int srcHeight;
169*8975f5c5SAndroid Build Coastguard Worker         gl::LevelIndex dstMip;
170*8975f5c5SAndroid Build Coastguard Worker         int dstLayer;
171*8975f5c5SAndroid Build Coastguard Worker         bool srcPremultiplyAlpha;
172*8975f5c5SAndroid Build Coastguard Worker         bool srcUnmultiplyAlpha;
173*8975f5c5SAndroid Build Coastguard Worker         bool srcFlipY;
174*8975f5c5SAndroid Build Coastguard Worker         bool dstFlipY;
175*8975f5c5SAndroid Build Coastguard Worker         SurfaceRotation srcRotation;
176*8975f5c5SAndroid Build Coastguard Worker         GLenum srcColorEncoding;
177*8975f5c5SAndroid Build Coastguard Worker         GLenum dstColorEncoding;
178*8975f5c5SAndroid Build Coastguard Worker     };
179*8975f5c5SAndroid Build Coastguard Worker 
180*8975f5c5SAndroid Build Coastguard Worker     struct CopyImageBitsParameters
181*8975f5c5SAndroid Build Coastguard Worker     {
182*8975f5c5SAndroid Build Coastguard Worker         int srcOffset[3];
183*8975f5c5SAndroid Build Coastguard Worker         gl::LevelIndex srcLevel;
184*8975f5c5SAndroid Build Coastguard Worker         int dstOffset[3];
185*8975f5c5SAndroid Build Coastguard Worker         gl::LevelIndex dstLevel;
186*8975f5c5SAndroid Build Coastguard Worker         uint32_t copyExtents[3];
187*8975f5c5SAndroid Build Coastguard Worker     };
188*8975f5c5SAndroid Build Coastguard Worker 
189*8975f5c5SAndroid Build Coastguard Worker     struct CopyImageToBufferParameters
190*8975f5c5SAndroid Build Coastguard Worker     {
191*8975f5c5SAndroid Build Coastguard Worker         int srcOffset[2];
192*8975f5c5SAndroid Build Coastguard Worker         vk::LevelIndex srcMip;
193*8975f5c5SAndroid Build Coastguard Worker         int srcLayer;
194*8975f5c5SAndroid Build Coastguard Worker         uint32_t size[2];
195*8975f5c5SAndroid Build Coastguard Worker         ptrdiff_t outputOffset;
196*8975f5c5SAndroid Build Coastguard Worker         uint32_t outputPitch;
197*8975f5c5SAndroid Build Coastguard Worker         bool reverseRowOrder;
198*8975f5c5SAndroid Build Coastguard Worker         const angle::Format *outputFormat;
199*8975f5c5SAndroid Build Coastguard Worker     };
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker     struct OverlayDrawParameters
202*8975f5c5SAndroid Build Coastguard Worker     {
203*8975f5c5SAndroid Build Coastguard Worker         uint32_t textWidgetCount;
204*8975f5c5SAndroid Build Coastguard Worker         uint32_t graphWidgetCount;
205*8975f5c5SAndroid Build Coastguard Worker         bool rotateXY;
206*8975f5c5SAndroid Build Coastguard Worker     };
207*8975f5c5SAndroid Build Coastguard Worker 
208*8975f5c5SAndroid Build Coastguard Worker     struct GenerateMipmapParameters
209*8975f5c5SAndroid Build Coastguard Worker     {
210*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcLevel;
211*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstLevelCount;
212*8975f5c5SAndroid Build Coastguard Worker     };
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker     struct UnresolveParameters
215*8975f5c5SAndroid Build Coastguard Worker     {
216*8975f5c5SAndroid Build Coastguard Worker         gl::DrawBufferMask unresolveColorMask;
217*8975f5c5SAndroid Build Coastguard Worker         bool unresolveDepth;
218*8975f5c5SAndroid Build Coastguard Worker         bool unresolveStencil;
219*8975f5c5SAndroid Build Coastguard Worker     };
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker     struct GenerateFragmentShadingRateParameters
222*8975f5c5SAndroid Build Coastguard Worker     {
223*8975f5c5SAndroid Build Coastguard Worker         uint32_t textureWidth;
224*8975f5c5SAndroid Build Coastguard Worker         uint32_t textureHeight;
225*8975f5c5SAndroid Build Coastguard Worker         uint32_t attachmentWidth;
226*8975f5c5SAndroid Build Coastguard Worker         uint32_t attachmentHeight;
227*8975f5c5SAndroid Build Coastguard Worker         uint32_t attachmentBlockWidth;
228*8975f5c5SAndroid Build Coastguard Worker         uint32_t attachmentBlockHeight;
229*8975f5c5SAndroid Build Coastguard Worker         uint32_t numFocalPoints;
230*8975f5c5SAndroid Build Coastguard Worker         gl::FocalPoint focalPoints[gl::IMPLEMENTATION_MAX_FOCAL_POINTS];
231*8975f5c5SAndroid Build Coastguard Worker     };
232*8975f5c5SAndroid Build Coastguard Worker 
233*8975f5c5SAndroid Build Coastguard Worker     // Based on the maximum number of levels in GenerateMipmap.comp.
234*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kGenerateMipmapMaxLevels = 6;
235*8975f5c5SAndroid Build Coastguard Worker     static uint32_t GetGenerateMipmapMaxLevels(ContextVk *contextVk);
236*8975f5c5SAndroid Build Coastguard Worker 
237*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertIndexBuffer(ContextVk *contextVk,
238*8975f5c5SAndroid Build Coastguard Worker                                      vk::BufferHelper *dst,
239*8975f5c5SAndroid Build Coastguard Worker                                      vk::BufferHelper *src,
240*8975f5c5SAndroid Build Coastguard Worker                                      const ConvertIndexParameters &params);
241*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertIndexIndirectBuffer(ContextVk *contextVk,
242*8975f5c5SAndroid Build Coastguard Worker                                              vk::BufferHelper *srcIndirectBuf,
243*8975f5c5SAndroid Build Coastguard Worker                                              vk::BufferHelper *srcIndexBuf,
244*8975f5c5SAndroid Build Coastguard Worker                                              vk::BufferHelper *dstIndirectBuf,
245*8975f5c5SAndroid Build Coastguard Worker                                              vk::BufferHelper *dstIndexBuf,
246*8975f5c5SAndroid Build Coastguard Worker                                              const ConvertIndexIndirectParameters &params);
247*8975f5c5SAndroid Build Coastguard Worker 
248*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertLineLoopIndexIndirectBuffer(
249*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
250*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *srcIndirectBuffer,
251*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *srcIndexBuffer,
252*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *dstIndirectBuffer,
253*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *dstIndexBuffer,
254*8975f5c5SAndroid Build Coastguard Worker         const ConvertLineLoopIndexIndirectParameters &params);
255*8975f5c5SAndroid Build Coastguard Worker 
256*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertLineLoopArrayIndirectBuffer(
257*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
258*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *srcIndirectBuffer,
259*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *dstIndirectBuffer,
260*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *dstIndexBuffer,
261*8975f5c5SAndroid Build Coastguard Worker         const ConvertLineLoopArrayIndirectParameters &params);
262*8975f5c5SAndroid Build Coastguard Worker 
263*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertVertexBuffer(ContextVk *contextVk,
264*8975f5c5SAndroid Build Coastguard Worker                                       vk::BufferHelper *dst,
265*8975f5c5SAndroid Build Coastguard Worker                                       vk::BufferHelper *src,
266*8975f5c5SAndroid Build Coastguard Worker                                       const ConvertVertexParameters &params,
267*8975f5c5SAndroid Build Coastguard Worker                                       const OffsetAndVertexCounts &additionalOffsetVertexCounts);
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker     // EXT_clear_texture
270*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearTexture(ContextVk *contextVk,
271*8975f5c5SAndroid Build Coastguard Worker                                vk::ImageHelper *dst,
272*8975f5c5SAndroid Build Coastguard Worker                                ClearTextureParameters &params);
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearFramebuffer(ContextVk *contextVk,
275*8975f5c5SAndroid Build Coastguard Worker                                    FramebufferVk *framebuffer,
276*8975f5c5SAndroid Build Coastguard Worker                                    const ClearFramebufferParameters &params);
277*8975f5c5SAndroid Build Coastguard Worker 
278*8975f5c5SAndroid Build Coastguard Worker     // Resolve images if multisampled.  Blit otherwise.
279*8975f5c5SAndroid Build Coastguard Worker     angle::Result colorBlitResolve(ContextVk *contextVk,
280*8975f5c5SAndroid Build Coastguard Worker                                    FramebufferVk *framebuffer,
281*8975f5c5SAndroid Build Coastguard Worker                                    vk::ImageHelper *src,
282*8975f5c5SAndroid Build Coastguard Worker                                    const vk::ImageView *srcView,
283*8975f5c5SAndroid Build Coastguard Worker                                    const BlitResolveParameters &params);
284*8975f5c5SAndroid Build Coastguard Worker     angle::Result depthStencilBlitResolve(ContextVk *contextVk,
285*8975f5c5SAndroid Build Coastguard Worker                                           FramebufferVk *framebuffer,
286*8975f5c5SAndroid Build Coastguard Worker                                           vk::ImageHelper *src,
287*8975f5c5SAndroid Build Coastguard Worker                                           const vk::ImageView *srcDepthView,
288*8975f5c5SAndroid Build Coastguard Worker                                           const vk::ImageView *srcStencilView,
289*8975f5c5SAndroid Build Coastguard Worker                                           const BlitResolveParameters &params);
290*8975f5c5SAndroid Build Coastguard Worker     angle::Result stencilBlitResolveNoShaderExport(ContextVk *contextVk,
291*8975f5c5SAndroid Build Coastguard Worker                                                    FramebufferVk *framebuffer,
292*8975f5c5SAndroid Build Coastguard Worker                                                    vk::ImageHelper *src,
293*8975f5c5SAndroid Build Coastguard Worker                                                    const vk::ImageView *srcStencilView,
294*8975f5c5SAndroid Build Coastguard Worker                                                    const BlitResolveParameters &params);
295*8975f5c5SAndroid Build Coastguard Worker 
296*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearImage(ContextVk *contextVk,
297*8975f5c5SAndroid Build Coastguard Worker                              vk::ImageHelper *dst,
298*8975f5c5SAndroid Build Coastguard Worker                              const ClearImageParameters &params);
299*8975f5c5SAndroid Build Coastguard Worker 
300*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyImage(ContextVk *contextVk,
301*8975f5c5SAndroid Build Coastguard Worker                             vk::ImageHelper *dst,
302*8975f5c5SAndroid Build Coastguard Worker                             const vk::ImageView *dstView,
303*8975f5c5SAndroid Build Coastguard Worker                             vk::ImageHelper *src,
304*8975f5c5SAndroid Build Coastguard Worker                             const vk::ImageView *srcView,
305*8975f5c5SAndroid Build Coastguard Worker                             const CopyImageParameters &params);
306*8975f5c5SAndroid Build Coastguard Worker 
307*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyImageBits(ContextVk *contextVk,
308*8975f5c5SAndroid Build Coastguard Worker                                 vk::ImageHelper *dst,
309*8975f5c5SAndroid Build Coastguard Worker                                 vk::ImageHelper *src,
310*8975f5c5SAndroid Build Coastguard Worker                                 const CopyImageBitsParameters &params);
311*8975f5c5SAndroid Build Coastguard Worker 
312*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyImageToBuffer(ContextVk *contextVk,
313*8975f5c5SAndroid Build Coastguard Worker                                     vk::BufferHelper *dst,
314*8975f5c5SAndroid Build Coastguard Worker                                     vk::ImageHelper *src,
315*8975f5c5SAndroid Build Coastguard Worker                                     const CopyImageToBufferParameters &params);
316*8975f5c5SAndroid Build Coastguard Worker 
317*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyRgbToRgba(ContextVk *contextVk,
318*8975f5c5SAndroid Build Coastguard Worker                                 const angle::Format &srcFormat,
319*8975f5c5SAndroid Build Coastguard Worker                                 vk::BufferHelper *srcBuffer,
320*8975f5c5SAndroid Build Coastguard Worker                                 uint32_t srcOffset,
321*8975f5c5SAndroid Build Coastguard Worker                                 uint32_t pixelCount,
322*8975f5c5SAndroid Build Coastguard Worker                                 vk::BufferHelper *dstBuffer);
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker     angle::Result transCodeEtcToBc(ContextVk *contextVk,
325*8975f5c5SAndroid Build Coastguard Worker                                    vk::BufferHelper *srcBuffer,
326*8975f5c5SAndroid Build Coastguard Worker                                    vk::ImageHelper *dstImage,
327*8975f5c5SAndroid Build Coastguard Worker                                    const VkBufferImageCopy *copyRegion);
328*8975f5c5SAndroid Build Coastguard Worker 
329*8975f5c5SAndroid Build Coastguard Worker     using GenerateMipmapDestLevelViews =
330*8975f5c5SAndroid Build Coastguard Worker         std::array<const vk::ImageView *, kGenerateMipmapMaxLevels>;
331*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateMipmap(ContextVk *contextVk,
332*8975f5c5SAndroid Build Coastguard Worker                                  vk::ImageHelper *src,
333*8975f5c5SAndroid Build Coastguard Worker                                  const vk::ImageView *srcLevelZeroView,
334*8975f5c5SAndroid Build Coastguard Worker                                  vk::ImageHelper *dst,
335*8975f5c5SAndroid Build Coastguard Worker                                  const GenerateMipmapDestLevelViews &dstLevelViews,
336*8975f5c5SAndroid Build Coastguard Worker                                  const vk::Sampler &sampler,
337*8975f5c5SAndroid Build Coastguard Worker                                  const GenerateMipmapParameters &params);
338*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateMipmapWithDraw(ContextVk *contextVk,
339*8975f5c5SAndroid Build Coastguard Worker                                          vk::ImageHelper *image,
340*8975f5c5SAndroid Build Coastguard Worker                                          const angle::FormatID actualFormatID,
341*8975f5c5SAndroid Build Coastguard Worker                                          const bool isMipmapFiltered);
342*8975f5c5SAndroid Build Coastguard Worker 
343*8975f5c5SAndroid Build Coastguard Worker     angle::Result unresolve(ContextVk *contextVk,
344*8975f5c5SAndroid Build Coastguard Worker                             const FramebufferVk *framebuffer,
345*8975f5c5SAndroid Build Coastguard Worker                             const UnresolveParameters &params);
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker     // Overlay utilities.
348*8975f5c5SAndroid Build Coastguard Worker     angle::Result drawOverlay(ContextVk *contextVk,
349*8975f5c5SAndroid Build Coastguard Worker                               vk::BufferHelper *textWidgetsBuffer,
350*8975f5c5SAndroid Build Coastguard Worker                               vk::BufferHelper *graphWidgetsBuffer,
351*8975f5c5SAndroid Build Coastguard Worker                               vk::ImageHelper *font,
352*8975f5c5SAndroid Build Coastguard Worker                               const vk::ImageView *fontView,
353*8975f5c5SAndroid Build Coastguard Worker                               vk::ImageHelper *dst,
354*8975f5c5SAndroid Build Coastguard Worker                               const vk::ImageView *dstView,
355*8975f5c5SAndroid Build Coastguard Worker                               const OverlayDrawParameters &params);
356*8975f5c5SAndroid Build Coastguard Worker 
357*8975f5c5SAndroid Build Coastguard Worker     // Fragment shading rate utility
358*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateFragmentShadingRate(
359*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
360*8975f5c5SAndroid Build Coastguard Worker         vk::ImageHelper *shadingRateAttachmentImageHelper,
361*8975f5c5SAndroid Build Coastguard Worker         vk::ImageViewHelper *shadingRateAttachmentImageViewHelper,
362*8975f5c5SAndroid Build Coastguard Worker         const GenerateFragmentShadingRateParameters &shadingRateParameters);
363*8975f5c5SAndroid Build Coastguard Worker 
364*8975f5c5SAndroid Build Coastguard Worker   private:
365*8975f5c5SAndroid Build Coastguard Worker     ANGLE_ENABLE_STRUCT_PADDING_WARNINGS
366*8975f5c5SAndroid Build Coastguard Worker 
367*8975f5c5SAndroid Build Coastguard Worker     struct ConvertIndexShaderParams
368*8975f5c5SAndroid Build Coastguard Worker     {
369*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcOffset     = 0;
370*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstOffsetDiv4 = 0;
371*8975f5c5SAndroid Build Coastguard Worker         uint32_t maxIndex      = 0;
372*8975f5c5SAndroid Build Coastguard Worker         uint32_t _padding      = 0;
373*8975f5c5SAndroid Build Coastguard Worker     };
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker     struct ConvertIndexIndirectShaderParams
376*8975f5c5SAndroid Build Coastguard Worker     {
377*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcIndirectOffsetDiv4 = 0;
378*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcOffset             = 0;
379*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstOffsetDiv4         = 0;
380*8975f5c5SAndroid Build Coastguard Worker         uint32_t maxIndex              = 0;
381*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstIndirectOffsetDiv4 = 0;
382*8975f5c5SAndroid Build Coastguard Worker     };
383*8975f5c5SAndroid Build Coastguard Worker 
384*8975f5c5SAndroid Build Coastguard Worker     struct ConvertIndexIndirectLineLoopShaderParams
385*8975f5c5SAndroid Build Coastguard Worker     {
386*8975f5c5SAndroid Build Coastguard Worker         uint32_t cmdOffsetDiv4    = 0;
387*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstCmdOffsetDiv4 = 0;
388*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcOffset        = 0;
389*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstOffsetDiv4    = 0;
390*8975f5c5SAndroid Build Coastguard Worker         uint32_t isRestartEnabled = 0;
391*8975f5c5SAndroid Build Coastguard Worker     };
392*8975f5c5SAndroid Build Coastguard Worker 
393*8975f5c5SAndroid Build Coastguard Worker     struct ConvertIndirectLineLoopShaderParams
394*8975f5c5SAndroid Build Coastguard Worker     {
395*8975f5c5SAndroid Build Coastguard Worker         uint32_t cmdOffsetDiv4    = 0;
396*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstCmdOffsetDiv4 = 0;
397*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstOffsetDiv4    = 0;
398*8975f5c5SAndroid Build Coastguard Worker     };
399*8975f5c5SAndroid Build Coastguard Worker 
400*8975f5c5SAndroid Build Coastguard Worker     struct ConvertVertexShaderParams
401*8975f5c5SAndroid Build Coastguard Worker     {
402*8975f5c5SAndroid Build Coastguard Worker         ConvertVertexShaderParams();
403*8975f5c5SAndroid Build Coastguard Worker 
404*8975f5c5SAndroid Build Coastguard Worker         // Structure matching PushConstants in ConvertVertex.comp
405*8975f5c5SAndroid Build Coastguard Worker         uint32_t outputCount      = 0;
406*8975f5c5SAndroid Build Coastguard Worker         uint32_t componentCount   = 0;
407*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcOffset        = 0;
408*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstOffset        = 0;
409*8975f5c5SAndroid Build Coastguard Worker         uint32_t Ns               = 0;
410*8975f5c5SAndroid Build Coastguard Worker         uint32_t Bs               = 0;
411*8975f5c5SAndroid Build Coastguard Worker         uint32_t Ss               = 0;
412*8975f5c5SAndroid Build Coastguard Worker         uint32_t Es               = 0;
413*8975f5c5SAndroid Build Coastguard Worker         uint32_t Nd               = 0;
414*8975f5c5SAndroid Build Coastguard Worker         uint32_t Bd               = 0;
415*8975f5c5SAndroid Build Coastguard Worker         uint32_t Sd               = 0;
416*8975f5c5SAndroid Build Coastguard Worker         uint32_t Ed               = 0;
417*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcEmulatedAlpha = 0;
418*8975f5c5SAndroid Build Coastguard Worker         uint32_t isSrcHDR         = 0;
419*8975f5c5SAndroid Build Coastguard Worker         uint32_t isSrcA2BGR10     = 0;
420*8975f5c5SAndroid Build Coastguard Worker         uint32_t _padding         = 0;
421*8975f5c5SAndroid Build Coastguard Worker     };
422*8975f5c5SAndroid Build Coastguard Worker 
423*8975f5c5SAndroid Build Coastguard Worker     struct ImageClearShaderParams
424*8975f5c5SAndroid Build Coastguard Worker     {
425*8975f5c5SAndroid Build Coastguard Worker         // Structure matching PushConstants in ImageClear.frag
426*8975f5c5SAndroid Build Coastguard Worker         VkClearColorValue clearValue = {};
427*8975f5c5SAndroid Build Coastguard Worker         float clearDepth             = 0.0f;
428*8975f5c5SAndroid Build Coastguard Worker     };
429*8975f5c5SAndroid Build Coastguard Worker 
430*8975f5c5SAndroid Build Coastguard Worker     struct ImageCopyShaderParams
431*8975f5c5SAndroid Build Coastguard Worker     {
432*8975f5c5SAndroid Build Coastguard Worker         ImageCopyShaderParams();
433*8975f5c5SAndroid Build Coastguard Worker 
434*8975f5c5SAndroid Build Coastguard Worker         // Structure matching PushConstants in ImageCopy.frag
435*8975f5c5SAndroid Build Coastguard Worker         int32_t srcOffset[2]            = {};
436*8975f5c5SAndroid Build Coastguard Worker         int32_t dstOffset[2]            = {};
437*8975f5c5SAndroid Build Coastguard Worker         int32_t srcMip                  = 0;
438*8975f5c5SAndroid Build Coastguard Worker         int32_t srcLayer                = 0;
439*8975f5c5SAndroid Build Coastguard Worker         int32_t srcSampleCount          = 0;
440*8975f5c5SAndroid Build Coastguard Worker         uint32_t flipX                  = 0;
441*8975f5c5SAndroid Build Coastguard Worker         uint32_t flipY                  = 0;
442*8975f5c5SAndroid Build Coastguard Worker         uint32_t premultiplyAlpha       = 0;
443*8975f5c5SAndroid Build Coastguard Worker         uint32_t unmultiplyAlpha        = 0;
444*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstHasLuminance        = 0;
445*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstIsAlpha             = 0;
446*8975f5c5SAndroid Build Coastguard Worker         uint32_t srcIsSRGB              = 0;
447*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstIsSRGB              = 0;
448*8975f5c5SAndroid Build Coastguard Worker         uint32_t dstDefaultChannelsMask = 0;
449*8975f5c5SAndroid Build Coastguard Worker         uint32_t rotateXY               = 0;
450*8975f5c5SAndroid Build Coastguard Worker     };
451*8975f5c5SAndroid Build Coastguard Worker 
452*8975f5c5SAndroid Build Coastguard Worker     struct CopyImageToBufferShaderParams
453*8975f5c5SAndroid Build Coastguard Worker     {
454*8975f5c5SAndroid Build Coastguard Worker         // Structure matching PushConstants in CopyImageToBuffer.comp
455*8975f5c5SAndroid Build Coastguard Worker         int32_t srcOffset[2]     = {};
456*8975f5c5SAndroid Build Coastguard Worker         int32_t srcDepth         = 0;
457*8975f5c5SAndroid Build Coastguard Worker         uint32_t reverseRowOrder = 0;
458*8975f5c5SAndroid Build Coastguard Worker         uint32_t size[2]         = {};
459*8975f5c5SAndroid Build Coastguard Worker         uint32_t outputOffset    = 0;
460*8975f5c5SAndroid Build Coastguard Worker         uint32_t outputPitch     = 0;
461*8975f5c5SAndroid Build Coastguard Worker         uint32_t isDstSnorm      = 0;
462*8975f5c5SAndroid Build Coastguard Worker     };
463*8975f5c5SAndroid Build Coastguard Worker 
464*8975f5c5SAndroid Build Coastguard Worker     union BlitResolveOffset
465*8975f5c5SAndroid Build Coastguard Worker     {
466*8975f5c5SAndroid Build Coastguard Worker         int32_t resolve[2];
467*8975f5c5SAndroid Build Coastguard Worker         float blit[2];
468*8975f5c5SAndroid Build Coastguard Worker     };
469*8975f5c5SAndroid Build Coastguard Worker 
470*8975f5c5SAndroid Build Coastguard Worker     struct BlitResolveShaderParams
471*8975f5c5SAndroid Build Coastguard Worker     {
472*8975f5c5SAndroid Build Coastguard Worker         // Structure matching PushConstants in BlitResolve.frag
473*8975f5c5SAndroid Build Coastguard Worker         BlitResolveOffset offset = {};
474*8975f5c5SAndroid Build Coastguard Worker         float stretch[2]         = {};
475*8975f5c5SAndroid Build Coastguard Worker         float invSrcExtent[2]    = {};
476*8975f5c5SAndroid Build Coastguard Worker         int32_t srcLayer         = 0;
477*8975f5c5SAndroid Build Coastguard Worker         int32_t samples          = 0;
478*8975f5c5SAndroid Build Coastguard Worker         float invSamples         = 0;
479*8975f5c5SAndroid Build Coastguard Worker         uint32_t outputMask      = 0;
480*8975f5c5SAndroid Build Coastguard Worker         uint32_t flipX           = 0;
481*8975f5c5SAndroid Build Coastguard Worker         uint32_t flipY           = 0;
482*8975f5c5SAndroid Build Coastguard Worker         uint32_t rotateXY        = 0;
483*8975f5c5SAndroid Build Coastguard Worker     };
484*8975f5c5SAndroid Build Coastguard Worker 
485*8975f5c5SAndroid Build Coastguard Worker     struct BlitResolveStencilNoExportShaderParams
486*8975f5c5SAndroid Build Coastguard Worker     {
487*8975f5c5SAndroid Build Coastguard Worker         // Structure matching PushConstants in BlitResolveStencilNoExport.comp
488*8975f5c5SAndroid Build Coastguard Worker         BlitResolveOffset offset = {};
489*8975f5c5SAndroid Build Coastguard Worker         float stretch[2]         = {};
490*8975f5c5SAndroid Build Coastguard Worker         float invSrcExtent[2]    = {};
491*8975f5c5SAndroid Build Coastguard Worker         int32_t srcLayer         = 0;
492*8975f5c5SAndroid Build Coastguard Worker         int32_t srcWidth         = 0;
493*8975f5c5SAndroid Build Coastguard Worker         int32_t blitArea[4]      = {};
494*8975f5c5SAndroid Build Coastguard Worker         int32_t dstPitch         = 0;
495*8975f5c5SAndroid Build Coastguard Worker         uint32_t flipX           = 0;
496*8975f5c5SAndroid Build Coastguard Worker         uint32_t flipY           = 0;
497*8975f5c5SAndroid Build Coastguard Worker         uint32_t rotateXY        = 0;
498*8975f5c5SAndroid Build Coastguard Worker     };
499*8975f5c5SAndroid Build Coastguard Worker 
500*8975f5c5SAndroid Build Coastguard Worker     struct ExportStencilShaderParams
501*8975f5c5SAndroid Build Coastguard Worker     {
502*8975f5c5SAndroid Build Coastguard Worker         uint32_t bit = 0;
503*8975f5c5SAndroid Build Coastguard Worker     };
504*8975f5c5SAndroid Build Coastguard Worker 
505*8975f5c5SAndroid Build Coastguard Worker     struct OverlayDrawShaderParams
506*8975f5c5SAndroid Build Coastguard Worker     {
507*8975f5c5SAndroid Build Coastguard Worker         // Structure matching PushConstants in OverlayDraw.vert and OverlayDraw.frag
508*8975f5c5SAndroid Build Coastguard Worker         uint32_t viewportSize[2] = {};
509*8975f5c5SAndroid Build Coastguard Worker         uint32_t isText          = 0;
510*8975f5c5SAndroid Build Coastguard Worker         uint32_t rotateXY        = 0;
511*8975f5c5SAndroid Build Coastguard Worker     };
512*8975f5c5SAndroid Build Coastguard Worker 
513*8975f5c5SAndroid Build Coastguard Worker     struct GenerateMipmapShaderParams
514*8975f5c5SAndroid Build Coastguard Worker     {
515*8975f5c5SAndroid Build Coastguard Worker         // Structure matching PushConstants in GenerateMipmap.comp
516*8975f5c5SAndroid Build Coastguard Worker         float invSrcExtent[2] = {};
517*8975f5c5SAndroid Build Coastguard Worker         uint32_t levelCount   = 0;
518*8975f5c5SAndroid Build Coastguard Worker     };
519*8975f5c5SAndroid Build Coastguard Worker 
520*8975f5c5SAndroid Build Coastguard Worker     struct EtcToBcShaderParams
521*8975f5c5SAndroid Build Coastguard Worker     {
522*8975f5c5SAndroid Build Coastguard Worker         uint32_t offsetX;
523*8975f5c5SAndroid Build Coastguard Worker         uint32_t offsetY;
524*8975f5c5SAndroid Build Coastguard Worker         int32_t texelOffset;
525*8975f5c5SAndroid Build Coastguard Worker         uint32_t width;
526*8975f5c5SAndroid Build Coastguard Worker         uint32_t height;
527*8975f5c5SAndroid Build Coastguard Worker         uint32_t alphaBits;
528*8975f5c5SAndroid Build Coastguard Worker         uint32_t isSigned;
529*8975f5c5SAndroid Build Coastguard Worker         uint32_t isEacRg;
530*8975f5c5SAndroid Build Coastguard Worker     };
531*8975f5c5SAndroid Build Coastguard Worker 
532*8975f5c5SAndroid Build Coastguard Worker     ANGLE_DISABLE_STRUCT_PADDING_WARNINGS
533*8975f5c5SAndroid Build Coastguard Worker 
534*8975f5c5SAndroid Build Coastguard Worker     // Functions implemented by the class:
535*8975f5c5SAndroid Build Coastguard Worker     enum class Function
536*8975f5c5SAndroid Build Coastguard Worker     {
537*8975f5c5SAndroid Build Coastguard Worker         // Functions implemented in graphics
538*8975f5c5SAndroid Build Coastguard Worker         ImageClear,
539*8975f5c5SAndroid Build Coastguard Worker         ImageCopy,
540*8975f5c5SAndroid Build Coastguard Worker         BlitResolve,
541*8975f5c5SAndroid Build Coastguard Worker         Blit3DSrc,
542*8975f5c5SAndroid Build Coastguard Worker         ExportStencil,
543*8975f5c5SAndroid Build Coastguard Worker         OverlayDraw,
544*8975f5c5SAndroid Build Coastguard Worker         // Note: unresolve is special as it has a different layout per attachment count.  Depth and
545*8975f5c5SAndroid Build Coastguard Worker         // stencil each require a binding, so are counted separately.
546*8975f5c5SAndroid Build Coastguard Worker         Unresolve1Attachment,
547*8975f5c5SAndroid Build Coastguard Worker         Unresolve2Attachments,
548*8975f5c5SAndroid Build Coastguard Worker         Unresolve3Attachments,
549*8975f5c5SAndroid Build Coastguard Worker         Unresolve4Attachments,
550*8975f5c5SAndroid Build Coastguard Worker         Unresolve5Attachments,
551*8975f5c5SAndroid Build Coastguard Worker         Unresolve6Attachments,
552*8975f5c5SAndroid Build Coastguard Worker         Unresolve7Attachments,
553*8975f5c5SAndroid Build Coastguard Worker         Unresolve8Attachments,
554*8975f5c5SAndroid Build Coastguard Worker         Unresolve9Attachments,
555*8975f5c5SAndroid Build Coastguard Worker         Unresolve10Attachments,
556*8975f5c5SAndroid Build Coastguard Worker 
557*8975f5c5SAndroid Build Coastguard Worker         // Functions implemented in compute
558*8975f5c5SAndroid Build Coastguard Worker         ComputeStartIndex,  // Special value to separate draw and dispatch functions.
559*8975f5c5SAndroid Build Coastguard Worker         ConvertIndexBuffer = ComputeStartIndex,
560*8975f5c5SAndroid Build Coastguard Worker         ConvertVertexBuffer,
561*8975f5c5SAndroid Build Coastguard Worker         ClearTexture,
562*8975f5c5SAndroid Build Coastguard Worker         BlitResolveStencilNoExport,
563*8975f5c5SAndroid Build Coastguard Worker         ConvertIndexIndirectBuffer,
564*8975f5c5SAndroid Build Coastguard Worker         ConvertIndexIndirectLineLoopBuffer,
565*8975f5c5SAndroid Build Coastguard Worker         ConvertIndirectLineLoopBuffer,
566*8975f5c5SAndroid Build Coastguard Worker         GenerateMipmap,
567*8975f5c5SAndroid Build Coastguard Worker         TransCodeEtcToBc,
568*8975f5c5SAndroid Build Coastguard Worker         CopyImageToBuffer,
569*8975f5c5SAndroid Build Coastguard Worker         GenerateFragmentShadingRate,
570*8975f5c5SAndroid Build Coastguard Worker 
571*8975f5c5SAndroid Build Coastguard Worker         InvalidEnum,
572*8975f5c5SAndroid Build Coastguard Worker         EnumCount = InvalidEnum,
573*8975f5c5SAndroid Build Coastguard Worker     };
574*8975f5c5SAndroid Build Coastguard Worker 
575*8975f5c5SAndroid Build Coastguard Worker     struct GraphicsShaderProgramAndPipelines
576*8975f5c5SAndroid Build Coastguard Worker     {
577*8975f5c5SAndroid Build Coastguard Worker         vk::ShaderProgramHelper program;
578*8975f5c5SAndroid Build Coastguard Worker         CompleteGraphicsPipelineCache pipelines;
579*8975f5c5SAndroid Build Coastguard Worker     };
580*8975f5c5SAndroid Build Coastguard Worker     struct ComputeShaderProgramAndPipelines
581*8975f5c5SAndroid Build Coastguard Worker     {
582*8975f5c5SAndroid Build Coastguard Worker         vk::ShaderProgramHelper program;
583*8975f5c5SAndroid Build Coastguard Worker         vk::ComputePipelineCache pipelines;
584*8975f5c5SAndroid Build Coastguard Worker     };
585*8975f5c5SAndroid Build Coastguard Worker 
586*8975f5c5SAndroid Build Coastguard Worker     // Common functions that create the pipeline for the specified function, binds it and prepares
587*8975f5c5SAndroid Build Coastguard Worker     // the draw/dispatch call.
588*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupComputeProgram(
589*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
590*8975f5c5SAndroid Build Coastguard Worker         Function function,
591*8975f5c5SAndroid Build Coastguard Worker         const vk::ShaderModulePtr &csShader,
592*8975f5c5SAndroid Build Coastguard Worker         ComputeShaderProgramAndPipelines *programAndPipelines,
593*8975f5c5SAndroid Build Coastguard Worker         const VkDescriptorSet descriptorSet,
594*8975f5c5SAndroid Build Coastguard Worker         const void *pushConstants,
595*8975f5c5SAndroid Build Coastguard Worker         size_t pushConstantsSize,
596*8975f5c5SAndroid Build Coastguard Worker         vk::OutsideRenderPassCommandBufferHelper *commandBufferHelper);
597*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupGraphicsProgramWithLayout(
598*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
599*8975f5c5SAndroid Build Coastguard Worker         const vk::PipelineLayout &pipelineLayout,
600*8975f5c5SAndroid Build Coastguard Worker         const vk::ShaderModulePtr &vsShader,
601*8975f5c5SAndroid Build Coastguard Worker         const vk::ShaderModulePtr &fsShader,
602*8975f5c5SAndroid Build Coastguard Worker         GraphicsShaderProgramAndPipelines *programAndPipelines,
603*8975f5c5SAndroid Build Coastguard Worker         const vk::GraphicsPipelineDesc *pipelineDesc,
604*8975f5c5SAndroid Build Coastguard Worker         const VkDescriptorSet descriptorSet,
605*8975f5c5SAndroid Build Coastguard Worker         const void *pushConstants,
606*8975f5c5SAndroid Build Coastguard Worker         size_t pushConstantsSize,
607*8975f5c5SAndroid Build Coastguard Worker         vk::RenderPassCommandBuffer *commandBuffer);
608*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupGraphicsProgram(ContextVk *contextVk,
609*8975f5c5SAndroid Build Coastguard Worker                                        Function function,
610*8975f5c5SAndroid Build Coastguard Worker                                        const vk::ShaderModulePtr &vsShader,
611*8975f5c5SAndroid Build Coastguard Worker                                        const vk::ShaderModulePtr &fsShader,
612*8975f5c5SAndroid Build Coastguard Worker                                        GraphicsShaderProgramAndPipelines *programAndPipelines,
613*8975f5c5SAndroid Build Coastguard Worker                                        const vk::GraphicsPipelineDesc *pipelineDesc,
614*8975f5c5SAndroid Build Coastguard Worker                                        const VkDescriptorSet descriptorSet,
615*8975f5c5SAndroid Build Coastguard Worker                                        const void *pushConstants,
616*8975f5c5SAndroid Build Coastguard Worker                                        size_t pushConstantsSize,
617*8975f5c5SAndroid Build Coastguard Worker                                        vk::RenderPassCommandBuffer *commandBuffer);
618*8975f5c5SAndroid Build Coastguard Worker 
619*8975f5c5SAndroid Build Coastguard Worker     // Initializes descriptor set layout, pipeline layout and descriptor pool corresponding to given
620*8975f5c5SAndroid Build Coastguard Worker     // function, if not already initialized.  Uses setSizes to create the layout.  For example, if
621*8975f5c5SAndroid Build Coastguard Worker     // this array has two entries {STORAGE_TEXEL_BUFFER, 1} and {UNIFORM_TEXEL_BUFFER, 3}, then the
622*8975f5c5SAndroid Build Coastguard Worker     // created set layout would be binding 0 for storage texel buffer and bindings 1 through 3 for
623*8975f5c5SAndroid Build Coastguard Worker     // uniform texel buffer.  All resources are put in set 0.
624*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureResourcesInitialized(ContextVk *contextVk,
625*8975f5c5SAndroid Build Coastguard Worker                                              Function function,
626*8975f5c5SAndroid Build Coastguard Worker                                              VkDescriptorPoolSize *setSizes,
627*8975f5c5SAndroid Build Coastguard Worker                                              size_t setSizesCount,
628*8975f5c5SAndroid Build Coastguard Worker                                              size_t pushConstantsSize);
629*8975f5c5SAndroid Build Coastguard Worker 
630*8975f5c5SAndroid Build Coastguard Worker     // Initializers corresponding to functions, calling into ensureResourcesInitialized with the
631*8975f5c5SAndroid Build Coastguard Worker     // appropriate parameters.
632*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureConvertIndexResourcesInitialized(ContextVk *contextVk);
633*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureConvertIndexIndirectResourcesInitialized(ContextVk *contextVk);
634*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureConvertIndexIndirectLineLoopResourcesInitialized(ContextVk *contextVk);
635*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureConvertIndirectLineLoopResourcesInitialized(ContextVk *contextVk);
636*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureConvertVertexResourcesInitialized(ContextVk *contextVk);
637*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureImageClearResourcesInitialized(ContextVk *contextVk);
638*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureImageCopyResourcesInitialized(ContextVk *contextVk);
639*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureCopyImageToBufferResourcesInitialized(ContextVk *contextVk);
640*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureBlitResolveResourcesInitialized(ContextVk *contextVk);
641*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureBlitResolveStencilNoExportResourcesInitialized(ContextVk *contextVk);
642*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureExportStencilResourcesInitialized(ContextVk *contextVk);
643*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureOverlayDrawResourcesInitialized(ContextVk *contextVk);
644*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureGenerateMipmapResourcesInitialized(ContextVk *contextVk);
645*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureTransCodeEtcToBcResourcesInitialized(ContextVk *contextVk);
646*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureUnresolveResourcesInitialized(ContextVk *contextVk,
647*8975f5c5SAndroid Build Coastguard Worker                                                       Function function,
648*8975f5c5SAndroid Build Coastguard Worker                                                       uint32_t attachmentIndex);
649*8975f5c5SAndroid Build Coastguard Worker 
650*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureImageCopyResourcesInitializedWithSampler(
651*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
652*8975f5c5SAndroid Build Coastguard Worker         const vk::SamplerDesc &samplerDesc);
653*8975f5c5SAndroid Build Coastguard Worker 
654*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureSamplersInitialized(ContextVk *context);
655*8975f5c5SAndroid Build Coastguard Worker 
656*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureGenerateFragmentShadingRateResourcesInitialized(ContextVk *contextVk);
657*8975f5c5SAndroid Build Coastguard Worker 
658*8975f5c5SAndroid Build Coastguard Worker     angle::Result startRenderPass(ContextVk *contextVk,
659*8975f5c5SAndroid Build Coastguard Worker                                   vk::ImageHelper *image,
660*8975f5c5SAndroid Build Coastguard Worker                                   const vk::ImageView *imageView,
661*8975f5c5SAndroid Build Coastguard Worker                                   const vk::RenderPassDesc &renderPassDesc,
662*8975f5c5SAndroid Build Coastguard Worker                                   const gl::Rectangle &renderArea,
663*8975f5c5SAndroid Build Coastguard Worker                                   const VkImageAspectFlags aspectFlags,
664*8975f5c5SAndroid Build Coastguard Worker                                   const VkClearValue *clearValue,
665*8975f5c5SAndroid Build Coastguard Worker                                   vk::RenderPassSource renderPassSource,
666*8975f5c5SAndroid Build Coastguard Worker                                   vk::RenderPassCommandBuffer **commandBufferOut);
667*8975f5c5SAndroid Build Coastguard Worker 
668*8975f5c5SAndroid Build Coastguard Worker     // Set up descriptor set and call dispatch.
669*8975f5c5SAndroid Build Coastguard Worker     angle::Result convertVertexBufferImpl(
670*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
671*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *dst,
672*8975f5c5SAndroid Build Coastguard Worker         vk::BufferHelper *src,
673*8975f5c5SAndroid Build Coastguard Worker         uint32_t flags,
674*8975f5c5SAndroid Build Coastguard Worker         vk::OutsideRenderPassCommandBufferHelper *commandBufferHelper,
675*8975f5c5SAndroid Build Coastguard Worker         const ConvertVertexShaderParams &shaderParams,
676*8975f5c5SAndroid Build Coastguard Worker         const OffsetAndVertexCounts &additionalOffsetVertexCounts);
677*8975f5c5SAndroid Build Coastguard Worker 
678*8975f5c5SAndroid Build Coastguard Worker     // Blits or resolves either color or depth/stencil, based on which view is given.
679*8975f5c5SAndroid Build Coastguard Worker     angle::Result blitResolveImpl(ContextVk *contextVk,
680*8975f5c5SAndroid Build Coastguard Worker                                   FramebufferVk *framebuffer,
681*8975f5c5SAndroid Build Coastguard Worker                                   vk::ImageHelper *src,
682*8975f5c5SAndroid Build Coastguard Worker                                   const vk::ImageView *srcColorView,
683*8975f5c5SAndroid Build Coastguard Worker                                   const vk::ImageView *srcDepthView,
684*8975f5c5SAndroid Build Coastguard Worker                                   const vk::ImageView *srcStencilView,
685*8975f5c5SAndroid Build Coastguard Worker                                   const BlitResolveParameters &params);
686*8975f5c5SAndroid Build Coastguard Worker 
687*8975f5c5SAndroid Build Coastguard Worker     // Allocates a single descriptor set.
688*8975f5c5SAndroid Build Coastguard Worker     angle::Result allocateDescriptorSetWithLayout(
689*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
690*8975f5c5SAndroid Build Coastguard Worker         vk::CommandBufferHelperCommon *commandBufferHelper,
691*8975f5c5SAndroid Build Coastguard Worker         vk::DynamicDescriptorPool &descriptorPool,
692*8975f5c5SAndroid Build Coastguard Worker         const vk::DescriptorSetLayout &descriptorSetLayout,
693*8975f5c5SAndroid Build Coastguard Worker         VkDescriptorSet *descriptorSetOut);
694*8975f5c5SAndroid Build Coastguard Worker 
695*8975f5c5SAndroid Build Coastguard Worker     angle::Result allocateDescriptorSet(ContextVk *contextVk,
696*8975f5c5SAndroid Build Coastguard Worker                                         vk::CommandBufferHelperCommon *commandBufferHelper,
697*8975f5c5SAndroid Build Coastguard Worker                                         Function function,
698*8975f5c5SAndroid Build Coastguard Worker                                         VkDescriptorSet *descriptorSetOut);
699*8975f5c5SAndroid Build Coastguard Worker 
700*8975f5c5SAndroid Build Coastguard Worker     angle::Result allocateDescriptorSetForImageCopyWithSampler(
701*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
702*8975f5c5SAndroid Build Coastguard Worker         vk::CommandBufferHelperCommon *commandBufferHelper,
703*8975f5c5SAndroid Build Coastguard Worker         const vk::SamplerDesc &samplerDesc,
704*8975f5c5SAndroid Build Coastguard Worker         VkDescriptorSet *descriptorSetOut);
705*8975f5c5SAndroid Build Coastguard Worker 
706*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<Function, vk::DescriptorSetLayoutPointerArray> mDescriptorSetLayouts;
707*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<Function, vk::PipelineLayoutPtr> mPipelineLayouts;
708*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<Function, vk::DynamicDescriptorPool> mDescriptorPools;
709*8975f5c5SAndroid Build Coastguard Worker 
710*8975f5c5SAndroid Build Coastguard Worker     std::unordered_map<vk::SamplerDesc, vk::DescriptorSetLayoutPointerArray>
711*8975f5c5SAndroid Build Coastguard Worker         mImageCopyWithSamplerDescriptorSetLayouts;
712*8975f5c5SAndroid Build Coastguard Worker     std::unordered_map<vk::SamplerDesc, vk::PipelineLayoutPtr> mImageCopyWithSamplerPipelineLayouts;
713*8975f5c5SAndroid Build Coastguard Worker     std::unordered_map<vk::SamplerDesc, vk::DynamicDescriptorPool>
714*8975f5c5SAndroid Build Coastguard Worker         mImageCopyWithSamplerDescriptorPools;
715*8975f5c5SAndroid Build Coastguard Worker 
716*8975f5c5SAndroid Build Coastguard Worker     ComputeShaderProgramAndPipelines
717*8975f5c5SAndroid Build Coastguard Worker         mConvertIndex[vk::InternalShader::ConvertIndex_comp::kArrayLen];
718*8975f5c5SAndroid Build Coastguard Worker     ComputeShaderProgramAndPipelines mConvertIndexIndirectLineLoop
719*8975f5c5SAndroid Build Coastguard Worker         [vk::InternalShader::ConvertIndexIndirectLineLoop_comp::kArrayLen];
720*8975f5c5SAndroid Build Coastguard Worker     ComputeShaderProgramAndPipelines
721*8975f5c5SAndroid Build Coastguard Worker         mConvertIndirectLineLoop[vk::InternalShader::ConvertIndirectLineLoop_comp::kArrayLen];
722*8975f5c5SAndroid Build Coastguard Worker     ComputeShaderProgramAndPipelines
723*8975f5c5SAndroid Build Coastguard Worker         mConvertVertex[vk::InternalShader::ConvertVertex_comp::kArrayLen];
724*8975f5c5SAndroid Build Coastguard Worker     GraphicsShaderProgramAndPipelines mImageClearVSOnly;
725*8975f5c5SAndroid Build Coastguard Worker     GraphicsShaderProgramAndPipelines mImageClear[vk::InternalShader::ImageClear_frag::kArrayLen];
726*8975f5c5SAndroid Build Coastguard Worker     GraphicsShaderProgramAndPipelines mImageCopy[vk::InternalShader::ImageCopy_frag::kArrayLen];
727*8975f5c5SAndroid Build Coastguard Worker     GraphicsShaderProgramAndPipelines mImageCopyFloat;
728*8975f5c5SAndroid Build Coastguard Worker     std::unordered_map<vk::SamplerDesc, GraphicsShaderProgramAndPipelines> mImageCopyWithSampler;
729*8975f5c5SAndroid Build Coastguard Worker     ComputeShaderProgramAndPipelines
730*8975f5c5SAndroid Build Coastguard Worker         mCopyImageToBuffer[vk::InternalShader::CopyImageToBuffer_comp::kArrayLen];
731*8975f5c5SAndroid Build Coastguard Worker     GraphicsShaderProgramAndPipelines mBlitResolve[vk::InternalShader::BlitResolve_frag::kArrayLen];
732*8975f5c5SAndroid Build Coastguard Worker     GraphicsShaderProgramAndPipelines mBlit3DSrc[vk::InternalShader::Blit3DSrc_frag::kArrayLen];
733*8975f5c5SAndroid Build Coastguard Worker     ComputeShaderProgramAndPipelines
734*8975f5c5SAndroid Build Coastguard Worker         mBlitResolveStencilNoExport[vk::InternalShader::BlitResolveStencilNoExport_comp::kArrayLen];
735*8975f5c5SAndroid Build Coastguard Worker     GraphicsShaderProgramAndPipelines mExportStencil;
736*8975f5c5SAndroid Build Coastguard Worker     GraphicsShaderProgramAndPipelines mOverlayDraw;
737*8975f5c5SAndroid Build Coastguard Worker     ComputeShaderProgramAndPipelines
738*8975f5c5SAndroid Build Coastguard Worker         mGenerateMipmap[vk::InternalShader::GenerateMipmap_comp::kArrayLen];
739*8975f5c5SAndroid Build Coastguard Worker     ComputeShaderProgramAndPipelines mEtcToBc[vk::InternalShader::EtcToBc_comp::kArrayLen];
740*8975f5c5SAndroid Build Coastguard Worker 
741*8975f5c5SAndroid Build Coastguard Worker     // Unresolve shaders are special as they are generated on the fly due to the large number of
742*8975f5c5SAndroid Build Coastguard Worker     // combinations.
743*8975f5c5SAndroid Build Coastguard Worker     std::unordered_map<uint32_t, vk::ShaderModulePtr> mUnresolveFragShaders;
744*8975f5c5SAndroid Build Coastguard Worker     std::unordered_map<uint32_t, GraphicsShaderProgramAndPipelines> mUnresolve;
745*8975f5c5SAndroid Build Coastguard Worker 
746*8975f5c5SAndroid Build Coastguard Worker     ComputeShaderProgramAndPipelines mGenerateFragmentShadingRateAttachment;
747*8975f5c5SAndroid Build Coastguard Worker 
748*8975f5c5SAndroid Build Coastguard Worker     vk::Sampler mPointSampler;
749*8975f5c5SAndroid Build Coastguard Worker     vk::Sampler mLinearSampler;
750*8975f5c5SAndroid Build Coastguard Worker };
751*8975f5c5SAndroid Build Coastguard Worker 
752*8975f5c5SAndroid Build Coastguard Worker // This class' responsibility is to create index buffers needed to support line loops in Vulkan.
753*8975f5c5SAndroid Build Coastguard Worker // In the setup phase of drawing, the createIndexBuffer method should be called with the
754*8975f5c5SAndroid Build Coastguard Worker // current draw call parameters. If an element array buffer is bound for an indexed draw, use
755*8975f5c5SAndroid Build Coastguard Worker // createIndexBufferFromElementArrayBuffer.
756*8975f5c5SAndroid Build Coastguard Worker //
757*8975f5c5SAndroid Build Coastguard Worker // If the user wants to draw a loop between [v1, v2, v3], we will create an indexed buffer with
758*8975f5c5SAndroid Build Coastguard Worker // these indexes: [0, 1, 2, 3, 0] to emulate the loop.
759*8975f5c5SAndroid Build Coastguard Worker class LineLoopHelper final : angle::NonCopyable
760*8975f5c5SAndroid Build Coastguard Worker {
761*8975f5c5SAndroid Build Coastguard Worker   public:
762*8975f5c5SAndroid Build Coastguard Worker     LineLoopHelper(vk::Renderer *renderer);
763*8975f5c5SAndroid Build Coastguard Worker     ~LineLoopHelper();
764*8975f5c5SAndroid Build Coastguard Worker 
765*8975f5c5SAndroid Build Coastguard Worker     angle::Result getIndexBufferForDrawArrays(ContextVk *contextVk,
766*8975f5c5SAndroid Build Coastguard Worker                                               uint32_t clampedVertexCount,
767*8975f5c5SAndroid Build Coastguard Worker                                               GLint firstVertex,
768*8975f5c5SAndroid Build Coastguard Worker                                               vk::BufferHelper **bufferOut);
769*8975f5c5SAndroid Build Coastguard Worker 
770*8975f5c5SAndroid Build Coastguard Worker     angle::Result getIndexBufferForElementArrayBuffer(ContextVk *contextVk,
771*8975f5c5SAndroid Build Coastguard Worker                                                       BufferVk *elementArrayBufferVk,
772*8975f5c5SAndroid Build Coastguard Worker                                                       gl::DrawElementsType glIndexType,
773*8975f5c5SAndroid Build Coastguard Worker                                                       int indexCount,
774*8975f5c5SAndroid Build Coastguard Worker                                                       intptr_t elementArrayOffset,
775*8975f5c5SAndroid Build Coastguard Worker                                                       vk::BufferHelper **bufferOut,
776*8975f5c5SAndroid Build Coastguard Worker                                                       uint32_t *indexCountOut);
777*8975f5c5SAndroid Build Coastguard Worker 
778*8975f5c5SAndroid Build Coastguard Worker     angle::Result streamIndices(ContextVk *contextVk,
779*8975f5c5SAndroid Build Coastguard Worker                                 gl::DrawElementsType glIndexType,
780*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei indexCount,
781*8975f5c5SAndroid Build Coastguard Worker                                 const uint8_t *srcPtr,
782*8975f5c5SAndroid Build Coastguard Worker                                 vk::BufferHelper **bufferOut,
783*8975f5c5SAndroid Build Coastguard Worker                                 uint32_t *indexCountOut);
784*8975f5c5SAndroid Build Coastguard Worker 
785*8975f5c5SAndroid Build Coastguard Worker     angle::Result streamIndicesIndirect(ContextVk *contextVk,
786*8975f5c5SAndroid Build Coastguard Worker                                         gl::DrawElementsType glIndexType,
787*8975f5c5SAndroid Build Coastguard Worker                                         vk::BufferHelper *indexBuffer,
788*8975f5c5SAndroid Build Coastguard Worker                                         vk::BufferHelper *indirectBuffer,
789*8975f5c5SAndroid Build Coastguard Worker                                         VkDeviceSize indirectBufferOffset,
790*8975f5c5SAndroid Build Coastguard Worker                                         vk::BufferHelper **indexBufferOut,
791*8975f5c5SAndroid Build Coastguard Worker                                         vk::BufferHelper **indirectBufferOut);
792*8975f5c5SAndroid Build Coastguard Worker 
793*8975f5c5SAndroid Build Coastguard Worker     angle::Result streamArrayIndirect(ContextVk *contextVk,
794*8975f5c5SAndroid Build Coastguard Worker                                       size_t vertexCount,
795*8975f5c5SAndroid Build Coastguard Worker                                       vk::BufferHelper *arrayIndirectBuffer,
796*8975f5c5SAndroid Build Coastguard Worker                                       VkDeviceSize arrayIndirectBufferOffset,
797*8975f5c5SAndroid Build Coastguard Worker                                       vk::BufferHelper **indexBufferOut,
798*8975f5c5SAndroid Build Coastguard Worker                                       vk::BufferHelper **indexIndirectBufferOut);
799*8975f5c5SAndroid Build Coastguard Worker 
800*8975f5c5SAndroid Build Coastguard Worker     void release(ContextVk *contextVk);
801*8975f5c5SAndroid Build Coastguard Worker     void destroy(vk::Renderer *renderer);
802*8975f5c5SAndroid Build Coastguard Worker 
getCurrentIndexBuffer()803*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper *getCurrentIndexBuffer() { return mDynamicIndexBuffer.getBuffer(); }
804*8975f5c5SAndroid Build Coastguard Worker 
Draw(uint32_t count,uint32_t baseVertex,vk::RenderPassCommandBuffer * commandBuffer)805*8975f5c5SAndroid Build Coastguard Worker     static void Draw(uint32_t count,
806*8975f5c5SAndroid Build Coastguard Worker                      uint32_t baseVertex,
807*8975f5c5SAndroid Build Coastguard Worker                      vk::RenderPassCommandBuffer *commandBuffer)
808*8975f5c5SAndroid Build Coastguard Worker     {
809*8975f5c5SAndroid Build Coastguard Worker         // Our first index is always 0 because that's how we set it up in createIndexBuffer*.
810*8975f5c5SAndroid Build Coastguard Worker         commandBuffer->drawIndexedBaseVertex(count, baseVertex);
811*8975f5c5SAndroid Build Coastguard Worker     }
812*8975f5c5SAndroid Build Coastguard Worker 
813*8975f5c5SAndroid Build Coastguard Worker   private:
814*8975f5c5SAndroid Build Coastguard Worker     ConversionBuffer mDynamicIndexBuffer;
815*8975f5c5SAndroid Build Coastguard Worker     ConversionBuffer mDynamicIndirectBuffer;
816*8975f5c5SAndroid Build Coastguard Worker };
817*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
818*8975f5c5SAndroid Build Coastguard Worker 
819*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_UTILSVK_H_
820