1 //
2 // Copyright 2014 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
7 // FramebufferImpl.h: Defines the abstract rx::FramebufferImpl class.
8
9 #ifndef LIBANGLE_RENDERER_FRAMEBUFFERIMPL_H_
10 #define LIBANGLE_RENDERER_FRAMEBUFFERIMPL_H_
11
12 #include "angle_gl.h"
13 #include "common/angleutils.h"
14 #include "libANGLE/Error.h"
15 #include "libANGLE/Framebuffer.h"
16 #include "libANGLE/State.h"
17 #include "libANGLE/angletypes.h"
18
19 namespace gl
20 {
21 class Buffer;
22 class Framebuffer;
23 class FramebufferAttachment;
24 struct PixelPackState;
25 } // namespace gl
26
27 namespace rx
28 {
29 class DisplayImpl;
30
31 class FramebufferImpl : angle::NonCopyable
32 {
33 public:
FramebufferImpl(const gl::FramebufferState & state)34 explicit FramebufferImpl(const gl::FramebufferState &state) : mState(state) {}
~FramebufferImpl()35 virtual ~FramebufferImpl() {}
destroy(const gl::Context * context)36 virtual void destroy(const gl::Context *context) {}
37
38 virtual angle::Result discard(const gl::Context *context,
39 size_t count,
40 const GLenum *attachments) = 0;
41 virtual angle::Result invalidate(const gl::Context *context,
42 size_t count,
43 const GLenum *attachments) = 0;
44 virtual angle::Result invalidateSub(const gl::Context *context,
45 size_t count,
46 const GLenum *attachments,
47 const gl::Rectangle &area) = 0;
48
49 virtual angle::Result clear(const gl::Context *context, GLbitfield mask) = 0;
50 virtual angle::Result clearBufferfv(const gl::Context *context,
51 GLenum buffer,
52 GLint drawbuffer,
53 const GLfloat *values) = 0;
54 virtual angle::Result clearBufferuiv(const gl::Context *context,
55 GLenum buffer,
56 GLint drawbuffer,
57 const GLuint *values) = 0;
58 virtual angle::Result clearBufferiv(const gl::Context *context,
59 GLenum buffer,
60 GLint drawbuffer,
61 const GLint *values) = 0;
62 virtual angle::Result clearBufferfi(const gl::Context *context,
63 GLenum buffer,
64 GLint drawbuffer,
65 GLfloat depth,
66 GLint stencil) = 0;
67
68 virtual const gl::InternalFormat &getImplementationColorReadFormat(
69 const gl::Context *context) const;
70 virtual angle::Result readPixels(const gl::Context *context,
71 const gl::Rectangle &area,
72 GLenum format,
73 GLenum type,
74 const gl::PixelPackState &pack,
75 gl::Buffer *packBuffer,
76 void *pixels) = 0;
77
78 virtual angle::Result blit(const gl::Context *context,
79 const gl::Rectangle &sourceArea,
80 const gl::Rectangle &destArea,
81 GLbitfield mask,
82 GLenum filter) = 0;
83
84 virtual gl::FramebufferStatus checkStatus(const gl::Context *context) const = 0;
85
86 virtual angle::Result syncState(const gl::Context *context,
87 GLenum binding,
88 const gl::Framebuffer::DirtyBits &dirtyBits,
89 gl::Command command) = 0;
90
91 virtual angle::Result getSamplePosition(const gl::Context *context,
92 size_t index,
93 GLfloat *xy) const = 0;
94
95 // Special configuration option for checkStatus(). Some back-ends don't require a syncState
96 // before calling checkStatus. In practice the GL back-end is the only config that needs
97 // syncState because it depends on the behaviour of the driver. Allowing the Vulkan and
98 // D3D back-ends to skip syncState lets us do more work in the syncState call.
99 virtual bool shouldSyncStateBeforeCheckStatus() const;
100
getState()101 const gl::FramebufferState &getState() const { return mState; }
102
103 protected:
104 const gl::FramebufferState &mState;
105 };
106
shouldSyncStateBeforeCheckStatus()107 inline bool FramebufferImpl::shouldSyncStateBeforeCheckStatus() const
108 {
109 return false;
110 }
111
112 // Default implementation returns the format specified in the attachment.
getImplementationColorReadFormat(const gl::Context * context)113 inline const gl::InternalFormat &FramebufferImpl::getImplementationColorReadFormat(
114 const gl::Context *context) const
115 {
116 const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
117 return *readAttachment->getFormat().info;
118 }
119 } // namespace rx
120
121 #endif // LIBANGLE_RENDERER_FRAMEBUFFERIMPL_H_
122