Blender V4.3
vk_texture.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#pragma once
10
12
13#include "vk_context.hh"
14#include "vk_image_view.hh"
15
16namespace blender::gpu {
17
18class VKSampler;
19class VKDescriptorSetTracker;
20class VKVertexBuffer;
21
22class VKTexture : public Texture {
24
31 eGPUTextureFormat device_format_ = (eGPUTextureFormat)-1;
32
34 VKTexture *source_texture_ = nullptr;
35
43 VKVertexBuffer *source_buffer_ = nullptr;
44 VkImage vk_image_ = VK_NULL_HANDLE;
45 VmaAllocation allocation_ = VK_NULL_HANDLE;
46
51 Vector<VKImageView> image_views_;
52
53 /* Last image layout of the texture. Frame-buffer and barriers can alter/require the actual
54 * layout to be changed. During this it requires to set the current layout in order to know which
55 * conversion should happen. #current_layout_ keep track of the layout so the correct conversion
56 * can be done. */
57 VkImageLayout current_layout_ = VK_IMAGE_LAYOUT_UNDEFINED;
58
59 int layer_offset_ = 0;
60 bool use_stencil_ = false;
61
63 IndexRange(0, VK_REMAINING_ARRAY_LAYERS),
64 IndexRange(0, VK_REMAINING_MIP_LEVELS),
65 {{'r', 'g', 'b', 'a'}},
66 false,
67 false,
69
70 public:
71 VKTexture(const char *name) : Texture(name) {}
72
73 virtual ~VKTexture() override;
74
75 void init(VkImage vk_image, VkImageLayout layout, eGPUTextureFormat texture_format);
76
77 void generate_mipmap() override;
78 void copy_to(Texture *tex) override;
79 void copy_to(VKTexture &dst_texture, VkImageAspectFlags vk_image_aspect);
80 void clear(eGPUDataFormat format, const void *data) override;
82 float clear_depth,
83 uint clear_stencil);
84 void swizzle_set(const char swizzle_mask[4]) override;
85 void mip_range_set(int min, int max) override;
86 void *read(int mip, eGPUDataFormat format) override;
87 void read_sub(
88 int mip, eGPUDataFormat format, const int region[6], IndexRange layers, void *r_data);
89 void update_sub(
90 int mip, int offset[3], int extent[3], eGPUDataFormat format, const void *data) override;
91 void update_sub(int offset[3],
92 int extent[3],
94 GPUPixelBuffer *pixbuf) override;
95
96 /* TODO(fclem): Legacy. Should be removed at some point. */
97 uint gl_bindcode_get() const override;
98
99 VkImage vk_image_handle() const
100 {
101 if (is_texture_view()) {
102 return source_texture_->vk_image_handle();
103 }
104 BLI_assert(vk_image_ != VK_NULL_HANDLE);
105 return vk_image_;
106 }
107
112 {
113 return device_format_;
114 }
115
120 const VKImageView &image_view_get(const VKImageViewInfo &info);
121
126
127 protected:
128 bool init_internal() override;
129 bool init_internal(VertBuf *vbo) override;
130 bool init_internal(GPUTexture *src, int mip_offset, int layer_offset, bool use_stencil) override;
131
132 private:
134 bool is_texture_view() const;
135
140 bool allocate();
141
146 int vk_layer_count(int non_layered_value) const;
147
151 VkExtent3D vk_extent_3d(int mip_level) const;
152
153 /* -------------------------------------------------------------------- */
157 private:
158 IndexRange mip_map_range() const;
159 IndexRange layer_range() const;
160
162};
163
165{
166 return static_cast<VKTexture *>(tex);
167}
168
170{
171 return static_cast<Texture *>(texture);
172}
173
174} // namespace blender::gpu
#define BLI_assert(a)
Definition BLI_assert.h:50
#define BLI_INLINE
unsigned int uint
eGPUFrameBufferBits
eGPUDataFormat
eGPUTextureFormat
void init()
uint gl_bindcode_get() const override
void copy_to(Texture *tex) override
void clear(eGPUDataFormat format, const void *data) override
virtual ~VKTexture() override
Definition vk_texture.cc:42
void generate_mipmap() override
Definition vk_texture.cc:60
eGPUTextureFormat device_format_get() const
bool init_internal() override
void update_sub(int mip, int offset[3], int extent[3], eGPUDataFormat format, const void *data) override
VkImage vk_image_handle() const
Definition vk_texture.hh:99
const VKImageView & image_view_get(const VKImageViewInfo &info)
void swizzle_set(const char swizzle_mask[4]) override
VKTexture(const char *name)
Definition vk_texture.hh:71
void clear_depth_stencil(const eGPUFrameBufferBits buffer, float clear_depth, uint clear_stencil)
void mip_range_set(int min, int max) override
void read_sub(int mip, eGPUDataFormat format, const int region[6], IndexRange layers, void *r_data)
void * read(int mip, eGPUDataFormat format) override
local_group_size(16, 16) .push_constant(Type texture
format
static Context * unwrap(GPUContext *ctx)
static GPUContext * wrap(Context *ctx)
#define min(a, b)
Definition sort.c:32