blob: b3ccefe4fad69bfb62adbca3f3c1ce97cbd625f4 [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 Madill7b57b9d2017-01-13 09:33:38 -050014#include "libANGLE/renderer/vulkan/renderervk_utils.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040015
16namespace rx
17{
Jamie Madill9f2a8612017-11-30 12:43:09 -050018class RendererVk;
Jamie Madill7b57b9d2017-01-13 09:33:38 -050019class RenderTargetVk;
20class WindowSurfaceVk;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040021
Jamie Madill4c26fc22017-02-24 11:04:10 -050022class FramebufferVk : public FramebufferImpl, public ResourceVk
Jamie Madill9e54b5a2016-05-25 12:57:39 -040023{
24 public:
Jamie Madill7b57b9d2017-01-13 09:33:38 -050025 // Factory methods so we don't have to use constructors with overloads.
26 static FramebufferVk *CreateUserFBO(const gl::FramebufferState &state);
27
28 // The passed-in SurfaceVK must be destroyed after this FBO is destroyed. Our Surface code is
29 // ref-counted on the number of 'current' contexts, so we shouldn't get any dangling surface
30 // references. See Surface::setIsCurrent(bool).
31 static FramebufferVk *CreateDefaultFBO(const gl::FramebufferState &state,
32 WindowSurfaceVk *backbuffer);
33
Jamie Madill9e54b5a2016-05-25 12:57:39 -040034 ~FramebufferVk() override;
Jamie Madillc564c072017-06-01 12:45:42 -040035 void destroy(const gl::Context *context) override;
36 void destroyDefault(const egl::Display *display) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040037
Jamie Madill4928b7c2017-06-20 12:57:39 -040038 gl::Error discard(const gl::Context *context, size_t count, const GLenum *attachments) override;
39 gl::Error invalidate(const gl::Context *context,
40 size_t count,
41 const GLenum *attachments) override;
42 gl::Error invalidateSub(const gl::Context *context,
43 size_t count,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040044 const GLenum *attachments,
45 const gl::Rectangle &area) override;
46
Jamie Madillc564c072017-06-01 12:45:42 -040047 gl::Error clear(const gl::Context *context, GLbitfield mask) override;
48 gl::Error clearBufferfv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040049 GLenum buffer,
50 GLint drawbuffer,
51 const GLfloat *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040052 gl::Error clearBufferuiv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040053 GLenum buffer,
54 GLint drawbuffer,
55 const GLuint *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040056 gl::Error clearBufferiv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040057 GLenum buffer,
58 GLint drawbuffer,
59 const GLint *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040060 gl::Error clearBufferfi(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040061 GLenum buffer,
62 GLint drawbuffer,
63 GLfloat depth,
64 GLint stencil) override;
65
Jamie Madill4928b7c2017-06-20 12:57:39 -040066 GLenum getImplementationColorReadFormat(const gl::Context *context) const override;
67 GLenum getImplementationColorReadType(const gl::Context *context) const override;
Jamie Madillc564c072017-06-01 12:45:42 -040068 gl::Error readPixels(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040069 const gl::Rectangle &area,
70 GLenum format,
71 GLenum type,
Jamie Madilld4826152017-09-21 11:18:59 -040072 void *pixels) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040073
Jamie Madillc564c072017-06-01 12:45:42 -040074 gl::Error blit(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040075 const gl::Rectangle &sourceArea,
76 const gl::Rectangle &destArea,
77 GLbitfield mask,
78 GLenum filter) override;
79
Kenneth Russellce8602a2017-10-03 18:23:08 -070080 bool checkStatus(const gl::Context *context) const override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040081
Jamie Madillc564c072017-06-01 12:45:42 -040082 void syncState(const gl::Context *context,
83 const gl::Framebuffer::DirtyBits &dirtyBits) override;
Jamie Madill7b57b9d2017-01-13 09:33:38 -050084
Jamie Madillab9f9c32017-01-17 17:47:34 -050085 gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
86
Jamie Madill1b038242017-11-01 15:14:36 -040087 gl::Error beginRenderPass(const gl::Context *context,
Jamie Madill9f2a8612017-11-30 12:43:09 -050088 RendererVk *rendererVk,
Jamie Madill1b038242017-11-01 15:14:36 -040089 vk::CommandBuffer *commandBuffer,
90 Serial queueSerial);
Jamie Madillab9f9c32017-01-17 17:47:34 -050091
Jamie Madill9f2a8612017-11-30 12:43:09 -050092 const vk::RenderPassDesc &getRenderPassDesc(const gl::Context *context);
Jamie Madillab9f9c32017-01-17 17:47:34 -050093
Jamie Madill7b57b9d2017-01-13 09:33:38 -050094 private:
95 FramebufferVk(const gl::FramebufferState &state);
96 FramebufferVk(const gl::FramebufferState &state, WindowSurfaceVk *backbuffer);
Jamie Madillab9f9c32017-01-17 17:47:34 -050097
Jamie Madill4928b7c2017-06-20 12:57:39 -040098 gl::ErrorOrResult<vk::Framebuffer *> getFramebuffer(const gl::Context *context,
Jamie Madill9f2a8612017-11-30 12:43:09 -050099 RendererVk *rendererVk);
Jamie Madillab9f9c32017-01-17 17:47:34 -0500100
101 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 Madill9e54b5a2016-05-25 12:57:39 -0400105};
106
107} // namespace rx
108
109#endif // LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_