xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // RenderbufferVk.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the class interface for RenderbufferVk, implementing RenderbufferImpl.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_RENDERBUFFERVK_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_RENDERBUFFERVK_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/RenderbufferImpl.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/RenderTargetVk.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker namespace rx
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker   public:
23*8975f5c5SAndroid Build Coastguard Worker     RenderbufferVk(const gl::RenderbufferState &state);
24*8975f5c5SAndroid Build Coastguard Worker     ~RenderbufferVk() override;
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker     void onDestroy(const gl::Context *context) override;
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorage(const gl::Context *context,
29*8975f5c5SAndroid Build Coastguard Worker                              GLenum internalformat,
30*8975f5c5SAndroid Build Coastguard Worker                              GLsizei width,
31*8975f5c5SAndroid Build Coastguard Worker                              GLsizei height) override;
32*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorageMultisample(const gl::Context *context,
33*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei samples,
34*8975f5c5SAndroid Build Coastguard Worker                                         GLenum internalformat,
35*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei width,
36*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei height,
37*8975f5c5SAndroid Build Coastguard Worker                                         gl::MultisamplingMode mode) override;
38*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override;
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyRenderbufferSubData(const gl::Context *context,
41*8975f5c5SAndroid Build Coastguard Worker                                           const gl::Renderbuffer *srcBuffer,
42*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcLevel,
43*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcX,
44*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcY,
45*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcZ,
46*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstLevel,
47*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstX,
48*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstY,
49*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstZ,
50*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei srcWidth,
51*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei srcHeight,
52*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei srcDepth) override;
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyTextureSubData(const gl::Context *context,
55*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Texture *srcTexture,
56*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcLevel,
57*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcX,
58*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcY,
59*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcZ,
60*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstLevel,
61*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstX,
62*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstY,
63*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstZ,
64*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei srcWidth,
65*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei srcHeight,
66*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei srcDepth) override;
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     angle::Result getAttachmentRenderTarget(const gl::Context *context,
69*8975f5c5SAndroid Build Coastguard Worker                                             GLenum binding,
70*8975f5c5SAndroid Build Coastguard Worker                                             const gl::ImageIndex &imageIndex,
71*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei samples,
72*8975f5c5SAndroid Build Coastguard Worker                                             FramebufferAttachmentRenderTarget **rtOut) override;
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker     angle::Result initializeContents(const gl::Context *context,
75*8975f5c5SAndroid Build Coastguard Worker                                      GLenum binding,
76*8975f5c5SAndroid Build Coastguard Worker                                      const gl::ImageIndex &imageIndex) override;
77*8975f5c5SAndroid Build Coastguard Worker 
getImage()78*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper *getImage() const { return mImage; }
79*8975f5c5SAndroid Build Coastguard Worker     void releaseOwnershipOfImage(const gl::Context *context);
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker     GLenum getColorReadFormat(const gl::Context *context) override;
82*8975f5c5SAndroid Build Coastguard Worker     GLenum getColorReadType(const gl::Context *context) override;
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker     angle::Result getRenderbufferImage(const gl::Context *context,
85*8975f5c5SAndroid Build Coastguard Worker                                        const gl::PixelPackState &packState,
86*8975f5c5SAndroid Build Coastguard Worker                                        gl::Buffer *packBuffer,
87*8975f5c5SAndroid Build Coastguard Worker                                        GLenum format,
88*8975f5c5SAndroid Build Coastguard Worker                                        GLenum type,
89*8975f5c5SAndroid Build Coastguard Worker                                        void *pixels) override;
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureImageInitialized(const gl::Context *context);
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker   private:
94*8975f5c5SAndroid Build Coastguard Worker     void releaseAndDeleteImage(ContextVk *contextVk);
95*8975f5c5SAndroid Build Coastguard Worker     void releaseImage(ContextVk *contextVk);
96*8975f5c5SAndroid Build Coastguard Worker 
97*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorageImpl(const gl::Context *context,
98*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei samples,
99*8975f5c5SAndroid Build Coastguard Worker                                  GLenum internalformat,
100*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei width,
101*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei height,
102*8975f5c5SAndroid Build Coastguard Worker                                  gl::MultisamplingMode mode);
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     const gl::InternalFormat &getImplementationSizedFormat() const;
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     // We monitor the staging buffer for changes. This handles staged data from outside this class.
107*8975f5c5SAndroid Build Coastguard Worker     void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker     bool mOwnsImage;
110*8975f5c5SAndroid Build Coastguard Worker     // Generated from ImageVk if EGLImage target.
111*8975f5c5SAndroid Build Coastguard Worker     UniqueSerial mImageSiblingSerial;
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker     // |mOwnsImage| indicates that |RenderbufferVk| owns the image.  Otherwise, this is a weak
114*8975f5c5SAndroid Build Coastguard Worker     // pointer shared with another class.  Due to this sharing, for example through EGL images, the
115*8975f5c5SAndroid Build Coastguard Worker     // image must always be dynamically allocated as the renderbuffer can release ownership for
116*8975f5c5SAndroid Build Coastguard Worker     // example and it can be transferred to another |RenderbufferVk|.
117*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper *mImage;
118*8975f5c5SAndroid Build Coastguard Worker     vk::ImageViewHelper mImageViews;
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker     // If renderbuffer is created through the EXT_multisampled_render_to_texture API, it is expected
121*8975f5c5SAndroid Build Coastguard Worker     // that all rendering is done multisampled during the renderpass, and is automatically resolved
122*8975f5c5SAndroid Build Coastguard Worker     // (into |mImage|) and discarded afterwards.  |mMultisampledImage| is the implicit image that
123*8975f5c5SAndroid Build Coastguard Worker     // contains the multisampled data.
124*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper mMultisampledImage;
125*8975f5c5SAndroid Build Coastguard Worker     vk::ImageViewHelper mMultisampledImageViews;
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker     RenderTargetVk mRenderTarget;
128*8975f5c5SAndroid Build Coastguard Worker 
129*8975f5c5SAndroid Build Coastguard Worker     angle::ObserverBinding mImageObserverBinding;
130*8975f5c5SAndroid Build Coastguard Worker };
131*8975f5c5SAndroid Build Coastguard Worker 
132*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_RENDERBUFFERVK_H_
135