blob: 61621566805401ff3e78d15000db2c39658b8358 [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 Madill6c7ab7f2018-03-31 14:19:15 -040025class FramebufferVk : public FramebufferImpl, public vk::CommandGraphResource
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.
29 static FramebufferVk *CreateUserFBO(const gl::FramebufferState &state);
30
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).
34 static FramebufferVk *CreateDefaultFBO(const gl::FramebufferState &state,
35 WindowSurfaceVk *backbuffer);
36
Jamie Madill9e54b5a2016-05-25 12:57:39 -040037 ~FramebufferVk() override;
Jamie Madillc564c072017-06-01 12:45:42 -040038 void destroy(const gl::Context *context) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040039
Jamie Madill4928b7c2017-06-20 12:57:39 -040040 gl::Error discard(const gl::Context *context, size_t count, const GLenum *attachments) override;
41 gl::Error invalidate(const gl::Context *context,
42 size_t count,
43 const GLenum *attachments) override;
44 gl::Error invalidateSub(const gl::Context *context,
45 size_t count,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040046 const GLenum *attachments,
47 const gl::Rectangle &area) override;
48
Jamie Madillc564c072017-06-01 12:45:42 -040049 gl::Error clear(const gl::Context *context, GLbitfield mask) override;
50 gl::Error clearBufferfv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040051 GLenum buffer,
52 GLint drawbuffer,
53 const GLfloat *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040054 gl::Error clearBufferuiv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040055 GLenum buffer,
56 GLint drawbuffer,
57 const GLuint *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040058 gl::Error clearBufferiv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040059 GLenum buffer,
60 GLint drawbuffer,
61 const GLint *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040062 gl::Error clearBufferfi(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040063 GLenum buffer,
64 GLint drawbuffer,
65 GLfloat depth,
66 GLint stencil) override;
67
Jamie Madill4928b7c2017-06-20 12:57:39 -040068 GLenum getImplementationColorReadFormat(const gl::Context *context) const override;
69 GLenum getImplementationColorReadType(const gl::Context *context) const override;
Jamie Madillc564c072017-06-01 12:45:42 -040070 gl::Error readPixels(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040071 const gl::Rectangle &area,
72 GLenum format,
73 GLenum type,
Jamie Madilld4826152017-09-21 11:18:59 -040074 void *pixels) override;
Luc Ferron26581112018-06-21 09:43:08 -040075
Jamie Madillc564c072017-06-01 12:45:42 -040076 gl::Error blit(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040077 const gl::Rectangle &sourceArea,
78 const gl::Rectangle &destArea,
79 GLbitfield mask,
80 GLenum filter) override;
81
Kenneth Russellce8602a2017-10-03 18:23:08 -070082 bool checkStatus(const gl::Context *context) const override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040083
Jamie Madill19fa1c62018-03-08 09:47:21 -050084 gl::Error syncState(const gl::Context *context,
85 const gl::Framebuffer::DirtyBits &dirtyBits) override;
Jamie Madill7b57b9d2017-01-13 09:33:38 -050086
Geoff Lang13455072018-05-09 11:24:43 -040087 gl::Error getSamplePosition(const gl::Context *context,
88 size_t index,
89 GLfloat *xy) const override;
Luc Ferron26581112018-06-21 09:43:08 -040090 RenderTargetVk *getDepthStencilRenderTarget() const;
Jamie Madillb90779e2018-04-27 11:45:01 -040091 const vk::RenderPassDesc &getRenderPassDesc();
Jamie Madill55981482018-07-11 09:01:18 -040092 vk::Error getCommandBufferForDraw(ContextVk *contextVk,
Jamie Madill316c6062018-05-29 10:49:45 -040093 vk::CommandBuffer **commandBufferOut,
94 vk::RecordingMode *modeOut);
Jamie Madillab9f9c32017-01-17 17:47:34 -050095
Jamie Madill58675012018-05-22 14:54:07 -040096 // Internal helper function for readPixels operations.
Jamie Madilleebe2192018-07-11 09:01:18 -040097 vk::Error readPixelsImpl(const gl::Context *context,
Jamie Madill58675012018-05-22 14:54:07 -040098 const gl::Rectangle &area,
99 const PackPixelsParams &packPixelsParams,
Luc Ferron1617e692018-07-11 11:08:19 -0400100 const VkImageAspectFlags &copyAspectFlags,
101 RenderTargetVk *renderTarget,
Jamie Madill58675012018-05-22 14:54:07 -0400102 void *pixels);
103
104 const gl::Extents &getReadImageExtents() const;
105
Luc Ferron5fd36932018-06-19 14:55:50 -0400106 gl::DrawBufferMask getEmulatedAlphaAttachmentMask();
Luc Ferron1617e692018-07-11 11:08:19 -0400107 RenderTargetVk *getColorReadRenderTarget() const;
Luc Ferron5fd36932018-06-19 14:55:50 -0400108
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500109 private:
110 FramebufferVk(const gl::FramebufferState &state);
111 FramebufferVk(const gl::FramebufferState &state, WindowSurfaceVk *backbuffer);
Jamie Madillab9f9c32017-01-17 17:47:34 -0500112
Luc Ferron1617e692018-07-11 11:08:19 -0400113 gl::Error blitUsingCopy(vk::CommandBuffer *commandBuffer,
114 const gl::Rectangle &readArea,
Luc Ferronbe30c4f2018-06-21 09:43:08 -0400115 const gl::Rectangle &destArea,
Luc Ferron1617e692018-07-11 11:08:19 -0400116 RenderTargetVk *readRenderTarget,
117 RenderTargetVk *drawRenderTarget,
Luc Ferronbe30c4f2018-06-21 09:43:08 -0400118 const gl::Rectangle *scissor,
119 bool blitDepthBuffer,
120 bool blitStencilBuffer);
Luc Ferron1617e692018-07-11 11:08:19 -0400121 gl::Error blitWithReadback(const gl::Context *context,
122 const gl::Rectangle &sourceArea,
123 const gl::Rectangle &destArea,
124 bool blitDepthBuffer,
125 bool blitStencilBuffer,
126 vk::CommandBuffer *commandBuffer,
127 RenderTargetVk *readRenderTarget,
128 RenderTargetVk *drawRenderTarget);
Luc Ferronbe30c4f2018-06-21 09:43:08 -0400129
Jamie Madill55981482018-07-11 09:01:18 -0400130 vk::Error getFramebuffer(RendererVk *rendererVk, vk::Framebuffer **framebufferOut);
Jamie Madillab9f9c32017-01-17 17:47:34 -0500131
Jamie Madillb90779e2018-04-27 11:45:01 -0400132 gl::Error clearWithClearAttachments(ContextVk *contextVk,
133 bool clearColor,
134 bool clearDepth,
135 bool clearStencil);
Luc Ferron66c2f4a2018-06-19 10:27:57 -0400136 gl::Error clearWithDraw(const gl::Context *context, VkColorComponentFlags colorMaskFlags);
Jamie Madill9aef3672018-04-27 11:45:06 -0400137 void updateActiveColorMasks(size_t colorIndex, bool r, bool g, bool b, bool a);
Luc Ferron26581112018-06-21 09:43:08 -0400138
Luc Ferron82eda932018-07-09 15:10:22 -0400139 gl::Error blitImpl(ContextVk *contextVk,
140 vk::CommandBuffer *commandBuffer,
Luc Ferron26581112018-06-21 09:43:08 -0400141 const gl::Rectangle &readRectIn,
142 const gl::Rectangle &drawRectIn,
143 RenderTargetVk *readRenderTarget,
144 RenderTargetVk *drawRenderTarget,
145 GLenum filter,
146 const gl::Rectangle *scissor,
147 bool colorBlit,
148 bool depthBlit,
Luc Ferron82eda932018-07-09 15:10:22 -0400149 bool stencilBlit,
150 bool flipSource,
151 bool flipDest);
Luc Ferron26581112018-06-21 09:43:08 -0400152
Jamie Madillab9f9c32017-01-17 17:47:34 -0500153 WindowSurfaceVk *mBackbuffer;
154
Jamie Madill9f2a8612017-11-30 12:43:09 -0500155 Optional<vk::RenderPassDesc> mRenderPassDesc;
Jamie Madillab9f9c32017-01-17 17:47:34 -0500156 vk::Framebuffer mFramebuffer;
Jamie Madill66546be2018-03-08 09:47:20 -0500157 RenderTargetCache<RenderTargetVk> mRenderTargetCache;
Jamie Madill9aef3672018-04-27 11:45:06 -0400158
159 // These two variables are used to quickly compute if we need to do a masked clear. If a color
160 // channel is masked out, we check against the Framebuffer Attachments (RenderTargets) to see
161 // if the masked out channel is present in any of the attachments.
162 VkColorComponentFlags mActiveColorComponents;
Luc Ferron5fd36932018-06-19 14:55:50 -0400163 gl::DrawBufferMask mActiveColorComponentMasksForClear[4];
Luc Ferron534b00d2018-05-18 08:16:53 -0400164 vk::DynamicBuffer mReadPixelsBuffer;
Luc Ferron1617e692018-07-11 11:08:19 -0400165 vk::DynamicBuffer mBlitPixelBuffer;
Luc Ferron5fd36932018-06-19 14:55:50 -0400166
167 // When we draw to the framebuffer, and the real format has an alpha channel but the format of
168 // the framebuffer does not, we need to mask out the alpha channel. This DrawBufferMask will
169 // contain the mask to apply to the alpha channel when drawing.
170 gl::DrawBufferMask mEmulatedAlphaAttachmentMask;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400171};
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400172} // namespace rx
173
174#endif // LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_