blob: 3e5f00c867aea25626afb1f88f6bae7570218221 [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 Madill7b57b9d2017-01-13 09:33:38 -050018class RenderTargetVk;
19class WindowSurfaceVk;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040020
Jamie Madill4c26fc22017-02-24 11:04:10 -050021class FramebufferVk : public FramebufferImpl, public ResourceVk
Jamie Madill9e54b5a2016-05-25 12:57:39 -040022{
23 public:
Jamie Madill7b57b9d2017-01-13 09:33:38 -050024 // Factory methods so we don't have to use constructors with overloads.
25 static FramebufferVk *CreateUserFBO(const gl::FramebufferState &state);
26
27 // The passed-in SurfaceVK must be destroyed after this FBO is destroyed. Our Surface code is
28 // ref-counted on the number of 'current' contexts, so we shouldn't get any dangling surface
29 // references. See Surface::setIsCurrent(bool).
30 static FramebufferVk *CreateDefaultFBO(const gl::FramebufferState &state,
31 WindowSurfaceVk *backbuffer);
32
Jamie Madill9e54b5a2016-05-25 12:57:39 -040033 ~FramebufferVk() override;
Jamie Madillc564c072017-06-01 12:45:42 -040034 void destroy(const gl::Context *context) override;
35 void destroyDefault(const egl::Display *display) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040036
Jamie Madill4928b7c2017-06-20 12:57:39 -040037 gl::Error discard(const gl::Context *context, size_t count, const GLenum *attachments) override;
38 gl::Error invalidate(const gl::Context *context,
39 size_t count,
40 const GLenum *attachments) override;
41 gl::Error invalidateSub(const gl::Context *context,
42 size_t count,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040043 const GLenum *attachments,
44 const gl::Rectangle &area) override;
45
Jamie Madillc564c072017-06-01 12:45:42 -040046 gl::Error clear(const gl::Context *context, GLbitfield mask) override;
47 gl::Error clearBufferfv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040048 GLenum buffer,
49 GLint drawbuffer,
50 const GLfloat *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040051 gl::Error clearBufferuiv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040052 GLenum buffer,
53 GLint drawbuffer,
54 const GLuint *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040055 gl::Error clearBufferiv(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040056 GLenum buffer,
57 GLint drawbuffer,
58 const GLint *values) override;
Jamie Madillc564c072017-06-01 12:45:42 -040059 gl::Error clearBufferfi(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040060 GLenum buffer,
61 GLint drawbuffer,
62 GLfloat depth,
63 GLint stencil) override;
64
Jamie Madill4928b7c2017-06-20 12:57:39 -040065 GLenum getImplementationColorReadFormat(const gl::Context *context) const override;
66 GLenum getImplementationColorReadType(const gl::Context *context) const override;
Jamie Madillc564c072017-06-01 12:45:42 -040067 gl::Error readPixels(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040068 const gl::Rectangle &area,
69 GLenum format,
70 GLenum type,
Jamie Madilld4826152017-09-21 11:18:59 -040071 void *pixels) override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040072
Jamie Madillc564c072017-06-01 12:45:42 -040073 gl::Error blit(const gl::Context *context,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040074 const gl::Rectangle &sourceArea,
75 const gl::Rectangle &destArea,
76 GLbitfield mask,
77 GLenum filter) override;
78
Kenneth Russellce8602a2017-10-03 18:23:08 -070079 bool checkStatus(const gl::Context *context) const override;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040080
Jamie Madillc564c072017-06-01 12:45:42 -040081 void syncState(const gl::Context *context,
82 const gl::Framebuffer::DirtyBits &dirtyBits) override;
Jamie Madill7b57b9d2017-01-13 09:33:38 -050083
Jamie Madillab9f9c32017-01-17 17:47:34 -050084 gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
85
Jamie Madilld4826152017-09-21 11:18:59 -040086 gl::Error ensureInRenderPass(const gl::Context *context,
87 VkDevice device,
88 vk::CommandBuffer *commandBuffer,
89 Serial queueSerial,
90 const gl::State &glState);
91 void endRenderPass(vk::CommandBuffer *commandBuffer);
92
93 bool isInRenderPass() const { return mInRenderPass; }
Jamie Madillab9f9c32017-01-17 17:47:34 -050094
Jamie Madill4928b7c2017-06-20 12:57:39 -040095 gl::ErrorOrResult<vk::RenderPass *> getRenderPass(const gl::Context *context, VkDevice device);
Jamie Madillab9f9c32017-01-17 17:47:34 -050096
Jamie Madill7b57b9d2017-01-13 09:33:38 -050097 private:
98 FramebufferVk(const gl::FramebufferState &state);
99 FramebufferVk(const gl::FramebufferState &state, WindowSurfaceVk *backbuffer);
Jamie Madillab9f9c32017-01-17 17:47:34 -0500100
Jamie Madill4928b7c2017-06-20 12:57:39 -0400101 gl::ErrorOrResult<vk::Framebuffer *> getFramebuffer(const gl::Context *context,
102 VkDevice device);
Jamie Madillab9f9c32017-01-17 17:47:34 -0500103
104 WindowSurfaceVk *mBackbuffer;
105
106 vk::RenderPass mRenderPass;
107 vk::Framebuffer mFramebuffer;
Jamie Madilld4826152017-09-21 11:18:59 -0400108 bool mInRenderPass;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400109};
110
111} // namespace rx
112
113#endif // LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_