blob: 32935cfbd4a9594eb8a94a58d0e3be6c69c5abe1 [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"
Jamie Madill3c424b42018-01-19 12:35:09 -050015#include "libANGLE/renderer/vulkan/vk_cache_utils.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040016
17namespace rx
18{
Jamie Madill9f2a8612017-11-30 12:43:09 -050019class RendererVk;
Jamie Madill7b57b9d2017-01-13 09:33:38 -050020class RenderTargetVk;
21class WindowSurfaceVk;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040022
Jamie Madill4c26fc22017-02-24 11:04:10 -050023class FramebufferVk : public FramebufferImpl, public ResourceVk
Jamie Madill9e54b5a2016-05-25 12:57:39 -040024{
25 public:
Jamie Madill7b57b9d2017-01-13 09:33:38 -050026 // Factory methods so we don't have to use constructors with overloads.
27 static FramebufferVk *CreateUserFBO(const gl::FramebufferState &state);
28
29 // The passed-in SurfaceVK must be destroyed after this FBO is destroyed. Our Surface code is
30 // ref-counted on the number of 'current' contexts, so we shouldn't get any dangling surface
31 // references. See Surface::setIsCurrent(bool).
32 static FramebufferVk *CreateDefaultFBO(const gl::FramebufferState &state,
33 WindowSurfaceVk *backbuffer);
34
Jamie Madill9e54b5a2016-05-25 12:57:39 -040035 ~FramebufferVk() override;
Jamie Madillc564c072017-06-01 12:45:42 -040036 void destroy(const gl::Context *context) override;
37 void destroyDefault(const egl::Display *display) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040038
Jamie Madill4928b7c2017-06-20 12:57:39 -040039 gl::Error discard(const gl::Context *context, size_t count, const GLenum *attachments) override;
40 gl::Error invalidate(const gl::Context *context,
41 size_t count,
42 const GLenum *attachments) override;
43 gl::Error invalidateSub(const gl::Context *context,
44 size_t count,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040045 const GLenum *attachments,
46 const gl::Rectangle &area) override;
47
Jamie Madillc564c072017-06-01 12:45:42 -040048 gl::Error clear(const gl::Context *context, GLbitfield mask) override;
49 gl::Error clearBufferfv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040050 GLenum buffer,
51 GLint drawbuffer,
52 const GLfloat *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040053 gl::Error clearBufferuiv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040054 GLenum buffer,
55 GLint drawbuffer,
56 const GLuint *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040057 gl::Error clearBufferiv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040058 GLenum buffer,
59 GLint drawbuffer,
60 const GLint *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040061 gl::Error clearBufferfi(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040062 GLenum buffer,
63 GLint drawbuffer,
64 GLfloat depth,
65 GLint stencil) override;
66
Jamie Madill4928b7c2017-06-20 12:57:39 -040067 GLenum getImplementationColorReadFormat(const gl::Context *context) const override;
68 GLenum getImplementationColorReadType(const gl::Context *context) const override;
Jamie Madillc564c072017-06-01 12:45:42 -040069 gl::Error readPixels(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040070 const gl::Rectangle &area,
71 GLenum format,
72 GLenum type,
Jamie Madilld4826152017-09-21 11:18:59 -040073 void *pixels) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040074
Jamie Madillc564c072017-06-01 12:45:42 -040075 gl::Error blit(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040076 const gl::Rectangle &sourceArea,
77 const gl::Rectangle &destArea,
78 GLbitfield mask,
79 GLenum filter) override;
80
Kenneth Russellce8602a2017-10-03 18:23:08 -070081 bool checkStatus(const gl::Context *context) const override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040082
Jamie Madill19fa1c62018-03-08 09:47:21 -050083 gl::Error syncState(const gl::Context *context,
84 const gl::Framebuffer::DirtyBits &dirtyBits) override;
Jamie Madill7b57b9d2017-01-13 09:33:38 -050085
Jamie Madillab9f9c32017-01-17 17:47:34 -050086 gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
87
Jamie Madill9f2a8612017-11-30 12:43:09 -050088 const vk::RenderPassDesc &getRenderPassDesc(const gl::Context *context);
Jamie Madille4c5a232018-03-02 21:00:31 -050089 gl::Error getCommandGraphNodeForDraw(const gl::Context *context,
90 vk::CommandGraphNode **nodeOut);
Jamie Madillab9f9c32017-01-17 17:47:34 -050091
Jamie Madill7b57b9d2017-01-13 09:33:38 -050092 private:
93 FramebufferVk(const gl::FramebufferState &state);
94 FramebufferVk(const gl::FramebufferState &state, WindowSurfaceVk *backbuffer);
Jamie Madillab9f9c32017-01-17 17:47:34 -050095
Jamie Madill4928b7c2017-06-20 12:57:39 -040096 gl::ErrorOrResult<vk::Framebuffer *> getFramebuffer(const gl::Context *context,
Jamie Madill9f2a8612017-11-30 12:43:09 -050097 RendererVk *rendererVk);
Jamie Madillab9f9c32017-01-17 17:47:34 -050098
Luc Ferron5242d5b2018-02-15 07:14:35 -050099 gl::Error clearColorAttachmentsWithScissorRegion(const gl::Context *context);
100
Jamie Madillab9f9c32017-01-17 17:47:34 -0500101 WindowSurfaceVk *mBackbuffer;
102
Jamie Madill9f2a8612017-11-30 12:43:09 -0500103 Optional<vk::RenderPassDesc> mRenderPassDesc;
Jamie Madillab9f9c32017-01-17 17:47:34 -0500104 vk::Framebuffer mFramebuffer;
Jamie Madill47c8ea32018-01-03 18:27:59 -0500105 Serial mLastRenderNodeSerial;
Jamie Madill66546be2018-03-08 09:47:20 -0500106 RenderTargetCache<RenderTargetVk> mRenderTargetCache;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400107};
108
109} // namespace rx
110
111#endif // LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_