blob: 16ab0e69e20d87c314b168638e564c082e11e956 [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
21class FramebufferVk : public FramebufferImpl
22{
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;
34
35 gl::Error discard(size_t count, const GLenum *attachments) override;
36 gl::Error invalidate(size_t count, const GLenum *attachments) override;
37 gl::Error invalidateSub(size_t count,
38 const GLenum *attachments,
39 const gl::Rectangle &area) override;
40
41 gl::Error clear(ContextImpl *context, GLbitfield mask) override;
42 gl::Error clearBufferfv(ContextImpl *context,
43 GLenum buffer,
44 GLint drawbuffer,
45 const GLfloat *values) override;
46 gl::Error clearBufferuiv(ContextImpl *context,
47 GLenum buffer,
48 GLint drawbuffer,
49 const GLuint *values) override;
50 gl::Error clearBufferiv(ContextImpl *context,
51 GLenum buffer,
52 GLint drawbuffer,
53 const GLint *values) override;
54 gl::Error clearBufferfi(ContextImpl *context,
55 GLenum buffer,
56 GLint drawbuffer,
57 GLfloat depth,
58 GLint stencil) override;
59
60 GLenum getImplementationColorReadFormat() const override;
61 GLenum getImplementationColorReadType() const override;
62 gl::Error readPixels(ContextImpl *context,
63 const gl::Rectangle &area,
64 GLenum format,
65 GLenum type,
66 GLvoid *pixels) const override;
67
68 gl::Error blit(ContextImpl *context,
69 const gl::Rectangle &sourceArea,
70 const gl::Rectangle &destArea,
71 GLbitfield mask,
72 GLenum filter) override;
73
74 bool checkStatus() const override;
75
76 void syncState(const gl::Framebuffer::DirtyBits &dirtyBits) override;
Jamie Madill7b57b9d2017-01-13 09:33:38 -050077
Jamie Madillab9f9c32017-01-17 17:47:34 -050078 gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
79
80 gl::Error beginRenderPass(VkDevice device,
81 vk::CommandBuffer *commandBuffer,
82 const gl::State &glState);
83
84 gl::ErrorOrResult<vk::RenderPass *> getRenderPass(VkDevice device);
85
Jamie Madill7b57b9d2017-01-13 09:33:38 -050086 private:
87 FramebufferVk(const gl::FramebufferState &state);
88 FramebufferVk(const gl::FramebufferState &state, WindowSurfaceVk *backbuffer);
Jamie Madillab9f9c32017-01-17 17:47:34 -050089
90 gl::ErrorOrResult<vk::Framebuffer *> getFramebuffer(VkDevice device);
91
92 WindowSurfaceVk *mBackbuffer;
93
94 vk::RenderPass mRenderPass;
95 vk::Framebuffer mFramebuffer;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040096};
97
98} // namespace rx
99
100#endif // LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_