blob: a12d5ab26fabfb4c43dee2befc68fecf73aae5f1 [file] [log] [blame]
Jamie Madill9e54b5a2016-05-25 12:57:39 -04001//
2// Copyright 2016 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// FramebufferVk.h:
7// Defines the class interface for FramebufferVk, implementing FramebufferImpl.
8//
9
10#ifndef LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_
11#define LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_
12
13#include "libANGLE/renderer/FramebufferImpl.h"
Jamie Madill66546be2018-03-08 09:47:20 -050014#include "libANGLE/renderer/RenderTargetCache.h"
Luc Ferron534b00d2018-05-18 08:16:53 -040015#include "libANGLE/renderer/vulkan/BufferVk.h"
Jamie Madill6c7ab7f2018-03-31 14:19:15 -040016#include "libANGLE/renderer/vulkan/CommandGraph.h"
Jamie Madill3c424b42018-01-19 12:35:09 -050017#include "libANGLE/renderer/vulkan/vk_cache_utils.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040018
19namespace rx
20{
Jamie Madill9f2a8612017-11-30 12:43:09 -050021class RendererVk;
Jamie Madill7b57b9d2017-01-13 09:33:38 -050022class RenderTargetVk;
23class WindowSurfaceVk;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040024
Jamie Madille8dd0792018-09-27 15:04:27 -040025class FramebufferVk : public FramebufferImpl
Jamie Madill9e54b5a2016-05-25 12:57:39 -040026{
27 public:
Jamie Madill7b57b9d2017-01-13 09:33:38 -050028 // Factory methods so we don't have to use constructors with overloads.
Jamie Madill639bc902018-07-18 17:08:27 -040029 static FramebufferVk *CreateUserFBO(RendererVk *renderer, const gl::FramebufferState &state);
Jamie Madill7b57b9d2017-01-13 09:33:38 -050030
31 // The passed-in SurfaceVK must be destroyed after this FBO is destroyed. Our Surface code is
32 // ref-counted on the number of 'current' contexts, so we shouldn't get any dangling surface
33 // references. See Surface::setIsCurrent(bool).
Jamie Madill639bc902018-07-18 17:08:27 -040034 static FramebufferVk *CreateDefaultFBO(RendererVk *renderer,
35 const gl::FramebufferState &state,
Jamie Madill7b57b9d2017-01-13 09:33:38 -050036 WindowSurfaceVk *backbuffer);
37
Jamie Madill9e54b5a2016-05-25 12:57:39 -040038 ~FramebufferVk() override;
Jamie Madillc564c072017-06-01 12:45:42 -040039 void destroy(const gl::Context *context) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040040
Jamie Madill64b7c4f2018-10-19 11:38:04 -040041 angle::Result discard(const gl::Context *context,
42 size_t count,
43 const GLenum *attachments) override;
44 angle::Result invalidate(const gl::Context *context,
45 size_t count,
46 const GLenum *attachments) override;
47 angle::Result invalidateSub(const gl::Context *context,
48 size_t count,
49 const GLenum *attachments,
50 const gl::Rectangle &area) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040051
Jamie Madill64b7c4f2018-10-19 11:38:04 -040052 angle::Result clear(const gl::Context *context, GLbitfield mask) override;
53 angle::Result clearBufferfv(const gl::Context *context,
54 GLenum buffer,
55 GLint drawbuffer,
56 const GLfloat *values) override;
57 angle::Result clearBufferuiv(const gl::Context *context,
58 GLenum buffer,
59 GLint drawbuffer,
60 const GLuint *values) override;
61 angle::Result clearBufferiv(const gl::Context *context,
62 GLenum buffer,
63 GLint drawbuffer,
64 const GLint *values) override;
65 angle::Result clearBufferfi(const gl::Context *context,
66 GLenum buffer,
67 GLint drawbuffer,
68 GLfloat depth,
69 GLint stencil) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040070
Jamie Madill4928b7c2017-06-20 12:57:39 -040071 GLenum getImplementationColorReadFormat(const gl::Context *context) const override;
72 GLenum getImplementationColorReadType(const gl::Context *context) const override;
Jamie Madill64b7c4f2018-10-19 11:38:04 -040073 angle::Result readPixels(const gl::Context *context,
74 const gl::Rectangle &area,
75 GLenum format,
76 GLenum type,
77 void *pixels) override;
Luc Ferron26581112018-06-21 09:43:08 -040078
Jamie Madill64b7c4f2018-10-19 11:38:04 -040079 angle::Result blit(const gl::Context *context,
80 const gl::Rectangle &sourceArea,
81 const gl::Rectangle &destArea,
82 GLbitfield mask,
83 GLenum filter) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040084
Kenneth Russellce8602a2017-10-03 18:23:08 -070085 bool checkStatus(const gl::Context *context) const override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040086
Jamie Madill6f755b22018-10-09 12:48:54 -040087 angle::Result syncState(const gl::Context *context,
88 const gl::Framebuffer::DirtyBits &dirtyBits) override;
Jamie Madill7b57b9d2017-01-13 09:33:38 -050089
Jamie Madill64b7c4f2018-10-19 11:38:04 -040090 angle::Result getSamplePosition(const gl::Context *context,
91 size_t index,
92 GLfloat *xy) const override;
Luc Ferron26581112018-06-21 09:43:08 -040093 RenderTargetVk *getDepthStencilRenderTarget() const;
Jamie Madillab9f9c32017-01-17 17:47:34 -050094
Jamie Madill58675012018-05-22 14:54:07 -040095 // Internal helper function for readPixels operations.
Jamie Madill21061022018-07-12 23:56:30 -040096 angle::Result readPixelsImpl(ContextVk *contextVk,
97 const gl::Rectangle &area,
98 const PackPixelsParams &packPixelsParams,
Jamie Madillb436aac2018-07-18 17:23:48 -040099 VkImageAspectFlagBits copyAspectFlags,
Jamie Madill21061022018-07-12 23:56:30 -0400100 RenderTargetVk *renderTarget,
101 void *pixels);
Jamie Madill58675012018-05-22 14:54:07 -0400102
103 const gl::Extents &getReadImageExtents() const;
104
Shahbaz Youssefie3219402018-12-08 16:54:14 +0100105 const gl::DrawBufferMask &getEmulatedAlphaAttachmentMask() const;
Luc Ferron1617e692018-07-11 11:08:19 -0400106 RenderTargetVk *getColorReadRenderTarget() const;
Luc Ferron5fd36932018-06-19 14:55:50 -0400107
Jamie Madilld1249de2018-08-28 16:58:53 -0400108 // This will clear the current write operation if it is complete.
Tobin Ehlis134425c2019-03-15 17:02:17 -0600109 bool appendToStartedRenderPass(Serial currentQueueSerial, CommandBufferT **commandBufferOut)
Jamie Madille8dd0792018-09-27 15:04:27 -0400110 {
Jamie Madillc759b8b2019-01-03 15:16:50 -0500111 return mFramebuffer.appendToStartedRenderPass(currentQueueSerial, commandBufferOut);
Jamie Madille8dd0792018-09-27 15:04:27 -0400112 }
113
114 vk::FramebufferHelper *getFramebuffer() { return &mFramebuffer; }
Jamie Madilld1249de2018-08-28 16:58:53 -0400115
Tobin Ehlis134425c2019-03-15 17:02:17 -0600116 angle::Result startNewRenderPass(ContextVk *context, CommandBufferT **commandBufferOut);
Jamie Madilld1249de2018-08-28 16:58:53 -0400117
Jamie Madill502d2e22018-11-01 11:06:23 -0400118 RenderTargetVk *getFirstRenderTarget() const;
119 GLint getSamples() const;
120
Jamie Madilldbc605c2019-01-04 16:39:14 -0500121 const vk::RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; }
122
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500123 private:
Jamie Madill639bc902018-07-18 17:08:27 -0400124 FramebufferVk(RendererVk *renderer,
125 const gl::FramebufferState &state,
126 WindowSurfaceVk *backbuffer);
Jamie Madillab9f9c32017-01-17 17:47:34 -0500127
Jamie Madilld1249de2018-08-28 16:58:53 -0400128 // Helper for appendToStarted/else startNewRenderPass.
129 angle::Result getCommandBufferForDraw(ContextVk *contextVk,
Tobin Ehlis134425c2019-03-15 17:02:17 -0600130 CommandBufferT **commandBufferOut,
Jamie Madilld1249de2018-08-28 16:58:53 -0400131 vk::RecordingMode *modeOut);
132
Jamie Madilld754eb52018-07-19 14:55:03 -0400133 // The 'in' rectangles must be clipped to the scissor and FBO. The clipping is done in 'blit'.
Jamie Madill16c20142018-10-01 13:58:19 -0400134 angle::Result blitWithCommand(ContextVk *contextVk,
135 const gl::Rectangle &readRectIn,
136 const gl::Rectangle &drawRectIn,
137 RenderTargetVk *readRenderTarget,
138 RenderTargetVk *drawRenderTarget,
139 GLenum filter,
140 bool colorBlit,
141 bool depthBlit,
142 bool stencilBlit,
143 bool flipSource,
144 bool flipDest);
Jamie Madilld754eb52018-07-19 14:55:03 -0400145
146 // Note that 'copyArea' must be clipped to the scissor and FBO. The clipping is done in 'blit'.
Jamie Madill16c20142018-10-01 13:58:19 -0400147 angle::Result blitWithCopy(ContextVk *contextVk,
148 const gl::Rectangle &copyArea,
149 RenderTargetVk *readRenderTarget,
150 RenderTargetVk *drawRenderTarget,
151 bool blitDepthBuffer,
152 bool blitStencilBuffer);
Jamie Madilld754eb52018-07-19 14:55:03 -0400153
Jamie Madill21061022018-07-12 23:56:30 -0400154 angle::Result blitWithReadback(ContextVk *contextVk,
Jamie Madilld754eb52018-07-19 14:55:03 -0400155 const gl::Rectangle &copyArea,
Jamie Madillb436aac2018-07-18 17:23:48 -0400156 VkImageAspectFlagBits aspect,
Jamie Madill21061022018-07-12 23:56:30 -0400157 RenderTargetVk *readRenderTarget,
158 RenderTargetVk *drawRenderTarget);
159
160 angle::Result getFramebuffer(ContextVk *contextVk, vk::Framebuffer **framebufferOut);
161
162 angle::Result clearWithClearAttachments(ContextVk *contextVk,
163 bool clearColor,
164 bool clearDepth,
Shahbaz Youssefid856ca42018-10-31 16:55:12 -0400165 bool clearStencil,
166 const VkClearDepthStencilValue &clearDepthStencilValue);
Jamie Madill21061022018-07-12 23:56:30 -0400167 angle::Result clearWithDraw(ContextVk *contextVk, VkColorComponentFlags colorMaskFlags);
168 void updateActiveColorMasks(size_t colorIndex, bool r, bool g, bool b, bool a);
Jamie Madilldbc605c2019-01-04 16:39:14 -0500169 void updateRenderPassDesc();
Jamie Madill21061022018-07-12 23:56:30 -0400170
Jamie Madillab9f9c32017-01-17 17:47:34 -0500171 WindowSurfaceVk *mBackbuffer;
172
Jamie Madilldbc605c2019-01-04 16:39:14 -0500173 vk::RenderPassDesc mRenderPassDesc;
Jamie Madille8dd0792018-09-27 15:04:27 -0400174 vk::FramebufferHelper mFramebuffer;
Jamie Madill66546be2018-03-08 09:47:20 -0500175 RenderTargetCache<RenderTargetVk> mRenderTargetCache;
Jamie Madill9aef3672018-04-27 11:45:06 -0400176
177 // These two variables are used to quickly compute if we need to do a masked clear. If a color
178 // channel is masked out, we check against the Framebuffer Attachments (RenderTargets) to see
179 // if the masked out channel is present in any of the attachments.
180 VkColorComponentFlags mActiveColorComponents;
Luc Ferron5fd36932018-06-19 14:55:50 -0400181 gl::DrawBufferMask mActiveColorComponentMasksForClear[4];
Jamie Madilld754eb52018-07-19 14:55:03 -0400182 vk::DynamicBuffer mReadPixelBuffer;
Luc Ferron1617e692018-07-11 11:08:19 -0400183 vk::DynamicBuffer mBlitPixelBuffer;
Luc Ferron5fd36932018-06-19 14:55:50 -0400184
185 // When we draw to the framebuffer, and the real format has an alpha channel but the format of
186 // the framebuffer does not, we need to mask out the alpha channel. This DrawBufferMask will
187 // contain the mask to apply to the alpha channel when drawing.
188 gl::DrawBufferMask mEmulatedAlphaAttachmentMask;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400189};
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400190} // namespace rx
191
192#endif // LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_