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 // FramebufferVk.h: 7*8975f5c5SAndroid Build Coastguard Worker // Defines the class interface for FramebufferVk, implementing FramebufferImpl. 8*8975f5c5SAndroid Build Coastguard Worker // 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/FramebufferImpl.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/RenderTargetCache.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/BufferVk.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/SurfaceVk.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/UtilsVk.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_cache_utils.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h" 21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_resource.h" 22*8975f5c5SAndroid Build Coastguard Worker 23*8975f5c5SAndroid Build Coastguard Worker namespace rx 24*8975f5c5SAndroid Build Coastguard Worker { 25*8975f5c5SAndroid Build Coastguard Worker class RenderTargetVk; 26*8975f5c5SAndroid Build Coastguard Worker class WindowSurfaceVk; 27*8975f5c5SAndroid Build Coastguard Worker 28*8975f5c5SAndroid Build Coastguard Worker class FramebufferVk : public FramebufferImpl 29*8975f5c5SAndroid Build Coastguard Worker { 30*8975f5c5SAndroid Build Coastguard Worker public: 31*8975f5c5SAndroid Build Coastguard Worker FramebufferVk(vk::Renderer *renderer, const gl::FramebufferState &state); 32*8975f5c5SAndroid Build Coastguard Worker ~FramebufferVk() override; 33*8975f5c5SAndroid Build Coastguard Worker void destroy(const gl::Context *context) override; 34*8975f5c5SAndroid Build Coastguard Worker 35*8975f5c5SAndroid Build Coastguard Worker angle::Result discard(const gl::Context *context, 36*8975f5c5SAndroid Build Coastguard Worker size_t count, 37*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments) override; 38*8975f5c5SAndroid Build Coastguard Worker angle::Result invalidate(const gl::Context *context, 39*8975f5c5SAndroid Build Coastguard Worker size_t count, 40*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments) override; 41*8975f5c5SAndroid Build Coastguard Worker angle::Result invalidateSub(const gl::Context *context, 42*8975f5c5SAndroid Build Coastguard Worker size_t count, 43*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments, 44*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &area) override; 45*8975f5c5SAndroid Build Coastguard Worker 46*8975f5c5SAndroid Build Coastguard Worker angle::Result clear(const gl::Context *context, GLbitfield mask) override; 47*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferfv(const gl::Context *context, 48*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 49*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 50*8975f5c5SAndroid Build Coastguard Worker const GLfloat *values) override; 51*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferuiv(const gl::Context *context, 52*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 53*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 54*8975f5c5SAndroid Build Coastguard Worker const GLuint *values) override; 55*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferiv(const gl::Context *context, 56*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 57*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 58*8975f5c5SAndroid Build Coastguard Worker const GLint *values) override; 59*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferfi(const gl::Context *context, 60*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 61*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 62*8975f5c5SAndroid Build Coastguard Worker GLfloat depth, 63*8975f5c5SAndroid Build Coastguard Worker GLint stencil) override; 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Worker const gl::InternalFormat &getImplementationColorReadFormat( 66*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context) const override; 67*8975f5c5SAndroid Build Coastguard Worker angle::Result readPixels(const gl::Context *context, 68*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &area, 69*8975f5c5SAndroid Build Coastguard Worker GLenum format, 70*8975f5c5SAndroid Build Coastguard Worker GLenum type, 71*8975f5c5SAndroid Build Coastguard Worker const gl::PixelPackState &pack, 72*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *packBuffer, 73*8975f5c5SAndroid Build Coastguard Worker void *pixels) override; 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker angle::Result blit(const gl::Context *context, 76*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 77*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &destArea, 78*8975f5c5SAndroid Build Coastguard Worker GLbitfield mask, 79*8975f5c5SAndroid Build Coastguard Worker GLenum filter) override; 80*8975f5c5SAndroid Build Coastguard Worker 81*8975f5c5SAndroid Build Coastguard Worker gl::FramebufferStatus checkStatus(const gl::Context *context) const override; 82*8975f5c5SAndroid Build Coastguard Worker 83*8975f5c5SAndroid Build Coastguard Worker angle::Result syncState(const gl::Context *context, 84*8975f5c5SAndroid Build Coastguard Worker GLenum binding, 85*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer::DirtyBits &dirtyBits, 86*8975f5c5SAndroid Build Coastguard Worker gl::Command command) override; 87*8975f5c5SAndroid Build Coastguard Worker 88*8975f5c5SAndroid Build Coastguard Worker angle::Result getSamplePosition(const gl::Context *context, 89*8975f5c5SAndroid Build Coastguard Worker size_t index, 90*8975f5c5SAndroid Build Coastguard Worker GLfloat *xy) const override; 91*8975f5c5SAndroid Build Coastguard Worker RenderTargetVk *getDepthStencilRenderTarget() const; 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker // Internal helper function for readPixels operations. 94*8975f5c5SAndroid Build Coastguard Worker angle::Result readPixelsImpl(ContextVk *contextVk, 95*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &area, 96*8975f5c5SAndroid Build Coastguard Worker const PackPixelsParams &packPixelsParams, 97*8975f5c5SAndroid Build Coastguard Worker VkImageAspectFlagBits copyAspectFlags, 98*8975f5c5SAndroid Build Coastguard Worker RenderTargetVk *renderTarget, 99*8975f5c5SAndroid Build Coastguard Worker void *pixels); 100*8975f5c5SAndroid Build Coastguard Worker 101*8975f5c5SAndroid Build Coastguard Worker gl::Extents getReadImageExtents() const; 102*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle getNonRotatedCompleteRenderArea() const; 103*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle getRotatedCompleteRenderArea(ContextVk *contextVk) const; 104*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle getRotatedScissoredRenderArea(ContextVk *contextVk) const; 105*8975f5c5SAndroid Build Coastguard Worker // Returns render area with deferred clears in consideration. When deferred clear is used 106*8975f5c5SAndroid Build Coastguard Worker // in the render pass, the render area must cover the whole framebuffer. 107*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle getRenderArea(ContextVk *contextVk) const; getLayerCount()108*8975f5c5SAndroid Build Coastguard Worker uint32_t getLayerCount() const { return mCurrentFramebufferDesc.getLayerCount(); } 109*8975f5c5SAndroid Build Coastguard Worker 110*8975f5c5SAndroid Build Coastguard Worker const gl::DrawBufferMask &getEmulatedAlphaAttachmentMask() const; 111*8975f5c5SAndroid Build Coastguard Worker RenderTargetVk *getColorDrawRenderTarget(size_t colorIndexGL) const; 112*8975f5c5SAndroid Build Coastguard Worker RenderTargetVk *getColorReadRenderTarget() const; 113*8975f5c5SAndroid Build Coastguard Worker 114*8975f5c5SAndroid Build Coastguard Worker angle::Result startNewRenderPass(ContextVk *contextVk, 115*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &renderArea, 116*8975f5c5SAndroid Build Coastguard Worker vk::RenderPassCommandBuffer **commandBufferOut, 117*8975f5c5SAndroid Build Coastguard Worker bool *renderPassDescChangedOut); 118*8975f5c5SAndroid Build Coastguard Worker 119*8975f5c5SAndroid Build Coastguard Worker GLint getSamples() const; 120*8975f5c5SAndroid Build Coastguard Worker getRenderPassDesc()121*8975f5c5SAndroid Build Coastguard Worker const vk::RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; } 122*8975f5c5SAndroid Build Coastguard Worker 123*8975f5c5SAndroid Build Coastguard Worker angle::Result getFramebuffer(ContextVk *contextVk, vk::RenderPassFramebuffer *framebufferOut); 124*8975f5c5SAndroid Build Coastguard Worker hasDeferredClears()125*8975f5c5SAndroid Build Coastguard Worker bool hasDeferredClears() const { return !mDeferredClears.empty(); } hasDeferredDepthClear()126*8975f5c5SAndroid Build Coastguard Worker bool hasDeferredDepthClear() const { return mDeferredClears.testDepth(); } hasDeferredStencilClear()127*8975f5c5SAndroid Build Coastguard Worker bool hasDeferredStencilClear() const { return mDeferredClears.testStencil(); } 128*8975f5c5SAndroid Build Coastguard Worker angle::Result flushDepthStencilDeferredClear(ContextVk *contextVk, 129*8975f5c5SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect); 130*8975f5c5SAndroid Build Coastguard Worker 131*8975f5c5SAndroid Build Coastguard Worker void switchToColorFramebufferFetchMode(ContextVk *contextVk, bool hasColorFramebufferFetch); 132*8975f5c5SAndroid Build Coastguard Worker 133*8975f5c5SAndroid Build Coastguard Worker bool updateLegacyDither(ContextVk *contextVk); 134*8975f5c5SAndroid Build Coastguard Worker setBackbuffer(WindowSurfaceVk * backbuffer)135*8975f5c5SAndroid Build Coastguard Worker void setBackbuffer(WindowSurfaceVk *backbuffer) { mBackbuffer = backbuffer; } getBackbuffer()136*8975f5c5SAndroid Build Coastguard Worker WindowSurfaceVk *getBackbuffer() const { return mBackbuffer; } 137*8975f5c5SAndroid Build Coastguard Worker 138*8975f5c5SAndroid Build Coastguard Worker void releaseCurrentFramebuffer(ContextVk *contextVk); 139*8975f5c5SAndroid Build Coastguard Worker getLastRenderPassQueueSerial()140*8975f5c5SAndroid Build Coastguard Worker const QueueSerial &getLastRenderPassQueueSerial() const { return mLastRenderPassQueueSerial; } 141*8975f5c5SAndroid Build Coastguard Worker hasAnyExternalAttachments()142*8975f5c5SAndroid Build Coastguard Worker bool hasAnyExternalAttachments() const { return mIsExternalColorAttachments.any(); } 143*8975f5c5SAndroid Build Coastguard Worker hasFrontBufferUsage()144*8975f5c5SAndroid Build Coastguard Worker bool hasFrontBufferUsage() const 145*8975f5c5SAndroid Build Coastguard Worker { 146*8975f5c5SAndroid Build Coastguard Worker return (mAttachmentHasFrontBufferUsage & mState.getColorAttachmentsMask()).any(); 147*8975f5c5SAndroid Build Coastguard Worker } 148*8975f5c5SAndroid Build Coastguard Worker isFoveationEnabled()149*8975f5c5SAndroid Build Coastguard Worker bool isFoveationEnabled() { return mFoveationState.isFoveated(); } 150*8975f5c5SAndroid Build Coastguard Worker 151*8975f5c5SAndroid Build Coastguard Worker private: 152*8975f5c5SAndroid Build Coastguard Worker enum class ClearWithCommand 153*8975f5c5SAndroid Build Coastguard Worker { 154*8975f5c5SAndroid Build Coastguard Worker Always, 155*8975f5c5SAndroid Build Coastguard Worker OptimizeWithLoadOp, 156*8975f5c5SAndroid Build Coastguard Worker }; 157*8975f5c5SAndroid Build Coastguard Worker 158*8975f5c5SAndroid Build Coastguard Worker enum class RenderTargetImage 159*8975f5c5SAndroid Build Coastguard Worker { 160*8975f5c5SAndroid Build Coastguard Worker Attachment, 161*8975f5c5SAndroid Build Coastguard Worker Resolve, 162*8975f5c5SAndroid Build Coastguard Worker FragmentShadingRate, 163*8975f5c5SAndroid Build Coastguard Worker }; 164*8975f5c5SAndroid Build Coastguard Worker 165*8975f5c5SAndroid Build Coastguard Worker struct RenderTargetInfo 166*8975f5c5SAndroid Build Coastguard Worker { RenderTargetInfoRenderTargetInfo167*8975f5c5SAndroid Build Coastguard Worker RenderTargetInfo() : renderTarget(nullptr), renderTargetImage(RenderTargetImage::Attachment) 168*8975f5c5SAndroid Build Coastguard Worker {} RenderTargetInfoRenderTargetInfo169*8975f5c5SAndroid Build Coastguard Worker RenderTargetInfo(RenderTargetVk *renderTarget, RenderTargetImage renderTargetImage) 170*8975f5c5SAndroid Build Coastguard Worker : renderTarget(renderTarget), renderTargetImage(renderTargetImage) 171*8975f5c5SAndroid Build Coastguard Worker {} 172*8975f5c5SAndroid Build Coastguard Worker RenderTargetVk *renderTarget; 173*8975f5c5SAndroid Build Coastguard Worker RenderTargetImage renderTargetImage; 174*8975f5c5SAndroid Build Coastguard Worker }; 175*8975f5c5SAndroid Build Coastguard Worker 176*8975f5c5SAndroid Build Coastguard Worker // Returns the attachments to be used to create a framebuffer. The views returned in 177*8975f5c5SAndroid Build Coastguard Worker // |unpackedAttachments| are not necessarily packed, but the render targets in 178*8975f5c5SAndroid Build Coastguard Worker // |packedRenderTargetsInfoOut| are. In particular, the resolve attachment views need to stay 179*8975f5c5SAndroid Build Coastguard Worker // sparse to be placed in |RenderPassFramebuffer|, but the calling function will have to pack 180*8975f5c5SAndroid Build Coastguard Worker // them to match the render buffers before creating a framebuffer. 181*8975f5c5SAndroid Build Coastguard Worker angle::Result getAttachmentsAndRenderTargets( 182*8975f5c5SAndroid Build Coastguard Worker vk::Context *context, 183*8975f5c5SAndroid Build Coastguard Worker vk::FramebufferAttachmentsVector<VkImageView> *unpackedAttachments, 184*8975f5c5SAndroid Build Coastguard Worker vk::FramebufferAttachmentsVector<RenderTargetInfo> *packedRenderTargetsInfoOut); 185*8975f5c5SAndroid Build Coastguard Worker 186*8975f5c5SAndroid Build Coastguard Worker angle::Result createNewFramebuffer( 187*8975f5c5SAndroid Build Coastguard Worker ContextVk *contextVk, 188*8975f5c5SAndroid Build Coastguard Worker uint32_t framebufferWidth, 189*8975f5c5SAndroid Build Coastguard Worker const uint32_t framebufferHeight, 190*8975f5c5SAndroid Build Coastguard Worker const uint32_t framebufferLayers, 191*8975f5c5SAndroid Build Coastguard Worker const vk::FramebufferAttachmentsVector<VkImageView> &unpackedAttachments, 192*8975f5c5SAndroid Build Coastguard Worker const vk::FramebufferAttachmentsVector<RenderTargetInfo> &renderTargetsInfo); 193*8975f5c5SAndroid Build Coastguard Worker 194*8975f5c5SAndroid Build Coastguard Worker // The 'in' rectangles must be clipped to the scissor and FBO. The clipping is done in 'blit'. 195*8975f5c5SAndroid Build Coastguard Worker angle::Result blitWithCommand(ContextVk *contextVk, 196*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 197*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &destArea, 198*8975f5c5SAndroid Build Coastguard Worker RenderTargetVk *readRenderTarget, 199*8975f5c5SAndroid Build Coastguard Worker RenderTargetVk *drawRenderTarget, 200*8975f5c5SAndroid Build Coastguard Worker GLenum filter, 201*8975f5c5SAndroid Build Coastguard Worker bool colorBlit, 202*8975f5c5SAndroid Build Coastguard Worker bool depthBlit, 203*8975f5c5SAndroid Build Coastguard Worker bool stencilBlit, 204*8975f5c5SAndroid Build Coastguard Worker bool flipX, 205*8975f5c5SAndroid Build Coastguard Worker bool flipY); 206*8975f5c5SAndroid Build Coastguard Worker 207*8975f5c5SAndroid Build Coastguard Worker // Resolve color with subpass attachment 208*8975f5c5SAndroid Build Coastguard Worker angle::Result resolveColorWithSubpass(ContextVk *contextVk, 209*8975f5c5SAndroid Build Coastguard Worker const UtilsVk::BlitResolveParameters ¶ms); 210*8975f5c5SAndroid Build Coastguard Worker 211*8975f5c5SAndroid Build Coastguard Worker // Resolve depth/stencil with subpass attachment 212*8975f5c5SAndroid Build Coastguard Worker angle::Result resolveDepthStencilWithSubpass(ContextVk *contextVk, 213*8975f5c5SAndroid Build Coastguard Worker const UtilsVk::BlitResolveParameters ¶ms, 214*8975f5c5SAndroid Build Coastguard Worker VkImageAspectFlags aspects); 215*8975f5c5SAndroid Build Coastguard Worker 216*8975f5c5SAndroid Build Coastguard Worker // Resolve color with vkCmdResolveImage 217*8975f5c5SAndroid Build Coastguard Worker angle::Result resolveColorWithCommand(ContextVk *contextVk, 218*8975f5c5SAndroid Build Coastguard Worker const UtilsVk::BlitResolveParameters ¶ms, 219*8975f5c5SAndroid Build Coastguard Worker vk::ImageHelper *srcImage); 220*8975f5c5SAndroid Build Coastguard Worker 221*8975f5c5SAndroid Build Coastguard Worker angle::Result clearImpl(const gl::Context *context, 222*8975f5c5SAndroid Build Coastguard Worker gl::DrawBufferMask clearColorBuffers, 223*8975f5c5SAndroid Build Coastguard Worker bool clearDepth, 224*8975f5c5SAndroid Build Coastguard Worker bool clearStencil, 225*8975f5c5SAndroid Build Coastguard Worker const VkClearColorValue &clearColorValue, 226*8975f5c5SAndroid Build Coastguard Worker const VkClearDepthStencilValue &clearDepthStencilValue); 227*8975f5c5SAndroid Build Coastguard Worker 228*8975f5c5SAndroid Build Coastguard Worker void mergeClearsWithDeferredClears( 229*8975f5c5SAndroid Build Coastguard Worker gl::DrawBufferMask clearColorBuffers, 230*8975f5c5SAndroid Build Coastguard Worker bool clearDepth, 231*8975f5c5SAndroid Build Coastguard Worker bool clearStencil, 232*8975f5c5SAndroid Build Coastguard Worker const gl::DrawBuffersArray<VkClearColorValue> &clearColorValues, 233*8975f5c5SAndroid Build Coastguard Worker const VkClearDepthStencilValue &clearDepthStencilValue); 234*8975f5c5SAndroid Build Coastguard Worker angle::Result clearWithDraw(ContextVk *contextVk, 235*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &clearArea, 236*8975f5c5SAndroid Build Coastguard Worker gl::DrawBufferMask clearColorBuffers, 237*8975f5c5SAndroid Build Coastguard Worker bool clearDepth, 238*8975f5c5SAndroid Build Coastguard Worker bool clearStencil, 239*8975f5c5SAndroid Build Coastguard Worker gl::BlendStateExt::ColorMaskStorage::Type colorMasks, 240*8975f5c5SAndroid Build Coastguard Worker uint8_t stencilMask, 241*8975f5c5SAndroid Build Coastguard Worker const gl::DrawBuffersArray<VkClearColorValue> &clearColorValues, 242*8975f5c5SAndroid Build Coastguard Worker const VkClearDepthStencilValue &clearDepthStencilValue); 243*8975f5c5SAndroid Build Coastguard Worker void restageDeferredClears(ContextVk *contextVk); 244*8975f5c5SAndroid Build Coastguard Worker void restageDeferredClearsForReadFramebuffer(ContextVk *contextVk); 245*8975f5c5SAndroid Build Coastguard Worker void restageDeferredClearsImpl(ContextVk *contextVk); 246*8975f5c5SAndroid Build Coastguard Worker angle::Result flushDeferredClears(ContextVk *contextVk); 247*8975f5c5SAndroid Build Coastguard Worker void clearWithCommand(ContextVk *contextVk, 248*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &scissoredRenderArea, 249*8975f5c5SAndroid Build Coastguard Worker ClearWithCommand behavior, 250*8975f5c5SAndroid Build Coastguard Worker vk::ClearValuesArray *clears); 251*8975f5c5SAndroid Build Coastguard Worker void clearWithLoadOp(ContextVk *contextVk); 252*8975f5c5SAndroid Build Coastguard Worker void updateActiveColorMasks(size_t colorIndex, bool r, bool g, bool b, bool a); 253*8975f5c5SAndroid Build Coastguard Worker void updateRenderPassDesc(ContextVk *contextVk); 254*8975f5c5SAndroid Build Coastguard Worker angle::Result updateColorAttachment(const gl::Context *context, uint32_t colorIndex); 255*8975f5c5SAndroid Build Coastguard Worker void updateColorAttachmentColorspace(gl::SrgbWriteControlMode srgbWriteControlMode); 256*8975f5c5SAndroid Build Coastguard Worker angle::Result updateDepthStencilAttachment(const gl::Context *context); 257*8975f5c5SAndroid Build Coastguard Worker void updateDepthStencilAttachmentSerial(ContextVk *contextVk); 258*8975f5c5SAndroid Build Coastguard Worker angle::Result flushColorAttachmentUpdates(const gl::Context *context, 259*8975f5c5SAndroid Build Coastguard Worker bool deferClears, 260*8975f5c5SAndroid Build Coastguard Worker uint32_t colorIndex); 261*8975f5c5SAndroid Build Coastguard Worker angle::Result flushDepthStencilAttachmentUpdates(const gl::Context *context, bool deferClears); 262*8975f5c5SAndroid Build Coastguard Worker angle::Result invalidateImpl(ContextVk *contextVk, 263*8975f5c5SAndroid Build Coastguard Worker size_t count, 264*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments, 265*8975f5c5SAndroid Build Coastguard Worker bool isSubInvalidate, 266*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &invalidateArea); 267*8975f5c5SAndroid Build Coastguard Worker 268*8975f5c5SAndroid Build Coastguard Worker RenderTargetVk *getReadPixelsRenderTarget(GLenum format) const; 269*8975f5c5SAndroid Build Coastguard Worker VkImageAspectFlagBits getReadPixelsAspectFlags(GLenum format) const; 270*8975f5c5SAndroid Build Coastguard Worker 271*8975f5c5SAndroid Build Coastguard Worker VkClearValue getCorrectedColorClearValue(size_t colorIndexGL, 272*8975f5c5SAndroid Build Coastguard Worker const VkClearColorValue &clearColor) const; 273*8975f5c5SAndroid Build Coastguard Worker 274*8975f5c5SAndroid Build Coastguard Worker void updateLayerCount(); 275*8975f5c5SAndroid Build Coastguard Worker 276*8975f5c5SAndroid Build Coastguard Worker angle::Result ensureFragmentShadingRateImageAndViewInitialized( 277*8975f5c5SAndroid Build Coastguard Worker ContextVk *contextVk, 278*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateAttachmentWidth, 279*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateAttachmentHeight); 280*8975f5c5SAndroid Build Coastguard Worker angle::Result generateFragmentShadingRateWithCPU( 281*8975f5c5SAndroid Build Coastguard Worker ContextVk *contextVk, 282*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateWidth, 283*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateHeight, 284*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateBlockWidth, 285*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateBlockHeight, 286*8975f5c5SAndroid Build Coastguard Worker const uint32_t foveatedAttachmentWidth, 287*8975f5c5SAndroid Build Coastguard Worker const uint32_t foveatedAttachmentHeight, 288*8975f5c5SAndroid Build Coastguard Worker const std::vector<gl::FocalPoint> &activeFocalPoints); 289*8975f5c5SAndroid Build Coastguard Worker angle::Result generateFragmentShadingRateWithCompute( 290*8975f5c5SAndroid Build Coastguard Worker ContextVk *contextVk, 291*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateWidth, 292*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateHeight, 293*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateBlockWidth, 294*8975f5c5SAndroid Build Coastguard Worker const uint32_t fragmentShadingRateBlockHeight, 295*8975f5c5SAndroid Build Coastguard Worker const uint32_t foveatedAttachmentWidth, 296*8975f5c5SAndroid Build Coastguard Worker const uint32_t foveatedAttachmentHeight, 297*8975f5c5SAndroid Build Coastguard Worker const std::vector<gl::FocalPoint> &activeFocalPoints); 298*8975f5c5SAndroid Build Coastguard Worker angle::Result updateFragmentShadingRateAttachment(ContextVk *contextVk, 299*8975f5c5SAndroid Build Coastguard Worker const gl::FoveationState &foveationState, 300*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &foveatedAttachmentSize); 301*8975f5c5SAndroid Build Coastguard Worker angle::Result updateFoveationState(ContextVk *contextVk, 302*8975f5c5SAndroid Build Coastguard Worker const gl::FoveationState &newFoveationState, 303*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &foveatedAttachmentSize); 304*8975f5c5SAndroid Build Coastguard Worker 305*8975f5c5SAndroid Build Coastguard Worker void insertCache(ContextVk *contextVk, 306*8975f5c5SAndroid Build Coastguard Worker const vk::FramebufferDesc &desc, 307*8975f5c5SAndroid Build Coastguard Worker vk::FramebufferHelper &&newFramebuffer); 308*8975f5c5SAndroid Build Coastguard Worker 309*8975f5c5SAndroid Build Coastguard Worker WindowSurfaceVk *mBackbuffer; 310*8975f5c5SAndroid Build Coastguard Worker 311*8975f5c5SAndroid Build Coastguard Worker vk::RenderPassDesc mRenderPassDesc; 312*8975f5c5SAndroid Build Coastguard Worker RenderTargetCache<RenderTargetVk> mRenderTargetCache; 313*8975f5c5SAndroid Build Coastguard Worker 314*8975f5c5SAndroid Build Coastguard Worker // This variable is used to quickly compute if we need to do a masked clear. If a color 315*8975f5c5SAndroid Build Coastguard Worker // channel is masked out, we check against the Framebuffer Attachments (RenderTargets) to see 316*8975f5c5SAndroid Build Coastguard Worker // if the masked out channel is present in any of the attachments. 317*8975f5c5SAndroid Build Coastguard Worker gl::BlendStateExt::ColorMaskStorage::Type mActiveColorComponentMasksForClear; 318*8975f5c5SAndroid Build Coastguard Worker 319*8975f5c5SAndroid Build Coastguard Worker // When we draw to the framebuffer, and the real format has an alpha channel but the format of 320*8975f5c5SAndroid Build Coastguard Worker // the framebuffer does not, we need to mask out the alpha channel. This DrawBufferMask will 321*8975f5c5SAndroid Build Coastguard Worker // contain the mask to apply to the alpha channel when drawing. 322*8975f5c5SAndroid Build Coastguard Worker gl::DrawBufferMask mEmulatedAlphaAttachmentMask; 323*8975f5c5SAndroid Build Coastguard Worker 324*8975f5c5SAndroid Build Coastguard Worker // mCurrentFramebufferDesc is used to detect framebuffer changes using its serials. Therefore, 325*8975f5c5SAndroid Build Coastguard Worker // it must be maintained even when using the imageless framebuffer extension. 326*8975f5c5SAndroid Build Coastguard Worker vk::FramebufferDesc mCurrentFramebufferDesc; 327*8975f5c5SAndroid Build Coastguard Worker 328*8975f5c5SAndroid Build Coastguard Worker // The framebuffer cache actually owns the Framebuffer object and manages its lifetime. We just 329*8975f5c5SAndroid Build Coastguard Worker // store the current VkFramebuffer handle here that associated with mCurrentFramebufferDesc. 330*8975f5c5SAndroid Build Coastguard Worker vk::Framebuffer mCurrentFramebuffer; 331*8975f5c5SAndroid Build Coastguard Worker 332*8975f5c5SAndroid Build Coastguard Worker vk::ClearValuesArray mDeferredClears; 333*8975f5c5SAndroid Build Coastguard Worker 334*8975f5c5SAndroid Build Coastguard Worker // Whether any of the color attachments are an external image such as dmabuf, AHB etc. In such 335*8975f5c5SAndroid Build Coastguard Worker // cases, some optimizations are disabled such as deferred clears because the results need to be 336*8975f5c5SAndroid Build Coastguard Worker // made externally available. 337*8975f5c5SAndroid Build Coastguard Worker gl::DrawBufferMask mIsExternalColorAttachments; 338*8975f5c5SAndroid Build Coastguard Worker gl::DrawBufferMask mAttachmentHasFrontBufferUsage; 339*8975f5c5SAndroid Build Coastguard Worker 340*8975f5c5SAndroid Build Coastguard Worker bool mIsCurrentFramebufferCached; 341*8975f5c5SAndroid Build Coastguard Worker bool mIsYUVResolve; 342*8975f5c5SAndroid Build Coastguard Worker 343*8975f5c5SAndroid Build Coastguard Worker gl::FoveationState mFoveationState; 344*8975f5c5SAndroid Build Coastguard Worker vk::ImageHelper mFragmentShadingRateImage; 345*8975f5c5SAndroid Build Coastguard Worker vk::ImageViewHelper mFragmentShadingRateImageView; 346*8975f5c5SAndroid Build Coastguard Worker 347*8975f5c5SAndroid Build Coastguard Worker // Serial of the render pass this framebuffer has opened, if any. 348*8975f5c5SAndroid Build Coastguard Worker QueueSerial mLastRenderPassQueueSerial; 349*8975f5c5SAndroid Build Coastguard Worker }; 350*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 351*8975f5c5SAndroid Build Coastguard Worker 352*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_ 353